summaryrefslogtreecommitdiffstats
path: root/src/corelib/plugin
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2021-09-10 15:48:06 -0700
committerThiago Macieira <thiago.macieira@intel.com>2021-10-04 14:01:34 -0700
commit788a7bfdb1981108efbf55bc42a468ca0e8b102e (patch)
treee42ebf168ee4ff3359e9421049d9ea4e9ef6fe80 /src/corelib/plugin
parent2adf444b5e73f1f43ac358581c88917c0eace8e8 (diff)
QPlugin: move some of the logic from moc's output to qplugin.h
This will allow us to make changes in QtCore itself, without having to worry about moc compatibility. The output uses an #ifdef so this version of moc can still be used to compile earlier versions of Qt (usually, in cross-compilation environments). See discussion in the mailing list[1]. [1] https://lists.qt-project.org/pipermail/development/2021-September/041732.html Change-Id: I2de1b4dfacd443148279fffd16a39784c80c5f3b Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/corelib/plugin')
-rw-r--r--src/corelib/plugin/qplugin.h76
1 files changed, 68 insertions, 8 deletions
diff --git a/src/corelib/plugin/qplugin.h b/src/corelib/plugin/qplugin.h
index 411edba792..a80ee28c52 100644
--- a/src/corelib/plugin/qplugin.h
+++ b/src/corelib/plugin/qplugin.h
@@ -65,7 +65,36 @@ inline constexpr unsigned char qPluginArchRequirements()
typedef QObject *(*QtPluginInstanceFunction)();
struct QPluginMetaData
{
- const uchar *data;
+ static constexpr quint8 CurrentMetaDataVersion = 0;
+ static constexpr char MagicString[] = {
+ 'Q', 'T', 'M', 'E', 'T', 'A', 'D', 'A', 'T', 'A', ' ', '!'
+ };
+
+ template <size_t OSize, typename OO, size_t ISize, typename II>
+ static constexpr void copy(OO (&out)[OSize], II (&in)[ISize])
+ {
+ // std::copy is not constexpr until C++20
+ static_assert(OSize <= ISize, "Output would not be fully initialized");
+ for (size_t i = 0; i < OSize; ++i)
+ out[i] = in[i];
+ }
+
+ struct Header {
+ quint8 version = CurrentMetaDataVersion;
+ quint8 qt_major_version = QT_VERSION_MAJOR;
+ quint8 qt_minor_version = QT_VERSION_MINOR;
+ quint8 plugin_arch_requirements = qPluginArchRequirements();
+ };
+ static_assert(alignof(Header) == 1, "Alignment of header incorrect with this compiler");
+
+ struct MagicHeader {
+ char magic[sizeof(QPluginMetaData::MagicString)] = {};
+ constexpr MagicHeader() { copy(magic, QPluginMetaData::MagicString); }
+ Header header = {};
+ };
+ static_assert(alignof(MagicHeader) == 1, "Alignment of header incorrect with this compiler");
+
+ const void *data;
size_t size;
};
typedef QPluginMetaData (*QtPluginMetaDataFunction)();
@@ -104,6 +133,24 @@ void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin);
# define QT_PLUGIN_METADATA_SECTION
#endif
+// Since Qt 6.3
+template <auto (&PluginMetaData)> class QPluginMetaDataV2
+{
+ struct Payload {
+ QPluginMetaData::MagicHeader header = {};
+ quint8 payload[sizeof(PluginMetaData)] = {};
+ constexpr Payload() { QPluginMetaData::copy(payload, PluginMetaData); }
+ };
+
+#define QT_PLUGIN_METADATAV2_SECTION QT_PLUGIN_METADATA_SECTION
+ Payload payload = {};
+
+public:
+ operator QPluginMetaData() const
+ {
+ return { &payload, sizeof(payload) };
+ }
+};
#define Q_IMPORT_PLUGIN(PLUGIN) \
extern const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##PLUGIN(); \
@@ -134,25 +181,38 @@ void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin);
}
#if defined(QT_STATICPLUGIN)
+# define QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME) \
+ static QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance_##MANGLEDNAME() \
+ Q_PLUGIN_INSTANCE(PLUGINCLASS) \
+ const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##MANGLEDNAME() \
+ { return { qt_plugin_instance_##MANGLEDNAME, qt_plugin_query_metadata_##MANGLEDNAME}; } \
+ /**/
# define QT_MOC_EXPORT_PLUGIN(PLUGINCLASS, PLUGINCLASSNAME) \
- static QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance_##PLUGINCLASSNAME() \
- Q_PLUGIN_INSTANCE(PLUGINCLASS) \
static QPluginMetaData qt_plugin_query_metadata_##PLUGINCLASSNAME() \
{ return { qt_pluginMetaData_##PLUGINCLASSNAME, sizeof qt_pluginMetaData_##PLUGINCLASSNAME }; } \
- const QT_PREPEND_NAMESPACE(QStaticPlugin) qt_static_plugin_##PLUGINCLASSNAME() { \
- return { qt_plugin_instance_##PLUGINCLASSNAME, qt_plugin_query_metadata_##PLUGINCLASSNAME}; \
- }
+ QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, PLUGINCLASSNAME)
+# define QT_MOC_EXPORT_PLUGIN_V2(PLUGINCLASS, MANGLEDNAME, MD) \
+ static QT_PREPEND_NAMESPACE(QPluginMetaData) qt_plugin_query_metadata_##MANGLEDNAME() \
+ { static constexpr QPluginMetaDataV2<MD> md{}; return md; } \
+ QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME)
#else
+# define QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME) \
+ extern "C" Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance() \
+ Q_PLUGIN_INSTANCE(PLUGINCLASS) \
+ /**/
# define QT_MOC_EXPORT_PLUGIN(PLUGINCLASS, PLUGINCLASSNAME) \
extern "C" Q_DECL_EXPORT \
QPluginMetaData qt_plugin_query_metadata() \
{ return { qt_pluginMetaData_##PLUGINCLASSNAME, sizeof qt_pluginMetaData_##PLUGINCLASSNAME }; } \
- extern "C" Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance() \
- Q_PLUGIN_INSTANCE(PLUGINCLASS)
+ QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, PLUGINCLASSNAME)
+# define QT_MOC_EXPORT_PLUGIN_V2(PLUGINCLASS, MANGLEDNAME, MD) \
+ extern "C" Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QPluginMetaData) qt_plugin_query_metadata() \
+ { static constexpr QT_PLUGIN_METADATAV2_SECTION QPluginMetaDataV2<MD> md{}; return md; } \
+ QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME)
#endif
#define Q_EXPORT_PLUGIN(PLUGIN) \