[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