1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __LINUX_COMPILER_ATTRIBUTES_H 3 #define __LINUX_COMPILER_ATTRIBUTES_H 4 5 /* 6 * The attributes in this file are unconditionally defined and they directly 7 * map to compiler attribute(s), unless one of the compilers does not support 8 * the attribute. In that case, __has_attribute is used to check for support 9 * and the reason is stated in its comment ("Optional: ..."). 10 * 11 * Any other "attributes" (i.e. those that depend on a configuration option, 12 * on a compiler, on an architecture, on plugins, on other attributes...) 13 * should be defined elsewhere (e.g. compiler_types.h or compiler-*.h). 14 * The intention is to keep this file as simple as possible, as well as 15 * compiler- and version-agnostic (e.g. avoiding GCC_VERSION checks). 16 * 17 * This file is meant to be sorted (by actual attribute name, 18 * not by #define identifier). Use the __attribute__((__name__)) syntax 19 * (i.e. with underscores) to avoid future collisions with other macros. 20 * Provide links to the documentation of each supported compiler, if it exists. 21 */ 22 23 /* 24 * __has_attribute is supported on gcc >= 5, clang >= 2.9 and icc >= 17. 25 * In the meantime, to support 4.6 <= gcc < 5, we implement __has_attribute 26 * by hand. 27 * 28 * sparse does not support __has_attribute (yet) and defines __GNUC_MINOR__ 29 * depending on the compiler used to build it; however, these attributes have 30 * no semantic effects for sparse, so it does not matter. Also note that, 31 * in order to avoid sparse's warnings, even the unsupported ones must be 32 * defined to 0. 33 */ 34 #ifndef __has_attribute 35 # define __has_attribute(x) __GCC4_has_attribute_##x 36 # define __GCC4_has_attribute___assume_aligned__ (__GNUC_MINOR__ >= 9) 37 # define __GCC4_has_attribute___copy__ 0 38 # define __GCC4_has_attribute___designated_init__ 0 39 # define __GCC4_has_attribute___externally_visible__ 1 40 # define __GCC4_has_attribute___no_caller_saved_registers__ 0 41 # define __GCC4_has_attribute___noclone__ 1 42 # define __GCC4_has_attribute___nonstring__ 0 43 # define __GCC4_has_attribute___no_sanitize_address__ (__GNUC_MINOR__ >= 8) 44 # define __GCC4_has_attribute___no_sanitize_undefined__ (__GNUC_MINOR__ >= 9) 45 # define __GCC4_has_attribute___fallthrough__ 0 46 #endif 47 48 /* 49 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-alias-function-attribute 50 */ 51 #define __alias(symbol) __attribute__((__alias__(#symbol))) 52 53 /* 54 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-aligned-function-attribute 55 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-aligned-type-attribute 56 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-aligned-variable-attribute 57 */ 58 #define __aligned(x) __attribute__((__aligned__(x))) 59 #define __aligned_largest __attribute__((__aligned__)) 60 61 /* 62 * Note: users of __always_inline currently do not write "inline" themselves, 63 * which seems to be required by gcc to apply the attribute according 64 * to its docs (and also "warning: always_inline function might not be 65 * inlinable [-Wattributes]" is emitted). 66 * 67 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-always_005finline-function-attribute 68 * clang: mentioned 69 */ 70 #define __always_inline inline __attribute__((__always_inline__)) 71 72 /* 73 * The second argument is optional (default 0), so we use a variadic macro 74 * to make the shorthand. 75 * 76 * Beware: Do not apply this to functions which may return 77 * ERR_PTRs. Also, it is probably unwise to apply it to functions 78 * returning extra information in the low bits (but in that case the 79 * compiler should see some alignment anyway, when the return value is 80 * massaged by 'flags = ptr & 3; ptr &= ~3;'). 81 * 82 * Optional: only supported since gcc >= 4.9 83 * Optional: not supported by icc 84 * 85 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-assume_005faligned-function-attribute 86 * clang: https://clang.llvm.org/docs/AttributeReference.html#assume-aligned 87 */ 88 #if __has_attribute(__assume_aligned__) 89 # define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__))) 90 #else 91 # define __assume_aligned(a, ...) 92 #endif 93 94 /* 95 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-cold-function-attribute 96 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html#index-cold-label-attribute 97 */ 98 #define __cold __attribute__((__cold__)) 99 100 /* 101 * Note the long name. 102 * 103 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-const-function-attribute 104 */ 105 #define __attribute_const__ __attribute__((__const__)) 106 107 /* 108 * Optional: only supported since gcc >= 9 109 * Optional: not supported by clang 110 * Optional: not supported by icc 111 * 112 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-copy-function-attribute 113 */ 114 #if __has_attribute(__copy__) 115 # define __copy(symbol) __attribute__((__copy__(symbol))) 116 #else 117 # define __copy(symbol) 118 #endif 119 120 /* 121 * Don't. Just don't. See commit 771c035372a0 ("deprecate the '__deprecated' 122 * attribute warnings entirely and for good") for more information. 123 * 124 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-deprecated-function-attribute 125 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-deprecated-type-attribute 126 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-deprecated-variable-attribute 127 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Enumerator-Attributes.html#index-deprecated-enumerator-attribute 128 * clang: https://clang.llvm.org/docs/AttributeReference.html#deprecated 129 */ 130 #define __deprecated 131 132 /* 133 * Optional: only supported since gcc >= 5.1 134 * Optional: not supported by clang 135 * Optional: not supported by icc 136 * 137 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-designated_005finit-type-attribute 138 */ 139 #if __has_attribute(__designated_init__) 140 # define __designated_init __attribute__((__designated_init__)) 141 #else 142 # define __designated_init 143 #endif 144 145 /* 146 * Optional: not supported by clang 147 * 148 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-externally_005fvisible-function-attribute 149 */ 150 #if __has_attribute(__externally_visible__) 151 # define __visible __attribute__((__externally_visible__)) 152 #else 153 # define __visible 154 #endif 155 156 /* 157 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-format-function-attribute 158 * clang: https://clang.llvm.org/docs/AttributeReference.html#format 159 */ 160 #define __printf(a, b) __attribute__((__format__(printf, a, b))) 161 #define __scanf(a, b) __attribute__((__format__(scanf, a, b))) 162 163 /* 164 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-gnu_005finline-function-attribute 165 * clang: https://clang.llvm.org/docs/AttributeReference.html#gnu-inline 166 */ 167 #define __gnu_inline __attribute__((__gnu_inline__)) 168 169 /* 170 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute 171 */ 172 #define __malloc __attribute__((__malloc__)) 173 174 /* 175 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-mode-type-attribute 176 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-mode-variable-attribute 177 */ 178 #define __mode(x) __attribute__((__mode__(x))) 179 180 /* 181 * Optional: only supported since gcc >= 7 182 * 183 * gcc: https://gcc.gnu.org/onlinedocs/gcc/x86-Function-Attributes.html#index-no_005fcaller_005fsaved_005fregisters-function-attribute_002c-x86 184 * clang: https://clang.llvm.org/docs/AttributeReference.html#no-caller-saved-registers 185 */ 186 #if __has_attribute(__no_caller_saved_registers__) 187 # define __no_caller_saved_registers __attribute__((__no_caller_saved_registers__)) 188 #else 189 # define __no_caller_saved_registers 190 #endif 191 192 /* 193 * Optional: not supported by clang 194 * 195 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noclone-function-attribute 196 */ 197 #if __has_attribute(__noclone__) 198 # define __noclone __attribute__((__noclone__)) 199 #else 200 # define __noclone 201 #endif 202 203 /* 204 * Add the pseudo keyword 'fallthrough' so case statement blocks 205 * must end with any of these keywords: 206 * break; 207 * fallthrough; 208 * goto <label>; 209 * return [expression]; 210 * 211 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html#Statement-Attributes 212 */ 213 #if __has_attribute(__fallthrough__) 214 # define fallthrough __attribute__((__fallthrough__)) 215 #else 216 # define fallthrough do {} while (0) /* fallthrough */ 217 #endif 218 219 /* 220 * Note the missing underscores. 221 * 222 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noinline-function-attribute 223 * clang: mentioned 224 */ 225 #define noinline __attribute__((__noinline__)) 226 227 /* 228 * Optional: only supported since gcc >= 8 229 * Optional: not supported by clang 230 * Optional: not supported by icc 231 * 232 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-nonstring-variable-attribute 233 */ 234 #if __has_attribute(__nonstring__) 235 # define __nonstring __attribute__((__nonstring__)) 236 #else 237 # define __nonstring 238 #endif 239 240 /* 241 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noreturn-function-attribute 242 * clang: https://clang.llvm.org/docs/AttributeReference.html#noreturn 243 * clang: https://clang.llvm.org/docs/AttributeReference.html#id1 244 */ 245 #define __noreturn __attribute__((__noreturn__)) 246 247 /* 248 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-packed-type-attribute 249 * clang: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-packed-variable-attribute 250 */ 251 #define __packed __attribute__((__packed__)) 252 253 /* 254 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-pure-function-attribute 255 */ 256 #define __pure __attribute__((__pure__)) 257 258 /* 259 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-section-function-attribute 260 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-section-variable-attribute 261 * clang: https://clang.llvm.org/docs/AttributeReference.html#section-declspec-allocate 262 */ 263 #define __section(S) __attribute__((__section__(#S))) 264 265 /* 266 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-unused-function-attribute 267 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-unused-type-attribute 268 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-unused-variable-attribute 269 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html#index-unused-label-attribute 270 * clang: https://clang.llvm.org/docs/AttributeReference.html#maybe-unused-unused 271 */ 272 #define __always_unused __attribute__((__unused__)) 273 #define __maybe_unused __attribute__((__unused__)) 274 275 /* 276 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-used-function-attribute 277 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-used-variable-attribute 278 */ 279 #define __used __attribute__((__used__)) 280 281 /* 282 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-weak-function-attribute 283 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-weak-variable-attribute 284 */ 285 #define __weak __attribute__((__weak__)) 286 287 #endif /* __LINUX_COMPILER_ATTRIBUTES_H */ 288