From a1b1ae0acad4a5e85177fb5795703ea0d0ff55e8 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 15 Aug 2015 03:21:08 +0000 Subject: [PATCH] [MS ABI] Switch catchpad/cleanuppad to use tokens git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@245153 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGCleanup.cpp | 14 ++++++-------- lib/CodeGen/CGException.cpp | 8 ++++---- lib/CodeGen/MicrosoftCXXABI.cpp | 19 ++++++++++++------- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/lib/CodeGen/CGCleanup.cpp b/lib/CodeGen/CGCleanup.cpp index 5666a689af..e53793d489 100644 --- a/lib/CodeGen/CGCleanup.cpp +++ b/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/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index 7f4d1c01a7..d4c52ff87c 100644 --- a/lib/CodeGen/CGException.cpp +++ b/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/lib/CodeGen/MicrosoftCXXABI.cpp b/lib/CodeGen/MicrosoftCXXABI.cpp index e62bbae466..c1a00d6068 100644 --- a/lib/CodeGen/MicrosoftCXXABI.cpp +++ b/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(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(NormalCleanup); + CGF.EHStack.pushCleanup(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(CatchPadBB->getFirstNonPHI()); CPI->setArgOperand(1, var.getObjectAddress(CGF)); } - CGF.EHStack.pushCleanup(NormalCleanup); + CGF.EHStack.pushCleanup(NormalCleanup, CPI); CGF.EmitAutoVarCleanups(var); } -- 2.40.0