[PATCH] ARM: Thumb2: avoid __builtin_thread_pointer() on Clang

Nathan Chancellor nathan at kernel.org
Thu Oct 28 09:32:29 PDT 2021


On Thu, Oct 28, 2021 at 10:35:27AM +0200, Ard Biesheuvel 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>

Reviewed-by: Nathan Chancellor <nathan at kernel.org>
Tested-by: Nathan Chancellor <nathan at kernel.org>

> ---
>  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
> 



More information about the linux-arm-kernel mailing list