[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