File: /Users/paulross/dev/linux/linux-3.13/include/linux/compiler-gcc.h

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: