[PATCH 1/4] x86: Simplify TCB access expressions
Uros Bizjak
ubizjak@gmail.com
Thu Sep 25 11:20:57 GMT 2025
On Thu, Sep 25, 2025 at 11:19 AM Andreas Schwab <schwab@suse.de> wrote:
>
> On Sep 25 2025, Uros Bizjak wrote:
>
> > index 445f328ac2..92b2da6cc6 100644
> > --- a/sysdeps/x86_64/nptl/tcb-access.h
> > +++ b/sysdeps/x86_64/nptl/tcb-access.h
> > @@ -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,8 @@
> > || 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->member) __seg_fs *) \
> > + &((__typeof (*descr) __seg_fs *)0)->member; \
>
> I think this can be simplified further if we add volatile in the inner
> cast and drop the outer cast:
>
> + ((volatile __typeof (*descr) __seg_fs *)0)->member; \
Indeed, this is even better, because some especially picky compiler
can consider the former undefined behavior, because the pointer of a
type (volatile int *) is different from the original object type
(int), ignoring the strict aliasing rule.
Thanks,
Uros.
More information about the Libc-alpha
mailing list