diff options
Diffstat (limited to 'test/tls')
-rw-r--r-- | test/tls/tls-macros-arc.h | 14 | ||||
-rw-r--r-- | test/tls/tls-macros-nios2.h | 46 | ||||
-rw-r--r-- | test/tls/tls-macros-riscv.h | 7 | ||||
-rw-r--r-- | test/tls/tls-macros-xtensa.h | 82 | ||||
-rw-r--r-- | test/tls/tls-macros.h | 6 |
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 |