[PATCH 4/4] x86: Use typeof_member style in rseq area access expressions
Uros Bizjak
ubizjak@gmail.com
Thu Sep 25 08:41:03 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 | 24 +++++++++++------------
sysdeps/x86_64/64/nptl/rseq-access.h | 28 +++++++++++++--------------
sysdeps/x86_64/x32/nptl/rseq-access.h | 12 ++++++------
3 files changed, 32 insertions(+), 32 deletions(-)
diff --git a/sysdeps/i386/nptl/rseq-access.h b/sysdeps/i386/nptl/rseq-access.h
index 70bb99f801..ddb239d65c 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,19 +31,19 @@
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 __typeof (RSEQ_SELF()->member) __seg_gs *) \
+ *(volatile __typeof (((struct rseq_area *)0)->member) __seg_gs *) \
&((struct rseq_area __seg_gs *)__rseq_offset)->member; \
})
/* 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); \
})
@@ -53,9 +53,9 @@
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 __typeof (RSEQ_SELF()->member) __seg_gs *) \
+ *(volatile __typeof (((struct rseq_area *)0)->member) __seg_gs *) \
&((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 67cf238def..7f44539f34 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,20 +29,20 @@
/* 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 __typeof (RSEQ_SELF()->member) __seg_fs *) \
+ *(volatile __typeof (((struct rseq_area *)0)->member) __seg_fs *) \
&((struct rseq_area __seg_fs *)__rseq_offset)->member; \
})
/* 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); \
})
@@ -50,10 +50,10 @@
/* 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 __typeof (RSEQ_SELF()->member) __seg_fs *) \
+ *(volatile __typeof (((struct rseq_area *)0)->member) __seg_fs *) \
&((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