summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-02-02 16:55:21 +1030
committerAlan Modra <amodra@gmail.com>2018-02-02 22:46:40 +1030
commitd830549dba59f4e11412fd6dc18b7b1d4c6cf557 (patch)
treec71c424578dca6fabb7c6e3ac6c99819025ad3c3
parent59498c305e6f1db2a1ed8d44cb58f0d24ec092fe (diff)
downloadbinutils-gdb-d830549dba59f4e11412fd6dc18b7b1d4c6cf557.tar.gz
PowerPC64, don't relocate nops
This fixes a "bug" in that nops emitted as part of code optimization were being relocated. As it happens the relocation value was always zero so the nop wasn't changed. Whew! I've also moved the use of "howto" later since I was caught out in some recent code changes with the howto not matching r_type. * elf64-ppc.c (ppc64_elf_relocate_section): Don't relocate nops emitted for toc sequence optimization. Set and use "howto" later.
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elf64-ppc.c13
2 files changed, 14 insertions, 4 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 664a974b8dd..090fc23c2b0 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2018-02-02 Alan Modra <amodra@gmail.com>
+
+ * elf64-ppc.c (ppc64_elf_relocate_section): Don't relocate nops
+ emitted for toc sequence optimization. Set and use "howto" later.
+
2018-02-01 Simon Marchi <simon.marchi@ericsson.com>
* elf64-ppc.c (ppc64_elf_archive_symbol_lookup): Avoid pointer
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 9e4a4b5574d..d6ec12fbab5 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -15067,7 +15067,6 @@ ppc64_elf_relocate_section (bfd *output_bfd,
/* Multi-instruction sequences that access the TOC can be
optimized, eg. addis ra,r2,0; addi rb,ra,x;
to nop; addi rb,r2,x; */
- howto = ppc64_elf_howto_table[(int) r_type];
switch (r_type)
{
default:
@@ -15099,6 +15098,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
{
bfd_byte *p = contents + (rel->r_offset & ~3);
bfd_put_32 (input_bfd, NOP, p);
+ goto copy_reloc;
}
break;
@@ -15140,9 +15140,13 @@ ppc64_elf_relocate_section (bfd *output_bfd,
/* xgettext:c-format */
info->callbacks->minfo
(_("%H: warning: %s unexpected insn %#x.\n"),
- input_bfd, input_section, rel->r_offset, howto->name, insn);
+ input_bfd, input_section, rel->r_offset,
+ ppc64_elf_howto_table[r_type]->name, insn);
else
- bfd_put_32 (input_bfd, NOP, p);
+ {
+ bfd_put_32 (input_bfd, NOP, p);
+ goto copy_reloc;
+ }
}
break;
@@ -15240,7 +15244,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
/* xgettext:c-format */
(_("%H: error: %s not a multiple of %u\n"),
input_bfd, input_section, rel->r_offset,
- howto->name,
+ ppc64_elf_howto_table[r_type]->name,
mask + 1);
bfd_set_error (bfd_error_bad_value);
ret = FALSE;
@@ -15252,6 +15256,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
/* Dynamic relocs are not propagated for SEC_DEBUGGING sections
because such sections are not SEC_ALLOC and thus ld.so will
not process them. */
+ howto = ppc64_elf_howto_table[(int) r_type];
if (unresolved_reloc
&& !((input_section->flags & SEC_DEBUGGING) != 0
&& h->elf.def_dynamic)