| 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) | 
| Russ Cox | 04a3952 | 2007-03-26 11:23:56 -0400 | [diff] [blame] | 18 | extern void __chk_user_ptr(const void __user *); | 
|  | 19 | extern void __chk_io_ptr(const 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 |  | 
|  | 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> | 
| Alistair John Strachan | 53569ab | 2006-12-12 19:28:50 +0100 | [diff] [blame] | 43 | #elif __GNUC__ == 3 && __GNUC_MINOR__ >= 2 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Andrew Morton | cebc04b | 2006-08-14 22:43:18 -0700 | [diff] [blame] | 102 | #ifndef CONFIG_ENABLE_MUST_CHECK | 
|  | 103 | #undef __must_check | 
|  | 104 | #define __must_check | 
|  | 105 | #endif | 
|  | 106 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 107 | /* | 
|  | 108 | * Allow us to avoid 'defined but not used' warnings on functions and data, | 
|  | 109 | * as well as force them to be emitted to the assembly file. | 
|  | 110 | * | 
| David Rientjes | 0d7ebbb | 2007-05-09 02:35:27 -0700 | [diff] [blame] | 111 | * As of gcc 3.4, static functions that are not marked with attribute((used)) | 
|  | 112 | * 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] | 113 | * marked will not be elided, but this may change in a future gcc version. | 
|  | 114 | * | 
| David Rientjes | 0d7ebbb | 2007-05-09 02:35:27 -0700 | [diff] [blame] | 115 | * NOTE: Because distributions shipped with a backported unit-at-a-time | 
|  | 116 | * compiler in gcc 3.3, we must define __used to be __attribute__((used)) | 
|  | 117 | * for gcc >=3.3 instead of 3.4. | 
|  | 118 | * | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 119 | * In prior versions of gcc, such functions and data would be emitted, but | 
|  | 120 | * would be warned about except with attribute((unused)). | 
| David Rientjes | 0d7ebbb | 2007-05-09 02:35:27 -0700 | [diff] [blame] | 121 | * | 
|  | 122 | * Mark functions that are referenced only in inline assembly as __used so | 
|  | 123 | * the code is emitted even though it appears to be unreferenced. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 124 | */ | 
|  | 125 | #ifndef __attribute_used__ | 
| David Rientjes | 0d7ebbb | 2007-05-09 02:35:27 -0700 | [diff] [blame] | 126 | # define __attribute_used__	/* deprecated */ | 
|  | 127 | #endif | 
|  | 128 |  | 
|  | 129 | #ifndef __used | 
|  | 130 | # define __used			/* unimplemented */ | 
|  | 131 | #endif | 
|  | 132 |  | 
|  | 133 | #ifndef __maybe_unused | 
|  | 134 | # define __maybe_unused		/* unimplemented */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 135 | #endif | 
|  | 136 |  | 
|  | 137 | /* | 
|  | 138 | * From the GCC manual: | 
|  | 139 | * | 
|  | 140 | * Many functions have no effects except the return value and their | 
|  | 141 | * return value depends only on the parameters and/or global | 
|  | 142 | * variables.  Such a function can be subject to common subexpression | 
|  | 143 | * elimination and loop optimization just as an arithmetic operator | 
|  | 144 | * would be. | 
|  | 145 | * [...] | 
|  | 146 | */ | 
|  | 147 | #ifndef __attribute_pure__ | 
|  | 148 | # define __attribute_pure__	/* unimplemented */ | 
|  | 149 | #endif | 
|  | 150 |  | 
| David Woodhouse | 423bc7b | 2006-05-04 00:41:02 +0100 | [diff] [blame] | 151 | #ifndef noinline | 
|  | 152 | #define noinline | 
|  | 153 | #endif | 
|  | 154 |  | 
|  | 155 | #ifndef __always_inline | 
|  | 156 | #define __always_inline inline | 
|  | 157 | #endif | 
|  | 158 |  | 
|  | 159 | #endif /* __KERNEL__ */ | 
|  | 160 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 161 | /* | 
|  | 162 | * From the GCC manual: | 
|  | 163 | * | 
|  | 164 | * Many functions do not examine any values except their arguments, | 
|  | 165 | * and have no effects except the return value.  Basically this is | 
|  | 166 | * just slightly more strict class than the `pure' attribute above, | 
|  | 167 | * since function is not allowed to read global memory. | 
|  | 168 | * | 
|  | 169 | * Note that a function that has pointer arguments and examines the | 
|  | 170 | * data pointed to must _not_ be declared `const'.  Likewise, a | 
|  | 171 | * function that calls a non-`const' function usually must not be | 
|  | 172 | * `const'.  It does not make sense for a `const' function to return | 
|  | 173 | * `void'. | 
|  | 174 | */ | 
|  | 175 | #ifndef __attribute_const__ | 
|  | 176 | # define __attribute_const__	/* unimplemented */ | 
|  | 177 | #endif | 
|  | 178 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 179 | #endif /* __LINUX_COMPILER_H */ |