aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2019-12-09 13:31:07 +0100
committerJan Beulich <jbeulich@suse.com>2019-12-09 13:31:07 +0100
commit164d49cb1c9b9f7e2914cf78f64f5f57ceb07dde (patch)
tree571ed2970908cb24c1d784d62fec02de5fc24c10
parenta8f4f6b9bc2b1273cfa94fc1f21af7bcf13012d5 (diff)
downloadgdb-164d49cb1c9b9f7e2914cf78f64f5f57ceb07dde.zip
gdb-164d49cb1c9b9f7e2914cf78f64f5f57ceb07dde.tar.gz
gdb-164d49cb1c9b9f7e2914cf78f64f5f57ceb07dde.tar.bz2
x86/Intel: fix "near ptr" / "far ptr" handling
Commit dc2be329b950 ("i386: Only check suffix in instruction mnemonic") broke rejecting of these for floating point insns. Fix this by setting the "byte" operand attribute, which will now (again) cause an error. Furthermore the diagnostic for the "far ptr" case in general and for the "near ptr" case in the non-float cases became "invalid instruction suffix" instead of the intended "operand size mismatch". Fix this by also setting the "tbyte" operand attribute (no insn template accepts both byte and tbyte operands).
-rw-r--r--gas/ChangeLog8
-rw-r--r--gas/config/tc-i386-intel.c9
-rw-r--r--gas/testsuite/gas/i386/intelbad.l4
-rw-r--r--gas/testsuite/gas/i386/intelbad.s6
4 files changed, 24 insertions, 3 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 54ede43..f198b01 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,6 +1,14 @@
2019-12-09 Jan Beulich <jbeulich@suse.com>
* config/tc-i386-intel.c (i386_intel_operand): Set "byte"
+ attribute suffix instead of suffix for floating point insns when
+ handling O_near_ptr / O_far_ptr.
+ * testsuite/gas/i386/intelbad.s: Add FPU tests.
+ * testsuite/gas/i386/intelbad.l: Adjust expectations.
+
+2019-12-09 Jan Beulich <jbeulich@suse.com>
+
+ * config/tc-i386-intel.c (i386_intel_operand): Set "byte"
attribute suffix instead of suffix uniformly for insns not
possibly accepting "tbyte ptr" explicitly.
diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c
index 7d0a5b8d..8eb587b 100644
--- a/gas/config/tc-i386-intel.c
+++ b/gas/config/tc-i386-intel.c
@@ -718,9 +718,12 @@ i386_intel_operand (char *operand_string, int got_a_float)
case O_near_ptr:
if (current_templates->start->opcode_modifier.jump != JUMP
&& current_templates->start->opcode_modifier.jump != JUMP_DWORD)
- suffix = got_a_float /* so it will cause an error */
- ? BYTE_MNEM_SUFFIX
- : LONG_DOUBLE_MNEM_SUFFIX;
+ {
+ /* cause an error */
+ i.types[this_operand].bitfield.byte = 1;
+ i.types[this_operand].bitfield.tbyte = 1;
+ suffix = i.suffix;
+ }
break;
default:
diff --git a/gas/testsuite/gas/i386/intelbad.l b/gas/testsuite/gas/i386/intelbad.l
index 4dc0917..2080913 100644
--- a/gas/testsuite/gas/i386/intelbad.l
+++ b/gas/testsuite/gas/i386/intelbad.l
@@ -157,3 +157,7 @@
.*:176: Warning: .*
.*:177: Error: .*
.*:178: Error: .*
+.*:180: Error: .*
+.*:181: Error: .*
+.*:183: Error: .*
+.*:184: Error: .*
diff --git a/gas/testsuite/gas/i386/intelbad.s b/gas/testsuite/gas/i386/intelbad.s
index 93e1c44..afbb603 100644
--- a/gas/testsuite/gas/i386/intelbad.s
+++ b/gas/testsuite/gas/i386/intelbad.s
@@ -176,3 +176,9 @@ start:
lfs eax, dword ptr [eax]
lgs eax, qword ptr [eax]
lss eax, tbyte ptr [eax]
+
+ fld near ptr [ebx]
+ fst far ptr [ebx]
+
+ fild far ptr [ebx]
+ fist near ptr [ebx]