From: Uros Bizjak Date: Thu, 25 Sep 2025 08:08:11 +0000 (+0200) Subject: x86: Simplify RSEQ area access expressions X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=99518a3a35587705a64cad6df4b02624ea601667;p=thirdparty%2Fglibc.git x86: Simplify RSEQ area access expressions Replace manual cast with a direct `(struct rseq_area __seg_gs *)__rseq_offset` dereference to access `member`. This avoids redundant `offsetof(struct rseq_area, member)` and improves readability while preserving semantics. 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 ee78c6198d..753152cb58 100644 --- a/sysdeps/i386/nptl/rseq-access.h +++ b/sysdeps/i386/nptl/rseq-access.h @@ -23,8 +23,7 @@ || sizeof (RSEQ_SELF()->member) == 4 \ || sizeof (RSEQ_SELF()->member) == 8, \ "size of rseq data"); \ - (*(__typeof (RSEQ_SELF()->member) __seg_gs *) \ - (__rseq_offset + offsetof (struct rseq_area, member))); \ + ((struct rseq_area __seg_gs *)__rseq_offset)->member; \ }) /* Read member of the RSEQ area directly, with single-copy atomicity semantics. @@ -35,8 +34,7 @@ _Static_assert (sizeof (RSEQ_SELF()->member) == 1 \ || sizeof (RSEQ_SELF()->member) == 4, \ "size of rseq data"); \ - (*(volatile __typeof (RSEQ_SELF()->member) __seg_gs *) \ - (__rseq_offset + offsetof (struct rseq_area, member))); \ + ((volatile struct rseq_area __seg_gs *)__rseq_offset)->member; \ }) /* Set member of the RSEQ area directly. */ @@ -46,8 +44,7 @@ || sizeof (RSEQ_SELF()->member) == 4 \ || sizeof (RSEQ_SELF()->member) == 8, \ "size of rseq data"); \ - (*(__typeof (RSEQ_SELF()->member) __seg_gs *) \ - (__rseq_offset + offsetof (struct rseq_area, member)) = (value)); \ + ((struct rseq_area __seg_gs *)__rseq_offset)->member = (value); \ }) /* Set member of the RSEQ area directly, with single-copy atomicity semantics. @@ -58,6 +55,5 @@ _Static_assert (sizeof (RSEQ_SELF()->member) == 1 \ || sizeof (RSEQ_SELF()->member) == 4, \ "size of rseq data"); \ - (*(volatile __typeof (RSEQ_SELF()->member) __seg_gs *) \ - (__rseq_offset + offsetof (struct rseq_area, member)) = (value)); \ + ((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 214cb96797..64e5b8d712 100644 --- a/sysdeps/x86_64/64/nptl/rseq-access.h +++ b/sysdeps/x86_64/64/nptl/rseq-access.h @@ -23,8 +23,7 @@ || sizeof (RSEQ_SELF()->member) == 4 \ || sizeof (RSEQ_SELF()->member) == 8, \ "size of rseq data"); \ - (*(__typeof (RSEQ_SELF()->member) __seg_fs *) \ - (__rseq_offset + offsetof (struct rseq_area, member))); \ + ((struct rseq_area __seg_fs *)__rseq_offset)->member; \ }) /* Read member of the RSEQ area directly, with single-copy atomicity semantics. */ @@ -34,8 +33,7 @@ || sizeof (RSEQ_SELF()->member) == 4 \ || sizeof (RSEQ_SELF()->member) == 8, \ "size of rseq data"); \ - (*(volatile __typeof (RSEQ_SELF()->member) __seg_fs *) \ - (__rseq_offset + offsetof (struct rseq_area, member))); \ + ((volatile struct rseq_area __seg_fs *)__rseq_offset)->member; \ }) /* Set member of the RSEQ area directly. */ @@ -45,8 +43,7 @@ || sizeof (RSEQ_SELF()->member) == 4 \ || sizeof (RSEQ_SELF()->member) == 8, \ "size of rseq data"); \ - (*(__typeof (RSEQ_SELF()->member) __seg_fs *) \ - (__rseq_offset + offsetof (struct rseq_area, member)) = (value)); \ + ((struct rseq_area __seg_fs *)__rseq_offset)->member = (value); \ }) /* Set member of the RSEQ area directly, with single-copy atomicity semantics. */ @@ -56,6 +53,5 @@ || sizeof (RSEQ_SELF()->member) == 4 \ || sizeof (RSEQ_SELF()->member) == 8, \ "size of rseq data"); \ - (*(volatile __typeof (RSEQ_SELF()->member) __seg_fs *) \ - (__rseq_offset + offsetof (struct rseq_area, member)) = (value)); \ + ((volatile struct rseq_area __seg_fs *)__rseq_offset)->member = (value); \ })