summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandar Beserminji <Aleksandar.Beserminji@mips.com>2018-01-08 16:25:40 +0000
committerAleksandar Beserminji <Aleksandar.Beserminji@mips.com>2018-01-08 16:25:40 +0000
commitf02ad15ff1dd84c73958c002966e3b61f8539f18 (patch)
treee1d014b31dd2d9a34d97ff003b3569c99611da06
parent6e2d03d4103d1b2032fc18343f8b13568eaefddb (diff)
downloadbcm5719-llvm-f02ad15ff1dd84c73958c002966e3b61f8539f18.tar.gz
bcm5719-llvm-f02ad15ff1dd84c73958c002966e3b61f8539f18.zip
[mips] Improve diagnostics for instruction mapping
This patch improves diagnostic for case when mapped instruction does not contain a field listed under RowFields. Differential Revision: https://reviews.llvm.org/D41778 llvm-svn: 322004
-rw-r--r--llvm/test/TableGen/RelTest.td40
-rw-r--r--llvm/utils/TableGen/CodeGenMapTable.cpp7
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);
}
OpenPOWER on IntegriCloud