diff options
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/config/tc-mips.c | 39 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/mips/elf-rel3.s | 1 |
4 files changed, 47 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index a1731aa..57290b5 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2001-07-04 Richard Sandiford <rsandifo@redhat.com> + + * config/tc-mips.c (md_apply_fix): Prevent addend from becoming zero + if it's expected to be non-zero. + 2001-07-03 Nick Clifton <nickc@cambridge.redhat.com> * config/tc-sh.c (sh_frob_section): Replace symbol_get_frag() with diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index ebe8d7f..064a270 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -9612,9 +9612,44 @@ md_apply_fix (fixP, valueP) { /* In this case, the bfd_install_relocation routine will incorrectly add the symbol value back in. We just want - the addend to appear in the object file. - FIXME: If this makes VALUE zero, we're toast. */ + the addend to appear in the object file. */ value -= symval; + + /* Make sure the addend is still non-zero. If it became zero + after the last operation, set it to a spurious value and + subtract the same value from the object file's contents. */ + if (value == 0) + { + value = 8; + + /* The in-place addends for LO16 relocations are signed; + leave the matching HI16 in-place addends as zero. */ + if (fixP->fx_r_type != BFD_RELOC_HI16_S) + { + reloc_howto_type *howto; + bfd_vma contents, mask, field; + + howto = bfd_reloc_type_lookup (stdoutput, + fixP->fx_r_type); + + contents = bfd_get_bits (fixP->fx_frag->fr_literal + + fixP->fx_where, + fixP->fx_size * 8, + target_big_endian); + + /* MASK has bits set where the relocation should go. + FIELD is -value, shifted into the appropriate place + for this relocation. */ + mask = 1 << (howto->bitsize - 1); + mask = (((mask - 1) << 1) | 1) << howto->bitpos; + field = (-value >> howto->rightshift) << howto->bitpos; + + bfd_put_bits ((field & mask) | (contents & ~mask), + fixP->fx_frag->fr_literal + fixP->fx_where, + fixP->fx_size * 8, + target_big_endian); + } + } } } diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 449367e..2208210 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-07-04 Richard Sandiford <rsandifo@redhat.com> + + * gas/mips/elf-rel3.s: Add zero word to end of file. + 2001-07-03 H.J. Lu <hjl@gnu.org> * gas/mips/lb-xgot-ilocks.d: Add -march=r3900. diff --git a/gas/testsuite/gas/mips/elf-rel3.s b/gas/testsuite/gas/mips/elf-rel3.s index ddf2bef..d57e5a8 100644 --- a/gas/testsuite/gas/mips/elf-rel3.s +++ b/gas/testsuite/gas/mips/elf-rel3.s @@ -9,3 +9,4 @@ x: b: .word b+4 .word x + .word 0 |