about summary refs log tree commit diff
path: root/elf/tls-macros.h
diff options
context:
space:
mode:
Diffstat (limited to 'elf/tls-macros.h')
-rw-r--r--elf/tls-macros.h47
1 files changed, 47 insertions, 0 deletions
diff --git a/elf/tls-macros.h b/elf/tls-macros.h
index a1ae536bef..4d29369208 100644
--- a/elf/tls-macros.h
+++ b/elf/tls-macros.h
@@ -623,6 +623,53 @@ register void *__gp __asm__("$29");
      (int *) (__builtin_thread_pointer() + __offset); })
 # endif
 
+#elif defined __powerpc__ && !defined __powerpc64__
+
+# define __TLS_CALL_CLOBBERS						\
+	"0", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",	\
+	"lr", "ctr", "cr0", "cr1", "cr5", "cr6", "cr7"
+
+/* PowerPC32 Local Exec TLS access.  */
+# define TLS_LE(x)				\
+  ({ int *__result;				\
+     asm ("addi %0,2," #x "@tprel"		\
+	  : "=r" (__result));			\
+     __result; })
+
+/* PowerPC32 Initial Exec TLS access.  */
+# define TLS_IE(x)					\
+  ({ int *__result;					\
+     asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t"	\
+	  "mflr %0\n\t"					\
+	  "lwz %0," #x "@got@tprel(%0)\n\t"		\
+	  "add %0,%0," #x "@tls"			\
+	  : "=b" (__result) :				\
+	  : "lr");					\
+     __result; })
+
+/* PowerPC32 Local Dynamic TLS access.  */
+# define TLS_LD(x)					\
+  ({ int *__result;					\
+     asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t"	\
+	  "mflr 3\n\t"					\
+	  "addi 3,3," #x "@got@tlsld\n\t"		\
+	  "bl __tls_get_addr@plt\n\t"			\
+	  "addi %0,3," #x "@dtprel"			\
+	  : "=r" (__result) :				\
+	  : __TLS_CALL_CLOBBERS);			\
+     __result; })
+
+/* PowerPC32 General Dynamic TLS access.  */
+# define TLS_GD(x)					\
+  ({ register int *__result __asm__ ("r3");		\
+     asm ("bl _GLOBAL_OFFSET_TABLE_@local-4\n\t"	\
+	  "mflr 3\n\t"					\
+	  "addi 3,3," #x "@got@tlsgd\n\t"		\
+	  "bl __tls_get_addr@plt"			\
+	  : :						\
+	  : __TLS_CALL_CLOBBERS);			\
+     __result; })
+
 #elif defined __powerpc__ && defined __powerpc64__
 
 /* PowerPC64 Local Exec TLS access.  */