From 95b25773a76b1fa20a8ff76cfbd630ccbc76cfb2 Mon Sep 17 00:00:00 2001 From: Joseph Tremoulet Date: Wed, 7 Oct 2015 17:16:25 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249569 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 5 +++-- lib/CodeGen/WinEHPrepare.cpp | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index ed96742db7c..9e315194c98 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -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()]; diff --git a/lib/CodeGen/WinEHPrepare.cpp b/lib/CodeGen/WinEHPrepare.cpp index 86b511cfb67..3f930c892e2 100644 --- a/lib/CodeGen/WinEHPrepare.cpp +++ b/lib/CodeGen/WinEHPrepare.cpp @@ -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(Pad)) { - const BasicBlock *Handler = Catch->getNormalDest(); + const BasicBlock *PadBlock = Catch->getParent(); uint32_t TypeToken = static_cast( cast(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; -- 2.34.1