at v5.9-rc2 287 lines 12 kB view raw
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 */