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 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-alias-function-attribute 25 */ 26 #define __alias(symbol) __attribute__((__alias__(#symbol))) 27 28 /* 29 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-aligned-function-attribute 30 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-aligned-type-attribute 31 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-aligned-variable-attribute 32 */ 33 #define __aligned(x) __attribute__((__aligned__(x))) 34 #define __aligned_largest __attribute__((__aligned__)) 35 36 /* 37 * Note: do not use this directly. Instead, use __alloc_size() since it is conditionally 38 * available and includes other attributes. For GCC < 9.1, __alloc_size__ gets undefined 39 * in compiler-gcc.h, due to misbehaviors. 40 * 41 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-alloc_005fsize-function-attribute 42 * clang: https://clang.llvm.org/docs/AttributeReference.html#alloc-size 43 */ 44 #define __alloc_size__(x, ...) __attribute__((__alloc_size__(x, ## __VA_ARGS__))) 45 46 /* 47 * Note: users of __always_inline currently do not write "inline" themselves, 48 * which seems to be required by gcc to apply the attribute according 49 * to its docs (and also "warning: always_inline function might not be 50 * inlinable [-Wattributes]" is emitted). 51 * 52 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-always_005finline-function-attribute 53 * clang: mentioned 54 */ 55 #define __always_inline inline __attribute__((__always_inline__)) 56 57 /* 58 * The second argument is optional (default 0), so we use a variadic macro 59 * to make the shorthand. 60 * 61 * Beware: Do not apply this to functions which may return 62 * ERR_PTRs. Also, it is probably unwise to apply it to functions 63 * returning extra information in the low bits (but in that case the 64 * compiler should see some alignment anyway, when the return value is 65 * massaged by 'flags = ptr & 3; ptr &= ~3;'). 66 * 67 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-assume_005faligned-function-attribute 68 * clang: https://clang.llvm.org/docs/AttributeReference.html#assume-aligned 69 */ 70 #define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__))) 71 72 /* 73 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-cleanup-variable-attribute 74 * clang: https://clang.llvm.org/docs/AttributeReference.html#cleanup 75 */ 76 #define __cleanup(func) __attribute__((__cleanup__(func))) 77 78 /* 79 * Note the long name. 80 * 81 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-const-function-attribute 82 */ 83 #define __attribute_const__ __attribute__((__const__)) 84 85 /* 86 * Optional: only supported since gcc >= 9 87 * Optional: not supported by clang 88 * 89 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-copy-function-attribute 90 */ 91 #if __has_attribute(__copy__) 92 # define __copy(symbol) __attribute__((__copy__(symbol))) 93 #else 94 # define __copy(symbol) 95 #endif 96 97 /* 98 * Optional: only supported since gcc >= 14 99 * Optional: only supported since clang >= 18 100 * 101 * gcc: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896 102 * clang: https://reviews.llvm.org/D148381 103 */ 104 #if __has_attribute(__counted_by__) 105 # define __counted_by(member) __attribute__((__counted_by__(member))) 106 #else 107 # define __counted_by(member) 108 #endif 109 110 /* 111 * Optional: not supported by gcc 112 * Optional: only supported since clang >= 14.0 113 * 114 * clang: https://clang.llvm.org/docs/AttributeReference.html#diagnose_as_builtin 115 */ 116 #if __has_attribute(__diagnose_as_builtin__) 117 # define __diagnose_as(builtin...) __attribute__((__diagnose_as_builtin__(builtin))) 118 #else 119 # define __diagnose_as(builtin...) 120 #endif 121 122 /* 123 * Don't. Just don't. See commit 771c035372a0 ("deprecate the '__deprecated' 124 * attribute warnings entirely and for good") for more information. 125 * 126 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-deprecated-function-attribute 127 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-deprecated-type-attribute 128 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-deprecated-variable-attribute 129 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Enumerator-Attributes.html#index-deprecated-enumerator-attribute 130 * clang: https://clang.llvm.org/docs/AttributeReference.html#deprecated 131 */ 132 #define __deprecated 133 134 /* 135 * Optional: not supported by clang 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: only supported since clang >= 14.0 147 * 148 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-error-function-attribute 149 */ 150 #if __has_attribute(__error__) 151 # define __compiletime_error(msg) __attribute__((__error__(msg))) 152 #else 153 # define __compiletime_error(msg) 154 #endif 155 156 /* 157 * Optional: not supported by clang 158 * 159 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-externally_005fvisible-function-attribute 160 */ 161 #if __has_attribute(__externally_visible__) 162 # define __visible __attribute__((__externally_visible__)) 163 #else 164 # define __visible 165 #endif 166 167 /* 168 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-format-function-attribute 169 * clang: https://clang.llvm.org/docs/AttributeReference.html#format 170 */ 171 #define __printf(a, b) __attribute__((__format__(printf, a, b))) 172 #define __scanf(a, b) __attribute__((__format__(scanf, a, b))) 173 174 /* 175 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-gnu_005finline-function-attribute 176 * clang: https://clang.llvm.org/docs/AttributeReference.html#gnu-inline 177 */ 178 #define __gnu_inline __attribute__((__gnu_inline__)) 179 180 /* 181 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute 182 * clang: https://clang.llvm.org/docs/AttributeReference.html#malloc 183 */ 184 #define __malloc __attribute__((__malloc__)) 185 186 /* 187 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-mode-type-attribute 188 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-mode-variable-attribute 189 */ 190 #define __mode(x) __attribute__((__mode__(x))) 191 192 /* 193 * Optional: only supported since gcc >= 7 194 * 195 * gcc: https://gcc.gnu.org/onlinedocs/gcc/x86-Function-Attributes.html#index-no_005fcaller_005fsaved_005fregisters-function-attribute_002c-x86 196 * clang: https://clang.llvm.org/docs/AttributeReference.html#no-caller-saved-registers 197 */ 198 #if __has_attribute(__no_caller_saved_registers__) 199 # define __no_caller_saved_registers __attribute__((__no_caller_saved_registers__)) 200 #else 201 # define __no_caller_saved_registers 202 #endif 203 204 /* 205 * Optional: not supported by clang 206 * 207 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noclone-function-attribute 208 */ 209 #if __has_attribute(__noclone__) 210 # define __noclone __attribute__((__noclone__)) 211 #else 212 # define __noclone 213 #endif 214 215 /* 216 * Add the pseudo keyword 'fallthrough' so case statement blocks 217 * must end with any of these keywords: 218 * break; 219 * fallthrough; 220 * continue; 221 * goto <label>; 222 * return [expression]; 223 * 224 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html#Statement-Attributes 225 */ 226 #if __has_attribute(__fallthrough__) 227 # define fallthrough __attribute__((__fallthrough__)) 228 #else 229 # define fallthrough do {} while (0) /* fallthrough */ 230 #endif 231 232 /* 233 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes 234 * clang: https://clang.llvm.org/docs/AttributeReference.html#flatten 235 */ 236 # define __flatten __attribute__((flatten)) 237 238 /* 239 * Note the missing underscores. 240 * 241 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noinline-function-attribute 242 * clang: mentioned 243 */ 244 #define noinline __attribute__((__noinline__)) 245 246 /* 247 * Optional: only supported since gcc >= 8 248 * Optional: not supported by clang 249 * 250 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-nonstring-variable-attribute 251 */ 252 #if __has_attribute(__nonstring__) 253 # define __nonstring __attribute__((__nonstring__)) 254 #else 255 # define __nonstring 256 #endif 257 258 /* 259 * Optional: only supported since GCC >= 7.1, clang >= 13.0. 260 * 261 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-no_005fprofile_005finstrument_005ffunction-function-attribute 262 * clang: https://clang.llvm.org/docs/AttributeReference.html#no-profile-instrument-function 263 */ 264 #if __has_attribute(__no_profile_instrument_function__) 265 # define __no_profile __attribute__((__no_profile_instrument_function__)) 266 #else 267 # define __no_profile 268 #endif 269 270 /* 271 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noreturn-function-attribute 272 * clang: https://clang.llvm.org/docs/AttributeReference.html#noreturn 273 * clang: https://clang.llvm.org/docs/AttributeReference.html#id1 274 */ 275 #define __noreturn __attribute__((__noreturn__)) 276 277 /* 278 * Optional: only supported since GCC >= 11.1, clang >= 7.0. 279 * 280 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-no_005fstack_005fprotector-function-attribute 281 * clang: https://clang.llvm.org/docs/AttributeReference.html#no-stack-protector-safebuffers 282 */ 283 #if __has_attribute(__no_stack_protector__) 284 # define __no_stack_protector __attribute__((__no_stack_protector__)) 285 #else 286 # define __no_stack_protector 287 #endif 288 289 /* 290 * Optional: not supported by gcc. 291 * 292 * clang: https://clang.llvm.org/docs/AttributeReference.html#overloadable 293 */ 294 #if __has_attribute(__overloadable__) 295 # define __overloadable __attribute__((__overloadable__)) 296 #else 297 # define __overloadable 298 #endif 299 300 /* 301 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-packed-type-attribute 302 * clang: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-packed-variable-attribute 303 */ 304 #define __packed __attribute__((__packed__)) 305 306 /* 307 * Note: the "type" argument should match any __builtin_object_size(p, type) usage. 308 * 309 * Optional: not supported by gcc. 310 * 311 * clang: https://clang.llvm.org/docs/AttributeReference.html#pass-object-size-pass-dynamic-object-size 312 */ 313 #if __has_attribute(__pass_dynamic_object_size__) 314 # define __pass_dynamic_object_size(type) __attribute__((__pass_dynamic_object_size__(type))) 315 #else 316 # define __pass_dynamic_object_size(type) 317 #endif 318 #if __has_attribute(__pass_object_size__) 319 # define __pass_object_size(type) __attribute__((__pass_object_size__(type))) 320 #else 321 # define __pass_object_size(type) 322 #endif 323 324 /* 325 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-pure-function-attribute 326 */ 327 #define __pure __attribute__((__pure__)) 328 329 /* 330 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-section-function-attribute 331 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-section-variable-attribute 332 * clang: https://clang.llvm.org/docs/AttributeReference.html#section-declspec-allocate 333 */ 334 #define __section(section) __attribute__((__section__(section))) 335 336 /* 337 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-unused-function-attribute 338 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-unused-type-attribute 339 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-unused-variable-attribute 340 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html#index-unused-label-attribute 341 * clang: https://clang.llvm.org/docs/AttributeReference.html#maybe-unused-unused 342 */ 343 #define __always_unused __attribute__((__unused__)) 344 #define __maybe_unused __attribute__((__unused__)) 345 346 /* 347 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-used-function-attribute 348 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-used-variable-attribute 349 */ 350 #define __used __attribute__((__used__)) 351 352 /* 353 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-warn_005funused_005fresult-function-attribute 354 * clang: https://clang.llvm.org/docs/AttributeReference.html#nodiscard-warn-unused-result 355 */ 356 #define __must_check __attribute__((__warn_unused_result__)) 357 358 /* 359 * Optional: only supported since clang >= 14.0 360 * 361 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-warning-function-attribute 362 */ 363 #if __has_attribute(__warning__) 364 # define __compiletime_warning(msg) __attribute__((__warning__(msg))) 365 #else 366 # define __compiletime_warning(msg) 367 #endif 368 369 /* 370 * Optional: only supported since clang >= 14.0 371 * 372 * clang: https://clang.llvm.org/docs/AttributeReference.html#disable-sanitizer-instrumentation 373 * 374 * disable_sanitizer_instrumentation is not always similar to 375 * no_sanitize((<sanitizer-name>)): the latter may still let specific sanitizers 376 * insert code into functions to prevent false positives. Unlike that, 377 * disable_sanitizer_instrumentation prevents all kinds of instrumentation to 378 * functions with the attribute. 379 */ 380 #if __has_attribute(disable_sanitizer_instrumentation) 381 # define __disable_sanitizer_instrumentation \ 382 __attribute__((disable_sanitizer_instrumentation)) 383 #else 384 # define __disable_sanitizer_instrumentation 385 #endif 386 387 /* 388 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-weak-function-attribute 389 * gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-weak-variable-attribute 390 */ 391 #define __weak __attribute__((__weak__)) 392 393 /* 394 * Used by functions that use '__builtin_return_address'. These function 395 * don't want to be splited or made inline, which can make 396 * the '__builtin_return_address' get unexpected address. 397 */ 398 #define __fix_address noinline __noclone 399 400 #endif /* __LINUX_COMPILER_ATTRIBUTES_H */ 401