[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