Message ID | 1508186653-24430-3-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
Series | [1/3] Define __PTHREAD_MUTEX_HAVE_PREV for all architectures [BZ #22298] | expand |
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. -- H.J.
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.
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