diff options
| author | Owen Anderson <resistor@mac.com> | 2015-03-02 05:25:09 +0000 |
|---|---|---|
| committer | Owen Anderson <resistor@mac.com> | 2015-03-02 05:25:09 +0000 |
| commit | 576a9a2728505d81849e3a15cdbc70d398fb95c6 (patch) | |
| tree | 316403f09b819c8df5a9d0d714616ff85e943d5b /llvm/lib | |
| parent | 91bdf0765000295c18ba87b244bab3c412d07310 (diff) | |
| download | bcm5719-llvm-576a9a2728505d81849e3a15cdbc70d398fb95c6.tar.gz bcm5719-llvm-576a9a2728505d81849e3a15cdbc70d398fb95c6.zip | |
Teach the LLParser to fail gracefully when it encounters an invalid label name.
Previous it would either assert in +Asserts, or crash in -Asserts. Found by fuzzing LLParser.
llvm-svn: 230935
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index d50da69529c..de566b6cdfc 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -2270,13 +2270,13 @@ bool LLParser::PerFunctionState::SetInstName(int NameID, /// forward reference record if needed. BasicBlock *LLParser::PerFunctionState::GetBB(const std::string &Name, LocTy Loc) { - return cast_or_null<BasicBlock>(GetVal(Name, - Type::getLabelTy(F.getContext()), Loc)); + return dyn_cast_or_null<BasicBlock>(GetVal(Name, + Type::getLabelTy(F.getContext()), Loc)); } BasicBlock *LLParser::PerFunctionState::GetBB(unsigned ID, LocTy Loc) { - return cast_or_null<BasicBlock>(GetVal(ID, - Type::getLabelTy(F.getContext()), Loc)); + return dyn_cast_or_null<BasicBlock>(GetVal(ID, + Type::getLabelTy(F.getContext()), Loc)); } /// DefineBB - Define the specified basic block, which is either named or @@ -4299,7 +4299,9 @@ bool LLParser::ParseBasicBlock(PerFunctionState &PFS) { } BasicBlock *BB = PFS.DefineBB(Name, NameLoc); - if (!BB) return true; + if (!BB) + return Error(NameLoc, + "unable to create block named '" + Name + "'"); std::string NameStr; |

