x86: make symbol quotation check consistent in i386_att_operand()
When d02603dc20
("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.
This commit is contained in:
parent
c8d541e2e7
commit
9d299bea8c
5 changed files with 44 additions and 7 deletions
|
@ -1,3 +1,10 @@
|
|||
2021-06-07 Jan Beulich <jbeulich@suse.com>
|
||||
|
||||
* 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 <jbeulich@suse.com>
|
||||
|
||||
* config/tc-i386.c (i386_att_operand): Flip checking for '*' and
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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" ""
|
||||
|
|
16
gas/testsuite/gas/i386/quoted.d
Normal file
16
gas/testsuite/gas/i386/quoted.d
Normal file
|
@ -0,0 +1,16 @@
|
|||
#objdump: -drw
|
||||
#name: i386 quoted symbols
|
||||
|
||||
.*: +file format .*
|
||||
|
||||
Disassembly of section .text:
|
||||
|
||||
0+ <quoted>:
|
||||
[ ]*[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
|
10
gas/testsuite/gas/i386/quoted.s
Normal file
10
gas/testsuite/gas/i386/quoted.s
Normal file
|
@ -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)"
|
Loading…
Add table
Reference in a new issue