diff options
-rw-r--r-- | gas/ChangeLog | 4 | ||||
-rw-r--r-- | gas/expr.c | 13 | ||||
-rw-r--r-- | gas/read.c | 7 |
3 files changed, 21 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 6f5b600..6abbd8e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,9 @@ 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> * config/tc-i386.c (md_convert_frag): Don't die on local symbols that have been finalized. @@ -1862,6 +1862,19 @@ expr (rankarg, resultP) resultP->X_add_number += right.X_add_number; else if (op_left == O_subtract) 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 { @@ -3151,6 +3151,7 @@ pseudo_set (symbolP) symbolS *symbolP; { expressionS exp; + segT seg; #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER) int ext; #endif /* OBJ_AOUT or OBJ_BOUT */ @@ -3160,7 +3161,7 @@ pseudo_set (symbolP) ext = S_IS_EXTERNAL (symbolP); #endif /* OBJ_AOUT or OBJ_BOUT */ - (void) expression (&exp); + seg = expression (&exp); if (exp.X_op == O_illegal) as_bad (_("illegal expression; zero assumed")); @@ -3236,9 +3237,9 @@ pseudo_set (symbolP) break; default: - /* The value is some complex expression. - FIXME: Should we set the segment to anything? */ + /* The value is some complex expression. */ symbol_set_value_expression (symbolP, &exp); + S_SET_SEGMENT (symbolP, seg); break; } } |