]> granicus.if.org Git - llvm/commitdiff
[TableGen] Fix crash when using HwModes in CodeEmitterGen
authorJames Molloy <jmolloy@google.com>
Wed, 9 Oct 2019 09:15:34 +0000 (09:15 +0000)
committerJames Molloy <jmolloy@google.com>
Wed, 9 Oct 2019 09:15:34 +0000 (09:15 +0000)
When an instruction has an encoding definition for only a subset of
the available HwModes, ensure we just avoid generating an encoding
rather than crash.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374150 91177308-0d34-0410-b5e6-96231b3b80d8

test/TableGen/HwModeEncodeDecode.td
utils/TableGen/CodeEmitterGen.cpp

index b76d85646519324d45064f36712adc7ebf8fd954..1c9b86ff26a75550b804773efed51d6d13f35328 100644 (file)
@@ -56,6 +56,15 @@ def bar: Instruction {
   let Inst{1-0} = 0b10;
   let AsmString = "bar  $factor";
 }
+
+def baz : Instruction {
+  let InOperandList = (ins i32imm:$factor);
+  bits<32> Inst;
+  let EncodingInfos = EncodingByHwMode<
+    [ModeB], [fooTypeEncA]
+  >;
+  let AsmString = "foo  $factor";
+}
 }
 
 // DECODER-LABEL: DecoderTable_ModeA32[] =
index b021d08881fb4f6b7561045b534d7bee3fb26838..42f69cb253d2132cc0735063b3159a3ba83f85b8 100644 (file)
@@ -367,7 +367,8 @@ void CodeEmitterGen::emitInstructionBaseValues(
     if (const RecordVal *RV = R->getValue("EncodingInfos")) {
       if (auto *DI = dyn_cast_or_null<DefInit>(RV->getValue())) {
         EncodingInfoByHwMode EBM(DI->getDef(), HWM);
-        EncodingDef = EBM.get(HwMode);
+        if (EBM.hasMode(HwMode))
+          EncodingDef = EBM.get(HwMode);
       }
     }
     BitsInit *BI = EncodingDef->getValueAsBitsInit("Inst");