]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86: Use typeof_member style in RSEQ area access expressions
authorUros Bizjak <ubizjak@gmail.com>
Wed, 1 Oct 2025 09:07:31 +0000 (11:07 +0200)
committerUros Bizjak <ubizjak@gmail.com>
Wed, 8 Oct 2025 07:35:15 +0000 (09:35 +0200)
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>
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
sysdeps/i386/nptl/rseq-access.h
sysdeps/x86_64/64/nptl/rseq-access.h
sysdeps/x86_64/x32/nptl/rseq-access.h

index 753152cb585463ac855fc9faa99c3e1a32093e27..55b500b2b0596acc901a44c5676da678468f7bdb 100644 (file)
@@ -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); \
   })
index 64e5b8d712f5e6782e51ca84962ef8df675eade6..932690b50aef6072145ea7fafd11bff80b894820 100644 (file)
@@ -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); \
   })
index d9bb215c354b570fd732965744dd2d47fe79b477..7d34e9473c56ab5a65e939e0bfa07c505212fe39 100644 (file)
@@ -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,                                \
 /* 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)),         \