[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