* 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.
This commit is contained in:
parent
5f5f22c0ce
commit
3df4e177c9
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user