From 2eac3da184459607a476ebb5dcebd6e0acf9fefa Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 6 Nov 2018 13:23:20 +1030 Subject: [PATCH] PowerPC instruction operand flag validation 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 | 5 +++++ gas/config/tc-ppc.c | 9 +++++++++ 2 files changed, 14 insertions(+) diff --git a/gas/ChangeLog b/gas/ChangeLog index ffff8210d7..2773d92ba0 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2018-11-06 Alan Modra + + * config/tc-ppc.c (insn_validate): Check that optional operands + are not followed by non-optional operands. + 2018-11-06 Jan Beulich * testsuite/gas/i386/evex-wig.s: Add vpbroadcastd cases. diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c index d587a50ca7..694c47ad1f 100644 --- a/gas/config/tc-ppc.c +++ b/gas/config/tc-ppc.c @@ -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;