Message ID | 1509038067-18532-1-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | Accepted |
Commit | dff91cd45e35e47d567274331f3deb8e87a188c9 |
Headers | show |
Series | [v2,1/3] nptl: Add tests for internal pthread_mutex_t offsets | expand |
Ping. On 26/10/2017 15:14, Adhemerval Zanella wrote: > Changes from previous version: > > - Move _Static_asserts tests from external tests to library > build time. > > --- > > This patch adds a new build test to check for internal fields > offsets for user visible internal field. Although currently > the only field which is statically initialized to a non zero value > is pthread_mutex_t.__data.__kind value, the tests also check the > offset of __kind, __spins, __elision (if supported), and __list > internal member. A internal header (pthread-offset.h) is added > to each major ABI with the reference value. > > Checked on x86_64-linux-gnu and with a build check for all affected > ABIs (aarch64-linux-gnu, alpha-linux-gnu, arm-linux-gnueabihf, > hppa-linux-gnu, i686-linux-gnu, ia64-linux-gnu, m68k-linux-gnu, > microblaze-linux-gnu, mips64-linux-gnu, mips64-n32-linux-gnu, > mips-linux-gnu, powerpc64le-linux-gnu, powerpc-linux-gnu, > s390-linux-gnu, s390x-linux-gnu, sh4-linux-gnu, sparc64-linux-gnu, > sparcv9-linux-gnu, tilegx-linux-gnu, tilegx-linux-gnu-x32, > tilepro-linux-gnu, x86_64-linux-gnu, and x86_64-linux-x32). > > Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > > * nptl/pthreadP.h (ASSERT_PTHREAD_STRING, > ASSERT_PTHREAD_INTERNAL_OFFSET): New macro. > * nptl/pthread_mutex_init.c (__pthread_mutex_init): Add build time > checks for internal pthread_mutex_t offsets. > * sysdeps/aarch64/nptl/pthread-offsets.h > (__PTHREAD_MUTEX_NUSERS_OFFSET, __PTHREAD_MUTEX_KIND_OFFSET, > __PTHREAD_MUTEX_SPINS_OFFSET, __PTHREAD_MUTEX_ELISION_OFFSET, > __PTHREAD_MUTEX_LIST_OFFSET): New macro. > * sysdeps/alpha/nptl/pthread-offsets.h: Likewise. > * sysdeps/arm/nptl/pthread-offsets.h: Likewise. > * sysdeps/hppa/nptl/pthread-offsets.h: Likewise. > * sysdeps/i386/nptl/pthread-offsets.h: Likewise. > * sysdeps/ia64/nptl/pthread-offsets.h: Likewise. > * sysdeps/m68k/nptl/pthread-offsets.h: Likewise. > * sysdeps/microblaze/nptl/pthread-offsets.h: Likewise. > * sysdeps/mips/nptl/pthread-offsets.h: Likewise. > * sysdeps/nios2/nptl/pthread-offsets.h: Likewise. > * sysdeps/powerpc/nptl/pthread-offsets.h: Likewise. > * sysdeps/s390/nptl/pthread-offsets.h: Likewise. > * sysdeps/sh/nptl/pthread-offsets.h: Likewise. > * sysdeps/sparc/nptl/pthread-offsets.h: Likewise. > * sysdeps/tile/nptl/pthread-offsets.h: Likewise. > * sysdeps/x86_64/nptl/pthread-offsets.h: Likewise. > --- > ChangeLog | 26 ++++++++++++++++++++++++++ > nptl/pthreadP.h | 6 ++++++ > nptl/pthread_mutex_init.c | 13 +++++++++++++ > sysdeps/aarch64/nptl/pthread-offsets.h | 5 +++++ > sysdeps/alpha/nptl/pthread-offsets.h | 5 +++++ > sysdeps/arm/nptl/pthread-offsets.h | 5 +++++ > sysdeps/hppa/nptl/pthread-offsets.h | 5 +++++ > sysdeps/i386/nptl/pthread-offsets.h | 5 +++++ > sysdeps/ia64/nptl/pthread-offsets.h | 5 +++++ > sysdeps/m68k/nptl/pthread-offsets.h | 5 +++++ > sysdeps/microblaze/nptl/pthread-offsets.h | 5 +++++ > sysdeps/mips/nptl/pthread-offsets.h | 13 +++++++++++++ > sysdeps/nios2/nptl/pthread-offsets.h | 5 +++++ > sysdeps/powerpc/nptl/pthread-offsets.h | 15 +++++++++++++++ > sysdeps/s390/nptl/pthread-offsets.h | 15 +++++++++++++++ > sysdeps/sh/nptl/pthread-offsets.h | 5 +++++ > sysdeps/sparc/nptl/pthread-offsets.h | 15 +++++++++++++++ > sysdeps/tile/nptl/pthread-offsets.h | 15 +++++++++++++++ > sysdeps/x86_64/nptl/pthread-offsets.h | 5 +++++ > 19 files changed, 173 insertions(+) > create mode 100644 sysdeps/aarch64/nptl/pthread-offsets.h > create mode 100644 sysdeps/alpha/nptl/pthread-offsets.h > create mode 100644 sysdeps/arm/nptl/pthread-offsets.h > create mode 100644 sysdeps/hppa/nptl/pthread-offsets.h > create mode 100644 sysdeps/i386/nptl/pthread-offsets.h > create mode 100644 sysdeps/ia64/nptl/pthread-offsets.h > create mode 100644 sysdeps/m68k/nptl/pthread-offsets.h > create mode 100644 sysdeps/microblaze/nptl/pthread-offsets.h > create mode 100644 sysdeps/mips/nptl/pthread-offsets.h > create mode 100644 sysdeps/nios2/nptl/pthread-offsets.h > create mode 100644 sysdeps/powerpc/nptl/pthread-offsets.h > create mode 100644 sysdeps/s390/nptl/pthread-offsets.h > create mode 100644 sysdeps/sh/nptl/pthread-offsets.h > create mode 100644 sysdeps/sparc/nptl/pthread-offsets.h > create mode 100644 sysdeps/tile/nptl/pthread-offsets.h > create mode 100644 sysdeps/x86_64/nptl/pthread-offsets.h > > diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h > index dbf46b0..444bbd9 100644 > --- a/nptl/pthreadP.h > +++ b/nptl/pthreadP.h > @@ -639,4 +639,10 @@ check_stacksize_attr (size_t st) > return EINVAL; > } > > +#define ASSERT_PTHREAD_STRING(x) __STRING (x) > +#define ASSERT_PTHREAD_INTERNAL_OFFSET(__type, __member, __offset) \ > + _Static_assert (offsetof (__type, __member) == __offset, \ > + "offset of " #__member " field of " #__type " != " \ > + ASSERT_PTHREAD_STRING (__offset)) > + > #endif /* pthreadP.h */ > diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c > index 6f2fc80..e1f911b 100644 > --- a/nptl/pthread_mutex_init.c > +++ b/nptl/pthread_mutex_init.c > @@ -23,6 +23,7 @@ > #include <kernel-features.h> > #include "pthreadP.h" > #include <atomic.h> > +#include <pthread-offsets.h> > > #include <stap-probe.h> > > @@ -58,6 +59,18 @@ __pthread_mutex_init (pthread_mutex_t *mutex, > const struct pthread_mutexattr *imutexattr; > > assert (sizeof (pthread_mutex_t) <= __SIZEOF_PTHREAD_MUTEX_T); > + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__nusers, > + __PTHREAD_MUTEX_NUSERS_OFFSET); > + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__kind, > + __PTHREAD_MUTEX_KIND_OFFSET); > + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__spins, > + __PTHREAD_MUTEX_SPINS_OFFSET); > +#if __PTHREAD_MUTEX_LOCK_ELISION > + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__elision, > + __PTHREAD_MUTEX_ELISION_OFFSET); > +#endif > + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__list, > + __PTHREAD_MUTEX_LIST_OFFSET); > > imutexattr = ((const struct pthread_mutexattr *) mutexattr > ?: &default_mutexattr); > diff --git a/sysdeps/aarch64/nptl/pthread-offsets.h b/sysdeps/aarch64/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..16c6b0d > --- /dev/null > +++ b/sysdeps/aarch64/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 12 > +#define __PTHREAD_MUTEX_KIND_OFFSET 16 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 24 > diff --git a/sysdeps/alpha/nptl/pthread-offsets.h b/sysdeps/alpha/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..16c6b0d > --- /dev/null > +++ b/sysdeps/alpha/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 12 > +#define __PTHREAD_MUTEX_KIND_OFFSET 16 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 24 > diff --git a/sysdeps/arm/nptl/pthread-offsets.h b/sysdeps/arm/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..9617354 > --- /dev/null > +++ b/sysdeps/arm/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +#define __PTHREAD_MUTEX_KIND_OFFSET 12 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 20 > diff --git a/sysdeps/hppa/nptl/pthread-offsets.h b/sysdeps/hppa/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..8ae01b9 > --- /dev/null > +++ b/sysdeps/hppa/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 32 > +#define __PTHREAD_MUTEX_KIND_OFFSET 12 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 36 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 36 > diff --git a/sysdeps/i386/nptl/pthread-offsets.h b/sysdeps/i386/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..9617354 > --- /dev/null > +++ b/sysdeps/i386/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +#define __PTHREAD_MUTEX_KIND_OFFSET 12 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 20 > diff --git a/sysdeps/ia64/nptl/pthread-offsets.h b/sysdeps/ia64/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..16c6b0d > --- /dev/null > +++ b/sysdeps/ia64/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 12 > +#define __PTHREAD_MUTEX_KIND_OFFSET 16 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 24 > diff --git a/sysdeps/m68k/nptl/pthread-offsets.h b/sysdeps/m68k/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..9617354 > --- /dev/null > +++ b/sysdeps/m68k/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +#define __PTHREAD_MUTEX_KIND_OFFSET 12 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 20 > diff --git a/sysdeps/microblaze/nptl/pthread-offsets.h b/sysdeps/microblaze/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..9617354 > --- /dev/null > +++ b/sysdeps/microblaze/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +#define __PTHREAD_MUTEX_KIND_OFFSET 12 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 20 > diff --git a/sysdeps/mips/nptl/pthread-offsets.h b/sysdeps/mips/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..0ac3eda > --- /dev/null > +++ b/sysdeps/mips/nptl/pthread-offsets.h > @@ -0,0 +1,13 @@ > +#if _MIPS_SIM == _ABI64 > +# define __PTHREAD_MUTEX_NUSERS_OFFSET 12 > +# define __PTHREAD_MUTEX_KIND_OFFSET 16 > +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +# define __PTHREAD_MUTEX_LIST_OFFSET 24 > +#else > +# define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +# define __PTHREAD_MUTEX_KIND_OFFSET 12 > +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +# define __PTHREAD_MUTEX_LIST_OFFSET 20 > +#endif > diff --git a/sysdeps/nios2/nptl/pthread-offsets.h b/sysdeps/nios2/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..9617354 > --- /dev/null > +++ b/sysdeps/nios2/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +#define __PTHREAD_MUTEX_KIND_OFFSET 12 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 20 > diff --git a/sysdeps/powerpc/nptl/pthread-offsets.h b/sysdeps/powerpc/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..bdda1f1 > --- /dev/null > +++ b/sysdeps/powerpc/nptl/pthread-offsets.h > @@ -0,0 +1,15 @@ > +#include <bits/wordsize.h> > + > +#if __WORDSIZE == 64 > +# define __PTHREAD_MUTEX_NUSERS_OFFSET 12 > +# define __PTHREAD_MUTEX_KIND_OFFSET 16 > +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +# define __PTHREAD_MUTEX_LIST_OFFSET 24 > +#else > +# define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +# define __PTHREAD_MUTEX_KIND_OFFSET 12 > +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +# define __PTHREAD_MUTEX_LIST_OFFSET 20 > +#endif > diff --git a/sysdeps/s390/nptl/pthread-offsets.h b/sysdeps/s390/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..bdda1f1 > --- /dev/null > +++ b/sysdeps/s390/nptl/pthread-offsets.h > @@ -0,0 +1,15 @@ > +#include <bits/wordsize.h> > + > +#if __WORDSIZE == 64 > +# define __PTHREAD_MUTEX_NUSERS_OFFSET 12 > +# define __PTHREAD_MUTEX_KIND_OFFSET 16 > +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +# define __PTHREAD_MUTEX_LIST_OFFSET 24 > +#else > +# define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +# define __PTHREAD_MUTEX_KIND_OFFSET 12 > +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +# define __PTHREAD_MUTEX_LIST_OFFSET 20 > +#endif > diff --git a/sysdeps/sh/nptl/pthread-offsets.h b/sysdeps/sh/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..9617354 > --- /dev/null > +++ b/sysdeps/sh/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +#define __PTHREAD_MUTEX_KIND_OFFSET 12 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 20 > diff --git a/sysdeps/sparc/nptl/pthread-offsets.h b/sysdeps/sparc/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..bdda1f1 > --- /dev/null > +++ b/sysdeps/sparc/nptl/pthread-offsets.h > @@ -0,0 +1,15 @@ > +#include <bits/wordsize.h> > + > +#if __WORDSIZE == 64 > +# define __PTHREAD_MUTEX_NUSERS_OFFSET 12 > +# define __PTHREAD_MUTEX_KIND_OFFSET 16 > +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +# define __PTHREAD_MUTEX_LIST_OFFSET 24 > +#else > +# define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +# define __PTHREAD_MUTEX_KIND_OFFSET 12 > +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +# define __PTHREAD_MUTEX_LIST_OFFSET 20 > +#endif > diff --git a/sysdeps/tile/nptl/pthread-offsets.h b/sysdeps/tile/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..bdda1f1 > --- /dev/null > +++ b/sysdeps/tile/nptl/pthread-offsets.h > @@ -0,0 +1,15 @@ > +#include <bits/wordsize.h> > + > +#if __WORDSIZE == 64 > +# define __PTHREAD_MUTEX_NUSERS_OFFSET 12 > +# define __PTHREAD_MUTEX_KIND_OFFSET 16 > +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +# define __PTHREAD_MUTEX_LIST_OFFSET 24 > +#else > +# define __PTHREAD_MUTEX_NUSERS_OFFSET 16 > +# define __PTHREAD_MUTEX_KIND_OFFSET 12 > +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +# define __PTHREAD_MUTEX_LIST_OFFSET 20 > +#endif > diff --git a/sysdeps/x86_64/nptl/pthread-offsets.h b/sysdeps/x86_64/nptl/pthread-offsets.h > new file mode 100644 > index 0000000..16c6b0d > --- /dev/null > +++ b/sysdeps/x86_64/nptl/pthread-offsets.h > @@ -0,0 +1,5 @@ > +#define __PTHREAD_MUTEX_NUSERS_OFFSET 12 > +#define __PTHREAD_MUTEX_KIND_OFFSET 16 > +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 > +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 > +#define __PTHREAD_MUTEX_LIST_OFFSET 24 >
diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index dbf46b0..444bbd9 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -639,4 +639,10 @@ check_stacksize_attr (size_t st) return EINVAL; } +#define ASSERT_PTHREAD_STRING(x) __STRING (x) +#define ASSERT_PTHREAD_INTERNAL_OFFSET(__type, __member, __offset) \ + _Static_assert (offsetof (__type, __member) == __offset, \ + "offset of " #__member " field of " #__type " != " \ + ASSERT_PTHREAD_STRING (__offset)) + #endif /* pthreadP.h */ diff --git a/nptl/pthread_mutex_init.c b/nptl/pthread_mutex_init.c index 6f2fc80..e1f911b 100644 --- a/nptl/pthread_mutex_init.c +++ b/nptl/pthread_mutex_init.c @@ -23,6 +23,7 @@ #include <kernel-features.h> #include "pthreadP.h" #include <atomic.h> +#include <pthread-offsets.h> #include <stap-probe.h> @@ -58,6 +59,18 @@ __pthread_mutex_init (pthread_mutex_t *mutex, const struct pthread_mutexattr *imutexattr; assert (sizeof (pthread_mutex_t) <= __SIZEOF_PTHREAD_MUTEX_T); + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__nusers, + __PTHREAD_MUTEX_NUSERS_OFFSET); + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__kind, + __PTHREAD_MUTEX_KIND_OFFSET); + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__spins, + __PTHREAD_MUTEX_SPINS_OFFSET); +#if __PTHREAD_MUTEX_LOCK_ELISION + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__elision, + __PTHREAD_MUTEX_ELISION_OFFSET); +#endif + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_mutex_t, __data.__list, + __PTHREAD_MUTEX_LIST_OFFSET); imutexattr = ((const struct pthread_mutexattr *) mutexattr ?: &default_mutexattr); diff --git a/sysdeps/aarch64/nptl/pthread-offsets.h b/sysdeps/aarch64/nptl/pthread-offsets.h new file mode 100644 index 0000000..16c6b0d --- /dev/null +++ b/sysdeps/aarch64/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 12 +#define __PTHREAD_MUTEX_KIND_OFFSET 16 +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 24 diff --git a/sysdeps/alpha/nptl/pthread-offsets.h b/sysdeps/alpha/nptl/pthread-offsets.h new file mode 100644 index 0000000..16c6b0d --- /dev/null +++ b/sysdeps/alpha/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 12 +#define __PTHREAD_MUTEX_KIND_OFFSET 16 +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 24 diff --git a/sysdeps/arm/nptl/pthread-offsets.h b/sysdeps/arm/nptl/pthread-offsets.h new file mode 100644 index 0000000..9617354 --- /dev/null +++ b/sysdeps/arm/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +#define __PTHREAD_MUTEX_KIND_OFFSET 12 +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 20 diff --git a/sysdeps/hppa/nptl/pthread-offsets.h b/sysdeps/hppa/nptl/pthread-offsets.h new file mode 100644 index 0000000..8ae01b9 --- /dev/null +++ b/sysdeps/hppa/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 32 +#define __PTHREAD_MUTEX_KIND_OFFSET 12 +#define __PTHREAD_MUTEX_SPINS_OFFSET 36 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 36 diff --git a/sysdeps/i386/nptl/pthread-offsets.h b/sysdeps/i386/nptl/pthread-offsets.h new file mode 100644 index 0000000..9617354 --- /dev/null +++ b/sysdeps/i386/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +#define __PTHREAD_MUTEX_KIND_OFFSET 12 +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 20 diff --git a/sysdeps/ia64/nptl/pthread-offsets.h b/sysdeps/ia64/nptl/pthread-offsets.h new file mode 100644 index 0000000..16c6b0d --- /dev/null +++ b/sysdeps/ia64/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 12 +#define __PTHREAD_MUTEX_KIND_OFFSET 16 +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 24 diff --git a/sysdeps/m68k/nptl/pthread-offsets.h b/sysdeps/m68k/nptl/pthread-offsets.h new file mode 100644 index 0000000..9617354 --- /dev/null +++ b/sysdeps/m68k/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +#define __PTHREAD_MUTEX_KIND_OFFSET 12 +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 20 diff --git a/sysdeps/microblaze/nptl/pthread-offsets.h b/sysdeps/microblaze/nptl/pthread-offsets.h new file mode 100644 index 0000000..9617354 --- /dev/null +++ b/sysdeps/microblaze/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +#define __PTHREAD_MUTEX_KIND_OFFSET 12 +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 20 diff --git a/sysdeps/mips/nptl/pthread-offsets.h b/sysdeps/mips/nptl/pthread-offsets.h new file mode 100644 index 0000000..0ac3eda --- /dev/null +++ b/sysdeps/mips/nptl/pthread-offsets.h @@ -0,0 +1,13 @@ +#if _MIPS_SIM == _ABI64 +# define __PTHREAD_MUTEX_NUSERS_OFFSET 12 +# define __PTHREAD_MUTEX_KIND_OFFSET 16 +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 +# define __PTHREAD_MUTEX_LIST_OFFSET 24 +#else +# define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +# define __PTHREAD_MUTEX_KIND_OFFSET 12 +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 +# define __PTHREAD_MUTEX_LIST_OFFSET 20 +#endif diff --git a/sysdeps/nios2/nptl/pthread-offsets.h b/sysdeps/nios2/nptl/pthread-offsets.h new file mode 100644 index 0000000..9617354 --- /dev/null +++ b/sysdeps/nios2/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +#define __PTHREAD_MUTEX_KIND_OFFSET 12 +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 20 diff --git a/sysdeps/powerpc/nptl/pthread-offsets.h b/sysdeps/powerpc/nptl/pthread-offsets.h new file mode 100644 index 0000000..bdda1f1 --- /dev/null +++ b/sysdeps/powerpc/nptl/pthread-offsets.h @@ -0,0 +1,15 @@ +#include <bits/wordsize.h> + +#if __WORDSIZE == 64 +# define __PTHREAD_MUTEX_NUSERS_OFFSET 12 +# define __PTHREAD_MUTEX_KIND_OFFSET 16 +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 +# define __PTHREAD_MUTEX_LIST_OFFSET 24 +#else +# define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +# define __PTHREAD_MUTEX_KIND_OFFSET 12 +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 +# define __PTHREAD_MUTEX_LIST_OFFSET 20 +#endif diff --git a/sysdeps/s390/nptl/pthread-offsets.h b/sysdeps/s390/nptl/pthread-offsets.h new file mode 100644 index 0000000..bdda1f1 --- /dev/null +++ b/sysdeps/s390/nptl/pthread-offsets.h @@ -0,0 +1,15 @@ +#include <bits/wordsize.h> + +#if __WORDSIZE == 64 +# define __PTHREAD_MUTEX_NUSERS_OFFSET 12 +# define __PTHREAD_MUTEX_KIND_OFFSET 16 +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 +# define __PTHREAD_MUTEX_LIST_OFFSET 24 +#else +# define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +# define __PTHREAD_MUTEX_KIND_OFFSET 12 +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 +# define __PTHREAD_MUTEX_LIST_OFFSET 20 +#endif diff --git a/sysdeps/sh/nptl/pthread-offsets.h b/sysdeps/sh/nptl/pthread-offsets.h new file mode 100644 index 0000000..9617354 --- /dev/null +++ b/sysdeps/sh/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +#define __PTHREAD_MUTEX_KIND_OFFSET 12 +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 20 diff --git a/sysdeps/sparc/nptl/pthread-offsets.h b/sysdeps/sparc/nptl/pthread-offsets.h new file mode 100644 index 0000000..bdda1f1 --- /dev/null +++ b/sysdeps/sparc/nptl/pthread-offsets.h @@ -0,0 +1,15 @@ +#include <bits/wordsize.h> + +#if __WORDSIZE == 64 +# define __PTHREAD_MUTEX_NUSERS_OFFSET 12 +# define __PTHREAD_MUTEX_KIND_OFFSET 16 +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 +# define __PTHREAD_MUTEX_LIST_OFFSET 24 +#else +# define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +# define __PTHREAD_MUTEX_KIND_OFFSET 12 +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 +# define __PTHREAD_MUTEX_LIST_OFFSET 20 +#endif diff --git a/sysdeps/tile/nptl/pthread-offsets.h b/sysdeps/tile/nptl/pthread-offsets.h new file mode 100644 index 0000000..bdda1f1 --- /dev/null +++ b/sysdeps/tile/nptl/pthread-offsets.h @@ -0,0 +1,15 @@ +#include <bits/wordsize.h> + +#if __WORDSIZE == 64 +# define __PTHREAD_MUTEX_NUSERS_OFFSET 12 +# define __PTHREAD_MUTEX_KIND_OFFSET 16 +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 +# define __PTHREAD_MUTEX_LIST_OFFSET 24 +#else +# define __PTHREAD_MUTEX_NUSERS_OFFSET 16 +# define __PTHREAD_MUTEX_KIND_OFFSET 12 +# define __PTHREAD_MUTEX_SPINS_OFFSET 20 +# define __PTHREAD_MUTEX_ELISION_OFFSET 22 +# define __PTHREAD_MUTEX_LIST_OFFSET 20 +#endif diff --git a/sysdeps/x86_64/nptl/pthread-offsets.h b/sysdeps/x86_64/nptl/pthread-offsets.h new file mode 100644 index 0000000..16c6b0d --- /dev/null +++ b/sysdeps/x86_64/nptl/pthread-offsets.h @@ -0,0 +1,5 @@ +#define __PTHREAD_MUTEX_NUSERS_OFFSET 12 +#define __PTHREAD_MUTEX_KIND_OFFSET 16 +#define __PTHREAD_MUTEX_SPINS_OFFSET 20 +#define __PTHREAD_MUTEX_ELISION_OFFSET 22 +#define __PTHREAD_MUTEX_LIST_OFFSET 24
Changes from previous version: - Move _Static_asserts tests from external tests to library build time. --- This patch adds a new build test to check for internal fields offsets for user visible internal field. Although currently the only field which is statically initialized to a non zero value is pthread_mutex_t.__data.__kind value, the tests also check the offset of __kind, __spins, __elision (if supported), and __list internal member. A internal header (pthread-offset.h) is added to each major ABI with the reference value. Checked on x86_64-linux-gnu and with a build check for all affected ABIs (aarch64-linux-gnu, alpha-linux-gnu, arm-linux-gnueabihf, hppa-linux-gnu, i686-linux-gnu, ia64-linux-gnu, m68k-linux-gnu, microblaze-linux-gnu, mips64-linux-gnu, mips64-n32-linux-gnu, mips-linux-gnu, powerpc64le-linux-gnu, powerpc-linux-gnu, s390-linux-gnu, s390x-linux-gnu, sh4-linux-gnu, sparc64-linux-gnu, sparcv9-linux-gnu, tilegx-linux-gnu, tilegx-linux-gnu-x32, tilepro-linux-gnu, x86_64-linux-gnu, and x86_64-linux-x32). Signed-off-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> * nptl/pthreadP.h (ASSERT_PTHREAD_STRING, ASSERT_PTHREAD_INTERNAL_OFFSET): New macro. * nptl/pthread_mutex_init.c (__pthread_mutex_init): Add build time checks for internal pthread_mutex_t offsets. * sysdeps/aarch64/nptl/pthread-offsets.h (__PTHREAD_MUTEX_NUSERS_OFFSET, __PTHREAD_MUTEX_KIND_OFFSET, __PTHREAD_MUTEX_SPINS_OFFSET, __PTHREAD_MUTEX_ELISION_OFFSET, __PTHREAD_MUTEX_LIST_OFFSET): New macro. * sysdeps/alpha/nptl/pthread-offsets.h: Likewise. * sysdeps/arm/nptl/pthread-offsets.h: Likewise. * sysdeps/hppa/nptl/pthread-offsets.h: Likewise. * sysdeps/i386/nptl/pthread-offsets.h: Likewise. * sysdeps/ia64/nptl/pthread-offsets.h: Likewise. * sysdeps/m68k/nptl/pthread-offsets.h: Likewise. * sysdeps/microblaze/nptl/pthread-offsets.h: Likewise. * sysdeps/mips/nptl/pthread-offsets.h: Likewise. * sysdeps/nios2/nptl/pthread-offsets.h: Likewise. * sysdeps/powerpc/nptl/pthread-offsets.h: Likewise. * sysdeps/s390/nptl/pthread-offsets.h: Likewise. * sysdeps/sh/nptl/pthread-offsets.h: Likewise. * sysdeps/sparc/nptl/pthread-offsets.h: Likewise. * sysdeps/tile/nptl/pthread-offsets.h: Likewise. * sysdeps/x86_64/nptl/pthread-offsets.h: Likewise. --- ChangeLog | 26 ++++++++++++++++++++++++++ nptl/pthreadP.h | 6 ++++++ nptl/pthread_mutex_init.c | 13 +++++++++++++ sysdeps/aarch64/nptl/pthread-offsets.h | 5 +++++ sysdeps/alpha/nptl/pthread-offsets.h | 5 +++++ sysdeps/arm/nptl/pthread-offsets.h | 5 +++++ sysdeps/hppa/nptl/pthread-offsets.h | 5 +++++ sysdeps/i386/nptl/pthread-offsets.h | 5 +++++ sysdeps/ia64/nptl/pthread-offsets.h | 5 +++++ sysdeps/m68k/nptl/pthread-offsets.h | 5 +++++ sysdeps/microblaze/nptl/pthread-offsets.h | 5 +++++ sysdeps/mips/nptl/pthread-offsets.h | 13 +++++++++++++ sysdeps/nios2/nptl/pthread-offsets.h | 5 +++++ sysdeps/powerpc/nptl/pthread-offsets.h | 15 +++++++++++++++ sysdeps/s390/nptl/pthread-offsets.h | 15 +++++++++++++++ sysdeps/sh/nptl/pthread-offsets.h | 5 +++++ sysdeps/sparc/nptl/pthread-offsets.h | 15 +++++++++++++++ sysdeps/tile/nptl/pthread-offsets.h | 15 +++++++++++++++ sysdeps/x86_64/nptl/pthread-offsets.h | 5 +++++ 19 files changed, 173 insertions(+) create mode 100644 sysdeps/aarch64/nptl/pthread-offsets.h create mode 100644 sysdeps/alpha/nptl/pthread-offsets.h create mode 100644 sysdeps/arm/nptl/pthread-offsets.h create mode 100644 sysdeps/hppa/nptl/pthread-offsets.h create mode 100644 sysdeps/i386/nptl/pthread-offsets.h create mode 100644 sysdeps/ia64/nptl/pthread-offsets.h create mode 100644 sysdeps/m68k/nptl/pthread-offsets.h create mode 100644 sysdeps/microblaze/nptl/pthread-offsets.h create mode 100644 sysdeps/mips/nptl/pthread-offsets.h create mode 100644 sysdeps/nios2/nptl/pthread-offsets.h create mode 100644 sysdeps/powerpc/nptl/pthread-offsets.h create mode 100644 sysdeps/s390/nptl/pthread-offsets.h create mode 100644 sysdeps/sh/nptl/pthread-offsets.h create mode 100644 sysdeps/sparc/nptl/pthread-offsets.h create mode 100644 sysdeps/tile/nptl/pthread-offsets.h create mode 100644 sysdeps/x86_64/nptl/pthread-offsets.h -- 2.7.4