From: Jan Beulich Date: Wed, 23 Mar 2022 11:28:53 +0000 (+0100) Subject: x86: don't attempt to resolve equates and alike from i386_parse_name() X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4faaa10f3fabb345aca006ed67a8be97dc924e9c;p=binutils-gdb.git 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). --- diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c index 42f0afe0e41..d0c30ddbd5d 100644 --- a/gas/config/tc-i386-intel.c +++ b/gas/config/tc-i386-intel.c @@ -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) diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index afb8b706bda..aea19aa5d88 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -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; diff --git a/gas/testsuite/gas/i386/equ-2.l b/gas/testsuite/gas/i386/equ-2.l new file mode 100644 index 00000000000..97a24b531b3 --- /dev/null +++ b/gas/testsuite/gas/i386/equ-2.l @@ -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 diff --git a/gas/testsuite/gas/i386/equ-2.s b/gas/testsuite/gas/i386/equ-2.s new file mode 100644 index 00000000000..87ec9a78d1d --- /dev/null +++ b/gas/testsuite/gas/i386/equ-2.s @@ -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 diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index 3c157e9eb1e..96356d3eb11 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -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"