diff options
author | Nick Clifton <nickc@redhat.com> | 2005-10-11 11:16:17 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2005-10-11 11:16:17 +0000 |
commit | 9497f5ac6bc10bdd65ea471787619bde1edca77d (patch) | |
tree | 7f36b3cb6f0d84b058dfba51242bd900edde9503 /gas/config/tc-sh.c | |
parent | 1334d4d50c52bc295dace4982442369838f478b3 (diff) | |
download | gdb-9497f5ac6bc10bdd65ea471787619bde1edca77d.zip gdb-9497f5ac6bc10bdd65ea471787619bde1edca77d.tar.gz gdb-9497f5ac6bc10bdd65ea471787619bde1edca77d.tar.bz2 |
This adjusts equate handling by
- allowing true forward references (which will always assume the referenced
symbols have at the point of use) through the new .eqv pseudo-op and the
new == operator
- disallowing changing .equiv-generated equates (so that the protection this
provides is both forward and backward)
- snapshotting equates when their value gets changed so that previous uses
don't get affected by the new value.
- allowing expressions in places where absolute expressions (or register
names) are needed which were not completely resolvable at the point of
their definition but which are fully resolvable at the point of use
In addition it fixes PR/288.
Diffstat (limited to 'gas/config/tc-sh.c')
-rw-r--r-- | gas/config/tc-sh.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/gas/config/tc-sh.c b/gas/config/tc-sh.c index 0b294e0..acf62ae 100644 --- a/gas/config/tc-sh.c +++ b/gas/config/tc-sh.c @@ -4295,7 +4295,10 @@ sh_end_of_match (char *cont, char *what) } int -sh_parse_name (char const *name, expressionS *exprP, char *nextcharP) +sh_parse_name (char const *name, + expressionS *exprP, + enum expr_mode mode, + char *nextcharP) { char *next = input_line_pointer; char *next_end; @@ -4314,13 +4317,13 @@ sh_parse_name (char const *name, expressionS *exprP, char *nextcharP) /* If we have an absolute symbol or a reg, then we know its value now. */ segment = S_GET_SEGMENT (exprP->X_add_symbol); - if (segment == absolute_section) + if (mode != expr_defer && segment == absolute_section) { exprP->X_op = O_constant; exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol); exprP->X_add_symbol = NULL; } - else if (segment == reg_section) + else if (mode != expr_defer && segment == reg_section) { exprP->X_op = O_register; exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol); |