diff options
Diffstat (limited to 'elf/tst-tls1.c')
-rw-r--r-- | elf/tst-tls1.c | 61 |
1 files changed, 4 insertions, 57 deletions
diff --git a/elf/tst-tls1.c b/elf/tst-tls1.c index fc426b0..5e67482 100644 --- a/elf/tst-tls1.c +++ b/elf/tst-tls1.c @@ -2,12 +2,12 @@ #include <stdio.h> #include <tls.h> +#include "tls-macros.h" -/* XXX Until gcc gets told how to define and use thread-local - variables we will have to resort to use asms. */ -asm (".tls_common foo,4,4"); -asm (".tls_common bar,4,4"); +/* Two common 'int' variables in TLS. */ +COMMON_INT_DEF(foo); +COMMON_INT_DEF(bar); int @@ -17,59 +17,6 @@ main (void) int result = 0; int *ap, *bp; - /* XXX Each architecture must have its own asm for now. */ -# ifdef __i386__ -# define TLS_LE(x) \ - ({ int *__l; \ - asm ("movl %%gs:0,%0\n\t" \ - "subl $" #x "@tpoff,%0" \ - : "=r" (__l)); \ - __l; }) - -#define TLS_IE(x) \ - ({ int *__l, __b; \ - asm ("call 1f\n\t" \ - ".subsection 1\n" \ - "1:\tmovl (%%esp), %%ebx\n\t" \ - "ret\n\t" \ - ".previous\n\t" \ - "addl $_GLOBAL_OFFSET_TABLE_, %%ebx\n\t" \ - "movl %%gs:0,%0\n\t" \ - "subl " #x "@gottpoff(%%ebx),%0" \ - : "=r" (__l), "=&b" (__b)); \ - __l; }) - -#define TLS_LD(x) \ - ({ int *__l, __b; \ - asm ("call 1f\n\t" \ - ".subsection 1\n" \ - "1:\tmovl (%%esp), %%ebx\n\t" \ - "ret\n\t" \ - ".previous\n\t" \ - "addl $_GLOBAL_OFFSET_TABLE_, %%ebx\n\t" \ - "leal " #x "@tlsldm(%%ebx),%%eax\n\t" \ - "call ___tls_get_addr@plt\n\t" \ - "leal " #x "@dtpoff(%%eax), %%eax" \ - : "=a" (__l), "=&b" (__b)); \ - __l; }) - -#define TLS_GD(x) \ - ({ int *__l, __b; \ - asm ("call 1f\n\t" \ - ".subsection 1\n" \ - "1:\tmovl (%%esp), %%ebx\n\t" \ - "ret\n\t" \ - ".previous\n\t" \ - "addl $_GLOBAL_OFFSET_TABLE_, %%ebx\n\t" \ - "leal " #x "@tlsgd(%%ebx),%%eax\n\t" \ - "call ___tls_get_addr@plt\n\t" \ - "nop" \ - : "=a" (__l), "=&b" (__b)); \ - __l; }) - -# else -# error "No support for this architecture so far." -# endif /* Set the variable using the local exec model. */ puts ("set bar to 1 (LE)"); |