From: Uros Bizjak Date: Wed, 1 Oct 2025 09:07:31 +0000 (+0200) Subject: x86: Use typeof_member style in RSEQ area access expressions X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3ee23564ce99bd8bc9e7222a8a2a96c13153c1e0;p=thirdparty%2Fglibc.git x86: Use typeof_member style in RSEQ area access expressions 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 Reviewed-by: H.J. Lu --- 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)), \