[llvm] r322004 - [mips] Improve diagnostics for instruction mapping

Aleksandar Beserminji via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 8 08:25:41 PST 2018


Author: abeserminji
Date: Mon Jan  8 08:25:40 2018
New Revision: 322004

URL: http://llvm.org/viewvc/llvm-project?rev=322004&view=rev
Log:
[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


Added:
    llvm/trunk/test/TableGen/RelTest.td
Modified:
    llvm/trunk/utils/TableGen/CodeGenMapTable.cpp

Added: llvm/trunk/test/TableGen/RelTest.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/RelTest.td?rev=322004&view=auto
==============================================================================
--- llvm/trunk/test/TableGen/RelTest.td (added)
+++ llvm/trunk/test/TableGen/RelTest.td Mon Jan  8 08:25:40 2018
@@ -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;

Modified: llvm/trunk/utils/TableGen/CodeGenMapTable.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenMapTable.cpp?rev=322004&r1=322003&r2=322004&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CodeGenMapTable.cpp (original)
+++ llvm/trunk/utils/TableGen/CodeGenMapTable.cpp Mon Jan  8 08:25:40 2018
@@ -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);
     }
 




More information about the llvm-commits mailing list