xref: /openbmc/u-boot/include/linux/compiler-gcc.h (revision 95ffaba39042064c5eb68404894fd6b0f1d6a3e3)
1*95ffaba3SGraeme Russ #ifndef __LINUX_COMPILER_H
2*95ffaba3SGraeme Russ #error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead."
3*95ffaba3SGraeme Russ #endif
4*95ffaba3SGraeme Russ 
5*95ffaba3SGraeme Russ /*
6*95ffaba3SGraeme Russ  * Common definitions for all gcc versions go here.
7*95ffaba3SGraeme Russ  */
8*95ffaba3SGraeme Russ 
9*95ffaba3SGraeme Russ 
10*95ffaba3SGraeme Russ /* Optimization barrier */
11*95ffaba3SGraeme Russ /* The "volatile" is due to gcc bugs */
12*95ffaba3SGraeme Russ #define barrier() __asm__ __volatile__("": : :"memory")
13*95ffaba3SGraeme Russ 
14*95ffaba3SGraeme Russ /*
15*95ffaba3SGraeme Russ  * This macro obfuscates arithmetic on a variable address so that gcc
16*95ffaba3SGraeme Russ  * shouldn't recognize the original var, and make assumptions about it.
17*95ffaba3SGraeme Russ  *
18*95ffaba3SGraeme Russ  * This is needed because the C standard makes it undefined to do
19*95ffaba3SGraeme Russ  * pointer arithmetic on "objects" outside their boundaries and the
20*95ffaba3SGraeme Russ  * gcc optimizers assume this is the case. In particular they
21*95ffaba3SGraeme Russ  * assume such arithmetic does not wrap.
22*95ffaba3SGraeme Russ  *
23*95ffaba3SGraeme Russ  * A miscompilation has been observed because of this on PPC.
24*95ffaba3SGraeme Russ  * To work around it we hide the relationship of the pointer and the object
25*95ffaba3SGraeme Russ  * using this macro.
26*95ffaba3SGraeme Russ  *
27*95ffaba3SGraeme Russ  * Versions of the ppc64 compiler before 4.1 had a bug where use of
28*95ffaba3SGraeme Russ  * RELOC_HIDE could trash r30. The bug can be worked around by changing
29*95ffaba3SGraeme Russ  * the inline assembly constraint from =g to =r, in this particular
30*95ffaba3SGraeme Russ  * case either is valid.
31*95ffaba3SGraeme Russ  */
32*95ffaba3SGraeme Russ #define RELOC_HIDE(ptr, off)					\
33*95ffaba3SGraeme Russ   ({ unsigned long __ptr;					\
34*95ffaba3SGraeme Russ     __asm__ ("" : "=r"(__ptr) : "0"(ptr));		\
35*95ffaba3SGraeme Russ     (typeof(ptr)) (__ptr + (off)); })
36*95ffaba3SGraeme Russ 
37*95ffaba3SGraeme Russ /* &a[0] degrades to a pointer: a different type from an array */
38*95ffaba3SGraeme Russ #define __must_be_array(a) \
39*95ffaba3SGraeme Russ   BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
40*95ffaba3SGraeme Russ 
41*95ffaba3SGraeme Russ /*
42*95ffaba3SGraeme Russ  * Force always-inline if the user requests it so via the .config,
43*95ffaba3SGraeme Russ  * or if gcc is too old:
44*95ffaba3SGraeme Russ  */
45*95ffaba3SGraeme Russ #if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
46*95ffaba3SGraeme Russ     !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4)
47*95ffaba3SGraeme Russ # define inline		inline		__attribute__((always_inline))
48*95ffaba3SGraeme Russ # define __inline__	__inline__	__attribute__((always_inline))
49*95ffaba3SGraeme Russ # define __inline	__inline	__attribute__((always_inline))
50*95ffaba3SGraeme Russ #endif
51*95ffaba3SGraeme Russ 
52*95ffaba3SGraeme Russ #define __deprecated			__attribute__((deprecated))
53*95ffaba3SGraeme Russ #define __packed			__attribute__((packed))
54*95ffaba3SGraeme Russ #define __weak				__attribute__((weak))
55*95ffaba3SGraeme Russ 
56*95ffaba3SGraeme Russ /*
57*95ffaba3SGraeme Russ  * it doesn't make sense on ARM (currently the only user of __naked) to trace
58*95ffaba3SGraeme Russ  * naked functions because then mcount is called without stack and frame pointer
59*95ffaba3SGraeme Russ  * being set up and there is no chance to restore the lr register to the value
60*95ffaba3SGraeme Russ  * before mcount was called.
61*95ffaba3SGraeme Russ  */
62*95ffaba3SGraeme Russ #define __naked				__attribute__((naked)) notrace
63*95ffaba3SGraeme Russ 
64*95ffaba3SGraeme Russ #define __noreturn			__attribute__((noreturn))
65*95ffaba3SGraeme Russ 
66*95ffaba3SGraeme Russ /*
67*95ffaba3SGraeme Russ  * From the GCC manual:
68*95ffaba3SGraeme Russ  *
69*95ffaba3SGraeme Russ  * Many functions have no effects except the return value and their
70*95ffaba3SGraeme Russ  * return value depends only on the parameters and/or global
71*95ffaba3SGraeme Russ  * variables.  Such a function can be subject to common subexpression
72*95ffaba3SGraeme Russ  * elimination and loop optimization just as an arithmetic operator
73*95ffaba3SGraeme Russ  * would be.
74*95ffaba3SGraeme Russ  * [...]
75*95ffaba3SGraeme Russ  */
76*95ffaba3SGraeme Russ #define __pure				__attribute__((pure))
77*95ffaba3SGraeme Russ #define __aligned(x)			__attribute__((aligned(x)))
78*95ffaba3SGraeme Russ #define __printf(a,b)			__attribute__((format(printf,a,b)))
79*95ffaba3SGraeme Russ #define  noinline			__attribute__((noinline))
80*95ffaba3SGraeme Russ #define __attribute_const__		__attribute__((__const__))
81*95ffaba3SGraeme Russ #define __maybe_unused			__attribute__((unused))
82*95ffaba3SGraeme Russ #define __always_unused			__attribute__((unused))
83*95ffaba3SGraeme Russ 
84*95ffaba3SGraeme Russ #define __gcc_header(x) #x
85*95ffaba3SGraeme Russ #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
86*95ffaba3SGraeme Russ #define gcc_header(x) _gcc_header(x)
87*95ffaba3SGraeme Russ #include gcc_header(__GNUC__)
88