MIPS/GAS: Correct BFD_RELOC_MIPS_18_PCREL_S3 calculation
[external/binutils.git] / gas / config / tc-mips.c
index ed64b68..74f7e00 100644 (file)
@@ -14606,6 +14606,11 @@ md_pcrel_from (fixS *fixP)
       /* Return the address of the delay slot.  */
       return addr + 4;
 
+    case BFD_RELOC_MIPS_18_PCREL_S3:
+      /* Return the aligned address of the doubleword containing
+         the instruction.  */
+      return addr & ~7;
+
     default:
       return addr;
     }
@@ -17224,7 +17229,15 @@ tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
 
       /* At this point, fx_addnumber is "symbol offset - pcrel address".
         Relocations want only the symbol offset.  */
-      reloc->addend = fixp->fx_addnumber + reloc->address;
+      switch (fixp->fx_r_type)
+       {
+       case BFD_RELOC_MIPS_18_PCREL_S3:
+         reloc->addend = fixp->fx_addnumber + (reloc->address & ~7);
+         break;
+       default:
+         reloc->addend = fixp->fx_addnumber + reloc->address;
+         break;
+       }
     }
   else if (HAVE_IN_PLACE_ADDENDS
           && fixp->fx_r_type == BFD_RELOC_MICROMIPS_JMP