mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-19 17:18:24 +08:00
x86: don't attempt to resolve equates and alike from i386_parse_name()
PR gas/28977 Perhaps right from its introduction in 4d1bb7955a8b 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:
@ -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"
|
||||
|
Reference in New Issue
Block a user