aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1996-12-07 00:32:05 +0000
committerIan Lance Taylor <ian@airs.com>1996-12-07 00:32:05 +0000
commitf74ba7a3d90dc235f81eb3b385ec17a1f6152abc (patch)
tree7a44eb8931fff019a9d3c8273cfa78c25c8ce114 /gas
parent15e69f9816fdcd7e2e92a3071b195a6194693c1b (diff)
downloadgdb-f74ba7a3d90dc235f81eb3b385ec17a1f6152abc.zip
gdb-f74ba7a3d90dc235f81eb3b385ec17a1f6152abc.tar.gz
gdb-f74ba7a3d90dc235f81eb3b385ec17a1f6152abc.tar.bz2
* config/tc-mips.c (mips16_extended_frag): Don't call
S_GET_VALUE. (md_convert_frag): Call resolve_symbol_value before calling S_GET_VALUE, and don't add in the frag address.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-mips.c33
2 files changed, 28 insertions, 10 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 8a582c9..be6205a 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,10 @@
Fri Dec 6 18:48:13 1996 Ian Lance Taylor <ian@cygnus.com>
+ * config/tc-mips.c (mips16_extended_frag): Don't call
+ S_GET_VALUE.
+ (md_convert_frag): Call resolve_symbol_value before calling
+ S_GET_VALUE, and don't add in the frag address.
+
* config/tc-mips.c (mips16_immed): Add file and line parameters,
and use them when reporting errors. Change all callers.
diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c
index 2945a9a..9842c1e 100644
--- a/gas/config/tc-mips.c
+++ b/gas/config/tc-mips.c
@@ -9009,6 +9009,7 @@ mips16_extended_frag (fragp, sec, stretch)
register const struct mips16_immed_operand *op;
offsetT val;
int mintiny, maxtiny;
+ segT symsec;
type = RELAX_MIPS16_TYPE (fragp->fr_subtype);
op = mips16_immed_operands;
@@ -9037,14 +9038,26 @@ mips16_extended_frag (fragp, sec, stretch)
maxtiny = (1 << (op->nbits - 1)) - 1;
}
- /* FIXME: If this is an expression symbol, this will fix its value.
- If the expression is actually a subtraction of two symbols in the
- segment being relaxed, the value will get fixed inappropriately. */
- val = S_GET_VALUE (fragp->fr_symbol);
-
- /* When we are called, symbol values are offsets within a frag. The
- address of the frag has not yet been added into the value. */
- val += fragp->fr_symbol->sy_frag->fr_address;
+ /* We can't call S_GET_VALUE here, because we don't want to lock in
+ a particular frag address. */
+ if (fragp->fr_symbol->sy_value.X_op == O_constant)
+ {
+ val = (fragp->fr_symbol->sy_value.X_add_number
+ + fragp->fr_symbol->sy_frag->fr_address);
+ symsec = S_GET_SEGMENT (fragp->fr_symbol);
+ }
+ else if (fragp->fr_symbol->sy_value.X_op == O_symbol
+ && (fragp->fr_symbol->sy_value.X_add_symbol->sy_value.X_op
+ == O_constant))
+ {
+ val = (fragp->fr_symbol->sy_value.X_add_symbol->sy_value.X_add_number
+ + fragp->fr_symbol->sy_value.X_add_symbol->sy_frag->fr_address
+ + fragp->fr_symbol->sy_value.X_add_number
+ + fragp->fr_symbol->sy_frag->fr_address);
+ symsec = S_GET_SEGMENT (fragp->fr_symbol->sy_value.X_add_symbol);
+ }
+ else
+ return 1;
if (op->pcrel)
{
@@ -9063,7 +9076,7 @@ mips16_extended_frag (fragp, sec, stretch)
}
else
{
- if (S_GET_SEGMENT (fragp->fr_symbol) != sec)
+ if (symsec != sec)
{
fragp->fr_subtype =
RELAX_MIPS16_MARK_LONG_BRANCH (fragp->fr_subtype);
@@ -9470,8 +9483,8 @@ md_convert_frag (abfd, asec, fragp)
ext = false;
}
+ resolve_symbol_value (fragp->fr_symbol);
val = S_GET_VALUE (fragp->fr_symbol);
- val += fragp->fr_symbol->sy_frag->fr_address;
if (op->pcrel)
{
addressT addr;