diff options
author | Alexey Vishnyakov <vishnya@ispras.ru> | 2023-05-09 18:06:10 -0700 |
---|---|---|
committer | Craig Topper <craig.topper@sifive.com> | 2023-05-09 18:06:10 -0700 |
commit | 9c07aa75b961fa19875fddd1dcd0deaa57f82e9d (patch) | |
tree | adbaa312eed1095c8e97a56edc07180a5c48178f /llvm/utils/TableGen/CodeGenDAGPatterns.cpp | |
parent | e8ea7d2d788f2ce1a71978d69de2367ec6d2df11 (diff) | |
download | llvm-9c07aa75b961fa19875fddd1dcd0deaa57f82e9d.zip llvm-9c07aa75b961fa19875fddd1dcd0deaa57f82e9d.tar.gz llvm-9c07aa75b961fa19875fddd1dcd0deaa57f82e9d.tar.bz2 |
[TableGen] Fix null pointer dereferences in TreePattern::ParseTreePattern()
Bugs were found by Svace static analysis tool. Null pointers are
dereferenced right after error checking that does not return from
function.
Reviewed By: arsenm
Differential Revision: https://reviews.llvm.org/D147706
Diffstat (limited to 'llvm/utils/TableGen/CodeGenDAGPatterns.cpp')
-rw-r--r-- | llvm/utils/TableGen/CodeGenDAGPatterns.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp index 512358b..ed2eda8 100644 --- a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp @@ -2897,16 +2897,20 @@ TreePatternNodePtr TreePattern::ParseTreePattern(Init *TheInit, Init *II = BI->convertInitializerTo(IntRecTy::get(RK)); if (!II || !isa<IntInit>(II)) error("Bits value must be constants!"); - return ParseTreePattern(II, OpName); + return II ? ParseTreePattern(II, OpName) : nullptr; } DagInit *Dag = dyn_cast<DagInit>(TheInit); if (!Dag) { TheInit->print(errs()); error("Pattern has unexpected init kind!"); + return nullptr; } DefInit *OpDef = dyn_cast<DefInit>(Dag->getOperator()); - if (!OpDef) error("Pattern has unexpected operator type!"); + if (!OpDef) { + error("Pattern has unexpected operator type!"); + return nullptr; + } Record *Operator = OpDef->getDef(); if (Operator->isSubClassOf("ValueType")) { @@ -3480,7 +3484,8 @@ void CodeGenDAGPatterns::FindPatternInputsAndOutputs( DefInit *Val = dyn_cast<DefInit>(Dest->getLeafValue()); if (!Val || !Val->getDef()->isSubClassOf("Register")) I.error("implicitly defined value should be a register!"); - InstImpResults.push_back(Val->getDef()); + if (Val) + InstImpResults.push_back(Val->getDef()); } return; } |