[binutils-gdb] x86: don't recognize quoted symbol names as registers or operators

Jan Beulich jbeulich@sourceware.org
Tue May 23 07:01:40 GMT 2023


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

commit 6acf9130909e5f531bb742939d402b40dee08304
Author: Jan Beulich <jbeulich@suse.com>
Date:   Tue May 23 09:00:44 2023 +0200

    x86: don't recognize quoted symbol names as registers or operators
    
    The concept of quoted symbols names was introduced pretty late. Utilize
    it to allow access to symbols with names matching that of a register (or,
    in Intel syntax, also an identifier-like operator).
    
    This is primarily to aid gcc when generating Intel syntax output; see
    their bug target/53929.

Diff:
---
 gas/config/tc-i386-intel.c       |  4 ++++
 gas/config/tc-i386.c             |  7 +++++++
 gas/testsuite/gas/i386/i386.exp  |  1 +
 gas/testsuite/gas/i386/quoted.d  |  7 +++++++
 gas/testsuite/gas/i386/quoted.s  | 10 ++++++++++
 gas/testsuite/gas/i386/quoted2.d | 15 +++++++++++++++
 gas/testsuite/gas/i386/quoted2.s |  9 +++++++++
 7 files changed, 53 insertions(+)

diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c
index f758bc59765..b5c97be234a 100644
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -169,6 +169,10 @@ operatorT i386_operator (const char *name, unsigned int operands, char *pc)
       return O_illegal;
     }
 
+  /* See the quotation related comment in i386_parse_name().  */
+  if (*pc == '"')
+    return O_absent;
+
   for (j = 0; i386_operators[j].name; ++j)
     if (strcasecmp (i386_operators[j].name, name) == 0)
       {
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 1002c5f564c..1b1f5d63b6a 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -13886,6 +13886,13 @@ i386_parse_name (char *name, expressionS *e, char *nextcharP)
   const reg_entry *r = NULL;
   char *end = input_line_pointer;
 
+  /* We only know the terminating character here.  It being double quote could
+     be the closing one of a quoted symbol name, or an opening one from a
+     following string (or another quoted symbol name).  Since the latter can't
+     be valid syntax for anything, bailing in either case is good enough.  */
+  if (*nextcharP == '"')
+    return 0;
+
   *end = *nextcharP;
   if (*name == REGISTER_PREFIX || allow_naked_reg)
     r = parse_real_register (name, &input_line_pointer);
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index c098f2de533..bce865c83d1 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -106,6 +106,7 @@ if [gas_32_check] then {
     run_list_test "equ-bad"
     run_dump_test "divide"
     run_dump_test "quoted"
+    run_dump_test "quoted2"
     run_dump_test "unary"
     run_dump_test "padlock"
     run_dump_test "crx"
diff --git a/gas/testsuite/gas/i386/quoted.d b/gas/testsuite/gas/i386/quoted.d
index d5986b65ea8..b6341b0af85 100644
--- a/gas/testsuite/gas/i386/quoted.d
+++ b/gas/testsuite/gas/i386/quoted.d
@@ -18,4 +18,11 @@ Disassembly of section .text:
 [ 	]*[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\)
+[ 	]*[a-f0-9]+:[ 	]*b8 00 00 00 00[	 ]+mov    \$0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	%eax
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	%eax
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	ecx
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	xmm0
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	not
+[ 	]*[a-f0-9]+:[ 	]*a1 00 00 00 00[	 ]+mov    0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	and
+[ 	]*[a-f0-9]+:[ 	]*b8 00 00 00 00[	 ]+mov    \$0x0,%eax	[a-f0-9]+: (R_386_|dir)?32	edx
 #pass
diff --git a/gas/testsuite/gas/i386/quoted.s b/gas/testsuite/gas/i386/quoted.s
index 21ada469610..d1341ef5f3b 100644
--- a/gas/testsuite/gas/i386/quoted.s
+++ b/gas/testsuite/gas/i386/quoted.s
@@ -14,3 +14,13 @@ quoted:
 	call	*"x(y)"
 	call	*%es:"x(y)"
 	call	%es:*"x(y)"
+
+	mov	$"%eax", %eax
+	mov	"%eax", %eax
+
+	.intel_syntax noprefix
+	mov	eax, "ecx"
+	mov	eax, "xmm0"
+	mov	eax, "not"
+	mov	eax, "and"
+	mov	eax, offset "edx"
diff --git a/gas/testsuite/gas/i386/quoted2.d b/gas/testsuite/gas/i386/quoted2.d
new file mode 100644
index 00000000000..a1eb844dbae
--- /dev/null
+++ b/gas/testsuite/gas/i386/quoted2.d
@@ -0,0 +1,15 @@
+#objdump: -r
+#name: i386 quoted symbols (data)
+# Mach-O relocations appear in inverse order
+#notarget: *-*-darwin
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR \[\.data\]:
+OFFSET +TYPE +VALUE
+0+00 (R_386_|dir)?32 +%ebx
+0+04 (R_386_|dir)?32 +%rdx
+0+08 (R_386_|dir)?32 +eax
+0+0c (R_386_|dir)?32 +cr0
+0+10 (R_386_|dir)?32 +k0
+#pass
diff --git a/gas/testsuite/gas/i386/quoted2.s b/gas/testsuite/gas/i386/quoted2.s
new file mode 100644
index 00000000000..d13b14e99a4
--- /dev/null
+++ b/gas/testsuite/gas/i386/quoted2.s
@@ -0,0 +1,9 @@
+	.data
+quoted:
+	.long	"%ebx"
+	.long	"%rdx"
+
+	.intel_syntax noprefix
+	.long	"eax"
+	.long	"cr0"
+	.long	"k0"


More information about the Binutils-cvs mailing list