[PATCH 1/2] x86_64: Use __seg_fs qualifiers in PTR_{MANGLE,DEMANGLE}() macros

H.J. Lu hjl.tools@gmail.com
Sun Oct 12 00:31:07 GMT 2025


On Fri, Oct 10, 2025 at 3:18 AM Uros Bizjak <ubizjak@gmail.com> wrote:
>
> Use __seg_fs named address space qualifiers in PTR_MANGLE() and
> PTR_DEMANGLE() macros to access the pointer_guard field in the TCB.
>
> This change allows the compiler to eliminate redundant reads of
> the variable, reducing the number of reads from 98 to 89 and
> decreasing the text size of the library by 512 bytes.
>
> While at it, fix a few trivial whitespace issues as well.
>
> Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
> ---
>  .../unix/sysv/linux/x86_64/pointer_guard.h    | 59 +++++++++++--------
>  1 file changed, 35 insertions(+), 24 deletions(-)
>
> diff --git a/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h b/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h
> index 9cf79a4703..485066d64d 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h
> +++ b/sysdeps/unix/sysv/linux/x86_64/pointer_guard.h
> @@ -26,35 +26,46 @@
>  /* We cannot use the thread descriptor because in ld.so we use setjmp
>     earlier than the descriptor is initialized.  */
>  # ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(reg)       xor __pointer_chk_guard_local(%rip), reg;    \
> -                                rol $2*LP_SIZE+1, reg
> -#  define PTR_DEMANGLE(reg)     ror $2*LP_SIZE+1, reg;                       \
> -                                xor __pointer_chk_guard_local(%rip), reg
> +#  define PTR_MANGLE(reg)      xor __pointer_chk_guard_local(%rip), reg;     \
> +                               rol $2*LP_SIZE+1, reg
> +#  define PTR_DEMANGLE(reg)    ror $2*LP_SIZE+1, reg;                        \
> +                               xor __pointer_chk_guard_local(%rip), reg
>  # else
> -#  define PTR_MANGLE(reg)       asm ("xor __pointer_chk_guard_local(%%rip), %0\n" \
> -                                     "rol $2*" LP_SIZE "+1, %0"                   \
> -                                     : "=r" (reg) : "0" (reg))
> -#  define PTR_DEMANGLE(reg)     asm ("ror $2*" LP_SIZE "+1, %0\n"                 \
> -                                     "xor __pointer_chk_guard_local(%%rip), %0"   \
> -                                     : "=r" (reg) : "0" (reg))
> +#  include <stdint.h>
> +extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
> +#  define PTR_MANGLE(var) do                                                 \
> +    {                                                                        \
> +      (var) = (__typeof (var)) ((uintptr_t) (var)                            \
> +                               ^ __pointer_chk_guard_local);                 \
> +      asm ("rol $2*" LP_SIZE "+1, %0" : "+r" (var));                         \
> +    } while (0)
> +#  define PTR_DEMANGLE(var) do                                               \
> +    {                                                                        \
> +      asm ("ror $2*" LP_SIZE "+1, %0" : "+r" (var));                         \
> +      (var) = (__typeof (var)) ((uintptr_t) (var)                            \
> +                               ^ __pointer_chk_guard_local);                 \
> +    } while (0)
>  # endif
>  #else
>  # ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(reg)       xor %fs:POINTER_GUARD, reg;                   \
> -                                rol $2*LP_SIZE+1, reg
> -#  define PTR_DEMANGLE(reg)     ror $2*LP_SIZE+1, reg;                        \
> -                                xor %fs:POINTER_GUARD, reg
> +#  define PTR_MANGLE(reg)      xor %fs:POINTER_GUARD, reg;                   \
> +                               rol $2*LP_SIZE+1, reg
> +#  define PTR_DEMANGLE(reg)    ror $2*LP_SIZE+1, reg;                        \
> +                               xor %fs:POINTER_GUARD, reg
>  # else
> -#  define PTR_MANGLE(var)       asm ("xor %%fs:%c2, %0\n"                     \
> -                                     "rol $2*" LP_SIZE "+1, %0"               \
> -                                     : "=r" (var)                             \
> -                                     : "0" (var),                             \
> -                                       "i" (POINTER_GUARD))
> -#  define PTR_DEMANGLE(var)     asm ("ror $2*" LP_SIZE "+1, %0\n"             \
> -                                     "xor %%fs:%c2, %0"                       \
> -                                     : "=r" (var)                             \
> -                                     : "0" (var),                             \
> -                                       "i" (POINTER_GUARD))
> +#  include <tls.h>
> +#  define PTR_MANGLE(var) do                                                 \
> +    {                                                                        \
> +      (var) = (__typeof (var)) ((uintptr_t) (var)                            \
> +                               ^ ((tcbhead_t __seg_fs *)0)->pointer_guard);  \
> +      asm ("rol $2*" LP_SIZE "+1, %0" : "+r" (var));                         \
> +    } while (0)
> +#  define PTR_DEMANGLE(var) do                                               \
> +    {                                                                        \
> +      asm ("ror $2*" LP_SIZE "+1, %0" : "+r" (var));                         \
> +      (var) = (__typeof (var)) ((uintptr_t) (var)                            \
> +                               ^ ((tcbhead_t __seg_fs *)0)->pointer_guard);  \
> +    } while (0)
>  # endif
>  #endif
>
> --
> 2.51.0
>

LGTM.

Reviewed-by: H.J. Lu <hjl.tools@gmail.com>

Thanks.

-- 
H.J.


More information about the Libc-alpha mailing list