diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/tc-mips.c | 15 |
2 files changed, 21 insertions, 1 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 1e88b21e0c0..45a505434e7 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,12 @@ 2016-06-21 Maciej W. Rozycki <macro@imgtec.com> + * config/tc-mips.c (md_pcrel_from) <BFD_RELOC_MIPS_18_PCREL_S3>: + Calculate relocation from the containing aligned doubleword. + (tc_gen_reloc) <BFD_RELOC_MIPS_18_PCREL_S3>: Calculate the + addend from the containing aligned doubleword. + +2016-06-21 Maciej W. Rozycki <macro@imgtec.com> + * config/tc-mips.c (mips_force_relocation): Use `file_mips_opts' rather than `mips_opts' for the R6 ISA check. (mips_fix_adjustable): Likewise. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index ed64b689364..74f7e005607 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -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 |