diff options
author | Nick Desaulniers <ndesaulniers@google.com> | 2018-08-22 19:37:24 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-08-22 20:31:34 -0400 |
commit | 815f0ddb346c196018d4d8f8f55c12b83da1de3f (patch) | |
tree | 4805bf7e3cb7ec4e727aba8e62f9211e9001a760 /include/linux/compiler-gcc.h | |
parent | 899fbc33fd775b9dfa363db28f322272920a2196 (diff) |
include/linux/compiler*.h: make compiler-*.h mutually exclusive
Commit cafa0010cd51 ("Raise the minimum required gcc version to 4.6")
recently exposed a brittle part of the build for supporting non-gcc
compilers.
Both Clang and ICC define __GNUC__, __GNUC_MINOR__, and
__GNUC_PATCHLEVEL__ for quick compatibility with code bases that haven't
added compiler specific checks for __clang__ or __INTEL_COMPILER.
This is brittle, as they happened to get compatibility by posing as a
certain version of GCC. This broke when upgrading the minimal version
of GCC required to build the kernel, to a version above what ICC and
Clang claim to be.
Rather than always including compiler-gcc.h then undefining or
redefining macros in compiler-intel.h or compiler-clang.h, let's
separate out the compiler specific macro definitions into mutually
exclusive headers, do more proper compiler detection, and keep shared
definitions in compiler_types.h.
Fixes: cafa0010cd51 ("Raise the minimum required gcc version to 4.6")
Reported-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Suggested-by: Eli Friedman <efriedma@codeaurora.org>
Suggested-by: Joe Perches <joe@perches.com>
Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/compiler-gcc.h')
-rw-r--r-- | include/linux/compiler-gcc.h | 88 |
1 files changed, 0 insertions, 88 deletions
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 250b9b7cfd60..763bbad1e258 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h | |||
@@ -75,48 +75,6 @@ | |||
75 | #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) | 75 | #define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) |
76 | #endif | 76 | #endif |
77 | 77 | ||
78 | /* | ||
79 | * Feature detection for gnu_inline (gnu89 extern inline semantics). Either | ||
80 | * __GNUC_STDC_INLINE__ is defined (not using gnu89 extern inline semantics, | ||
81 | * and we opt in to the gnu89 semantics), or __GNUC_STDC_INLINE__ is not | ||
82 | * defined so the gnu89 semantics are the default. | ||
83 | */ | ||
84 | #ifdef __GNUC_STDC_INLINE__ | ||
85 | # define __gnu_inline __attribute__((gnu_inline)) | ||
86 | #else | ||
87 | # define __gnu_inline | ||
88 | #endif | ||
89 | |||
90 | /* | ||
91 | * Force always-inline if the user requests it so via the .config, | ||
92 | * or if gcc is too old. | ||
93 | * GCC does not warn about unused static inline functions for | ||
94 | * -Wunused-function. This turns out to avoid the need for complex #ifdef | ||
95 | * directives. Suppress the warning in clang as well by using "unused" | ||
96 | * function attribute, which is redundant but not harmful for gcc. | ||
97 | * Prefer gnu_inline, so that extern inline functions do not emit an | ||
98 | * externally visible function. This makes extern inline behave as per gnu89 | ||
99 | * semantics rather than c99. This prevents multiple symbol definition errors | ||
100 | * of extern inline functions at link time. | ||
101 | * A lot of inline functions can cause havoc with function tracing. | ||
102 | */ | ||
103 | #if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ | ||
104 | !defined(CONFIG_OPTIMIZE_INLINING) | ||
105 | #define inline \ | ||
106 | inline __attribute__((always_inline, unused)) notrace __gnu_inline | ||
107 | #else | ||
108 | #define inline inline __attribute__((unused)) notrace __gnu_inline | ||
109 | #endif | ||
110 | |||
111 | #define __inline__ inline | ||
112 | #define __inline inline | ||
113 | #define __always_inline inline __attribute__((always_inline)) | ||
114 | #define noinline __attribute__((noinline)) | ||
115 | |||
116 | #define __packed __attribute__((packed)) | ||
117 | #define __weak __attribute__((weak)) | ||
118 | #define __alias(symbol) __attribute__((alias(#symbol))) | ||
119 | |||
120 | #ifdef RETPOLINE | 78 | #ifdef RETPOLINE |
121 | #define __noretpoline __attribute__((indirect_branch("keep"))) | 79 | #define __noretpoline __attribute__((indirect_branch("keep"))) |
122 | #endif | 80 | #endif |
@@ -135,55 +93,9 @@ | |||
135 | */ | 93 | */ |
136 | #define __naked __attribute__((naked)) noinline __noclone notrace | 94 | #define __naked __attribute__((naked)) noinline __noclone notrace |
137 | 95 | ||
138 | #define __noreturn __attribute__((noreturn)) | ||
139 | |||
140 | /* | ||
141 | * From the GCC manual: | ||
142 | * | ||
143 | * Many functions have no effects except the return value and their | ||
144 | * return value depends only on the parameters and/or global | ||
145 | * variables. Such a function can be subject to common subexpression | ||
146 | * elimination and loop optimization just as an arithmetic operator | ||
147 | * would be. | ||
148 | * [...] | ||
149 | */ | ||
150 | #define __pure __attribute__((pure)) | ||
151 | #define __aligned(x) __attribute__((aligned(x))) | ||
152 | #define __aligned_largest __attribute__((aligned)) | ||
153 | #define __printf(a, b) __attribute__((format(printf, a, b))) | ||
154 | #define __scanf(a, b) __attribute__((format(scanf, a, b))) | ||
155 | #define __attribute_const__ __attribute__((__const__)) | ||
156 | #define __maybe_unused __attribute__((unused)) | ||
157 | #define __always_unused __attribute__((unused)) | ||
158 | #define __mode(x) __attribute__((mode(x))) | ||
159 | |||
160 | #define __must_check __attribute__((warn_unused_result)) | ||
161 | #define __malloc __attribute__((__malloc__)) | ||
162 | |||
163 | #define __used __attribute__((__used__)) | ||
164 | #define __compiler_offsetof(a, b) \ | ||
165 | __builtin_offsetof(a, b) | ||
166 | |||
167 | /* Mark functions as cold. gcc will assume any path leading to a call | ||
168 | * to them will be unlikely. This means a lot of manual unlikely()s | ||
169 | * are unnecessary now for any paths leading to the usual suspects | ||
170 | * like BUG(), printk(), panic() etc. [but let's keep them for now for | ||
171 | * older compilers] | ||
172 | * | ||
173 | * Early snapshots of gcc 4.3 don't support this and we can't detect this | ||
174 | * in the preprocessor, but we can live with this because they're unreleased. | ||
175 | * Maketime probing would be overkill here. | ||
176 | * | ||
177 | * gcc also has a __attribute__((__hot__)) to move hot functions into | ||
178 | * a special section, but I don't see any sense in this right now in | ||
179 | * the kernel context | ||
180 | */ | ||
181 | #define __cold __attribute__((__cold__)) | ||
182 | |||
183 | #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) | 96 | #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) |
184 | 97 | ||
185 | #define __optimize(level) __attribute__((__optimize__(level))) | 98 | #define __optimize(level) __attribute__((__optimize__(level))) |
186 | #define __nostackprotector __optimize("no-stack-protector") | ||
187 | 99 | ||
188 | #define __compiletime_object_size(obj) __builtin_object_size(obj, 0) | 100 | #define __compiletime_object_size(obj) __builtin_object_size(obj, 0) |
189 | 101 | ||