x86: make symbol quotation check consistent in i386_att_operand()
authorJan Beulich <jbeulich@suse.com>
Mon, 7 Jun 2021 10:03:32 +0000 (12:03 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 7 Jun 2021 10:03:32 +0000 (12:03 +0200)
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/ChangeLog
gas/config/tc-i386.c
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/quoted.d [new file with mode: 0644]
gas/testsuite/gas/i386/quoted.s [new file with mode: 0644]

index 008027b1fc12f9d525961cf6d41d7dac9c15d01d..b5686eed778dda6ea734b0753546d7477bfdf903 100644 (file)
@@ -1,3 +1,10 @@
+2021-06-07  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.
+
 2021-06-07  Jan Beulich  <jbeulich@suse.com>
 
        * config/tc-i386.c (i386_att_operand): Flip checking for '*' and
index 0fe439eddd5ac94d7751198738ba69e57ecea0e6..063383c8dcdb2ed88c86bbc9e84eef326ecd608d 100644 (file)
@@ -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;
index efcccafc0344aa438c7b97662bb55a4acdb81ad8..001c5f90adbaad8467849a8c9535634ad868aef2 100644 (file)
@@ -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" ""
diff --git a/gas/testsuite/gas/i386/quoted.d b/gas/testsuite/gas/i386/quoted.d
new file mode 100644 (file)
index 0000000..704329d
--- /dev/null
@@ -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
diff --git a/gas/testsuite/gas/i386/quoted.s b/gas/testsuite/gas/i386/quoted.s
new file mode 100644 (file)
index 0000000..3bbeedf
--- /dev/null
@@ -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)"