]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
tst-tlsopt-powerpc as a shared lib
authorAlan Modra <amodra@gmail.com>
Thu, 3 Aug 2017 06:09:21 +0000 (15:39 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 3 Aug 2017 06:09:21 +0000 (15:39 +0930)
This makes the __tls_get_addr_opt test run as a shared library, and so
actually test that DTPMOD64/DTPREL64 pairs are processed by ld.so to
support the __tls_get_adfr_opt call stub fast return.  After a
2017-01-24 patch (binutils f0158f4416) ld.bfd no longer emitted
unnecessary dynamic relocations against local thread variables,
instead setting up the __tls_index GOT entries for the call stub fast
return.  This meant tst-tlsopt-powerpc passed but did not check ld.so
relocation support.  After a 2017-07-16 patch (binutils 676ee2b5fa)
ld.bfd no longer set up the __tls_index GOT entries for the call stub
fast return, and tst-tlsopt-powerpc failed.

Compiling mod-tlsopt-powerpc.c with -DSHARED exposed a bug in
powerpc64/tls-macros.h, which defines a __TLS_GET_ADDR macro that
clashes with one defined in dl-tls.h.  The tls-macros.h version is
only used in that file, so delete it and expand.

* 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.

ChangeLog
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 05a946d4b3cd691f0cb73f3393723de161090f2b..4565de264435a86c0c162a80c0a5af5d453098cb 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2017-08-03  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.
+
 2017-08-02  Samuel Thibault  <samuel.thibault@ens-lyon.org>
 
        * sysdeps/mach/hurd/enbl-secure.c (__libc_init_secure): Define
index 0d9206bec4c04747aad778bf3a78b3e400672acd..6aa683b03fc66458b80407cf9c53618dbcb61e42 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
 
 ifneq (no,$(multi-arch))
 tests-static += tst-tlsifunc-static
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 8ae928a3f4c70c597c1adcd750cbee34573b5ece..cc682b2ed021a8d1f13bf860f2edef673d33db94 100644 (file)
@@ -1,51 +1,11 @@
 /* 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);
-
 
 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 <support/test-driver.c>