Visium: fix bogus overflow check on 32-bit hosts
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 7 Feb 2019 16:02:24 +0000 (17:02 +0100)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 7 Feb 2019 16:02:24 +0000 (17:02 +0100)
bfd/
* elf32-visium.c (visium_elf_howto_parity_reloc): Minor tweak.
<R_VISIUM_PC16>: Use explicit range test to detect an overflow.

bfd/ChangeLog
bfd/elf32-visium.c

index 0aff60c902d769fec695a63cdaea47b7b53c78ba..c0a3a37429465e0e7bb610636cac4f15fc66fc3f 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-07  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * elf32-visium.c (visium_elf_howto_parity_reloc): Minor tweak.
+       <R_VISIUM_PC16>: Use explicit range test to detect an overflow.
+
 2019-02-07  Nick Clifton  <nickc@redhat.com>
 
        * config.bfd: Move the powerpc-lynxos and powerpc-windiss targets
index 316eb39a9ca95f04bc6a74e3d08800b6ddab8167..de81fdca639ca61517b2517010c8f8ac801e88ff 100644 (file)
@@ -312,7 +312,6 @@ visium_elf_howto_parity_reloc (bfd * input_bfd, arelent *reloc_entry,
   bfd_vma relocation;
   bfd_byte *inplace_address;
   bfd_vma insn;
-  const bfd_vma signmask = 0xffff8000;
 
   /* This part is from bfd_elf_generic_reloc.
      If we're relocating, and this an external symbol, we don't want
@@ -351,19 +350,19 @@ visium_elf_howto_parity_reloc (bfd * input_bfd, arelent *reloc_entry,
 
   if (reloc_entry->howto->pc_relative)
     {
-      relocation -= input_section->output_section->vma
-       + input_section->output_offset;
+      relocation -= input_section->output_section->vma;
+      relocation -= input_section->output_offset;
       relocation -= reloc_entry->address;
     }
 
   switch (reloc_entry->howto->type)
     {
     case R_VISIUM_PC16:
-      relocation >>= 2;
-      if (ret == bfd_reloc_ok && (relocation & signmask) != 0
-         && (relocation & signmask) != signmask)
+      if (ret == bfd_reloc_ok
+         && ((bfd_signed_vma) relocation < -0x20000
+             || (bfd_signed_vma) relocation > 0x1ffff))
        ret = bfd_reloc_overflow;
-      relocation &= 0xffff;
+      relocation = (relocation >> 2) & 0xffff;
       break;
     case R_VISIUM_HI16:
     case R_VISIUM_HI16_PCREL: