[binutils-gdb] x86/Intel: fix "near ptr" / "far ptr" handling

Jan Beulich jbeulich@sourceware.org
Mon Dec 9 12:32:00 GMT 2019


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=164d49cb1c9b9f7e2914cf78f64f5f57ceb07dde

commit 164d49cb1c9b9f7e2914cf78f64f5f57ceb07dde
Author: Jan Beulich <jbeulich@suse.com>
Date:   Mon Dec 9 13:31:07 2019 +0100

    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).

Diff:
---
 gas/ChangeLog                     | 8 ++++++++
 gas/config/tc-i386-intel.c        | 9 ++++++---
 gas/testsuite/gas/i386/intelbad.l | 4 ++++
 gas/testsuite/gas/i386/intelbad.s | 6 ++++++
 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]



More information about the Binutils-cvs mailing list