x86/gas: replace inappropriate assertion when parsing registers

PR gas/30117
Once a symbol had its expression evaluated, the "segment" of the symbol
may be reg_section if a register is merely involved in the expression,
not just when the expression references a "plain" register. Therefore
the first of the assertions put in place by 4d1bb7955a8b was too strict.
Convert it to an if() to deal with situations like this one found by
fuzzing:

	x=s
	s=%eax+0
	y=s
	or $6,x

In non-debug builds this also avoids potentially silently generating bad
code.
This commit is contained in:
Jan Beulich
2023-02-16 09:40:08 +01:00
parent 42dcffb469
commit 0ccade1ae2

View File

@ -13057,17 +13057,19 @@ parse_register (char *reg_string, char **end_op)
{
const expressionS *e = symbol_get_value_expression (symbolP);
know (e->X_op == O_register);
if (e->X_op == O_register)
{
know (e->X_add_number >= 0
&& (valueT) e->X_add_number < i386_regtab_size);
r = i386_regtab + e->X_add_number;
if (!check_register (r))
*end_op = input_line_pointer;
}
if (r && !check_register (r))
{
as_bad (_("register '%s%s' cannot be used here"),
register_prefix, r->reg_name);
r = &bad_reg;
}
*end_op = input_line_pointer;
}
*input_line_pointer = c;
input_line_pointer = save;