oss-fuzz found another case where i386_intel_simplify and
i386_intel_simplify_symbol recurse until stack overflow. This time
recursion happened on an expression with both X_add_symbol and
X_op_symbol, the call stack alternating on the two symbols. Fix
that case too.
* config/tc-i386-intel.c (i386_intel_simplify): Mark X_add_symbol
whenever calling i386_intel_simplify_symbol for X_op_symbol.
* testsuite/gas/i386/intel-equ-loop.s,
* testsuite/gas/i386/intel-equ-loop.l: Extend testcase.
intel_state.index))
return 0;
e->X_add_symbol = newsym;
intel_state.index))
return 0;
e->X_add_symbol = newsym;
+ symbol_mark_resolving (e->X_add_symbol);
}
if (!intel_state.in_offset)
++intel_state.in_bracket;
newsym = i386_intel_simplify_symbol (e->X_op_symbol);
}
if (!intel_state.in_offset)
++intel_state.in_bracket;
newsym = i386_intel_simplify_symbol (e->X_op_symbol);
+ if (e->X_add_symbol)
+ symbol_clear_resolving (e->X_add_symbol);
if (!intel_state.in_offset)
--intel_state.in_bracket;
if (!newsym)
if (!intel_state.in_offset)
--intel_state.in_bracket;
if (!newsym)
+ symbol_mark_resolving (e->X_add_symbol);
newsym = i386_intel_simplify_symbol (e->X_op_symbol);
newsym = i386_intel_simplify_symbol (e->X_op_symbol);
+ symbol_clear_resolving (e->X_add_symbol);
if (newsym)
{
e->X_op_symbol = newsym;
if (newsym)
{
e->X_op_symbol = newsym;
other = symbol_get_value_expression (e->X_add_symbol);
}
other = symbol_get_value_expression (e->X_add_symbol);
}
+ symbol_mark_resolving (e->X_add_symbol);
newsym = i386_intel_simplify_symbol (e->X_op_symbol);
newsym = i386_intel_simplify_symbol (e->X_op_symbol);
+ symbol_clear_resolving (e->X_add_symbol);
return 0;
if (e->X_op_symbol)
{
return 0;
if (e->X_op_symbol)
{
+ if (e->X_add_symbol)
+ symbol_mark_resolving (e->X_add_symbol);
newsym = i386_intel_simplify_symbol (e->X_op_symbol);
newsym = i386_intel_simplify_symbol (e->X_op_symbol);
+ if (e->X_add_symbol)
+ symbol_clear_resolving (e->X_add_symbol);
if (!newsym)
return 0;
e->X_op_symbol = newsym;
if (!newsym)
return 0;
e->X_op_symbol = newsym;
.*: Error: can't resolve .*
.*: Error: symbol definition loop .*
.*: Error: can't resolve .*
.*: Error: can't resolve .*
.*: Error: symbol definition loop .*
.*: Error: can't resolve .*
+.*: Error: symbol definition loop .*
+.*: Error: can't resolve .*
f = g + 1
g = f - 1
mov eax, [f]
f = g + 1
g = f - 1
mov eax, [f]
+
+ h=i
+ j=h
+ i=j+h
+ .int i