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 __printf(a, b) __attribute__((format(printf, a, b)))
120#define __scanf(a, b) __attribute__((format(scanf, a, b)))
121#define __attribute_const__ __attribute__((__const__))
122#define __maybe_unused __attribute__((unused))
123#define __always_unused __attribute__((unused))
124
125
126
127#if GCC_VERSION < 30200
128# error Sorry, your compiler is too old - please upgrade it.
129#endif
130
131#if GCC_VERSION < 30300
132# define __used __attribute__((__unused__))
133#else
134# define __used __attribute__((__used__))
135#endif
136
137#ifdef CONFIG_GCOV_KERNEL
138# if GCC_VERSION < 30400
139# error "GCOV profiling support for gcc versions below 3.4 not included"
140# endif
141#endif
142
143#if GCC_VERSION >= 30400
144#define __must_check __attribute__((warn_unused_result))
145#endif
146
147#if GCC_VERSION >= 40000
148
149
150#ifdef __KERNEL__
151# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
152# error Your version of gcc miscompiles the __weak directive
153# endif
154#endif
155
156#define __used __attribute__((__used__))
157#define __compiler_offsetof(a, b) \
158 __builtin_offsetof(a, b)
159
160#if GCC_VERSION >= 40100 && GCC_VERSION < 40600
161# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
162#endif
163
164#if GCC_VERSION >= 40300
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179#define __cold __attribute__((__cold__))
180
181#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
182
183#ifndef __CHECKER__
184# define __compiletime_warning(message) __attribute__((warning(message)))
185# define __compiletime_error(message) __attribute__((error(message)))
186#endif
187#endif
188
189#if GCC_VERSION >= 40500
190
191
192
193
194
195
196
197
198
199#define unreachable() __builtin_unreachable()
200
201
202#define __noclone __attribute__((__noclone__))
203
204#endif
205
206#if GCC_VERSION >= 40600
207
208
209
210#define __visible __attribute__((externally_visible))
211#endif
212
213
214
215
216
217
218
219
220
221
222#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
223
224#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
225#if GCC_VERSION >= 40400
226#define __HAVE_BUILTIN_BSWAP32__
227#define __HAVE_BUILTIN_BSWAP64__
228#endif
229#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600)
230#define __HAVE_BUILTIN_BSWAP16__
231#endif
232#endif
233
234#if GCC_VERSION >= 50000
235#define KASAN_ABI_VERSION 4
236#elif GCC_VERSION >= 40902
237#define KASAN_ABI_VERSION 3
238#endif
239
240#if GCC_VERSION >= 40902
241
242
243
244
245
246#define __no_sanitize_address __attribute__((no_sanitize_address))
247#endif
248
249#endif
250
251#if !defined(__noclone)
252#define __noclone
253#endif
254
255#if !defined(__no_sanitize_address)
256#define __no_sanitize_address
257#endif
258
259
260
261
262
263#define uninitialized_var(x) x = x
264