aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <rdsandiford@googlemail.com>2001-07-04 09:49:29 +0000
committerRichard Sandiford <rdsandiford@googlemail.com>2001-07-04 09:49:29 +0000
commit7461da6e23ba6833a831dc70b8e774bcc50c2cac (patch)
tree3e20ebce7e712204f6af432f2ec2929420c62e39
parent5e7079af51100fcb3b989719bee35e6c93b59aee (diff)
downloadgdb-7461da6e23ba6833a831dc70b8e774bcc50c2cac.zip
gdb-7461da6e23ba6833a831dc70b8e774bcc50c2cac.tar.gz
gdb-7461da6e23ba6833a831dc70b8e774bcc50c2cac.tar.bz2
[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.
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-mips.c39
-rw-r--r--gas/testsuite/ChangeLog4
-rw-r--r--gas/testsuite/gas/mips/elf-rel3.s1
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