Blame view
include/linux/compiler-gcc.h
3.56 KB
94f582f82 Force erroneous i... |
1 2 3 |
#ifndef __LINUX_COMPILER_H #error "Please don't include <linux/compiler-gcc.h> directly, include <linux/compiler.h> instead." #endif |
1da177e4c Linux-2.6.12-rc2 |
4 5 6 7 8 9 10 11 12 |
/* * Common definitions for all gcc versions go here. */ /* Optimization barrier */ /* The "volatile" is due to gcc bugs */ #define barrier() __asm__ __volatile__("": : :"memory") |
c8d52465f [PATCH] Work arou... |
13 |
/* |
85c210edc compiler-gcc.h: a... |
14 15 16 17 18 19 20 21 22 23 24 25 |
* This macro obfuscates arithmetic on a variable address so that gcc * shouldn't recognize the original var, and make assumptions about it. * * This is needed because the C standard makes it undefined to do * pointer arithmetic on "objects" outside their boundaries and the * gcc optimizers assume this is the case. In particular they * assume such arithmetic does not wrap. * * A miscompilation has been observed because of this on PPC. * To work around it we hide the relationship of the pointer and the object * using this macro. * |
c8d52465f [PATCH] Work arou... |
26 27 28 29 30 |
* Versions of the ppc64 compiler before 4.1 had a bug where use of * RELOC_HIDE could trash r30. The bug can be worked around by changing * the inline assembly constraint from =g to =r, in this particular * case either is valid. */ |
1da177e4c Linux-2.6.12-rc2 |
31 32 |
#define RELOC_HIDE(ptr, off) \ ({ unsigned long __ptr; \ |
c8d52465f [PATCH] Work arou... |
33 |
__asm__ ("" : "=r"(__ptr) : "0"(ptr)); \ |
1da177e4c Linux-2.6.12-rc2 |
34 |
(typeof(ptr)) (__ptr + (off)); }) |
a13656470 [PATCH] remove gc... |
35 |
|
c5e631cf6 ARRAY_SIZE: check... |
36 |
/* &a[0] degrades to a pointer: a different type from an array */ |
ea6b101d8 include/linux/com... |
37 |
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) |
a13656470 [PATCH] remove gc... |
38 |
|
60a3cdd06 x86: add optimize... |
39 |
/* |
ae3a0064e inlining: do not ... |
40 41 |
* Force always-inline if the user requests it so via the .config, * or if gcc is too old: |
60a3cdd06 x86: add optimize... |
42 |
*/ |
765c68bd5 generic: make opt... |
43 |
#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ |
ae3a0064e inlining: do not ... |
44 |
!defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) |
60a3cdd06 x86: add optimize... |
45 46 47 48 |
# define inline inline __attribute__((always_inline)) # define __inline__ __inline__ __attribute__((always_inline)) # define __inline __inline __attribute__((always_inline)) #endif |
a13656470 [PATCH] remove gc... |
49 |
#define __deprecated __attribute__((deprecated)) |
82ddcb040 [PATCH] extend th... |
50 51 |
#define __packed __attribute__((packed)) #define __weak __attribute__((weak)) |
446c92b29 [ARM] 5421/1: ftr... |
52 53 54 55 56 57 |
/* * it doesn't make sense on ARM (currently the only user of __naked) to trace * naked functions because then mcount is called without stack and frame pointer * being set up and there is no chance to restore the lr register to the value * before mcount was called. |
9c695203a compiler-gcc.h: g... |
58 59 60 61 |
* * The asm() bodies of naked functions often depend on standard calling conventions, * therefore they must be noinline and noclone. GCC 4.[56] currently fail to enforce * this, so we must do so ourselves. See GCC PR44290. |
446c92b29 [ARM] 5421/1: ftr... |
62 |
*/ |
9c695203a compiler-gcc.h: g... |
63 |
#define __naked __attribute__((naked)) noinline __noclone notrace |
446c92b29 [ARM] 5421/1: ftr... |
64 |
|
82ddcb040 [PATCH] extend th... |
65 |
#define __noreturn __attribute__((noreturn)) |
e8c44319c Replace __attribu... |
66 67 68 69 70 71 72 73 74 75 76 |
/* * From the GCC manual: * * Many functions have no effects except the return value and their * return value depends only on the parameters and/or global * variables. Such a function can be subject to common subexpression * elimination and loop optimization just as an arithmetic operator * would be. * [...] */ |
82ddcb040 [PATCH] extend th... |
77 78 79 |
#define __pure __attribute__((pure)) #define __aligned(x) __attribute__((aligned(x))) #define __printf(a,b) __attribute__((format(printf,a,b))) |
a13656470 [PATCH] remove gc... |
80 |
#define noinline __attribute__((noinline)) |
a13656470 [PATCH] remove gc... |
81 |
#define __attribute_const__ __attribute__((__const__)) |
0d7ebbbc6 compiler: introdu... |
82 |
#define __maybe_unused __attribute__((unused)) |
7b2a35132 compiler: Introdu... |
83 |
#define __always_unused __attribute__((unused)) |
f153b8212 Sanitize gcc vers... |
84 85 86 87 88 |
#define __gcc_header(x) #x #define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) #define gcc_header(x) _gcc_header(x) #include gcc_header(__GNUC__) |
9c695203a compiler-gcc.h: g... |
89 90 91 92 |
#if !defined(__noclone) #define __noclone /* not needed */ #endif |
c837fb37a include/linux/com... |
93 94 95 96 97 98 99 100 |
/* * A trick to suppress uninitialized variable warning without generating any * code */ #define uninitialized_var(x) x = x #define __always_inline inline __attribute__((always_inline)) |