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/ADT/StringExtras.h"
|
||||||
#include "llvm/Support/Casting.h"
|
#include "llvm/Support/Casting.h"
|
||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
|
#include "llvm/TableGen/Error.h"
|
||||||
#include "llvm/TableGen/Record.h"
|
#include "llvm/TableGen/Record.h"
|
||||||
#include "llvm/TableGen/TableGenBackend.h"
|
#include "llvm/TableGen/TableGenBackend.h"
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
@ -118,16 +119,16 @@ AddCodeToMergeInOperand(Record *R, BitsInit *BI, const std::string &VarName,
|
||||||
(!NamedOpIndices.empty() && NamedOpIndices.count(
|
(!NamedOpIndices.empty() && NamedOpIndices.count(
|
||||||
CGI.Operands.getSubOperandNumber(NumberedOp).first)))) {
|
CGI.Operands.getSubOperandNumber(NumberedOp).first)))) {
|
||||||
++NumberedOp;
|
++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++;
|
OpIdx = NumberedOp++;
|
||||||
|
|
Loading…
Reference in New Issue