[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)