mirror of git://sourceware.org/git/glibc.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 <ubizjak@gmail.com>
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
This commit is contained in:
parent
99518a3a35
commit
3ee23564ce
|
|
@ -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); \
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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); \
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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)), \
|
||||
|
|
|
|||
Loading…
Reference in New Issue