summaryrefslogtreecommitdiff
path: root/scripts/Kconfig.toolchain
blob: 4b962831d62af1e51efa75de681e86a8d73ed360 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
# SPDX-License-Identifier: GPL-2.0-only
config CC_VERSION_TEXT
	string
	default "$(CC_VERSION_TEXT)"
	help
	  This is used in unclear ways:

	  - Re-run Kconfig when the compiler is updated
	    The 'default' property references the environment variable,
	    CC_VERSION_TEXT so it is recorded in include/config/auto.conf.cmd.
	    When the compiler is updated, Kconfig will be invoked.

	  - Ensure full rebuild when the compiler is updated
	    include/linux/compiler-version.h contains this option in the comment
	    line so fixdep adds include/config/CC_VERSION_TEXT into the
	    auto-generated dependency. When the compiler is updated, syncconfig
	    will touch it and then every file will be rebuilt.

config CC_IS_GCC
	def_bool $(success,test "$(cc-name)" = GCC)

config GCC_VERSION
	int
	default $(cc-version) if CC_IS_GCC
	default 0

config CC_IS_CLANG
	def_bool $(success,test "$(cc-name)" = Clang)

config CLANG_VERSION
	int
	default $(cc-version) if CC_IS_CLANG
	default 0

config AS_IS_GNU
	def_bool $(success,test "$(as-name)" = GNU)

config AS_IS_LLVM
	def_bool $(success,test "$(as-name)" = LLVM)

config AS_VERSION
	int
	# Use clang version if this is the integrated assembler
	default CLANG_VERSION if AS_IS_LLVM
	default $(as-version)

config LD_IS_BFD
	def_bool $(success,test "$(ld-name)" = BFD)

config LD_VERSION
	int
	default $(ld-version) if LD_IS_BFD
	default 0

config LD_IS_LLD
	def_bool $(success,test "$(ld-name)" = LLD)

config LLD_VERSION
	int
	default $(ld-version) if LD_IS_LLD
	default 0

config RUSTC_VERSION
	int
	default $(rustc-version)
	help
	  It does not depend on `RUST` since that one may need to use the version
	  in a `depends on`.

config RUST_IS_AVAILABLE
	def_bool $(success,$(srctree)/scripts/rust_is_available.sh)
	help
	  This shows whether a suitable Rust toolchain is available (found).

	  Please see Documentation/rust/quick-start.rst for instructions on how
	  to satisfy the build requirements of Rust support.

	  In particular, the Makefile target 'rustavailable' is useful to check
	  why the Rust toolchain is not being detected.

config RUSTC_LLVM_VERSION
	int
	default $(rustc-llvm-version)

config RUSTC_LLVM_MAJOR_VERSION
	int
	default $(shell,expr $(rustc-llvm-version) / 10000)

config RUSTC_CLANG_LLVM_COMPATIBLE
	bool
	default y if CC_IS_CLANG && RUSTC_LLVM_MAJOR_VERSION = $(shell,expr $(cc-version) / 10000)
	help
	  This indicates whether Rust and Clang use LLVM of the same major
	  version.

	  Operations involving handling LLVM IR or bitcode (e.g. cross-language
	  LTO) require the same LLVM major version to work properly. For best
	  compatibility it is recommended that the exact same LLVM is used.

config ARCH_HAS_CC_CAN_LINK
	bool

config CC_CAN_LINK
	bool
	default ARCH_CC_CAN_LINK if ARCH_HAS_CC_CAN_LINK
	default $(cc_can_link_user,$(m64-flag)) if 64BIT
	default $(cc_can_link_user,$(m32-flag))

# Fixed in GCC 14, 13.3, 12.4 and 11.5
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113921
config GCC_ASM_GOTO_OUTPUT_BROKEN
	bool
	depends on CC_IS_GCC
	default y if GCC_VERSION < 110500
	default y if GCC_VERSION >= 120000 && GCC_VERSION < 120400
	default y if GCC_VERSION >= 130000 && GCC_VERSION < 130300

config CC_HAS_ASM_GOTO_OUTPUT
	def_bool y
	depends on !GCC_ASM_GOTO_OUTPUT_BROKEN
	depends on $(success,echo 'int foo(int x) { asm goto ("": "=r"(x) ::: bar); return x; bar: return 0; }' | $(CC) -x c - -c -o /dev/null)

config CC_HAS_ASM_GOTO_TIED_OUTPUT
	depends on CC_HAS_ASM_GOTO_OUTPUT
	# Detect buggy gcc and clang, fixed in gcc-11 clang-14.
	def_bool $(success,echo 'int foo(int *x) { asm goto (".long (%l[bar]) - .": "+m"(*x) ::: bar); return *x; bar: return 0; }' | $CC -x c - -c -o /dev/null)

config TOOLS_SUPPORT_RELR
	def_bool $(success,env "CC=$(CC)" "LD=$(LD)" "NM=$(NM)" "OBJCOPY=$(OBJCOPY)" $(srctree)/scripts/tools-support-relr.sh)

config CC_HAS_ASM_INLINE
	def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null)

config CC_HAS_ASSUME
	bool
	# clang needs to be at least 19.1.0 since the meaning of the assume
	# attribute changed:
	# https://github.com/llvm/llvm-project/commit/c44fa3e8a9a44c2e9a575768a3c185354b9f6c17
	default y if CC_IS_CLANG && CLANG_VERSION >= 190100
	# supported since gcc 13.1.0
	# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106654
	default y if CC_IS_GCC && GCC_VERSION >= 130100

config CC_HAS_NO_PROFILE_FN_ATTR
	def_bool $(success,echo '__attribute__((no_profile_instrument_function)) int x();' | $(CC) -x c - -c -o /dev/null -Werror)

config CC_OPT_ZERO_INIT_PADDING_BITS
	def_string "$(cc-option-str,-fzero-init-padding-bits=all)"

config CC_OPT_NO_ADDRSIG
	def_string "$(cc-option-str,-fno-addrsig)"

config CC_OPT_DIAGNOSTICS_SHOW_CONTEXT
	def_string "$(cc-option-str,-fdiagnostics-show-context=2)"

config CC_OPT_DIAGNOSTICS_SHOW_INLINING_CHAIN
	def_string "$(cc-option-str,-fdiagnostics-show-inlining-chain)"

config CC_OPT_STRICT_FLEX_ARRAYS
	def_string "$(cc-option-str,-fstrict-flex-arrays=3)"

# gcc-10 renamed --param=allow-store-data-races=0 to -fno-allow-store-data-races
config CC_OPT_ALLOW_STORE_DATA_RACES_PARAM
	def_string "$(cc-option-str,--param=allow-store-data-races=0)"

config CC_OPT_NO_ALLOW_STORE_DATA_RACES
	def_string "$(cc-option-str,-fno-allow-store-data-races)"

config CC_HAS_MNOP_MCOUNT
	def_bool $(cc-option,-mnop-mcount)

# s390-linux-gnu-gcc did not support -mfentry until gcc-9.
config CC_HAS_MFENTRY
	def_bool $(cc-option,-mfentry)

config LD_OPT_FORCE_GROUP_ALLOCATION
	def_string "$(ld-option-str,--force-group-allocation)"

config LD_OPT_NO_WARN_RWX_SEGMENTS
	def_string "$(ld-option-str,--no-warn-rwx-segments)"

config CC_OPT_WNO_ADDRESS_OF_PACKED_MEMBER
	def_string "$(cc-option-str,-Wno-address-of-packed-member)"

config CC_OPT_WNO_FORMAT_OVERFLOW_NON_KPRINTF
	def_string "$(cc-option-str,-Wno-format-overflow-non-kprintf)"

config CC_OPT_WNO_FORMAT_TRUNCATION_NON_KPRINTF
	def_string "$(cc-option-str,-Wno-format-truncation-non-kprintf)"

config CC_OPT_WNO_DEFAULT_CONST_INIT_UNSAFE
	def_string "$(cc-option-str,-Wno-default-const-init-unsafe)"

config CC_OPT_WNO_DANGLING_POINTER
	def_string "$(cc-option-str,-Wno-dangling-pointer)"

config CC_OPT_WVLA_LARGER_THAN
	def_string "$(cc-option-str,-Wvla-larger-than=1)"

config CC_HAS_WSTRINGOP_OVERFLOW
	def_bool $(cc-option,-Wstringop-overflow)

config CC_OPT_WNO_UNTERMINATED_STRING_INITIALIZATION
	def_string "$(cc-option-str,-Wno-unterminated-string-initialization)"

config CC_OPT_WERROR_DESIGNATED_INIT
	def_string "$(cc-option-str,-Werror=designated-init)"

config CC_OPT_WENUM_CONVERSION
	def_string "$(cc-option-str,-Wenum-conversion)"

config CC_OPT_WNO_PACKED_NOT_ALIGNED
	def_string "$(cc-option-str,-Wno-packed-not-aligned)"

config CC_OPT_WNO_FORMAT_OVERFLOW
	def_string "$(cc-option-str,-Wno-format-overflow)"

config CC_OPT_WNO_STRINGOP_TRUNCATION
	def_string "$(cc-option-str,-Wno-stringop-truncation)"

config CC_HAS_COUNTED_BY
	bool
	# clang needs to be at least 20.1.0 to avoid potential crashes
	# when building structures that contain __counted_by
	# https://github.com/ClangBuiltLinux/linux/issues/2114
	# https://github.com/llvm/llvm-project/commit/160fb1121cdf703c3ef5e61fb26c5659eb581489
	default y if CC_IS_CLANG && CLANG_VERSION >= 200100
	# supported since gcc 15.1.0
	# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108896
	default y if CC_IS_GCC && GCC_VERSION >= 150100

config CC_HAS_COUNTED_BY_PTR
	bool
	# supported since clang 22
	default y if CC_IS_CLANG && CLANG_VERSION >= 220100
	# supported since gcc 16.0.0
	default y if CC_IS_GCC && GCC_VERSION >= 160000

config CC_HAS_BROKEN_COUNTED_BY_REF
	bool
	# https://github.com/llvm/llvm-project/issues/182575
	default y if CC_IS_CLANG && CLANG_VERSION < 220100

config CC_HAS_ALLOC_TOKEN
	def_bool $(cc-option,-falloc-token-max=123)

config CC_HAS_MULTIDIMENSIONAL_NONSTRING
	def_bool $(success,echo 'char tag[][4] __attribute__((__nonstring__)) = { };' | $(CC) $(CLANG_FLAGS) -x c - -c -o /dev/null -Werror)

config CC_OPT_INLINE_MEMSET
	string
	default "-finline-stringops=memset" if $(cc-option,-finline-stringops=memset)
	default "-mllvm -max-store-memset=4294967294" if $(cc-option,-mllvm -max-store-memset=4294967294)

config LD_CAN_USE_KEEP_IN_OVERLAY
	# ld.lld prior to 21.0.0 did not support KEEP within an overlay description
	# https://github.com/llvm/llvm-project/pull/130661
	def_bool LD_IS_BFD || LLD_VERSION >= 210000

config RUSTC_HAS_UNNECESSARY_TRANSMUTES
	def_bool RUSTC_VERSION >= 108800

config RUSTC_HAS_FILE_WITH_NUL
	def_bool RUSTC_VERSION >= 108900

config RUSTC_HAS_FILE_AS_C_STR
	def_bool RUSTC_VERSION >= 109100

config RUSTC_HAS_SUSPICIOUS_RUNTIME_SYMBOL_DEFINITIONS
	def_bool RUSTC_VERSION >= 109800

config PAHOLE_VERSION
	int
	default "$(PAHOLE_VERSION)"