From e749605ecbe76c392552d0e3a75f47b31bed9ba1 Mon Sep 17 00:00:00 2001 From: Kimmo Ollila Date: Wed, 11 Nov 2020 12:23:53 +0200 Subject: [PATCH 07/28] Avoid GHS linker to optimize away QML type registrations GHS linker optimizes away QML type registrations despite volatile. To prevent this we add #pragma ghs reference(s) to avoid such linker optimization. Fixes: QTBUG-88033 Change-Id: I7c8983506360710185c37028873234b1464847d5 Reviewed-by: Ulf Hermann --- src/imports/folderlistmodel/plugin.cpp | 1 + src/imports/labsanimation/plugin.cpp | 1 + src/imports/labsmodels/plugin.cpp | 1 + src/imports/layouts/plugin.cpp | 1 + src/imports/localstorage/plugin.cpp | 1 + src/imports/settings/plugin.cpp | 1 + src/imports/sharedimage/plugin.cpp | 1 + src/imports/statemachine/plugin.cpp | 1 + src/imports/testlib/main.cpp | 1 + src/imports/wavefrontmesh/plugin.cpp | 1 + src/imports/window/plugin.cpp | 1 + src/particles/qtquickparticlesglobal_p.h | 1 + src/qml/qml/qqmlextensionplugin.h | 7 +++++++ src/qml/qtqmlglobal_p.h | 2 ++ src/qmlmodels/qtqmlmodelsglobal_p.h | 1 + src/qmlworkerscript/qtqmlworkerscriptglobal_p.h | 1 + src/quick/qtquickglobal_p.h | 1 + src/quickshapes/qquickshapesglobal_p.h | 2 ++ 18 files changed, 26 insertions(+) diff --git a/src/imports/folderlistmodel/plugin.cpp b/src/imports/folderlistmodel/plugin.cpp index 7a38769b77..7206df6664 100644 --- a/src/imports/folderlistmodel/plugin.cpp +++ b/src/imports/folderlistmodel/plugin.cpp @@ -43,6 +43,7 @@ #include "qquickfolderlistmodel.h" extern void qml_register_types_Qt_labs_folderlistmodel(); +GHS_KEEP_REFERENCE(qml_register_types_Qt_labs_folderlistmodel); QT_BEGIN_NAMESPACE diff --git a/src/imports/labsanimation/plugin.cpp b/src/imports/labsanimation/plugin.cpp index 9c985f0dcf..c35be764f9 100644 --- a/src/imports/labsanimation/plugin.cpp +++ b/src/imports/labsanimation/plugin.cpp @@ -43,6 +43,7 @@ #include "qquickboundaryrule_p.h" extern void qml_register_types_Qt_labs_animation(); +GHS_KEEP_REFERENCE(qml_register_types_Qt_labs_animation); QT_BEGIN_NAMESPACE diff --git a/src/imports/labsmodels/plugin.cpp b/src/imports/labsmodels/plugin.cpp index ab5e0023a6..b06491e663 100644 --- a/src/imports/labsmodels/plugin.cpp +++ b/src/imports/labsmodels/plugin.cpp @@ -51,6 +51,7 @@ #endif extern void qml_register_types_Qt_labs_qmlmodels(); +GHS_KEEP_REFERENCE(qml_register_types_Qt_labs_qmlmodels); QT_BEGIN_NAMESPACE diff --git a/src/imports/layouts/plugin.cpp b/src/imports/layouts/plugin.cpp index af270c1732..b6ae516eee 100644 --- a/src/imports/layouts/plugin.cpp +++ b/src/imports/layouts/plugin.cpp @@ -43,6 +43,7 @@ #include "qquickstacklayout_p.h" extern void qml_register_types_QtQuick_Layouts(); +GHS_KEEP_REFERENCE(qml_register_types_QtQuick_Layouts); QT_BEGIN_NAMESPACE diff --git a/src/imports/localstorage/plugin.cpp b/src/imports/localstorage/plugin.cpp index e488b3d43c..0291ed4715 100644 --- a/src/imports/localstorage/plugin.cpp +++ b/src/imports/localstorage/plugin.cpp @@ -43,6 +43,7 @@ #include extern void qml_register_types_QtQuick_LocalStorage(); +GHS_KEEP_REFERENCE(qml_register_types_QtQuick_LocalStorage); QT_BEGIN_NAMESPACE diff --git a/src/imports/settings/plugin.cpp b/src/imports/settings/plugin.cpp index e8e640412b..e83147f612 100644 --- a/src/imports/settings/plugin.cpp +++ b/src/imports/settings/plugin.cpp @@ -43,6 +43,7 @@ #include "qqmlsettings_p.h" extern void qml_register_types_Qt_labs_settings(); +GHS_KEEP_REFERENCE(qml_register_types_Qt_labs_settings); QT_BEGIN_NAMESPACE diff --git a/src/imports/sharedimage/plugin.cpp b/src/imports/sharedimage/plugin.cpp index d7c2ef8d17..79168d933b 100644 --- a/src/imports/sharedimage/plugin.cpp +++ b/src/imports/sharedimage/plugin.cpp @@ -100,6 +100,7 @@ */ extern void qml_register_types_Qt_labs_sharedimage(); +GHS_KEEP_REFERENCE(qml_register_types_Qt_labs_sharedimage); QT_BEGIN_NAMESPACE diff --git a/src/imports/statemachine/plugin.cpp b/src/imports/statemachine/plugin.cpp index c370504029..abb238965e 100644 --- a/src/imports/statemachine/plugin.cpp +++ b/src/imports/statemachine/plugin.cpp @@ -49,6 +49,7 @@ #include extern void qml_register_types_QtQml_StateMachine(); +GHS_KEEP_REFERENCE(qml_register_types_QtQml_StateMachine); QT_BEGIN_NAMESPACE diff --git a/src/imports/testlib/main.cpp b/src/imports/testlib/main.cpp index 83fc150e6c..1da251c49b 100644 --- a/src/imports/testlib/main.cpp +++ b/src/imports/testlib/main.cpp @@ -51,6 +51,7 @@ QML_DECLARE_TYPE(QuickTestEvent) QML_DECLARE_TYPE(QuickTestUtil) extern void qml_register_types_QtTest(); +GHS_KEEP_REFERENCE(qml_register_types_QtTest); QT_BEGIN_NAMESPACE diff --git a/src/imports/wavefrontmesh/plugin.cpp b/src/imports/wavefrontmesh/plugin.cpp index eea0db19db..edd4d1dba5 100644 --- a/src/imports/wavefrontmesh/plugin.cpp +++ b/src/imports/wavefrontmesh/plugin.cpp @@ -43,6 +43,7 @@ #include "qwavefrontmesh.h" extern void qml_register_types_Qt_labs_wavefrontmesh(); +GHS_KEEP_REFERENCE(qml_register_types_Qt_labs_wavefrontmesh); QT_BEGIN_NAMESPACE diff --git a/src/imports/window/plugin.cpp b/src/imports/window/plugin.cpp index 5152fa02ec..ff2f10fde3 100644 --- a/src/imports/window/plugin.cpp +++ b/src/imports/window/plugin.cpp @@ -42,6 +42,7 @@ #include "plugin.h" extern void qml_register_types_QtQuick_Window(); +GHS_KEEP_REFERENCE(qml_register_types_QtQuick_Window); QT_BEGIN_NAMESPACE diff --git a/src/particles/qtquickparticlesglobal_p.h b/src/particles/qtquickparticlesglobal_p.h index 927bc29050..91c2764060 100644 --- a/src/particles/qtquickparticlesglobal_p.h +++ b/src/particles/qtquickparticlesglobal_p.h @@ -66,5 +66,6 @@ #endif void Q_QUICKPARTICLES_PRIVATE_EXPORT qml_register_types_QtQuick_Particles(); +GHS_KEEP_REFERENCE(qml_register_types_QtQuick_Particles); #endif // QTQUICKPARTICLESGLOBAL_P_H diff --git a/src/qml/qml/qqmlextensionplugin.h b/src/qml/qml/qqmlextensionplugin.h index ef7ff422cd..afb3f99c4a 100644 --- a/src/qml/qml/qqmlextensionplugin.h +++ b/src/qml/qml/qqmlextensionplugin.h @@ -44,6 +44,13 @@ #include #include +#if defined(Q_CC_GHS) +# define GHS_PRAGMA(S) _Pragma(#S) +# define GHS_KEEP_REFERENCE(S) GHS_PRAGMA(ghs reference S ##__Fv) +#else +# define GHS_KEEP_REFERENCE(S) +#endif + QT_BEGIN_NAMESPACE class QQmlEngine; diff --git a/src/qml/qtqmlglobal_p.h b/src/qml/qtqmlglobal_p.h index a729729b67..7b0910fa13 100644 --- a/src/qml/qtqmlglobal_p.h +++ b/src/qml/qtqmlglobal_p.h @@ -53,6 +53,7 @@ #include #include +#include #ifndef QT_QML_BOOTSTRAPPED # include #endif @@ -61,6 +62,7 @@ #define Q_QML_PRIVATE_EXPORT Q_QML_EXPORT void Q_QML_PRIVATE_EXPORT qml_register_types_QtQml(); +GHS_KEEP_REFERENCE(qml_register_types_QtQml); #if !defined(QT_QMLDEVTOOLS_LIB) && !defined(QT_BUILD_QMLDEVTOOLS_LIB) # define Q_QML_AUTOTEST_EXPORT Q_AUTOTEST_EXPORT diff --git a/src/qmlmodels/qtqmlmodelsglobal_p.h b/src/qmlmodels/qtqmlmodelsglobal_p.h index 1a1157138d..24df6ef7b3 100644 --- a/src/qmlmodels/qtqmlmodelsglobal_p.h +++ b/src/qmlmodels/qtqmlmodelsglobal_p.h @@ -59,5 +59,6 @@ #define Q_QMLMODELS_AUTOTEST_EXPORT Q_AUTOTEST_EXPORT void Q_QMLMODELS_PRIVATE_EXPORT qml_register_types_QtQml_Models(); +GHS_KEEP_REFERENCE(qml_register_types_QtQml_Models); #endif // QTQMLMODELSGLOBAL_P_H diff --git a/src/qmlworkerscript/qtqmlworkerscriptglobal_p.h b/src/qmlworkerscript/qtqmlworkerscriptglobal_p.h index c75d5f3129..6452567f6b 100644 --- a/src/qmlworkerscript/qtqmlworkerscriptglobal_p.h +++ b/src/qmlworkerscript/qtqmlworkerscriptglobal_p.h @@ -58,5 +58,6 @@ #define Q_QMLWORKERSCRIPT_AUTOTEST_EXPORT Q_AUTOTEST_EXPORT void Q_QMLWORKERSCRIPT_PRIVATE_EXPORT qml_register_types_QtQml_WorkerScript(); +GHS_KEEP_REFERENCE(qml_register_types_QtQml_WorkerScript); #endif // QTQMLWORKERSCRIPTGLOBAL_P_H diff --git a/src/quick/qtquickglobal_p.h b/src/quick/qtquickglobal_p.h index 80e59563c7..97680569e7 100644 --- a/src/quick/qtquickglobal_p.h +++ b/src/quick/qtquickglobal_p.h @@ -62,6 +62,7 @@ #define Q_QUICK_PRIVATE_EXPORT Q_QUICK_EXPORT void Q_QUICK_PRIVATE_EXPORT qml_register_types_QtQuick(); +GHS_KEEP_REFERENCE(qml_register_types_QtQuick); QT_BEGIN_NAMESPACE diff --git a/src/quickshapes/qquickshapesglobal_p.h b/src/quickshapes/qquickshapesglobal_p.h index 40f6cfbdcf..37386c23b2 100644 --- a/src/quickshapes/qquickshapesglobal_p.h +++ b/src/quickshapes/qquickshapesglobal_p.h @@ -51,6 +51,7 @@ // We mean it. // +#include #include "qquickshapesglobal.h" QT_BEGIN_NAMESPACE @@ -60,5 +61,6 @@ QT_BEGIN_NAMESPACE QT_END_NAMESPACE void Q_QUICKSHAPES_PRIVATE_EXPORT qml_register_types_QtQuick_Shapes(); +GHS_KEEP_REFERENCE(qml_register_types_QtQuick_Shapes); #endif // QQUICKSHAPESGLOBAL_P_H -- 2.31.1