x86: don't recognize quoted symbol names as registers or operators
authorJan Beulich <jbeulich@suse.com>
Tue, 23 May 2023 07:00:44 +0000 (09:00 +0200)
committerJan Beulich <jbeulich@suse.com>
Tue, 23 May 2023 07:00:44 +0000 (09:00 +0200)
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.

gas/config/tc-i386-intel.c
gas/config/tc-i386.c
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/quoted.d
gas/testsuite/gas/i386/quoted.s
gas/testsuite/gas/i386/quoted2.d [new file with mode: 0644]
gas/testsuite/gas/i386/quoted2.s [new file with mode: 0644]

index f758bc59765f75d57ec60159407af764c7de77cf..b5c97be234ab9b6fd050bd726c395685b59723d1 100644 (file)
@@ -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)
       {
index 1002c5f564cd3c00458281d9939284114193b421..1b1f5d63b6aceeb8a1bf9109da23ea4c09647940 100644 (file)
@@ -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);
index c098f2de533df2f752c87519bb3be0c9beb54cce..bce865c83d10c0bd0d9e8b2c4584b4406d7e96a6 100644 (file)
@@ -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"
index d5986b65ea8202c62f363a20ff2cf50997601190..b6341b0af8510be3ffc260524342738472be6375 100644 (file)
@@ -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
index 21ada4696103553ef2e210f8292980ab0f7c7b46..d1341ef5f3baf3b9a63459f1fd6d0a14a8b84519 100644 (file)
@@ -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 (file)
index 0000000..a1eb844
--- /dev/null
@@ -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 (file)
index 0000000..d13b14e
--- /dev/null
@@ -0,0 +1,9 @@
+       .data
+quoted:
+       .long   "%ebx"
+       .long   "%rdx"
+
+       .intel_syntax noprefix
+       .long   "eax"
+       .long   "cr0"
+       .long   "k0"