[PATCH v3 3/4] x86: Simplify RSEQ area access expressions

Uros Bizjak ubizjak@gmail.com
Wed Oct 1 12:30:14 GMT 2025


Replace manual cast with a direct
`(struct rseq_area __seg_gs *)__rseq_offset` dereference to access
`member`.  This avoids redundant `offsetof(struct rseq_area, member)`
and improves readability while preserving semantics.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
---
v2: Add volatile to the inner cast and drop the outer cast.
---
 sysdeps/i386/nptl/rseq-access.h      | 12 ++++--------
 sysdeps/x86_64/64/nptl/rseq-access.h | 12 ++++--------
 2 files changed, 8 insertions(+), 16 deletions(-)

diff --git a/sysdeps/i386/nptl/rseq-access.h b/sysdeps/i386/nptl/rseq-access.h
index ee78c6198d..753152cb58 100644
--- a/sysdeps/i386/nptl/rseq-access.h
+++ b/sysdeps/i386/nptl/rseq-access.h
@@ -23,8 +23,7 @@
 		     || sizeof (RSEQ_SELF()->member) == 4		      \
 		     || sizeof (RSEQ_SELF()->member) == 8,		      \
 		     "size of rseq data");				      \
-     (*(__typeof (RSEQ_SELF()->member) __seg_gs *)			      \
-      (__rseq_offset + offsetof (struct rseq_area, member)));		      \
+     ((struct rseq_area __seg_gs *)__rseq_offset)->member;		      \
   })
 
 /* Read member of the RSEQ area directly, with single-copy atomicity semantics.
@@ -35,8 +34,7 @@
      _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
 		     || sizeof (RSEQ_SELF()->member) == 4,		      \
 		     "size of rseq data");				      \
-     (*(volatile __typeof (RSEQ_SELF()->member) __seg_gs *)		      \
-      (__rseq_offset + offsetof (struct rseq_area, member)));		      \
+     ((volatile struct rseq_area __seg_gs *)__rseq_offset)->member;	      \
   })
 
 /* Set member of the RSEQ area directly.  */
@@ -46,8 +44,7 @@
 		     || sizeof (RSEQ_SELF()->member) == 4		      \
 		     || sizeof (RSEQ_SELF()->member) == 8,		      \
 		     "size of rseq data");				      \
-     (*(__typeof (RSEQ_SELF()->member) __seg_gs *)			      \
-      (__rseq_offset + offsetof (struct rseq_area, member)) = (value));	      \
+     ((struct rseq_area __seg_gs *)__rseq_offset)->member = (value);	      \
   })
 
 /* Set member of the RSEQ area directly, with single-copy atomicity semantics.
@@ -58,6 +55,5 @@
      _Static_assert (sizeof (RSEQ_SELF()->member) == 1			      \
 		     || sizeof (RSEQ_SELF()->member) == 4,		      \
 		     "size of rseq data");				      \
-     (*(volatile __typeof (RSEQ_SELF()->member) __seg_gs *)		      \
-      (__rseq_offset + offsetof (struct rseq_area, member)) = (value));	      \
+     ((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 214cb96797..64e5b8d712 100644
--- a/sysdeps/x86_64/64/nptl/rseq-access.h
+++ b/sysdeps/x86_64/64/nptl/rseq-access.h
@@ -23,8 +23,7 @@
 		     || sizeof (RSEQ_SELF()->member) == 4		      \
 		     || sizeof (RSEQ_SELF()->member) == 8,		      \
 		     "size of rseq data");				      \
-     (*(__typeof (RSEQ_SELF()->member) __seg_fs *)			      \
-      (__rseq_offset + offsetof (struct rseq_area, member)));		      \
+     ((struct rseq_area __seg_fs *)__rseq_offset)->member;		      \
   })
 
 /* Read member of the RSEQ area directly, with single-copy atomicity semantics.  */
@@ -34,8 +33,7 @@
 		     || sizeof (RSEQ_SELF()->member) == 4		      \
 		     || sizeof (RSEQ_SELF()->member) == 8,		      \
 		     "size of rseq data");				      \
-     (*(volatile __typeof (RSEQ_SELF()->member) __seg_fs *)		      \
-      (__rseq_offset + offsetof (struct rseq_area, member)));		      \
+     ((volatile struct rseq_area __seg_fs *)__rseq_offset)->member;	      \
   })
 
 /* Set member of the RSEQ area directly.  */
@@ -45,8 +43,7 @@
 		     || sizeof (RSEQ_SELF()->member) == 4		      \
 		     || sizeof (RSEQ_SELF()->member) == 8,		      \
 		     "size of rseq data");				      \
-     (*(__typeof (RSEQ_SELF()->member) __seg_fs *)			      \
-      (__rseq_offset + offsetof (struct rseq_area, member)) = (value));	      \
+     ((struct rseq_area __seg_fs *)__rseq_offset)->member = (value);	      \
   })
 
 /* Set member of the RSEQ area directly, with single-copy atomicity semantics.  */
@@ -56,6 +53,5 @@
 		     || sizeof (RSEQ_SELF()->member) == 4		      \
 		     || sizeof (RSEQ_SELF()->member) == 8,		      \
 		     "size of rseq data");				      \
-     (*(volatile __typeof (RSEQ_SELF()->member) __seg_fs *)		      \
-      (__rseq_offset + offsetof (struct rseq_area, member)) = (value));	      \
+     ((volatile struct rseq_area __seg_fs *)__rseq_offset)->member = (value); \
   })
-- 
2.51.0



More information about the Libc-alpha mailing list