From: Maciej W. Rozycki Date: Wed, 1 Dec 2010 20:35:13 +0000 (+0000) Subject: * symbols.c (symbol_clone_if_forward_ref): Don't limit cloning X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3df4e177c9bdd2dd095a3c4e437ffba47cf32b37;p=binutils-gdb.git * 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index e02bc3a2f39..374c60e3a33 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 f050b17ccb2..620fdce31d7 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 7b5e514a315..e432b8603f6 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;