| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| David Woodhouse | 4f79c3f | 2006-05-02 10:41:25 +0100 | [diff] [blame] | 81 | #ifdef __KERNEL__ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Paul E. McKenney | 512345b | 2005-05-01 08:59:03 -0700 | [diff] [blame] | 92 | #ifdef MODULE | 
 | 93 | #define __deprecated_for_modules __deprecated | 
 | 94 | #else | 
 | 95 | #define __deprecated_for_modules | 
 | 96 | #endif | 
 | 97 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| David Woodhouse | 423bc7b | 2006-05-04 00:41:02 +0100 | [diff] [blame] | 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 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 159 | #endif /* __LINUX_COMPILER_H */ |