~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/linux/compiler-gcc.h

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /include/linux/compiler-gcc.h (Version linux-6.12-rc7) and /include/linux/compiler-gcc.h (Version linux-4.11.12)


  1 /* SPDX-License-Identifier: GPL-2.0 */         !!   1 #ifndef __LINUX_COMPILER_H
  2 #ifndef __LINUX_COMPILER_TYPES_H               << 
  3 #error "Please don't include <linux/compiler-g      2 #error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
  4 #endif                                              3 #endif
  5                                                     4 
  6 /*                                                  5 /*
  7  * Common definitions for all gcc versions go       6  * Common definitions for all gcc versions go here.
  8  */                                                 7  */
  9 #define GCC_VERSION (__GNUC__ * 10000               8 #define GCC_VERSION (__GNUC__ * 10000           \
 10                      + __GNUC_MINOR__ * 100         9                      + __GNUC_MINOR__ * 100     \
 11                      + __GNUC_PATCHLEVEL__)        10                      + __GNUC_PATCHLEVEL__)
 12                                                    11 
                                                   >>  12 /* Optimization barrier */
                                                   >>  13 
                                                   >>  14 /* The "volatile" is due to gcc bugs */
                                                   >>  15 #define barrier() __asm__ __volatile__("": : :"memory")
                                                   >>  16 /*
                                                   >>  17  * This version is i.e. to prevent dead stores elimination on @ptr
                                                   >>  18  * where gcc and llvm may behave differently when otherwise using
                                                   >>  19  * normal barrier(): while gcc behavior gets along with a normal
                                                   >>  20  * barrier(), llvm needs an explicit input variable to be assumed
                                                   >>  21  * clobbered. The issue is as follows: while the inline asm might
                                                   >>  22  * access any memory it wants, the compiler could have fit all of
                                                   >>  23  * @ptr into memory registers instead, and since @ptr never escaped
                                                   >>  24  * from that, it proved that the inline asm wasn't touching any of
                                                   >>  25  * it. This version works well with both compilers, i.e. we're telling
                                                   >>  26  * the compiler that the inline asm absolutely may see the contents
                                                   >>  27  * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
                                                   >>  28  */
                                                   >>  29 #define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
                                                   >>  30 
 13 /*                                                 31 /*
 14  * This macro obfuscates arithmetic on a varia     32  * This macro obfuscates arithmetic on a variable address so that gcc
 15  * shouldn't recognize the original var, and m     33  * shouldn't recognize the original var, and make assumptions about it.
 16  *                                                 34  *
 17  * This is needed because the C standard makes     35  * This is needed because the C standard makes it undefined to do
 18  * pointer arithmetic on "objects" outside the     36  * pointer arithmetic on "objects" outside their boundaries and the
 19  * gcc optimizers assume this is the case. In      37  * gcc optimizers assume this is the case. In particular they
 20  * assume such arithmetic does not wrap.           38  * assume such arithmetic does not wrap.
 21  *                                                 39  *
 22  * A miscompilation has been observed because      40  * A miscompilation has been observed because of this on PPC.
 23  * To work around it we hide the relationship      41  * To work around it we hide the relationship of the pointer and the object
 24  * using this macro.                               42  * using this macro.
 25  *                                                 43  *
 26  * Versions of the ppc64 compiler before 4.1 h     44  * Versions of the ppc64 compiler before 4.1 had a bug where use of
 27  * RELOC_HIDE could trash r30. The bug can be      45  * RELOC_HIDE could trash r30. The bug can be worked around by changing
 28  * the inline assembly constraint from =g to =     46  * the inline assembly constraint from =g to =r, in this particular
 29  * case either is valid.                           47  * case either is valid.
 30  */                                                48  */
 31 #define RELOC_HIDE(ptr, off)                       49 #define RELOC_HIDE(ptr, off)                                            \
 32 ({                                                 50 ({                                                                      \
 33         unsigned long __ptr;                       51         unsigned long __ptr;                                            \
 34         __asm__ ("" : "=r"(__ptr) : ""(ptr));      52         __asm__ ("" : "=r"(__ptr) : ""(ptr));                          \
 35         (typeof(ptr)) (__ptr + (off));             53         (typeof(ptr)) (__ptr + (off));                                  \
 36 })                                                 54 })
 37                                                    55 
 38 #ifdef CONFIG_MITIGATION_RETPOLINE             !!  56 /* Make the optimizer believe the variable can be manipulated arbitrarily. */
 39 #define __noretpoline __attribute__((__indirec !!  57 #define OPTIMIZER_HIDE_VAR(var)                                         \
                                                   >>  58         __asm__ ("" : "=r" (var) : "" (var))
                                                   >>  59 
                                                   >>  60 #ifdef __CHECKER__
                                                   >>  61 #define __must_be_array(a)      0
                                                   >>  62 #else
                                                   >>  63 /* &a[0] degrades to a pointer: a different type from an array */
                                                   >>  64 #define __must_be_array(a)      BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
 40 #endif                                             65 #endif
 41                                                    66 
 42 #if defined(LATENT_ENTROPY_PLUGIN) && !defined !!  67 /*
 43 #define __latent_entropy __attribute__((latent !!  68  * Force always-inline if the user requests it so via the .config,
                                                   >>  69  * or if gcc is too old:
                                                   >>  70  */
                                                   >>  71 #if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) ||                \
                                                   >>  72     !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
                                                   >>  73 #define inline          inline          __attribute__((always_inline)) notrace
                                                   >>  74 #define __inline__      __inline__      __attribute__((always_inline)) notrace
                                                   >>  75 #define __inline        __inline        __attribute__((always_inline)) notrace
                                                   >>  76 #else
                                                   >>  77 /* A lot of inline functions can cause havoc with function tracing */
                                                   >>  78 #define inline          inline          notrace
                                                   >>  79 #define __inline__      __inline__      notrace
                                                   >>  80 #define __inline        __inline        notrace
 44 #endif                                             81 #endif
 45                                                    82 
                                                   >>  83 #define __always_inline inline __attribute__((always_inline))
                                                   >>  84 #define  noinline       __attribute__((noinline))
                                                   >>  85 
                                                   >>  86 #define __deprecated    __attribute__((deprecated))
                                                   >>  87 #define __packed        __attribute__((packed))
                                                   >>  88 #define __weak          __attribute__((weak))
                                                   >>  89 #define __alias(symbol) __attribute__((alias(#symbol)))
                                                   >>  90 
 46 /*                                                 91 /*
 47  * calling noreturn functions, __builtin_unrea !!  92  * it doesn't make sense on ARM (currently the only user of __naked)
 48  * confuse the stack allocation in gcc, leadin !!  93  * to trace naked functions because then mcount is called without
 49  * frames, see https://gcc.gnu.org/bugzilla/sh !!  94  * stack and frame pointer being set up and there is no chance to
                                                   >>  95  * restore the lr register to the value before mcount was called.
                                                   >>  96  *
                                                   >>  97  * The asm() bodies of naked functions often depend on standard calling
                                                   >>  98  * conventions, therefore they must be noinline and noclone.
 50  *                                                 99  *
 51  * Adding an empty inline assembly before it w !! 100  * GCC 4.[56] currently fail to enforce this, so we must do so ourselves.
                                                   >> 101  * See GCC PR44290.
 52  */                                               102  */
 53 #define barrier_before_unreachable() asm volat !! 103 #define __naked         __attribute__((naked)) noinline __noclone notrace
                                                   >> 104 
                                                   >> 105 #define __noreturn      __attribute__((noreturn))
 54                                                   106 
 55 /*                                                107 /*
 56  * Mark a position in code as unreachable.  Th !! 108  * From the GCC manual:
 57  * suppress control flow warnings after asm bl !! 109  *
 58  * control elsewhere.                          !! 110  * Many functions have no effects except the return value and their
                                                   >> 111  * return value depends only on the parameters and/or global
                                                   >> 112  * variables.  Such a function can be subject to common subexpression
                                                   >> 113  * elimination and loop optimization just as an arithmetic operator
                                                   >> 114  * would be.
                                                   >> 115  * [...]
 59  */                                               116  */
 60 #define unreachable() \                        !! 117 #define __pure                  __attribute__((pure))
 61         do {                                   !! 118 #define __aligned(x)            __attribute__((aligned(x)))
 62                 annotate_unreachable();        !! 119 #define __aligned_largest       __attribute__((aligned))
 63                 barrier_before_unreachable();  !! 120 #define __printf(a, b)          __attribute__((format(printf, a, b)))
 64                 __builtin_unreachable();       !! 121 #define __scanf(a, b)           __attribute__((format(scanf, a, b)))
 65         } while (0)                            !! 122 #define __attribute_const__     __attribute__((__const__))
                                                   >> 123 #define __maybe_unused          __attribute__((unused))
                                                   >> 124 #define __always_unused         __attribute__((unused))
                                                   >> 125 #define __mode(x)               __attribute__((mode(x)))
 66                                                   126 
 67 #if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP)     !! 127 /* gcc version specific checks */
 68 #define __HAVE_BUILTIN_BSWAP32__               << 
 69 #define __HAVE_BUILTIN_BSWAP64__               << 
 70 #define __HAVE_BUILTIN_BSWAP16__               << 
 71 #endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */     << 
 72                                                   128 
 73 #if GCC_VERSION >= 70000                       !! 129 #if GCC_VERSION < 30200
 74 #define KASAN_ABI_VERSION 5                    !! 130 # error Sorry, your compiler is too old - please upgrade it.
                                                   >> 131 #endif
                                                   >> 132 
                                                   >> 133 #if GCC_VERSION < 30300
                                                   >> 134 # define __used                 __attribute__((__unused__))
 75 #else                                             135 #else
 76 #define KASAN_ABI_VERSION 4                    !! 136 # define __used                 __attribute__((__used__))
 77 #endif                                            137 #endif
 78                                                   138 
 79 #ifdef CONFIG_SHADOW_CALL_STACK                !! 139 #ifdef CONFIG_GCOV_KERNEL
 80 #define __noscs __attribute__((__no_sanitize__ !! 140 # if GCC_VERSION < 30400
                                                   >> 141 #   error "GCOV profiling support for gcc versions below 3.4 not included"
                                                   >> 142 # endif /* __GNUC_MINOR__ */
                                                   >> 143 #endif /* CONFIG_GCOV_KERNEL */
                                                   >> 144 
                                                   >> 145 #if GCC_VERSION >= 30400
                                                   >> 146 #define __must_check            __attribute__((warn_unused_result))
                                                   >> 147 #define __malloc                __attribute__((__malloc__))
 81 #endif                                            148 #endif
 82                                                   149 
 83 #ifdef __SANITIZE_HWADDRESS__                  !! 150 #if GCC_VERSION >= 40000
 84 #define __no_sanitize_address __attribute__((_ !! 151 
 85 #else                                          !! 152 /* GCC 4.1.[01] miscompiles __weak */
 86 #define __no_sanitize_address __attribute__((_ !! 153 #ifdef __KERNEL__
                                                   >> 154 # if GCC_VERSION >= 40100 &&  GCC_VERSION <= 40101
                                                   >> 155 #  error Your version of gcc miscompiles the __weak directive
                                                   >> 156 # endif
 87 #endif                                            157 #endif
 88                                                   158 
 89 #if defined(__SANITIZE_THREAD__)               !! 159 #define __used                  __attribute__((__used__))
 90 #define __no_sanitize_thread __attribute__((__ !! 160 #define __compiler_offsetof(a, b)                                       \
                                                   >> 161         __builtin_offsetof(a, b)
                                                   >> 162 
                                                   >> 163 #if GCC_VERSION >= 40100
                                                   >> 164 # define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
                                                   >> 165 #endif
                                                   >> 166 
                                                   >> 167 #if GCC_VERSION >= 40300
                                                   >> 168 /* Mark functions as cold. gcc will assume any path leading to a call
                                                   >> 169  * to them will be unlikely.  This means a lot of manual unlikely()s
                                                   >> 170  * are unnecessary now for any paths leading to the usual suspects
                                                   >> 171  * like BUG(), printk(), panic() etc. [but let's keep them for now for
                                                   >> 172  * older compilers]
                                                   >> 173  *
                                                   >> 174  * Early snapshots of gcc 4.3 don't support this and we can't detect this
                                                   >> 175  * in the preprocessor, but we can live with this because they're unreleased.
                                                   >> 176  * Maketime probing would be overkill here.
                                                   >> 177  *
                                                   >> 178  * gcc also has a __attribute__((__hot__)) to move hot functions into
                                                   >> 179  * a special section, but I don't see any sense in this right now in
                                                   >> 180  * the kernel context
                                                   >> 181  */
                                                   >> 182 #define __cold                  __attribute__((__cold__))
                                                   >> 183 
                                                   >> 184 #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
                                                   >> 185 
                                                   >> 186 #ifndef __CHECKER__
                                                   >> 187 # define __compiletime_warning(message) __attribute__((warning(message)))
                                                   >> 188 # define __compiletime_error(message) __attribute__((error(message)))
                                                   >> 189 #endif /* __CHECKER__ */
                                                   >> 190 #endif /* GCC_VERSION >= 40300 */
                                                   >> 191 
                                                   >> 192 #if GCC_VERSION >= 40500
                                                   >> 193 
                                                   >> 194 #ifndef __CHECKER__
                                                   >> 195 #ifdef LATENT_ENTROPY_PLUGIN
                                                   >> 196 #define __latent_entropy __attribute__((latent_entropy))
                                                   >> 197 #endif
                                                   >> 198 #endif
                                                   >> 199 
                                                   >> 200 #ifdef CONFIG_STACK_VALIDATION
                                                   >> 201 #define annotate_unreachable() ({                                       \
                                                   >> 202         asm("%c0:\t\n"                                                  \
                                                   >> 203             ".pushsection .discard.unreachable\t\n"                     \
                                                   >> 204             ".long %c0b - .\t\n"                                        \
                                                   >> 205             ".popsection\t\n" : : "i" (__LINE__));                      \
                                                   >> 206 })
 91 #else                                             207 #else
 92 #define __no_sanitize_thread                   !! 208 #define annotate_unreachable()
 93 #endif                                            209 #endif
 94                                                   210 
 95 #define __no_sanitize_undefined __attribute__( !! 211 /*
                                                   >> 212  * Mark a position in code as unreachable.  This can be used to
                                                   >> 213  * suppress control flow warnings after asm blocks that transfer
                                                   >> 214  * control elsewhere.
                                                   >> 215  *
                                                   >> 216  * Early snapshots of gcc 4.5 don't support this and we can't detect
                                                   >> 217  * this in the preprocessor, but we can live with this because they're
                                                   >> 218  * unreleased.  Really, we need to have autoconf for the kernel.
                                                   >> 219  */
                                                   >> 220 #define unreachable() \
                                                   >> 221         do { annotate_unreachable(); __builtin_unreachable(); } while (0)
                                                   >> 222 
                                                   >> 223 /* Mark a function definition as prohibited from being cloned. */
                                                   >> 224 #define __noclone       __attribute__((__noclone__, __optimize__("no-tracer")))
                                                   >> 225 
                                                   >> 226 #endif /* GCC_VERSION >= 40500 */
 96                                                   227 
                                                   >> 228 #if GCC_VERSION >= 40600
 97 /*                                                229 /*
 98  * Only supported since gcc >= 12              !! 230  * When used with Link Time Optimization, gcc can optimize away C functions or
                                                   >> 231  * variables which are referenced only from assembly code.  __visible tells the
                                                   >> 232  * optimizer that something else uses this function or variable, thus preventing
                                                   >> 233  * this.
 99  */                                               234  */
100 #if defined(CONFIG_KCOV) && __has_attribute(__ !! 235 #define __visible       __attribute__((externally_visible))
101 #define __no_sanitize_coverage __attribute__(( << 
102 #else                                          << 
103 #define __no_sanitize_coverage                 << 
104 #endif                                            236 #endif
105                                                   237 
                                                   >> 238 
                                                   >> 239 #if GCC_VERSION >= 40900 && !defined(__CHECKER__)
106 /*                                                240 /*
107  * Treat __SANITIZE_HWADDRESS__ the same as __ !! 241  * __assume_aligned(n, k): Tell the optimizer that the returned
108  * matching the defines used by Clang.         !! 242  * pointer can be assumed to be k modulo n. The second argument is
                                                   >> 243  * optional (default 0), so we use a variadic macro to make the
                                                   >> 244  * shorthand.
                                                   >> 245  *
                                                   >> 246  * Beware: Do not apply this to functions which may return
                                                   >> 247  * ERR_PTRs. Also, it is probably unwise to apply it to functions
                                                   >> 248  * returning extra information in the low bits (but in that case the
                                                   >> 249  * compiler should see some alignment anyway, when the return value is
                                                   >> 250  * massaged by 'flags = ptr & 3; ptr &= ~3;').
109  */                                               251  */
110 #ifdef __SANITIZE_HWADDRESS__                  !! 252 #define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
111 #define __SANITIZE_ADDRESS__                   << 
112 #endif                                            253 #endif
113                                                   254 
114 /*                                                255 /*
115  * GCC does not support KMSAN.                 !! 256  * GCC 'asm goto' miscompiles certain code sequences:
                                                   >> 257  *
                                                   >> 258  *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
                                                   >> 259  *
                                                   >> 260  * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
                                                   >> 261  *
                                                   >> 262  * (asm goto is automatically volatile - the naming reflects this.)
116  */                                               263  */
117 #define __no_sanitize_memory                   !! 264 #define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
118 #define __no_kmsan_checks                      << 
119                                                   265 
120 /*                                                266 /*
121  * Turn individual warnings and errors on and  !! 267  * sparse (__CHECKER__) pretends to be gcc, but can't do constant
122  * on version.                                 !! 268  * folding in __builtin_bswap*() (yet), so don't set these for it.
123  */                                               269  */
124 #define __diag_GCC(version, severity, s) \     !! 270 #if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) && !defined(__CHECKER__)
125         __diag_GCC_ ## version(__diag_GCC_ ##  !! 271 #if GCC_VERSION >= 40400
                                                   >> 272 #define __HAVE_BUILTIN_BSWAP32__
                                                   >> 273 #define __HAVE_BUILTIN_BSWAP64__
                                                   >> 274 #endif
                                                   >> 275 #if GCC_VERSION >= 40800
                                                   >> 276 #define __HAVE_BUILTIN_BSWAP16__
                                                   >> 277 #endif
                                                   >> 278 #endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP && !__CHECKER__ */
                                                   >> 279 
                                                   >> 280 #if GCC_VERSION >= 70000
                                                   >> 281 #define KASAN_ABI_VERSION 5
                                                   >> 282 #elif GCC_VERSION >= 50000
                                                   >> 283 #define KASAN_ABI_VERSION 4
                                                   >> 284 #elif GCC_VERSION >= 40902
                                                   >> 285 #define KASAN_ABI_VERSION 3
                                                   >> 286 #endif
126                                                   287 
127 /* Severity used in pragma directives */       !! 288 #if GCC_VERSION >= 40902
128 #define __diag_GCC_ignore       ignored        !! 289 /*
129 #define __diag_GCC_warn         warning        !! 290  * Tell the compiler that address safety instrumentation (KASAN)
130 #define __diag_GCC_error        error          !! 291  * should not be applied to that function.
                                                   >> 292  * Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
                                                   >> 293  */
                                                   >> 294 #define __no_sanitize_address __attribute__((no_sanitize_address))
                                                   >> 295 #endif
131                                                   296 
132 #define __diag_str1(s)          #s             !! 297 #endif  /* gcc version >= 40000 specific checks */
133 #define __diag_str(s)           __diag_str1(s) << 
134 #define __diag(s)               _Pragma(__diag << 
135                                                   298 
136 #if GCC_VERSION >= 80000                       !! 299 #if !defined(__noclone)
137 #define __diag_GCC_8(s)         __diag(s)      !! 300 #define __noclone       /* not needed */
138 #else                                          << 
139 #define __diag_GCC_8(s)                        << 
140 #endif                                            301 #endif
141                                                   302 
142 #define __diag_ignore_all(option, comment) \   !! 303 #if !defined(__no_sanitize_address)
143         __diag(__diag_GCC_ignore option)       !! 304 #define __no_sanitize_address
                                                   >> 305 #endif
144                                                   306 
145 /*                                                307 /*
146  * Prior to 9.1, -Wno-alloc-size-larger-than ( !! 308  * A trick to suppress uninitialized variable warning without generating any
147  * attribute) do not work, and must be disable !! 309  * code
148  */                                               310  */
149 #if GCC_VERSION < 90100                        !! 311 #define uninitialized_var(x) x = x
150 #undef __alloc_size__                          << 
151 #endif                                         << 
152                                                   312 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php