summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGCleanup.cpp14
-rw-r--r--clang/lib/CodeGen/CGException.cpp8
-rw-r--r--clang/lib/CodeGen/MicrosoftCXXABI.cpp19
3 files changed, 22 insertions, 19 deletions
diff --git a/clang/lib/CodeGen/CGCleanup.cpp b/clang/lib/CodeGen/CGCleanup.cpp
index 5666a689af7..e53793d489b 100644
--- a/clang/lib/CodeGen/CGCleanup.cpp
+++ b/clang/lib/CodeGen/CGCleanup.cpp
@@ -900,14 +900,12 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough) {
CGBuilderTy::InsertPoint SavedIP = Builder.saveAndClearIP();
EmitBlock(EHEntry);
+ llvm::CleanupPadInst *CPI = nullptr;
llvm::BasicBlock *NextAction = getEHDispatchBlock(EHParent);
if (CGM.getCodeGenOpts().NewMSEH &&
- EHPersonality::get(*this).isMSVCPersonality()) {
- if (NextAction)
- Builder.CreateCleanupPad(VoidTy, NextAction);
- else
- Builder.CreateCleanupPad(VoidTy, {});
- }
+ EHPersonality::get(*this).isMSVCPersonality())
+ CPI = Builder.CreateCleanupPad(llvm::Type::getTokenTy(getLLVMContext()),
+ {});
// We only actually emit the cleanup code if the cleanup is either
// active or was used before it was deactivated.
@@ -917,8 +915,8 @@ void CodeGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough) {
EmitCleanup(*this, Fn, cleanupFlags, EHActiveFlag);
}
- if (CGM.getCodeGenOpts().NewMSEH && EHPersonality::get(*this).isMSVCPersonality())
- Builder.CreateCleanupRet(NextAction);
+ if (CPI)
+ Builder.CreateCleanupRet(NextAction, CPI);
else
Builder.CreateBr(NextAction);
diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp
index 7f4d1c01a75..d4c52ff87cf 100644
--- a/clang/lib/CodeGen/CGException.cpp
+++ b/clang/lib/CodeGen/CGException.cpp
@@ -887,11 +887,11 @@ static llvm::BasicBlock *emitMSVCCatchDispatchBlock(CodeGenFunction &CGF,
if (EHPersonality::get(CGF).isMSVCXXPersonality()) {
CGF.Builder.CreateCatchPad(
- CGF.VoidTy, Handler.Block, NextBlock,
- {TypeValue, llvm::Constant::getNullValue(CGF.VoidPtrTy)});
+ llvm::Type::getTokenTy(CGF.getLLVMContext()), Handler.Block,
+ NextBlock, {TypeValue, llvm::Constant::getNullValue(CGF.VoidPtrTy)});
} else {
- CGF.Builder.CreateCatchPad(CGF.VoidTy, Handler.Block, NextBlock,
- {TypeValue});
+ CGF.Builder.CreateCatchPad(llvm::Type::getTokenTy(CGF.getLLVMContext()),
+ Handler.Block, NextBlock, {TypeValue});
}
// Otherwise we need to emit and continue at that block.
diff --git a/clang/lib/CodeGen/MicrosoftCXXABI.cpp b/clang/lib/CodeGen/MicrosoftCXXABI.cpp
index e62bbae4666..c1a00d60689 100644
--- a/clang/lib/CodeGen/MicrosoftCXXABI.cpp
+++ b/clang/lib/CodeGen/MicrosoftCXXABI.cpp
@@ -852,11 +852,14 @@ void MicrosoftCXXABI::emitRethrow(CodeGenFunction &CGF, bool isNoReturn) {
namespace {
struct CallEndCatchMSVC : EHScopeStack::Cleanup {
- CallEndCatchMSVC() {}
+ llvm::CatchPadInst *CPI;
+
+ CallEndCatchMSVC(llvm::CatchPadInst *CPI) : CPI(CPI) {}
+
void Emit(CodeGenFunction &CGF, Flags flags) override {
if (CGF.CGM.getCodeGenOpts().NewMSEH) {
llvm::BasicBlock *BB = CGF.createBasicBlock("catchret.dest");
- CGF.Builder.CreateCatchRet(BB);
+ CGF.Builder.CreateCatchRet(BB, CPI);
CGF.EmitBlock(BB);
} else {
CGF.EmitNounwindRuntimeCall(
@@ -873,10 +876,15 @@ void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF,
VarDecl *CatchParam = S->getExceptionDecl();
llvm::Value *Exn = nullptr;
llvm::Function *BeginCatch = nullptr;
+ llvm::CatchPadInst *CPI = nullptr;
bool NewEH = CGF.CGM.getCodeGenOpts().NewMSEH;
if (!NewEH) {
Exn = CGF.getExceptionFromSlot();
BeginCatch = CGF.CGM.getIntrinsic(llvm::Intrinsic::eh_begincatch);
+ } else {
+ llvm::BasicBlock *CatchPadBB =
+ CGF.Builder.GetInsertBlock()->getSinglePredecessor();
+ CPI = cast<llvm::CatchPadInst>(CatchPadBB->getFirstNonPHI());
}
// If this is a catch-all or the catch parameter is unnamed, we don't need to
// emit an alloca to the object.
@@ -885,7 +893,7 @@ void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF,
llvm::Value *Args[2] = {Exn, llvm::Constant::getNullValue(CGF.Int8PtrTy)};
CGF.EmitNounwindRuntimeCall(BeginCatch, Args);
}
- CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalCleanup);
+ CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalCleanup, CPI);
return;
}
@@ -896,12 +904,9 @@ void MicrosoftCXXABI::emitBeginCatch(CodeGenFunction &CGF,
llvm::Value *Args[2] = {Exn, ParamAddr};
CGF.EmitNounwindRuntimeCall(BeginCatch, Args);
} else {
- llvm::BasicBlock *CatchPadBB =
- CGF.Builder.GetInsertBlock()->getSinglePredecessor();
- auto *CPI = cast<llvm::CatchPadInst>(CatchPadBB->getFirstNonPHI());
CPI->setArgOperand(1, var.getObjectAddress(CGF));
}
- CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalCleanup);
+ CGF.EHStack.pushCleanup<CallEndCatchMSVC>(NormalCleanup, CPI);
CGF.EmitAutoVarCleanups(var);
}
OpenPOWER on IntegriCloud