[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
This commit is contained in:
David Majnemer
2015-08-15 02:46:08 +00:00
parent 5567bafe93
commit 0bc0eef71c
16 changed files with 148 additions and 64 deletions

View File

@@ -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;
}