summaryrefslogtreecommitdiff
path: root/test/tls
diff options
context:
space:
mode:
Diffstat (limited to 'test/tls')
-rw-r--r--test/tls/Makefile.in6
-rw-r--r--test/tls/tls-macros-aarch64.h52
-rw-r--r--test/tls/tls-macros-arc.h14
-rw-r--r--test/tls/tls-macros-csky.h55
-rw-r--r--test/tls/tls-macros-nios2.h46
-rw-r--r--test/tls/tls-macros-or1k.h75
-rw-r--r--test/tls/tls-macros-powerpc.h2
-rw-r--r--test/tls/tls-macros-powerpc64.h43
-rw-r--r--test/tls/tls-macros-riscv.h41
-rw-r--r--test/tls/tls-macros-xtensa.h82
-rw-r--r--test/tls/tls-macros.h28
-rw-r--r--test/tls/tst-tls6.c25
-rw-r--r--test/tls/tst-tls7.c25
-rw-r--r--test/tls/tst-tls8.c95
14 files changed, 429 insertions, 160 deletions
diff --git a/test/tls/Makefile.in b/test/tls/Makefile.in
index 6a6a50e..348fc1c 100644
--- a/test/tls/Makefile.in
+++ b/test/tls/Makefile.in
@@ -1,6 +1,12 @@
# uClibc-ng TLS tests
# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+CFLAGS += -DUSE_TLS=1 -DHAVE___THREAD=1 -I.
+
+ifneq ($(ARCH),alpha)
+CFLAGS += -DHAVE_TLS_MODEL_ATTRIBUTE=1
+endif
+
TESTS := tst-tls1 tst-tls2 tst-tls3 tst-tls4 tst-tls5 tst-tls6 tst-tls7 \
tst-tls8 tst-tls9 tst-tls10 tst-tls11 tst-tls12 tst-tls13 \
tst-tls14 tst-tls15 tst-tls16 tst-tls17 tst-tls18 tst-tls-at-ctor \
diff --git a/test/tls/tls-macros-aarch64.h b/test/tls/tls-macros-aarch64.h
new file mode 100644
index 0000000..41a1384
--- /dev/null
+++ b/test/tls/tls-macros-aarch64.h
@@ -0,0 +1,52 @@
+/* Copyright (C) 2009-2020 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
+ <https://www.gnu.org/licenses/>. */
+
+#define TLS_LD(x) TLS_GD(x)
+
+#define TLS_GD(x) \
+ ({ register unsigned long __result asm ("x0"); \
+ asm ("adrp %0, :tlsgd:" #x "; " \
+ "add %0, %0, #:tlsgd_lo12:" #x "; " \
+ "bl __tls_get_addr;" \
+ "nop" \
+ : "=r" (__result) \
+ : \
+ : "x1", "x2", "x3", "x4", "x5", "x6", \
+ "x7", "x8", "x9", "x10", "x11", "x12", \
+ "x13", "x14", "x15", "x16", "x17", "x18", \
+ "x30", "memory", "cc"); \
+ (int *) (__result); })
+
+#define TLS_IE(x) \
+ ({ register unsigned long __result asm ("x0"); \
+ register unsigned long __t; \
+ asm ("mrs %1, tpidr_el0; " \
+ "adrp %0, :gottprel:" #x "; " \
+ "ldr %0, [%0, #:gottprel_lo12:" #x "]; " \
+ "add %0, %0, %1" \
+ : "=r" (__result), "=r" (__t)); \
+ (int *) (__result); })
+
+#define TLS_LE(x) \
+ ({ register unsigned long __result asm ("x0"); \
+ asm ("mrs %0, tpidr_el0; " \
+ "add %0, %0, :tprel_hi12:" #x "; " \
+ "add %0, %0, :tprel_lo12_nc:" #x \
+ : "=r" (__result)); \
+ (int *) (__result); })
+
diff --git a/test/tls/tls-macros-arc.h b/test/tls/tls-macros-arc.h
index 4b2d6f8..2f621d5 100644
--- a/test/tls/tls-macros-arc.h
+++ b/test/tls/tls-macros-arc.h
@@ -2,14 +2,12 @@
#define TLS_LD(x) TLS_IE(x)
#define TLS_GD(x) \
- ({ int *__result; \
- __asm__ ("add r0, pcl, @" #x "@tlsgd \n" \
- ".tls_gd_ld " #x "`bl __tls_get_addr@plt \n" \
- "mov %0, r0 \n" \
- : "=&r" (__result) \
- ::"r0","r1","r2","r3","r4","r5","r6","r7", \
- "r8","r9","r10","r11","r12"); \
- __result; })
+ ({ void *__result; \
+ extern void *__tls_get_addr (void *); \
+ __asm__ ("add %0, pcl, @" #x "@tlsgd \n" \
+ ".tls_gd_ld " #x " \n" \
+ : "=r" (__result)); \
+ (int *)__tls_get_addr(__result); })
#define TLS_LE(x) \
({ int *__result; \
diff --git a/test/tls/tls-macros-csky.h b/test/tls/tls-macros-csky.h
new file mode 100644
index 0000000..b7656a1
--- /dev/null
+++ b/test/tls/tls-macros-csky.h
@@ -0,0 +1,55 @@
+/* Macros for accessing thread-local storage. C-SKY ABIV2 version.
+ Copyright (C) 2018-2020 Free Software Foundation, Inc.
+
+ 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
+ <https://www.gnu.org/licenses/>. */
+
+# define TLS_LE(x) \
+ ({ int *__result; \
+ __asm__ ("lrw %0, " #x "@TPOFF\n\t" \
+ "add %0, tls, %0" \
+ : "=&r" (__result)); \
+ __result; })
+
+# define TLS_IE(x) \
+ ({ int *__result; \
+ __asm__ ("grs a1, 1f\n" \
+ "1:\tlrw %0, " #x "@GOTTPOFF\n\t" \
+ "ldr.w %0, (a1, %0 << 0)\n\t" \
+ "add %0, tls, %0" \
+ : "=&r" (__result): : "a1"); \
+ __result; })
+
+# define TLS_LD(x) \
+ ({ char *__result; \
+ int __offset; \
+ extern void *__tls_get_addr (void *); \
+ __asm__ ("grs a1, 1f\n" \
+ "1:\tlrw %0, " #x "@TLSLDM32;\n\t" \
+ "add %0, a1, %0" \
+ : "=r" (__result) : : "a1"); \
+ __result = (char *)__tls_get_addr (__result); \
+ __asm__ ("lrw %0, " #x "@TLSLDO32" \
+ : "=r" (__offset)); \
+ (int *) (__result + __offset); })
+
+# define TLS_GD(x) \
+ ({ int *__result; \
+ extern void *__tls_get_addr (void *); \
+ __asm__ ("grs a1, 1f\n" \
+ "1:\tlrw %0, " #x "@TLSGD32\n\t" \
+ "add %0, a1, %0" \
+ : "=r" (__result) : : "a1"); \
+ (int *)__tls_get_addr (__result); })
+
diff --git a/test/tls/tls-macros-nios2.h b/test/tls/tls-macros-nios2.h
new file mode 100644
index 0000000..7029530
--- /dev/null
+++ b/test/tls/tls-macros-nios2.h
@@ -0,0 +1,46 @@
+#define TLS_LE(x) \
+ ({ int *__result; \
+ asm ("addi %0, r23, %%tls_le(" #x ")" \
+ : "=r" (__result)); \
+ __result; })
+
+#define TLS_IE(x) \
+ ({ int *__result; \
+ int __tmp; \
+ asm ("nextpc %0 ; " \
+ "1: movhi %1, %%hiadj(_gp_got - 1b) ; " \
+ "addi %1, %1, %%lo(_gp_got - 1b) ; " \
+ "add %0, %0, %1 ; " \
+ "ldw %1, %%tls_ie(" #x ")(%0) ; " \
+ "add %1, r23, %1" \
+ : "=&r" (__tmp), "=&r" (__result)); \
+ __result; })
+
+#define TLS_LD(x) \
+ ({ char *__result; \
+ char *__result2; \
+ int *__result3; \
+ int __tmp; \
+ extern void *__tls_get_addr (void *); \
+ asm ("nextpc %0 ; " \
+ "1: movhi %1, %%hiadj(_gp_got - 1b) ; " \
+ "addi %1, %1, %%lo(_gp_got - 1b) ; " \
+ "add %0, %0, %1 ; " \
+ "addi %0, %0, %%tls_ldm(" #x ")" \
+ : "=r" (__result), "=r" (__tmp)); \
+ __result2 = (char *)__tls_get_addr (__result); \
+ asm ("addi %0, %1, %%tls_ldo(" #x ")" \
+ : "=r" (__result3) : "r" (__result2)); \
+ __result3; })
+
+#define TLS_GD(x) \
+ ({ int *__result; \
+ int __tmp; \
+ extern void *__tls_get_addr (void *); \
+ asm ("nextpc %0 ; " \
+ "1: movhi %1, %%hiadj(_gp_got - 1b) ; " \
+ "addi %1, %1, %%lo(_gp_got - 1b) ; " \
+ "add %0, %0, %1 ; " \
+ "addi %0, %0, %%tls_gd(" #x ")" \
+ : "=r" (__result), "=r" (__tmp)); \
+ (int *)__tls_get_addr (__result); })
diff --git a/test/tls/tls-macros-or1k.h b/test/tls/tls-macros-or1k.h
new file mode 100644
index 0000000..dcf78d6
--- /dev/null
+++ b/test/tls/tls-macros-or1k.h
@@ -0,0 +1,75 @@
+/* Macros to support TLS testing, OpenRISC version.
+ Copyright (C) 2019 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/>. */
+
+#define TLS_LOAD_GOT \
+ ({ register long lr __asm__ ("r9"); \
+ long got; \
+ asm ("l.jal 0x8\n\t" \
+ " l.movhi %0, gotpchi(_GLOBAL_OFFSET_TABLE_-4)\n\t" \
+ "l.ori %0, %0, gotpclo(_GLOBAL_OFFSET_TABLE_+0)\n\t" \
+ "l.add %0, %0, %1" \
+ : "=r" (got), "=r" (lr)); \
+ got; })
+
+/* General Dynamic:
+ l.movhi r17, tlsgdhi(symbol)
+ l.ori r17, r17, tlsgdlo(symbol)
+ l.add r17, r17, r16
+ l.or r3, r17, r17
+ l.jal plt(__tls_get_addr)
+ l.nop */
+
+#define TLS_GD(x) \
+ ({ void *__tlsgd; \
+ extern void *__tls_get_addr (void *); \
+ asm ("l.movhi %0, tlsgdhi(" #x ")\n\t" \
+ "l.ori %0, %0, tlsgdlo(" #x ")\n\t" \
+ : "=r" (__tlsgd)); \
+ (int *) __tls_get_addr (TLS_LOAD_GOT + __tlsgd); })
+
+#define TLS_LD(x) TLS_GD(x)
+
+/* Initial Exec:
+ l.movhi r17, gottpoffhi(symbol)
+ l.add r17, r17, r16
+ l.lwz r17, gottpofflo(symbol)(r17)
+ l.add r17, r17, r10
+ l.lbs r17, 0(r17) */
+
+#define TLS_IE(x) \
+ ({ register long __tls __asm__ ("r10"); \
+ void *__tlsie; \
+ asm ("l.movhi %0, gottpoffhi(" #x ")\n\t" \
+ "l.add %0, %0, %1\n\t" \
+ "l.lwz %0, gottpofflo(" #x ")(%0)\n\t" \
+ "l.add %0, %0, %2\n\t" \
+ : "=&r" (__tlsie) : "r" (TLS_LOAD_GOT), \
+ "r" (__tls) : "memory"); \
+ __tlsie; })
+
+/* Local Exec:
+ l.movhi r17, tpoffha(symbol)
+ l.add r17, r17, r10
+ l.addi r17, r17, tpofflo(symbol)
+ l.lbs r17, 0(r17) */
+
+#define TLS_LE(x) \
+ ({ register long __tls __asm__ ("r10"); \
+ void *__tlsle; \
+ asm ("l.movhi %0, tpoffha(" #x ")\n\t" \
+ "l.add %0, %0, %1\n\t" \
+ "l.addi %0, %0, tpofflo(" #x ")\n\t" \
+ : "=&r" (__tlsle) : "r" (__tls) : "memory"); \
+ __tlsle; })
diff --git a/test/tls/tls-macros-powerpc.h b/test/tls/tls-macros-powerpc.h
index ef293bb..8a368fa 100644
--- a/test/tls/tls-macros-powerpc.h
+++ b/test/tls/tls-macros-powerpc.h
@@ -1,5 +1,5 @@
#define __TLS_CALL_CLOBBERS \
- "0", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", \
+ "0", "4", "5", "6", "7", "8", "9", "10", "11", "12", \
"lr", "ctr", "cr0", "cr1", "cr5", "cr6", "cr7"
/* PowerPC32 Local Exec TLS access. */
diff --git a/test/tls/tls-macros-powerpc64.h b/test/tls/tls-macros-powerpc64.h
new file mode 100644
index 0000000..6021664
--- /dev/null
+++ b/test/tls/tls-macros-powerpc64.h
@@ -0,0 +1,43 @@
+#define __TLS_CALL_CLOBBERS \
+ "0", "4", "5", "6", "7", "8", "9", "10", "11", "12", \
+ "lr", "ctr", "cr0", "cr1", "cr5", "cr6", "cr7"
+
+/* PowerPC64 Local Exec TLS access. */
+#define TLS_LE(x) \
+ ({ int * __result; \
+ asm ("addis %0,13," #x "@tprel@ha\n\t" \
+ "addi %0,%0," #x "@tprel@l" \
+ : "=b" (__result) ); \
+ __result; \
+ })
+/* PowerPC64 Initial Exec TLS access. */
+#define TLS_IE(x) \
+ ({ int * __result; \
+ asm ("ld %0," #x "@got@tprel(2)\n\t" \
+ "add %0,%0," #x "@tls" \
+ : "=r" (__result) ); \
+ __result; \
+ })
+
+/* PowerPC64 Local Dynamic TLS access. */
+#define TLS_LD(x) \
+ ({ int * __result; \
+ asm ("addi 3,2," #x "@got@tlsld\n\t" \
+ "bl __tls_get_addr\n\t" \
+ "nop \n\t" \
+ "addis %0,3," #x "@dtprel@ha\n\t" \
+ "addi %0,%0," #x "@dtprel@l" \
+ : "=b" (__result) : \
+ : "3", __TLS_CALL_CLOBBERS); \
+ __result; \
+ })
+/* PowerPC64 General Dynamic TLS access. */
+#define TLS_GD(x) \
+ ({ register int *__result __asm__ ("r3"); \
+ asm ("addi 3,2," #x "@got@tlsgd\n\t" \
+ "bl __tls_get_addr\n\t" \
+ "nop " \
+ : "=r" (__result) : \
+ : __TLS_CALL_CLOBBERS); \
+ __result; \
+ })
diff --git a/test/tls/tls-macros-riscv.h b/test/tls/tls-macros-riscv.h
new file mode 100644
index 0000000..b780b4f
--- /dev/null
+++ b/test/tls/tls-macros-riscv.h
@@ -0,0 +1,41 @@
+/* Macros to support TLS testing in times of missing compiler support.
+ Copyright (C) 2017-2020 Free Software Foundation, Inc.
+
+ 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
+ <https://www.gnu.org/licenses/>. */
+
+#define TLS_GD(x) \
+ ({ void *__result; \
+ extern void *__tls_get_addr (void *); \
+ asm ("la.tls.gd %0, " #x "\n\t" \
+ : "=r" (__result)); \
+ __tls_get_addr (__result); })
+
+#define TLS_LD(x) TLS_GD(x)
+
+#define TLS_IE(x) \
+ ({ void *__result; \
+ asm ("la.tls.ie %0, " #x "\n\t" \
+ "add %0, %0, tp\n\t" \
+ : "=r" (__result)); \
+ __result; })
+
+#define TLS_LE(x) \
+ ({ void *__result; \
+ asm ("lui %0, %%tprel_hi(" #x ")\n\t" \
+ "add %0, %0, tp, %%tprel_add(" #x ")\n\t" \
+ "addi %0, %0, %%tprel_lo(" #x ")\n\t" \
+ : "=r" (__result)); \
+ __result; })
+
diff --git a/test/tls/tls-macros-xtensa.h b/test/tls/tls-macros-xtensa.h
index 179dc5e..6b2621c 100644
--- a/test/tls/tls-macros-xtensa.h
+++ b/test/tls/tls-macros-xtensa.h
@@ -15,13 +15,85 @@
__asm__ ("movi a8, _TLS_MODULE_BASE_@TLSFUNC\n\t" \
"movi a10, _TLS_MODULE_BASE_@TLSARG\n\t" \
"callx8.tls a8, _TLS_MODULE_BASE_@TLSCALL\n\t" \
- "movi %0, " #x "@TPOFF\n\t" \
+ "movi %0, " #x "@DTPOFF\n\t" \
"add %0, %0, a10\n\t" \
: "=r" (__l) \
: \
: "a8", "a9", "a10", "a11", "a12", "a13", "a14", "a15"); \
__l; })
#elif defined(__XTENSA_CALL0_ABI__)
+#ifdef __FDPIC__
+#define TLS_GD(x) \
+ ({ int *__l; \
+ int __t; \
+ extern unsigned long _GLOBAL_OFFSET_TABLE_[]; \
+ __asm__ ("movi %[tmp], " #x "@GOTTLSDESC\n\t" \
+ ".reloc ., R_XTENSA_TLS_ARG, " #x "\n\t" \
+ "add a2, %[tmp], %[got]\n\t" \
+ ".reloc ., R_XTENSA_TLS_FUNCDESC, " #x "\n\t" \
+ "l32i %[tmp], a2, 0\n\t" \
+ "mov a12, a11\n\t" \
+ ".reloc ., R_XTENSA_TLS_GOT, " #x "\n\t" \
+ "l32i a11, %[tmp], 4\n\t" \
+ ".reloc ., R_XTENSA_TLS_FUNC, " #x "\n\t" \
+ "_l32i %[tmp], %[tmp], 0\n\t" \
+ ".reloc ., R_XTENSA_TLS_CALL, " #x "\n\t" \
+ "callx0 %[tmp]\n\t" \
+ "mov a11, a12\n\t" \
+ "mov %[res], a2\n\t" \
+ : [res] "=r" (__l), [tmp] "=&r" (__t) \
+ : [got] "r" (_GLOBAL_OFFSET_TABLE_) \
+ : "a0", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a12");\
+ __l; })
+
+#define TLS_LD(x) \
+ ({ int *__l; \
+ int __t; \
+ extern unsigned long _GLOBAL_OFFSET_TABLE_[]; \
+ __asm__ ("movi %[tmp], _TLS_MODULE_BASE_@GOTTLSDESC\n\t" \
+ ".reloc ., R_XTENSA_TLS_ARG, _TLS_MODULE_BASE_\n\t" \
+ "add a2, %[tmp], %[got]\n\t" \
+ ".reloc ., R_XTENSA_TLS_FUNCDESC, _TLS_MODULE_BASE_\n\t"\
+ "l32i %[tmp], a2, 0\n\t" \
+ "mov a12, a11\n\t" \
+ ".reloc ., R_XTENSA_TLS_GOT, _TLS_MODULE_BASE_\n\t" \
+ "l32i a11, %[tmp], 4\n\t" \
+ ".reloc ., R_XTENSA_TLS_FUNC, _TLS_MODULE_BASE_\n\t" \
+ "_l32i %[tmp], %[tmp], 0\n\t" \
+ ".reloc ., R_XTENSA_TLS_CALL, _TLS_MODULE_BASE_\n\t" \
+ "callx0 %[tmp]\n\t" \
+ "mov a11, a12\n\t" \
+ "movi %[res], " #x "@DTPOFF\n\t" \
+ "add %[res], %[res], a2\n\t" \
+ : [res] "=r" (__l), [tmp] "=&r" (__t) \
+ : [got] "r" (_GLOBAL_OFFSET_TABLE_) \
+ : "a0", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a12");\
+ __l; })
+
+#define TLS_IE(x) \
+ ({ int *__l; \
+ int __t; \
+ extern unsigned long _GLOBAL_OFFSET_TABLE_[]; \
+ __asm__ ("movi %[tmp], " #x "@GOTTPOFF\n\t" \
+ ".reloc ., R_XTENSA_TLS_TPOFF_PTR, " #x "\n\t" \
+ "add %[tmp], %[tmp], %[got]\n\t" \
+ ".reloc ., R_XTENSA_TLS_TPOFF_LOAD, " #x "\n\t" \
+ "l32i %[tmp], %[tmp], 0\n\t" \
+ "rur %[res], threadptr\n\t" \
+ "add %[res], %[res], %[tmp]\n\t" \
+ : [res] "=r" (__l), [tmp] "=&r" (__t) \
+ : [got] "r" (_GLOBAL_OFFSET_TABLE_)); \
+ __l; })
+
+#define TLS_LE(x) \
+ ({ int *__l; \
+ int __t; \
+ __asm__ ("rur %0, threadptr\n\t" \
+ "movi %1, " #x "@TPOFF\n\t" \
+ "add %0, %0, %1\n\t" \
+ : "=r" (__l), "=r" (__t) ); \
+ __l; })
+#else
#define TLS_GD(x) \
({ int *__l; \
__asm__ ("movi a0, " #x "@TLSFUNC\n\t" \
@@ -38,16 +110,18 @@
__asm__ ("movi a0, _TLS_MODULE_BASE_@TLSFUNC\n\t" \
"movi a2, _TLS_MODULE_BASE_@TLSARG\n\t" \
"callx0.tls a0, _TLS_MODULE_BASE_@TLSCALL\n\t" \
- "movi %0, " #x "@TPOFF\n\t" \
+ "movi %0, " #x "@DTPOFF\n\t" \
"add %0, %0, a2\n\t" \
: "=r" (__l) \
: \
: "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11");\
__l; })
+#endif
#else
#error Unsupported Xtensa ABI
#endif
+#ifndef __FDPIC__
#define TLS_IE(x) TLS_LE(x)
#define TLS_LE(x) \
@@ -57,5 +131,5 @@
"movi %1, " #x "@TPOFF\n\t" \
"add %0, %0, %1\n\t" \
: "=r" (__l), "=r" (__t) ); \
- __l; }); \
-
+ __l; })
+#endif
diff --git a/test/tls/tls-macros.h b/test/tls/tls-macros.h
index 9053d8d..a94c3d2 100644
--- a/test/tls/tls-macros.h
+++ b/test/tls/tls-macros.h
@@ -16,11 +16,15 @@
/* XXX Until we get compiler support we don't need declarations. */
#define VAR_INT_DECL(x)
+#ifdef __aarch64__
+#include <tls-macros-aarch64.h>
+#endif
+
#ifdef __alpha__
#include <tls-macros-alpha.h>
#endif
-#ifdef __arc__
+#if defined(__arc__) || defined(__ARC64_ARCH32__)
#include <tls-macros-arc.h>
#endif
@@ -32,6 +36,10 @@
#endif
#endif
+#ifdef __csky__
+#include <tls-macros-csky.h>
+#endif
+
#ifdef __i386__
#include <tls-macros-i386.h>
#endif
@@ -56,10 +64,22 @@
#include <tls-macros-mips.h>
#endif
-#ifdef __powerpc__
+#ifdef __nios2__
+#include <tls-macros-nios2.h>
+#endif
+
+#if defined(__powerpc__) && !defined(__powerpc64__)
#include <tls-macros-powerpc.h>
#endif
+#if defined(__powerpc__) && defined(__powerpc64__)
+#include <tls-macros-powerpc64.h>
+#endif
+
+#ifdef __riscv
+#include <tls-macros-riscv.h>
+#endif
+
#ifdef __sh__
#include <tls-macros-sh.h>
#endif
@@ -76,6 +96,10 @@
#include <tls-macros-xtensa.h>
#endif
+#ifdef __or1k__
+#include <tls-macros-or1k.h>
+#endif
+
#if !defined TLS_LE || !defined TLS_IE \
|| !defined TLS_LD || !defined TLS_GD
# error "No support for this architecture so far."
diff --git a/test/tls/tst-tls6.c b/test/tls/tst-tls6.c
index 7cc8f6b..b9a5609 100644
--- a/test/tls/tst-tls6.c
+++ b/test/tls/tst-tls6.c
@@ -26,31 +26,6 @@ do_test (void)
exit (1);
}
- /* Dirty test code here: we peek into a private data structure.
- We make sure that the module gets assigned the same ID every
- time. The value of the first round is used. */
-#ifdef __UCLIBC__
- if (modid == -1)
- modid = ((struct dyn_elf *) h)->dyn->l_tls_modid;
- else if (((struct dyn_elf *)h)->dyn->l_tls_modid != (size_t) modid)
- {
- printf ("round %d: modid now %zu, initially %d\n",
- i,
- ((struct dyn_elf *)h)->dyn->l_tls_modid,
- modid);
- result = 1;
- }
-#else
- if (modid == -1)
- modid = ((struct link_map *) h)->l_tls_modid;
- else if (((struct link_map *) h)->l_tls_modid != modid)
- {
- printf ("round %d: modid now %zd, initially %d\n",
- i, ((struct link_map *) h)->l_tls_modid, modid);
- result = 1;
- }
-#endif
-
foop = dlsym (h, "foo");
if (foop == NULL)
{
diff --git a/test/tls/tst-tls7.c b/test/tls/tst-tls7.c
index b8bb71d..b0a6d37 100644
--- a/test/tls/tst-tls7.c
+++ b/test/tls/tst-tls7.c
@@ -24,31 +24,6 @@ do_test (void)
exit (1);
}
- /* Dirty test code here: we peek into a private data structure.
- We make sure that the module gets assigned the same ID every
- time. The value of the first round is used. */
-#ifdef __UCLIBC__
- if (modid == -1)
- modid = ((struct dyn_elf *) h)->dyn->l_tls_modid;
- else if (((struct dyn_elf *)h)->dyn->l_tls_modid != (size_t) modid)
- {
- printf ("round %d: modid now %zu, initially %d\n",
- i,
- ((struct dyn_elf *)h)->dyn->l_tls_modid,
- modid);
- result = 1;
- }
-#else
- if (modid == -1)
- modid = ((struct link_map *) h)->l_tls_modid;
- else if (((struct link_map *) h)->l_tls_modid != (size_t) modid)
- {
- printf ("round %d: modid now %zu, initially %d\n",
- i, ((struct link_map *) h)->l_tls_modid, modid);
- result = 1;
- }
-#endif
-
fp = dlsym (h, "in_dso2");
if (fp == NULL)
{
diff --git a/test/tls/tst-tls8.c b/test/tls/tst-tls8.c
index 4635304..a723cab 100644
--- a/test/tls/tst-tls8.c
+++ b/test/tls/tst-tls8.c
@@ -29,31 +29,6 @@ do_test (void)
exit (1);
}
- /* Dirty test code here: we peek into a private data structure.
- We make sure that the module gets assigned the same ID every
- time. The value of the first round is used. */
-#ifdef __UCLIBC__
- if (modid1 == (size_t) -1)
- modid1 = ((struct dyn_elf *) h1)->dyn->l_tls_modid;
- else if (((struct dyn_elf *)h1)->dyn->l_tls_modid != (size_t) modid1)
- {
- printf ("round %d: modid now %zd, initially %zd\n",
- i,
- ((struct dyn_elf *)h1)->dyn->l_tls_modid,
- modid1);
- result = 1;
- }
-#else
- if (modid1 == (size_t) -1)
- modid1 = ((struct link_map *) h1)->l_tls_modid;
- else if (((struct link_map *) h1)->l_tls_modid != modid1)
- {
- printf ("round %d: modid now %zd, initially %zd\n",
- i, ((struct link_map *) h1)->l_tls_modid, modid1);
- result = 1;
- }
-#endif
-
fp1 = dlsym (h1, "in_dso2");
if (fp1 == NULL)
{
@@ -72,32 +47,6 @@ do_test (void)
exit (1);
}
- /* Dirty test code here: we peek into a private data structure.
- We make sure that the module gets assigned the same ID every
- time. The value of the first round is used. */
-#ifdef __UCLIBC__
- if (modid2 == (size_t) -1)
- modid2 = ((struct dyn_elf *)h2)->dyn->l_tls_modid;
- else if (((struct dyn_elf *)h2)->dyn->l_tls_modid
- != (size_t) modid2)
- {
- printf ("round %d: modid now %zd, initially %zd\n",
- i,
- ((struct dyn_elf *)h2)->dyn->l_tls_modid,
- modid2);
- result = 1;
- }
-#else
- if (modid2 == (size_t) -1)
- modid2 = ((struct link_map *) h2)->l_tls_modid;
- else if (((struct link_map *) h2)->l_tls_modid != modid2)
- {
- printf ("round %d: modid now %zd, initially %zd\n",
- i, ((struct link_map *) h2)->l_tls_modid, modid2);
- result = 1;
- }
-#endif
-
bazp = dlsym (h2, "baz");
if (bazp == NULL)
{
@@ -127,28 +76,6 @@ do_test (void)
exit (1);
}
- /* Dirty test code here: we peek into a private data structure.
- We make sure that the module gets assigned the same ID every
- time. The value of the first round is used. */
-#ifdef __UCLIBC__
- if (((struct dyn_elf *)h1)->dyn->l_tls_modid
- != modid1)
- {
- printf ("round %d: modid now %zd, initially %zd\n",
- i,
- ((struct dyn_elf *)h1)->dyn->l_tls_modid,
- modid1);
- result = 1;
- }
-#else
- if (((struct link_map *) h1)->l_tls_modid != modid1)
- {
- printf ("round %d: modid now %zd, initially %zd\n",
- i, ((struct link_map *) h1)->l_tls_modid, modid1);
- result = 1;
- }
-#endif
-
fp1 = dlsym (h1, "in_dso2");
if (fp1 == NULL)
{
@@ -167,28 +94,6 @@ do_test (void)
exit (1);
}
- /* Dirty test code here: we peek into a private data structure.
- We make sure that the module gets assigned the same ID every
- time. The value of the first round is used. */
-#ifdef __UCLIBC__
- if (((struct dyn_elf *)h2)->dyn->l_tls_modid
- != modid2)
- {
- printf ("round %d: modid now %zd, initially %zd\n",
- i,
- ((struct dyn_elf *)h2)->dyn->l_tls_modid,
- modid2);
- result = 1;
- }
-#else
- if (((struct link_map *) h2)->l_tls_modid != modid2)
- {
- printf ("round %d: modid now %zd, initially %zd\n",
- i, ((struct link_map *) h2)->l_tls_modid, modid2);
- result = 1;
- }
-#endif
-
bazp = dlsym (h2, "baz");
if (bazp == NULL)
{