x86: don't attempt to resolve equates and alike from i386_parse_name()
PR gas/28977
Perhaps right from its introduction in 4d1bb7955a
it was wrong for
i386_parse_name() to call parse_register(). This being a hook from the
expression parser, it shouldn't be resolving e.g. equated symbols.
That's relevant only for all other callers of parse_register().
To compensate, in Intel syntax mode check_register() needs calling;
perhaps not doing so was an oversight right when the function was
introduced. This is necessary in particular to force EVEX encoding when
VRex registers are used (but of course also to reject bad uses of
registers, i.e. fully matching what parse_register() needs it for).
This commit is contained in:
parent
131a355fbc
commit
4faaa10f3f
5 changed files with 39 additions and 2 deletions
|
@ -289,6 +289,13 @@ i386_intel_simplify_register (expressionS *e)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!check_register (&i386_regtab[reg_num]))
|
||||
{
|
||||
as_bad (_("register '%s%s' cannot be used here"),
|
||||
register_prefix, i386_regtab[reg_num].reg_name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!intel_state.in_bracket)
|
||||
{
|
||||
if (i.op[this_operand].regs)
|
||||
|
|
|
@ -13000,11 +13000,12 @@ parse_register (char *reg_string, char **end_op)
|
|||
int
|
||||
i386_parse_name (char *name, expressionS *e, char *nextcharP)
|
||||
{
|
||||
const reg_entry *r;
|
||||
const reg_entry *r = NULL;
|
||||
char *end = input_line_pointer;
|
||||
|
||||
*end = *nextcharP;
|
||||
r = parse_register (name, &input_line_pointer);
|
||||
if (*name == REGISTER_PREFIX || allow_naked_reg)
|
||||
r = parse_real_register (name, &input_line_pointer);
|
||||
if (r && end <= input_line_pointer)
|
||||
{
|
||||
*nextcharP = *input_line_pointer;
|
||||
|
|
17
gas/testsuite/gas/i386/equ-2.l
Normal file
17
gas/testsuite/gas/i386/equ-2.l
Normal file
|
@ -0,0 +1,17 @@
|
|||
.*: Assembler messages:
|
||||
.*:8: Error: .*
|
||||
#...
|
||||
GAS LISTING .*
|
||||
|
||||
|
||||
[ ]*[0-9]+[ ]+# .*
|
||||
[ ]*[0-9]+[ ]+equ:
|
||||
[ ]*[0-9]+[ ]+s = %edx % %ecx
|
||||
[ ]*[0-9]+[ ]+x = s
|
||||
[ ]*[0-9]+[ ]+y = s
|
||||
[ ]*[0-9]+[ ]+z = s
|
||||
[ ]*[0-9]+[ ]*
|
||||
[ ]*[0-9]+[ ]+t = %ymm5%%%!%%%%!%%%%%%%%!%ebp%%%%%%%%%%%%%%%%%%M
|
||||
[ ]*[0-9]+[ ]+a = t
|
||||
[ ]*[0-9]+[ ]+b = t
|
||||
[ ]*[0-9]+[ ]+c = t
|
11
gas/testsuite/gas/i386/equ-2.s
Normal file
11
gas/testsuite/gas/i386/equ-2.s
Normal file
|
@ -0,0 +1,11 @@
|
|||
# PR gas/28977
|
||||
equ:
|
||||
s = %edx % %ecx
|
||||
x = s
|
||||
y = s
|
||||
z = s
|
||||
|
||||
t = %ymm5%%%!%%%%!%%%%%%%%!%ebp%%%%%%%%%%%%%%%%%%M
|
||||
a = t
|
||||
b = t
|
||||
c = t
|
|
@ -99,6 +99,7 @@ if [gas_32_check] then {
|
|||
run_list_test "suffix-bad"
|
||||
run_dump_test "immed32"
|
||||
run_dump_test "equ"
|
||||
run_list_test "equ-2" "-al"
|
||||
run_list_test "equ-bad"
|
||||
run_dump_test "divide"
|
||||
run_dump_test "quoted"
|
||||
|
|
Loading…
Add table
Reference in a new issue