From: Anders Carlsson Date: Sun, 8 Feb 2009 03:22:36 +0000 (+0000) Subject: CleanupScope needs to push the cleanup block in its destructor X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6fc559136b8ef98bfb824a0fd49df385405f2879;p=clang CleanupScope needs to push the cleanup block in its destructor git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64068 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index 4b3ab2de19..e9bcfb51dc 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -517,13 +517,9 @@ llvm::Value* CodeGenFunction::EmitVAListRef(const Expr* E) { return EmitLValue(E).getAddress(); } -llvm::BasicBlock *CodeGenFunction::CreateCleanupBlock() +void CodeGenFunction::PushCleanupBlock(llvm::BasicBlock *CleanupBlock) { - llvm::BasicBlock *CleanupBlock = createBasicBlock("cleanup"); - CleanupEntries.push_back(CleanupEntry(CleanupBlock)); - - return CleanupBlock; } void CodeGenFunction::EmitCleanupBlocks(size_t OldCleanupStackSize) diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index b37cf7b919..9eae28ca2a 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -128,25 +128,27 @@ public: void EmitJumpThroughFinally(ObjCEHEntry *Entry, llvm::BasicBlock *Dest, bool ExecuteTryExit=true); - /// CreateCleanupBlock - Will push a new cleanup entry on the stack - /// and return a BasicBlock where cleanup instructions can be added - llvm::BasicBlock *CreateCleanupBlock(); + /// PushCleanupBlock - Push a new cleanup entry on the stack and set the + /// passed in block as the cleanup block. + void PushCleanupBlock(llvm::BasicBlock *CleanupBlock); /// CleanupScope - RAII object that will create a cleanup block and /// set the insert point to that block. When destructed, it sets the insert - /// point to the previous block. + /// point to the previous block and pushes a new cleanup entry on the stack. class CleanupScope { CodeGenFunction& CGF; llvm::BasicBlock *CurBB; + llvm::BasicBlock *CleanupBB; public: CleanupScope(CodeGenFunction &cgf) : CGF(cgf), CurBB(CGF.Builder.GetInsertBlock()) { - llvm::BasicBlock *FinallyBB = CGF.CreateCleanupBlock(); - CGF.Builder.SetInsertPoint(FinallyBB); + CleanupBB = CGF.createBasicBlock("cleanup"); + CGF.Builder.SetInsertPoint(CleanupBB); } ~CleanupScope() { + CGF.PushCleanupBlock(CleanupBB); CGF.Builder.SetInsertPoint(CurBB); } };