]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
x86: Simplify TCB access expressions
authorUros Bizjak <ubizjak@gmail.com>
Thu, 25 Sep 2025 07:42:15 +0000 (09:42 +0200)
committerUros Bizjak <ubizjak@gmail.com>
Wed, 8 Oct 2025 07:35:15 +0000 (09:35 +0200)
Replace manual cast with a direct `(__typeof(*descr) __seg_gs *)0`
dereference to access `member`.  This avoids redundant
`offsetof(struct pthread, member)` and improves readability while
preserving semantics.

Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Reviewed-by: H.J. Lu <hjl.tools@gmail.com>
sysdeps/i386/nptl/tcb-access.h
sysdeps/i386/nptl/tls.h
sysdeps/x86_64/nptl/tcb-access.h
sysdeps/x86_64/nptl/tls.h

index 2a7f9d2a572ea05507c0ed5542205cbd83d8d45a..5bb58c37fabef2ed67185434bea45ea79a8f1db0 100644 (file)
@@ -23,8 +23,7 @@
                     || sizeof (descr->member) == 4                           \
                     || sizeof (descr->member) == 8,                          \
                     "size of per-thread data");                              \
-     (*(__typeof (descr->member) __seg_gs *)                                 \
-      offsetof (struct pthread, member));                                    \
+     ((__typeof (*descr) __seg_gs *)0)->member;                                      \
   })
 
 #define THREAD_GETMEM_VOLATILE(descr, member) \
@@ -33,8 +32,7 @@
                     || sizeof (descr->member) == 4                           \
                     || sizeof (descr->member) == 8,                          \
                     "size of per-thread data");                              \
-     (*(volatile __typeof (descr->member) __seg_gs *)                        \
-      offsetof (struct pthread, member));                                    \
+     ((volatile __typeof (*descr) __seg_gs *)0)->member;                     \
   })
 
 /* Same as THREAD_GETMEM, but the member offset can be non-constant.  */
@@ -44,8 +42,7 @@
                     || sizeof (descr->member[0]) == 4                        \
                     || sizeof (descr->member[0]) == 8,                       \
                     "size of per-thread data");                              \
-     (*(__typeof (descr->member[0]) __seg_gs *)                                      \
-      offsetof (struct pthread, member[idx]));                               \
+     ((__typeof (*descr) __seg_gs *)0)->member[idx];                         \
   })
 
 /* Set member of the thread descriptor directly.  */
@@ -55,8 +52,7 @@
                     || sizeof (descr->member) == 4                           \
                     || sizeof (descr->member) == 8,                          \
                     "size of per-thread data");                              \
-     (*(__typeof (descr->member) __seg_gs *)                                 \
-      offsetof (struct pthread, member) = (value));                          \
+     ((__typeof (*descr) __seg_gs *)0)->member = (value);                    \
   })
 
 /* Same as THREAD_SETMEM, but the member offset can be non-constant.  */
@@ -66,6 +62,5 @@
                     || sizeof (descr->member[0]) == 4                        \
                     || sizeof (descr->member[0]) == 8,                       \
                     "size of per-thread data");                              \
-     (*(__typeof (descr->member[0]) __seg_gs *)                                      \
-      offsetof (struct pthread, member[idx]) = (value));                     \
+     ((__typeof (*descr) __seg_gs *)0)->member[idx] = (value);               \
   })
index 5c266c7191a699f39aa5e857570b04a4c85274d2..7b297d4043add58d6c57b41ac5d4e7315141c1b2 100644 (file)
@@ -223,7 +223,7 @@ tls_fill_user_desc (union user_desc_init *desc,
 
 /* Return the thread descriptor for the current thread.  */
 # define THREAD_SELF \
-  (*(struct pthread *__seg_gs *) offsetof (struct pthread, header.self))
+  (*(struct pthread *__seg_gs *)&((struct pthread __seg_gs *)0)->header.self)
 
 /* Magic for libthread_db to know how to do THREAD_SELF.  */
 # define DB_THREAD_SELF \
@@ -257,8 +257,7 @@ tls_fill_user_desc (union user_desc_init *desc,
     { int __res;                                                             \
       asm volatile ("xchgl %1, %0"                                           \
                    : "=r" (__res)                                            \
-                   : "m" (*(int __seg_gs *)                                  \
-                          offsetof (struct pthread, header.gscope_flag)),    \
+                   : "m" (((struct pthread __seg_gs *)0)->header.gscope_flag), \
                      "0" (THREAD_GSCOPE_FLAG_UNUSED));                       \
       if (__res == THREAD_GSCOPE_FLAG_WAIT)                                  \
        lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE);    \
index 445f328ac209f1c9dea0877e908dc8f2ee909fc7..7a418f945f950091df6eed39fe05aab267ce6c29 100644 (file)
@@ -23,8 +23,7 @@
                     || sizeof (descr->member) == 4                           \
                     || sizeof (descr->member) == 8,                          \
                     "size of per-thread data");                              \
-     (*(__typeof (descr->member) __seg_fs *)                                 \
-      offsetof (struct pthread, member));                                    \
+     ((__typeof (*descr) __seg_fs *)0)->member;                                      \
   })
 
 #define THREAD_GETMEM_VOLATILE(descr, member) \
@@ -33,8 +32,7 @@
                     || sizeof (descr->member) == 4                           \
                     || sizeof (descr->member) == 8,                          \
                     "size of per-thread data");                              \
-     (*(volatile __typeof (descr->member) __seg_fs *)                        \
-      offsetof (struct pthread, member));                                    \
+     ((volatile __typeof (*descr) __seg_fs *)0)->member;                     \
   })
 
 /* Same as THREAD_GETMEM, but the member offset can be non-constant.  */
@@ -44,8 +42,7 @@
                     || sizeof (descr->member[0]) == 4                        \
                     || sizeof (descr->member[0]) == 8,                       \
                     "size of per-thread data");                              \
-     (*(__typeof (descr->member[0]) __seg_fs *)                                      \
-      offsetof (struct pthread, member[idx]));                               \
+     ((__typeof (*descr) __seg_fs *)0)->member[idx];                         \
   })
 
 /* Set member of the thread descriptor directly.  */
@@ -55,8 +52,7 @@
                     || sizeof (descr->member) == 4                           \
                     || sizeof (descr->member) == 8,                          \
                     "size of per-thread data");                              \
-     (*(__typeof (descr->member) __seg_fs *)                                 \
-      offsetof (struct pthread, member) = (value));                          \
+     ((__typeof (*descr) __seg_fs *)0)->member = (value);                    \
   })
 
 /* Same as THREAD_SETMEM, but the member offset can be non-constant.  */
@@ -66,6 +62,5 @@
                     || sizeof (descr->member[0]) == 4                        \
                     || sizeof (descr->member[0]) == 8,                       \
                     "size of per-thread data");                              \
-     (*(__typeof (descr->member[0]) __seg_fs *)                                      \
-      offsetof (struct pthread, member[idx]) = (value));                     \
+     ((__typeof (*descr) __seg_fs *)0)->member[idx] = (value);               \
   })
index cf414300509431972d943c757ec4042c13e1be42..abfeb8805453965753d75b3aa9319a9d5f385ac3 100644 (file)
@@ -170,7 +170,7 @@ _Static_assert (offsetof (tcbhead_t, __glibc_unused2) == 0x80,
 
 /* Return the thread descriptor for the current thread.  */
 # define THREAD_SELF \
-  (*(struct pthread *__seg_fs *) offsetof (struct pthread, header.self))
+  (*(struct pthread *__seg_fs *)&((struct pthread __seg_fs *)0)->header.self)
 
 /* Magic for libthread_db to know how to do THREAD_SELF.  */
 # define DB_THREAD_SELF_INCLUDE  <sys/reg.h> /* For the FS constant.  */
@@ -203,8 +203,7 @@ _Static_assert (offsetof (tcbhead_t, __glibc_unused2) == 0x80,
     { int __res;                                                             \
       asm volatile ("xchgl %1, %0"                                           \
                    : "=r" (__res)                                            \
-                   : "m" (*(int __seg_fs *)                                  \
-                          offsetof (struct pthread, header.gscope_flag)),    \
+                   : "m" (((struct pthread __seg_fs *)0)->header.gscope_flag), \
                      "0" (THREAD_GSCOPE_FLAG_UNUSED));                       \
       if (__res == THREAD_GSCOPE_FLAG_WAIT)                                  \
        lll_futex_wake (&THREAD_SELF->header.gscope_flag, 1, LLL_PRIVATE);    \