diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86WinEHState.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86WinEHState.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86WinEHState.cpp b/llvm/lib/Target/X86/X86WinEHState.cpp index 19f574ad746..ccec7743b3b 100644 --- a/llvm/lib/Target/X86/X86WinEHState.cpp +++ b/llvm/lib/Target/X86/X86WinEHState.cpp @@ -179,6 +179,8 @@ bool WinEHStatePass::runOnFunction(Function &F) { WinEHFuncInfo &FuncInfo = *(MMI ? &MMI->getWinEHFuncInfo(&F) : FuncInfoPtr.get()); + FuncInfo.EHRegNode = RegNode; + switch (Personality) { default: llvm_unreachable("unexpected personality function"); case EHPersonality::MSVC_CXX: @@ -494,9 +496,12 @@ void WinEHStatePass::addCXXStateStoresToFunclet(Value *ParentRegNode, // Insert calls to llvm.x86.seh.restoreframe at catchret destinations. if (auto *CR = dyn_cast<CatchReturnInst>(BB.getTerminator())) { - //llvm::errs() << "BB: " << BB << '\n'; - //llvm::errs() << "CR->getSuccessor(): " << *CR->getSuccessor() << '\n'; - IRBuilder<> Builder(CR->getSuccessor()->begin()); + Instruction *Start = CR->getSuccessor()->begin(); + assert(!isa<PHINode>(Start) && + "winehprepare failed to demote phi after catchret"); + if (match(Start, m_Intrinsic<Intrinsic::x86_seh_restoreframe>())) + continue; + IRBuilder<> Builder(Start); Builder.CreateCall(RestoreFrame, {}); } } |