[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