diff options
-rw-r--r-- | llvm/test/TableGen/RelTest.td | 40 | ||||
-rw-r--r-- | llvm/utils/TableGen/CodeGenMapTable.cpp | 7 |
2 files changed, 46 insertions, 1 deletions
diff --git a/llvm/test/TableGen/RelTest.td b/llvm/test/TableGen/RelTest.td new file mode 100644 index 00000000000..dc8b4e559f1 --- /dev/null +++ b/llvm/test/TableGen/RelTest.td @@ -0,0 +1,40 @@ +// RUN: not llvm-tblgen -gen-instr-info -I %p/../../include %s 2>&1 | FileCheck %s + +// This test verifies that TableGen is displaying an error when mapped instruction +// does not contain a field listed under RowFields. + +include "llvm/Target/Target.td" + +class SimpleReg<string n> : Register<n> { + let Namespace = "Simple"; +} +def R0 : SimpleReg<"r0">; +def SimpleRegClass : RegisterClass<"Simple",[i32],0,(add R0)>; +def SimpleInstrInfo : InstrInfo; + +def SimpleTarget : Target { + let InstructionSet = SimpleInstrInfo; +} + +class SimpleRel; + +def REL_DEF : InstrMapping { + let FilterClass = "SimpleRel"; + let RowFields = ["BaseName"]; + let ColFields = ["Col"]; + let KeyCol = ["KeyCol"]; + let ValueCols = [["ValCol"]]; +} + +class INSTR_DEF : Instruction { + let Namespace = "Simple"; + let OutOperandList = (outs); + let InOperandList = (ins); + string Basename = ""; + string Col = ""; +} + +def SimpleInstr : SimpleRel, INSTR_DEF; + +// CHECK: error: No value "BaseName" found in "SimpleInstr" instruction description. +// CHECK: def SimpleInstr : SimpleRel, INSTR_DEF; diff --git a/llvm/utils/TableGen/CodeGenMapTable.cpp b/llvm/utils/TableGen/CodeGenMapTable.cpp index 43348b622a7..e5b0426cdcc 100644 --- a/llvm/utils/TableGen/CodeGenMapTable.cpp +++ b/llvm/utils/TableGen/CodeGenMapTable.cpp @@ -243,7 +243,12 @@ void MapTableEmitter::buildRowInstrMap() { std::vector<Init*> KeyValue; ListInit *RowFields = InstrMapDesc.getRowFields(); for (Init *RowField : RowFields->getValues()) { - Init *CurInstrVal = CurInstr->getValue(RowField)->getValue(); + RecordVal *RecVal = CurInstr->getValue(RowField); + if (RecVal == nullptr) + PrintFatalError(CurInstr->getLoc(), "No value " + + RowField->getAsString() + " found in \"" + + CurInstr->getName() + "\" instruction description."); + Init *CurInstrVal = RecVal->getValue(); KeyValue.push_back(CurInstrVal); } |