x86: restrict prefix use with .insn VEX/XOP/EVEX
authorJan Beulich <jbeulich@suse.com>
Fri, 8 Sep 2023 06:45:11 +0000 (08:45 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 8 Sep 2023 06:45:11 +0000 (08:45 +0200)
Avoid triggering the respective abort() in output_insn().

gas/config/tc-i386.c

index 00abfc78264ca79ed9d67ef340cb6a63cea3b002..ecf886cfee949959497284772983e0c840e285a4 100644 (file)
@@ -10806,6 +10806,29 @@ s_insn (int dummy ATTRIBUTE_UNUSED)
   if (line > end && i.vec_encoding == vex_encoding_default)
     i.vec_encoding = evex ? vex_encoding_evex : vex_encoding_vex;
 
+  if (i.vec_encoding != vex_encoding_default)
+    {
+      /* Only address size and segment override prefixes are permitted with
+         VEX/XOP/EVEX encodings.  */
+      const unsigned char *p = i.prefix;
+
+      for (j = 0; j < ARRAY_SIZE (i.prefix); ++j, ++p)
+       {
+         if (!*p)
+           continue;
+
+         switch (j)
+           {
+           case SEG_PREFIX:
+           case ADDR_PREFIX:
+             break;
+           default:
+                 as_bad (_("illegal prefix used with VEX/XOP/EVEX"));
+                 goto bad;
+           }
+       }
+    }
+
   if (line > end && *line == '.')
     {
       /* Length specifier (VEX.L, XOP.L, EVEX.L'L).  */