summaryrefslogtreecommitdiff
path: root/test/tls
diff options
context:
space:
mode:
Diffstat (limited to 'test/tls')
-rw-r--r--test/tls/tls-macros-arc.h14
-rw-r--r--test/tls/tls-macros-nios2.h46
-rw-r--r--test/tls/tls-macros-riscv.h7
-rw-r--r--test/tls/tls-macros-xtensa.h82
-rw-r--r--test/tls/tls-macros.h6
5 files changed, 136 insertions, 19 deletions
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-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-riscv.h b/test/tls/tls-macros-riscv.h
index abce7ab..b780b4f 100644
--- a/test/tls/tls-macros-riscv.h
+++ b/test/tls/tls-macros-riscv.h
@@ -1,8 +1,6 @@
/* Macros to support TLS testing in times of missing compiler support.
Copyright (C) 2017-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
@@ -17,12 +15,9 @@
License along with the GNU C Library. If not, see
<https://www.gnu.org/licenses/>. */
-
-#include <sys/cdefs.h>
-#include <sys/asm.h>
-
#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); })
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 4a4e916..a94c3d2 100644
--- a/test/tls/tls-macros.h
+++ b/test/tls/tls-macros.h
@@ -24,7 +24,7 @@
#include <tls-macros-alpha.h>
#endif
-#ifdef __arc__
+#if defined(__arc__) || defined(__ARC64_ARCH32__)
#include <tls-macros-arc.h>
#endif
@@ -64,6 +64,10 @@
#include <tls-macros-mips.h>
#endif
+#ifdef __nios2__
+#include <tls-macros-nios2.h>
+#endif
+
#if defined(__powerpc__) && !defined(__powerpc64__)
#include <tls-macros-powerpc.h>
#endif