[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