[PATCH 2/2] i386: Use __seg_gs qualifiers in PTR_{MANGLE, DEMANGLE}() macros

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


On Fri, Oct 10, 2025 at 3:18 AM Uros Bizjak <ubizjak@gmail.com> wrote:
>
> Use __seg_gs 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 105 to 94 and
> decreasing the text size of the library by 280 bytes.
>
> While at it, fix a few trivial whitespace issues as well
>
> Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
> ---
>  sysdeps/unix/sysv/linux/i386/pointer_guard.h | 31 +++++++++++---------
>  1 file changed, 17 insertions(+), 14 deletions(-)
>
> diff --git a/sysdeps/unix/sysv/linux/i386/pointer_guard.h b/sysdeps/unix/sysv/linux/i386/pointer_guard.h
> index ae27c82a62..0162178f47 100644
> --- a/sysdeps/unix/sysv/linux/i386/pointer_guard.h
> +++ b/sysdeps/unix/sysv/linux/i386/pointer_guard.h
> @@ -28,21 +28,24 @@
>  # include <sysdeps/generic/pointer_guard.h>
>  #else
>  # ifdef __ASSEMBLER__
> -#  define PTR_MANGLE(reg)       xorl %gs:POINTER_GUARD, reg;                  \
> -                                roll $9, reg
> -#  define PTR_DEMANGLE(reg)     rorl $9, reg;                                 \
> -                                xorl %gs:POINTER_GUARD, reg
> +#  define PTR_MANGLE(reg)      xorl %gs:POINTER_GUARD, reg;                  \
> +                               roll $9, reg
> +#  define PTR_DEMANGLE(reg)    rorl $9, reg;                                 \
> +                               xorl %gs:POINTER_GUARD, reg
>  # else
> -#  define PTR_MANGLE(var)       asm ("xorl %%gs:%c2, %0\n"                    \
> -                                     "roll $9, %0"                            \
> -                                     : "=r" (var)                             \
> -                                     : "0" (var),                             \
> -                                       "i" (POINTER_GUARD))
> -#  define PTR_DEMANGLE(var)     asm ("rorl $9, %0\n"                          \
> -                                     "xorl %%gs:%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_gs *)0)->pointer_guard);  \
> +      asm ("roll $9, %0" : "+r" (var));                                              \
> +    } while (0)
> +#  define PTR_DEMANGLE(var) do                                               \
> +    {                                                                        \
> +      asm ("rorl $9, %0" : "+r" (var));                                              \
> +      (var) = (__typeof (var)) ((uintptr_t) (var)                            \
> +                               ^ ((tcbhead_t __seg_gs *)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