[5/8] x86: make symbol quotation check consistent in i386_att_operand()

Message ID 60527e89-635e-8b49-c627-7cb0668f3c31@suse.com
State New
Headers show
Series
  • x86: some tidying and quoted symbols fixes
Related show

Commit Message

Jan Beulich via Binutils June 4, 2021, 1:41 p.m.
When d02603dc201f ("Allow symbol and label names to be enclosed in
double quotes") added the check for a leading double quote to
i386_att_operand(), it missed a second similar check after having found
a segment override. To avoid the two checks going out of sync again,
introduce an inline helper.

gas/
2021-06-XX  Jan Beulich  <jbeulich@suse.com>

	* config/tc-i386.c (starts_memory_operand): New.
	(i386_att_operand): Use it.
	* testsuite/gas/i386/quoted.s, testsuite/gas/i386/quoted.d: New.
	* testsuite/gas/i386/i386.exp: Run new test.

Patch

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -11368,6 +11368,14 @@  maybe_adjust_templates (void)
   return 1;
 }
 
+static INLINE bool starts_memory_operand (char c)
+{
+  return is_digit_char (c)
+	 || is_identifier_char (c)
+	 || c == '"'
+	 || c == '(';
+}
+
 /* Parse OPERAND_STRING into the i386_insn structure I.  Returns zero
    on error.  */
 
@@ -11422,9 +11430,7 @@  i386_att_operand (char *operand_string)
 	      i.jumpabsolute = true;
 	    }
 
-	  if (!is_digit_char (*op_string)
-	      && !is_identifier_char (*op_string)
-	      && *op_string != '(')
+	  if (!starts_memory_operand (*op_string))
 	    {
 	      as_bad (_("bad memory operand `%s'"), op_string);
 	      return 0;
@@ -11474,10 +11480,7 @@  i386_att_operand (char *operand_string)
       /* If it is a RC or SAE immediate, do nothing.  */
       ;
     }
-  else if (is_digit_char (*op_string)
-	   || is_identifier_char (*op_string)
-	   || *op_string == '"'
-	   || *op_string == '(')
+  else if (starts_memory_operand (*op_string))
     {
       /* This is a memory reference of some sort.  */
       char *base_string;
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -96,6 +96,7 @@  if [gas_32_check] then {
     run_dump_test "equ"
     run_list_test "equ-bad"
     run_dump_test "divide"
+    run_dump_test "quoted"
     run_dump_test "padlock"
     run_dump_test "crx"
     run_list_test "cr-err" ""
--- /dev/null
+++ b/gas/testsuite/gas/i386/quoted.d
@@ -0,0 +1,16 @@ 
+#objdump: -drw
+#name: i386 quoted symbols
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <quoted>:
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)32	x\(y\)
+[ 	]*[a-f0-9]+:[ 	]*8b 80 00 00 00 00[	 ]+mov    0x0\(%eax\),%eax	[a-f0-9]+: (R_386_|dir)32	x\(y\)
+[ 	]*[a-f0-9]+:[ 	]*26 a1 00 00 00 00[	 ]+mov    %es:0x0,%eax	[a-f0-9]+: (R_386_|dir)32	x\(y\)
+[ 	]*[a-f0-9]+:[ 	]*26 8b 80 00 00 00 00[	 ]+mov    %es:0x0\(%eax\),%eax	[a-f0-9]+: (R_386_|dir)32	x\(y\)
+[ 	]*[a-f0-9]+:[ 	]*ff 15 00 00 00 00[	 ]+call   \*0x0	[a-f0-9]+: (R_386_|dir)32	x\(y\)
+[ 	]*[a-f0-9]+:[ 	]*26 ff 15 00 00 00 00[	 ]+call   \*%es:0x0	[a-f0-9]+: (R_386_|dir)32	x\(y\)
+[ 	]*[a-f0-9]+:[ 	]*26 ff 15 00 00 00 00[	 ]+call   \*%es:0x0	[a-f0-9]+: (R_386_|dir)32	x\(y\)
+#pass
--- /dev/null
+++ b/gas/testsuite/gas/i386/quoted.s
@@ -0,0 +1,10 @@ 
+	.text
+quoted:
+	mov	"x(y)", %eax
+	mov	"x(y)"(%eax), %eax
+	mov	%es:"x(y)", %eax
+	mov	%es:"x(y)"(%eax), %eax
+
+	call	*"x(y)"
+	call	*%es:"x(y)"
+	call	%es:*"x(y)"