[PATCH v2 4/4] x86: Use typeof_member style in RSEQ area access expressions
Uros Bizjak
ubizjak@gmail.com
Sun Sep 28 19:23:49 GMT 2025
Update RSEQ access macros to use `((struct rseq_area *)0)->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>
---
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..0dd0cbb180 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 *)0)->member) == 1 \
+ || sizeof (((struct rseq_area *)0)->member) == 4 \
+ || sizeof (((struct rseq_area *)0)->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 *)0)->member) == 1 \
+ || sizeof (((struct rseq_area *)0)->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 *)0)->member) == 1 \
+ || sizeof (((struct rseq_area *)0)->member) == 4 \
+ || sizeof (((struct rseq_area *)0)->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 *)0)->member) == 1 \
+ || sizeof (((struct rseq_area *)0)->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..1b1699cebf 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 *)0)->member) == 1 \
+ || sizeof (((struct rseq_area *)0)->member) == 4 \
+ || sizeof (((struct rseq_area *)0)->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 *)0)->member) == 1 \
+ || sizeof (((struct rseq_area *)0)->member) == 4 \
+ || sizeof (((struct rseq_area *)0)->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 *)0)->member) == 1 \
+ || sizeof (((struct rseq_area *)0)->member) == 4 \
+ || sizeof (((struct rseq_area *)0)->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 *)0)->member) == 1 \
+ || sizeof (((struct rseq_area *)0)->member) == 4 \
+ || sizeof (((struct rseq_area *)0)->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..707f8a685a 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 *)0)->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 *)0)->member) == 1 \
+ || sizeof (((struct rseq_area *)0)->member) == 4 \
+ || sizeof (((struct rseq_area *)0)->member) == 8, \
"size of rseq data"); \
- if (sizeof (RSEQ_SELF()->member) == 1) \
+ if (sizeof (((struct rseq_area *)0)->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 *)0)->member) == 4) \
asm volatile ("movl %0,%%fs:%c1(%2)" \
: \
: IMM_MODE ((uint32_t) cast_to_integer (value)), \
--
2.51.0
More information about the Libc-alpha
mailing list