forked from OSchip/llvm-project
[WinEH] Update CoreCLR EH for catchpad MBBs
Summary: Set the pad MBB as a funclet entry for CoreCLR as well as MSVCCXX, and update state numbering to put the catchpad block rather than its normal successor into the unwind map. Reviewers: majnemer Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D13492 llvm-svn: 249569
This commit is contained in:
parent
b4908761f8
commit
bde46c5642
|
@ -1163,9 +1163,10 @@ void SelectionDAGBuilder::visitCatchPad(const CatchPadInst &I) {
|
|||
auto Pers = classifyEHPersonality(FuncInfo.Fn->getPersonalityFn());
|
||||
bool IsMSVCCXX = Pers == EHPersonality::MSVC_CXX;
|
||||
bool IsSEH = isAsynchronousEHPersonality(Pers);
|
||||
bool IsCoreCLR = Pers == EHPersonality::CoreCLR;
|
||||
MachineBasicBlock *CatchPadMBB = FuncInfo.MBB;
|
||||
// In MSVC C++, catchblocks are funclets and need prologues.
|
||||
if (IsMSVCCXX)
|
||||
// In MSVC C++ and CoreCLR, catchblocks are funclets and need prologues.
|
||||
if (IsMSVCCXX || IsCoreCLR)
|
||||
CatchPadMBB->setIsEHFuncletEntry();
|
||||
|
||||
MachineBasicBlock *NormalDestMBB = FuncInfo.MBBMap[I.getNormalDest()];
|
||||
|
|
|
@ -2928,11 +2928,11 @@ void llvm::calculateClrEHStateNumbers(const Function *Fn,
|
|||
// Preds of the endpad should get the parent state.
|
||||
PredState = ParentState;
|
||||
} else if (const CatchPadInst *Catch = dyn_cast<CatchPadInst>(Pad)) {
|
||||
const BasicBlock *Handler = Catch->getNormalDest();
|
||||
const BasicBlock *PadBlock = Catch->getParent();
|
||||
uint32_t TypeToken = static_cast<uint32_t>(
|
||||
cast<ConstantInt>(Catch->getArgOperand(0))->getZExtValue());
|
||||
int NewState = addClrEHHandler(FuncInfo, ParentState,
|
||||
ClrHandlerType::Catch, TypeToken, Handler);
|
||||
ClrHandlerType::Catch, TypeToken, PadBlock);
|
||||
FuncInfo.EHPadStateMap[Catch] = NewState;
|
||||
// Preds of the catch get its state
|
||||
PredState = NewState;
|
||||
|
|
Loading…
Reference in New Issue