diff --git a/nptl/pthread_rwlock_init.c b/nptl/pthread_rwlock_init.c index 04f0d40ed8..8813e32383 100644 --- a/nptl/pthread_rwlock_init.c +++ b/nptl/pthread_rwlock_init.c @@ -18,6 +18,7 @@ #include "pthreadP.h" #include +#include static const struct pthread_rwlockattr default_rwlockattr = @@ -34,6 +35,13 @@ __pthread_rwlock_init (pthread_rwlock_t *rwlock, { ASSERT_TYPE_SIZE (pthread_rwlock_t, __SIZEOF_PTHREAD_RWLOCK_T); + /* The __flags is the only field where its offset should be checked to + avoid ABI breakage with static initializers. */ + ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_rwlock_t, __data.__flags, + __PTHREAD_RWLOCK_FLAGS_OFFSET); + ASSERT_PTHREAD_INTERNAL_MEMBER_SIZE (pthread_rwlock_t, __data.__flags, + int); + const struct pthread_rwlockattr *iattr; iattr = ((const struct pthread_rwlockattr *) attr) ?: &default_rwlockattr; diff --git a/sysdeps/aarch64/nptl/pthread-offsets.h b/sysdeps/aarch64/nptl/pthread-offsets.h index 8208f6f177..7fe06e0e25 100644 --- a/sysdeps/aarch64/nptl/pthread-offsets.h +++ b/sysdeps/aarch64/nptl/pthread-offsets.h @@ -1 +1,3 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 16 + +#define __PTHREAD_RWLOCK_FLAGS_OFFSET 48 diff --git a/sysdeps/alpha/nptl/pthread-offsets.h b/sysdeps/alpha/nptl/pthread-offsets.h index 8208f6f177..7fe06e0e25 100644 --- a/sysdeps/alpha/nptl/pthread-offsets.h +++ b/sysdeps/alpha/nptl/pthread-offsets.h @@ -1 +1,3 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 16 + +#define __PTHREAD_RWLOCK_FLAGS_OFFSET 48 diff --git a/sysdeps/arm/nptl/pthread-offsets.h b/sysdeps/arm/nptl/pthread-offsets.h index e4e775d7ed..e9accba31c 100644 --- a/sysdeps/arm/nptl/pthread-offsets.h +++ b/sysdeps/arm/nptl/pthread-offsets.h @@ -1 +1,7 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 12 + +#if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27 +#else +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 24 +#endif diff --git a/sysdeps/csky/nptl/pthread-offsets.h b/sysdeps/csky/nptl/pthread-offsets.h index e4e775d7ed..7940d1fd88 100644 --- a/sysdeps/csky/nptl/pthread-offsets.h +++ b/sysdeps/csky/nptl/pthread-offsets.h @@ -1 +1,3 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 12 + +#define __PTHREAD_RWLOCK_FLAGS_OFFSET 24 diff --git a/sysdeps/hppa/nptl/pthread-offsets.h b/sysdeps/hppa/nptl/pthread-offsets.h index e4e775d7ed..1c11eff10b 100644 --- a/sysdeps/hppa/nptl/pthread-offsets.h +++ b/sysdeps/hppa/nptl/pthread-offsets.h @@ -1 +1,3 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 12 + +#define __PTHREAD_RWLOCK_FLAGS_OFFSET 51 diff --git a/sysdeps/i386/nptl/pthread-offsets.h b/sysdeps/i386/nptl/pthread-offsets.h index e4e775d7ed..7940d1fd88 100644 --- a/sysdeps/i386/nptl/pthread-offsets.h +++ b/sysdeps/i386/nptl/pthread-offsets.h @@ -1 +1,3 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 12 + +#define __PTHREAD_RWLOCK_FLAGS_OFFSET 24 diff --git a/sysdeps/ia64/nptl/pthread-offsets.h b/sysdeps/ia64/nptl/pthread-offsets.h index 8208f6f177..7fe06e0e25 100644 --- a/sysdeps/ia64/nptl/pthread-offsets.h +++ b/sysdeps/ia64/nptl/pthread-offsets.h @@ -1 +1,3 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 16 + +#define __PTHREAD_RWLOCK_FLAGS_OFFSET 48 diff --git a/sysdeps/m68k/nptl/pthread-offsets.h b/sysdeps/m68k/nptl/pthread-offsets.h index e4e775d7ed..4d6696ae56 100644 --- a/sysdeps/m68k/nptl/pthread-offsets.h +++ b/sysdeps/m68k/nptl/pthread-offsets.h @@ -1 +1,3 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 12 + +#define __PTHREAD_RWLOCK_FLAGS_OFFSET 27 diff --git a/sysdeps/microblaze/nptl/pthread-offsets.h b/sysdeps/microblaze/nptl/pthread-offsets.h index e4e775d7ed..e9accba31c 100644 --- a/sysdeps/microblaze/nptl/pthread-offsets.h +++ b/sysdeps/microblaze/nptl/pthread-offsets.h @@ -1 +1,7 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 12 + +#if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27 +#else +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 24 +#endif diff --git a/sysdeps/mips/nptl/pthread-offsets.h b/sysdeps/mips/nptl/pthread-offsets.h index e96d34afd7..e52b347531 100644 --- a/sysdeps/mips/nptl/pthread-offsets.h +++ b/sysdeps/mips/nptl/pthread-offsets.h @@ -3,3 +3,13 @@ #else # define __PTHREAD_MUTEX_KIND_OFFSET 12 #endif + +#if _MIPS_SIM == _ABI64 +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 48 +#else +# if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27 +# else +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 24 +# endif +#endif diff --git a/sysdeps/nios2/nptl/pthread-offsets.h b/sysdeps/nios2/nptl/pthread-offsets.h index e4e775d7ed..7940d1fd88 100644 --- a/sysdeps/nios2/nptl/pthread-offsets.h +++ b/sysdeps/nios2/nptl/pthread-offsets.h @@ -1 +1,3 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 12 + +#define __PTHREAD_RWLOCK_FLAGS_OFFSET 24 diff --git a/sysdeps/powerpc/nptl/pthread-offsets.h b/sysdeps/powerpc/nptl/pthread-offsets.h index 25b5bf2cbd..9e2112120b 100644 --- a/sysdeps/powerpc/nptl/pthread-offsets.h +++ b/sysdeps/powerpc/nptl/pthread-offsets.h @@ -5,3 +5,9 @@ #else # define __PTHREAD_MUTEX_KIND_OFFSET 12 #endif + +#if __WORDSIZE == 64 +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 48 +#else +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27 +#endif diff --git a/sysdeps/riscv/nptl/pthread-offsets.h b/sysdeps/riscv/nptl/pthread-offsets.h index 6fc032fdc2..4f14276f9c 100644 --- a/sysdeps/riscv/nptl/pthread-offsets.h +++ b/sysdeps/riscv/nptl/pthread-offsets.h @@ -18,3 +18,5 @@ . */ #define __PTHREAD_MUTEX_KIND_OFFSET 16 + +#define __PTHREAD_RWLOCK_FLAGS_OFFSET 48 diff --git a/sysdeps/s390/nptl/pthread-offsets.h b/sysdeps/s390/nptl/pthread-offsets.h index 25b5bf2cbd..9e2112120b 100644 --- a/sysdeps/s390/nptl/pthread-offsets.h +++ b/sysdeps/s390/nptl/pthread-offsets.h @@ -5,3 +5,9 @@ #else # define __PTHREAD_MUTEX_KIND_OFFSET 12 #endif + +#if __WORDSIZE == 64 +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 48 +#else +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27 +#endif diff --git a/sysdeps/sh/nptl/pthread-offsets.h b/sysdeps/sh/nptl/pthread-offsets.h index e4e775d7ed..e9accba31c 100644 --- a/sysdeps/sh/nptl/pthread-offsets.h +++ b/sysdeps/sh/nptl/pthread-offsets.h @@ -1 +1,7 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 12 + +#if __BYTE_ORDER == __BIG_ENDIAN +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27 +#else +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 24 +#endif diff --git a/sysdeps/sparc/nptl/pthread-offsets.h b/sysdeps/sparc/nptl/pthread-offsets.h index 25b5bf2cbd..9e2112120b 100644 --- a/sysdeps/sparc/nptl/pthread-offsets.h +++ b/sysdeps/sparc/nptl/pthread-offsets.h @@ -5,3 +5,9 @@ #else # define __PTHREAD_MUTEX_KIND_OFFSET 12 #endif + +#if __WORDSIZE == 64 +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 48 +#else +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27 +#endif diff --git a/sysdeps/x86_64/nptl/pthread-offsets.h b/sysdeps/x86_64/nptl/pthread-offsets.h index 8208f6f177..a311da40c6 100644 --- a/sysdeps/x86_64/nptl/pthread-offsets.h +++ b/sysdeps/x86_64/nptl/pthread-offsets.h @@ -1 +1,7 @@ #define __PTHREAD_MUTEX_KIND_OFFSET 16 + +#ifdef __ILP32__ +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 40 +#else +# define __PTHREAD_RWLOCK_FLAGS_OFFSET 48 +#endif