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

Message ID 1508186653-24430-3-git-send-email-adhemerval.zanella@linaro.org
State Dropped
Headers

Commit Message

Adhemerval Zanella Netto Oct. 16, 2017, 8:44 p.m. UTC
  This patch adds a new build test to check for internal fields
offsets uses on pthread_mutex_t static initialization macros
(PTHREAD_MUTEX_INITIALIZER, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP,
PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, and
PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP).

Currently the only field which is statically initialized to a
non zero/null value is pthread_mutex_t.__data.__kind value.  A new
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).

	* nptl/Makefile (tests-internal): Add tst-offsets.
	* nptl/tst-offsets.c: New file.
	* sysdeps/aarch64/nptl/pthread-offsets.h: Likewise.
	* 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                                 | 19 ++++++++++++++
 nptl/Makefile                             |  2 +-
 nptl/tst-offsets.c                        | 41 +++++++++++++++++++++++++++++++
 sysdeps/aarch64/nptl/pthread-offsets.h    |  1 +
 sysdeps/alpha/nptl/pthread-offsets.h      |  1 +
 sysdeps/arm/nptl/pthread-offsets.h        |  1 +
 sysdeps/hppa/nptl/pthread-offsets.h       |  1 +
 sysdeps/i386/nptl/pthread-offsets.h       |  1 +
 sysdeps/ia64/nptl/pthread-offsets.h       |  1 +
 sysdeps/m68k/nptl/pthread-offsets.h       |  1 +
 sysdeps/microblaze/nptl/pthread-offsets.h |  1 +
 sysdeps/mips/nptl/pthread-offsets.h       |  5 ++++
 sysdeps/nios2/nptl/pthread-offsets.h      |  1 +
 sysdeps/powerpc/nptl/pthread-offsets.h    |  7 ++++++
 sysdeps/s390/nptl/pthread-offsets.h       |  7 ++++++
 sysdeps/sh/nptl/pthread-offsets.h         |  1 +
 sysdeps/sparc/nptl/pthread-offsets.h      |  7 ++++++
 sysdeps/tile/nptl/pthread-offsets.h       |  7 ++++++
 sysdeps/x86_64/nptl/pthread-offsets.h     |  1 +
 19 files changed, 105 insertions(+), 1 deletion(-)
 create mode 100644 nptl/tst-offsets.c
 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
  

Comments

H.J. Lu Oct. 16, 2017, 9:36 p.m. UTC | #1
On Mon, Oct 16, 2017 at 1:44 PM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> This patch adds a new build test to check for internal fields
> offsets uses on pthread_mutex_t static initialization macros
> (PTHREAD_MUTEX_INITIALIZER, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP,
> PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, and
> PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP).
>
> Currently the only field which is statically initialized to a
> non zero/null value is pthread_mutex_t.__data.__kind value.  A new
> 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).
>
>         * nptl/Makefile (tests-internal): Add tst-offsets.
>         * nptl/tst-offsets.c: New file.
>         * sysdeps/aarch64/nptl/pthread-offsets.h: Likewise.
>         * 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.
> ---
>

__PTHREAD_MUTEX_HAVE_PREV affects quite few offsets.
We should check all of offsets which depend on it.
  
Adhemerval Zanella Netto Oct. 17, 2017, 1:39 p.m. UTC | #2
On 16/10/2017 19:36, H.J. Lu wrote:
> On Mon, Oct 16, 2017 at 1:44 PM, Adhemerval Zanella
> <adhemerval.zanella@linaro.org> wrote:
>> This patch adds a new build test to check for internal fields
>> offsets uses on pthread_mutex_t static initialization macros
>> (PTHREAD_MUTEX_INITIALIZER, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP,
>> PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, and
>> PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP).
>>
>> Currently the only field which is statically initialized to a
>> non zero/null value is pthread_mutex_t.__data.__kind value.  A new
>> 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).
>>
>>         * nptl/Makefile (tests-internal): Add tst-offsets.
>>         * nptl/tst-offsets.c: New file.
>>         * sysdeps/aarch64/nptl/pthread-offsets.h: Likewise.
>>         * 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.
>> ---
>>
> 
> __PTHREAD_MUTEX_HAVE_PREV affects quite few offsets.
> We should check all of offsets which depend on it.

I thought about it, however currently only __data.__kind member is initialized
to non zero value by the static initializers (and thus the only member really
affected by ABI change by change in internal layout). My idea is to make the
test a place-holder in case change the static initializers to user different
values.
  

Patch

diff --git a/nptl/Makefile b/nptl/Makefile
index d819349..7492b06 100644
--- a/nptl/Makefile
+++ b/nptl/Makefile
@@ -304,7 +304,7 @@  tests = tst-attr1 tst-attr2 tst-attr3 tst-default-attr \
 	tst-thread_local1 tst-mutex-errorcheck tst-robust10 \
 	tst-robust-fork tst-create-detached tst-memstream
 
-tests-internal := tst-typesizes \
+tests-internal := tst-typesizes tst-offsets \
 		  tst-rwlock19 tst-rwlock20 \
 		  tst-sem11 tst-sem12 tst-sem13 \
 		  tst-barrier5 tst-signal7 tst-mutex8 tst-mutex8-static \
diff --git a/nptl/tst-offsets.c b/nptl/tst-offsets.c
new file mode 100644
index 0000000..1aa8a0e
--- /dev/null
+++ b/nptl/tst-offsets.c
@@ -0,0 +1,41 @@ 
+/* Check pthread internal offsets.
+   Copyright (C) 2017 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include <stdio.h>
+#include <pthreadP.h>
+#include <semaphore.h>
+
+#include <pthread-offsets.h>
+
+#define STR_HELPER(x) #x
+#define STR(x) STR_HELPER(x)
+
+static int
+do_test (void)
+{
+  /* Check if internal fields in pthread_mutex_t used by static initializers
+     have the expected offset.  */
+  _Static_assert (offsetof (pthread_mutex_t, __data.__kind) ==
+		  __PTHREAD_MUTEX_KIND_OFFSET,
+		  "offset of __kind field != "
+		  STR (__PTHREAD_MUTEX_KIND_OFFSET));
+
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/aarch64/nptl/pthread-offsets.h b/sysdeps/aarch64/nptl/pthread-offsets.h
new file mode 100644
index 0000000..aaca502
--- /dev/null
+++ b/sysdeps/aarch64/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  16
diff --git a/sysdeps/alpha/nptl/pthread-offsets.h b/sysdeps/alpha/nptl/pthread-offsets.h
new file mode 100644
index 0000000..aaca502
--- /dev/null
+++ b/sysdeps/alpha/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  16
diff --git a/sysdeps/arm/nptl/pthread-offsets.h b/sysdeps/arm/nptl/pthread-offsets.h
new file mode 100644
index 0000000..235677f
--- /dev/null
+++ b/sysdeps/arm/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  12
diff --git a/sysdeps/hppa/nptl/pthread-offsets.h b/sysdeps/hppa/nptl/pthread-offsets.h
new file mode 100644
index 0000000..235677f
--- /dev/null
+++ b/sysdeps/hppa/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  12
diff --git a/sysdeps/i386/nptl/pthread-offsets.h b/sysdeps/i386/nptl/pthread-offsets.h
new file mode 100644
index 0000000..235677f
--- /dev/null
+++ b/sysdeps/i386/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  12
diff --git a/sysdeps/ia64/nptl/pthread-offsets.h b/sysdeps/ia64/nptl/pthread-offsets.h
new file mode 100644
index 0000000..aaca502
--- /dev/null
+++ b/sysdeps/ia64/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  16
diff --git a/sysdeps/m68k/nptl/pthread-offsets.h b/sysdeps/m68k/nptl/pthread-offsets.h
new file mode 100644
index 0000000..235677f
--- /dev/null
+++ b/sysdeps/m68k/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  12
diff --git a/sysdeps/microblaze/nptl/pthread-offsets.h b/sysdeps/microblaze/nptl/pthread-offsets.h
new file mode 100644
index 0000000..235677f
--- /dev/null
+++ b/sysdeps/microblaze/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  12
diff --git a/sysdeps/mips/nptl/pthread-offsets.h b/sysdeps/mips/nptl/pthread-offsets.h
new file mode 100644
index 0000000..6dd3dea
--- /dev/null
+++ b/sysdeps/mips/nptl/pthread-offsets.h
@@ -0,0 +1,5 @@ 
+#if _MIPS_SIM == _ABI64
+# define __PTHREAD_MUTEX_KIND_OFFSET  16
+#else
+# define __PTHREAD_MUTEX_KIND_OFFSET  12
+#endif
diff --git a/sysdeps/nios2/nptl/pthread-offsets.h b/sysdeps/nios2/nptl/pthread-offsets.h
new file mode 100644
index 0000000..235677f
--- /dev/null
+++ b/sysdeps/nios2/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  12
diff --git a/sysdeps/powerpc/nptl/pthread-offsets.h b/sysdeps/powerpc/nptl/pthread-offsets.h
new file mode 100644
index 0000000..f88961b
--- /dev/null
+++ b/sysdeps/powerpc/nptl/pthread-offsets.h
@@ -0,0 +1,7 @@ 
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 64
+# define __PTHREAD_MUTEX_KIND_OFFSET  16
+#else
+# define __PTHREAD_MUTEX_KIND_OFFSET  12
+#endif
diff --git a/sysdeps/s390/nptl/pthread-offsets.h b/sysdeps/s390/nptl/pthread-offsets.h
new file mode 100644
index 0000000..f88961b
--- /dev/null
+++ b/sysdeps/s390/nptl/pthread-offsets.h
@@ -0,0 +1,7 @@ 
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 64
+# define __PTHREAD_MUTEX_KIND_OFFSET  16
+#else
+# define __PTHREAD_MUTEX_KIND_OFFSET  12
+#endif
diff --git a/sysdeps/sh/nptl/pthread-offsets.h b/sysdeps/sh/nptl/pthread-offsets.h
new file mode 100644
index 0000000..235677f
--- /dev/null
+++ b/sysdeps/sh/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  12
diff --git a/sysdeps/sparc/nptl/pthread-offsets.h b/sysdeps/sparc/nptl/pthread-offsets.h
new file mode 100644
index 0000000..f88961b
--- /dev/null
+++ b/sysdeps/sparc/nptl/pthread-offsets.h
@@ -0,0 +1,7 @@ 
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 64
+# define __PTHREAD_MUTEX_KIND_OFFSET  16
+#else
+# define __PTHREAD_MUTEX_KIND_OFFSET  12
+#endif
diff --git a/sysdeps/tile/nptl/pthread-offsets.h b/sysdeps/tile/nptl/pthread-offsets.h
new file mode 100644
index 0000000..f88961b
--- /dev/null
+++ b/sysdeps/tile/nptl/pthread-offsets.h
@@ -0,0 +1,7 @@ 
+#include <bits/wordsize.h>
+
+#if __WORDSIZE == 64
+# define __PTHREAD_MUTEX_KIND_OFFSET  16
+#else
+# define __PTHREAD_MUTEX_KIND_OFFSET  12
+#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..aaca502
--- /dev/null
+++ b/sysdeps/x86_64/nptl/pthread-offsets.h
@@ -0,0 +1 @@ 
+#define __PTHREAD_MUTEX_KIND_OFFSET  16