diff options
| author | David Majnemer <david.majnemer@gmail.com> | 2015-08-15 02:46:08 +0000 |
|---|---|---|
| committer | David Majnemer <david.majnemer@gmail.com> | 2015-08-15 02:46:08 +0000 |
| commit | 0bc0eef71c09ddc0c7ef73a0dc54a7875c965c03 (patch) | |
| tree | a785179c274e965ce43e8f3a83f13ffd05b5e1f6 /llvm/lib/AsmParser | |
| parent | 5567bafe93d8dfce39c4f9fa909165ef9ff0c30f (diff) | |
| download | bcm5719-llvm-0bc0eef71c09ddc0c7ef73a0dc54a7875c965c03.tar.gz bcm5719-llvm-0bc0eef71c09ddc0c7ef73a0dc54a7875c965c03.zip | |
[IR] Give catchret an optional 'return value' operand
Some personality routines require funclet exit points to be clearly
marked, this is done by producing a token at the funclet pad and
consuming it at the corresponding ret instruction. CleanupReturnInst
already had a spot for this operand but CatchReturnInst did not.
Other personality routines don't need to use this which is why it has
been made optional.
llvm-svn: 245149
Diffstat (limited to 'llvm/lib/AsmParser')
| -rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index f098babb9f4..83bc33d0e6c 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -5027,13 +5027,24 @@ bool LLParser::ParseCleanupRet(Instruction *&Inst, PerFunctionState &PFS) { } /// ParseCatchRet -/// ::= 'catchret' TypeAndValue +/// ::= 'catchret' ('void' | TypeAndValue) 'to' TypeAndValue bool LLParser::ParseCatchRet(Instruction *&Inst, PerFunctionState &PFS) { + Type *RetTy = nullptr; + Value *RetVal = nullptr; + + if (ParseType(RetTy, /*AllowVoid=*/true)) + return true; + + if (!RetTy->isVoidTy()) + if (ParseValue(RetTy, RetVal, PFS)) + return true; + BasicBlock *BB; - if (ParseTypeAndBasicBlock(BB, PFS)) + if (ParseToken(lltok::kw_to, "expected 'to' in catchret") || + ParseTypeAndBasicBlock(BB, PFS)) return true; - Inst = CatchReturnInst::Create(BB); + Inst = CatchReturnInst::Create(BB, RetVal); return false; } |

