This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch roland/arm created. glibc-2.21-158-g848b125


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, roland/arm has been created
        at  848b12566a938ae6aac1092deca1458a7c4ad104 (commit)

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=848b12566a938ae6aac1092deca1458a7c4ad104

commit 848b12566a938ae6aac1092deca1458a7c4ad104
Author: Roland McGrath <roland@hack.frob.com>
Date:   Thu Mar 5 15:07:54 2015 -0800

    ARM: Rewrite sysdeps/arm/tls-macros.h

diff --git a/ChangeLog b/ChangeLog
index b9cf458..d49b7a7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2015-03-05  Roland McGrath  <roland@hack.frob.com>
 
+	* sysdeps/arm/tls-macros.h: Include <sysdep.h>.
+	(GET_SPECIAL_RELOC, GET_SPECIAL_PCREL): New macros to encapsulate
+	all the necessary asm magic in one place.
+	(TLS_LE, TLS_IE, TLS_LD, TLS_GD): Rewritten as C expressions
+	using those.
+
 	* Makeconfig (test-wrapper-env-only): New variable.
 	* Rules (make-test-out): If variable $*-ENV-only is nonempty,
 	then use that with $(test-wrapper-env-only) rather than using
diff --git a/sysdeps/arm/tls-macros.h b/sysdeps/arm/tls-macros.h
index e41d3bc..7243253 100644
--- a/sysdeps/arm/tls-macros.h
+++ b/sysdeps/arm/tls-macros.h
@@ -1,78 +1,72 @@
+#include <sysdep.h>                     /* For ARCH_HAS_T2.  */
+
 #ifdef __thumb2__
-#define ARM_PC_OFFSET "4"
+# define ARM_PC_OFFSET "4"
 #else
-#define ARM_PC_OFFSET "8"
+# define ARM_PC_OFFSET "8"
 #endif
 
-#define TLS_LE(x)					\
-  ({ int *__result;					\
-     void *tp = __builtin_thread_pointer ();		\
-     asm ("ldr %0, 1f; "				\
-	  "add %0, %1, %0; "				\
-	  "b 2f; "					\
-	  ".align 2; "					\
-	  "1: .word " #x "(tpoff); "			\
-	  "2: "						\
-	  : "=&r" (__result) : "r" (tp));		\
-     __result; })
-
-#ifdef __thumb2__
-#define TLS_IE(x)					\
-  ({ int *__result;					\
-     void *tp = __builtin_thread_pointer ();		\
-     asm ("ldr %0, 1f; "				\
-	  "3: add %0, pc, %0;"				\
-	  "ldr %0, [%0];"				\
-	  "add %0, %1, %0; "				\
-	  "b 2f; "					\
-	  ".align 2; "					\
-	  "1: .word " #x "(gottpoff) + (. - 3b - 4); "	\
-	  "2: "						\
-	  : "=&r" (__result) : "r" (tp));		\
-     __result; })
+/* 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 TLS_IE(x)					\
-  ({ int *__result;					\
-     void *tp = __builtin_thread_pointer ();		\
-     asm ("ldr %0, 1f; "				\
-	  "3: ldr %0, [pc, %0];"			\
-	  "add %0, %1, %0; "				\
-	  "b 2f; "					\
-	  ".align 2; "					\
-	  "1: .word " #x "(gottpoff) + (. - 3b - 8); "	\
-	  "2: "						\
-	  : "=&r" (__result) : "r" (tp));		\
-     __result; })
+# 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
 
-#define TLS_LD(x)					\
-  ({ char *__result;					\
-     int __offset;					\
-     extern void *__tls_get_addr (void *);		\
-     asm ("ldr %0, 2f; "				\
-	  "1: add %0, pc, %0; "				\
-	  "b 3f; "					\
-	  ".align 2; "					\
-	  "2: .word " #x "(tlsldm) + (. - 1b - "ARM_PC_OFFSET"); "	\
-	  "3: "						\
-	  : "=r" (__result));				\
-     __result = (char *)__tls_get_addr (__result);	\
-     asm ("ldr %0, 1f; "				\
-	  "b 2f; "					\
-	  ".align 2; "					\
-	  "1: .word " #x "(tlsldo); "			\
-	  "2: "						\
-	  : "=r" (__offset));				\
-     (int *) (__result + __offset); })
+/* 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 *__result;					\
-     extern void *__tls_get_addr (void *);		\
-     asm ("ldr %0, 2f; "				\
-	  "1: add %0, pc, %0; "				\
-	  "b 3f; "					\
-	  ".align 2; "					\
-	  "2: .word " #x "(tlsgd) + (. - 1b - "ARM_PC_OFFSET"); "	\
-	  "3: "						\
-	  : "=r" (__result));				\
-     (int *)__tls_get_addr (__result); })
+#define TLS_GD(x)						\
+  ((int *) __tls_get_addr (GET_SPECIAL_PCREL (x, tlsgd)))

-----------------------------------------------------------------------


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]