diff mbox series

[v2,1/3] nptl: Add tests for internal pthread_mutex_t offsets

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

Commit Message

Adhemerval Zanella Oct. 26, 2017, 5:14 p.m. UTC
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

Comments

Adhemerval Zanella Nov. 2, 2017, 1:31 p.m. UTC | #1
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 mbox series

Patch

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