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 | |
66 | |