Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qtsymbolmacros.h
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QTSYMBOLMACROS_H
5#define QTSYMBOLMACROS_H
6
7#if 0
8# pragma qt_sync_stop_processing
9#endif
10
11// For GHS symbol keeping.
12#include <QtCore/qcompilerdetection.h>
13#include <QtCore/qtpreprocessorsupport.h>
14
15// For handling namespaced resources.
16#ifdef QT_NAMESPACE
17# define QT_RCC_MANGLE_NAMESPACE0(x) x
18# define QT_RCC_MANGLE_NAMESPACE1(a, b) a##_##b
19# define QT_RCC_MANGLE_NAMESPACE2(a, b) QT_RCC_MANGLE_NAMESPACE1(a,b)
20# define QT_RCC_MANGLE_NAMESPACE(name) QT_RCC_MANGLE_NAMESPACE2( \
21 QT_RCC_MANGLE_NAMESPACE0(name), QT_RCC_MANGLE_NAMESPACE0(QT_NAMESPACE))
22#else
23# define QT_RCC_MANGLE_NAMESPACE(name) name
24#endif
25
26// GHS needs special handling to keep a symbol around.
27#if defined(Q_CC_GHS)
28# define Q_GHS_KEEP_REFERENCE(S) QT_DO_PRAGMA(ghs reference S ##__Fv)
29#else
30# define Q_GHS_KEEP_REFERENCE(S)
31#endif
32
33// Macros to ensure a symbol is not dropped by the linker even if it's not used.
34#define QT_DECLARE_EXTERN_SYMBOL(NAME, RETURN_TYPE) \
35 extern RETURN_TYPE NAME(); \
36 Q_GHS_KEEP_REFERENCE(NAME)
37
38#define QT_DECLARE_EXTERN_SYMBOL_INT(NAME) \
39 QT_DECLARE_EXTERN_SYMBOL(NAME, int)
40
41#define QT_DECLARE_EXTERN_SYMBOL_VOID(NAME) \
42 QT_DECLARE_EXTERN_SYMBOL(NAME, void)
43
44#define QT_KEEP_SYMBOL_VAR_NAME(NAME) NAME ## _keep
45
46#define QT_KEEP_SYMBOL_HELPER(NAME, VAR_NAME) \
47 volatile auto VAR_NAME = &NAME; \
48 Q_UNUSED(VAR_NAME)
49
50#define QT_KEEP_SYMBOL(NAME) \
51 QT_KEEP_SYMBOL_HELPER(NAME, QT_KEEP_SYMBOL_VAR_NAME(NAME))
52
53
54// Similar to the ones above, but for rcc resource symbols specifically.
55#define QT_GET_RESOURCE_INIT_SYMBOL(NAME) \
56 QT_RCC_MANGLE_NAMESPACE(qInitResources_ ## NAME)
57
58#define QT_DECLARE_EXTERN_RESOURCE(NAME) \
59 QT_DECLARE_EXTERN_SYMBOL_INT(QT_GET_RESOURCE_INIT_SYMBOL(NAME))
60
61#define QT_KEEP_RESOURCE(NAME) \
62 QT_KEEP_SYMBOL(QT_GET_RESOURCE_INIT_SYMBOL(NAME))
63
64#endif // QTSYMBOLMACROS_H
65