Home | History | Annotate | Download | only in linux
      1 #ifndef __LINUX_COMPILER_H
      2 #define __LINUX_COMPILER_H
      3 
      4 #ifndef __ASSEMBLY__
      5 
      6 #ifdef __CHECKER__
      7 # define __user		__attribute__((noderef, address_space(1)))
      8 # define __kernel	/* default address space */
      9 # define __safe		__attribute__((safe))
     10 # define __force	__attribute__((force))
     11 # define __nocast	__attribute__((nocast))
     12 # define __iomem	__attribute__((noderef, address_space(2)))
     13 # define __acquires(x)	__attribute__((context(0,1)))
     14 # define __releases(x)	__attribute__((context(1,0)))
     15 # define __acquire(x)	__context__(1)
     16 # define __release(x)	__context__(-1)
     17 # define __cond_lock(x)	((x) ? ({ __context__(1); 1; }) : 0)
     18 extern void __chk_user_ptr(void __user *);
     19 extern void __chk_io_ptr(void __iomem *);
     20 #else
     21 # define __user
     22 # define __kernel
     23 # define __safe
     24 # define __force
     25 # define __nocast
     26 # define __iomem
     27 # define __chk_user_ptr(x) (void)0
     28 # define __chk_io_ptr(x) (void)0
     29 # define __builtin_warning(x, y...) (1)
     30 # define __acquires(x)
     31 # define __releases(x)
     32 # define __acquire(x) (void)0
     33 # define __release(x) (void)0
     34 # define __cond_lock(x) (x)
     35 #endif
     36 
     37 #ifdef __KERNEL__
     38 
     39 #if __GNUC__ > 4
     40 #error no compiler-gcc.h file for this gcc version
     41 #elif __GNUC__ == 4
     42 # include <linux/compiler-gcc4.h>
     43 #elif __GNUC__ == 3
     44 # include <linux/compiler-gcc3.h>
     45 #else
     46 # error Sorry, your compiler is too old/not recognized.
     47 #endif
     48 
     49 /* Intel compiler defines __GNUC__. So we will overwrite implementations
     50  * coming from above header files here
     51  */
     52 #ifdef __INTEL_COMPILER
     53 # include <linux/compiler-intel.h>
     54 #endif
     55 
     56 /*
     57  * Generic compiler-dependent macros required for kernel
     58  * build go below this comment. Actual compiler/compiler version
     59  * specific implementations come from the above header files
     60  */
     61 
     62 #define likely(x)	__builtin_expect(!!(x), 1)
     63 #define unlikely(x)	__builtin_expect(!!(x), 0)
     64 
     65 /* Optimization barrier */
     66 #ifndef barrier
     67 # define barrier() __memory_barrier()
     68 #endif
     69 
     70 #ifndef RELOC_HIDE
     71 # define RELOC_HIDE(ptr, off)					\
     72   ({ unsigned long __ptr;					\
     73      __ptr = (unsigned long) (ptr);				\
     74     (typeof(ptr)) (__ptr + (off)); })
     75 #endif
     76 
     77 #endif /* __KERNEL__ */
     78 
     79 #endif /* __ASSEMBLY__ */
     80 
     81 #ifdef __KERNEL__
     82 /*
     83  * Allow us to mark functions as 'deprecated' and have gcc emit a nice
     84  * warning for each use, in hopes of speeding the functions removal.
     85  * Usage is:
     86  * 		int __deprecated foo(void)
     87  */
     88 #ifndef __deprecated
     89 # define __deprecated		/* unimplemented */
     90 #endif
     91 
     92 #ifdef MODULE
     93 #define __deprecated_for_modules __deprecated
     94 #else
     95 #define __deprecated_for_modules
     96 #endif
     97 
     98 #ifndef __must_check
     99 #define __must_check
    100 #endif
    101 
    102 /*
    103  * Allow us to avoid 'defined but not used' warnings on functions and data,
    104  * as well as force them to be emitted to the assembly file.
    105  *
    106  * As of gcc 3.3, static functions that are not marked with attribute((used))
    107  * may be elided from the assembly file.  As of gcc 3.3, static data not so
    108  * marked will not be elided, but this may change in a future gcc version.
    109  *
    110  * In prior versions of gcc, such functions and data would be emitted, but
    111  * would be warned about except with attribute((unused)).
    112  */
    113 #ifndef __attribute_used__
    114 # define __attribute_used__	/* unimplemented */
    115 #endif
    116 
    117 /*
    118  * From the GCC manual:
    119  *
    120  * Many functions have no effects except the return value and their
    121  * return value depends only on the parameters and/or global
    122  * variables.  Such a function can be subject to common subexpression
    123  * elimination and loop optimization just as an arithmetic operator
    124  * would be.
    125  * [...]
    126  */
    127 #ifndef __attribute_pure__
    128 # define __attribute_pure__	/* unimplemented */
    129 #endif
    130 
    131 #ifndef noinline
    132 #define noinline
    133 #endif
    134 
    135 #ifndef __always_inline
    136 #define __always_inline inline
    137 #endif
    138 
    139 #endif /* __KERNEL__ */
    140 
    141 /*
    142  * From the GCC manual:
    143  *
    144  * Many functions do not examine any values except their arguments,
    145  * and have no effects except the return value.  Basically this is
    146  * just slightly more strict class than the `pure' attribute above,
    147  * since function is not allowed to read global memory.
    148  *
    149  * Note that a function that has pointer arguments and examines the
    150  * data pointed to must _not_ be declared `const'.  Likewise, a
    151  * function that calls a non-`const' function usually must not be
    152  * `const'.  It does not make sense for a `const' function to return
    153  * `void'.
    154  */
    155 #ifndef __attribute_const__
    156 # define __attribute_const__	/* unimplemented */
    157 #endif
    158 
    159 #endif /* __LINUX_COMPILER_H */
    160