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 /lib/CodeGen/CodeGenFunction.h | |
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
Diffstat (limited to 'lib/CodeGen/CodeGenFunction.h')
-rw-r--r-- | lib/CodeGen/CodeGenFunction.h | 22 |
1 files changed, 22 insertions, 0 deletions
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); |