From 0bc0eef71c09ddc0c7ef73a0dc54a7875c965c03 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 15 Aug 2015 02:46:08 +0000 Subject: [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 --- llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp') diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 06935f7..b379e59 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -3847,12 +3847,18 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) { break; } case bitc::FUNC_CODE_INST_CATCHRET: { // CATCHRET: [bb#] - if (Record.size() != 1) + if (Record.size() != 1 && Record.size() != 3) return error("Invalid record"); - BasicBlock *BB = getBasicBlock(Record[0]); + unsigned Idx = 0; + BasicBlock *BB = getBasicBlock(Record[Idx++]); if (!BB) return error("Invalid record"); - I = CatchReturnInst::Create(BB); + Value *RetVal = nullptr; + if (Record.size() == 3 && + getValueTypePair(Record, Idx, NextValueNo, RetVal)) + return error("Invalid record"); + + I = CatchReturnInst::Create(BB, RetVal); InstructionList.push_back(I); break; } -- cgit v1.1