aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/compiler-gcc.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/compiler-gcc.h')
-rw-r--r--include/linux/compiler-gcc.h87
1 files changed, 18 insertions, 69 deletions
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index 573f5a7d42d4..250b9b7cfd60 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -10,6 +10,10 @@
10 + __GNUC_MINOR__ * 100 \ 10 + __GNUC_MINOR__ * 100 \
11 + __GNUC_PATCHLEVEL__) 11 + __GNUC_PATCHLEVEL__)
12 12
13#if GCC_VERSION < 40600
14# error Sorry, your compiler is too old - please upgrade it.
15#endif
16
13/* Optimization barrier */ 17/* Optimization barrier */
14 18
15/* The "volatile" is due to gcc bugs */ 19/* The "volatile" is due to gcc bugs */
@@ -58,6 +62,12 @@
58#define OPTIMIZER_HIDE_VAR(var) \ 62#define OPTIMIZER_HIDE_VAR(var) \
59 __asm__ ("" : "=r" (var) : "0" (var)) 63 __asm__ ("" : "=r" (var) : "0" (var))
60 64
65/*
66 * A trick to suppress uninitialized variable warning without generating any
67 * code
68 */
69#define uninitialized_var(x) x = x
70
61#ifdef __CHECKER__ 71#ifdef __CHECKER__
62#define __must_be_array(a) 0 72#define __must_be_array(a) 0
63#else 73#else
@@ -91,7 +101,7 @@
91 * A lot of inline functions can cause havoc with function tracing. 101 * A lot of inline functions can cause havoc with function tracing.
92 */ 102 */
93#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ 103#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
94 !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) 104 !defined(CONFIG_OPTIMIZE_INLINING)
95#define inline \ 105#define inline \
96 inline __attribute__((always_inline, unused)) notrace __gnu_inline 106 inline __attribute__((always_inline, unused)) notrace __gnu_inline
97#else 107#else
@@ -103,7 +113,6 @@
103#define __always_inline inline __attribute__((always_inline)) 113#define __always_inline inline __attribute__((always_inline))
104#define noinline __attribute__((noinline)) 114#define noinline __attribute__((noinline))
105 115
106#define __deprecated __attribute__((deprecated))
107#define __packed __attribute__((packed)) 116#define __packed __attribute__((packed))
108#define __weak __attribute__((weak)) 117#define __weak __attribute__((weak))
109#define __alias(symbol) __attribute__((alias(#symbol))) 118#define __alias(symbol) __attribute__((alias(#symbol)))
@@ -148,47 +157,13 @@
148#define __always_unused __attribute__((unused)) 157#define __always_unused __attribute__((unused))
149#define __mode(x) __attribute__((mode(x))) 158#define __mode(x) __attribute__((mode(x)))
150 159
151/* gcc version specific checks */
152
153#if GCC_VERSION < 30200
154# error Sorry, your compiler is too old - please upgrade it.
155#endif
156
157#if GCC_VERSION < 30300
158# define __used __attribute__((__unused__))
159#else
160# define __used __attribute__((__used__))
161#endif
162
163#ifdef CONFIG_GCOV_KERNEL
164# if GCC_VERSION < 30400
165# error "GCOV profiling support for gcc versions below 3.4 not included"
166# endif /* __GNUC_MINOR__ */
167#endif /* CONFIG_GCOV_KERNEL */
168
169#if GCC_VERSION >= 30400
170#define __must_check __attribute__((warn_unused_result)) 160#define __must_check __attribute__((warn_unused_result))
171#define __malloc __attribute__((__malloc__)) 161#define __malloc __attribute__((__malloc__))
172#endif
173
174#if GCC_VERSION >= 40000
175
176/* GCC 4.1.[01] miscompiles __weak */
177#ifdef __KERNEL__
178# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101
179# error Your version of gcc miscompiles the __weak directive
180# endif
181#endif
182 162
183#define __used __attribute__((__used__)) 163#define __used __attribute__((__used__))
184#define __compiler_offsetof(a, b) \ 164#define __compiler_offsetof(a, b) \
185 __builtin_offsetof(a, b) 165 __builtin_offsetof(a, b)
186 166
187#if GCC_VERSION >= 40100
188# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
189#endif
190
191#if GCC_VERSION >= 40300
192/* Mark functions as cold. gcc will assume any path leading to a call 167/* Mark functions as cold. gcc will assume any path leading to a call
193 * to them will be unlikely. This means a lot of manual unlikely()s 168 * to them will be unlikely. This means a lot of manual unlikely()s
194 * are unnecessary now for any paths leading to the usual suspects 169 * are unnecessary now for any paths leading to the usual suspects
@@ -207,24 +182,19 @@
207 182
208#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) 183#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
209 184
210#ifndef __CHECKER__
211# define __compiletime_warning(message) __attribute__((warning(message)))
212# define __compiletime_error(message) __attribute__((error(message)))
213#endif /* __CHECKER__ */
214#endif /* GCC_VERSION >= 40300 */
215
216#if GCC_VERSION >= 40400
217#define __optimize(level) __attribute__((__optimize__(level))) 185#define __optimize(level) __attribute__((__optimize__(level)))
218#define __nostackprotector __optimize("no-stack-protector") 186#define __nostackprotector __optimize("no-stack-protector")
219#endif /* GCC_VERSION >= 40400 */
220 187
221#if GCC_VERSION >= 40500 188#define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
222 189
223#ifndef __CHECKER__ 190#ifndef __CHECKER__
191#define __compiletime_warning(message) __attribute__((warning(message)))
192#define __compiletime_error(message) __attribute__((error(message)))
193
224#ifdef LATENT_ENTROPY_PLUGIN 194#ifdef LATENT_ENTROPY_PLUGIN
225#define __latent_entropy __attribute__((latent_entropy)) 195#define __latent_entropy __attribute__((latent_entropy))
226#endif 196#endif
227#endif 197#endif /* __CHECKER__ */
228 198
229/* 199/*
230 * calling noreturn functions, __builtin_unreachable() and __builtin_trap() 200 * calling noreturn functions, __builtin_unreachable() and __builtin_trap()
@@ -262,10 +232,6 @@
262#define randomized_struct_fields_end } __randomize_layout; 232#define randomized_struct_fields_end } __randomize_layout;
263#endif 233#endif
264 234
265#endif /* GCC_VERSION >= 40500 */
266
267#if GCC_VERSION >= 40600
268
269/* 235/*
270 * When used with Link Time Optimization, gcc can optimize away C functions or 236 * When used with Link Time Optimization, gcc can optimize away C functions or
271 * variables which are referenced only from assembly code. __visible tells the 237 * variables which are referenced only from assembly code. __visible tells the
@@ -274,8 +240,7 @@
274 */ 240 */
275#define __visible __attribute__((externally_visible)) 241#define __visible __attribute__((externally_visible))
276 242
277#endif /* GCC_VERSION >= 40600 */ 243/* gcc version specific checks */
278
279 244
280#if GCC_VERSION >= 40900 && !defined(__CHECKER__) 245#if GCC_VERSION >= 40900 && !defined(__CHECKER__)
281/* 246/*
@@ -309,10 +274,8 @@
309 * folding in __builtin_bswap*() (yet), so don't set these for it. 274 * folding in __builtin_bswap*() (yet), so don't set these for it.
310 */ 275 */
311#if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) && !defined(__CHECKER__) 276#if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) && !defined(__CHECKER__)
312#if GCC_VERSION >= 40400
313#define __HAVE_BUILTIN_BSWAP32__ 277#define __HAVE_BUILTIN_BSWAP32__
314#define __HAVE_BUILTIN_BSWAP64__ 278#define __HAVE_BUILTIN_BSWAP64__
315#endif
316#if GCC_VERSION >= 40800 279#if GCC_VERSION >= 40800
317#define __HAVE_BUILTIN_BSWAP16__ 280#define __HAVE_BUILTIN_BSWAP16__
318#endif 281#endif
@@ -341,10 +304,9 @@
341 * https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html 304 * https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html
342 */ 305 */
343#define __designated_init __attribute__((designated_init)) 306#define __designated_init __attribute__((designated_init))
307#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
344#endif 308#endif
345 309
346#endif /* gcc version >= 40000 specific checks */
347
348#if !defined(__noclone) 310#if !defined(__noclone)
349#define __noclone /* not needed */ 311#define __noclone /* not needed */
350#endif 312#endif
@@ -354,16 +316,6 @@
354#endif 316#endif
355 317
356/* 318/*
357 * A trick to suppress uninitialized variable warning without generating any
358 * code
359 */
360#define uninitialized_var(x) x = x
361
362#if GCC_VERSION >= 50100
363#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1
364#endif
365
366/*
367 * Turn individual warnings and errors on and off locally, depending 319 * Turn individual warnings and errors on and off locally, depending
368 * on version. 320 * on version.
369 */ 321 */
@@ -375,12 +327,9 @@
375#define __diag_GCC_warn warning 327#define __diag_GCC_warn warning
376#define __diag_GCC_error error 328#define __diag_GCC_error error
377 329
378/* Compilers before gcc-4.6 do not understand "#pragma GCC diagnostic push" */
379#if GCC_VERSION >= 40600
380#define __diag_str1(s) #s 330#define __diag_str1(s) #s
381#define __diag_str(s) __diag_str1(s) 331#define __diag_str(s) __diag_str1(s)
382#define __diag(s) _Pragma(__diag_str(GCC diagnostic s)) 332#define __diag(s) _Pragma(__diag_str(GCC diagnostic s))
383#endif
384 333
385#if GCC_VERSION >= 80000 334#if GCC_VERSION >= 80000
386#define __diag_GCC_8(s) __diag(s) 335#define __diag_GCC_8(s) __diag(s)