about summary refs log tree commit diff
path: root/REORG.TODO/sysdeps/arm/tls-macros.h
diff options
context:
space:
mode:
Diffstat (limited to 'REORG.TODO/sysdeps/arm/tls-macros.h')
-rw-r--r--REORG.TODO/sysdeps/arm/tls-macros.h72
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)))