[PATCH 1/3] x86: don't attempt to resolve equates and alike from i386_parse_name()

Jan Beulich jbeulich@suse.com
Tue Mar 22 13:52:28 GMT 2022


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 is intended as a replacement for the then to be reverted
5fac3f02edac ("PR28977 tc-i386.c internal error in parse_register").

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -13000,11 +13000,12 @@ parse_register (char *reg_string, char *
 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;
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -289,6 +289,13 @@ i386_intel_simplify_register (expression
       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)
--- /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
--- /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
--- 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"



More information about the Binutils mailing list