[PowerPC64] Nop out ld 2,24(1) after old-style __tls_get_addr

Message ID 20181231052620.GW30978@bubble.grove.modra.org
State New
Headers show
Series
  • [PowerPC64] Nop out ld 2,24(1) after old-style __tls_get_addr
Related show

Commit Message

Alan Modra Dec. 31, 2018, 5:26 a.m.
When optimising inline plt calls to __tls_get_addr without tls marker
relocs, ld should zap any toc restore insn after the bctrl, to stop a
load-hit-store stall.

(Current powerpc64 gcc doesn't use inline plt calls when
-mno-tls-markers, but might in future.)

	* elf64-ppc.c (ppc64_elf_relocate_section <tls_ldgd_opt>): When
	editing an old-style __tls_get_addr call, replace a toc restore
	insn with a nop.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 2f4cfaaf33..e42cefcd41 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -13841,7 +13841,15 @@  ppc64_elf_relocate_section (bfd *output_bfd,
 	      bfd_put_32 (input_bfd, insn1,
 			  contents + rel->r_offset - d_offset);
 	      if (offset != (bfd_vma) -1)
-		bfd_put_32 (input_bfd, insn2, contents + offset);
+		{
+		  bfd_put_32 (input_bfd, insn2, contents + offset);
+		  if (offset + 8 <= input_section->size)
+		    {
+		      insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
+		      if (insn2 == LD_R2_0R1 + STK_TOC (htab))
+			bfd_put_32 (input_bfd, NOP, contents + offset + 4);
+		    }
+		}
 	      if ((tls_mask & tls_gd) == 0
 		  && (tls_gd == 0 || toc_symndx != 0))
 		{