summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86WinEHState.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/X86/X86WinEHState.cpp')
-rw-r--r--llvm/lib/Target/X86/X86WinEHState.cpp11
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, {});
}
}
OpenPOWER on IntegriCloud