[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