diff options
author | Eric Christopher <echristo@apple.com> | 2011-10-19 00:43:52 +0000 |
---|---|---|
committer | Eric Christopher <echristo@apple.com> | 2011-10-19 00:43:52 +0000 |
commit | a9d3497b5e7a2a1fff456737e647a69092839c2b (patch) | |
tree | cf401f57cc2ef97cb1e79ffd756e90b806af6152 /clang/lib | |
parent | a48f33f951fdda93793898765be01efaef12bfad (diff) | |
download | bcm5719-llvm-a9d3497b5e7a2a1fff456737e647a69092839c2b.tar.gz bcm5719-llvm-a9d3497b5e7a2a1fff456737e647a69092839c2b.zip |
Add a new subclass of RunCleanupScopes that also handles creating new
lexical blocks for debug info.
llvm-svn: 142466
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.h | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 157623da8fd..858962d337b 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -25,8 +25,10 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include "llvm/Support/ValueHandle.h" +#include "llvm/Support/Debug.h" #include "CodeGenModule.h" #include "CGBuilder.h" +#include "CGDebugInfo.h" #include "CGValue.h" namespace llvm { @@ -69,7 +71,6 @@ namespace clang { namespace CodeGen { class CodeGenTypes; - class CGDebugInfo; class CGFunctionInfo; class CGRecordLayout; class CGBlockInfo; @@ -767,7 +768,6 @@ public: /// \brief Enters a new scope for capturing cleanups, all of which /// will be executed once the scope is exited. class RunCleanupsScope { - CodeGenFunction& CGF; EHScopeStack::stable_iterator CleanupStackDepth; bool OldDidCallStackSave; bool PerformCleanup; @@ -775,10 +775,13 @@ public: RunCleanupsScope(const RunCleanupsScope &); // DO NOT IMPLEMENT RunCleanupsScope &operator=(const RunCleanupsScope &); // DO NOT IMPLEMENT + protected: + CodeGenFunction& CGF; + public: /// \brief Enter a new cleanup scope. explicit RunCleanupsScope(CodeGenFunction &CGF) - : CGF(CGF), PerformCleanup(true) + : PerformCleanup(true), CGF(CGF) { CleanupStackDepth = CGF.EHStack.stable_begin(); OldDidCallStackSave = CGF.DidCallStackSave; @@ -809,6 +812,41 @@ public: } }; + class LexicalScope: protected RunCleanupsScope { + SourceRange Range; + bool PopDebugStack; + + LexicalScope(const LexicalScope &); // DO NOT IMPLEMENT THESE + LexicalScope &operator=(const LexicalScope &); + + public: + /// \brief Enter a new cleanup scope. + explicit LexicalScope(CodeGenFunction &CGF, SourceRange Range) + : RunCleanupsScope(CGF), Range(Range), PopDebugStack(true) { + if (CGDebugInfo *DI = CGF.getDebugInfo()) + DI->EmitLexicalBlockStart(CGF.Builder, Range.getBegin()); + } + + /// \brief Exit this cleanup scope, emitting any accumulated + /// cleanups. + ~LexicalScope() { + if (PopDebugStack) { + CGDebugInfo *DI = CGF.getDebugInfo(); + if (DI) DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd()); + } + } + + /// \brief Force the emission of cleanups now, instead of waiting + /// until this object is destroyed. + void ForceCleanup() { + RunCleanupsScope::ForceCleanup(); + if (CGDebugInfo *DI = CGF.getDebugInfo()) { + DI->EmitLexicalBlockEnd(CGF.Builder, Range.getEnd()); + PopDebugStack = false; + } + } + }; + /// PopCleanupBlocks - Takes the old cleanup stack size and emits /// the cleanup blocks that have been added. |