[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[glibc] 01/02: debian/patches/powerpc/submitted-tst-tlsopt-powerpc.diff: new proposed patch to fix tst-tlsopt-powerpc when built with binutils >= 2.29.



This is an automated email from the git hooks/post-receive script.

aurel32 pushed a commit to branch sid
in repository glibc.

commit d31f6b3de39563a20a93fe6705390da2ef252017
Author: Aurelien Jarno <aurelien@aurel32.net>
Date:   Mon Jul 31 21:23:04 2017 +0200

    debian/patches/powerpc/submitted-tst-tlsopt-powerpc.diff: new proposed patch to fix tst-tlsopt-powerpc when built with binutils >= 2.29.
---
 debian/changelog                                   |   4 +-
 .../powerpc/submitted-tst-tlsopt-powerpc.diff      | 164 +++++++++++++++++++++
 debian/patches/series                              |   1 +
 3 files changed, 168 insertions(+), 1 deletion(-)

diff --git a/debian/changelog b/debian/changelog
index 4a53767..f7125a0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,6 +1,8 @@
 glibc (2.24-14) UNRELEASED; urgency=medium
 
-  * 
+  [ Aurelien Jarno ]
+  * debian/patches/powerpc/submitted-tst-tlsopt-powerpc.diff: new proposed
+    patch to fix tst-tlsopt-powerpc when built with binutils >= 2.29.
 
  -- Aurelien Jarno <aurel32@debian.org>  Mon, 31 Jul 2017 18:34:04 +0200
 
diff --git a/debian/patches/powerpc/submitted-tst-tlsopt-powerpc.diff b/debian/patches/powerpc/submitted-tst-tlsopt-powerpc.diff
new file mode 100644
index 0000000..ef019d4
--- /dev/null
+++ b/debian/patches/powerpc/submitted-tst-tlsopt-powerpc.diff
@@ -0,0 +1,164 @@
+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.
+
+--- a/sysdeps/powerpc/Makefile
++++ b/sysdeps/powerpc/Makefile
+@@ -8,9 +8,11 @@
+ 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)
+--- /dev/null
++++ b/sysdeps/powerpc/mod-tlsopt-powerpc.c
+@@ -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;
++}
+--- a/sysdeps/powerpc/powerpc64/tls-macros.h
++++ b/sysdeps/powerpc/powerpc64/tls-macros.h
+@@ -18,13 +18,11 @@
+      __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);					      \
+--- a/sysdeps/powerpc/tst-tlsopt-powerpc.c
++++ b/sysdeps/powerpc/tst-tlsopt-powerpc.c
+@@ -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"
diff --git a/debian/patches/series b/debian/patches/series
index 1f7b25f..c0db45a 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -169,6 +169,7 @@ m68k/submitted-gcc34-seccomment.diff
 mips/submitted-rld_map.diff
 
 powerpc/local-powerpc8xx-dcbz.diff
+powerpc/submitted-tst-tlsopt-powerpc.diff
 
 sh4/local-fpscr_values.diff
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-glibc/glibc.git


Reply to: