=== modified file 'debian/changelog'
--- debian/changelog	2014-09-19 08:02:20 +0000
+++ debian/changelog	2014-10-06 11:30:34 +0000
@@ -1,3 +1,14 @@
+qtdeclarative-opensource-src (5.3.0-3ubuntu13~test1) utopic; urgency=medium
+
+  [ Ricardo Mendoza ]
+  * debian/patches/QML-Compilation-unit-caching-and-JIT-changes.patch:
+    - Implement QML caching of compilation units
+
+  [ Ricardo Salveti ]
+  * Bump to gcc 4.9
+
+ -- Ricardo Mendoza <ricardo.mendoza@canonical.com>  Thu, 02 Oct 2014 14:01:09 +0200
+
 qtdeclarative-opensource-src (5.3.0-3ubuntu12) utopic; urgency=medium
 
   * debian/patches/Fix-crash-in-QObjectWrapper.patch:

=== modified file 'debian/control'
--- debian/control	2014-08-01 11:16:38 +0000
+++ debian/control	2014-10-06 11:30:34 +0000
@@ -11,8 +11,7 @@
            Timo Jyrinki <timo@debian.org>
 Build-Depends: debhelper (>= 9),
                dpkg-dev (>= 1.16.1),
-# Avoiding symbols updates due to switch to gcc 4.9 by default.
-               g++-4.8,
+               g++-4.9,
                libqt5xmlpatterns5-private-dev (>= 5.3.0-0~),
                pkg-kde-tools (>= 0.15.12~),
                python,

=== modified file 'debian/libqt5qml5.symbols'
--- debian/libqt5qml5.symbols	2014-06-26 09:47:11 +0000
+++ debian/libqt5qml5.symbols	2014-10-06 11:30:34 +0000
@@ -334,9 +334,6 @@
  _ZN13QQmlValueType16staticMetaObjectE@Base 5.0.2 1
  _ZN13QQmlValueTypeC1EiP7QObject@Base 5.0.2 1
  _ZN13QQmlValueTypeC2EiP7QObject@Base 5.0.2 1
- _ZN13QQmlValueTypeD0Ev@Base 5.0.2 1
- _ZN13QQmlValueTypeD1Ev@Base 5.0.2 1
- _ZN13QQmlValueTypeD2Ev@Base 5.0.2 1
  _ZN14QQmlExpression10clearErrorEv@Base 5.0.2
  _ZN14QQmlExpression11qt_metacallEN11QMetaObject4CallEiPPv@Base 5.0.2
  _ZN14QQmlExpression11qt_metacastEPKc@Base 5.0.2
@@ -1552,6 +1549,7 @@
  _ZN3QV422PersistentValuePrivateD0Ev@Base 5.2.0~beta1
  _ZN3QV422PersistentValuePrivateD1Ev@Base 5.2.0~beta1
  _ZN3QV422PersistentValuePrivateD2Ev@Base 5.2.0~beta1
+ _ZN3QV424EvalInstructionSelection6runAllEb@Base 5.3.0 1
  _ZN3QV424EvalInstructionSelection7compileEb@Base 5.3.0 1
  _ZN3QV424EvalInstructionSelectionC1EPNS_19ExecutableAllocatorEPNS_2IR6ModuleEPNS_8Compiler15JSUnitGeneratorE@Base 5.3.0 1
  _ZN3QV424EvalInstructionSelectionC2EPNS_19ExecutableAllocatorEPNS_2IR6ModuleEPNS_8Compiler15JSUnitGeneratorE@Base 5.3.0 1
@@ -2106,9 +2104,6 @@
  _ZN6QQmlJS3AST12FunctionBodyD0Ev@Base 5.3.0
  _ZN6QQmlJS3AST12FunctionBodyD1Ev@Base 5.3.0
  _ZN6QQmlJS3AST12FunctionBodyD2Ev@Base 5.3.0
- _ZN6QQmlJS3AST12PropertyNameD0Ev@Base 5.3.0
- _ZN6QQmlJS3AST12PropertyNameD1Ev@Base 5.3.0
- _ZN6QQmlJS3AST12PropertyNameD2Ev@Base 5.3.0
  _ZN6QQmlJS3AST12TryStatement7accept0EPNS0_7VisitorE@Base 5.3.0 1
  _ZN6QQmlJS3AST12TryStatementD0Ev@Base 5.3.0
  _ZN6QQmlJS3AST12TryStatementD1Ev@Base 5.3.0
@@ -2133,9 +2128,6 @@
  _ZN6QQmlJS3AST13RegExpLiteralD0Ev@Base 5.3.0
  _ZN6QQmlJS3AST13RegExpLiteralD1Ev@Base 5.3.0
  _ZN6QQmlJS3AST13RegExpLiteralD2Ev@Base 5.3.0
- _ZN6QQmlJS3AST13SourceElementD0Ev@Base 5.3.0
- _ZN6QQmlJS3AST13SourceElementD1Ev@Base 5.3.0
- _ZN6QQmlJS3AST13SourceElementD2Ev@Base 5.3.0
  _ZN6QQmlJS3AST13StatementList7accept0EPNS0_7VisitorE@Base 5.3.0 1
  _ZN6QQmlJS3AST13StatementListD0Ev@Base 5.3.0
  _ZN6QQmlJS3AST13StatementListD1Ev@Base 5.3.0
@@ -2165,9 +2157,6 @@
  _ZN6QQmlJS3AST14EmptyStatementD1Ev@Base 5.3.0
  _ZN6QQmlJS3AST14EmptyStatementD2Ev@Base 5.3.0
  _ZN6QQmlJS3AST14ExpressionNode14expressionCastEv@Base 5.3.0
- _ZN6QQmlJS3AST14ExpressionNodeD0Ev@Base 5.3.0
- _ZN6QQmlJS3AST14ExpressionNodeD1Ev@Base 5.3.0
- _ZN6QQmlJS3AST14ExpressionNodeD2Ev@Base 5.3.0
  _ZN6QQmlJS3AST14NullExpression7accept0EPNS0_7VisitorE@Base 5.3.0 1
  _ZN6QQmlJS3AST14NullExpressionD0Ev@Base 5.3.0
  _ZN6QQmlJS3AST14NullExpressionD1Ev@Base 5.3.0
@@ -2193,9 +2182,6 @@
  _ZN6QQmlJS3AST14UiArrayBindingD1Ev@Base 5.3.0
  _ZN6QQmlJS3AST14UiArrayBindingD2Ev@Base 5.3.0
  _ZN6QQmlJS3AST14UiObjectMember18uiObjectMemberCastEv@Base 5.3.0
- _ZN6QQmlJS3AST14UiObjectMemberD0Ev@Base 5.3.0
- _ZN6QQmlJS3AST14UiObjectMemberD1Ev@Base 5.3.0
- _ZN6QQmlJS3AST14UiObjectMemberD2Ev@Base 5.3.0
  _ZN6QQmlJS3AST14UiPublicMember7accept0EPNS0_7VisitorE@Base 5.3.0 1
  _ZN6QQmlJS3AST14UiPublicMemberD0Ev@Base 5.3.0
  _ZN6QQmlJS3AST14UiPublicMemberD1Ev@Base 5.3.0
@@ -2293,9 +2279,6 @@
  _ZN6QQmlJS3AST18FunctionExpressionD0Ev@Base 5.3.0
  _ZN6QQmlJS3AST18FunctionExpressionD1Ev@Base 5.3.0
  _ZN6QQmlJS3AST18FunctionExpressionD2Ev@Base 5.3.0
- _ZN6QQmlJS3AST18PropertyAssignmentD0Ev@Base 5.3.0
- _ZN6QQmlJS3AST18PropertyAssignmentD1Ev@Base 5.3.0
- _ZN6QQmlJS3AST18PropertyAssignmentD2Ev@Base 5.3.0
  _ZN6QQmlJS3AST18UiObjectDefinition7accept0EPNS0_7VisitorE@Base 5.3.0 1
  _ZN6QQmlJS3AST18UiObjectDefinitionD0Ev@Base 5.3.0
  _ZN6QQmlJS3AST18UiObjectDefinitionD1Ev@Base 5.3.0
@@ -2456,9 +2439,6 @@
  _ZN6QQmlJS3AST9CaseBlockD1Ev@Base 5.3.0
  _ZN6QQmlJS3AST9CaseBlockD2Ev@Base 5.3.0
  _ZN6QQmlJS3AST9Statement13statementCastEv@Base 5.3.0
- _ZN6QQmlJS3AST9StatementD0Ev@Base 5.3.0
- _ZN6QQmlJS3AST9StatementD1Ev@Base 5.3.0
- _ZN6QQmlJS3AST9StatementD2Ev@Base 5.3.0
  _ZN6QQmlJS3AST9UiProgram7accept0EPNS0_7VisitorE@Base 5.3.0 1
  _ZN6QQmlJS3AST9UiProgramD0Ev@Base 5.3.0
  _ZN6QQmlJS3AST9UiProgramD1Ev@Base 5.3.0
@@ -3358,18 +3338,7 @@
  _ZNSt6vectorItSaItEE13_M_insert_auxIJRKtEEEvN9__gnu_cxx17__normal_iteratorIPtS1_EEDpOT_@Base 5.2.1
  _ZNSt6vectorItSaItEE13_M_insert_auxIJtEEEvN9__gnu_cxx17__normal_iteratorIPtS1_EEDpOT_@Base 5.2.1
  _ZNSt6vectorItSaItEE19_M_emplace_back_auxIIRKtEEEvDpOT_@Base 5.2.1
- _ZNSt6vectorItSaItEE19_M_emplace_back_auxIItEEEvDpOT_@Base 5.2.1
  _ZNSt6vectorItSaItEE19_M_emplace_back_auxIJRKtEEEvDpOT_@Base 5.2.1
- _ZNSt6vectorItSaItEE19_M_emplace_back_auxIJtEEEvDpOT_@Base 5.2.1
- (optional=templinst)_ZSt11lower_boundIPKPKN3QV412CompiledData7BindingEjPFbS4_jEET_S9_S9_RKT0_T1_@Base 5.3.0
- (subst)_ZSt13__adjust_heapIPN3QV413MemoryManager4Data5ChunkE{ssize_t}S3_EvT_T0_S6_T1_@Base 5.2.0~beta1 1
- (optional=templinst|subst)_ZSt13__adjust_heapIPj{ssize_t}jEvT_T0_S2_T1_@Base 5.3.0
- _ZSt13__heap_selectIPN3QV413MemoryManager4Data5ChunkEEvT_S5_S5_@Base 5.2.1 1
- _ZSt16__insertion_sortIPN3QV413MemoryManager4Data5ChunkEEvT_S5_@Base 5.2.0~beta1 1
- (optional=templinst)_ZSt16__insertion_sortIPjEvT_S1_@Base 5.3.0
- (subst)_ZSt16__introsort_loopIPN3QV413MemoryManager4Data5ChunkE{ssize_t}EvT_S5_T0_@Base 5.2.0~beta1 1
- (optional=templinst|subst)_ZSt16__introsort_loopIPj{ssize_t}EvT_S1_T0_@Base 5.3.0
- _ZSt25__unguarded_linear_insertIPN3QV413MemoryManager4Data5ChunkEEvT_@Base 5.2.0~beta1 1
  (optional=templinst|arch=!amd64 !arm64 !ppc64el !s390x)_ZSt4swapIN8QVariant7PrivateEEvRT_S3_@Base 5.0.2
  _ZTI10QQmlBundle@Base 5.0.2 1
  _ZTI10QQmlEngine@Base 5.0.2

=== modified file 'debian/libqt5quick5.symbols'
--- debian/libqt5quick5.symbols	2014-05-21 15:17:21 +0000
+++ debian/libqt5quick5.symbols	2014-10-06 11:30:34 +0000
@@ -410,12 +410,6 @@
  _ZN12QQuickWindowD0Ev@Base 5.0.2
  _ZN12QQuickWindowD1Ev@Base 5.0.2
  _ZN12QQuickWindowD2Ev@Base 5.0.2
- _ZN12QSGGlyphNodeD0Ev@Base 5.0.2 1
- _ZN12QSGGlyphNodeD1Ev@Base 5.0.2 1
- _ZN12QSGGlyphNodeD2Ev@Base 5.0.2 1
- _ZN12QSGImageNodeD0Ev@Base 5.0.2 1
- _ZN12QSGImageNodeD1Ev@Base 5.0.2 1
- _ZN12QSGImageNodeD2Ev@Base 5.0.2 1
  _ZN13QQuickAnchors10classBeginEv@Base 5.0.2 1
  _ZN13QQuickAnchors10resetRightEv@Base 5.0.2 1
  _ZN13QQuickAnchors10setMarginsEd@Base 5.2.0 1
@@ -498,9 +492,6 @@
  _ZN13QSGRenderNode19setInheritedOpacityEd@Base 5.2.0 1
  _ZN13QSGRenderNodeC1Ev@Base 5.0.2 1
  _ZN13QSGRenderNodeC2Ev@Base 5.0.2 1
- _ZN13QSGRenderNodeD0Ev@Base 5.0.2 1
- _ZN13QSGRenderNodeD1Ev@Base 5.0.2 1
- _ZN13QSGRenderNodeD2Ev@Base 5.0.2 1
  _ZN14QQuickAnimator10transitionER5QListI17QQuickStateActionERS0_I12QQmlPropertyEN23QQuickAbstractAnimation19TransitionDirectionEP7QObject@Base 5.2.0~beta1 1
  _ZN14QQuickAnimator11fromChangedEd@Base 5.2.0~beta1 1
  _ZN14QQuickAnimator11qt_metacallEN11QMetaObject4CallEiPPv@Base 5.2.0~beta1 1
@@ -519,9 +510,6 @@
  _ZN14QQuickAnimatorC1ER21QQuickAnimatorPrivateP7QObject@Base 5.2.0~beta1 1
  _ZN14QQuickAnimatorC2EP7QObject@Base 5.2.0~beta1 1
  _ZN14QQuickAnimatorC2ER21QQuickAnimatorPrivateP7QObject@Base 5.2.0~beta1 1
- _ZN14QQuickAnimatorD0Ev@Base 5.2.0~beta1 1
- _ZN14QQuickAnimatorD1Ev@Base 5.2.0~beta1 1
- _ZN14QQuickAnimatorD2Ev@Base 5.2.0~beta1 1
  _ZN14QQuickBehavior10setEnabledEb@Base 5.0.2 1
  _ZN14QQuickBehavior11qt_metacallEN11QMetaObject4CallEiPPv@Base 5.0.2 1
  _ZN14QQuickBehavior11qt_metacastEPKc@Base 5.0.2 1
@@ -1091,7 +1079,6 @@
  _ZN15QSGPlainTextureD0Ev@Base 5.0.2 1
  _ZN15QSGPlainTextureD1Ev@Base 5.0.2 1
  _ZN15QSGPlainTextureD2Ev@Base 5.0.2 1
- (arch=!amd64 !i386)_ZN16QCoreApplication9sendEventEP7QObjectP6QEvent@Base 5.3.0
  _ZN16QQuickCloseEvent11qt_metacallEN11QMetaObject4CallEiPPv@Base 5.1.0 1
  _ZN16QQuickCloseEvent11qt_metacastEPKc@Base 5.1.0 1
  _ZN16QQuickCloseEvent16staticMetaObjectE@Base 5.1.0 1
@@ -1205,9 +1192,6 @@
  _ZN16QSGContextPluginD0Ev@Base 5.0.2 1
  _ZN16QSGContextPluginD1Ev@Base 5.0.2 1
  _ZN16QSGContextPluginD2Ev@Base 5.0.2 1
- _ZN16QSGRectangleNodeD0Ev@Base 5.0.2 1
- _ZN16QSGRectangleNodeD1Ev@Base 5.0.2 1
- _ZN16QSGRectangleNodeD2Ev@Base 5.0.2 1
  _ZN16QSGRenderContext10initializeEP14QOpenGLContext@Base 5.2.0~rc1 1
  _ZN16QSGRenderContext10initializeEP17QSGMaterialShader@Base 5.3.0 1
  _ZN16QSGRenderContext10invalidateEv@Base 5.2.0~rc1 1
@@ -1247,9 +1231,6 @@
  _ZN17QQuickAnimatorJob9setTargetEP10QQuickItem@Base 5.2.0~beta1 1
  _ZN17QQuickAnimatorJobC1Ev@Base 5.2.0~beta1 1
  _ZN17QQuickAnimatorJobC2Ev@Base 5.2.0~beta1 1
- _ZN17QQuickAnimatorJobD0Ev@Base 5.2.0~beta1 1
- _ZN17QQuickAnimatorJobD1Ev@Base 5.2.0~beta1 1
- _ZN17QQuickAnimatorJobD2Ev@Base 5.2.0~beta1 1
  _ZN17QQuickItemPrivate10data_clearEP16QQmlListPropertyI7QObjectE@Base 5.0.2 1
  _ZN17QQuickItemPrivate10data_countEP16QQmlListPropertyI7QObjectE@Base 5.0.2 1
  _ZN17QQuickItemPrivate10itemChangeEN10QQuickItem10ItemChangeERKNS0_14ItemChangeDataE@Base 5.0.2 1
@@ -1351,9 +1332,6 @@
  _ZN17QSGDynamicTexture11qt_metacallEN11QMetaObject4CallEiPPv@Base 5.0.2
  _ZN17QSGDynamicTexture11qt_metacastEPKc@Base 5.0.2
  _ZN17QSGDynamicTexture16staticMetaObjectE@Base 5.0.2
- _ZN17QSGDynamicTextureD0Ev@Base 5.0.2
- _ZN17QSGDynamicTextureD1Ev@Base 5.0.2
- _ZN17QSGDynamicTextureD2Ev@Base 5.0.2
  _ZN17QSGMaterialShader10deactivateEv@Base 5.0.2
  _ZN17QSGMaterialShader11updateStateERKNS_11RenderStateEP11QSGMaterialS4_@Base 5.0.2
  _ZN17QSGMaterialShader19setShaderSourceFileE6QFlagsIN13QOpenGLShader13ShaderTypeBitEERK7QString@Base 5.2.0~rc1
@@ -1477,9 +1455,6 @@
  _ZN18QSGTextureProvider11qt_metacastEPKc@Base 5.0.2
  _ZN18QSGTextureProvider14textureChangedEv@Base 5.0.2
  _ZN18QSGTextureProvider16staticMetaObjectE@Base 5.0.2
- _ZN18QSGTextureProviderD0Ev@Base 5.0.2
- _ZN18QSGTextureProviderD1Ev@Base 5.0.2
- _ZN18QSGTextureProviderD2Ev@Base 5.0.2
  _ZN19QQuickImageProvider12requestImageERK7QStringP5QSizeRKS3_@Base 5.0.2
  _ZN19QQuickImageProvider13requestPixmapERK7QStringP5QSizeRKS3_@Base 5.0.2
  _ZN19QQuickImageProvider14requestTextureERK7QStringP5QSizeRKS3_@Base 5.0.2
@@ -1920,9 +1895,6 @@
  _ZN23QQuickFramebufferObject8RendererD2Ev@Base 5.2.0~beta1 1
  _ZN23QQuickFramebufferObjectC1EP10QQuickItem@Base 5.2.0~beta1
  _ZN23QQuickFramebufferObjectC2EP10QQuickItem@Base 5.2.0~beta1
- _ZN23QQuickFramebufferObjectD0Ev@Base 5.2.0~beta1
- _ZN23QQuickFramebufferObjectD1Ev@Base 5.2.0~beta1
- _ZN23QQuickFramebufferObjectD2Ev@Base 5.2.0~beta1
  _ZN23QQuickParallelAnimation10transitionER5QListI17QQuickStateActionERS0_I12QQmlPropertyEN23QQuickAbstractAnimation19TransitionDirectionEP7QObject@Base 5.2.0~beta1 1
  _ZN23QQuickParallelAnimation11qt_metacallEN11QMetaObject4CallEiPPv@Base 5.0.2 1
  _ZN23QQuickParallelAnimation11qt_metacastEPKc@Base 5.0.2 1
@@ -2024,6 +1996,7 @@
  _ZN24QQuickAccessibleAttachedD1Ev@Base 5.0.2 1
  _ZN24QQuickAccessibleAttachedD2Ev@Base 5.0.2 1
  _ZN24QQuickOpacityAnimatorJob10initializeEP24QQuickAnimatorController@Base 5.2.0~beta1 1
+ _ZN24QQuickOpacityAnimatorJob16nodeWasDestroyedEv@Base 5.3.0 1
  _ZN24QQuickOpacityAnimatorJob17updateCurrentTimeEi@Base 5.2.0~beta1 1
  _ZN24QQuickOpacityAnimatorJob9writeBackEv@Base 5.2.0~beta1 1
  _ZN24QQuickOpacityAnimatorJobC1Ev@Base 5.2.0~beta1 1
@@ -2077,6 +2050,7 @@
  _ZN24QQuickShaderEffectSourceD1Ev@Base 5.0.2 1
  _ZN24QQuickShaderEffectSourceD2Ev@Base 5.0.2 1
  _ZN24QQuickUniformAnimatorJob13afterNodeSyncEv@Base 5.2.0~beta1 1
+ _ZN24QQuickUniformAnimatorJob16nodeWasDestroyedEv@Base 5.3.0 1
  _ZN24QQuickUniformAnimatorJob17updateCurrentTimeEi@Base 5.2.0~beta1 1
  _ZN24QQuickUniformAnimatorJob9setTargetEP10QQuickItem@Base 5.2.0~beta1 1
  _ZN24QQuickUniformAnimatorJob9writeBackEv@Base 5.2.0~beta1 1
@@ -2141,9 +2115,6 @@
  _ZN26QQuickShaderEffectMaterialD0Ev@Base 5.0.2 1
  _ZN26QQuickShaderEffectMaterialD1Ev@Base 5.0.2 1
  _ZN26QQuickShaderEffectMaterialD2Ev@Base 5.0.2 1
- _ZN26QSGContextFactoryInterfaceD0Ev@Base 5.0.2
- _ZN26QSGContextFactoryInterfaceD1Ev@Base 5.0.2
- _ZN26QSGContextFactoryInterfaceD2Ev@Base 5.0.2
  _ZN26QSGDistanceFieldGlyphCache12glyphMetricsEjd@Base 5.2.0 1
  _ZN26QSGDistanceFieldGlyphCache13updateTextureEjjRK5QSize@Base 5.0.2 1
  _ZN26QSGDistanceFieldGlyphCache14s_emptyTextureE@Base 5.0.2 1
@@ -3221,7 +3192,6 @@
  (c++)"non-virtual thunk to QQuickAbstractAnimation::setTarget(QQmlProperty const&)@Base" 5.0.2
  (c++)"non-virtual thunk to QQuickAbstractAnimation::~QQuickAbstractAnimation()@Base" 5.0.2
  (c++)"non-virtual thunk to QQuickAnimationGroup::~QQuickAnimationGroup()@Base" 5.0.2
- (c++)"non-virtual thunk to QQuickAnimator::~QQuickAnimator()@Base" 5.2.0~beta1
  (c++)"non-virtual thunk to QQuickAnimatorProxyJob::updateCurrentTime(int)@Base" 5.2.0~beta1
  (c++)"non-virtual thunk to QQuickAnimatorProxyJob::updateState(QAbstractAnimationJob::State, QAbstractAnimationJob::State)@Base" 5.2.0~beta1
  (c++)"non-virtual thunk to QQuickAnimatorProxyJob::~QQuickAnimatorProxyJob()@Base" 5.2.0~beta1
@@ -3233,7 +3203,6 @@
  (c++)"non-virtual thunk to QQuickColorAnimation::~QQuickColorAnimation()@Base" 5.0.2
  (c++)"non-virtual thunk to QQuickFlickable::componentComplete()@Base" 5.0.2
  (c++)"non-virtual thunk to QQuickFlickable::~QQuickFlickable()@Base" 5.0.2
- (c++)"non-virtual thunk to QQuickFramebufferObject::~QQuickFramebufferObject()@Base" 5.2.0~beta1
  (c++)"non-virtual thunk to QQuickImageBase::componentComplete()@Base" 5.0.2
  (c++)"non-virtual thunk to QQuickImageBase::~QQuickImageBase()@Base" 5.0.2
  (c++)"non-virtual thunk to QQuickImplicitSizeItem::~QQuickImplicitSizeItem()@Base" 5.0.2

=== added file 'debian/patches/QML-Compilation-unit-caching-and-JIT-changes.patch'
--- debian/patches/QML-Compilation-unit-caching-and-JIT-changes.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/QML-Compilation-unit-caching-and-JIT-changes.patch	2014-10-06 11:30:34 +0000
@@ -0,0 +1,977 @@
+Index: qtdeclarative-opensource-src-5.3.0/src/3rdparty/masm/assembler/ARMv7Assembler.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/3rdparty/masm/assembler/ARMv7Assembler.h
++++ qtdeclarative-opensource-src-5.3.0/src/3rdparty/masm/assembler/ARMv7Assembler.h
+@@ -445,6 +445,12 @@ public:
+         ConditionInvalid
+     } Condition;
+ 
++    // Code inherited from the QMLC project
++    void appendData(char *data, int len)
++    {
++        return m_formatter.appendData(data, len);
++    }
++
+ #define JUMP_ENUM_WITH_SIZE(index, value) (((value) << 3) | (index))
+ #define JUMP_ENUM_SIZE(jump) ((jump) >> 3) 
+     enum JumpType { JumpFixed = JUMP_ENUM_WITH_SIZE(0, 0), 
+@@ -2782,6 +2788,7 @@ private:
+         AssemblerLabel label() const { return m_buffer.label(); }
+         bool isAligned(int alignment) const { return m_buffer.isAligned(alignment); }
+         void* data() const { return m_buffer.data(); }
++        void appendData(char *data, int len) { return m_buffer.appendData(data, len); }
+ 
+         unsigned debugOffset() { return m_buffer.debugOffset(); }
+ 
+Index: qtdeclarative-opensource-src-5.3.0/src/3rdparty/masm/assembler/AbstractMacroAssembler.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/3rdparty/masm/assembler/AbstractMacroAssembler.h
++++ qtdeclarative-opensource-src-5.3.0/src/3rdparty/masm/assembler/AbstractMacroAssembler.h
+@@ -486,6 +486,11 @@ public:
+             return Call(jump.m_label, Linkable);
+         }
+ 
++        unsigned int getFlags(void)
++        {
++            return m_flags;
++        }
++
+         AssemblerLabel m_label;
+     private:
+         Flags m_flags;
+@@ -746,6 +751,12 @@ public:
+     {
+         AssemblerType::cacheFlush(code, size);
+     }
++
++    void appendData(char *data, int len)
++    {
++        return m_assembler.appendData(data, len);
++    }
++
+ protected:
+     AbstractMacroAssembler()
+         : m_randomSource(cryptographicallyRandomNumber())
+Index: qtdeclarative-opensource-src-5.3.0/src/3rdparty/masm/assembler/AssemblerBuffer.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/3rdparty/masm/assembler/AssemblerBuffer.h
++++ qtdeclarative-opensource-src-5.3.0/src/3rdparty/masm/assembler/AssemblerBuffer.h
+@@ -86,6 +86,14 @@ namespace JSC {
+                 grow();
+         }
+ 
++        void appendData(char *data, int len)
++        {
++            if (!isAvailable(len))
++                grow(len);
++            memcpy(m_buffer + m_index, data, len);
++            m_index += len;
++        }
++
+         bool isAligned(int alignment) const
+         {
+             return !(m_index & (alignment - 1));
+Index: qtdeclarative-opensource-src-5.3.0/src/3rdparty/masm/assembler/LinkBuffer.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/3rdparty/masm/assembler/LinkBuffer.h
++++ qtdeclarative-opensource-src-5.3.0/src/3rdparty/masm/assembler/LinkBuffer.h
+@@ -109,11 +109,13 @@ public:
+     
+     // These methods are used to link or set values at code generation time.
+ 
+-    void link(Call call, FunctionPtr function)
++    unsigned int link(Call call, FunctionPtr function)
+     {
+         ASSERT(call.isFlagSet(Call::Linkable));
+         call.m_label = applyOffset(call.m_label);
+         MacroAssembler::linkCall(code(), call, function);
++
++        return call.m_label.m_offset;
+     }
+     
+     void link(Jump jump, CodeLocationLabel label)
+Index: qtdeclarative-opensource-src-5.3.0/src/3rdparty/masm/assembler/X86Assembler.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/3rdparty/masm/assembler/X86Assembler.h
++++ qtdeclarative-opensource-src-5.3.0/src/3rdparty/masm/assembler/X86Assembler.h
+@@ -101,6 +101,11 @@ public:
+         ConditionNC = ConditionAE,
+     } Condition;
+ 
++    void appendData(char *data, int len)
++    {
++        return m_formatter.appendData(data, len);
++    }
++
+ private:
+     typedef enum {
+         OP_ADD_EvGv                     = 0x01,
+@@ -2380,6 +2385,7 @@ private:
+         AssemblerLabel label() const { return m_buffer.label(); }
+         bool isAligned(int alignment) const { return m_buffer.isAligned(alignment); }
+         void* data() const { return m_buffer.data(); }
++        void appendData(char *data, int len) { return m_buffer.appendData(data, len); }
+ 
+         PassRefPtr<ExecutableMemoryHandle> executableCopy(JSGlobalData& globalData, void* ownerUID, JITCompilationEffort effort)
+         {
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qqmlirbuilder.cpp
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/compiler/qqmlirbuilder.cpp
++++ qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qqmlirbuilder.cpp
+@@ -1512,7 +1512,12 @@ bool IRBuilder::isStatementNodeScript(QQ
+ QV4::CompiledData::QmlUnit *QmlUnitGenerator::generate(Document &output)
+ {
+     QV4::CompiledData::CompilationUnit *compilationUnit = output.javaScriptCompilationUnit;
+-    QV4::CompiledData::Unit *jsUnit = compilationUnit->createUnitData(&output);
++    QV4::CompiledData::Unit *jsUnit;
++    if (!compilationUnit->data)
++        jsUnit = compilationUnit->createUnitData(&output);
++    else
++        jsUnit = compilationUnit->data;
++
+     const uint unitSize = jsUnit->unitSize;
+ 
+     const int importSize = sizeof(QV4::CompiledData::Import) * output.imports.count();
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qqmltypecompiler.cpp
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/compiler/qqmltypecompiler.cpp
++++ qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qqmltypecompiler.cpp
+@@ -226,6 +226,7 @@ bool QQmlTypeCompiler::compile()
+         QV4::ExecutionEngine *v4 = engine->v4engine();
+         QScopedPointer<QV4::EvalInstructionSelection> isel(v4->iselFactory->create(engine, v4->executableAllocator, &document->jsModule, &document->jsGenerator));
+         isel->setUseFastLookups(false);
++        isel->setEngine(engine);
+         document->javaScriptCompilationUnit = isel->compile(/*generated unit data*/false);
+     }
+ 
+@@ -435,6 +436,7 @@ QQmlPropertyCacheCreator::QQmlPropertyCa
+     , qmlObjects(*typeCompiler->qmlObjects())
+     , imports(typeCompiler->imports())
+     , resolvedTypes(typeCompiler->resolvedTypes())
++    , m_url(typeCompiler->url())
+ {
+ }
+ 
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qqmltypecompiler_p.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/compiler/qqmltypecompiler_p.h
++++ qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qqmltypecompiler_p.h
+@@ -149,6 +149,7 @@ protected:
+     QHash<int, QQmlCompiledData::TypeReference*> *resolvedTypes;
+     QVector<QByteArray> vmeMetaObjects;
+     QVector<QQmlPropertyCache*> propertyCaches;
++    QUrl m_url;
+ };
+ 
+ // "Converts" signal expressions to full-fleged function declarations with
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qv4compileddata_p.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/compiler/qv4compileddata_p.h
++++ qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qv4compileddata_p.h
+@@ -599,6 +599,9 @@ struct Q_QML_PRIVATE_EXPORT CompilationU
+     QV4::InternalClass **runtimeClasses;
+     QVector<QV4::Function *> runtimeFunctions;
+ 
++    QVector<int> lookupTable;
++    bool isRestored;
++
+     QV4::Function *linkToEngine(QV4::ExecutionEngine *engine);
+     void unlink();
+ 
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qv4isel_moth_p.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/compiler/qv4isel_moth_p.h
++++ qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qv4isel_moth_p.h
+@@ -72,6 +72,7 @@ public:
+     ~InstructionSelection();
+ 
+     virtual void run(int functionIndex);
++    virtual QV4::JIT::InstructionSelection* impl() { return NULL; };;
+ 
+ protected:
+     virtual QV4::CompiledData::CompilationUnit *backendCompileStep();
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qv4isel_p.cpp
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/compiler/qv4isel_p.cpp
++++ qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qv4isel_p.cpp
+@@ -1,8 +1,14 @@
+-/****************************************************************************
++/***************************************************************************
+ **
+ ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+ ** Contact: http://www.qt-project.org/legal
+ **
++** Copyright (C) 2014 Nomovok Ltd. All rights reserved.
++** Contact: info@nomovok.com
++**
++** Copyright (C) 2014 Canonical Limited and/or its subsidiary(-ies).
++** Contact: ricardo.mendoza@canonical.com
++**
+ ** This file is part of the QtQml module of the Qt Toolkit.
+ **
+ ** $QT_BEGIN_LICENSE:LGPL$
+@@ -49,6 +55,50 @@
+ 
+ #include <QString>
+ 
++#ifdef V4_UNIT_CACHE
++#include <private/qqmltypenamecache_p.h>
++#include <private/qqmlcompiler_p.h>
++#include <private/qqmltypeloader_p.h>
++#include <private/qv4compileddata_p.h>
++#include <private/qv4assembler_p.h>
++#include "../jit/qv4cachedlinkdata_p.h"
++#include "../jit/qv4assembler_p.h"
++#include <sys/stat.h>
++#include <QCryptographicHash>
++#include <QStandardPaths>
++#include <QDir>
++#include <QFile>
++#include <QDataStream>
++#include <QBuffer>
++#endif
++
++bool writeData(QDataStream& stream, const char* data, int len)
++{
++    if (stream.writeRawData(data, len) != len)
++        return false;
++    else
++        return true;
++}
++
++bool writeDataWithLen(QDataStream& stream, const char* data, int len)
++{
++    quint32 l = len;
++    if (!writeData(stream, (const char *)&l, sizeof(quint32)))
++        return false;
++    if (!writeData(stream, data, len))
++        return false;
++    return true;
++}
++
++bool readData(char *data, int len, QDataStream &stream)
++{
++    if (stream.readRawData(data, len) != len) {
++        return false;
++    } else {
++        return true;
++    }
++}
++
+ namespace {
+ Q_GLOBAL_STATIC_WITH_ARGS(QTextStream, qout, (stderr, QIODevice::WriteOnly));
+ #define qout *qout()
+@@ -57,6 +107,8 @@ Q_GLOBAL_STATIC_WITH_ARGS(QTextStream, q
+ using namespace QV4;
+ using namespace QV4::IR;
+ 
++static bool do_cache = true;
++
+ EvalInstructionSelection::EvalInstructionSelection(QV4::ExecutableAllocator *execAllocator, Module *module, QV4::Compiler::JSUnitGenerator *jsGenerator)
+     : useFastLookups(true)
+     , executableAllocator(execAllocator)
+@@ -71,6 +123,8 @@ EvalInstructionSelection::EvalInstructio
+     Q_ASSERT(execAllocator);
+ #endif
+     Q_ASSERT(module);
++
++    do_cache = qgetenv("QV4_NO_JIT_CACHE").isEmpty();
+ }
+ 
+ EvalInstructionSelection::~EvalInstructionSelection()
+@@ -79,17 +133,237 @@ EvalInstructionSelection::~EvalInstructi
+ EvalISelFactory::~EvalISelFactory()
+ {}
+ 
+-QV4::CompiledData::CompilationUnit *EvalInstructionSelection::compile(bool generateUnitData)
++QV4::CompiledData::CompilationUnit *EvalInstructionSelection::runAll(bool generateUnitData)
+ {
+-    for (int i = 0; i < irModule->functions.size(); ++i)
+-        run(i);
++    QV4::CompiledData::CompilationUnit *unit;
++
++    for (int i = 0; i < irModule->functions.size(); ++i) {
++        run(i); // Performs the actual compilation
++    }
++
++    unit = backendCompileStep();
++
++#ifdef V4_UNIT_CACHE
++    unit->isRestored = false;
++#endif
+ 
+-    QV4::CompiledData::CompilationUnit *unit = backendCompileStep();
+     if (generateUnitData)
+         unit->data = jsGenerator->generateUnit();
++
+     return unit;
+ }
+ 
++QV4::CompiledData::CompilationUnit *EvalInstructionSelection::compile(bool generateUnitData)
++{
++#ifndef V4_UNIT_CACHE
++    return runAll(generateUnitData);
++#else
++    QV4::CompiledData::CompilationUnit *unit;
++
++    bool loaded = false;
++    bool do_save = true;
++
++    // This code has been inspired and influenced by Nomovok's QMLC compiler available at
++    // https://github.com/qmlc/qmlc. All original Copyrights are maintained for the
++    // basic code snippets.
++
++    // Search for cache blob by mtime/app_id/file hash
++    struct stat sb;
++    stat(irModule->fileName.toLatin1().remove(0, 7).constData(), &sb);
++    QByteArray time(ctime(&sb.st_mtime));
++    QByteArray urlHash(QCryptographicHash::hash((irModule->fileName.toLatin1() + qgetenv("APP_ID") + time), QCryptographicHash::Md5).toHex());
++    QDir dir;
++    QByteArray path(qgetenv("HOME") + QByteArray("/.cache/QML/Apps/") + (qgetenv("APP_ID").isEmpty() ? QCoreApplication::applicationName().toLatin1() : qgetenv("APP_ID")));
++    dir.mkpath(QLatin1String(path));
++    QFile cacheFile(path + QDir::separator() + urlHash);
++
++    QByteArray fileData;
++
++    // TODO: Support inline compilation units
++    if (cacheFile.exists() && cacheFile.open(QIODevice::ReadOnly)) {
++        if (do_cache && !irModule->fileName.isEmpty() && !irModule->fileName.contains(QStringLiteral("inline")) && m_engine) {
++            loaded = true;
++            fileData.append(cacheFile.readAll());
++        } else {
++            loaded = false;
++            cacheFile.close();
++            return runAll(generateUnitData);
++        }
++    }
++
++    // Check file integrity
++    QString fileHash(QLatin1String(QCryptographicHash::hash(fileData.left(fileData.size()-32), QCryptographicHash::Md5).toHex()));
++    if (!fileHash.contains(QLatin1String(fileData.right(32)))) {
++        cacheFile.close();
++        cacheFile.remove();
++        loaded = false;
++    }
++
++    if (loaded) {
++        // Retrieve unit skeleton from isel implementation
++        unit = backendCompileStep();
++        QV4::JIT::CompilationUnit *tmpUnit = (QV4::JIT::CompilationUnit *) unit;
++        tmpUnit->codeRefs.resize(irModule->functions.size());
++
++        QDataStream stream(fileData);
++
++        unit->lookupTable.reserve(tmpUnit->codeRefs.size());
++        quint32 len;
++        for (int i = 0; i < tmpUnit->codeRefs.size(); i++) {
++            quint32 strLen;
++            readData((char *)&strLen, sizeof(quint32), stream);
++
++            char *fStr = (char *) malloc(strLen);
++            readData(fStr, strLen, stream);
++
++            QString hashString(QLatin1String(irModule->functions.at(i)->name->toLatin1().constData()));
++            hashString.append(QString::number(irModule->functions.at(i)->line));
++            hashString.append(QString::number(irModule->functions.at(i)->column));
++
++            if (!hashString.contains(QLatin1String(fStr)))
++                return runAll(generateUnitData);
++
++            unit->lookupTable.append(i);
++
++            len = 0;
++            readData((char *)&len, sizeof(quint32), stream);
++
++            // Temporary unlinked code buffer
++            executableAllocator->allocate(len);
++            char *data = (char *) malloc(len);
++            readData(data, len, stream);
++
++            quint32 linkCallCount = 0;
++            readData((char *)&linkCallCount, sizeof(quint32), stream);
++
++            QVector<QV4::JIT::CachedLinkData> linkCalls;
++            linkCalls.resize(linkCallCount);
++            readData((char *)linkCalls.data(), linkCallCount * sizeof(QV4::JIT::CachedLinkData), stream);
++
++            quint32 constVectorLen = 0;
++            readData((char *)&constVectorLen, sizeof(quint32), stream);
++
++            QVector<QV4::Primitive > constantVector;
++            if (constVectorLen > 0) {
++                constantVector.resize(constVectorLen);
++                readData((char *)constantVector.data(), constVectorLen * sizeof(QV4::Primitive), stream);
++            }
++
++            // Pre-allocate link buffer to append code
++            QV4::ExecutableAllocator* executableAllocator = m_engine->v4engine()->executableAllocator;
++
++            QV4::IR::Function nullFunction(0, 0, QLatin1String(""));
++
++            QV4::JIT::Assembler* as = new QV4::JIT::Assembler(this->impl(), &nullFunction, executableAllocator, 6);
++
++            QList<QV4::JIT::Assembler::CallToLink>& callsToLink = as->callsToLink();
++            for (int i = 0; i < linkCalls.size(); i++) {
++                QV4::JIT::CachedLinkData& call = linkCalls[i];
++                void *functionPtr = CACHED_LINK_TABLE[call.index].addr;
++                QV4::JIT::Assembler::CallToLink c;
++                JSC::AssemblerLabel label(call.offset);
++                c.call = QV4::JIT::Assembler::Call(label, QV4::JIT::Assembler::Call::Linkable);
++                c.externalFunction = JSC::FunctionPtr((quint32(*)(void))functionPtr);
++                c.functionName = CACHED_LINK_TABLE[call.index].name;
++                callsToLink.append(c);
++            }
++
++            QV4::JIT::Assembler::ConstantTable& constTable = as->constantTable();
++            foreach (const QV4::Primitive &p, constantVector)
++               constTable.add(p);
++
++            as->appendData(data, len);
++
++            int dummySize = -1; // Pass known value to trigger use of code buffer
++            tmpUnit->codeRefs[i] = as->link(&dummySize);
++            Q_ASSERT(dummySize == (int)codeRefLen);
++
++            delete as;
++        }
++
++        quint32 size = 0;
++        readData((char *)&size, sizeof(quint32), stream);
++
++        void *dataPtr = malloc(size);
++        QV4::CompiledData::Unit *finalUnit = reinterpret_cast<QV4::CompiledData::Unit*>(dataPtr);
++        if (size > 0)
++            readData((char *)dataPtr, size, stream);
++
++        unit->data = nullptr;
++        if (irModule->functions.size() > 0)
++            unit->data = finalUnit;
++
++        unit->isRestored = true;
++    } else {
++        // Not loading from cache, run all instructions
++        unit = runAll(false);
++    }
++
++    if ((unit->data == nullptr) && (do_save || generateUnitData))
++        unit->data = jsGenerator->generateUnit();
++
++    // Save compilation unit
++    QV4::JIT::CompilationUnit *jitUnit = (QV4::JIT::CompilationUnit *) unit;
++    if (!loaded && do_cache) {
++        if (cacheFile.open(QIODevice::WriteOnly)) {
++            // TODO: Support inline compilation units
++            if (!irModule->fileName.isEmpty() && !irModule->fileName.contains(QLatin1String("inline")) && m_engine) {
++                QBuffer fillBuff;
++                fillBuff.open(QIODevice::WriteOnly);
++                QDataStream stream(&fillBuff);
++
++                for (int i = 0; i < jitUnit->codeRefs.size(); i++) {
++                    const JSC::MacroAssemblerCodeRef &codeRef = jitUnit->codeRefs[i];
++                    const QVector<QV4::Primitive> &constantValue = jitUnit->constantValues[i];
++                    quint32 len = codeRef.size();
++
++                    QString hashString(QLatin1String(irModule->functions.at(i)->name->toLatin1()));
++                    hashString.append(QString::number(irModule->functions.at(i)->line));
++                    hashString.append(QString::number(irModule->functions.at(i)->column));
++
++                    quint32 strLen = hashString.size();
++                    strLen += 1; // /0 char
++                    writeData(stream, (const char *)&strLen, sizeof(quint32));
++                    writeData(stream, (const char *)hashString.toLatin1().constData(), strLen);
++                    writeData(stream, (const char *)&len, sizeof(quint32));
++                    writeData(stream, (const char *)(((unsigned long)codeRef.code().executableAddress())&~1), len);
++
++                    const QVector<QV4::JIT::CachedLinkData> &linkCalls = jitUnit->linkData[i];
++                    quint32 linkCallCount = linkCalls.size();
++
++                    writeData(stream, (const char *)&linkCallCount, sizeof(quint32));
++                    if (linkCallCount > 0)
++                        writeData(stream, (const char *)linkCalls.data(), linkCalls.size() * sizeof (QV4::JIT::CachedLinkData));
++
++                    quint32 constTableCount = constantValue.size();
++                    writeData(stream, (const char *)&constTableCount, sizeof(quint32));
++
++                    if (constTableCount > 0)
++                        writeData(stream, (const char*)constantValue.data(), sizeof(QV4::Primitive) * constantValue.size());
++                }
++
++                QV4::CompiledData::Unit *retUnit = unit->data;
++                quint32 size = retUnit->unitSize;
++
++                if (size > 0) {
++                    writeData(stream, (const char*)&size, sizeof(quint32));
++                    writeData(stream, (const char*)retUnit, size);
++                }
++
++                // Write MD5 hash of stored data for consistency check
++                QByteArray fileHash(QCryptographicHash::hash(fillBuff.data(), QCryptographicHash::Md5).toHex());
++                fillBuff.write(fileHash);
++                cacheFile.write(fillBuff.data());
++            }
++            cacheFile.close();
++        } else {
++            cacheFile.close();
++        }
++    }
++    return unit;
++#endif
++}
++
+ void IRDecoder::visitMove(IR::Move *s)
+ {
+     if (IR::Name *n = s->target->asName()) {
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qv4isel_p.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/compiler/qv4isel_p.h
++++ qtdeclarative-opensource-src-5.3.0/src/qml/compiler/qv4isel_p.h
+@@ -56,6 +56,10 @@ class QQmlEnginePrivate;
+ 
+ namespace QV4 {
+ 
++namespace JIT {
++    class InstructionSelection;
++}
++
+ class ExecutableAllocator;
+ struct Function;
+ 
+@@ -65,6 +69,7 @@ public:
+     EvalInstructionSelection(QV4::ExecutableAllocator *execAllocator, IR::Module *module, QV4::Compiler::JSUnitGenerator *jsGenerator);
+     virtual ~EvalInstructionSelection() = 0;
+ 
++    QV4::CompiledData::CompilationUnit *runAll(bool generateUnitData);
+     QV4::CompiledData::CompilationUnit *compile(bool generateUnitData = true);
+ 
+     void setUseFastLookups(bool b) { useFastLookups = b; }
+@@ -78,9 +83,11 @@ public:
+     int registerRegExp(IR::RegExp *regexp) { return jsGenerator->registerRegExp(regexp); }
+     int registerJSClass(int count, IR::ExprList *args) { return jsGenerator->registerJSClass(count, args); }
+     QV4::Compiler::JSUnitGenerator *jsUnitGenerator() const { return jsGenerator; }
++    void setEngine(QQmlEnginePrivate *qmlEngine) { m_engine = qmlEngine; }
+ 
+ protected:
+     virtual void run(int functionIndex) = 0;
++    virtual QV4::JIT::InstructionSelection* impl() = 0;
+     virtual QV4::CompiledData::CompilationUnit *backendCompileStep() = 0;
+ 
+     bool useFastLookups;
+@@ -88,6 +95,7 @@ protected:
+     QV4::Compiler::JSUnitGenerator *jsGenerator;
+     QScopedPointer<QV4::Compiler::JSUnitGenerator> ownJSGenerator;
+     IR::Module *irModule;
++    QQmlEnginePrivate *m_engine;
+ };
+ 
+ class Q_QML_PRIVATE_EXPORT EvalISelFactory
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/jit/qv4assembler.cpp
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/jit/qv4assembler.cpp
++++ qtdeclarative-opensource-src-5.3.0/src/qml/jit/qv4assembler.cpp
+@@ -77,7 +77,10 @@ void CompilationUnit::linkBackendToEngin
+ 
+         QV4::Function *runtimeFunction = new QV4::Function(engine, this, compiledFunction,
+                                                            (ReturnedValue (*)(QV4::ExecutionContext *, const uchar *)) codeRefs[i].code().executableAddress());
+-        runtimeFunctions[i] = runtimeFunction;
++        if (isRestored)
++            runtimeFunctions[lookupTable.at(i)] = runtimeFunction;
++        else
++            runtimeFunctions[i] = runtimeFunction;
+     }
+ }
+ 
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/jit/qv4assembler_p.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/jit/qv4assembler_p.h
++++ qtdeclarative-opensource-src-5.3.0/src/qml/jit/qv4assembler_p.h
+@@ -70,6 +70,16 @@ namespace JIT {
+ 
+ class InstructionSelection;
+ 
++struct CachedLinkData {
++    quint32 index; // Link table index
++    quint32 offset; // Offset inside the codeRef code
++};
++
++struct LinkableCode {
++    int len;
++    void* code;
++};
++
+ struct CompilationUnit : public QV4::CompiledData::CompilationUnit
+ {
+     virtual ~CompilationUnit();
+@@ -82,6 +92,8 @@ struct CompilationUnit : public QV4::Com
+ 
+     QVector<JSC::MacroAssemblerCodeRef> codeRefs;
+     QList<QVector<QV4::Primitive> > constantValues;
++    QList<QVector<CachedLinkData>> linkData;
++    QList<LinkableCode> linkableCode;
+ };
+ 
+ struct RelativeCall {
+@@ -1150,7 +1162,12 @@ public:
+             move(TrustedImm64(u.i), ReturnValueRegister);
+             move64ToDouble(ReturnValueRegister, target);
+ #else
+-            JSC::MacroAssembler::loadDouble(constantTable().loadValueAddress(c, ScratchRegister), target);
++            QV4::Primitive vv = convertToValue(c);
++            FPRegisterID scratchFp;
++            scratchFp = target;
++            move(TrustedImm32(vv.int_32), ReturnValueRegister);
++            move(TrustedImm32(vv.tag), ScratchRegister);
++            moveIntsToDouble(ReturnValueRegister, ScratchRegister, target, scratchFp);
+ #endif
+             return target;
+         }
+@@ -1240,6 +1257,12 @@ public:
+     Label exceptionReturnLabel;
+     IR::BasicBlock * catchBlock;
+     QVector<Jump> exceptionPropagationJumps;
++
++    LinkableCode tmpBuffer;
++
++    LinkableCode& codeToLink() { return tmpBuffer; }
++    QList<CallToLink>& callsToLink() { return _callsToLink; }
++
+ private:
+     const StackLayout _stackLayout;
+     ConstantTable _constTable;
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/jit/qv4cachedlinkdata_p.h
+===================================================================
+--- /dev/null
++++ qtdeclarative-opensource-src-5.3.0/src/qml/jit/qv4cachedlinkdata_p.h
+@@ -0,0 +1,188 @@
++/***************************************************************************
++**
++** Copyright (C) 2014 Nomovok Ltd. All rights reserved.
++** Contact: info@nomovok.com
++**
++** Copyright (C) 2014 Canonical Limited and/or its subsidiary(-ies).
++** Contact: ricardo.mendoza@canonical.com
++**
++** GNU Lesser General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU Lesser
++** General Public License version 2.1 as published by the Free Software
++** Foundation and appearing in the file LICENSE.LGPL included in the
++** packaging of this file.  Please review the following information to
++** ensure the GNU Lesser General Public License version 2.1 requirements
++** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
++**
++** In addition, as a special exception, Digia gives you certain additional
++** rights.  These rights are described in the Digia Qt LGPL Exception
++** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
++**
++** GNU General Public License Usage
++** Alternatively, this file may be used under the terms of the GNU
++** General Public License version 3.0 as published by the Free Software
++** Foundation and appearing in the file LICENSE.GPL included in the
++** packaging of this file.  Please review the following information to
++** ensure the GNU General Public License version 3.0 requirements will be
++** met: http://www.gnu.org/copyleft/gpl.html.
++**
++****************************************************************************/
++
++#ifndef QV4CACHEDLINKDATA_P_H
++#define QV4CACHEDLINKDATA_P_H
++
++#include <qv4jsir_p.h>
++#include <qv4isel_masm_p.h>
++#include <qv4runtime_p.h>
++
++QT_BEGIN_NAMESPACE
++
++struct CachedLinkEntry {
++    const char *name;
++    void *addr;
++};
++
++#define CACHED_LINK_TABLE_ADD_NS(x) QV4::Runtime::x
++#define CACHED_LINK_TABLE_STR(x) "Runtime::" #x
++#define CACHED_LINK_TABLE_ENTRY_RUNTIME(x) { (const char *)CACHED_LINK_TABLE_STR(x), (void *)CACHED_LINK_TABLE_ADD_NS(x) }
++
++// table to link objects
++// this table can be used to resolve functions, it is id -> object mapping to maximize performance in linking phase
++// when adding new calls, add to end of the list to maintain compatibility
++const CachedLinkEntry CACHED_LINK_TABLE[] = {
++    // call
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(callGlobalLookup),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(callActivationProperty),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(callProperty),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(callPropertyLookup),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(callElement),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(callValue),
++
++    // construct
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(constructGlobalLookup),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(constructActivationProperty),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(constructProperty),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(constructPropertyLookup),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(constructValue),
++
++    // set & get
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(setActivationProperty),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(setProperty),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(setElement),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(getProperty),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(getActivationProperty),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(getElement),
++
++    // typeof
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(typeofValue),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(typeofName),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(typeofMember),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(typeofElement),
++
++    // delete
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(deleteElement),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(deleteMember),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(deleteName),
++
++    // exceptions & scopes
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(throwException),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(unwindException),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(pushWithScope),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(pushCatchScope),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(popScope),
++
++    // closures
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(closure),
++
++    // function header
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(declareVar),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(setupArgumentsObject),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(convertThisToObject),
++
++    // literals
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(arrayLiteral),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(objectLiteral),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(regexpLiteral),
++
++    // foreach
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(foreachIterator),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(foreachNextPropertyName),
++
++    // unary operators
++    //typedef ReturnedValue (*UnaryOperation)(const ValueRef);
++    {"NOOP", (void *)qt_noop},
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(uPlus),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(uMinus),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(uNot),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(complement),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(increment),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(decrement),
++
++    // binary operators
++    //typedef ReturnedValue (*BinaryOperation)(const ValueRef left, const ValueRef right);
++    {"NOOP", (void *)qt_noop},
++    //typedef ReturnedValue (*BinaryOperationContext)(ExecutionContext *ctx, const ValueRef left, const ValueRef right);
++    {"NOOP", (void *)qt_noop},
++
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(instanceof),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(in),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(add),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(addString),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(bitOr),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(bitXor),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(bitAnd),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(sub),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(mul),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(div),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(mod),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(shl),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(shr),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(ushr),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(greaterThan),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(lessThan),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(greaterEqual),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(lessEqual),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(equal),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(notEqual),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(strictEqual),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(strictNotEqual),
++
++    // comparisons
++    //typedef Bool (*CompareOperation)(const ValueRef left, const ValueRef right);}
++    {"NOOP", (void *)qt_noop},
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(compareGreaterThan),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(compareLessThan),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(compareGreaterEqual),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(compareLessEqual),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(compareEqual),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(compareNotEqual),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(compareStrictEqual),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(compareStrictNotEqual),
++
++    //typedef Bool (*CompareOperationContext)(ExecutionContext *ctx, const ValueRef left, const ValueRef right);
++    {"NOOP", (void *)qt_noop},
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(compareInstanceof),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(compareIn),
++
++    // conversions
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(toBoolean),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(toDouble),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(toInt),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(doubleToInt),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(toUInt),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(doubleToUInt),
++
++    // qml
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(getQmlIdArray),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(getQmlImportedScripts),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(getQmlContextObject),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(getQmlScopeObject),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(getQmlSingleton),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(getQmlAttachedProperty),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(getQmlQObjectProperty),
++    CACHED_LINK_TABLE_ENTRY_RUNTIME(setQmlQObjectProperty)
++};
++
++QT_END_NAMESPACE
++
++#endif
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/jit/qv4isel_masm.cpp
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/jit/qv4isel_masm.cpp
++++ qtdeclarative-opensource-src-5.3.0/src/qml/jit/qv4isel_masm.cpp
+@@ -51,6 +51,7 @@
+ #include "qv4assembler_p.h"
+ #include "qv4unop_p.h"
+ #include "qv4binop_p.h"
++#include "qv4cachedlinkdata_p.h"
+ 
+ #include <QtCore/QBuffer>
+ 
+@@ -141,9 +142,13 @@ JSC::MacroAssemblerCodeRef Assembler::li
+     JSC::LinkBuffer linkBuffer(dummy, this, 0);
+ 
+     QHash<void*, const char*> functions;
++    int i = 0;
+     foreach (CallToLink ctl, _callsToLink) {
+-        linkBuffer.link(ctl.call, ctl.externalFunction);
++        unsigned int offset = linkBuffer.link(ctl.call, ctl.externalFunction);
++        ctl.call.m_label.m_offset = offset;
+         functions[ctl.externalFunction.value()] = ctl.functionName;
++        _callsToLink.replace(i, ctl);
++        i++;
+     }
+ 
+     foreach (const DataLabelPatch &p, _dataLabelPatches)
+@@ -360,6 +365,25 @@ void InstructionSelection::run(int funct
+     JSC::MacroAssemblerCodeRef codeRef =_as->link(&dummySize);
+     compilationUnit->codeRefs[functionIndex] = codeRef;
+ 
++    QVector<CachedLinkData> calls;
++    QList<Assembler::CallToLink>& callsToLink = _as->callsToLink();
++    for (int i = 0; i < callsToLink.size(); i++) {
++        Assembler::CallToLink& ctl = callsToLink[i];
++        int index = -1;
++        for (uint i = 0; i < sizeof(CACHED_LINK_TABLE) / sizeof (CachedLinkEntry); i++) {
++           if (CACHED_LINK_TABLE[i].addr == ctl.externalFunction.value()) {
++               index = i;
++               break;
++           }
++        }
++        CachedLinkData link;
++        link.index = index;
++        link.offset = ctl.call.m_label.m_offset;
++        calls.append(link);
++    }
++    compilationUnit->linkData.insert(functionIndex, calls); // link data;
++    compilationUnit->linkableCode.insert(functionIndex, _as->codeToLink()); // code to link
++
+     qSwap(_function, function);
+     delete _as;
+     _as = oldAssembler;
+@@ -1821,5 +1845,4 @@ void InstructionSelection::visitCJumpEqu
+                                 _block, trueBlock, falseBlock);
+ }
+ 
+-
+ #endif // ENABLE(ASSEMBLER)
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/jit/qv4isel_masm_p.h
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/jit/qv4isel_masm_p.h
++++ qtdeclarative-opensource-src-5.3.0/src/qml/jit/qv4isel_masm_p.h
+@@ -73,6 +73,9 @@ public:
+     virtual void run(int functionIndex);
+ 
+     void *addConstantTable(QVector<QV4::Primitive> *values);
++
++    virtual InstructionSelection* impl() { return this; };
++
+ protected:
+     virtual QV4::CompiledData::CompilationUnit *backendCompileStep();
+ 
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/jsruntime/qv4functionobject.cpp
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/jsruntime/qv4functionobject.cpp
++++ qtdeclarative-opensource-src-5.3.0/src/qml/jsruntime/qv4functionobject.cpp
+@@ -234,6 +234,7 @@ ReturnedValue FunctionCtor::construct(Ma
+ 
+     QV4::Compiler::JSUnitGenerator jsGenerator(&module);
+     QScopedPointer<EvalInstructionSelection> isel(v4->iselFactory->create(QQmlEnginePrivate::get(v4), v4->executableAllocator, &module, &jsGenerator));
++    isel->setEngine(QQmlEnginePrivate::get(v4));
+     QV4::CompiledData::CompilationUnit *compilationUnit = isel->compile();
+     QV4::Function *vmf = compilationUnit->linkToEngine(v4);
+ 
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/jsruntime/qv4qobjectwrapper.cpp
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/jsruntime/qv4qobjectwrapper.cpp
++++ qtdeclarative-opensource-src-5.3.0/src/qml/jsruntime/qv4qobjectwrapper.cpp
+@@ -628,6 +628,7 @@ ReturnedValue QObjectWrapper::getPropert
+     QQmlPropertyCache *cache = ddata->propertyCache;
+     Q_ASSERT(cache);
+     QQmlPropertyData *property = cache->property(propertyIndex);
++
+     Q_ASSERT(property); // We resolved this property earlier, so it better exist!
+     return getProperty(object, ctx, property, captureRequired);
+ }
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/jsruntime/qv4script.cpp
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/jsruntime/qv4script.cpp
++++ qtdeclarative-opensource-src-5.3.0/src/qml/jsruntime/qv4script.cpp
+@@ -272,6 +272,7 @@ void Script::parse()
+         QScopedPointer<EvalInstructionSelection> isel(v4->iselFactory->create(QQmlEnginePrivate::get(v4), v4->executableAllocator, &module, &jsGenerator));
+         if (inheritContext)
+             isel->setUseFastLookups(false);
++        isel->setEngine(QQmlEnginePrivate::get(v4));
+         QV4::CompiledData::CompilationUnit *compilationUnit = isel->compile();
+         vmFunction = compilationUnit->linkToEngine(v4);
+         ScopedValue holder(valueScope, new (v4->memoryManager) CompilationUnitHolder(v4, compilationUnit));
+@@ -394,6 +395,7 @@ QV4::CompiledData::CompilationUnit *Scri
+ 
+     QScopedPointer<EvalInstructionSelection> isel(engine->iselFactory->create(QQmlEnginePrivate::get(engine), engine->executableAllocator, module, unitGenerator));
+     isel->setUseFastLookups(false);
++    isel->setEngine(QQmlEnginePrivate::get(engine));
+     return isel->compile(/*generate unit data*/false);
+ }
+ 
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/qml/qqmljavascriptexpression.cpp
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/qml/qqmljavascriptexpression.cpp
++++ qtdeclarative-opensource-src-5.3.0/src/qml/qml/qqmljavascriptexpression.cpp
+@@ -335,6 +335,7 @@ QV4::ReturnedValue QQmlJavaScriptExpress
+ 
+     QV4::ScopedObject qmlScopeObject(scope, QV4::QmlContextWrapper::qmlScope(ep->v8engine(), ctxt, qmlScope));
+     QV4::Script script(v4, qmlScopeObject, code, filename, line);
++
+     QV4::ScopedValue result(scope);
+     script.parse();
+     if (!v4->hasException)
+Index: qtdeclarative-opensource-src-5.3.0/src/qml/compiler/compiler.pri
+===================================================================
+--- qtdeclarative-opensource-src-5.3.0.orig/src/qml/compiler/compiler.pri
++++ qtdeclarative-opensource-src-5.3.0/src/qml/compiler/compiler.pri
+@@ -28,10 +28,10 @@ HEADERS += \
+     $$PWD/qv4isel_moth_p.h \
+     $$PWD/qv4instr_moth_p.h
+ 
+-
+ SOURCES += \
+     $$PWD/qqmltypecompiler.cpp \
+     $$PWD/qv4instr_moth.cpp \
+     $$PWD/qv4isel_moth.cpp
+ 
++DEFINES += V4_UNIT_CACHE
+ }

=== modified file 'debian/patches/series'
--- debian/patches/series	2014-09-19 08:02:20 +0000
+++ debian/patches/series	2014-10-06 11:30:34 +0000
@@ -14,3 +14,4 @@
 Avoid-double-deletion-when-deleting-an-incubating-co.patch
 Fix-bindings-to-when-property-of-States-not-always-w.patch
 Fix-crash-in-QObjectWrapper.patch
+QML-Compilation-unit-caching-and-JIT-changes.patch

=== modified file 'debian/rules'
--- debian/rules	2014-08-01 11:51:10 +0000
+++ debian/rules	2014-10-06 11:30:34 +0000
@@ -7,14 +7,6 @@
 
 DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
 
-# Explicitly selecting a G{CC,++}-version here to avoid symbol changes
-# because of the default gcc switch.
-export CC=$(DEB_HOST_GNU_TYPE)-gcc-4.8
-export CXX=$(DEB_HOST_GNU_TYPE)-g++-4.8
-
-export CFLAGS := $(shell dpkg-buildflags --get CFLAGS) $(shell dpkg-buildflags --get CPPFLAGS)
-export CXXFLAGS := $(shell dpkg-buildflags --get CXXFLAGS) $(shell dpkg-buildflags --get CPPFLAGS)
-export LDFLAGS := $(shell dpkg-buildflags --get LDFLAGS) -Wl,--as-needed
 export QT_SELECT := qt5
 
 %:

