PowerPC addpcis fix again
authorAlan Modra <amodra@gmail.com>
Tue, 28 Feb 2017 13:12:29 +0000 (23:42 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 28 Feb 2017 13:19:28 +0000 (23:49 +1030)
In the last patch I said "The patch also fixes overflow checking".
In fact, there wasn't anything wrong with the previous code.  So,
revert that change.  The new checks are OK too, so this is just a
tidy.

* elf64-ppc.c (ppc64_elf_ha_reloc): Revert last change.
(ppc64_elf_relocate_section): Likewise.

bfd/ChangeLog
bfd/elf64-ppc.c

index 68fb27edd35dfdbb54672585e7ab9abc238dbe2c..86a19a350ccc5b0768aba4ad4df83c502c052abe 100644 (file)
@@ -1,3 +1,8 @@
+2017-02-28  Alan Modra  <amodra@gmail.com>
+
+       * elf64-ppc.c (ppc64_elf_ha_reloc): Revert last change.
+       (ppc64_elf_relocate_section): Likewise.
+
 2017-02-28  Alan Modra  <amodra@gmail.com>
 
        PR 20995
index 661ef269ac258c01ba3f776eaef2adc1c0b0eb6b..5ecd1a3ca12af9adca66590794fa23355b95b085 100644 (file)
@@ -2529,7 +2529,7 @@ ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   enum elf_ppc64_reloc_type r_type;
   long insn;
   bfd_size_type octets;
-  bfd_vma value, field;
+  bfd_vma value;
 
   /* If this is a relocatable link (output_bfd test tells us), just
      call the generic function.  Any adjustment will be done at final
@@ -2555,14 +2555,14 @@ ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
   value -= (reloc_entry->address
            + input_section->output_offset
            + input_section->output_section->vma);
-  field = (bfd_signed_vma) value >> 16;
+  value = (bfd_signed_vma) value >> 16;
 
   octets = reloc_entry->address * bfd_octets_per_byte (abfd);
   insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
   insn &= ~0x1fffc1;
-  insn |= (field & 0xffc1) | ((field & 0x3e) << 15);
+  insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
   bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
-  if (value + 0x80000000 > 0xffffffff)
+  if (value + 0x8000 > 0xffff)
     return bfd_reloc_overflow;
   return bfd_reloc_ok;
 }
@@ -15255,19 +15255,17 @@ ppc64_elf_relocate_section (bfd *output_bfd,
            r = bfd_reloc_outofrange;
          else
            {
-             bfd_signed_vma field;
-
              relocation += addend;
              relocation -= (rel->r_offset
                             + input_section->output_offset
                             + input_section->output_section->vma);
-             field = (bfd_signed_vma) relocation >> 16;
+             relocation = (bfd_signed_vma) relocation >> 16;
              insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
              insn &= ~0x1fffc1;
-             insn |= (field & 0xffc1) | ((field & 0x3e) << 15);
+             insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
              bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
              r = bfd_reloc_ok;
-             if (relocation + 0x80000000 > 0xffffffff)
+             if (relocation + 0x8000 > 0xffff)
                r = bfd_reloc_overflow;
            }
        }