From c96e057398b599a343cdff68325251346b71594e Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 31 Dec 2018 12:11:42 +1030 Subject: [PATCH] [PowerPC64] Nop out ld 2,24(1) after old-style __tls_get_addr 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. * elf64-ppc.c (ppc64_elf_relocate_section ): When editing an old-style __tls_get_addr call, replace a toc restore insn with a nop. --- bfd/ChangeLog | 6 ++++++ bfd/elf64-ppc.c | 10 +++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1396c7034e..fbdd0c25b6 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2018-12-31 Alan Modra + + * elf64-ppc.c (ppc64_elf_relocate_section ): When + editing an old-style __tls_get_addr call, replace a toc restore + insn with a nop. + 2018-12-28 Alan Modra PR 24015 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)) {