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.
This commit is contained in:
Eric Christopher 2000-11-01 00:54:00 +00:00
parent 7947af9305
commit c51ce5f064
2 changed files with 30 additions and 7 deletions

View File

@ -1,3 +1,8 @@
2000-10-31 Eric Christopher <echristo@redhat.com>
* config/tc-mn10300.c (md_apply_fix3): Use valuep if fully resolved
or pc-relative, else use fx_offset.
2000-10-31 Jim Wilson <wilson@redhat.com>
* config/tc-ia64.c (struct md): New field tag_fixups.

View File

@ -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;