[PATCH v2 4/4] x86: Use typeof_member style in RSEQ area access expressions

Uros Bizjak ubizjak@gmail.com
Sun Sep 28 19:23:49 GMT 2025


Update RSEQ access macros to use `((struct rseq_area *)0)->member`
in _Static_assert and __typeof expressions, instead of
RSEQ_SELF()->member.  This adopts the typeof_member style, avoiding
reliance on RSEQ_SELF for compile-time expressions.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
---
 sysdeps/i386/nptl/rseq-access.h       | 20 ++++++++++----------
 sysdeps/x86_64/64/nptl/rseq-access.h  | 24 ++++++++++++------------
 sysdeps/x86_64/x32/nptl/rseq-access.h | 12 ++++++------
 3 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/sysdeps/i386/nptl/rseq-access.h b/sysdeps/i386/nptl/rseq-access.h
index 753152cb58..0dd0cbb180 100644
--- a/sysdeps/i386/nptl/rseq-access.h
+++ b/sysdeps/i386/nptl/rseq-access.h
@@ -19,9 +19,9 @@
 /* Read member of the RSEQ area directly.  */
 #define RSEQ_GETMEM(member) \
   ({									      \
-     _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
-		     || sizeof (RSEQ_SELF()->member) == 4		      \
-		     || sizeof (RSEQ_SELF()->member) == 8,		      \
+     _Static_assert (sizeof (((struct rseq_area *)0)->member) == 1	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 4	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 8,	      \
 		     "size of rseq data");				      \
      ((struct rseq_area __seg_gs *)__rseq_offset)->member;		      \
   })
@@ -31,8 +31,8 @@
    x86-32.  */
 #define RSEQ_GETMEM_ONCE(member) \
   ({									      \
-     _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
-		     || sizeof (RSEQ_SELF()->member) == 4,		      \
+     _Static_assert (sizeof (((struct rseq_area *)0)->member) == 1	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 4,	      \
 		     "size of rseq data");				      \
      ((volatile struct rseq_area __seg_gs *)__rseq_offset)->member;	      \
   })
@@ -40,9 +40,9 @@
 /* Set member of the RSEQ area directly.  */
 #define RSEQ_SETMEM(member, value) \
   ({									      \
-     _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
-		     || sizeof (RSEQ_SELF()->member) == 4		      \
-		     || sizeof (RSEQ_SELF()->member) == 8,		      \
+     _Static_assert (sizeof (((struct rseq_area *)0)->member) == 1	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 4	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 8,	      \
 		     "size of rseq data");				      \
      ((struct rseq_area __seg_gs *)__rseq_offset)->member = (value);	      \
   })
@@ -52,8 +52,8 @@
    x86-32.  */
 #define RSEQ_SETMEM_ONCE(member, value) \
   ({									      \
-     _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
-		     || sizeof (RSEQ_SELF()->member) == 4,		      \
+     _Static_assert (sizeof (((struct rseq_area *)0)->member) == 1	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 4,	      \
 		     "size of rseq data");				      \
      ((volatile struct rseq_area __seg_gs *)__rseq_offset)->member = (value); \
   })
diff --git a/sysdeps/x86_64/64/nptl/rseq-access.h b/sysdeps/x86_64/64/nptl/rseq-access.h
index 64e5b8d712..1b1699cebf 100644
--- a/sysdeps/x86_64/64/nptl/rseq-access.h
+++ b/sysdeps/x86_64/64/nptl/rseq-access.h
@@ -19,9 +19,9 @@
 /* Read member of the RSEQ area directly.  */
 #define RSEQ_GETMEM(member) \
   ({									      \
-     _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
-		     || sizeof (RSEQ_SELF()->member) == 4		      \
-		     || sizeof (RSEQ_SELF()->member) == 8,		      \
+     _Static_assert (sizeof (((struct rseq_area *)0)->member) == 1	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 4	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 8,	      \
 		     "size of rseq data");				      \
      ((struct rseq_area __seg_fs *)__rseq_offset)->member;		      \
   })
@@ -29,9 +29,9 @@
 /* Read member of the RSEQ area directly, with single-copy atomicity semantics.  */
 #define RSEQ_GETMEM_ONCE(member) \
   ({									      \
-     _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
-		     || sizeof (RSEQ_SELF()->member) == 4		      \
-		     || sizeof (RSEQ_SELF()->member) == 8,		      \
+     _Static_assert (sizeof (((struct rseq_area *)0)->member) == 1	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 4	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 8,	      \
 		     "size of rseq data");				      \
      ((volatile struct rseq_area __seg_fs *)__rseq_offset)->member;	      \
   })
@@ -39,9 +39,9 @@
 /* Set member of the RSEQ area directly.  */
 #define RSEQ_SETMEM(member, value) \
   ({									      \
-     _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
-		     || sizeof (RSEQ_SELF()->member) == 4		      \
-		     || sizeof (RSEQ_SELF()->member) == 8,		      \
+     _Static_assert (sizeof (((struct rseq_area *)0)->member) == 1	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 4	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 8,	      \
 		     "size of rseq data");				      \
      ((struct rseq_area __seg_fs *)__rseq_offset)->member = (value);	      \
   })
@@ -49,9 +49,9 @@
 /* Set member of the RSEQ area directly, with single-copy atomicity semantics.  */
 #define RSEQ_SETMEM_ONCE(member, value) \
   ({									      \
-     _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
-		     || sizeof (RSEQ_SELF()->member) == 4		      \
-		     || sizeof (RSEQ_SELF()->member) == 8,		      \
+     _Static_assert (sizeof (((struct rseq_area *)0)->member) == 1	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 4	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 8,	      \
 		     "size of rseq data");				      \
      ((volatile struct rseq_area __seg_fs *)__rseq_offset)->member = (value); \
   })
diff --git a/sysdeps/x86_64/x32/nptl/rseq-access.h b/sysdeps/x86_64/x32/nptl/rseq-access.h
index d9bb215c35..707f8a685a 100644
--- a/sysdeps/x86_64/x32/nptl/rseq-access.h
+++ b/sysdeps/x86_64/x32/nptl/rseq-access.h
@@ -19,7 +19,7 @@
 /* Read member of the RSEQ area directly, with single-copy atomicity semantics.  */
 #define RSEQ_GETMEM_ONCE(member) \
   ({									      \
-     __typeof (RSEQ_SELF()->member) __value;				      \
+     __typeof (((struct rseq_area *)0)->member) __value;		      \
      _Static_assert (sizeof (__value) == 1				      \
 		     || sizeof (__value) == 4				      \
 		     || sizeof (__value) == 8,				      \
@@ -59,18 +59,18 @@
 /* Set member of the RSEQ area directly, with single-copy atomicity semantics.  */
 #define RSEQ_SETMEM_ONCE(member, value) \
   ({									      \
-     _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
-		     || sizeof (RSEQ_SELF()->member) == 4		      \
-		     || sizeof (RSEQ_SELF()->member) == 8,		      \
+     _Static_assert (sizeof (((struct rseq_area *)0)->member) == 1	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 4	      \
+		     || sizeof (((struct rseq_area *)0)->member) == 8,	      \
 		     "size of rseq data");				      \
-     if (sizeof (RSEQ_SELF()->member) == 1)				      \
+     if (sizeof (((struct rseq_area *)0)->member) == 1)			      \
        asm volatile ("movb %0,%%fs:%c1(%2)"				      \
 		     :							      \
 		     : "iq" ((uint8_t) cast_to_integer (value)),	      \
 		       "i" (offsetof (struct rseq_area, member)),	      \
 		       "r" ((long long int) __rseq_offset)		      \
 		     : "memory");					      \
-     else if (sizeof (RSEQ_SELF()->member) == 4)			      \
+     else if (sizeof (((struct rseq_area *)0)->member) == 4)		      \
        asm volatile ("movl %0,%%fs:%c1(%2)"				      \
 		     :							      \
 		     : IMM_MODE ((uint32_t) cast_to_integer (value)),	      \
-- 
2.51.0



More information about the Libc-alpha mailing list