[1/2] x86: don't recognize quoted symbol names as registers or operators
Checks
Commit Message
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
@@ -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);
@@ -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)
{
@@ -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"
@@ -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
@@ -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"
@@ -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
@@ -0,0 +1,9 @@
+ .data
+quoted:
+ .long "%ebx"
+ .long "%rdx"
+
+ .intel_syntax noprefix
+ .long "eax"
+ .long "cr0"
+ .long "k0"