Skip to content

Commit 72f1817

Browse files
triniabhimanyuv1
authored andcommitted
compiler*.h: sync include/linux/compiler*.h with Linux 4.5-rc6
Copy these from Linux v4.5-rc6 tag. This is needed so that we can keep up with newer gcc versions. Note that we don't have the uapi/ hierarchy from the kernel so continue to use <linux/types.h> Signed-off-by: Tom Rini <[email protected]>
1 parent 28dd6b7 commit 72f1817

File tree

6 files changed

+383
-235
lines changed

6 files changed

+383
-235
lines changed

include/linux/compiler-gcc.h

Lines changed: 207 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,28 @@
55
/*
66
* Common definitions for all gcc versions go here.
77
*/
8-
#define GCC_VERSION (__GNUC__ * 10000 \
9-
+ __GNUC_MINOR__ * 100 \
10-
+ __GNUC_PATCHLEVEL__)
11-
8+
#define GCC_VERSION (__GNUC__ * 10000 \
9+
+ __GNUC_MINOR__ * 100 \
10+
+ __GNUC_PATCHLEVEL__)
1211

1312
/* Optimization barrier */
13+
1414
/* The "volatile" is due to gcc bugs */
1515
#define barrier() __asm__ __volatile__("": : :"memory")
16+
/*
17+
* This version is i.e. to prevent dead stores elimination on @ptr
18+
* where gcc and llvm may behave differently when otherwise using
19+
* normal barrier(): while gcc behavior gets along with a normal
20+
* barrier(), llvm needs an explicit input variable to be assumed
21+
* clobbered. The issue is as follows: while the inline asm might
22+
* access any memory it wants, the compiler could have fit all of
23+
* @ptr into memory registers instead, and since @ptr never escaped
24+
* from that, it proofed that the inline asm wasn't touching any of
25+
* it. This version works well with both compilers, i.e. we're telling
26+
* the compiler that the inline asm absolutely may see the contents
27+
* of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495
28+
*/
29+
#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory")
1630

1731
/*
1832
* This macro obfuscates arithmetic on a variable address so that gcc
@@ -32,58 +46,63 @@
3246
* the inline assembly constraint from =g to =r, in this particular
3347
* case either is valid.
3448
*/
35-
#define RELOC_HIDE(ptr, off) \
36-
({ unsigned long __ptr; \
37-
__asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
38-
(typeof(ptr)) (__ptr + (off)); })
49+
#define RELOC_HIDE(ptr, off) \
50+
({ \
51+
unsigned long __ptr; \
52+
__asm__ ("" : "=r"(__ptr) : "0"(ptr)); \
53+
(typeof(ptr)) (__ptr + (off)); \
54+
})
3955

4056
/* Make the optimizer believe the variable can be manipulated arbitrarily. */
41-
#define OPTIMIZER_HIDE_VAR(var) __asm__ ("" : "=r" (var) : "0" (var))
57+
#define OPTIMIZER_HIDE_VAR(var) \
58+
__asm__ ("" : "=r" (var) : "0" (var))
4259

4360
#ifdef __CHECKER__
44-
#define __must_be_array(arr) 0
61+
#define __must_be_array(a) 0
4562
#else
4663
/* &a[0] degrades to a pointer: a different type from an array */
47-
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
64+
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))
4865
#endif
4966

5067
/*
5168
* Force always-inline if the user requests it so via the .config,
5269
* or if gcc is too old:
5370
*/
54-
#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
71+
#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
5572
!defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
56-
# define inline inline __attribute__((always_inline)) notrace
57-
# define __inline__ __inline__ __attribute__((always_inline)) notrace
58-
# define __inline __inline __attribute__((always_inline)) notrace
73+
#define inline inline __attribute__((always_inline)) notrace
74+
#define __inline__ __inline__ __attribute__((always_inline)) notrace
75+
#define __inline __inline __attribute__((always_inline)) notrace
5976
#else
6077
/* A lot of inline functions can cause havoc with function tracing */
61-
# define inline inline notrace
62-
# define __inline__ __inline__ notrace
63-
# define __inline __inline notrace
78+
#define inline inline notrace
79+
#define __inline__ __inline__ notrace
80+
#define __inline __inline notrace
6481
#endif
6582

66-
#define __deprecated __attribute__((deprecated))
67-
#ifndef __packed
68-
#define __packed __attribute__((packed))
69-
#endif
70-
#ifndef __weak
71-
#define __weak __attribute__((weak))
72-
#endif
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)))
7390

7491
/*
75-
* it doesn't make sense on ARM (currently the only user of __naked) to trace
76-
* naked functions because then mcount is called without stack and frame pointer
77-
* being set up and there is no chance to restore the lr register to the value
78-
* before mcount was called.
92+
* it doesn't make sense on ARM (currently the only user of __naked)
93+
* to trace naked functions because then mcount is called without
94+
* stack and frame pointer being set up and there is no chance to
95+
* restore the lr register to the value before mcount was called.
96+
*
97+
* The asm() bodies of naked functions often depend on standard calling
98+
* conventions, therefore they must be noinline and noclone.
7999
*
80-
* The asm() bodies of naked functions often depend on standard calling conventions,
81-
* therefore they must be noinline and noclone. GCC 4.[56] currently fail to enforce
82-
* this, so we must do so ourselves. See GCC PR44290.
100+
* GCC 4.[56] currently fail to enforce this, so we must do so ourselves.
101+
* See GCC PR44290.
83102
*/
84-
#define __naked __attribute__((naked)) noinline __noclone notrace
103+
#define __naked __attribute__((naked)) noinline __noclone notrace
85104

86-
#define __noreturn __attribute__((noreturn))
105+
#define __noreturn __attribute__((noreturn))
87106

88107
/*
89108
* From the GCC manual:
@@ -95,34 +114,170 @@
95114
* would be.
96115
* [...]
97116
*/
98-
#ifndef __pure
99-
#define __pure __attribute__((pure))
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+
/* gcc version specific checks */
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 /* __GNUC_MINOR__ */
141+
#endif /* CONFIG_GCOV_KERNEL */
142+
143+
#if GCC_VERSION >= 30400
144+
#define __must_check __attribute__((warn_unused_result))
145+
#endif
146+
147+
#if GCC_VERSION >= 40000
148+
149+
/* GCC 4.1.[01] miscompiles __weak */
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+
/* Mark functions as cold. gcc will assume any path leading to a call
166+
* to them will be unlikely. This means a lot of manual unlikely()s
167+
* are unnecessary now for any paths leading to the usual suspects
168+
* like BUG(), printk(), panic() etc. [but let's keep them for now for
169+
* older compilers]
170+
*
171+
* Early snapshots of gcc 4.3 don't support this and we can't detect this
172+
* in the preprocessor, but we can live with this because they're unreleased.
173+
* Maketime probing would be overkill here.
174+
*
175+
* gcc also has a __attribute__((__hot__)) to move hot functions into
176+
* a special section, but I don't see any sense in this right now in
177+
* the kernel context
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 /* __CHECKER__ */
187+
#endif /* GCC_VERSION >= 40300 */
188+
189+
#if GCC_VERSION >= 40500
190+
/*
191+
* Mark a position in code as unreachable. This can be used to
192+
* suppress control flow warnings after asm blocks that transfer
193+
* control elsewhere.
194+
*
195+
* Early snapshots of gcc 4.5 don't support this and we can't detect
196+
* this in the preprocessor, but we can live with this because they're
197+
* unreleased. Really, we need to have autoconf for the kernel.
198+
*/
199+
#define unreachable() __builtin_unreachable()
200+
201+
/* Mark a function definition as prohibited from being cloned. */
202+
#define __noclone __attribute__((__noclone__))
203+
204+
#endif /* GCC_VERSION >= 40500 */
205+
206+
#if GCC_VERSION >= 40600
207+
/*
208+
* When used with Link Time Optimization, gcc can optimize away C functions or
209+
* variables which are referenced only from assembly code. __visible tells the
210+
* optimizer that something else uses this function or variable, thus preventing
211+
* this.
212+
*/
213+
#define __visible __attribute__((externally_visible))
100214
#endif
101-
#ifndef __aligned
102-
#define __aligned(x) __attribute__((aligned(x)))
215+
216+
217+
#if GCC_VERSION >= 40900 && !defined(__CHECKER__)
218+
/*
219+
* __assume_aligned(n, k): Tell the optimizer that the returned
220+
* pointer can be assumed to be k modulo n. The second argument is
221+
* optional (default 0), so we use a variadic macro to make the
222+
* shorthand.
223+
*
224+
* Beware: Do not apply this to functions which may return
225+
* ERR_PTRs. Also, it is probably unwise to apply it to functions
226+
* returning extra information in the low bits (but in that case the
227+
* compiler should see some alignment anyway, when the return value is
228+
* massaged by 'flags = ptr & 3; ptr &= ~3;').
229+
*/
230+
#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
103231
#endif
104-
#define __printf(a, b) __attribute__((format(printf, a, b)))
105-
#define __scanf(a, b) __attribute__((format(scanf, a, b)))
106-
#define noinline __attribute__((noinline))
107-
#define __attribute_const__ __attribute__((__const__))
108-
#define __maybe_unused __attribute__((unused))
109-
#define __always_unused __attribute__((unused))
110232

111-
#define __gcc_header(x) #x
112-
#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
113-
#define gcc_header(x) _gcc_header(x)
114-
#include gcc_header(__GNUC__)
233+
/*
234+
* GCC 'asm goto' miscompiles certain code sequences:
235+
*
236+
* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
237+
*
238+
* Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
239+
*
240+
* (asm goto is automatically volatile - the naming reflects this.)
241+
*/
242+
#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0)
243+
244+
#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
245+
#if GCC_VERSION >= 40400
246+
#define __HAVE_BUILTIN_BSWAP32__
247+
#define __HAVE_BUILTIN_BSWAP64__
248+
#endif
249+
#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600)
250+
#define __HAVE_BUILTIN_BSWAP16__
251+
#endif
252+
#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
253+
254+
#if GCC_VERSION >= 50000
255+
#define KASAN_ABI_VERSION 4
256+
#elif GCC_VERSION >= 40902
257+
#define KASAN_ABI_VERSION 3
258+
#endif
259+
260+
#if GCC_VERSION >= 40902
261+
/*
262+
* Tell the compiler that address safety instrumentation (KASAN)
263+
* should not be applied to that function.
264+
* Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368
265+
*/
266+
#define __no_sanitize_address __attribute__((no_sanitize_address))
267+
#endif
268+
269+
#endif /* gcc version >= 40000 specific checks */
115270

116271
#if !defined(__noclone)
117272
#define __noclone /* not needed */
118273
#endif
119274

275+
#if !defined(__no_sanitize_address)
276+
#define __no_sanitize_address
277+
#endif
278+
120279
/*
121280
* A trick to suppress uninitialized variable warning without generating any
122281
* code
123282
*/
124283
#define uninitialized_var(x) x = x
125-
126-
#ifndef __always_inline
127-
#define __always_inline inline __attribute__((always_inline))
128-
#endif

include/linux/compiler-gcc3.h

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)