Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 | /* * Copyright (c) 2010-2014, Wind River Systems, Inc. * * SPDX-License-Identifier: Apache-2.0 */ /** * @file * @brief Macros to abstract toolchain specific capabilities * * This file contains various macros to abstract compiler capabilities that * utilize toolchain specific attributes and/or pragmas. */ #ifndef ZEPHYR_INCLUDE_TOOLCHAIN_H_ #define ZEPHYR_INCLUDE_TOOLCHAIN_H_ /** * @def HAS_BUILTIN(x) * @brief Check if the compiler supports the built-in function \a x. * * This macro is for use with conditional compilation to enable code using a * builtin function that may not be available in every compiler. */ #ifdef __has_builtin #define HAS_BUILTIN(x) __has_builtin(x) #else /* * The compiler doesn't provide the __has_builtin() macro, so instead we depend * on the toolchain-specific headers to define HAS_BUILTIN_x for the builtins * supported. */ #define HAS_BUILTIN(x) HAS_BUILTIN_##x #endif #if defined(__TOOLCHAIN_CUSTOM__) /* This include line exists for off-tree definitions of compilers, * and therefore this header is not meant to exist in-tree */ #include <toolchain/other.h> #elif defined(__XCC__) #include <zephyr/toolchain/xcc.h> #elif defined(__CCAC__) #include <zephyr/toolchain/mwdt.h> #elif defined(__ARMCOMPILER_VERSION) #include <zephyr/toolchain/armclang.h> #elif defined(__llvm__) || (defined(_LINKER) && defined(__LLD_LINKER_CMD__)) #include <zephyr/toolchain/llvm.h> #elif defined(__GNUC__) || (defined(_LINKER) && defined(__GCC_LINKER_CMD__)) #include <zephyr/toolchain/gcc.h> #else #error "Invalid/unknown toolchain configuration" #endif /** * @def __noasan * @brief Disable address sanitizer * * When used in the definiton of a symbol, prevents that symbol (be it * a function or data) from being instrumented by the address * sanitizer feature of the compiler. Most commonly, this is used to * prevent padding around data that will be treated specially by the * Zephyr link (c.f. SYS_INIT records, STRUCT_SECTION_ITERABLE * definitions) in ways that don't understand the guard padding. */ #ifndef __noasan #define __noasan /**/ #endif /** * @def TOOLCHAIN_GCC_VERSION * @brief GCC version in xxyyzz for xx.yy.zz. Zero if not GCC compatible. */ #ifndef TOOLCHAIN_GCC_VERSION #define TOOLCHAIN_GCC_VERSION 0 #endif /** * @def TOOLCHAIN_CLANG_VERSION * @brief Clang version in xxyyzz for xx.yy.zz. Zero if not Clang compatible. */ #ifndef TOOLCHAIN_CLANG_VERSION #define TOOLCHAIN_CLANG_VERSION 0 #endif /** * @def TOOLCHAIN_HAS_PRAGMA_DIAG * @brief Indicate if toolchain supports \#pragma diagnostics. */ #ifndef TOOLCHAIN_HAS_PRAGMA_DIAG #define TOOLCHAIN_HAS_PRAGMA_DIAG 0 #endif /** * @def TOOLCHAIN_HAS_C_GENERIC * @brief Indicate if toolchain supports C Generic. */ #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L /* _Generic is introduced in C11, so it is supported. */ # ifdef TOOLCHAIN_HAS_C_GENERIC # undef TOOLCHAIN_HAS_C_GENERIC # endif # define TOOLCHAIN_HAS_C_GENERIC 1 #else # ifndef TOOLCHAIN_HAS_C_GENERIC # define TOOLCHAIN_HAS_C_GENERIC 0 # endif #endif /** * @def TOOLCHAIN_HAS_C_AUTO_TYPE * @brief Indicate if toolchain supports C __auto_type. */ #ifndef TOOLCHAIN_HAS_C_AUTO_TYPE #define TOOLCHAIN_HAS_C_AUTO_TYPE 0 #endif /** * @def TOOLCHAIN_HAS_ZLA * @brief Indicate if toolchain supports Zero Length Arrays. */ #ifndef TOOLCHAIN_HAS_ZLA #define TOOLCHAIN_HAS_ZLA 0 #endif /** * @def TOOLCHAIN_IGNORE_WSHADOW_BEGIN * @brief Begin of block to ignore -Wshadow. * * To be used inside another macro. * Only for toolchain supporting _Pragma("GCC diagnostic ..."). */ #ifndef TOOLCHAIN_IGNORE_WSHADOW_BEGIN #define TOOLCHAIN_IGNORE_WSHADOW_BEGIN #endif /** * @def TOOLCHAIN_IGNORE_WSHADOW_END * @brief End of block to ignore -Wshadow. * * To be used inside another macro. * Only for toolchain supporting _Pragma("GCC diagnostic ..."). */ #ifndef TOOLCHAIN_IGNORE_WSHADOW_END #define TOOLCHAIN_IGNORE_WSHADOW_END #endif /* * Ensure that __BYTE_ORDER__ and related preprocessor definitions are defined, * and that they match the Kconfig option that is used in the code itself to * check for endianness. */ #ifndef _LINKER #if !defined(__BYTE_ORDER__) || !defined(__ORDER_BIG_ENDIAN__) || \ !defined(__ORDER_LITTLE_ENDIAN__) /* * Displaying values unfortunately requires #pragma message which can't * be taken for granted + STRINGIFY() which is not available in this .h * file. */ #error "At least one byte _ORDER_ macro is not defined" #else #if (defined(CONFIG_BIG_ENDIAN) && (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__)) || \ (defined(CONFIG_LITTLE_ENDIAN) && (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__)) # error "Kconfig/toolchain endianness mismatch:" # if (__BYTE_ORDER__ != __ORDER_BIG_ENDIAN__) && (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__) # error "Unknown __BYTE_ORDER__ value" # else # ifdef CONFIG_BIG_ENDIAN # error "CONFIG_BIG_ENDIAN but __ORDER_LITTLE_ENDIAN__" # endif # ifdef CONFIG_LITTLE_ENDIAN # error "CONFIG_LITTLE_ENDIAN but __ORDER_BIG_ENDIAN__" # endif # endif #endif /* Endianness mismatch */ #endif /* all _ORDER_ macros defined */ #endif /* !_LINKER */ #endif /* ZEPHYR_INCLUDE_TOOLCHAIN_H_ */ |