[1/2] x86: don't recognize quoted symbol names as registers or operators

Message ID 4735d366-fe31-0092-2edc-d166184b8567@suse.com
State Accepted
Headers
Series x86: don't recognize quoted symbol names as registers or operators |

Checks

Context Check Description
snail/binutils-gdb-check success Github commit url

Commit Message

Jan Beulich May 5, 2023, 12:51 p.m. UTC
  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.
---
If desired, the i386_parse_name() could of course be restricted to
Intel syntax only. But
  

Patch

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -13868,6 +13868,13 @@  i386_parse_name (char *name, expressionS
   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);
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -169,6 +169,10 @@  operatorT i386_operator (const char *nam
       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)
       {
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -105,6 +105,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"
--- 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
--- 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"
--- /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
--- /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"