public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* power7 thread safe plt call stubs
@ 2013-01-15  6:11 Alan Modra
  0 siblings, 0 replies; only message in thread
From: Alan Modra @ 2013-01-15  6:11 UTC (permalink / raw)
  To: binutils; +Cc: Jeffrey A Law

This changes powerpc64 ld and gold to default to thread-safe plt call
stubs when building shared libraries.  Jeff pointed out the obvious to
me recently:  A shared library may be used by a threaded application
but not create threads itself.  So there it no way to determine at
link time that a shared library *doesn't* needs thread safe call
stubs.

I'm leaving the default for executables unchanged.  ie. When not
specified explicitly, you get thread safe call stubs if the executable
calls well known thread creation functions.  If someone packages
thread creation into a user shared library then they're on their own.
Their app may need to be linked with -Wl,--plt-thread-safe if running
on power7 or later hardware.  (You can't determine whether an
executable is threaded by looking at shared libraries needed by the
executable.  For example, many non-threaded C++ apps link against
libstdc++.so.  The presence of a calls to pthread_create in
libstdc++.so doesn't mean the executable will ever call into those
libstdc++ functions.)

bfd/
	* elf64-ppc.c (ppc64_elf_size_stubs): Default shared libs to
	plt-thread-safe.
gold/
	* powerpc.cc (Target_powerpc::do_relax): Default shared libs to
	plt-thread-safe.
ld/testsuite/
	* ld-powerpc/tlsso.d: Adjust for plt-thread-safe stubs.
	* ld-powerpc/tlsso.g: Likewise.
	* ld-powerpc/tlsso.r: Likewise.
	* ld-powerpc/tlstocso.d: Likewise.
	* ld-powerpc/tlstocso.g: Likewise.

Index: bfd/elf64-ppc.c
===================================================================
RCS file: /cvs/src/src/bfd/elf64-ppc.c,v
retrieving revision 1.398
diff -u -p -r1.398 elf64-ppc.c
--- bfd/elf64-ppc.c	10 Jan 2013 20:03:54 -0000	1.398
+++ bfd/elf64-ppc.c	15 Jan 2013 06:07:44 -0000
@@ -11334,9 +11334,11 @@ ppc64_elf_size_stubs (struct bfd_link_in
 
   htab->plt_static_chain = plt_static_chain;
   htab->plt_stub_align = plt_stub_align;
+  if (plt_thread_safe == -1 && !info->executable)
+    plt_thread_safe = 1;
   if (plt_thread_safe == -1)
     {
-      const char *const thread_starter[] =
+      static const char *const thread_starter[] =
 	{
 	  "pthread_create",
 	  /* libstdc++ */
Index: gold/powerpc.cc
===================================================================
RCS file: /cvs/src/src/gold/powerpc.cc,v
retrieving revision 1.80
diff -u -p -r1.80 powerpc.cc
--- gold/powerpc.cc	12 Dec 2012 08:09:41 -0000	1.80
+++ gold/powerpc.cc	15 Jan 2013 05:39:37 -0000
@@ -2182,7 +2182,7 @@ Target_powerpc<size, big_endian>::do_rel
       bool thread_safe = parameters->options().plt_thread_safe();
       if (size == 64 && !parameters->options().user_set_plt_thread_safe())
 	{
-	  const char* const thread_starter[] =
+	  static const char* const thread_starter[] =
 	    {
 	      "pthread_create",
 	      /* libstdc++ */
@@ -2201,14 +2201,21 @@ Target_powerpc<size, big_endian>::do_rel
 	      "GOMP_parallel_sections_start", 
 	    };
 
-	  for (unsigned int i = 0;
-	       i < sizeof(thread_starter) / sizeof(thread_starter[0]);
-	       i++)
+	  if (parameters->options().shared())
+	    thread_safe = true;
+	  else
 	    {
-	      Symbol* sym = symtab->lookup(thread_starter[i], NULL);
-	      thread_safe = sym != NULL && sym->in_reg() && sym->in_real_elf();
-	      if (thread_safe)
-		break;
+	      for (unsigned int i = 0;
+		   i < sizeof(thread_starter) / sizeof(thread_starter[0]);
+		   i++)
+		{
+		  Symbol* sym = symtab->lookup(thread_starter[i], NULL);
+		  thread_safe = (sym != NULL
+				 && sym->in_reg()
+				 && sym->in_real_elf());
+		  if (thread_safe)
+		    break;
+		}
 	    }
 	}
       this->plt_thread_safe_ = thread_safe;
Index: ld/testsuite/ld-powerpc/tlsso.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlsso.d,v
retrieving revision 1.12
diff -u -p -r1.12 tlsso.d
--- ld/testsuite/ld-powerpc/tlsso.d	23 Nov 2012 03:28:13 -0000	1.12
+++ ld/testsuite/ld-powerpc/tlsso.d	15 Jan 2013 02:35:52 -0000
@@ -13,20 +13,22 @@ Disassembly of section \.text:
 .*	(e9 62 80 78|78 80 62 e9) 	ld      r11,-32648\(r2\)
 .*	(7d 69 03 a6|a6 03 69 7d) 	mtctr   r11
 .*	(e8 42 80 80|80 80 42 e8) 	ld      r2,-32640\(r2\)
-.*	(4e 80 04 20|20 04 80 4e) 	bctr
+.*	(28 22 00 00|00 00 22 28) 	cmpldi  r2,0
+.*	(4c e2 04 20|20 04 e2 4c) 	bnectr\+ 
+.*	(48 00 00 ..|.. 00 00 48) 	b       .* <__glink_PLTresolve\+0x38>
 
 .* <_start>:
 .*	(38 62 80 20|20 80 62 38) 	addi    r3,r2,-32736
-.*	(4b ff ff e9|e9 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 50|50 80 62 38) 	addi    r3,r2,-32688
-.*	(4b ff ff dd|dd ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 38|38 80 62 38) 	addi    r3,r2,-32712
-.*	(4b ff ff d1|d1 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 50|50 80 62 38) 	addi    r3,r2,-32688
-.*	(4b ff ff c5|c5 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(39 23 80 40|40 80 23 39) 	addi    r9,r3,-32704
 .*	(3d 23 00 00|00 00 23 3d) 	addis   r9,r3,0
@@ -39,10 +41,10 @@ Disassembly of section \.text:
 .*	(3d 2d 00 00|00 00 2d 3d) 	addis   r9,r13,0
 .*	(99 49 00 00|00 00 49 99) 	stb     r10,0\(r9\)
 .*	(38 62 80 08|08 80 62 38) 	addi    r3,r2,-32760
-.*	(4b ff ff 91|91 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 50|50 80 62 38) 	addi    r3,r2,-32688
-.*	(4b ff ff 85|85 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(f9 43 80 08|08 80 43 f9) 	std     r10,-32760\(r3\)
 .*	(3d 23 00 00|00 00 23 3d) 	addis   r9,r3,0
Index: ld/testsuite/ld-powerpc/tlsso.g
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlsso.g,v
retrieving revision 1.10
diff -u -p -r1.10 tlsso.g
--- ld/testsuite/ld-powerpc/tlsso.g	29 Oct 2012 09:25:53 -0000	1.10
+++ ld/testsuite/ld-powerpc/tlsso.g	15 Jan 2013 02:35:52 -0000
@@ -7,7 +7,7 @@
 .*: +file format elf64-powerpc
 
 Contents of section \.got:
-.* (00000000|80870100) (00018780|00000000) 00000000 00000000  .*
+ 10788 (00000000|88870100) (00018788|00000000) 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*
Index: ld/testsuite/ld-powerpc/tlsso.r
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlsso.r,v
retrieving revision 1.34
diff -u -p -r1.34 tlsso.r
--- ld/testsuite/ld-powerpc/tlsso.r	29 Oct 2012 09:25:53 -0000	1.34
+++ ld/testsuite/ld-powerpc/tlsso.r	15 Jan 2013 02:35:52 -0000
@@ -48,9 +48,9 @@ Relocation section '\.rela\.dyn' at offs
 [0-9a-f ]+R_PPC64_TPREL16 +0+60 le0 \+ 0
 [0-9a-f ]+R_PPC64_TPREL16_HA +0+68 le1 \+ 0
 [0-9a-f ]+R_PPC64_TPREL16_LO +0+68 le1 \+ 0
-[0-9a-f ]+R_PPC64_TPREL16_DS +0+105f8 \.tdata \+ 28
-[0-9a-f ]+R_PPC64_TPREL16_HA +0+105f8 \.tdata \+ 30
-[0-9a-f ]+R_PPC64_TPREL16_LO +0+105f8 \.tdata \+ 30
+[0-9a-f ]+R_PPC64_TPREL16_DS +[0-9a-f]+ \.tdata \+ 28
+[0-9a-f ]+R_PPC64_TPREL16_HA +[0-9a-f]+ \.tdata \+ 30
+[0-9a-f ]+R_PPC64_TPREL16_LO +[0-9a-f]+ \.tdata \+ 30
 [0-9a-f ]+R_PPC64_DTPMOD64 +0
 [0-9a-f ]+R_PPC64_DTPREL64 +0
 [0-9a-f ]+R_PPC64_DTPREL64 +18
Index: ld/testsuite/ld-powerpc/tlstocso.d
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlstocso.d,v
retrieving revision 1.11
diff -u -p -r1.11 tlstocso.d
--- ld/testsuite/ld-powerpc/tlstocso.d	23 Nov 2012 03:28:13 -0000	1.11
+++ ld/testsuite/ld-powerpc/tlstocso.d	15 Jan 2013 02:35:52 -0000
@@ -13,20 +13,22 @@ Disassembly of section \.text:
 .*	(e9 62 80 70|70 80 62 e9) 	ld      r11,-32656\(r2\)
 .*	(7d 69 03 a6|a6 03 69 7d) 	mtctr   r11
 .*	(e8 42 80 78|78 80 42 e8) 	ld      r2,-32648\(r2\)
-.*	(4e 80 04 20|20 04 80 4e) 	bctr
+.*	(28 22 00 00|00 00 22 28) 	cmpldi  r2,0
+.*	(4c e2 04 20|20 04 e2 4c) 	bnectr\+ 
+.*	(48 00 00 ..|.. 00 00 48) 	b       .* <__glink_PLTresolve\+0x38>
 
 .* <_start>:
 .*	(38 62 80 08|08 80 62 38) 	addi    r3,r2,-32760
-.*	(4b ff ff e9|e9 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 18|18 80 62 38) 	addi    r3,r2,-32744
-.*	(4b ff ff dd|dd ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 28|28 80 62 38) 	addi    r3,r2,-32728
-.*	(4b ff ff d1|d1 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(38 62 80 38|38 80 62 38) 	addi    r3,r2,-32712
-.*	(4b ff ff c5|c5 ff ff 4b) 	bl      .*
+.*	(4b ff ff ..|.. ff ff 4b) 	bl      .*plt_call.__tls_get_addr.*
 .*	(e8 41 00 28|28 00 41 e8) 	ld      r2,40\(r1\)
 .*	(39 23 80 40|40 80 23 39) 	addi    r9,r3,-32704
 .*	(3d 23 00 00|00 00 23 3d) 	addis   r9,r3,0
Index: ld/testsuite/ld-powerpc/tlstocso.g
===================================================================
RCS file: /cvs/src/src/ld/testsuite/ld-powerpc/tlstocso.g,v
retrieving revision 1.10
diff -u -p -r1.10 tlstocso.g
--- ld/testsuite/ld-powerpc/tlstocso.g	29 Oct 2012 09:25:53 -0000	1.10
+++ ld/testsuite/ld-powerpc/tlstocso.g	15 Jan 2013 02:35:52 -0000
@@ -7,7 +7,7 @@
 .*
 
 Contents of section \.got:
-.* 00000000 (000186c0|c0860100) 00000000 00000000  .*
+ 106c8 00000000 (000186c8|c8860100) 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*
 .* 00000000 00000000 00000000 00000000  .*

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2013-01-15  6:11 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-01-15  6:11 power7 thread safe plt call stubs Alan Modra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).