From: Jan Beulich Date: Tue, 23 May 2023 07:00:44 +0000 (+0200) Subject: x86: don't recognize quoted symbol names as registers or operators X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6acf9130909e5f531bb742939d402b40dee08304;p=binutils-gdb.git 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 --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"