diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2022-06-17 10:04:51 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2022-06-28 15:07:40 -0700 |
commit | dbf58407cb7f87b8d75ffd4e8af1393e80f30873 (patch) | |
tree | 3a8becf0a3ec8a047303ec2a8d5304a88f1794d1 /src/corelib/kernel/qmetatype.cpp | |
parent | b6a953bb939cb5fe6305f4acf62003c766887f51 (diff) |
QMetaType: extern-template the built-in Core types' QMetaTypeInterface
This *should* make no difference in behavior, it just prevents the
instantiation of the QMetaTypeInterface and all the lambdas used in it
in every compilation unit, with a copy in every library. Now, a simple
function like:
QMetaType f() { return QMetaType::fromType<int>(); }
produces only a single function, with a reference into QtCore:
_Z1fv:
movq _ZN9QtPrivate25QMetaTypeInterfaceWrapperIiE8metaTypeE@GOTPCREL(%rip),%rax
ret
The code above *does* work on Windows, producing:
_Z1fv:
movq __imp__ZN9QtPrivate25QMetaTypeInterfaceWrapperIiE8metaTypeE(%rip), %rax
ret
However, it breaks the staticMetaObjects' metatype listing, because
getting the address of a __declspec(dllimport) variable is not a
constant expression (it lacks data relocations). So this is disabled on
Windows.
This change also broke the INTEGRITY build. I've simply disabled the
optimization there without attempting to understand why it fails.
Task-number: QTBUG-93471
Pick-to: 6.4
Change-Id: Id0fb9ab0089845ee8843fffd16f97748a00b4d64
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/corelib/kernel/qmetatype.cpp')
-rw-r--r-- | src/corelib/kernel/qmetatype.cpp | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/src/corelib/kernel/qmetatype.cpp b/src/corelib/kernel/qmetatype.cpp index c78ef4c916..130b30481d 100644 --- a/src/corelib/kernel/qmetatype.cpp +++ b/src/corelib/kernel/qmetatype.cpp @@ -2975,12 +2975,13 @@ QMetaType::QMetaType(int typeId) : QMetaType(interfaceForType(typeId)) {} */ namespace QtPrivate { -#if !defined(QT_BOOTSTRAPPED) && !defined(Q_CC_MSVC) +#if !defined(QT_BOOTSTRAPPED) && !defined(Q_CC_MSVC) && !defined(Q_OS_INTEGRITY) // Explicit instantiation definition -#define QT_METATYPE_DECLARE_TEMPLATE_ITER(TypeName, Id, Name) \ - template class QMetaTypeForType<Name>; -QT_FOR_EACH_STATIC_PRIMITIVE_TYPE(QT_METATYPE_DECLARE_TEMPLATE_ITER) +#define QT_METATYPE_DECLARE_TEMPLATE_ITER(TypeName, Id, Name) \ + template class QMetaTypeForType<Name>; \ + template struct QMetaTypeInterfaceWrapper<Name>; +QT_FOR_EACH_STATIC_PRIMITIVE_NON_VOID_TYPE(QT_METATYPE_DECLARE_TEMPLATE_ITER) QT_FOR_EACH_STATIC_PRIMITIVE_POINTER(QT_METATYPE_DECLARE_TEMPLATE_ITER) QT_FOR_EACH_STATIC_CORE_CLASS(QT_METATYPE_DECLARE_TEMPLATE_ITER) QT_FOR_EACH_STATIC_CORE_POINTER(QT_METATYPE_DECLARE_TEMPLATE_ITER) |