diff options
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/expr.c | 9 | ||||
-rw-r--r-- | gas/symbols.c | 8 |
3 files changed, 21 insertions, 4 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index e02bc3a..374c60e 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2010-12-01 Maciej W. Rozycki <macro@codesourcery.com> + + * symbols.c (symbol_clone_if_forward_ref): Don't limit cloning + to expr_section symbols; clone all equated symbols. Clear + sy_resolving of the cloned copy. + * expr.c (operand): Only clone equated symbols on a final + (i.e. non-equated) reference. + 2010-12-01 Richard Sandiford <rdsandiford@googlemail.com> * config/tc-mips.c (md_convert_frag): Remove a call to @@ -1373,8 +1373,13 @@ operand (expressionS *expressionP, enum expr_mode mode) if (expressionP->X_add_symbol) symbol_mark_used (expressionP->X_add_symbol); - expressionP->X_add_symbol = symbol_clone_if_forward_ref (expressionP->X_add_symbol); - expressionP->X_op_symbol = symbol_clone_if_forward_ref (expressionP->X_op_symbol); + if (mode != expr_defer) + { + expressionP->X_add_symbol + = symbol_clone_if_forward_ref (expressionP->X_add_symbol); + expressionP->X_op_symbol + = symbol_clone_if_forward_ref (expressionP->X_op_symbol); + } switch (expressionP->X_op) { diff --git a/gas/symbols.c b/gas/symbols.c index 7b5e514..e432b86 100644 --- a/gas/symbols.c +++ b/gas/symbols.c @@ -645,7 +645,8 @@ symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward) /* Re-using sy_resolving here, as this routine cannot get called from symbol resolution code. */ - if (symbolP->bsym->section == expr_section && !symbolP->sy_resolving) + if ((symbolP->bsym->section == expr_section || symbolP->sy_forward_ref) + && !symbolP->sy_resolving) { symbolP->sy_resolving = 1; add_symbol = symbol_clone_if_forward_ref (add_symbol, is_forward); @@ -656,7 +657,10 @@ symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward) if (symbolP->sy_forward_ref || add_symbol != symbolP->sy_value.X_add_symbol || op_symbol != symbolP->sy_value.X_op_symbol) - symbolP = symbol_clone (symbolP, 0); + { + symbolP = symbol_clone (symbolP, 0); + symbolP->sy_resolving = 0; + } symbolP->sy_value.X_add_symbol = add_symbol; symbolP->sy_value.X_op_symbol = op_symbol; |