diff options
Diffstat (limited to 'REORG.TODO/sysdeps/arm/tls-macros.h')
-rw-r--r-- | REORG.TODO/sysdeps/arm/tls-macros.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/REORG.TODO/sysdeps/arm/tls-macros.h b/REORG.TODO/sysdeps/arm/tls-macros.h new file mode 100644 index 0000000000..25cd84931b --- /dev/null +++ b/REORG.TODO/sysdeps/arm/tls-macros.h @@ -0,0 +1,72 @@ +#include <sysdep.h> /* For ARCH_HAS_T2. */ + +#ifdef __thumb2__ +# define ARM_PC_OFFSET "4" +#else +# define ARM_PC_OFFSET "8" +#endif + +/* Returns the address of data containing ".word SYMBOL(RELOC)". */ +#if defined (ARCH_HAS_T2) && !defined (PIC) +# define GET_SPECIAL_RELOC(symbol, reloc) \ + ({ \ + int *__##symbol##_rodata; \ + asm ("movw %0, #:lower16:1f\n" \ + "movt %0, #:upper16:1f\n" \ + ".pushsection .rodata.cst4, \"aM\", %%progbits, 4\n" \ + ".balign 4\n" \ + "1: .word " #symbol "(" #reloc ")\n" \ + ".popsection" \ + : "=r" (__##symbol##_rodata)); \ + __##symbol##_rodata; \ + }) +#elif defined (ARCH_HAS_T2) && defined (PIC) && ARM_PCREL_MOVW_OK +# define GET_SPECIAL_RELOC(symbol, reloc) \ + ({ \ + int *__##symbol##_rodata; \ + asm ("movw %0, #:lower16:1f - 2f - " ARM_PC_OFFSET "\n" \ + "movt %0, #:upper16:1f - 2f - " ARM_PC_OFFSET "\n" \ + ".pushsection .rodata.cst4, \"aM\", %%progbits, 4\n" \ + ".balign 4\n" \ + "1: .word " #symbol "(" #reloc ")\n" \ + ".popsection\n" \ + "2: add %0, %0, pc" \ + : "=r" (__##symbol##_rodata)); \ + __##symbol##_rodata; \ + }) +#else +# define GET_SPECIAL_RELOC(symbol, reloc) \ + ({ \ + int *__##symbol##_rodata; \ + asm ("adr %0, 1f\n" \ + "b 2f\n" \ + ".balign 4\n" \ + "1: .word " #symbol "(" #reloc ")\n" \ + "2:" \ + : "=r" (__##symbol##_rodata)); \ + __##symbol##_rodata; \ + }) +#endif + +/* Returns the pointer value (SYMBOL(RELOC) + pc - PC_OFS). */ +#define GET_SPECIAL_PCREL(symbol, reloc) \ + ({ \ + int *__##symbol##_rodata = GET_SPECIAL_RELOC (symbol, reloc); \ + (void *) ((int) __##symbol##_rodata + *__##symbol##_rodata); \ + }) + +#define TLS_LE(x) \ + (__builtin_thread_pointer () + *GET_SPECIAL_RELOC (x, tpoff)) + +#define TLS_IE(x) \ + ((int *) (__builtin_thread_pointer () \ + + *(int *) GET_SPECIAL_PCREL (x, gottpoff))) + +extern void *__tls_get_addr (void *); + +#define TLS_LD(x) \ + ((int *) (__tls_get_addr (GET_SPECIAL_PCREL (x, tlsldm)) \ + + *GET_SPECIAL_RELOC (x, tlsldo))) + +#define TLS_GD(x) \ + ((int *) __tls_get_addr (GET_SPECIAL_PCREL (x, tlsgd))) |