* [PATCH v2 1/6] scripts/Kconfig.toolchain: Remove CONFIG_CC_HAS_NO_PROFILE_FN_ATTR
2026-11-12 0:52 [PATCH v2 0/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks Nathan Chancellor
@ 2026-11-12 0:52 ` Nathan Chancellor
2026-11-12 11:15 ` Nicolas Schier
2026-11-12 0:52 ` [PATCH v2 2/6] scripts/Kconfig.toolchain: Do not dynamically probe '-fno-addrsig' Nathan Chancellor
` (4 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Nathan Chancellor @ 2026-11-12 0:52 UTC (permalink / raw)
To: Nathan Chancellor, Nicolas Schier
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm
__attribute__((no_profile_instrument_function)) was first supported in
GCC 7 and clang-13, which is higher than both the minimum supported
versions of both compilers. This configuration is always 'y', thus it
can be removed.
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
kernel/gcov/Kconfig | 1 -
scripts/Kconfig.toolchain | 3 ---
2 files changed, 4 deletions(-)
diff --git a/kernel/gcov/Kconfig b/kernel/gcov/Kconfig
index 04f4ebdc3cf5..f62de2dea8a3 100644
--- a/kernel/gcov/Kconfig
+++ b/kernel/gcov/Kconfig
@@ -4,7 +4,6 @@ menu "GCOV-based kernel profiling"
config GCOV_KERNEL
bool "Enable gcov-based kernel profiling"
depends on DEBUG_FS
- depends on !ARCH_WANTS_NO_INSTR || CC_HAS_NO_PROFILE_FN_ATTR
select CONSTRUCTORS
default n
help
diff --git a/scripts/Kconfig.toolchain b/scripts/Kconfig.toolchain
index 2acbd40a38f1..666d44cc6ba8 100644
--- a/scripts/Kconfig.toolchain
+++ b/scripts/Kconfig.toolchain
@@ -141,9 +141,6 @@ config CC_HAS_ASSUME
# 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)
-
# Beware of two problems when using cc-option in Kconfig compared to Kbuild
#
# 1. cc-option in Kbuild tests the provided flags with all previously added
--
2.56.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v2 1/6] scripts/Kconfig.toolchain: Remove CONFIG_CC_HAS_NO_PROFILE_FN_ATTR
2026-11-12 0:52 ` [PATCH v2 1/6] scripts/Kconfig.toolchain: Remove CONFIG_CC_HAS_NO_PROFILE_FN_ATTR Nathan Chancellor
@ 2026-11-12 11:15 ` Nicolas Schier
0 siblings, 0 replies; 13+ messages in thread
From: Nicolas Schier @ 2026-11-12 11:15 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm
On Wed, Nov 11, 2026 at 05:52:03PM -0700, Nathan Chancellor wrote:
> __attribute__((no_profile_instrument_function)) was first supported in
> GCC 7 and clang-13, which is higher than both the minimum supported
> versions of both compilers. This configuration is always 'y', thus it
> can be removed.
>
> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> ---
> kernel/gcov/Kconfig | 1 -
> scripts/Kconfig.toolchain | 3 ---
> 2 files changed, 4 deletions(-)
Thanks.
Reviewed-by: Nicolas Schier <nsc@kernel.org>
--
Nicolas
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 2/6] scripts/Kconfig.toolchain: Do not dynamically probe '-fno-addrsig'
2026-11-12 0:52 [PATCH v2 0/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks Nathan Chancellor
2026-11-12 0:52 ` [PATCH v2 1/6] scripts/Kconfig.toolchain: Remove CONFIG_CC_HAS_NO_PROFILE_FN_ATTR Nathan Chancellor
@ 2026-11-12 0:52 ` Nathan Chancellor
2026-11-12 11:21 ` Nicolas Schier
2026-11-12 0:52 ` [PATCH v2 3/6] scripts/Kconfig.toolchain: Clean up '-fno-allow-store-data-races' handling Nathan Chancellor
` (3 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Nathan Chancellor @ 2026-11-12 0:52 UTC (permalink / raw)
To: Nathan Chancellor, Nicolas Schier
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm
'-fno-addrsig' avoids generating the LLVM specific .llvm_addrsig
section. This flag is supported by all supported versions of clang, so
convert CONFIG_CC_OPT_NO_ADDRSIG into a simple string symbol that
depends on CC_IS_CLANG to clean up a dynamic probe that is unnecessary.
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
scripts/Kconfig.toolchain | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/scripts/Kconfig.toolchain b/scripts/Kconfig.toolchain
index 666d44cc6ba8..570c5a31016c 100644
--- a/scripts/Kconfig.toolchain
+++ b/scripts/Kconfig.toolchain
@@ -164,7 +164,8 @@ 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)"
+ # supported in clang, not needed for gcc
+ def_string "-fno-addrsig" if CC_IS_CLANG
config CC_OPT_DIAGNOSTICS_SHOW_CONTEXT
def_string "$(cc-option-str,-fdiagnostics-show-context=2)"
--
2.56.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v2 2/6] scripts/Kconfig.toolchain: Do not dynamically probe '-fno-addrsig'
2026-11-12 0:52 ` [PATCH v2 2/6] scripts/Kconfig.toolchain: Do not dynamically probe '-fno-addrsig' Nathan Chancellor
@ 2026-11-12 11:21 ` Nicolas Schier
0 siblings, 0 replies; 13+ messages in thread
From: Nicolas Schier @ 2026-11-12 11:21 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm
On Wed, Nov 11, 2026 at 05:52:04PM -0700, Nathan Chancellor wrote:
> '-fno-addrsig' avoids generating the LLVM specific .llvm_addrsig
> section. This flag is supported by all supported versions of clang, so
> convert CONFIG_CC_OPT_NO_ADDRSIG into a simple string symbol that
> depends on CC_IS_CLANG to clean up a dynamic probe that is unnecessary.
>
> Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> ---
> scripts/Kconfig.toolchain | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
Reviewed-by: Nicolas Schier <nsc@kernel.org>
--
Nicolas
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 3/6] scripts/Kconfig.toolchain: Clean up '-fno-allow-store-data-races' handling
2026-11-12 0:52 [PATCH v2 0/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks Nathan Chancellor
2026-11-12 0:52 ` [PATCH v2 1/6] scripts/Kconfig.toolchain: Remove CONFIG_CC_HAS_NO_PROFILE_FN_ATTR Nathan Chancellor
2026-11-12 0:52 ` [PATCH v2 2/6] scripts/Kconfig.toolchain: Do not dynamically probe '-fno-addrsig' Nathan Chancellor
@ 2026-11-12 0:52 ` Nathan Chancellor
2026-11-12 11:25 ` Nicolas Schier
2026-11-12 0:52 ` [PATCH v2 4/6] riscv: checksum: Fix CC_HAS_ASM_GOTO_TIED_OUTPUT check Nathan Chancellor
` (2 subsequent siblings)
5 siblings, 1 reply; 13+ messages in thread
From: Nathan Chancellor @ 2026-11-12 0:52 UTC (permalink / raw)
To: Nathan Chancellor, Nicolas Schier
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm
Commit 454e00cf8ee5 ("kbuild: avoid re-running compiler and linker
probes") added two separate symbols for the "no allow store data races"
GCC flags. These flags serve the same purpose, so combine them using the
second argument of cc-option-str to handle the old value. To avoid
setting the second value of cc-option-str for clang, add a GCC
dependency to the symbol. This will eventually allow the cc-option-str
call to be eliminated when GCC 10 is the minimum version for the kernel.
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
Makefile | 5 -----
scripts/Kconfig.toolchain | 7 ++-----
2 files changed, 2 insertions(+), 10 deletions(-)
diff --git a/Makefile b/Makefile
index d73f2bbd3b93..fb2490faa8d1 100644
--- a/Makefile
+++ b/Makefile
@@ -949,12 +949,7 @@ KBUILD_RUSTFLAGS += -Cdebug-assertions=$(if $(CONFIG_RUST_DEBUG_ASSERTIONS),y,n)
KBUILD_RUSTFLAGS += -Coverflow-checks=$(if $(CONFIG_RUST_OVERFLOW_CHECKS),y,n)
# Tell gcc to never replace conditional load with a non-conditional one
-ifdef CONFIG_CC_IS_GCC
-# gcc-10 renamed --param=allow-store-data-races=0 to
-# -fno-allow-store-data-races.
-KBUILD_CFLAGS += $(CONFIG_CC_OPT_ALLOW_STORE_DATA_RACES_PARAM)
KBUILD_CFLAGS += $(CONFIG_CC_OPT_NO_ALLOW_STORE_DATA_RACES)
-endif
ifdef CONFIG_READABLE_ASM
# Disable optimizations that make assembler listings hard to read.
diff --git a/scripts/Kconfig.toolchain b/scripts/Kconfig.toolchain
index 570c5a31016c..6520a06a9103 100644
--- a/scripts/Kconfig.toolchain
+++ b/scripts/Kconfig.toolchain
@@ -176,12 +176,9 @@ config CC_OPT_DIAGNOSTICS_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)"
+ # gcc-10 renamed --param=allow-store-data-races=0 to -fno-allow-store-data-races
+ def_string "$(cc-option-str,-fno-allow-store-data-races,--param=allow-store-data-races=0)" if CC_IS_GCC
config CC_HAS_MNOP_MCOUNT
def_bool $(cc-option,-mnop-mcount)
--
2.56.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v2 3/6] scripts/Kconfig.toolchain: Clean up '-fno-allow-store-data-races' handling
2026-11-12 0:52 ` [PATCH v2 3/6] scripts/Kconfig.toolchain: Clean up '-fno-allow-store-data-races' handling Nathan Chancellor
@ 2026-11-12 11:25 ` Nicolas Schier
0 siblings, 0 replies; 13+ messages in thread
From: Nicolas Schier @ 2026-11-12 11:25 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm
On Wed, Nov 11, 2026 at 05:52:05PM -0700, Nathan Chancellor wrote:
> Commit 454e00cf8ee5 ("kbuild: avoid re-running compiler and linker
> probes") added two separate symbols for the "no allow store data races"
> GCC flags. These flags serve the same purpose, so combine them using the
> second argument of cc-option-str to handle the old value. To avoid
> setting the second value of cc-option-str for clang, add a GCC
> dependency to the symbol. This will eventually allow the cc-option-str
> call to be eliminated when GCC 10 is the minimum version for the kernel.
>
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> ---
> Makefile | 5 -----
> scripts/Kconfig.toolchain | 7 ++-----
> 2 files changed, 2 insertions(+), 10 deletions(-)
>
Reviewed-by: Nicolas Schier <nsc@kernel.org>
--
Nicolas
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 4/6] riscv: checksum: Fix CC_HAS_ASM_GOTO_TIED_OUTPUT check
2026-11-12 0:52 [PATCH v2 0/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks Nathan Chancellor
` (2 preceding siblings ...)
2026-11-12 0:52 ` [PATCH v2 3/6] scripts/Kconfig.toolchain: Clean up '-fno-allow-store-data-races' handling Nathan Chancellor
@ 2026-11-12 0:52 ` Nathan Chancellor
2026-11-12 11:26 ` Nicolas Schier
2026-11-12 0:52 ` [PATCH v2 5/6] Eliminate CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT Nathan Chancellor
2026-11-12 0:52 ` [PATCH v2 6/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks Nathan Chancellor
5 siblings, 1 reply; 13+ messages in thread
From: Nathan Chancellor @ 2026-11-12 0:52 UTC (permalink / raw)
To: Nathan Chancellor, Nicolas Schier
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm,
Charlie Jenkins, Paul Walmsley, Palmer Dabbelt, linux-riscv
The defined symbol is CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT, not
CC_HAS_ASM_GOTO_TIED_OUTPUT.
Fixes: 4525462dd0db ("riscv: lib: Check if output in asm goto supported")
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
Cc: Charlie Jenkins <thecharlesjenkins@gmail.com>
Cc: Paul Walmsley <pjw@kernel.org>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: linux-riscv@lists.infradead.org
---
arch/riscv/lib/csum.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/arch/riscv/lib/csum.c b/arch/riscv/lib/csum.c
index 5d4379768e5d..c2b8986a0d39 100644
--- a/arch/riscv/lib/csum.c
+++ b/arch/riscv/lib/csum.c
@@ -142,7 +142,7 @@ do_csum_with_alignment(const unsigned char *buff, int len)
end = (const unsigned long *)(buff + len);
csum = do_csum_common(ptr, end, data);
-#ifdef CC_HAS_ASM_GOTO_TIED_OUTPUT
+#ifdef CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT
if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&
IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB) &&
riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)) {
@@ -186,7 +186,7 @@ do_csum_with_alignment(const unsigned char *buff, int len)
return csum >> 16;
}
-#endif /* CC_HAS_ASM_GOTO_TIED_OUTPUT */
+#endif /* CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT */
#ifndef CONFIG_32BIT
csum += ror64(csum, 32);
csum >>= 32;
--
2.56.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v2 4/6] riscv: checksum: Fix CC_HAS_ASM_GOTO_TIED_OUTPUT check
2026-11-12 0:52 ` [PATCH v2 4/6] riscv: checksum: Fix CC_HAS_ASM_GOTO_TIED_OUTPUT check Nathan Chancellor
@ 2026-11-12 11:26 ` Nicolas Schier
0 siblings, 0 replies; 13+ messages in thread
From: Nicolas Schier @ 2026-11-12 11:26 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm,
Charlie Jenkins, Paul Walmsley, Palmer Dabbelt, linux-riscv
On Wed, Nov 11, 2026 at 05:52:06PM -0700, Nathan Chancellor wrote:
> The defined symbol is CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT, not
> CC_HAS_ASM_GOTO_TIED_OUTPUT.
>
> Fixes: 4525462dd0db ("riscv: lib: Check if output in asm goto supported")
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> ---
> Cc: Charlie Jenkins <thecharlesjenkins@gmail.com>
> Cc: Paul Walmsley <pjw@kernel.org>
> Cc: Palmer Dabbelt <palmer@dabbelt.com>
> Cc: linux-riscv@lists.infradead.org
> ---
> arch/riscv/lib/csum.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
Thanks for catching!
Reviewed-by: Nicolas Schier <nsc@kernel.org>
Since 4525462dd0db (v6.7) still supported clang-11: shall we add 'Cc: stable'?
--
Nicolas
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 5/6] Eliminate CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT
2026-11-12 0:52 [PATCH v2 0/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks Nathan Chancellor
` (3 preceding siblings ...)
2026-11-12 0:52 ` [PATCH v2 4/6] riscv: checksum: Fix CC_HAS_ASM_GOTO_TIED_OUTPUT check Nathan Chancellor
@ 2026-11-12 0:52 ` Nathan Chancellor
2026-11-12 11:34 ` Nicolas Schier
2026-11-12 0:52 ` [PATCH v2 6/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks Nathan Chancellor
5 siblings, 1 reply; 13+ messages in thread
From: Nathan Chancellor @ 2026-11-12 0:52 UTC (permalink / raw)
To: Nathan Chancellor, Nicolas Schier
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm,
Linus Torvalds, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Charlie Jenkins, Paul Walmsley,
Palmer Dabbelt, linux-riscv
Commit 1aa0e8b144b6 ("Kconfig: Add option for asm goto w/ tied outputs
to workaround clang-13 bug") added CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT to
avoid a bug in clang's asm goto with outputs support when a tied output
was used. The fix in clang was to match GCC's documented behavior.
Now that the minimum supported version of clang has long been bumped
past the version where the fix landed (clang-14), any compiler that
satisfies the dependencies of CONFIG_CC_HAS_ASM_GOTO_OUTPUT will support
tied outputs properly. Eliminate CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT in
favor of just checking for CONFIG_CC_HAS_ASM_GOTO_OUTPUT directly.
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
Cc: Linus Torvalds <torvalds@linuxfoundation.org>
Cc: Thomas Gleixner <tglx@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: x86@kernel.org
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Charlie Jenkins <thecharlesjenkins@gmail.com>
Cc: Paul Walmsley <pjw@kernel.org>
Cc: Palmer Dabbelt <palmer@dabbelt.com>
Cc: linux-riscv@lists.infradead.org
---
arch/riscv/lib/csum.c | 4 +--
arch/x86/include/asm/uaccess.h | 82 ++++++++++++++++++++----------------------
scripts/Kconfig.toolchain | 5 ---
3 files changed, 41 insertions(+), 50 deletions(-)
diff --git a/arch/riscv/lib/csum.c b/arch/riscv/lib/csum.c
index c2b8986a0d39..cd461a7b61a5 100644
--- a/arch/riscv/lib/csum.c
+++ b/arch/riscv/lib/csum.c
@@ -142,7 +142,7 @@ do_csum_with_alignment(const unsigned char *buff, int len)
end = (const unsigned long *)(buff + len);
csum = do_csum_common(ptr, end, data);
-#ifdef CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT
+#ifdef CONFIG_CC_HAS_ASM_GOTO_OUTPUT
if (IS_ENABLED(CONFIG_RISCV_ISA_ZBB) &&
IS_ENABLED(CONFIG_TOOLCHAIN_HAS_ZBB) &&
riscv_has_extension_likely(RISCV_ISA_EXT_ZBB)) {
@@ -186,7 +186,7 @@ do_csum_with_alignment(const unsigned char *buff, int len)
return csum >> 16;
}
-#endif /* CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT */
+#endif /* CONFIG_CC_HAS_ASM_GOTO_OUTPUT */
#ifndef CONFIG_32BIT
csum += ror64(csum, 32);
csum >>= 32;
diff --git a/arch/x86/include/asm/uaccess.h b/arch/x86/include/asm/uaccess.h
index f4700ad6b5ec..64b648e59df0 100644
--- a/arch/x86/include/asm/uaccess.h
+++ b/arch/x86/include/asm/uaccess.h
@@ -248,6 +248,44 @@ do { \
: [umem] "m" (__m(addr)) \
: : label)
+#define __try_cmpxchg_user_asm(itype, ltype, _ptr, _pold, _new, label) ({ \
+ bool success; \
+ __typeof__(_ptr) _old = (__typeof__(_ptr))(_pold); \
+ __typeof__(*(_ptr)) __old = *_old; \
+ __typeof__(*(_ptr)) __new = (_new); \
+ asm_goto_output("\n" \
+ "1: " LOCK_PREFIX "cmpxchg"itype" %[new], %[ptr]\n"\
+ _ASM_EXTABLE_UA(1b, %l[label]) \
+ : "=@ccz" (success), \
+ [ptr] "+m" (*_ptr), \
+ [old] "+a" (__old) \
+ : [new] ltype (__new) \
+ : "memory" \
+ : label); \
+ if (unlikely(!success)) \
+ *_old = __old; \
+ likely(success); })
+
+#ifdef CONFIG_X86_32
+#define __try_cmpxchg64_user_asm(_ptr, _pold, _new, label) ({ \
+ bool success; \
+ __typeof__(_ptr) _old = (__typeof__(_ptr))(_pold); \
+ __typeof__(*(_ptr)) __old = *_old; \
+ __typeof__(*(_ptr)) __new = (_new); \
+ asm_goto_output("\n" \
+ "1: " LOCK_PREFIX "cmpxchg8b %[ptr]\n" \
+ _ASM_EXTABLE_UA(1b, %l[label]) \
+ : "=@ccz" (success), \
+ "+A" (__old), \
+ [ptr] "+m" (*_ptr) \
+ : "b" ((u32)__new), \
+ "c" ((u32)((u64)__new >> 32)) \
+ : "memory" \
+ : label); \
+ if (unlikely(!success)) \
+ *_old = __old; \
+ likely(success); })
+#endif // CONFIG_X86_32
#else // !CONFIG_CC_HAS_ASM_GOTO_OUTPUT
#ifdef CONFIG_X86_32
@@ -313,48 +351,6 @@ do { \
: [umem] "m" (__m(addr)), \
"0" (err))
-#endif // CONFIG_CC_HAS_ASM_GOTO_OUTPUT
-
-#ifdef CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT
-#define __try_cmpxchg_user_asm(itype, ltype, _ptr, _pold, _new, label) ({ \
- bool success; \
- __typeof__(_ptr) _old = (__typeof__(_ptr))(_pold); \
- __typeof__(*(_ptr)) __old = *_old; \
- __typeof__(*(_ptr)) __new = (_new); \
- asm_goto_output("\n" \
- "1: " LOCK_PREFIX "cmpxchg"itype" %[new], %[ptr]\n"\
- _ASM_EXTABLE_UA(1b, %l[label]) \
- : "=@ccz" (success), \
- [ptr] "+m" (*_ptr), \
- [old] "+a" (__old) \
- : [new] ltype (__new) \
- : "memory" \
- : label); \
- if (unlikely(!success)) \
- *_old = __old; \
- likely(success); })
-
-#ifdef CONFIG_X86_32
-#define __try_cmpxchg64_user_asm(_ptr, _pold, _new, label) ({ \
- bool success; \
- __typeof__(_ptr) _old = (__typeof__(_ptr))(_pold); \
- __typeof__(*(_ptr)) __old = *_old; \
- __typeof__(*(_ptr)) __new = (_new); \
- asm_goto_output("\n" \
- "1: " LOCK_PREFIX "cmpxchg8b %[ptr]\n" \
- _ASM_EXTABLE_UA(1b, %l[label]) \
- : "=@ccz" (success), \
- "+A" (__old), \
- [ptr] "+m" (*_ptr) \
- : "b" ((u32)__new), \
- "c" ((u32)((u64)__new >> 32)) \
- : "memory" \
- : label); \
- if (unlikely(!success)) \
- *_old = __old; \
- likely(success); })
-#endif // CONFIG_X86_32
-#else // !CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT
#define __try_cmpxchg_user_asm(itype, ltype, _ptr, _pold, _new, label) ({ \
int __err = 0; \
bool success; \
@@ -410,7 +406,7 @@ do { \
*_old = __old; \
likely(__result); })
#endif // CONFIG_X86_32
-#endif // CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT
+#endif // CONFIG_CC_HAS_ASM_GOTO_OUTPUT
/* FIXME: this hack is definitely wrong -AK */
struct __large_struct { unsigned long buf[100]; };
diff --git a/scripts/Kconfig.toolchain b/scripts/Kconfig.toolchain
index 6520a06a9103..9454ef5294d5 100644
--- a/scripts/Kconfig.toolchain
+++ b/scripts/Kconfig.toolchain
@@ -120,11 +120,6 @@ config CC_HAS_ASM_GOTO_OUTPUT
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)
--
2.56.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v2 5/6] Eliminate CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT
2026-11-12 0:52 ` [PATCH v2 5/6] Eliminate CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT Nathan Chancellor
@ 2026-11-12 11:34 ` Nicolas Schier
0 siblings, 0 replies; 13+ messages in thread
From: Nicolas Schier @ 2026-11-12 11:34 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm,
Linus Torvalds, Thomas Gleixner, Ingo Molnar, Borislav Petkov,
Dave Hansen, x86, H. Peter Anvin, Charlie Jenkins, Paul Walmsley,
Palmer Dabbelt, linux-riscv
On Wed, Nov 11, 2026 at 05:52:07PM -0700, Nathan Chancellor wrote:
> Commit 1aa0e8b144b6 ("Kconfig: Add option for asm goto w/ tied outputs
> to workaround clang-13 bug") added CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT to
> avoid a bug in clang's asm goto with outputs support when a tied output
> was used. The fix in clang was to match GCC's documented behavior.
>
> Now that the minimum supported version of clang has long been bumped
> past the version where the fix landed (clang-14), any compiler that
> satisfies the dependencies of CONFIG_CC_HAS_ASM_GOTO_OUTPUT will support
> tied outputs properly. Eliminate CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT in
> favor of just checking for CONFIG_CC_HAS_ASM_GOTO_OUTPUT directly.
>
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> ---
[...]
> diff --git a/scripts/Kconfig.toolchain b/scripts/Kconfig.toolchain
> index 6520a06a9103..9454ef5294d5 100644
> --- a/scripts/Kconfig.toolchain
> +++ b/scripts/Kconfig.toolchain
> @@ -120,11 +120,6 @@ config CC_HAS_ASM_GOTO_OUTPUT
> 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)
The comments reads as if gcc 8 to 10 are affected. Is the comment
somehow misleading, or should we still keep this until gcc-10 is the
minimum gcc version?
--
Nicolas
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v2 6/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks
2026-11-12 0:52 [PATCH v2 0/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks Nathan Chancellor
` (4 preceding siblings ...)
2026-11-12 0:52 ` [PATCH v2 5/6] Eliminate CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT Nathan Chancellor
@ 2026-11-12 0:52 ` Nathan Chancellor
2026-11-12 11:42 ` Nicolas Schier
5 siblings, 1 reply; 13+ messages in thread
From: Nathan Chancellor @ 2026-11-12 0:52 UTC (permalink / raw)
To: Nathan Chancellor, Nicolas Schier
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm
To make it easier to clean up unnecessary dynamic checks when the
minimum supported version of a toolchain component is updated, add
comments documenting when features were first supported. Request that
future additions document this as well.
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
---
scripts/Kconfig.toolchain | 64 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 63 insertions(+), 1 deletion(-)
diff --git a/scripts/Kconfig.toolchain b/scripts/Kconfig.toolchain
index 9454ef5294d5..608da5023504 100644
--- a/scripts/Kconfig.toolchain
+++ b/scripts/Kconfig.toolchain
@@ -1,4 +1,9 @@
# SPDX-License-Identifier: GPL-2.0-only
+# When adding a new dynamic check (such as {cc,ld}-option{,-str} or testing a
+# small program), please add a comment documenting the first version of the
+# tool that supported the feature being tested, ideally with a link to the tool
+# change as well. For cc-option{,-str}, note the "beware" comment below.
+
config CC_VERSION_TEXT
string
default "$(CC_VERSION_TEXT)"
@@ -118,12 +123,16 @@ config GCC_ASM_GOTO_OUTPUT_BROKEN
config CC_HAS_ASM_GOTO_OUTPUT
def_bool y
depends on !GCC_ASM_GOTO_OUTPUT_BROKEN
+ # gcc-11: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=e3b3b59683c1e7d31a9d313dd97394abebf644be
+ # clang-11: https://github.com/llvm/llvm-project/commit/50cac248773c3a023e8f6ceb9938bdd5e9f15da2
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 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
+ # gcc-9: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=5b76e75f760f3e4787851366359d5d50f989877c
+ # clang-11: https://github.com/llvm/llvm-project/commit/246398ece7115b57a02dbe7876d86ae8e72406ef
def_bool $(success,echo 'void foo(void) { asm inline (""); }' | $(CC) -x c - -c -o /dev/null)
config CC_HAS_ASSUME
@@ -156,6 +165,8 @@ config CC_HAS_ASSUME
# pitfall.
config CC_OPT_ZERO_INIT_PADDING_BITS
+ # gcc-15: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=0547dbb725b6d8e878a79e28a2e171eafcfbc1aa
+ # clang-20 does this by default without a flag: https://github.com/llvm/llvm-project/commit/7a086e1b2dc05f54afae3591614feede727601fa
def_string "$(cc-option-str,-fzero-init-padding-bits=all)"
config CC_OPT_NO_ADDRSIG
@@ -163,64 +174,109 @@ config CC_OPT_NO_ADDRSIG
def_string "-fno-addrsig" if CC_IS_CLANG
config CC_OPT_DIAGNOSTICS_SHOW_CONTEXT
+ # gcc-16: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=6faa3cfe60ff9769d1bebfffdd2c7325217d7389
+ # clang: not supported
def_string "$(cc-option-str,-fdiagnostics-show-context=2)"
config CC_OPT_DIAGNOSTICS_SHOW_INLINING_CHAIN
+ # clang-23: https://github.com/llvm/llvm-project/commit/f9ad232421e37e4168f6937abdd0a1665a590f12
+ # gcc: not needed, it does this by default
def_string "$(cc-option-str,-fdiagnostics-show-inlining-chain)"
config CC_OPT_STRICT_FLEX_ARRAYS
+ # gcc-13: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=1879e48f3d8595bc9e7f583bbd12df3c6f5c42dc
+ # clang-16: https://github.com/llvm/llvm-project/commit/7f93ae808634e33e4dc9bce753c909aa5f9a6eb4
def_string "$(cc-option-str,-fstrict-flex-arrays=3)"
config CC_OPT_NO_ALLOW_STORE_DATA_RACES
- # gcc-10 renamed --param=allow-store-data-races=0 to -fno-allow-store-data-races
+ # gcc-10 renamed --param=allow-store-data-races=0 to -fno-allow-store-data-races:
+ # https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=e622a32db78300821fc1327637ec6413febc2c66
+ # clang: not needed
def_string "$(cc-option-str,-fno-allow-store-data-races,--param=allow-store-data-races=0)" if CC_IS_GCC
config CC_HAS_MNOP_MCOUNT
+ # s390 support
+ # gcc-9: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=79c2f6d7de59d5580d224b491d5600d20e3101fe
+ # clang-10: https://github.com/llvm/llvm-project/commit/93767143147b7d765c6ce8123a4226d449228649
+ # x86 support
+ # gcc-5: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=ecc81e33123d7ac9c11742161e128858d844b99d
+ # clang-24: https://github.com/llvm/llvm-project/commit/f514b16972f785fdd3fad1d19195aad5c9324fb5
def_bool $(cc-option,-mnop-mcount)
config LD_OPT_FORCE_GROUP_ALLOCATION
+ # GNU ld 2.29: https://sourceware.org/git/gitweb.cgi?h=7bdf4127c38081c7764c0bf1db55d0b2e56391dc&p=binutils-gdb.git
+ # ld.lld 19: https://github.com/llvm/llvm-project/commit/4d9020ca0b125a936d5e26b48f07fcfa4bd78004
def_string "$(ld-option-str,--force-group-allocation)"
config LD_OPT_NO_WARN_RWX_SEGMENTS
+ # GNU ld 2.39: https://sourceware.org/git/gitweb.cgi?h=ba951afb99912da01a6e8434126b8fac7aa75107&p=binutils-gdb.git
+ # ld.lld: not supported
def_string "$(ld-option-str,--no-warn-rwx-segments)"
config CC_OPT_WNO_ADDRESS_OF_PACKED_MEMBER
+ # gcc-9: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=da77eace90fd99b38cd89ce281033d86ebfda434
+ # clang-4: https://github.com/llvm/llvm-project/commit/585ea9ddce50f3c3d3fd6dae0f9f148c074bcc2b
def_string "$(cc-option-str,-Wno-address-of-packed-member)"
config CC_OPT_WNO_FORMAT_OVERFLOW_NON_KPRINTF
+ # clang-18: https://github.com/llvm/llvm-project/commit/56c3b8e997d065b568964f71715ecbbd28c2e4a4
+ # gcc: not needed, it has this behavior by default
def_string "$(cc-option-str,-Wno-format-overflow-non-kprintf)"
config CC_OPT_WNO_FORMAT_TRUNCATION_NON_KPRINTF
+ # clang-18: https://github.com/llvm/llvm-project/commit/56c3b8e997d065b568964f71715ecbbd28c2e4a4
+ # gcc: not needed, it has this behavior by default
def_string "$(cc-option-str,-Wno-format-truncation-non-kprintf)"
config CC_OPT_WNO_DEFAULT_CONST_INIT_UNSAFE
+ # clang-21: https://github.com/llvm/llvm-project/commit/00f9ef282c7482754a0fea497417604d1deca9fa
+ # gcc: not supported
def_string "$(cc-option-str,-Wno-default-const-init-unsafe)"
config CC_OPT_WNO_DANGLING_POINTER
+ # gcc-12: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=9d6a0f388eb048f8d87f47af78f07b5ce513bfe6
+ # clang: not supported
def_string "$(cc-option-str,-Wno-dangling-pointer)"
config CC_OPT_WVLA_LARGER_THAN
+ # gcc-7 for -Wvla-larger-than=: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=adc577c558a4b2e3b604511927cce17039d57c11
+ # gcc-9 for -Wvla-larger-than=0: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=00abf86c47606f8220d6508654ef52ef11d76e3d
+ # clang: not supported
def_string "$(cc-option-str,-Wvla-larger-than=1)"
config CC_HAS_WSTRINGOP_OVERFLOW
+ # gcc-7: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=ee92e7bafb52d267f52e4c48edada5f279bcf591
+ # clang: not supported
def_bool $(cc-option,-Wstringop-overflow)
config CC_OPT_WNO_UNTERMINATED_STRING_INITIALIZATION
+ # gcc-15: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=44c9403ed1833ae71a59e84f9e37af3182be0df5
+ # clang-21: https://github.com/llvm/llvm-project/commit/e8ae77947154e10dbc05cbb95ec9e10d3b0be13e
def_string "$(cc-option-str,-Wno-unterminated-string-initialization)"
config CC_OPT_WERROR_DESIGNATED_INIT
+ # gcc-5: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=976d5a222fc23279e239ad926472c7810869e494
+ # clang: not supported
def_string "$(cc-option-str,-Werror=designated-init)"
config CC_OPT_WENUM_CONVERSION
+ # gcc-10: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=68e2c1996ec6bde27363ce0db15233ac8cae1c4d
+ # clang-3.2: https://github.com/llvm/llvm-project/commit/68e2c7bee3ab337cc3134ff99fdd1ce2ddb33c2f
def_string "$(cc-option-str,-Wenum-conversion)"
config CC_OPT_WNO_PACKED_NOT_ALIGNED
+ # gcc-8: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=00aa1fa221744dc57f6c6cea8baa669b732d1101
+ # clang: not supported
def_string "$(cc-option-str,-Wno-packed-not-aligned)"
config CC_OPT_WNO_FORMAT_OVERFLOW
+ # gcc-7: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=bce6f76013fd5f2e88a235231231c7879597220c
+ # clang-18: https://github.com/llvm/llvm-project/commit/56c3b8e997d065b568964f71715ecbbd28c2e4a4
def_string "$(cc-option-str,-Wno-format-overflow)"
config CC_OPT_WNO_STRINGOP_TRUNCATION
+ # gcc-8: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=025d57f037ad13eb479818b677ef4be4d97b639c
+ # clang: not supported
def_string "$(cc-option-str,-Wno-stringop-truncation)"
config CC_HAS_COUNTED_BY
@@ -247,14 +303,20 @@ config CC_HAS_BROKEN_COUNTED_BY_REF
default y if CC_IS_CLANG && CLANG_VERSION < 220100
config CC_HAS_ALLOC_TOKEN
+ # clang-22: https://github.com/llvm/llvm-project/commit/774ffe5cce7392e6b4e29c83e725337727c2c994
+ # gcc: not supported
def_bool $(cc-option,-falloc-token-max=123)
config CC_HAS_MULTIDIMENSIONAL_NONSTRING
+ # gcc-15: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=ab714e60870d1bb98039652b760918b5e680ac10
+ # clang-21: https://github.com/llvm/llvm-project/commit/3d4f979e271d2a1fe0906f4d1b16db108838f98f
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
+ # gcc-14: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=1ff6d9f7428b0668cd8ab0b3e3ab94f1d733124d
default "-finline-stringops=memset" if $(cc-option,-finline-stringops=memset)
+ # clang-22: https://github.com/llvm/llvm-project/commit/b28eeb28bea39148738dc375e8a97072a1907e64
default "-mllvm -max-store-memset=4294967294" if $(cc-option,-mllvm -max-store-memset=4294967294)
config LD_CAN_USE_KEEP_IN_OVERLAY
--
2.56.0
^ permalink raw reply related [flat|nested] 13+ messages in thread* Re: [PATCH v2 6/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks
2026-11-12 0:52 ` [PATCH v2 6/6] scripts/Kconfig.toolchain: Document minimum supported versions for dynamic checks Nathan Chancellor
@ 2026-11-12 11:42 ` Nicolas Schier
0 siblings, 0 replies; 13+ messages in thread
From: Nicolas Schier @ 2026-11-12 11:42 UTC (permalink / raw)
To: Nathan Chancellor
Cc: Julian Braha, Nick Desaulniers, Bill Wendling, Justin Stitt,
Arnd Bergmann, Kees Cook, linux-kernel, linux-kbuild, llvm
On Wed, Nov 11, 2026 at 05:52:08PM -0700, Nathan Chancellor wrote:
> To make it easier to clean up unnecessary dynamic checks when the
> minimum supported version of a toolchain component is updated, add
> comments documenting when features were first supported. Request that
> future additions document this as well.
>
> Signed-off-by: Nathan Chancellor <nathan@kernel.org>
> ---
> scripts/Kconfig.toolchain | 64 ++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 63 insertions(+), 1 deletion(-)
>
Great, I really appreciate that. Thanks a million!
Acked-by: Nicolas Schier <nsc@kernel.org>
--
Nicolas
^ permalink raw reply [flat|nested] 13+ messages in thread