diff options
Diffstat (limited to 'clang/lib/CodeGen/CGDebugInfo.h')
-rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.h | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.h b/clang/lib/CodeGen/CGDebugInfo.h index 274cbc4f365..9649e296160 100644 --- a/clang/lib/CodeGen/CGDebugInfo.h +++ b/clang/lib/CodeGen/CGDebugInfo.h @@ -448,16 +448,27 @@ private: } }; -class ApplyDebugLocation { +/// SaveAndRestoreLocation - An RAII object saves the current location +/// and automatically restores it to the original value. +class SaveAndRestoreLocation { protected: - llvm::DebugLoc OriginalLocation; - CodeGenFunction &CGF; + SourceLocation SavedLoc; + CGDebugInfo *DI; + CGBuilderTy &Builder; +public: + SaveAndRestoreLocation(CodeGenFunction &CGF, CGBuilderTy &B); + /// Autorestore everything back to normal. + ~SaveAndRestoreLocation(); +}; +/// NoLocation - An RAII object that temporarily disables debug +/// locations. This is useful for emitting instructions that should be +/// counted towards the function prologue. +class NoLocation : public SaveAndRestoreLocation { public: - ApplyDebugLocation(CodeGenFunction &CGF, - SourceLocation TemporaryLocation = SourceLocation(), - bool ForceColumnInfo = false); - ~ApplyDebugLocation(); + NoLocation(CodeGenFunction &CGF, CGBuilderTy &B); + /// Autorestore everything back to normal. + ~NoLocation(); }; /// ArtificialLocation - An RAII object that temporarily switches to @@ -471,9 +482,16 @@ public: /// This is necessary because passing an empty SourceLocation to /// CGDebugInfo::setLocation() will result in the last valid location /// being reused. -class ArtificialLocation : public ApplyDebugLocation { +class ArtificialLocation : public SaveAndRestoreLocation { public: - ArtificialLocation(CodeGenFunction &CGF); + ArtificialLocation(CodeGenFunction &CGF, CGBuilderTy &B); + + /// Set the current location to line 0, but within the current scope + /// (= the top of the LexicalBlockStack). + void Emit(); + + /// Autorestore everything back to normal. + ~ArtificialLocation(); }; |