diff options
author | Anders Carlsson <andersca@mac.com> | 2009-02-07 22:53:43 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-02-07 22:53:43 +0000 |
commit | 6ccc47698d0311ddabf32fa0f6db8e4f09ac96f8 (patch) | |
tree | 459dcc26b98e35328aaac56cbcd4ed6b3e7fde0d | |
parent | 7a9bb52171f962d51ab13c1e012d2236feb9558d (diff) |
Add plumbing for the cleanup stack.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@64043 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CodeGenFunction.cpp | 9 | ||||
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 22 |
2 files changed, 31 insertions, 0 deletions
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<llvm::BasicBlock *> Blocks; + + /// BranchFixups - Branch instructions to basic blocks that haven't been + /// inserted into the current function yet. + std::vector<llvm::BranchInst*> BranchFixups; + + explicit CleanupEntry(llvm::BasicBlock *cb) + : CleanupBlock(cb) {} + }; + + /// CleanupEntries - Stack of cleanup entries. + llvm::SmallVector<CleanupEntry, 8> CleanupEntries; + public: CodeGenFunction(CodeGenModule &cgm); |