submitted-tst-tlsopt-powerpc
authorGNU Libc Maintainers <debian-glibc@lists.debian.org>
Sat, 16 Dec 2017 14:37:43 +0000 (14:37 +0000)
committerAurelien Jarno <aurel32@debian.org>
Sat, 16 Dec 2017 14:37:43 +0000 (14:37 +0000)
2017-07-31  Alan Modra  <amodra@gmail.com>

* sysdeps/powerpc/mod-tlsopt-powerpc.c: Extract from
tst-tlsopt-powerpc.c with function name change and no test harness.
* sysdeps/powerpc/tst-tlsopt-powerpc.c: Remove body of test.
Call tls_get_addr_opt_test.
* sysdeps/powerpc/Makefile (LDFLAGS-tst-tlsopt-powerpc): Don't define.
(modules-names): Add mod-tlsopt-powerpc.
(mod-tlsopt-powerpc.so-no-z-defs): Define.
(tst-tlsopt-powerpc): Depend on .so.
* sysdeps/powerpc/powerpc64/tls-macros.h (__TLS_GET_ADDR): Don't
define.  Expand use in TLS_GD and TLS_LD.

Gbp-Pq: Topic powerpc
Gbp-Pq: Name submitted-tst-tlsopt-powerpc.diff

sysdeps/powerpc/Makefile
sysdeps/powerpc/mod-tlsopt-powerpc.c [new file with mode: 0644]
sysdeps/powerpc/powerpc64/tls-macros.h
sysdeps/powerpc/tst-tlsopt-powerpc.c

index 099fbf68cd6028cd32fec6b515f1b19f3e1b9f25..d4dfa74f9e22834efae40880a11573a2f7981561 100644 (file)
@@ -8,9 +8,11 @@ sysdep-dl-routines += dl-machine hwcapinfo
 sysdep_routines += dl-machine hwcapinfo
 # extra shared linker files to link only into dl-allobjs.so
 sysdep-rtld-routines += dl-machine hwcapinfo
-# Don't optimize GD tls sequence to LE.
-LDFLAGS-tst-tlsopt-powerpc += -Wl,--no-tls-optimize
+
+modules-names += mod-tlsopt-powerpc
+mod-tlsopt-powerpc.so-no-z-defs = yes
 tests += tst-tlsopt-powerpc
+$(objpfx)tst-tlsopt-powerpc: $(objpfx)mod-tlsopt-powerpc.so
 endif
 
 ifeq ($(subdir),setjmp)
diff --git a/sysdeps/powerpc/mod-tlsopt-powerpc.c b/sysdeps/powerpc/mod-tlsopt-powerpc.c
new file mode 100644 (file)
index 0000000..ee0db12
--- /dev/null
@@ -0,0 +1,49 @@
+/* shared library to test for __tls_get_addr optimization.  */
+#include <stdio.h>
+
+#include "../../elf/tls-macros.h"
+#include "dl-tls.h"
+
+/* common 'int' variable in TLS.  */
+COMMON_INT_DEF(foo);
+
+
+int
+tls_get_addr_opt_test (void)
+{
+  int result = 0;
+
+  /* Get variable using general dynamic model.  */
+  int *ap = TLS_GD (foo);
+  if (*ap != 0)
+    {
+      printf ("foo = %d\n", *ap);
+      result = 1;
+    }
+
+  tls_index *tls_arg;
+#ifdef __powerpc64__
+  register unsigned long thread_pointer __asm__ ("r13");
+  asm ("addi %0,2,foo@got@tlsgd" : "=r" (tls_arg));
+#else
+  register unsigned long thread_pointer __asm__ ("r2");
+  asm ("bcl 20,31,1f\n1:\t"
+       "mflr %0\n\t"
+       "addis %0,%0,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t"
+       "addi %0,%0,_GLOBAL_OFFSET_TABLE_-1b@l\n\t"
+       "addi %0,%0,foo@got@tlsgd" : "=b" (tls_arg));
+#endif
+
+  if (tls_arg->ti_module != 0)
+    {
+      printf ("tls_index not optimized, binutils too old?\n");
+      result = 1;
+    }
+  else if (tls_arg->ti_offset + thread_pointer != (unsigned long) ap)
+    {
+      printf ("tls_index->ti_offset wrong value\n");
+      result = 1;
+    }
+
+  return result;
+}
index 42a95ec5c1d785fcbc6a7d2b3d9e6e189e621797..79a0b2579c9ca3d01f80a25b5820f3d1c83dd374 100644 (file)
      __result;                                                               \
   })
 
-#define __TLS_GET_ADDR "__tls_get_addr"
-
 /* PowerPC64 Local Dynamic TLS access.  */
 #define TLS_LD(x)                                                            \
   ({ int * __result;                                                         \
      asm ("addi  3,2," #x "@got@tlsld\n\t"                                   \
-         "bl    " __TLS_GET_ADDR "\n\t"                                      \
+         "bl    __tls_get_addr\n\t"                                          \
          "nop   \n\t"                                                        \
          "addis %0,3," #x "@dtprel@ha\n\t"                                   \
          "addi  %0,%0," #x "@dtprel@l"                                       \
@@ -36,7 +34,7 @@
 #define TLS_GD(x)                                                            \
   ({ register int *__result __asm__ ("r3");                                  \
      asm ("addi  3,2," #x "@got@tlsgd\n\t"                                   \
-         "bl    " __TLS_GET_ADDR "\n\t"                                      \
+         "bl    __tls_get_addr\n\t"                                          \
          "nop   "                                                            \
          : "=r" (__result) :                                                 \
          : __TLS_CALL_CLOBBERS);                                             \
index c9a14cbfdc79476b673a3411435970ad779d98c6..1c9227eb8e54334b9183d99685daf26bc689b6fe 100644 (file)
@@ -1,52 +1,12 @@
 /* glibc test for __tls_get_addr optimization.  */
-#include <stdio.h>
-
-#include "../../elf/tls-macros.h"
-#include "dl-tls.h"
-
-/* common 'int' variable in TLS.  */
-COMMON_INT_DEF(foo);
-
 
 #define TEST_FUNCTION do_test ()
 static int
 do_test (void)
 {
-  int result = 0;
-
-  /* Get variable using general dynamic model.  */
-  int *ap = TLS_GD (foo);
-  if (*ap != 0)
-    {
-      printf ("foo = %d\n", *ap);
-      result = 1;
-    }
-
-  tls_index *tls_arg;
-#ifdef __powerpc64__
-  register unsigned long thread_pointer __asm__ ("r13");
-  asm ("addi %0,2,foo@got@tlsgd" : "=r" (tls_arg));
-#else
-  register unsigned long thread_pointer __asm__ ("r2");
-  asm ("bcl 20,31,1f\n1:\t"
-       "mflr %0\n\t"
-       "addis %0,%0,_GLOBAL_OFFSET_TABLE_-1b@ha\n\t"
-       "addi %0,%0,_GLOBAL_OFFSET_TABLE_-1b@l\n\t"
-       "addi %0,%0,foo@got@tlsgd" : "=b" (tls_arg));
-#endif
-
-  if (tls_arg->ti_module != 0)
-    {
-      printf ("tls_index not optimized, binutils too old?\n");
-      result = 1;
-    }
-  else if (tls_arg->ti_offset + thread_pointer != (unsigned long) ap)
-    {
-      printf ("tls_index->ti_offset wrong value\n");
-      result = 1;
-    }
+  extern int tls_get_addr_opt_test (void);
 
-  return result;
+  return tls_get_addr_opt_test ();
 }
 
 #include "../../test-skeleton.c"