From 3df4e177c9bdd2dd095a3c4e437ffba47cf32b37 Mon Sep 17 00:00:00 2001 From: "Maciej W. Rozycki" Date: Wed, 1 Dec 2010 20:35:13 +0000 Subject: [PATCH] * 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. --- gas/ChangeLog | 8 ++++++++ gas/expr.c | 9 +++++++-- gas/symbols.c | 8 ++++++-- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index e02bc3a2f3..374c60e3a3 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2010-12-01 Maciej W. Rozycki + + * 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 * config/tc-mips.c (md_convert_frag): Remove a call to diff --git a/gas/expr.c b/gas/expr.c index f050b17ccb..620fdce31d 100644 --- a/gas/expr.c +++ b/gas/expr.c @@ -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 7b5e514a31..e432b8603f 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; -- 2.34.1