This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH 1/7] nptl: Add tests for internal pthread_rwlock_t offsets
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Wed, 6 Nov 2019 14:49:55 -0300
- Subject: [PATCH 1/7] nptl: Add tests for internal pthread_rwlock_t offsets
This patch new build tests to check for internal fields offsets for
internal pthread_rwlock_t definition. Althoug the '__data.__flags'
field layout should be preserved due static initializators, the patch
also adds tests for the futexes that may be used in a shared memory
(although using different libc version in such scenario is not really
supported).
Checked with a build against all affected ABIs.
---
nptl/pthread_rwlock_init.c | 16 ++++++++++++++++
sysdeps/aarch64/nptl/pthread-offsets.h | 8 ++++++++
sysdeps/alpha/nptl/pthread-offsets.h | 8 ++++++++
sysdeps/arm/nptl/pthread-offsets.h | 13 +++++++++++++
sysdeps/csky/nptl/pthread-offsets.h | 8 ++++++++
sysdeps/hppa/nptl/pthread-offsets.h | 8 ++++++++
sysdeps/i386/nptl/pthread-offsets.h | 8 ++++++++
sysdeps/ia64/nptl/pthread-offsets.h | 8 ++++++++
sysdeps/m68k/nptl/pthread-offsets.h | 8 ++++++++
sysdeps/microblaze/nptl/pthread-offsets.h | 13 +++++++++++++
sysdeps/mips/nptl/pthread-offsets.h | 23 +++++++++++++++++++++++
sysdeps/nios2/nptl/pthread-offsets.h | 8 ++++++++
sysdeps/powerpc/nptl/pthread-offsets.h | 18 ++++++++++++++++++
sysdeps/riscv/nptl/pthread-offsets.h | 8 ++++++++
sysdeps/s390/nptl/pthread-offsets.h | 18 ++++++++++++++++++
sysdeps/sh/nptl/pthread-offsets.h | 13 +++++++++++++
sysdeps/sparc/nptl/pthread-offsets.h | 18 ++++++++++++++++++
sysdeps/x86_64/nptl/pthread-offsets.h | 12 ++++++++++++
18 files changed, 216 insertions(+)
diff --git a/nptl/pthread_rwlock_init.c b/nptl/pthread_rwlock_init.c
index 04f0d40ed8..a485cb81be 100644
--- a/nptl/pthread_rwlock_init.c
+++ b/nptl/pthread_rwlock_init.c
@@ -18,6 +18,7 @@
#include "pthreadP.h"
#include <string.h>
+#include <pthread-offsets.h>
static const struct pthread_rwlockattr default_rwlockattr =
@@ -34,6 +35,21 @@ __pthread_rwlock_init (pthread_rwlock_t *rwlock,
{
ASSERT_TYPE_SIZE (pthread_rwlock_t, __SIZEOF_PTHREAD_RWLOCK_T);
+ ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_rwlock_t, __data.__readers,
+ __PTHREAD_RWLOCK_READERS_OFFSET);
+ ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_rwlock_t, __data.__writers,
+ __PTHREAD_RWLOCK_WRITERS_OFFSET);
+ ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_rwlock_t, __data.__wrphase_futex,
+ __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET);
+ ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_rwlock_t, __data.__writers_futex,
+ __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET);
+ ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_rwlock_t, __data.__cur_writer,
+ __PTHREAD_RWLOCK_CUR_WRITER_OFFSET);
+ ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_rwlock_t, __data.__shared,
+ __PTHREAD_RWLOCK_SHARED_OFFSET);
+ ASSERT_PTHREAD_INTERNAL_OFFSET (pthread_rwlock_t, __data.__flags,
+ __PTHREAD_RWLOCK_FLAGS_OFFSET);
+
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 16c6b0d9fd..679cec5de7 100644
--- a/sysdeps/aarch64/nptl/pthread-offsets.h
+++ b/sysdeps/aarch64/nptl/pthread-offsets.h
@@ -3,3 +3,11 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 24
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 24
+#define __PTHREAD_RWLOCK_SHARED_OFFSET 28
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
diff --git a/sysdeps/alpha/nptl/pthread-offsets.h b/sysdeps/alpha/nptl/pthread-offsets.h
index 16c6b0d9fd..679cec5de7 100644
--- a/sysdeps/alpha/nptl/pthread-offsets.h
+++ b/sysdeps/alpha/nptl/pthread-offsets.h
@@ -3,3 +3,11 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 24
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 24
+#define __PTHREAD_RWLOCK_SHARED_OFFSET 28
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
diff --git a/sysdeps/arm/nptl/pthread-offsets.h b/sysdeps/arm/nptl/pthread-offsets.h
index 9617354dc7..cc2a939222 100644
--- a/sysdeps/arm/nptl/pthread-offsets.h
+++ b/sysdeps/arm/nptl/pthread-offsets.h
@@ -3,3 +3,16 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 20
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+#if __BYTE_ORDER == __BIG_ENDIAN
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 26
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27
+#else
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 25
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 24
+#endif
diff --git a/sysdeps/csky/nptl/pthread-offsets.h b/sysdeps/csky/nptl/pthread-offsets.h
index 9617354dc7..a0eea7a6d3 100644
--- a/sysdeps/csky/nptl/pthread-offsets.h
+++ b/sysdeps/csky/nptl/pthread-offsets.h
@@ -3,3 +3,11 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 20
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+#define __PTHREAD_RWLOCK_SHARED_OFFSET 25
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 24
diff --git a/sysdeps/hppa/nptl/pthread-offsets.h b/sysdeps/hppa/nptl/pthread-offsets.h
index 8ae01b9d95..f5d5b9e5f6 100644
--- a/sysdeps/hppa/nptl/pthread-offsets.h
+++ b/sysdeps/hppa/nptl/pthread-offsets.h
@@ -3,3 +3,11 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 36
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 36
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 16
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 20
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 24
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 28
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 40
+#define __PTHREAD_RWLOCK_SHARED_OFFSET 50
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 51
diff --git a/sysdeps/i386/nptl/pthread-offsets.h b/sysdeps/i386/nptl/pthread-offsets.h
index 9617354dc7..a0eea7a6d3 100644
--- a/sysdeps/i386/nptl/pthread-offsets.h
+++ b/sysdeps/i386/nptl/pthread-offsets.h
@@ -3,3 +3,11 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 20
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+#define __PTHREAD_RWLOCK_SHARED_OFFSET 25
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 24
diff --git a/sysdeps/ia64/nptl/pthread-offsets.h b/sysdeps/ia64/nptl/pthread-offsets.h
index 16c6b0d9fd..679cec5de7 100644
--- a/sysdeps/ia64/nptl/pthread-offsets.h
+++ b/sysdeps/ia64/nptl/pthread-offsets.h
@@ -3,3 +3,11 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 24
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 24
+#define __PTHREAD_RWLOCK_SHARED_OFFSET 28
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
diff --git a/sysdeps/m68k/nptl/pthread-offsets.h b/sysdeps/m68k/nptl/pthread-offsets.h
index 9617354dc7..14d66ace9b 100644
--- a/sysdeps/m68k/nptl/pthread-offsets.h
+++ b/sysdeps/m68k/nptl/pthread-offsets.h
@@ -3,3 +3,11 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 20
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+#define __PTHREAD_RWLOCK_SHARED_OFFSET 26
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 27
diff --git a/sysdeps/microblaze/nptl/pthread-offsets.h b/sysdeps/microblaze/nptl/pthread-offsets.h
index 9617354dc7..cc2a939222 100644
--- a/sysdeps/microblaze/nptl/pthread-offsets.h
+++ b/sysdeps/microblaze/nptl/pthread-offsets.h
@@ -3,3 +3,16 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 20
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+#if __BYTE_ORDER == __BIG_ENDIAN
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 26
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27
+#else
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 25
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 24
+#endif
diff --git a/sysdeps/mips/nptl/pthread-offsets.h b/sysdeps/mips/nptl/pthread-offsets.h
index 0ac3eda3fb..cf96b8868e 100644
--- a/sysdeps/mips/nptl/pthread-offsets.h
+++ b/sysdeps/mips/nptl/pthread-offsets.h
@@ -11,3 +11,26 @@
# define __PTHREAD_MUTEX_ELISION_OFFSET 22
# define __PTHREAD_MUTEX_LIST_OFFSET 20
#endif
+
+#if _MIPS_SIM == _ABI64
+# define __PTHREAD_RWLOCK_READERS_OFFSET 0
+# define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+# define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+# define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+# define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 24
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 28
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
+#else
+# define __PTHREAD_RWLOCK_READERS_OFFSET 0
+# define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+# define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+# define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+# define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+# if __BYTE_ORDER == __BIG_ENDIAN
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 26
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27
+# else
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 25
+# 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 9617354dc7..a0eea7a6d3 100644
--- a/sysdeps/nios2/nptl/pthread-offsets.h
+++ b/sysdeps/nios2/nptl/pthread-offsets.h
@@ -3,3 +3,11 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 20
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+#define __PTHREAD_RWLOCK_SHARED_OFFSET 25
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 24
diff --git a/sysdeps/powerpc/nptl/pthread-offsets.h b/sysdeps/powerpc/nptl/pthread-offsets.h
index bdda1f197e..a9ce40d97f 100644
--- a/sysdeps/powerpc/nptl/pthread-offsets.h
+++ b/sysdeps/powerpc/nptl/pthread-offsets.h
@@ -13,3 +13,21 @@
# define __PTHREAD_MUTEX_ELISION_OFFSET 22
# define __PTHREAD_MUTEX_LIST_OFFSET 20
#endif
+
+#if __WORDSIZE == 64
+# define __PTHREAD_RWLOCK_READERS_OFFSET 0
+# define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+# define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+# define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+# define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 24
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 28
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
+#else
+# define __PTHREAD_RWLOCK_READERS_OFFSET 0
+# define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+# define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+# define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+# define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 26
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27
+#endif
diff --git a/sysdeps/riscv/nptl/pthread-offsets.h b/sysdeps/riscv/nptl/pthread-offsets.h
index f1640047a0..f93af00cfc 100644
--- a/sysdeps/riscv/nptl/pthread-offsets.h
+++ b/sysdeps/riscv/nptl/pthread-offsets.h
@@ -22,3 +22,11 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 24
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 24
+#define __PTHREAD_RWLOCK_SHARED_OFFSET 28
+#define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
diff --git a/sysdeps/s390/nptl/pthread-offsets.h b/sysdeps/s390/nptl/pthread-offsets.h
index bdda1f197e..a9ce40d97f 100644
--- a/sysdeps/s390/nptl/pthread-offsets.h
+++ b/sysdeps/s390/nptl/pthread-offsets.h
@@ -13,3 +13,21 @@
# define __PTHREAD_MUTEX_ELISION_OFFSET 22
# define __PTHREAD_MUTEX_LIST_OFFSET 20
#endif
+
+#if __WORDSIZE == 64
+# define __PTHREAD_RWLOCK_READERS_OFFSET 0
+# define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+# define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+# define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+# define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 24
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 28
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
+#else
+# define __PTHREAD_RWLOCK_READERS_OFFSET 0
+# define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+# define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+# define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+# define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 26
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27
+#endif
diff --git a/sysdeps/sh/nptl/pthread-offsets.h b/sysdeps/sh/nptl/pthread-offsets.h
index 9617354dc7..cc2a939222 100644
--- a/sysdeps/sh/nptl/pthread-offsets.h
+++ b/sysdeps/sh/nptl/pthread-offsets.h
@@ -3,3 +3,16 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 20
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+#if __BYTE_ORDER == __BIG_ENDIAN
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 26
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 27
+#else
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 25
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 24
+#endif
diff --git a/sysdeps/sparc/nptl/pthread-offsets.h b/sysdeps/sparc/nptl/pthread-offsets.h
index bdda1f197e..a9ce40d97f 100644
--- a/sysdeps/sparc/nptl/pthread-offsets.h
+++ b/sysdeps/sparc/nptl/pthread-offsets.h
@@ -13,3 +13,21 @@
# define __PTHREAD_MUTEX_ELISION_OFFSET 22
# define __PTHREAD_MUTEX_LIST_OFFSET 20
#endif
+
+#if __WORDSIZE == 64
+# define __PTHREAD_RWLOCK_READERS_OFFSET 0
+# define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+# define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+# define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+# define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 24
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 28
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
+#else
+# define __PTHREAD_RWLOCK_READERS_OFFSET 0
+# define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+# define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+# define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+# define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 28
+# define __PTHREAD_RWLOCK_SHARED_OFFSET 26
+# 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 16c6b0d9fd..5c0cab0eda 100644
--- a/sysdeps/x86_64/nptl/pthread-offsets.h
+++ b/sysdeps/x86_64/nptl/pthread-offsets.h
@@ -3,3 +3,15 @@
#define __PTHREAD_MUTEX_SPINS_OFFSET 20
#define __PTHREAD_MUTEX_ELISION_OFFSET 22
#define __PTHREAD_MUTEX_LIST_OFFSET 24
+
+#define __PTHREAD_RWLOCK_READERS_OFFSET 0
+#define __PTHREAD_RWLOCK_WRITERS_OFFSET 4
+#define __PTHREAD_RWLOCK_WRPHASE_FUTEX_OFFSET 8
+#define __PTHREAD_RWLOCK_WRITERS_FUTEX_OFFSET 12
+#define __PTHREAD_RWLOCK_CUR_WRITER_OFFSET 24
+#define __PTHREAD_RWLOCK_SHARED_OFFSET 28
+#ifdef __ILP32__
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 40
+#else
+# define __PTHREAD_RWLOCK_FLAGS_OFFSET 48
+#endif
--
2.17.1