Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
8a625c1f NK |
2 | #ifndef _TOOLS_LINUX_COMPILER_H_ |
3 | #define _TOOLS_LINUX_COMPILER_H_ | |
5a116dd2 | 4 | |
712676ea AZ |
5 | #ifndef __ASSEMBLY__ |
6 | ||
4bba4c4b | 7 | #include <linux/compiler_types.h> |
19261401 | 8 | |
49006538 ACM |
9 | #ifndef __compiletime_error |
10 | # define __compiletime_error(message) | |
11 | #endif | |
12 | ||
5b992add ACM |
13 | #ifdef __OPTIMIZE__ |
14 | # define __compiletime_assert(condition, msg, prefix, suffix) \ | |
15 | do { \ | |
16 | extern void prefix ## suffix(void) __compiletime_error(msg); \ | |
17 | if (!(condition)) \ | |
18 | prefix ## suffix(); \ | |
19 | } while (0) | |
20 | #else | |
21 | # define __compiletime_assert(condition, msg, prefix, suffix) do { } while (0) | |
22 | #endif | |
23 | ||
24 | #define _compiletime_assert(condition, msg, prefix, suffix) \ | |
25 | __compiletime_assert(condition, msg, prefix, suffix) | |
26 | ||
27 | /** | |
28 | * compiletime_assert - break build and emit msg if condition is false | |
29 | * @condition: a compile-time constant condition to check | |
30 | * @msg: a message to emit if condition is false | |
31 | * | |
32 | * In tradition of POSIX assert, this macro will break the build if the | |
33 | * supplied condition is *false*, emitting the supplied error message if the | |
34 | * compiler has support to do so. | |
35 | */ | |
36 | #define compiletime_assert(condition, msg) \ | |
37 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | |
38 | ||
5ac69737 ACM |
39 | /* Optimization barrier */ |
40 | /* The "volatile" is due to gcc bugs */ | |
41 | #define barrier() __asm__ __volatile__("": : :"memory") | |
42 | ||
5a116dd2 | 43 | #ifndef __always_inline |
7a10822a | 44 | # define __always_inline inline __attribute__((always_inline)) |
5a116dd2 | 45 | #endif |
7a10822a | 46 | |
51e6ac1f MB |
47 | #ifndef __always_unused |
48 | #define __always_unused __attribute__((__unused__)) | |
49 | #endif | |
50 | ||
51 | #ifndef __noreturn | |
52 | #define __noreturn __attribute__((__noreturn__)) | |
53 | #endif | |
54 | ||
55 | #ifndef unreachable | |
56 | #define unreachable() __builtin_unreachable() | |
57 | #endif | |
58 | ||
9dd4ca47 ACM |
59 | #ifndef noinline |
60 | #define noinline | |
61 | #endif | |
62 | ||
af8d27bf JO |
63 | #ifndef __nocf_check |
64 | #define __nocf_check __attribute__((nocf_check)) | |
65 | #endif | |
66 | ||
3e8e2576 JO |
67 | #ifndef __naked |
68 | #define __naked __attribute__((__naked__)) | |
69 | #endif | |
70 | ||
f6441aff ACM |
71 | /* Are two types/vars the same type (ignoring qualifiers)? */ |
72 | #ifndef __same_type | |
73 | # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) | |
74 | #endif | |
75 | ||
598f0ac1 DL |
76 | /* |
77 | * This returns a constant expression while determining if an argument is | |
78 | * a constant expression, most importantly without evaluating the argument. | |
79 | * Glory to Martin Uecker <Martin.Uecker@med.uni-goettingen.de> | |
80 | */ | |
81 | #define __is_constexpr(x) \ | |
82 | (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8))) | |
83 | ||
e6428c34 ACM |
84 | /* |
85 | * Similar to statically_true() but produces a constant expression | |
86 | * | |
87 | * To be used in conjunction with macros, such as BUILD_BUG_ON_ZERO(), | |
88 | * which require their input to be a constant expression and for which | |
89 | * statically_true() would otherwise fail. | |
90 | * | |
91 | * This is a trade-off: const_true() requires all its operands to be | |
92 | * compile time constants. Else, it would always returns false even on | |
93 | * the most trivial cases like: | |
94 | * | |
95 | * true || non_const_var | |
96 | * | |
97 | * On the opposite, statically_true() is able to fold more complex | |
98 | * tautologies and will return true on expressions such as: | |
99 | * | |
100 | * !(non_const_var * 8 % 4) | |
101 | * | |
102 | * For the general case, statically_true() is better. | |
103 | */ | |
104 | #define const_true(x) __builtin_choose_expr(__is_constexpr(x), x, false) | |
105 | ||
8c98abff ACM |
106 | #ifdef __ANDROID__ |
107 | /* | |
108 | * FIXME: Big hammer to get rid of tons of: | |
109 | * "warning: always_inline function might not be inlinable" | |
110 | * | |
111 | * At least on android-ndk-r12/platforms/android-24/arch-arm | |
112 | */ | |
113 | #undef __always_inline | |
114 | #define __always_inline inline | |
115 | #endif | |
116 | ||
5a116dd2 | 117 | #define __user |
12ea6539 MW |
118 | #define __rcu |
119 | #define __read_mostly | |
7a10822a | 120 | |
195bcbf5 | 121 | #ifndef __attribute_const__ |
7a10822a | 122 | # define __attribute_const__ |
195bcbf5 | 123 | #endif |
5a116dd2 | 124 | |
1d037ca1 | 125 | #ifndef __maybe_unused |
7a10822a IM |
126 | # define __maybe_unused __attribute__((unused)) |
127 | #endif | |
128 | ||
e58e871b LASL |
129 | #ifndef __used |
130 | # define __used __attribute__((__unused__)) | |
131 | #endif | |
132 | ||
7a10822a IM |
133 | #ifndef __packed |
134 | # define __packed __attribute__((__packed__)) | |
1d037ca1 | 135 | #endif |
618038df | 136 | |
86d5a70c | 137 | #ifndef __force |
7a10822a | 138 | # define __force |
86d5a70c IT |
139 | #endif |
140 | ||
fb1c9185 IM |
141 | #ifndef __weak |
142 | # define __weak __attribute__((weak)) | |
143 | #endif | |
144 | ||
835d44b9 NK |
145 | #ifndef likely |
146 | # define likely(x) __builtin_expect(!!(x), 1) | |
147 | #endif | |
148 | ||
149 | #ifndef unlikely | |
150 | # define unlikely(x) __builtin_expect(!!(x), 0) | |
151 | #endif | |
152 | ||
728abda6 ACM |
153 | #include <linux/types.h> |
154 | ||
c95f3432 JO |
155 | /* |
156 | * Following functions are taken from kernel sources and | |
157 | * break aliasing rules in their original form. | |
158 | * | |
159 | * While kernel is compiled with -fno-strict-aliasing, | |
160 | * perf uses -Wstrict-aliasing=3 which makes build fail | |
161 | * under gcc 4.4. | |
162 | * | |
163 | * Using extra __may_alias__ type to allow aliasing | |
164 | * in this case. | |
165 | */ | |
166 | typedef __u8 __attribute__((__may_alias__)) __u8_alias_t; | |
167 | typedef __u16 __attribute__((__may_alias__)) __u16_alias_t; | |
168 | typedef __u32 __attribute__((__may_alias__)) __u32_alias_t; | |
169 | typedef __u64 __attribute__((__may_alias__)) __u64_alias_t; | |
170 | ||
728abda6 ACM |
171 | static __always_inline void __read_once_size(const volatile void *p, void *res, int size) |
172 | { | |
173 | switch (size) { | |
c95f3432 JO |
174 | case 1: *(__u8_alias_t *) res = *(volatile __u8_alias_t *) p; break; |
175 | case 2: *(__u16_alias_t *) res = *(volatile __u16_alias_t *) p; break; | |
176 | case 4: *(__u32_alias_t *) res = *(volatile __u32_alias_t *) p; break; | |
177 | case 8: *(__u64_alias_t *) res = *(volatile __u64_alias_t *) p; break; | |
728abda6 ACM |
178 | default: |
179 | barrier(); | |
180 | __builtin_memcpy((void *)res, (const void *)p, size); | |
181 | barrier(); | |
182 | } | |
183 | } | |
184 | ||
185 | static __always_inline void __write_once_size(volatile void *p, void *res, int size) | |
186 | { | |
187 | switch (size) { | |
c95f3432 JO |
188 | case 1: *(volatile __u8_alias_t *) p = *(__u8_alias_t *) res; break; |
189 | case 2: *(volatile __u16_alias_t *) p = *(__u16_alias_t *) res; break; | |
190 | case 4: *(volatile __u32_alias_t *) p = *(__u32_alias_t *) res; break; | |
191 | case 8: *(volatile __u64_alias_t *) p = *(__u64_alias_t *) res; break; | |
728abda6 ACM |
192 | default: |
193 | barrier(); | |
194 | __builtin_memcpy((void *)p, (const void *)res, size); | |
195 | barrier(); | |
196 | } | |
197 | } | |
198 | ||
199 | /* | |
200 | * Prevent the compiler from merging or refetching reads or writes. The | |
201 | * compiler is also forbidden from reordering successive instances of | |
2a22f692 MR |
202 | * READ_ONCE and WRITE_ONCE, but only when the compiler is aware of some |
203 | * particular ordering. One way to make the compiler aware of ordering is to | |
204 | * put the two invocations of READ_ONCE or WRITE_ONCE in different C | |
205 | * statements. | |
728abda6 | 206 | * |
2a22f692 MR |
207 | * These two macros will also work on aggregate data types like structs or |
208 | * unions. If the size of the accessed data type exceeds the word size of | |
209 | * the machine (e.g., 32 bits or 64 bits) READ_ONCE() and WRITE_ONCE() will | |
210 | * fall back to memcpy and print a compile-time warning. | |
728abda6 ACM |
211 | * |
212 | * Their two major use cases are: (1) Mediating communication between | |
213 | * process-level code and irq/NMI handlers, all running on the same CPU, | |
2a22f692 | 214 | * and (2) Ensuring that the compiler does not fold, spindle, or otherwise |
728abda6 ACM |
215 | * mutilate accesses that either do not require ordering or that interact |
216 | * with an explicit memory barrier or atomic instruction that provides the | |
217 | * required ordering. | |
218 | */ | |
219 | ||
4d3b57da MR |
220 | #define READ_ONCE(x) \ |
221 | ({ \ | |
222 | union { typeof(x) __val; char __c[1]; } __u = \ | |
223 | { .__c = { 0 } }; \ | |
224 | __read_once_size(&(x), __u.__c, sizeof(x)); \ | |
225 | __u.__val; \ | |
226 | }) | |
227 | ||
228 | #define WRITE_ONCE(x, val) \ | |
229 | ({ \ | |
230 | union { typeof(x) __val; char __c[1]; } __u = \ | |
231 | { .__val = (val) }; \ | |
232 | __write_once_size(&(x), __u.__c, sizeof(x)); \ | |
233 | __u.__val; \ | |
234 | }) | |
728abda6 | 235 | |
b5bf1733 | 236 | |
e5a0516e JO |
237 | /* Indirect macros required for expanded argument pasting, eg. __LINE__. */ |
238 | #define ___PASTE(a, b) a##b | |
239 | #define __PASTE(a, b) ___PASTE(a, b) | |
240 | ||
e5d51a66 MB |
241 | #ifndef OPTIMIZER_HIDE_VAR |
242 | /* Make the optimizer believe the variable can be manipulated arbitrarily. */ | |
243 | #define OPTIMIZER_HIDE_VAR(var) \ | |
244 | __asm__ ("" : "=r" (var) : "0" (var)) | |
245 | #endif | |
246 | ||
3417404c ACM |
247 | #ifndef __BUILD_BUG_ON_ZERO_MSG |
248 | #if defined(__clang__) | |
249 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)(sizeof(struct { int:(-!!(e)); }))) | |
250 | #else | |
251 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)sizeof(struct {_Static_assert(!(e), msg);})) | |
252 | #endif | |
253 | #endif | |
254 | ||
712676ea AZ |
255 | #endif /* __ASSEMBLY__ */ |
256 | ||
8a625c1f | 257 | #endif /* _TOOLS_LINUX_COMPILER_H */ |