PowerPC instruction operand flag validation
authorAlan Modra <amodra@gmail.com>
Tue, 6 Nov 2018 02:53:20 +0000 (13:23 +1030)
committerAlan Modra <amodra@gmail.com>
Tue, 6 Nov 2018 10:47:28 +0000 (21:17 +1030)
This adds another check that might have saved me a little time
recently if it had been present.

* config/tc-ppc.c (insn_validate): Check that optional operands
are not followed by non-optional operands.

gas/ChangeLog
gas/config/tc-ppc.c

index ffff8210d78535872e5f90256c52c0fbd3c9629f..2773d92ba07ecad20c2bcd4ebcd26491d9d813bd 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-06  Alan Modra  <amodra@gmail.com>
+
+       * config/tc-ppc.c (insn_validate): Check that optional operands
+       are not followed by non-optional operands.
+
 2018-11-06  Jan Beulich  <jbeulich@suse.com>
 
        * testsuite/gas/i386/evex-wig.s: Add vpbroadcastd cases.
index d587a50ca7b5a95afb06cf47188ad3db834aefba..694c47ad1ffc3e81fcb72e99d122365dfccc94ba 100644 (file)
@@ -1514,6 +1514,7 @@ insn_validate (const struct powerpc_opcode *op)
   /* The operands must not overlap the opcode or each other.  */
   for (o = op->operands; *o; ++o)
     {
+      bfd_boolean optional = FALSE;
       if (*o >= num_powerpc_operands)
         {
          as_bad (_("operand index error for %s"), op->name);
@@ -1538,6 +1539,14 @@ insn_validate (const struct powerpc_opcode *op)
                }
              omask |= mask;
            }
+         if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0)
+           optional = TRUE;
+         else if (optional)
+           {
+             as_bad (_("non-optional operand %d follows optional operand in %s"),
+                     (int) (o - op->operands), op->name);
+             return TRUE;
+           }
         }
     }
   return FALSE;