[PATCH v3 3/4] x86: Simplify RSEQ area access expressions
H.J. Lu
hjl.tools@gmail.com
Wed Oct 8 03:00:55 GMT 2025
On Wed, Oct 1, 2025 at 8:31 PM Uros Bizjak <ubizjak@gmail.com> wrote:
>
> 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
>
LGTM.
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
Thanks.
--
H.J.
More information about the Libc-alpha
mailing list