MIPS/GAS: Correct BFD_RELOC_MIPS_18_PCREL_S3 calculation
authorMaciej W. Rozycki <macro@imgtec.com>
Tue, 21 Jun 2016 17:54:16 +0000 (18:54 +0100)
committerMaciej W. Rozycki <macro@imgtec.com>
Tue, 21 Jun 2016 21:58:50 +0000 (22:58 +0100)
commit51f6035b9ec8b4a23d73bed6688804e5f595e1c2
tree84d99f81e503ef74359b25b8d79c55a04b7dec0d
parent912815f079a8f3c40c0968ba5140619de079e199
MIPS/GAS: Correct BFD_RELOC_MIPS_18_PCREL_S3 calculation

The PC-relative R_MIPS_PC18_S3 relocation and consequently its BFD
internal BFD_RELOC_MIPS_18_PCREL_S3 representation is calculated from
the address of the aligned doubleword containing the location being
relocated: (sign_extend(A) + S - (P & ~0x7)) >> 3 rather than the
address of the location itself.  Reflect this in calculations made by
GAS so that the relocated field is set correctly if resolved by GAS,
such as with local symbols in the same section which do not require
relocations to be propagated to the link stage.

gas/
* 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.
gas/ChangeLog
gas/config/tc-mips.c