1#ifndef __LINUX_COMPILER_H
2#error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
3#endif
4
5
6
7
8#define GCC_VERSION (__GNUC__ * 10000 \
9 + __GNUC_MINOR__ * 100 \
10 + __GNUC_PATCHLEVEL__)
11
12
13
14
15#define barrier() __asm__ __volatile__("": : :"memory")
16
17
18
19
20
21
22
23
24
25
26
27
28
29#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49#define RELOC_HIDE(ptr, off) \
50({ \
51 unsigned long __ptr; \
52 __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
53 (typeof(ptr)) (__ptr + (off)); \
54})
55
56
57#define OPTIMIZER_HIDE_VAR(var) \
58 __asm__ ("" : "=r" (var) : "0" (var))
59
60#ifdef __CHECKER__
61#define __must_be_array(a) 0
62#else
63
64#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
65#endif
66
67
68
69
70
71#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
72 !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
73#define inline inline __attribute__((always_inline)) notrace
74#define __inline__ __inline__ __attribute__((always_inline)) notrace
75#define __inline __inline __attribute__((always_inline)) notrace
76#else
77
78#define inline inline notrace
79#define __inline__ __inline__ notrace
80#define __inline __inline notrace
81#endif
82
83#define __always_inline inline __attribute__((always_inline))
84#define noinline __attribute__((noinline))
85
86#define __deprecated __attribute__((deprecated))
87#define __packed __attribute__((packed))
88#define __weak __attribute__((weak))
89#define __alias(symbol) __attribute__((alias(#symbol)))
90
91
92
93
94
95
96
97
98
99
100
101
102
103#define __naked __attribute__((naked)) noinline __noclone notrace
104
105#define __noreturn __attribute__((noreturn))
106
107
108
109
110
111
112
113
114
115
116
117#define __pure __attribute__((pure))
118#define __aligned(x) __attribute__((aligned(x)))
119#define __aligned_largest __attribute__((aligned))
120#define __printf(a, b) __attribute__((format(printf, a, b)))
121#define __scanf(a, b) __attribute__((format(scanf, a, b)))
122#define __attribute_const__ __attribute__((__const__))
123#define __maybe_unused __attribute__((unused))
124#define __always_unused __attribute__((unused))
125#define __mode(x) __attribute__((mode(x)))
126
127
128
129#if GCC_VERSION < 30200
130# error Sorry, your compiler is too old - please upgrade it.
131#endif
132
133#if GCC_VERSION < 30300
134# define __used __attribute__((__unused__))
135#else
136# define __used __attribute__((__used__))
137#endif
138
139#ifdef CONFIG_GCOV_KERNEL
140# if GCC_VERSION < 30400
141# error "GCOV profiling support for gcc versions below 3.4 not included"
142# endif
143#endif
144
145#if GCC_VERSION >= 30400
146#define __must_check __attribute__((warn_unused_result))
147#define __malloc __attribute__((__malloc__))
148#endif
149
150#if GCC_VERSION >= 40000
151
152
153#ifdef __KERNEL__
154# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
155# error Your version of gcc miscompiles the __weak directive
156# endif
157#endif
158
159#define __used __attribute__((__used__))
160#define __compiler_offsetof(a, b) \
161 __builtin_offsetof(a, b)
162
163#if GCC_VERSION >= 40100
164# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
165#endif
166
167#if GCC_VERSION >= 40300
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182#define __cold __attribute__((__cold__))
183
184#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
185
186#ifndef __CHECKER__
187# define __compiletime_warning(message) __attribute__((warning(message)))
188# define __compiletime_error(message) __attribute__((error(message)))
189#endif
190#endif
191
192#if GCC_VERSION >= 40500
193
194#ifndef __CHECKER__
195#ifdef LATENT_ENTROPY_PLUGIN
196#define __latent_entropy __attribute__((latent_entropy))
197#endif
198#endif
199
200#ifdef CONFIG_STACK_VALIDATION
201#define annotate_unreachable() ({ \
202 asm("%c0:\t\n" \
203 ".pushsection .discard.unreachable\t\n" \
204 ".long %c0b - .\t\n" \
205 ".popsection\t\n" : : "i" (__LINE__)); \
206})
207#else
208#define annotate_unreachable()
209#endif
210
211
212
213
214
215
216
217
218
219
220#define unreachable() \
221 do { annotate_unreachable(); __builtin_unreachable(); } while (0)
222
223
224#define __noclone __attribute__((__noclone__, __optimize__("no-tracer")))
225
226#endif
227
228#if GCC_VERSION >= 40600
229
230
231
232
233
234
235#define __visible __attribute__((externally_visible))
236#endif
237
238
239#if GCC_VERSION >= 40900 && !defined(__CHECKER__)
240
241
242
243
244
245
246
247
248
249
250
251
252#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
253#endif
254
255
256
257
258
259
260
261
262
263
264#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
265
266
267
268
269
270#if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) && !defined(__CHECKER__)
271#if GCC_VERSION >= 40400
272#define __HAVE_BUILTIN_BSWAP32__
273#define __HAVE_BUILTIN_BSWAP64__
274#endif
275#if GCC_VERSION >= 40800
276#define __HAVE_BUILTIN_BSWAP16__
277#endif
278#endif
279
280#if GCC_VERSION >= 70000
281#define KASAN_ABI_VERSION 5
282#elif GCC_VERSION >= 50000
283#define KASAN_ABI_VERSION 4
284#elif GCC_VERSION >= 40902
285#define KASAN_ABI_VERSION 3
286#endif
287
288#if GCC_VERSION >= 40902
289
290
291
292
293
294#define __no_sanitize_address __attribute__((no_sanitize_address))
295#endif
296
297#endif
298
299#if !defined(__noclone)
300#define __noclone
301#endif
302
303#if !defined(__no_sanitize_address)
304#define __no_sanitize_address
305#endif
306
307
308
309
310
311#define uninitialized_var(x) x = x
312