This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: PATCH: PR gas/3712: i386 assembler accepts invalid assembly code


On Wed, Dec 13, 2006 at 10:45:25AM -0600, rajagopal, dwarak wrote:
> Hi,
> 
> > +	      switch (t->operands)
> > +		{
> > +		case 4:
> > +		  overlap3 = i.types[3] & operand_types[3];
> 
> You also have to set overlap2 as it is not set. 
> 	overlap2 = i.types[2] & operand_types[2];

Please check out this patch.

Thanks.


H.J.
----
gas/

2006-12-13  H.J. Lu  <hongjiu.lu@intel.com>

	PR gas/3712
	* config/tc-i386.c (match_template): Use MAX_OPERANDS for the
	number of operands. Issue an error if MAX_OPERANDS != 4. Add
	the 4th operand check.

gas/testsuite/

2006-12-13  H.J. Lu  <hongjiu.lu@intel.com>

	PR gas/3712
	* gas/i386/inval.s: Add invalid insertq.
	* gas/i386/x86-64-inval.s: Likewise.

	* gas/i386/inval.l: Updated.
	* gas/i386/x86-64-inval.l: Likewise.

--- gas/config/tc-i386.c.op	2006-11-08 11:56:02.000000000 -0800
+++ gas/config/tc-i386.c	2006-12-13 09:16:03.000000000 -0800
@@ -2568,12 +2568,16 @@ match_template ()
 {
   /* Points to template once we've found it.  */
   const template *t;
-  unsigned int overlap0, overlap1, overlap2;
+  unsigned int overlap0, overlap1, overlap2, overlap3;
   unsigned int found_reverse_match;
   int suffix_check;
-  unsigned int operand_types [3];
+  unsigned int operand_types [MAX_OPERANDS];
   int addr_prefix_disp;
 
+#if MAX_OPERANDS != 4
+# error "MAX_OPERANDS must be 4."
+#endif
+
 #define MATCH(overlap, given, template)				\
   ((overlap & ~JumpAbsolute)					\
    && (((given) & (BaseIndex | JumpAbsolute))			\
@@ -2590,10 +2594,12 @@ match_template ()
   overlap0 = 0;
   overlap1 = 0;
   overlap2 = 0;
+  overlap3 = 0;
   found_reverse_match = 0;
   operand_types [0] = 0;
   operand_types [1] = 0;
   operand_types [2] = 0;
+  operand_types [3] = 0;
   addr_prefix_disp = -1;
   suffix_check = (i.suffix == BYTE_MNEM_SUFFIX
 		  ? No_bSuf
@@ -2625,6 +2631,7 @@ match_template ()
       operand_types [0] = t->operand_types [0];
       operand_types [1] = t->operand_types [1];
       operand_types [2] = t->operand_types [2];
+      operand_types [3] = t->operand_types [3];
 
       /* In general, don't allow 64-bit operands in 32-bit mode.  */
       if (i.suffix == QWORD_MNEM_SUFFIX
@@ -2670,7 +2677,7 @@ match_template ()
 	      break;
 	    }
 
-	    for (j = 0; j < 3; j++)
+	    for (j = 0; j < MAX_OPERANDS; j++)
 	      {
 		/* There should be only one Disp operand.  */
 		if ((operand_types[j] & DispOff))
@@ -2692,6 +2699,7 @@ match_template ()
 	  break;
 	case 2:
 	case 3:
+	case 4:
 	  overlap1 = i.types[1] & operand_types[1];
 	  if (!MATCH (overlap0, i.types[0], operand_types[0])
 	      || !MATCH (overlap1, i.types[1], operand_types[1])
@@ -2726,23 +2734,42 @@ match_template ()
 		 we've found.  */
 	      found_reverse_match = t->opcode_modifier & (D | FloatDR);
 	    }
-	  /* Found a forward 2 operand match here.  */
-	  else if (t->operands == 3)
+	  else
 	    {
-	      /* Here we make use of the fact that there are no
-		 reverse match 3 operand instructions, and all 3
-		 operand instructions only need to be checked for
-		 register consistency between operands 2 and 3.  */
-	      overlap2 = i.types[2] & operand_types[2];
-	      if (!MATCH (overlap2, i.types[2], operand_types[2])
-		  || !CONSISTENT_REGISTER_MATCH (overlap1, i.types[1],
-						 operand_types[1],
-						 overlap2, i.types[2],
-						 operand_types[2]))
+	      /* Found a forward 2 operand match here.  */
+	      if (t->operands > 2)
+		overlap2 = i.types[2] & operand_types[2];
+	      if (t->operands > 3)
+		overlap3 = i.types[3] & operand_types[3];
 
-		continue;
+	      switch (t->operands)
+		{
+		case 4:
+		  if (!MATCH (overlap3, i.types[3], operand_types[3])
+		      || !CONSISTENT_REGISTER_MATCH (overlap2,
+						     i.types[2],
+						     operand_types[2],
+						     overlap3,
+						     i.types[3],
+						     operand_types[3]))
+		    continue;
+		case 3:
+		  /* Here we make use of the fact that there are no
+		     reverse match 3 operand instructions, and all 3
+		     operand instructions only need to be checked for
+		     register consistency between operands 2 and 3.  */
+		  if (!MATCH (overlap2, i.types[2], operand_types[2])
+		      || !CONSISTENT_REGISTER_MATCH (overlap1,
+						     i.types[1],
+						     operand_types[1],
+						     overlap2,
+						     i.types[2],
+						     operand_types[2]))
+		    continue;
+		  break;
+		}
 	    }
-	  /* Found either forward/reverse 2 or 3 operand match here:
+	  /* Found either forward/reverse 2, 3 or 4 operand match here:
 	     slip through to break.  */
 	}
       if (t->cpu_flags & ~cpu_arch_flags)
--- gas/testsuite/gas/i386/inval.l.op	2006-04-18 10:52:37.000000000 -0700
+++ gas/testsuite/gas/i386/inval.l	2006-12-13 09:04:52.000000000 -0800
@@ -46,6 +46,7 @@
 .*:47: Error: .*
 .*:48: Error: .*
 .*:49: Error: .*
+.*:50: Error: .*
 GAS LISTING .*
 
 
@@ -98,3 +99,4 @@ GAS LISTING .*
   47 [ 	]*	fcompll	28\(%ebp\)
   48 [ 	]*	fldlw	\(%eax\)
   49 [ 	]*	movl	\$%ebx,%eax
+  50 [ 	]*	insertq	\$4,\$2,%xmm2,%ebx
--- gas/testsuite/gas/i386/inval.s.op	2006-04-18 10:52:37.000000000 -0700
+++ gas/testsuite/gas/i386/inval.s	2006-12-13 09:04:52.000000000 -0800
@@ -47,3 +47,4 @@ foo:	jaw	foo
 	fcompll	28(%ebp)
 	fldlw	(%eax)
 	movl	$%ebx,%eax
+	insertq	$4,$2,%xmm2,%ebx
--- gas/testsuite/gas/i386/x86-64-inval.l.op	2004-11-25 00:42:54.000000000 -0800
+++ gas/testsuite/gas/i386/x86-64-inval.l	2006-12-13 09:04:52.000000000 -0800
@@ -48,6 +48,7 @@
 .*:49: Error: .*
 .*:50: Error: .*
 .*:51: Error: .*
+.*:52: Error: .*
 GAS LISTING .*
 
 
@@ -102,3 +103,4 @@ GAS LISTING .*
   49 [ 	]*pushfl		# can't have 32-bit stack operands
   50 [ 	]*popfl		# can't have 32-bit stack operands
   51 [ 	]*retl		# can't have 32-bit stack operands
+  52 [ 	]*insertq \$4,\$2,%xmm2,%ebx # The last operand must be XMM register.
--- gas/testsuite/gas/i386/x86-64-inval.s.op	2004-11-25 00:42:54.000000000 -0800
+++ gas/testsuite/gas/i386/x86-64-inval.s	2006-12-13 09:04:52.000000000 -0800
@@ -49,3 +49,4 @@ foo:	jcxz foo	# No prefix exists to sele
         pushfl		# can't have 32-bit stack operands
 	popfl		# can't have 32-bit stack operands
 	retl		# can't have 32-bit stack operands
+	insertq $4,$2,%xmm2,%ebx # The last operand must be XMM register.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]