diff options
author | Eric Christopher <echristo@gmail.com> | 2000-11-01 00:54:00 +0000 |
---|---|---|
committer | Eric Christopher <echristo@gmail.com> | 2000-11-01 00:54:00 +0000 |
commit | c51ce5f0646879e7a1070673df888435204dcb1a (patch) | |
tree | 839279fd52d5c5d31e6b9b420890349bc95e86f5 /gas/config/tc-mn10300.c | |
parent | 7947af930573d349a6201482ed4fa6ad88b2cc21 (diff) | |
download | fsf-binutils-gdb-c51ce5f0646879e7a1070673df888435204dcb1a.zip fsf-binutils-gdb-c51ce5f0646879e7a1070673df888435204dcb1a.tar.gz fsf-binutils-gdb-c51ce5f0646879e7a1070673df888435204dcb1a.tar.bz2 |
2000-10-31 Eric Christopher <echristo@cygnus.com>
* config/tc-mn10300.c (md_apply_fix3): Use valuep if fully resolved
or pc-relative, else use fx_offset.
Diffstat (limited to 'gas/config/tc-mn10300.c')
-rw-r--r-- | gas/config/tc-mn10300.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/gas/config/tc-mn10300.c b/gas/config/tc-mn10300.c index 301a42b..5137bf4 100644 --- a/gas/config/tc-mn10300.c +++ b/gas/config/tc-mn10300.c @@ -1912,11 +1912,12 @@ md_pcrel_from (fixp) int md_apply_fix3 (fixp, valuep, seg) fixS *fixp; - valueT *valuep ATTRIBUTE_UNUSED; + valueT *valuep; segT seg; { char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal; int size = 0; + int value; assert (fixp->fx_r_type < BFD_RELOC_UNUSED); @@ -1924,6 +1925,23 @@ md_apply_fix3 (fixp, valuep, seg) if (seg->flags & SEC_ALLOC) abort (); + /* The value we are passed in *valuep includes the symbol values. + Since we are using BFD_ASSEMBLER, if we are doing this relocation + the code in write.c is going to call bfd_install_relocation, which + is also going to use the symbol value. That means that if the + reloc is fully resolved we want to use *valuep since + bfd_install_relocation is not being used. + + However, if the reloc is not fully resolved we do not want to use + *valuep, and must use fx_offset instead. However, if the reloc + is PC relative, we do want to use *valuep since it includes the + result of md_pcrel_from. */ + if (fixp->fx_addsy == (symbolS *) NULL || fixp->fx_pcrel) + value = *valuep; + else + value = fixp->fx_offset; + + /* If the fix is relative to a symbol which is not defined, or not in the same segment as the fix, we cannot resolve it here. */ if (fixp->fx_addsy != NULL @@ -1959,7 +1977,7 @@ md_apply_fix3 (fixp, valuep, seg) _("Bad relocation fixup type (%d)"), fixp->fx_r_type); } - md_number_to_chars (fixpos, fixp->fx_offset, size); + md_number_to_chars (fixpos, value, size); fixp->fx_done = 1; return 0; |