From: Anders Carlsson Date: Sat, 7 Feb 2009 22:53:43 +0000 (+0000) Subject: Add plumbing for the cleanup stack. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6ccc47698d0311ddabf32fa0f6db8e4f09ac96f8;p=clang Add plumbing for the cleanup stack. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64043 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index f5a802f0b7..4ba4d600f8 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -512,3 +512,12 @@ llvm::Value* CodeGenFunction::EmitVAListRef(const Expr* E) { } return EmitLValue(E).getAddress(); } + +llvm::BasicBlock *CodeGenFunction::CreateCleanupBlock() +{ + llvm::BasicBlock *CleanupBlock = createBasicBlock("cleanup"); + + CleanupEntries.push_back(CleanupEntry(CleanupBlock)); + + return CleanupBlock; +} diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h index 9d8d3a3f4a..4ff3badd99 100644 --- a/lib/CodeGen/CodeGenFunction.h +++ b/lib/CodeGen/CodeGenFunction.h @@ -128,6 +128,10 @@ 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(); + private: /// LabelIDs - Track arbitrary ids assigned to labels for use in /// implementing the GCC address-of-label extension and indirect @@ -206,6 +210,24 @@ private: /// label. void EmitStackUpdate(const LabelStmt &S); + struct CleanupEntry { + /// CleanupBlock - The block of code that does the actual cleanup. + llvm::BasicBlock *CleanupBlock; + + /// Blocks - Basic blocks that were emitted in the current cleanup scope. + std::vector Blocks; + + /// BranchFixups - Branch instructions to basic blocks that haven't been + /// inserted into the current function yet. + std::vector BranchFixups; + + explicit CleanupEntry(llvm::BasicBlock *cb) + : CleanupBlock(cb) {} + }; + + /// CleanupEntries - Stack of cleanup entries. + llvm::SmallVector CleanupEntries; + public: CodeGenFunction(CodeGenModule &cgm);