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>
|
2021-06-07 Jan Beulich <jbeulich@suse.com>
|
||||||
|
|
||||||
* config/tc-i386.c (i386_att_operand): Flip checking for '*' and
|
* config/tc-i386.c (i386_att_operand): Flip checking for '*' and
|
||||||
|
|
|
@ -11368,6 +11368,14 @@ maybe_adjust_templates (void)
|
||||||
return 1;
|
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
|
/* Parse OPERAND_STRING into the i386_insn structure I. Returns zero
|
||||||
on error. */
|
on error. */
|
||||||
|
|
||||||
|
@ -11422,9 +11430,7 @@ i386_att_operand (char *operand_string)
|
||||||
i.jumpabsolute = true;
|
i.jumpabsolute = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_digit_char (*op_string)
|
if (!starts_memory_operand (*op_string))
|
||||||
&& !is_identifier_char (*op_string)
|
|
||||||
&& *op_string != '(')
|
|
||||||
{
|
{
|
||||||
as_bad (_("bad memory operand `%s'"), op_string);
|
as_bad (_("bad memory operand `%s'"), op_string);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -11474,10 +11480,7 @@ i386_att_operand (char *operand_string)
|
||||||
/* If it is a RC or SAE immediate, do nothing. */
|
/* If it is a RC or SAE immediate, do nothing. */
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
else if (is_digit_char (*op_string)
|
else if (starts_memory_operand (*op_string))
|
||||||
|| is_identifier_char (*op_string)
|
|
||||||
|| *op_string == '"'
|
|
||||||
|| *op_string == '(')
|
|
||||||
{
|
{
|
||||||
/* This is a memory reference of some sort. */
|
/* This is a memory reference of some sort. */
|
||||||
char *base_string;
|
char *base_string;
|
||||||
|
|
|
@ -96,6 +96,7 @@ if [gas_32_check] then {
|
||||||
run_dump_test "equ"
|
run_dump_test "equ"
|
||||||
run_list_test "equ-bad"
|
run_list_test "equ-bad"
|
||||||
run_dump_test "divide"
|
run_dump_test "divide"
|
||||||
|
run_dump_test "quoted"
|
||||||
run_dump_test "padlock"
|
run_dump_test "padlock"
|
||||||
run_dump_test "crx"
|
run_dump_test "crx"
|
||||||
run_list_test "cr-err" ""
|
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