From: Jan Beulich Date: Mon, 7 Jun 2021 10:03:32 +0000 (+0200) Subject: x86: make symbol quotation check consistent in i386_att_operand() X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9d299bea8cca3bfd91a3c7a47510c52a9e829858;p=binutils-gdb.git x86: make symbol quotation check consistent in i386_att_operand() When d02603dc201f ("Allow symbol and label names to be enclosed in double quotes") added the check for a leading double quote to i386_att_operand(), it missed a second similar check after having found a segment override. To avoid the two checks going out of sync again, introduce an inline helper. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 008027b1fc1..b5686eed778 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2021-06-07 Jan Beulich + + * config/tc-i386.c (starts_memory_operand): New. + (i386_att_operand): Use it. + * testsuite/gas/i386/quoted.s, testsuite/gas/i386/quoted.d: New. + * testsuite/gas/i386/i386.exp: Run new test. + 2021-06-07 Jan Beulich * config/tc-i386.c (i386_att_operand): Flip checking for '*' and diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 0fe439eddd5..063383c8dcd 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -11368,6 +11368,14 @@ maybe_adjust_templates (void) return 1; } +static INLINE bool starts_memory_operand (char c) +{ + return is_digit_char (c) + || is_identifier_char (c) + || c == '"' + || c == '('; +} + /* Parse OPERAND_STRING into the i386_insn structure I. Returns zero on error. */ @@ -11422,9 +11430,7 @@ i386_att_operand (char *operand_string) i.jumpabsolute = true; } - if (!is_digit_char (*op_string) - && !is_identifier_char (*op_string) - && *op_string != '(') + if (!starts_memory_operand (*op_string)) { as_bad (_("bad memory operand `%s'"), op_string); return 0; @@ -11474,10 +11480,7 @@ i386_att_operand (char *operand_string) /* If it is a RC or SAE immediate, do nothing. */ ; } - else if (is_digit_char (*op_string) - || is_identifier_char (*op_string) - || *op_string == '"' - || *op_string == '(') + else if (starts_memory_operand (*op_string)) { /* This is a memory reference of some sort. */ char *base_string; diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index efcccafc034..001c5f90adb 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -96,6 +96,7 @@ if [gas_32_check] then { run_dump_test "equ" run_list_test "equ-bad" run_dump_test "divide" + run_dump_test "quoted" run_dump_test "padlock" run_dump_test "crx" run_list_test "cr-err" "" diff --git a/gas/testsuite/gas/i386/quoted.d b/gas/testsuite/gas/i386/quoted.d new file mode 100644 index 00000000000..704329db1f9 --- /dev/null +++ b/gas/testsuite/gas/i386/quoted.d @@ -0,0 +1,16 @@ +#objdump: -drw +#name: i386 quoted symbols + +.*: +file format .* + +Disassembly of section .text: + +0+ : +[ ]*[a-f0-9]+:[ ]*a1 00 00 00 00[ ]+mov 0x0,%eax [a-f0-9]+: (R_386_|dir)32 x\(y\) +[ ]*[a-f0-9]+:[ ]*8b 80 00 00 00 00[ ]+mov 0x0\(%eax\),%eax [a-f0-9]+: (R_386_|dir)32 x\(y\) +[ ]*[a-f0-9]+:[ ]*26 a1 00 00 00 00[ ]+mov %es:0x0,%eax [a-f0-9]+: (R_386_|dir)32 x\(y\) +[ ]*[a-f0-9]+:[ ]*26 8b 80 00 00 00 00[ ]+mov %es:0x0\(%eax\),%eax [a-f0-9]+: (R_386_|dir)32 x\(y\) +[ ]*[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\) +#pass diff --git a/gas/testsuite/gas/i386/quoted.s b/gas/testsuite/gas/i386/quoted.s new file mode 100644 index 00000000000..3bbeedfa0bc --- /dev/null +++ b/gas/testsuite/gas/i386/quoted.s @@ -0,0 +1,10 @@ + .text +quoted: + mov "x(y)", %eax + mov "x(y)"(%eax), %eax + mov %es:"x(y)", %eax + mov %es:"x(y)"(%eax), %eax + + call *"x(y)" + call *%es:"x(y)" + call %es:*"x(y)"