9#pragma qt_class(QtPlugin)
12#include <QtCore/qobject.h>
13#include <QtCore/qpointer.h>
14#include <QtCore/qjsonobject.h>
16#include <QtCore/q20algorithm.h>
41 'Q',
'T',
'M',
'E',
'T',
'A',
'D',
'A',
'T',
'A',
' ',
'!'
44 template <size_t OSize,
typename OO, size_t ISize,
typename II>
45 static constexpr void copy(OO (&out)[OSize], II (&in)[ISize])
47 static_assert(OSize <= ISize,
"Output would not be fully initialized");
48 q20::copy_n(in, OSize, out);
54#if defined(__AVX512F__)
56#elif defined(__AVX__) || defined(__BMI__) || defined(__BMI2__) || defined(__MOVBE__)
58#elif defined(__SSE3__)
60#elif defined(__SSE__
) || defined(__MMX___)
75 static_assert(
alignof(
Header) == 1,
"Alignment of header incorrect with this compiler");
82 static_assert(
alignof(
MagicHeader) == 1,
"Alignment of header incorrect with this compiler");
86 static constexpr char NoteName[] =
"qt-project!";
100 static_assert(
alignof(
ElfNoteHeader) ==
alignof(
void*),
"Alignment of header incorrect with this compiler");
101 static_assert((
sizeof(
ElfNoteHeader::name) % 4) == 0,
"ELF note name length not a multiple of 4");
112 constexpr QStaticPlugin(QtPluginInstanceFunction i, QtPluginMetaDataFunction m)
113 : instance(i), rawMetaDataSize(m().size), rawMetaData(m().data)
115 QtPluginInstanceFunction instance;
116 QJsonObject metaData()
const;
119 qsizetype rawMetaDataSize;
120 const void *rawMetaData;
121 friend class QFactoryLoader;
125void Q_CORE_EXPORT qRegisterStaticPluginFunction(QStaticPlugin staticPlugin);
127#if defined(Q_OF_ELF) || (defined(Q_OS_WIN) && (defined (Q_CC_GNU) || defined(Q_CC_CLANG)))
128# define QT_PLUGIN_METADATA_SECTION
129 __attribute__ ((section (".qtmetadata"))) __attribute__((used))
130#elif defined(Q_OS_DARWIN)
131# define QT_PLUGIN_METADATA_SECTION
132 __attribute__ ((section ("__TEXT,qtmetadata"))) __attribute__((used))
133#elif defined(Q_CC_MSVC)
135#pragma section(".qtmetadata",read,shared)
136# define QT_PLUGIN_METADATA_SECTION
137 __declspec(allocate(".qtmetadata"))
139# define QT_PLUGIN_METADATA_SECTION
146 static constexpr size_t HeaderOffset = offsetof(QPluginMetaData::ElfNoteHeader, header);
147 quint8 payload[
sizeof(PluginMetaData)] = {};
148 constexpr ElfNotePayload() :
ElfNoteHeader(
sizeof(PluginMetaData))
149 { QPluginMetaData::copy(payload, PluginMetaData); }
153 static constexpr size_t HeaderOffset = offsetof(QPluginMetaData::MagicHeader, header);
154 quint8 payload[
sizeof(PluginMetaData)] = {};
155 constexpr RegularPayload() { QPluginMetaData::copy(payload, PluginMetaData); }
158 struct StaticPayload {
159 static constexpr size_t HeaderOffset = 0;
161 quint8 payload[
sizeof(PluginMetaData)] = {};
162 constexpr StaticPayload() { QPluginMetaData::copy(payload, PluginMetaData); }
165#if defined(QT_STATICPLUGIN)
166# define QT_PLUGIN_METADATAV2_SECTION
168#elif defined(Q_OF_ELF)
170# define QT_PLUGIN_METADATAV2_SECTION
171 __attribute__((section(".note.qt.metadata"), used, aligned(alignof(void *)),
172 no_sanitize("address")))
174# define QT_PLUGIN_METADATAV2_SECTION
175 __attribute__((section(".note.qt.metadata"), used, aligned(alignof(void *))))
180 using Payload = RegularPayload;
183 Payload payload = {};
188 Q_ASSERT(
reinterpret_cast<
const char *>(&payload) + Payload::HeaderOffset ==
189 reinterpret_cast<
const char *>(&payload.header));
190 return { &payload.header,
sizeof(payload) - Payload::HeaderOffset };
194#define Q_IMPORT_PLUGIN(PLUGIN)
195 extern const QT_PREPEND_NAMESPACE(QStaticPlugin) QT_MANGLE_NAMESPACE(qt_static_plugin_##PLUGIN)();
197 struct Static##PLUGIN##PluginInstance {
198 Static##PLUGIN##PluginInstance() {
199 qRegisterStaticPluginFunction(QT_MANGLE_NAMESPACE(qt_static_plugin_##PLUGIN)());
204 static Static##PLUGIN##PluginInstance static##PLUGIN##Instance;
206#if defined(QT_PLUGIN_RESOURCE_INIT_FUNCTION)
207# define QT_PLUGIN_RESOURCE_INIT
208 extern void QT_PLUGIN_RESOURCE_INIT_FUNCTION();
209 QT_PLUGIN_RESOURCE_INIT_FUNCTION();
211# define QT_PLUGIN_RESOURCE_INIT
214#define Q_PLUGIN_INSTANCE(IMPLEMENTATION)
216 static QT_PREPEND_NAMESPACE(QPointer)<QT_PREPEND_NAMESPACE(QObject)> _instance;
219 _instance = new IMPLEMENTATION;
224#if defined(QT_STATICPLUGIN)
225# define QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME)
226 static QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance_##MANGLEDNAME()
227 Q_PLUGIN_INSTANCE(PLUGINCLASS)
228 const QT_PREPEND_NAMESPACE(QStaticPlugin) QT_MANGLE_NAMESPACE(qt_static_plugin_##MANGLEDNAME)()
229 { return { qt_plugin_instance_##MANGLEDNAME, qt_plugin_query_metadata_##MANGLEDNAME}; }
232# define QT_MOC_EXPORT_PLUGIN(PLUGINCLASS, PLUGINCLASSNAME)
233 static QPluginMetaData qt_plugin_query_metadata_##PLUGINCLASSNAME()
234 { return { qt_pluginMetaData_##PLUGINCLASSNAME, sizeof qt_pluginMetaData_##PLUGINCLASSNAME }; }
235 QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, PLUGINCLASSNAME)
237# define QT_MOC_EXPORT_PLUGIN_V2(PLUGINCLASS, MANGLEDNAME, MD)
238 static QT_PREPEND_NAMESPACE(QPluginMetaData) qt_plugin_query_metadata_##MANGLEDNAME()
239 { static constexpr QPluginMetaDataV2<MD> md{}; return md; }
240 QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME)
242# define QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME)
243 extern "C" Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QObject) *qt_plugin_instance()
247# define QT_MOC_EXPORT_PLUGIN(PLUGINCLASS, PLUGINCLASSNAME)
248 extern "C" Q_DECL_EXPORT
249 QPluginMetaData qt_plugin_query_metadata()
250 { return { qt_pluginMetaData_##PLUGINCLASSNAME, sizeof qt_pluginMetaData_##PLUGINCLASSNAME }; }
253# define QT_MOC_EXPORT_PLUGIN_V2(PLUGINCLASS, MANGLEDNAME, MD)
254 extern "C" Q_DECL_EXPORT QT_PREPEND_NAMESPACE(QPluginMetaData) qt_plugin_query_metadata_v2()
259#define Q_EXPORT_PLUGIN(PLUGIN)
261# define Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS)
262 static_assert(false, "Old plugin system used")
264# define Q_EXPORT_STATIC_PLUGIN2(PLUGIN, PLUGINCLASS)
265 static_assert(false, "Old plugin system used")
\inmodule QtCore\reentrant
void setExtraSearchPath(const QString &path)
int indexOf(const QString &needle) const
QMultiMap< int, QString > keyMap() const
MetaDataList metaData() const
QList< QCborArray > metaDataKeys() const
QObject * instance(int index) const
Q_DECLARE_TYPEINFO(QByteArrayView, Q_PRIMITIVE_TYPE)
QT_REQUIRE_CONFIG(cborstreamreader)
Q_TRACE_POINT(qtcore, QFactoryLoader_update, const QString &fileName)
static bool isIidMatch(QByteArrayView raw, QLatin1StringView iid)
static IterationResult iterateInPluginMetaData(QByteArrayView raw, F &&f)
PluginInterface * qLoadPlugin(const QFactoryLoader *loader, const QString &key, Args &&...args)
#define Q_PLUGIN_INSTANCE(IMPLEMENTATION)
#define QT_MOC_EXPORT_PLUGIN_COMMON(PLUGINCLASS, MANGLEDNAME)
QT_BEGIN_NAMESPACE constexpr unsigned char qPluginArchRequirements()
#define Q_EXPORT_PLUGIN2(PLUGIN, PLUGINCLASS)
#define QT_PLUGIN_RESOURCE_INIT
#define QT_PLUGIN_METADATAV2_SECTION
QObject *(* QtPluginInstanceFunction)()
#define QT_PLUGIN_METADATA_SECTION