linux/include/linux/compiler_attributes.h
<<
>>
Prefs
   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___noclone__             1
  41# define __GCC4_has_attribute___nonstring__           0
  42# define __GCC4_has_attribute___no_sanitize_address__ (__GNUC_MINOR__ >= 8)
  43# define __GCC4_has_attribute___fallthrough__         0
  44#endif
  45
  46/*
  47 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-alias-function-attribute
  48 */
  49#define __alias(symbol)                 __attribute__((__alias__(#symbol)))
  50
  51/*
  52 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-aligned-function-attribute
  53 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-aligned-type-attribute
  54 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-aligned-variable-attribute
  55 */
  56#define __aligned(x)                    __attribute__((__aligned__(x)))
  57#define __aligned_largest               __attribute__((__aligned__))
  58
  59/*
  60 * Note: users of __always_inline currently do not write "inline" themselves,
  61 * which seems to be required by gcc to apply the attribute according
  62 * to its docs (and also "warning: always_inline function might not be
  63 * inlinable [-Wattributes]" is emitted).
  64 *
  65 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-always_005finline-function-attribute
  66 * clang: mentioned
  67 */
  68#define __always_inline                 inline __attribute__((__always_inline__))
  69
  70/*
  71 * The second argument is optional (default 0), so we use a variadic macro
  72 * to make the shorthand.
  73 *
  74 * Beware: Do not apply this to functions which may return
  75 * ERR_PTRs. Also, it is probably unwise to apply it to functions
  76 * returning extra information in the low bits (but in that case the
  77 * compiler should see some alignment anyway, when the return value is
  78 * massaged by 'flags = ptr & 3; ptr &= ~3;').
  79 *
  80 * Optional: only supported since gcc >= 4.9
  81 * Optional: not supported by icc
  82 *
  83 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-assume_005faligned-function-attribute
  84 * clang: https://clang.llvm.org/docs/AttributeReference.html#assume-aligned
  85 */
  86#if __has_attribute(__assume_aligned__)
  87# define __assume_aligned(a, ...)       __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
  88#else
  89# define __assume_aligned(a, ...)
  90#endif
  91
  92/*
  93 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-cold-function-attribute
  94 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html#index-cold-label-attribute
  95 */
  96#define __cold                          __attribute__((__cold__))
  97
  98/*
  99 * Note the long name.
 100 *
 101 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-const-function-attribute
 102 */
 103#define __attribute_const__             __attribute__((__const__))
 104
 105/*
 106 * Optional: only supported since gcc >= 9
 107 * Optional: not supported by clang
 108 * Optional: not supported by icc
 109 *
 110 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-copy-function-attribute
 111 */
 112#if __has_attribute(__copy__)
 113# define __copy(symbol)                 __attribute__((__copy__(symbol)))
 114#else
 115# define __copy(symbol)
 116#endif
 117
 118/*
 119 * Don't. Just don't. See commit 771c035372a0 ("deprecate the '__deprecated'
 120 * attribute warnings entirely and for good") for more information.
 121 *
 122 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-deprecated-function-attribute
 123 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-deprecated-type-attribute
 124 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-deprecated-variable-attribute
 125 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Enumerator-Attributes.html#index-deprecated-enumerator-attribute
 126 * clang: https://clang.llvm.org/docs/AttributeReference.html#deprecated
 127 */
 128#define __deprecated
 129
 130/*
 131 * Optional: only supported since gcc >= 5.1
 132 * Optional: not supported by clang
 133 * Optional: not supported by icc
 134 *
 135 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-designated_005finit-type-attribute
 136 */
 137#if __has_attribute(__designated_init__)
 138# define __designated_init              __attribute__((__designated_init__))
 139#else
 140# define __designated_init
 141#endif
 142
 143/*
 144 * Optional: not supported by clang
 145 *
 146 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-externally_005fvisible-function-attribute
 147 */
 148#if __has_attribute(__externally_visible__)
 149# define __visible                      __attribute__((__externally_visible__))
 150#else
 151# define __visible
 152#endif
 153
 154/*
 155 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-format-function-attribute
 156 * clang: https://clang.llvm.org/docs/AttributeReference.html#format
 157 */
 158#define __printf(a, b)                  __attribute__((__format__(printf, a, b)))
 159#define __scanf(a, b)                   __attribute__((__format__(scanf, a, b)))
 160
 161/*
 162 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-gnu_005finline-function-attribute
 163 * clang: https://clang.llvm.org/docs/AttributeReference.html#gnu-inline
 164 */
 165#define __gnu_inline                    __attribute__((__gnu_inline__))
 166
 167/*
 168 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-malloc-function-attribute
 169 */
 170#define __malloc                        __attribute__((__malloc__))
 171
 172/*
 173 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-mode-type-attribute
 174 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-mode-variable-attribute
 175 */
 176#define __mode(x)                       __attribute__((__mode__(x)))
 177
 178/*
 179 * Optional: not supported by clang
 180 *
 181 *  gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noclone-function-attribute
 182 */
 183#if __has_attribute(__noclone__)
 184# define __noclone                      __attribute__((__noclone__))
 185#else
 186# define __noclone
 187#endif
 188
 189/*
 190 * Add the pseudo keyword 'fallthrough' so case statement blocks
 191 * must end with any of these keywords:
 192 *   break;
 193 *   fallthrough;
 194 *   goto <label>;
 195 *   return [expression];
 196 *
 197 *  gcc: https://gcc.gnu.org/onlinedocs/gcc/Statement-Attributes.html#Statement-Attributes
 198 */
 199#if __has_attribute(__fallthrough__)
 200# define fallthrough                    __attribute__((__fallthrough__))
 201#else
 202# define fallthrough                    do {} while (0)  /* fallthrough */
 203#endif
 204
 205/*
 206 * Note the missing underscores.
 207 *
 208 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noinline-function-attribute
 209 * clang: mentioned
 210 */
 211#define   noinline                      __attribute__((__noinline__))
 212
 213/*
 214 * Optional: only supported since gcc >= 8
 215 * Optional: not supported by clang
 216 * Optional: not supported by icc
 217 *
 218 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-nonstring-variable-attribute
 219 */
 220#if __has_attribute(__nonstring__)
 221# define __nonstring                    __attribute__((__nonstring__))
 222#else
 223# define __nonstring
 224#endif
 225
 226/*
 227 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noreturn-function-attribute
 228 * clang: https://clang.llvm.org/docs/AttributeReference.html#noreturn
 229 * clang: https://clang.llvm.org/docs/AttributeReference.html#id1
 230 */
 231#define __noreturn                      __attribute__((__noreturn__))
 232
 233/*
 234 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-packed-type-attribute
 235 * clang: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-packed-variable-attribute
 236 */
 237#define __packed                        __attribute__((__packed__))
 238
 239/*
 240 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-pure-function-attribute
 241 */
 242#define __pure                          __attribute__((__pure__))
 243
 244/*
 245 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-section-function-attribute
 246 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-section-variable-attribute
 247 * clang: https://clang.llvm.org/docs/AttributeReference.html#section-declspec-allocate
 248 */
 249#define __section(S)                    __attribute__((__section__(#S)))
 250
 251/*
 252 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-unused-function-attribute
 253 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-unused-type-attribute
 254 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-unused-variable-attribute
 255 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Label-Attributes.html#index-unused-label-attribute
 256 * clang: https://clang.llvm.org/docs/AttributeReference.html#maybe-unused-unused
 257 */
 258#define __always_unused                 __attribute__((__unused__))
 259#define __maybe_unused                  __attribute__((__unused__))
 260
 261/*
 262 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-used-function-attribute
 263 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-used-variable-attribute
 264 */
 265#define __used                          __attribute__((__used__))
 266
 267/*
 268 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-weak-function-attribute
 269 *   gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-weak-variable-attribute
 270 */
 271#define __weak                          __attribute__((__weak__))
 272
 273#endif /* __LINUX_COMPILER_ATTRIBUTES_H */
 274