| 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))) | 
| Josh Triplett | c902e0a | 2006-09-30 23:28:21 -0700 | [diff] [blame] | 13 | # define __acquires(x)	__attribute__((context(x,0,1))) | 
 | 14 | # define __releases(x)	__attribute__((context(x,1,0))) | 
 | 15 | # define __acquire(x)	__context__(x,1) | 
 | 16 | # define __release(x)	__context__(x,-1) | 
| Josh Triplett | dcc8e55 | 2006-09-29 02:01:03 -0700 | [diff] [blame] | 17 | # define __cond_lock(x,c)	((c) ? ({ __acquire(x); 1; }) : 0) | 
| Al Viro | c47ffe3 | 2007-07-26 17:35:29 +0100 | [diff] [blame] | 18 | extern void __chk_user_ptr(const volatile void __user *); | 
 | 19 | extern void __chk_io_ptr(const volatile void __iomem *); | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 | 
| Josh Triplett | dcc8e55 | 2006-09-29 02:01:03 -0700 | [diff] [blame] | 34 | # define __cond_lock(x,c) (c) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 35 | #endif | 
 | 36 |  | 
 | 37 | #ifdef __KERNEL__ | 
 | 38 |  | 
| Andi Kleen | 21124a8 | 2007-05-21 14:31:46 +0200 | [diff] [blame] | 39 | #if __GNUC__ >= 4 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 40 | # include <linux/compiler-gcc4.h> | 
| Alistair John Strachan | 53569ab | 2006-12-12 19:28:50 +0100 | [diff] [blame] | 41 | #elif __GNUC__ == 3 && __GNUC_MINOR__ >= 2 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 42 | # include <linux/compiler-gcc3.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 43 | #else | 
 | 44 | # error Sorry, your compiler is too old/not recognized. | 
 | 45 | #endif | 
 | 46 |  | 
 | 47 | /* Intel compiler defines __GNUC__. So we will overwrite implementations | 
 | 48 |  * coming from above header files here | 
 | 49 |  */ | 
 | 50 | #ifdef __INTEL_COMPILER | 
 | 51 | # include <linux/compiler-intel.h> | 
 | 52 | #endif | 
 | 53 |  | 
 | 54 | /* | 
 | 55 |  * Generic compiler-dependent macros required for kernel | 
 | 56 |  * build go below this comment. Actual compiler/compiler version | 
 | 57 |  * specific implementations come from the above header files | 
 | 58 |  */ | 
 | 59 |  | 
 | 60 | #define likely(x)	__builtin_expect(!!(x), 1) | 
 | 61 | #define unlikely(x)	__builtin_expect(!!(x), 0) | 
 | 62 |  | 
 | 63 | /* Optimization barrier */ | 
 | 64 | #ifndef barrier | 
 | 65 | # define barrier() __memory_barrier() | 
 | 66 | #endif | 
 | 67 |  | 
 | 68 | #ifndef RELOC_HIDE | 
 | 69 | # define RELOC_HIDE(ptr, off)					\ | 
 | 70 |   ({ unsigned long __ptr;					\ | 
 | 71 |      __ptr = (unsigned long) (ptr);				\ | 
 | 72 |     (typeof(ptr)) (__ptr + (off)); }) | 
 | 73 | #endif | 
 | 74 |  | 
 | 75 | #endif /* __KERNEL__ */ | 
 | 76 |  | 
 | 77 | #endif /* __ASSEMBLY__ */ | 
 | 78 |  | 
| David Woodhouse | 4f79c3f | 2006-05-02 10:41:25 +0100 | [diff] [blame] | 79 | #ifdef __KERNEL__ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 80 | /* | 
 | 81 |  * Allow us to mark functions as 'deprecated' and have gcc emit a nice | 
 | 82 |  * warning for each use, in hopes of speeding the functions removal. | 
 | 83 |  * Usage is: | 
 | 84 |  * 		int __deprecated foo(void) | 
 | 85 |  */ | 
 | 86 | #ifndef __deprecated | 
 | 87 | # define __deprecated		/* unimplemented */ | 
 | 88 | #endif | 
 | 89 |  | 
| Paul E. McKenney | 512345b | 2005-05-01 08:59:03 -0700 | [diff] [blame] | 90 | #ifdef MODULE | 
 | 91 | #define __deprecated_for_modules __deprecated | 
 | 92 | #else | 
 | 93 | #define __deprecated_for_modules | 
 | 94 | #endif | 
 | 95 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 96 | #ifndef __must_check | 
 | 97 | #define __must_check | 
 | 98 | #endif | 
 | 99 |  | 
| Andrew Morton | cebc04b | 2006-08-14 22:43:18 -0700 | [diff] [blame] | 100 | #ifndef CONFIG_ENABLE_MUST_CHECK | 
 | 101 | #undef __must_check | 
 | 102 | #define __must_check | 
 | 103 | #endif | 
| Jeff Garzik | de48844 | 2007-10-25 04:06:13 -0400 | [diff] [blame] | 104 | #ifndef CONFIG_ENABLE_WARN_DEPRECATED | 
 | 105 | #undef __deprecated | 
 | 106 | #undef __deprecated_for_modules | 
 | 107 | #define __deprecated | 
 | 108 | #define __deprecated_for_modules | 
 | 109 | #endif | 
| Andrew Morton | cebc04b | 2006-08-14 22:43:18 -0700 | [diff] [blame] | 110 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 111 | /* | 
 | 112 |  * Allow us to avoid 'defined but not used' warnings on functions and data, | 
 | 113 |  * as well as force them to be emitted to the assembly file. | 
 | 114 |  * | 
| David Rientjes | 0d7ebbb | 2007-05-09 02:35:27 -0700 | [diff] [blame] | 115 |  * As of gcc 3.4, static functions that are not marked with attribute((used)) | 
 | 116 |  * may be elided from the assembly file.  As of gcc 3.4, static data not so | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 117 |  * marked will not be elided, but this may change in a future gcc version. | 
 | 118 |  * | 
| David Rientjes | 0d7ebbb | 2007-05-09 02:35:27 -0700 | [diff] [blame] | 119 |  * NOTE: Because distributions shipped with a backported unit-at-a-time | 
 | 120 |  * compiler in gcc 3.3, we must define __used to be __attribute__((used)) | 
 | 121 |  * for gcc >=3.3 instead of 3.4. | 
 | 122 |  * | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 123 |  * In prior versions of gcc, such functions and data would be emitted, but | 
 | 124 |  * would be warned about except with attribute((unused)). | 
| David Rientjes | 0d7ebbb | 2007-05-09 02:35:27 -0700 | [diff] [blame] | 125 |  * | 
 | 126 |  * Mark functions that are referenced only in inline assembly as __used so | 
 | 127 |  * the code is emitted even though it appears to be unreferenced. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 128 |  */ | 
 | 129 | #ifndef __attribute_used__ | 
| David Rientjes | 0d7ebbb | 2007-05-09 02:35:27 -0700 | [diff] [blame] | 130 | # define __attribute_used__	/* deprecated */ | 
 | 131 | #endif | 
 | 132 |  | 
 | 133 | #ifndef __used | 
 | 134 | # define __used			/* unimplemented */ | 
 | 135 | #endif | 
 | 136 |  | 
 | 137 | #ifndef __maybe_unused | 
 | 138 | # define __maybe_unused		/* unimplemented */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 139 | #endif | 
 | 140 |  | 
| David Woodhouse | 423bc7b | 2006-05-04 00:41:02 +0100 | [diff] [blame] | 141 | #ifndef noinline | 
 | 142 | #define noinline | 
 | 143 | #endif | 
 | 144 |  | 
 | 145 | #ifndef __always_inline | 
 | 146 | #define __always_inline inline | 
 | 147 | #endif | 
 | 148 |  | 
 | 149 | #endif /* __KERNEL__ */ | 
 | 150 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 151 | /* | 
 | 152 |  * From the GCC manual: | 
 | 153 |  * | 
 | 154 |  * Many functions do not examine any values except their arguments, | 
 | 155 |  * and have no effects except the return value.  Basically this is | 
 | 156 |  * just slightly more strict class than the `pure' attribute above, | 
 | 157 |  * since function is not allowed to read global memory. | 
 | 158 |  * | 
 | 159 |  * Note that a function that has pointer arguments and examines the | 
 | 160 |  * data pointed to must _not_ be declared `const'.  Likewise, a | 
 | 161 |  * function that calls a non-`const' function usually must not be | 
 | 162 |  * `const'.  It does not make sense for a `const' function to return | 
 | 163 |  * `void'. | 
 | 164 |  */ | 
 | 165 | #ifndef __attribute_const__ | 
 | 166 | # define __attribute_const__	/* unimplemented */ | 
 | 167 | #endif | 
 | 168 |  | 
| Andi Kleen | a586df0 | 2007-07-21 17:10:00 +0200 | [diff] [blame] | 169 | /* | 
 | 170 |  * Tell gcc if a function is cold. The compiler will assume any path | 
 | 171 |  * directly leading to the call is unlikely. | 
 | 172 |  */ | 
 | 173 |  | 
 | 174 | #ifndef __cold | 
 | 175 | #define __cold | 
 | 176 | #endif | 
 | 177 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 178 | #endif /* __LINUX_COMPILER_H */ |