PowerPC64, don't relocate nops
authorAlan Modra <amodra@gmail.com>
Fri, 2 Feb 2018 06:25:21 +0000 (16:55 +1030)
committerAlan Modra <amodra@gmail.com>
Fri, 2 Feb 2018 12:16:40 +0000 (22:46 +1030)
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.

bfd/ChangeLog
bfd/elf64-ppc.c

index 664a974b8ddc9d7a40b718a7d68d78d43c31b4e4..090fc23c2b02bdccaa62170f283fc26951c20294 100644 (file)
@@ -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
index 9e4a4b5574d1b456fcdaa865c273fd8dd644236a..d6ec12fbab58ba615d46ed8c121bd0da30a026ef 100644 (file)
@@ -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)