x86/gas: support quoted address scale factor in AT&T syntax
An earlier attempt (e68c3d59acd0 ["x86: better respect quotes in parse_operands()"]) needed undoing (cc0f96357e0b ["x86: permit parenthesized expressions again as addressing scale factor"]) as far its effect here went. As indicated back then, the issue is the backwards scanning of the operand string to find the matching opening parenthesis. Switch to forward scanning, finding the last outermost unquoted opening parenthesis (which is the one matching the trailing closing one).
This commit is contained in:
parent
bb5cb85b46
commit
e87fb6a6d0
@ -11589,25 +11589,32 @@ i386_att_operand (char *operand_string)
|
||||
if (*base_string == ')')
|
||||
{
|
||||
char *temp_string;
|
||||
unsigned int parens_not_balanced = 1;
|
||||
unsigned int parens_not_balanced = 0;
|
||||
bool in_quotes = false;
|
||||
|
||||
/* We've already checked that the number of left & right ()'s are
|
||||
equal, so this loop will not be infinite. */
|
||||
do
|
||||
equal, and that there's a matching set of double quotes. */
|
||||
end_op = base_string;
|
||||
for (temp_string = op_string; temp_string < end_op; temp_string++)
|
||||
{
|
||||
base_string--;
|
||||
if (*base_string == ')')
|
||||
parens_not_balanced++;
|
||||
if (*base_string == '(')
|
||||
parens_not_balanced--;
|
||||
if (*temp_string == '\\' && temp_string[1] == '"')
|
||||
++temp_string;
|
||||
else if (*temp_string == '"')
|
||||
in_quotes = !in_quotes;
|
||||
else if (!in_quotes)
|
||||
{
|
||||
if (*temp_string == '(' && !parens_not_balanced++)
|
||||
base_string = temp_string;
|
||||
if (*temp_string == ')')
|
||||
--parens_not_balanced;
|
||||
}
|
||||
}
|
||||
while (parens_not_balanced && *base_string != '"');
|
||||
|
||||
temp_string = base_string;
|
||||
|
||||
/* Skip past '(' and whitespace. */
|
||||
if (*base_string == '(')
|
||||
++base_string;
|
||||
gas_assert (*base_string == '(');
|
||||
++base_string;
|
||||
if (is_space_char (*base_string))
|
||||
++base_string;
|
||||
|
||||
|
@ -34,6 +34,10 @@ Disassembly of section .text:
|
||||
[ ]*[a-f0-9]+: 8b 04 40 mov eax,DWORD PTR \[eax\+eax\*2\]
|
||||
[ ]*[a-f0-9]+: 8b 04 80 mov eax,DWORD PTR \[eax\+eax\*4\]
|
||||
[ ]*[a-f0-9]+: 8b 04 c0 mov eax,DWORD PTR \[eax\+eax\*8\]
|
||||
[ ]*[a-f0-9]+: 8b 14 08 mov edx,DWORD PTR \[eax\+ecx\*1\]
|
||||
[ ]*[a-f0-9]+: 8b 14 48 mov edx,DWORD PTR \[eax\+ecx\*2\]
|
||||
[ ]*[a-f0-9]+: 8b 14 88 mov edx,DWORD PTR \[eax\+ecx\*4\]
|
||||
[ ]*[a-f0-9]+: 8b 14 c8 mov edx,DWORD PTR \[eax\+ecx\*8\]
|
||||
[ ]*[a-f0-9]+: 8b 04 25 e2 ff ff ff mov eax,DWORD PTR \[eiz\*1-0x1e\]
|
||||
[ ]*[a-f0-9]+: 8b 04 65 e2 ff ff ff mov eax,DWORD PTR \[eiz\*2-0x1e\]
|
||||
[ ]*[a-f0-9]+: 8b 04 a5 e2 ff ff ff mov eax,DWORD PTR \[eiz\*4-0x1e\]
|
||||
|
@ -33,6 +33,10 @@ Disassembly of section .text:
|
||||
[ ]*[a-f0-9]+: 8b 04 40 mov \(%eax,%eax,2\),%eax
|
||||
[ ]*[a-f0-9]+: 8b 04 80 mov \(%eax,%eax,4\),%eax
|
||||
[ ]*[a-f0-9]+: 8b 04 c0 mov \(%eax,%eax,8\),%eax
|
||||
[ ]*[a-f0-9]+: 8b 14 08 mov \(%eax,%ecx,1\),%edx
|
||||
[ ]*[a-f0-9]+: 8b 14 48 mov \(%eax,%ecx,2\),%edx
|
||||
[ ]*[a-f0-9]+: 8b 14 88 mov \(%eax,%ecx,4\),%edx
|
||||
[ ]*[a-f0-9]+: 8b 14 c8 mov \(%eax,%ecx,8\),%edx
|
||||
[ ]*[a-f0-9]+: 8b 04 25 e2 ff ff ff mov -0x1e\(,%eiz,1\),%eax
|
||||
[ ]*[a-f0-9]+: 8b 04 65 e2 ff ff ff mov -0x1e\(,%eiz,2\),%eax
|
||||
[ ]*[a-f0-9]+: 8b 04 a5 e2 ff ff ff mov -0x1e\(,%eiz,4\),%eax
|
||||
|
@ -30,6 +30,14 @@ foo:
|
||||
mov (%eax, %eax, (1 << 1)), %eax
|
||||
mov (%eax, %eax, (1 << 2)), %eax
|
||||
mov (%eax, %eax, (1 << 3)), %eax
|
||||
.equ "scale(1)", 1
|
||||
mov (%eax, %ecx, "scale(1)"), %edx
|
||||
.equiv "scale[2]", 2
|
||||
mov (%eax, %ecx, "scale[2]"), %edx
|
||||
.eqv "scale{4}", 4
|
||||
mov (%eax, %ecx, "scale{4}"), %edx
|
||||
.set "scale<8>", 8
|
||||
mov (%eax, %ecx, "scale<8>"), %edx
|
||||
.intel_syntax noprefix
|
||||
mov eax,DWORD PTR [eiz*1-30]
|
||||
mov eax,DWORD PTR [eiz*2-30]
|
||||
|
Loading…
x
Reference in New Issue
Block a user