[binutils-gdb] x86: make symbol quotation check consistent in i386_att_operand()

Jan Beulich jbeulich@sourceware.org
Mon Jun 7 10:05:42 GMT 2021


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9d299bea8cca3bfd91a3c7a47510c52a9e829858

commit 9d299bea8cca3bfd91a3c7a47510c52a9e829858
Author: Jan Beulich <jbeulich@suse.com>
Date:   Mon Jun 7 12:03:32 2021 +0200

    x86: make symbol quotation check consistent in i386_att_operand()
    
    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.

Diff:
---
 gas/ChangeLog                   |  7 +++++++
 gas/config/tc-i386.c            | 17 ++++++++++-------
 gas/testsuite/gas/i386/i386.exp |  1 +
 gas/testsuite/gas/i386/quoted.d | 16 ++++++++++++++++
 gas/testsuite/gas/i386/quoted.s | 10 ++++++++++
 5 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 008027b1fc1..b5686eed778 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 0fe439eddd5..063383c8dcd 100644
--- 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;
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index efcccafc034..001c5f90adb 100644
--- 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" ""
diff --git a/gas/testsuite/gas/i386/quoted.d b/gas/testsuite/gas/i386/quoted.d
new file mode 100644
index 00000000000..704329db1f9
--- /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
diff --git a/gas/testsuite/gas/i386/quoted.s b/gas/testsuite/gas/i386/quoted.s
new file mode 100644
index 00000000000..3bbeedfa0bc
--- /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)"


More information about the Binutils-cvs mailing list