#include /* 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)))