forked from OSchip/llvm-project
[TableGen][CodeEmitterGen] Do not crash on insufficient positional instruction operands.
Reviewed By: foad Differential Revision: https://reviews.llvm.org/D126288
This commit is contained in:
parent
3800b157d7
commit
eccbe6d122
|
@ -0,0 +1,30 @@
|
|||
// RUN: not llvm-tblgen -gen-emitter -I %p/../../include %s 2>&1 | FileCheck %s
|
||||
|
||||
// Check that TableGen doesn't crash on insufficient positional
|
||||
// instruction operands.
|
||||
|
||||
include "llvm/Target/Target.td"
|
||||
|
||||
def ArchInstrInfo : InstrInfo { }
|
||||
|
||||
def Arch : Target {
|
||||
let InstructionSet = ArchInstrInfo;
|
||||
}
|
||||
|
||||
def Reg : Register<"reg">;
|
||||
|
||||
def Regs : RegisterClass<"foo", [i32], 0, (add Reg)>;
|
||||
|
||||
def foo : Instruction {
|
||||
bits<3> rd;
|
||||
bits<3> rs;
|
||||
|
||||
bits<8> Inst;
|
||||
let Inst{1-0} = 0;
|
||||
let Inst{4-2} = rd;
|
||||
let Inst{7-5} = rs;
|
||||
|
||||
// CHECK: Too few operands in record foo (no match for variable rs)
|
||||
let OutOperandList = (outs Regs:$xd);
|
||||
let InOperandList = (ins);
|
||||
}
|
|
@ -22,6 +22,7 @@
|
|||
#include "llvm/ADT/StringExtras.h"
|
||||
#include "llvm/Support/Casting.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/TableGen/Error.h"
|
||||
#include "llvm/TableGen/Record.h"
|
||||
#include "llvm/TableGen/TableGenBackend.h"
|
||||
#include <cassert>
|
||||
|
@ -118,16 +119,16 @@ AddCodeToMergeInOperand(Record *R, BitsInit *BI, const std::string &VarName,
|
|||
(!NamedOpIndices.empty() && NamedOpIndices.count(
|
||||
CGI.Operands.getSubOperandNumber(NumberedOp).first)))) {
|
||||
++NumberedOp;
|
||||
|
||||
if (NumberedOp >= CGI.Operands.back().MIOperandNo +
|
||||
CGI.Operands.back().MINumOperands) {
|
||||
errs() << "Too few operands in record " << R->getName() <<
|
||||
" (no match for variable " << VarName << "):\n";
|
||||
errs() << *R;
|
||||
errs() << '\n';
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (NumberedOp >=
|
||||
CGI.Operands.back().MIOperandNo + CGI.Operands.back().MINumOperands) {
|
||||
std::string E;
|
||||
raw_string_ostream S(E);
|
||||
S << "Too few operands in record " << R->getName()
|
||||
<< " (no match for variable " << VarName << "):\n";
|
||||
S << *R;
|
||||
PrintFatalError(R, E);
|
||||
}
|
||||
|
||||
OpIdx = NumberedOp++;
|
||||
|
|
Loading…
Reference in New Issue