From: Mike Stump Date: Thu, 10 Dec 2009 01:52:30 +0000 (+0000) Subject: Setup cleanup on eh edge out of the construction of the cleanup object X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5030a98e20e7501366cf50a7e8b92dc016b98bfb;p=clang Setup cleanup on eh edge out of the construction of the cleanup object during throw to deallocate the exception object. WIP. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91035 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index 87f4eb0f11..d61884ce02 100644 --- a/lib/CodeGen/CGException.cpp +++ b/lib/CodeGen/CGException.cpp @@ -146,27 +146,21 @@ static void CopyObject(CodeGenFunction &CGF, const Expr *E, llvm::Value *N) { CGF.EmitAggExpr(E, This, false); } else if (CXXConstructorDecl *CopyCtor = RD->getCopyConstructor(CGF.getContext(), 0)) { - // All temporaries end before we call __cxa_throw - // FIXME: Doesn't work well with eh31.C and PopCXXTemporary - // CodeGenFunction::CleanupScope TryScope(CGF); - { - // These actions are only on the exceptional edge. - if (0) { - // FIXME: Doesn't work well with eh31.C and PopCXXTemporary - CodeGenFunction::DelayedCleanupBlock Scope(CGF, true); - + llvm::BasicBlock *PrevLandingPad = CGF.getInvokeDest(); + if (CGF.Exceptions) { + CodeGenFunction::EHCleanupBlock Cleanup(CGF); llvm::Constant *FreeExceptionFn = getFreeExceptionFn(CGF); const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext()); llvm::Value *ExceptionPtr = CGF.Builder.CreateBitCast(N, Int8PtrTy); CGF.Builder.CreateCall(FreeExceptionFn, ExceptionPtr); - } } - + llvm::Value *Src = CGF.EmitLValue(E).getAddress(); + CGF.setInvokeDest(PrevLandingPad); llvm::BasicBlock *TerminateHandler = CGF.getTerminateHandler(); - llvm::BasicBlock *PrevLandingPad = CGF.getInvokeDest(); + PrevLandingPad = CGF.getInvokeDest(); CGF.setInvokeDest(TerminateHandler); // Stolen from EmitClassAggrMemberwiseCopy