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