From: Richard Sandiford Date: Wed, 4 Jul 2001 09:49:29 +0000 (+0000) Subject: [gas] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7461da6e23ba6833a831dc70b8e774bcc50c2cac;p=binutils-gdb.git [gas] * config/tc-mips.c (md_apply_fix): Prevent addend from becoming zero if it's expected to be non-zero. [gas/testsuite] * gas/mips/elf-rel3.s: Add zero word to end of file. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index a1731aae356..57290b5a02d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2001-07-04 Richard Sandiford + + * 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 * 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 ebe8d7f0fbd..064a2704c33 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 449367e1fc1..22082100e95 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-07-04 Richard Sandiford + + * gas/mips/elf-rel3.s: Add zero word to end of file. + 2001-07-03 H.J. Lu * 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 ddf2bef4d71..d57e5a89486 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