| #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))) |