Green shading in the line number column means the source is part of the translation unit, red means it is conditionally excluded. Highlighted line numbers link to the translation unit page. Highlighted macros link to the macro page.
1: #ifndef __LINUX_COMPILER_H 2: #error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead." 3: #endif 4: 5: /* 6: * Common definitions for all gcc versions go here. 7: */ 8: #define GCC_VERSION (__GNUC__ * 10000 \ 9: + __GNUC_MINOR__ * 100 \ 10: + __GNUC_PATCHLEVEL__) 11: 12: 13: /* Optimization barrier */ 14: /* The "volatile" is due to gcc bugs */ 15: #define barrier() __asm__ __volatile__("": : :"memory") 16: 17: /* 18: * This macro obfuscates arithmetic on a variable address so that gcc 19: * shouldn't recognize the original var, and make assumptions about it. 20: * 21: * This is needed because the C standard makes it undefined to do 22: * pointer arithmetic on "objects" outside their boundaries and the 23: * gcc optimizers assume this is the case. In particular they 24: * assume such arithmetic does not wrap. 25: * 26: * A miscompilation has been observed because of this on PPC. 27: * To work around it we hide the relationship of the pointer and the object 28: * using this macro. 29: * 30: * Versions of the ppc64 compiler before 4.1 had a bug where use of 31: * RELOC_HIDE could trash r30. The bug can be worked around by changing 32: * the inline assembly constraint from =g to =r, in this particular 33: * case either is valid. 34: */ 35: #define RELOC_HIDE(ptr, off) \ 36: ({ unsigned long __ptr; \ 37: __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \ 38: (typeof(ptr)) (__ptr + (off)); }) 39: 40: #ifdef __CHECKER__ 41: #define __must_be_array(arr) 0 42: #else 43: /* &a[0] degrades to a pointer: a different type from an array */ 44: #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) 45: #endif 46: 47: /* 48: * Force always-inline if the user requests it so via the .config, 49: * or if gcc is too old: 50: */ 51: #if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ 52: !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) 53: # define inline inline __attribute__((always_inline)) notrace 54: # define __inline__ __inline__ __attribute__((always_inline)) notrace 55: # define __inline __inline __attribute__((always_inline)) notrace 56: #else 57: /* A lot of inline functions can cause havoc with function tracing */ 58: # define inline inline notrace 59: # define __inline__ __inline__ notrace 60: # define __inline __inline notrace 61: #endif 62: 63: #define __deprecated __attribute__((deprecated)) 64: #define __packed __attribute__((packed)) 65: #define __weak __attribute__((weak)) 66: 67: /* 68: * it doesn't make sense on ARM (currently the only user of __naked) to trace 69: * naked functions because then mcount is called without stack and frame pointer 70: * being set up and there is no chance to restore the lr register to the value 71: * before mcount was called. 72: * 73: * The asm() bodies of naked functions often depend on standard calling conventions, 74: * therefore they must be noinline and noclone. GCC 4.[56] currently fail to enforce 75: * this, so we must do so ourselves. See GCC PR44290. 76: */ 77: #define __naked __attribute__((naked)) noinline __noclone notrace 78: 79: #define __noreturn __attribute__((noreturn)) 80: 81: /* 82: * From the GCC manual: 83: * 84: * Many functions have no effects except the return value and their 85: * return value depends only on the parameters and/or global 86: * variables. Such a function can be subject to common subexpression 87: * elimination and loop optimization just as an arithmetic operator 88: * would be. 89: * [...] 90: */ 91: #define __pure __attribute__((pure)) 92: #define __aligned(x) __attribute__((aligned(x))) 93: #define __printf(a, b) __attribute__((format(printf, a, b))) 94: #define __scanf(a, b) __attribute__((format(scanf, a, b))) 95: #define noinline __attribute__((noinline)) 96: #define __attribute_const__ __attribute__((__const__)) 97: #define __maybe_unused __attribute__((unused)) 98: #define __always_unused __attribute__((unused)) 99: 100: #define __gcc_header(x) #x 101: #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) 102: #define gcc_header(x) _gcc_header(x) 103: #include gcc_header(__GNUC__) 104: 105: #if !defined(__noclone) 106: #define __noclone /* not needed */ 107: #endif 108: 109: /* 110: * A trick to suppress uninitialized variable warning without generating any 111: * code 112: */ 113: #define uninitialized_var(x) x = x 114: 115: #define __always_inline inline __attribute__((always_inline)) 116: