]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86_64: Replace inline asm rotates in pointer_guard with stdc_rotate_{left,right}
authorUros Bizjak <ubizjak@gmail.com>
Wed, 6 May 2026 15:05:46 +0000 (17:05 +0200)
committerUros Bizjak <ubizjak@gmail.com>
Thu, 7 May 2026 18:04:24 +0000 (20:04 +0200)
Use the C23 <stdbit.h> rotation helpers instead of inline assembly
for pointer mangling and demangling on x86_64.

The PTR_MANGLE and PTR_DEMANGLE macros previously used rol/ror
inline asm with a constant rotation of 2 * LP_SIZE + 1. Replace
these with stdc_rotate_left and stdc_rotate_right operating on
uintptr_t, preserving the exact rotation count via
2 * sizeof (uintptr_t) + 1.

This change removes inline assembly, improves portability and
readability and lets the compiler select optimal code generation.

No functional change intended.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
sysdeps/unix/sysv/linux/x86_64/pointer_guard.h

index 898a2dd3ed94f87d4cec88a06c41046989e9ae3a..4f7abc64f49e6c6ee247f5d9283480c47a96e8d1 100644 (file)
 #  define PTR_DEMANGLE(reg)    ror $2*LP_SIZE+1, reg;                        \
                                xor __pointer_chk_guard_local(%rip), reg
 # else
+#  include <stdbit.h>
 #  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));                         \
+      (var) = (__typeof (var)) stdc_rotate_left ((uintptr_t) (var),          \
+                                                2 * sizeof (uintptr_t) + 1); \
     } while (0)
 #  define PTR_DEMANGLE(var)                                                  \
     do {                                                                     \
-      asm ("ror $2*" LP_SIZE "+1, %0" : "+r" (var));                         \
+      (var) = (__typeof (var)) stdc_rotate_right ((uintptr_t) (var),         \
+                                                 2 * sizeof (uintptr_t) + 1); \
       (var) = (__typeof (var)) ((uintptr_t) (var)                            \
                                ^ __pointer_chk_guard_local);                 \
     } while (0)
@@ -53,16 +56,19 @@ extern uintptr_t __pointer_chk_guard_local attribute_relro attribute_hidden;
 #  define PTR_DEMANGLE(reg)    ror $2*LP_SIZE+1, reg;                        \
                                xor %fs:POINTER_GUARD, reg
 # else
+#  include <stdbit.h>
 #  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));                         \
+      (var) = (__typeof (var)) stdc_rotate_left ((uintptr_t) (var),          \
+                                                2 * sizeof (uintptr_t) + 1); \
     } while (0)
 #  define PTR_DEMANGLE(var)                                                  \
     do {                                                                     \
-      asm ("ror $2*" LP_SIZE "+1, %0" : "+r" (var));                         \
+      (var) = (__typeof (var)) stdc_rotate_right ((uintptr_t) (var),         \
+                                                 2 * sizeof (uintptr_t) + 1); \
       (var) = (__typeof (var)) ((uintptr_t) (var)                            \
                                ^ ((tcbhead_t __seg_fs *)0)->pointer_guard);  \
     } while (0)