diff options
Diffstat (limited to 'include/linux/compiler.h')
-rw-r--r-- | include/linux/compiler.h | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/include/linux/compiler.h b/include/linux/compiler.h new file mode 100644 index 000000000000..487725cf0d0d --- /dev/null +++ b/include/linux/compiler.h | |||
@@ -0,0 +1,152 @@ | |||
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 | #elif __GNUC__ == 2 | ||
46 | # include <linux/compiler-gcc2.h> | ||
47 | #else | ||
48 | # error Sorry, your compiler is too old/not recognized. | ||
49 | #endif | ||
50 | |||
51 | /* Intel compiler defines __GNUC__. So we will overwrite implementations | ||
52 | * coming from above header files here | ||
53 | */ | ||
54 | #ifdef __INTEL_COMPILER | ||
55 | # include <linux/compiler-intel.h> | ||
56 | #endif | ||
57 | |||
58 | /* | ||
59 | * Generic compiler-dependent macros required for kernel | ||
60 | * build go below this comment. Actual compiler/compiler version | ||
61 | * specific implementations come from the above header files | ||
62 | */ | ||
63 | |||
64 | #define likely(x) __builtin_expect(!!(x), 1) | ||
65 | #define unlikely(x) __builtin_expect(!!(x), 0) | ||
66 | |||
67 | /* Optimization barrier */ | ||
68 | #ifndef barrier | ||
69 | # define barrier() __memory_barrier() | ||
70 | #endif | ||
71 | |||
72 | #ifndef RELOC_HIDE | ||
73 | # define RELOC_HIDE(ptr, off) \ | ||
74 | ({ unsigned long __ptr; \ | ||
75 | __ptr = (unsigned long) (ptr); \ | ||
76 | (typeof(ptr)) (__ptr + (off)); }) | ||
77 | #endif | ||
78 | |||
79 | #endif /* __KERNEL__ */ | ||
80 | |||
81 | #endif /* __ASSEMBLY__ */ | ||
82 | |||
83 | /* | ||
84 | * Allow us to mark functions as 'deprecated' and have gcc emit a nice | ||
85 | * warning for each use, in hopes of speeding the functions removal. | ||
86 | * Usage is: | ||
87 | * int __deprecated foo(void) | ||
88 | */ | ||
89 | #ifndef __deprecated | ||
90 | # define __deprecated /* unimplemented */ | ||
91 | #endif | ||
92 | |||
93 | #ifndef __must_check | ||
94 | #define __must_check | ||
95 | #endif | ||
96 | |||
97 | /* | ||
98 | * Allow us to avoid 'defined but not used' warnings on functions and data, | ||
99 | * as well as force them to be emitted to the assembly file. | ||
100 | * | ||
101 | * As of gcc 3.3, static functions that are not marked with attribute((used)) | ||
102 | * may be elided from the assembly file. As of gcc 3.3, static data not so | ||
103 | * marked will not be elided, but this may change in a future gcc version. | ||
104 | * | ||
105 | * In prior versions of gcc, such functions and data would be emitted, but | ||
106 | * would be warned about except with attribute((unused)). | ||
107 | */ | ||
108 | #ifndef __attribute_used__ | ||
109 | # define __attribute_used__ /* unimplemented */ | ||
110 | #endif | ||
111 | |||
112 | /* | ||
113 | * From the GCC manual: | ||
114 | * | ||
115 | * Many functions have no effects except the return value and their | ||
116 | * return value depends only on the parameters and/or global | ||
117 | * variables. Such a function can be subject to common subexpression | ||
118 | * elimination and loop optimization just as an arithmetic operator | ||
119 | * would be. | ||
120 | * [...] | ||
121 | */ | ||
122 | #ifndef __attribute_pure__ | ||
123 | # define __attribute_pure__ /* unimplemented */ | ||
124 | #endif | ||
125 | |||
126 | /* | ||
127 | * From the GCC manual: | ||
128 | * | ||
129 | * Many functions do not examine any values except their arguments, | ||
130 | * and have no effects except the return value. Basically this is | ||
131 | * just slightly more strict class than the `pure' attribute above, | ||
132 | * since function is not allowed to read global memory. | ||
133 | * | ||
134 | * Note that a function that has pointer arguments and examines the | ||
135 | * data pointed to must _not_ be declared `const'. Likewise, a | ||
136 | * function that calls a non-`const' function usually must not be | ||
137 | * `const'. It does not make sense for a `const' function to return | ||
138 | * `void'. | ||
139 | */ | ||
140 | #ifndef __attribute_const__ | ||
141 | # define __attribute_const__ /* unimplemented */ | ||
142 | #endif | ||
143 | |||
144 | #ifndef noinline | ||
145 | #define noinline | ||
146 | #endif | ||
147 | |||
148 | #ifndef __always_inline | ||
149 | #define __always_inline inline | ||
150 | #endif | ||
151 | |||
152 | #endif /* __LINUX_COMPILER_H */ | ||