[PATCH] ARM: Thumb2: avoid __builtin_thread_pointer() on Clang
Nick Desaulniers
ndesaulniers at google.com
Thu Oct 28 09:25:18 PDT 2021
On Thu, Oct 28, 2021 at 1:36 AM Ard Biesheuvel <ardb at kernel.org> wrote:
>
> If available, we use the __builtin_thread_pointer() helper to get the
> value of the TLS register, to help the compiler understand that it
> doesn't need to reload it every time we access 'current'.
>
> Unfortunately, Clang fails to emit the MRC system register read
> directly when building for Thumb2, and instead, it issues a call to the
> __aeabi_read_tp helper, which the kernel does not provide, and so this
> result in link failures at build time.
>
> So create a special case for this, and emit the MRC directly using an
> asm() block, just like we do when the helper is not available to begin
> with.
>
> Link: https://github.com/ClangBuiltLinux/linux/issues/1485
> Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
Thanks for the patch.
Reviewed-by: Nick Desaulniers <ndesaulniers at google.com>
Note that the fix will ship in clang-14; the backport Nathan has
requested in https://bugs.llvm.org/show_bug.cgi?id=52329 technically
hasn't landed yet in 13.0.1. I don't foresee any issues there getting
the backport accepted into 13.0.1 quickly, but wanted to mention since
it should be ok to apply this patch to get clang-10, -11, -12, builds
green again while there might be another couple days of -13 breakage
until the backport actually lands.
> ---
> arch/arm/include/asm/current.h | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/include/asm/current.h b/arch/arm/include/asm/current.h
> index 1d472fa7697b..6bf0aad672c3 100644
> --- a/arch/arm/include/asm/current.h
> +++ b/arch/arm/include/asm/current.h
> @@ -26,12 +26,17 @@ static inline struct task_struct *get_current(void)
> {
> struct task_struct *cur;
>
> -#if __has_builtin(__builtin_thread_pointer)
> +#if __has_builtin(__builtin_thread_pointer) && \
> + !(defined(CONFIG_THUMB2_KERNEL) && \
> + defined(CONFIG_CC_IS_CLANG) && CONFIG_CLANG_VERSION < 130001)
> /*
> * Use the __builtin helper when available - this results in better
> * code, especially when using GCC in combination with the per-task
> * stack protector, as the compiler will recognize that it needs to
> * load the TLS register only once in every function.
> + *
> + * Clang < 13.0.1 gets this wrong for Thumb2 builds:
> + * https://github.com/ClangBuiltLinux/linux/issues/1485
> */
> cur = __builtin_thread_pointer();
> #else
> --
> 2.30.2
>
--
Thanks,
~Nick Desaulniers
More information about the linux-arm-kernel
mailing list