* expr.c (expr): Set return value to absolute_section for
subtractive operations on symbols within a segment. * read.c (pseudo_set): Set segment for complex expressions.
This commit is contained in:
parent
400071f14b
commit
40e3ba9bb7
3 changed files with 21 additions and 3 deletions
|
@ -1,5 +1,9 @@
|
||||||
2001-05-25 Alan Modra <amodra@one.net.au>
|
2001-05-25 Alan Modra <amodra@one.net.au>
|
||||||
|
|
||||||
|
* expr.c (expr): Set return value to absolute_section for
|
||||||
|
subtractive operations on symbols within a segment.
|
||||||
|
* read.c (pseudo_set): Set segment for complex expressions.
|
||||||
|
|
||||||
From 2.11 branch 2001-03-30 Richard Henderson <rth@redhat.com>
|
From 2.11 branch 2001-03-30 Richard Henderson <rth@redhat.com>
|
||||||
* config/tc-i386.c (md_convert_frag): Don't die on local symbols
|
* config/tc-i386.c (md_convert_frag): Don't die on local symbols
|
||||||
that have been finalized.
|
that have been finalized.
|
||||||
|
|
13
gas/expr.c
13
gas/expr.c
|
@ -1862,6 +1862,19 @@ expr (rankarg, resultP)
|
||||||
resultP->X_add_number += right.X_add_number;
|
resultP->X_add_number += right.X_add_number;
|
||||||
else if (op_left == O_subtract)
|
else if (op_left == O_subtract)
|
||||||
resultP->X_add_number -= right.X_add_number;
|
resultP->X_add_number -= right.X_add_number;
|
||||||
|
if (retval == rightseg
|
||||||
|
&& (op_left == O_subtract
|
||||||
|
|| op_left == O_eq
|
||||||
|
|| op_left == O_ne
|
||||||
|
|| op_left == O_lt
|
||||||
|
|| op_left == O_le
|
||||||
|
|| op_left == O_ge
|
||||||
|
|| op_left == O_gt))
|
||||||
|
{
|
||||||
|
/* For subtractive operations on symbols within a
|
||||||
|
segment, the result will absolute. */
|
||||||
|
retval = absolute_section;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -3151,6 +3151,7 @@ pseudo_set (symbolP)
|
||||||
symbolS *symbolP;
|
symbolS *symbolP;
|
||||||
{
|
{
|
||||||
expressionS exp;
|
expressionS exp;
|
||||||
|
segT seg;
|
||||||
#if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
|
#if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
|
||||||
int ext;
|
int ext;
|
||||||
#endif /* OBJ_AOUT or OBJ_BOUT */
|
#endif /* OBJ_AOUT or OBJ_BOUT */
|
||||||
|
@ -3160,7 +3161,7 @@ pseudo_set (symbolP)
|
||||||
ext = S_IS_EXTERNAL (symbolP);
|
ext = S_IS_EXTERNAL (symbolP);
|
||||||
#endif /* OBJ_AOUT or OBJ_BOUT */
|
#endif /* OBJ_AOUT or OBJ_BOUT */
|
||||||
|
|
||||||
(void) expression (&exp);
|
seg = expression (&exp);
|
||||||
|
|
||||||
if (exp.X_op == O_illegal)
|
if (exp.X_op == O_illegal)
|
||||||
as_bad (_("illegal expression; zero assumed"));
|
as_bad (_("illegal expression; zero assumed"));
|
||||||
|
@ -3236,9 +3237,9 @@ pseudo_set (symbolP)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* The value is some complex expression.
|
/* The value is some complex expression. */
|
||||||
FIXME: Should we set the segment to anything? */
|
|
||||||
symbol_set_value_expression (symbolP, &exp);
|
symbol_set_value_expression (symbolP, &exp);
|
||||||
|
S_SET_SEGMENT (symbolP, seg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue