[glibc] i386: Replace inline asm rotates in pointer_guard with stdc_rotate_{left, right}

Uros Bizjak via Glibc-cvs <[email protected]> Thu, 7 May 2026 18:07:09 +0000 (GMT)
Newsgroups gmane.comp.lib.glibc.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=1a70b352c3b4f54661cf93545ddb506a3531e3e7

commit 1a70b352c3b4f54661cf93545ddb506a3531e3e7
Author: Uros Bizjak <[email protected]>
Date:   Wed May 6 17:07:54 2026 +0200

    i386: Replace inline asm rotates in pointer_guard with stdc_rotate_{left,right}
    
    Use the C23 <stdbit.h> rotation helpers instead of inline assembly
    for pointer mangling and demangling on i386.
    
    The PTR_MANGLE and PTR_DEMANGLE macros previously used rol/ror
    inline asm with a constant rotation of 9. 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 <[email protected]>
    Reviewed-by: Adhemerval Zanella  <[email protected]>

Diff:
---
 sysdeps/unix/sysv/linux/i386/pointer_guard.h | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/sysdeps/unix/sysv/linux/i386/pointer_guard.h b/sysdeps/unix/sysv/linux/i386/pointer_guard.h
index 7c142fb526..c8311be444 100644
--- a/sysdeps/unix/sysv/linux/i386/pointer_guard.h
+++ b/sysdeps/unix/sysv/linux/i386/pointer_guard.h
@@ -33,16 +33,19 @@
 #  define PTR_DEMANGLE(reg)	rorl $9, reg;				      \
 				xorl %gs:POINTER_GUARD, reg
 # else
+#  include <stdbit.h>
 #  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));					      \
+      (var) = (__typeof (var)) stdc_rotate_left ((uintptr_t) (var),	      \
+						 2 * sizeof (uintptr_t) + 1); \
     } while (0)
 #  define PTR_DEMANGLE(var)						      \
     do {								      \
-      asm ("rorl $9, %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_gs *)0)->pointer_guard);  \
     } while (0)