aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2021-06-15 07:57:11 +0200
committerJan Beulich <jbeulich@suse.com>2021-06-15 07:57:11 +0200
commitcc0f96357e0b5bce4a1f02910cec2dd66e8990c5 (patch)
tree5acb7dbf985bd464e6c24e64ab02a49fd4fb4780
parent93df3340fd5ad32f784214fc125de71811da72ff (diff)
downloadgdb-cc0f96357e0b5bce4a1f02910cec2dd66e8990c5.zip
gdb-cc0f96357e0b5bce4a1f02910cec2dd66e8990c5.tar.gz
gdb-cc0f96357e0b5bce4a1f02910cec2dd66e8990c5.tar.bz2
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.
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-i386.c8
-rw-r--r--gas/testsuite/gas/i386/sib-intel.d4
-rw-r--r--gas/testsuite/gas/i386/sib.d4
-rw-r--r--gas/testsuite/gas/i386/sib.s4
5 files changed, 26 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index ecd0794..d766fd1 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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().
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index b3f9f31..8585380 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -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;
diff --git a/gas/testsuite/gas/i386/sib-intel.d b/gas/testsuite/gas/i386/sib-intel.d
index 27709eb..ccd2ea9 100644
--- a/gas/testsuite/gas/i386/sib-intel.d
+++ b/gas/testsuite/gas/i386/sib-intel.d
@@ -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\]
diff --git a/gas/testsuite/gas/i386/sib.d b/gas/testsuite/gas/i386/sib.d
index 0ece418..151935c 100644
--- a/gas/testsuite/gas/i386/sib.d
+++ b/gas/testsuite/gas/i386/sib.d
@@ -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
diff --git a/gas/testsuite/gas/i386/sib.s b/gas/testsuite/gas/i386/sib.s
index 430da42..c0e007f 100644
--- a/gas/testsuite/gas/i386/sib.s
+++ b/gas/testsuite/gas/i386/sib.s
@@ -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]