aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenFunction.h
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-02-07 22:53:43 +0000
committerAnders Carlsson <andersca@mac.com>2009-02-07 22:53:43 +0000
commit6ccc47698d0311ddabf32fa0f6db8e4f09ac96f8 (patch)
tree459dcc26b98e35328aaac56cbcd4ed6b3e7fde0d /lib/CodeGen/CodeGenFunction.h
parent7a9bb52171f962d51ab13c1e012d2236feb9558d (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.h22
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);