x86: permit parenthesized expressions again as addressing scale factor

The description of e68c3d59acd0 ("x86: better respect quotes in
parse_operands()") wrongly states:

"In i386_att_operand(), which needs adjustment to remain in sync, besides
 respecting double quotes now, also change the logic such that we don't
 count parentheses anymore: Finding any opening or closing parenthesis or
 any double quote means we're done, because the subsequent parsing code
 wouldn't accept (extra) instances of these anyway."

I didn't pay attention to the possibility of the scale factor being
specified as an expression, which may contain parentheses. Thanks to
Martin for pointing this out. Restore prior behavior or matching
parentheses (backwards), while giving the variable a more suitable name.
Note that this simple and immediate fix is not ging to be enough: This
expression could itself involve quoted symbols. However, to address this
backwards parsing needs to be done away with altogether here (such that
parentheses which are part of such a quoted symbol name can also
properly be accounted for), which is going to be a more intrusive
change.
This commit is contained in:
Jan Beulich
2021-06-15 07:57:11 +02:00
parent 93df3340fd
commit cc0f96357e
5 changed files with 26 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2021-06-15 Jan Beulich <jbeulich@suse.com>
* config/tc-i386.c (i386_att_operand): Re-introduce (now
properly named) parens_not_balanced.
* testsuite/gas/i386/sib.s: Add more cases.
* testsuite/gas/i386/sib.d, testsuite/gas/i386/sib-intel.d:
Adjust expectations.
2021-06-14 Jan Beulich <jbeulich@suse.com>
* read.c (emit_expr_with_reloc): Fold three as_warn().

View File

@ -11566,15 +11566,19 @@ i386_att_operand (char *operand_string)
if (*base_string == ')')
{
char *temp_string;
unsigned int parens_not_balanced = 1;
/* We've already checked that the number of left & right ()'s are
equal, so this loop will not be infinite. */
do
{
base_string--;
if (*base_string == ')')
parens_not_balanced++;
if (*base_string == '(')
parens_not_balanced--;
}
while (*base_string != '(' && *base_string != ')'
&& *base_string != '"');
while (parens_not_balanced && *base_string != '"');
temp_string = base_string;

View File

@ -30,6 +30,10 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 8b 04 64 mov eax,DWORD PTR \[esp\+eiz\*2\]
[ ]*[a-f0-9]+: 8b 04 a4 mov eax,DWORD PTR \[esp\+eiz\*4\]
[ ]*[a-f0-9]+: 8b 04 e4 mov eax,DWORD PTR \[esp\+eiz\*8\]
[ ]*[a-f0-9]+: 8b 04 00 mov eax,DWORD PTR \[eax\+eax\*1\]
[ ]*[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 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\]

View File

@ -29,6 +29,10 @@ Disassembly of section .text:
[ ]*[a-f0-9]+: 8b 04 64 mov \(%esp,%eiz,2\),%eax
[ ]*[a-f0-9]+: 8b 04 a4 mov \(%esp,%eiz,4\),%eax
[ ]*[a-f0-9]+: 8b 04 e4 mov \(%esp,%eiz,8\),%eax
[ ]*[a-f0-9]+: 8b 04 00 mov \(%eax,%eax,1\),%eax
[ ]*[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 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

View File

@ -26,6 +26,10 @@ foo:
mov (%esp,%eiz,2),%eax
mov (%esp,%eiz,4),%eax
mov (%esp,%eiz,8),%eax
mov (%eax, %eax, (1 << 0)), %eax
mov (%eax, %eax, (1 << 1)), %eax
mov (%eax, %eax, (1 << 2)), %eax
mov (%eax, %eax, (1 << 3)), %eax
.intel_syntax noprefix
mov eax,DWORD PTR [eiz*1-30]
mov eax,DWORD PTR [eiz*2-30]