[PATCH v3 4/4] x86: Use typeof_member style in RSEQ area access expressions
H.J. Lu
hjl.tools@gmail.com
Wed Oct 8 03:01:44 GMT 2025
On Wed, Oct 1, 2025 at 8:31 PM Uros Bizjak <ubizjak@gmail.com> wrote:
>
> Update RSEQ access macros to use `(struct rseq_area) {}.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>
> ---
> v3: Use `(struct rseq_area) {}.member` instead of `((struct rseq_area *)0)->member`.
> ---
> 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..55b500b2b0 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) {}.member) == 1 \
> + || sizeof ((struct rseq_area) {}.member) == 4 \
> + || sizeof ((struct rseq_area) {}.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) {}.member) == 1 \
> + || sizeof ((struct rseq_area) {}.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) {}.member) == 1 \
> + || sizeof ((struct rseq_area) {}.member) == 4 \
> + || sizeof ((struct rseq_area) {}.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) {}.member) == 1 \
> + || sizeof ((struct rseq_area) {}.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..932690b50a 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) {}.member) == 1 \
> + || sizeof ((struct rseq_area) {}.member) == 4 \
> + || sizeof ((struct rseq_area) {}.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) {}.member) == 1 \
> + || sizeof ((struct rseq_area) {}.member) == 4 \
> + || sizeof ((struct rseq_area) {}.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) {}.member) == 1 \
> + || sizeof ((struct rseq_area) {}.member) == 4 \
> + || sizeof ((struct rseq_area) {}.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) {}.member) == 1 \
> + || sizeof ((struct rseq_area) {}.member) == 4 \
> + || sizeof ((struct rseq_area) {}.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..7d34e9473c 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) {}.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) {}.member) == 1 \
> + || sizeof ((struct rseq_area) {}.member) == 4 \
> + || sizeof ((struct rseq_area) {}.member) == 8, \
> "size of rseq data"); \
> - if (sizeof (RSEQ_SELF()->member) == 1) \
> + if (sizeof ((struct rseq_area) {}.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) {}.member) == 4) \
> asm volatile ("movl %0,%%fs:%c1(%2)" \
> : \
> : IMM_MODE ((uint32_t) cast_to_integer (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