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