ArtificialLocation maybe instead of BuiltinLocation? -eric
On Wed, Jul 17, 2013 at 5:28 PM, Adrian Prantl <[email protected]> wrote: > Author: adrian > Date: Wed Jul 17 19:28:02 2013 > New Revision: 186552 > > URL: http://llvm.org/viewvc/llvm-project?rev=186552&view=rev > Log: > Replace llvm::DIBuilder::DisableDebugLocations() with two RAII interfaces > inspired by CodegenFunction::LexicalScope. > - NoLocation temporarily turns off debug locations altogether. > This is useful for emitting instructions that should be > counted towards the function prologue. > - BuiltinLocation temporarily switches to an artificial debug location > that has a valid scope, but no line information. This is useful when > emitting compiler-generated helper functions that have no source > location associated with them. > > Modified: > cfe/trunk/lib/CodeGen/CGBlocks.cpp > cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > cfe/trunk/lib/CodeGen/CGDebugInfo.h > > Modified: cfe/trunk/lib/CodeGen/CGBlocks.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBlocks.cpp?rev=186552&r1=186551&r2=186552&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGBlocks.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGBlocks.cpp Wed Jul 17 19:28:02 2013 > @@ -1164,9 +1164,8 @@ CodeGenFunction::GenerateBlockFunction(G > Alloca->setAlignment(Align); > // Set the DebugLocation to empty, so the store is recognized as a > // frame setup instruction by llvm::DwarfDebug::beginFunction(). > - Builder.DisableDebugLocations(); > + NoLocation NL(*this, Builder); > Builder.CreateAlignedStore(BlockPointer, Alloca, Align); > - Builder.EnableDebugLocations(); > BlockPointerDbgLoc = Alloca; > } > > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=186552&r1=186551&r2=186552&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Jul 17 19:28:02 2013 > @@ -51,6 +51,44 @@ CGDebugInfo::~CGDebugInfo() { > "Region stack mismatch, stack not empty!"); > } > > + > +NoLocation::NoLocation(CodeGenFunction &CGF, CGBuilderTy &B) > + : DI(CGF.getDebugInfo()), Builder(B) { > + if (DI) { > + SavedLoc = DI->getLocation(); > + DI->CurLoc = SourceLocation(); > + Builder.SetCurrentDebugLocation(llvm::DebugLoc()); > + } > +} > + > +NoLocation::~NoLocation() { > + if (DI) { > + assert(Builder.getCurrentDebugLocation().isUnknown()); > + DI->CurLoc = SavedLoc; > + } > +} > + > +BuiltinLocation::BuiltinLocation(CodeGenFunction &CGF, CGBuilderTy &B) > + : DI(CGF.getDebugInfo()), Builder(B) { > + if (DI) { > + SavedLoc = DI->getLocation(); > + // Sync the Builder. > + DI->EmitLocation(Builder, SavedLoc); > + DI->CurLoc = SourceLocation(); > + // Construct a location that has a valid scope, but no line info. > + llvm::MDNode *Scope = DI->LexicalBlockStack.empty() ? > + DI->TheCU : DI->LexicalBlockStack.back(); > + Builder.SetCurrentDebugLocation(llvm::DebugLoc::get(0, 0, Scope)); > + } > +} > + > +BuiltinLocation::~BuiltinLocation() { > + if (DI) { > + assert(Builder.getCurrentDebugLocation().getLine() == 0); > + DI->CurLoc = SavedLoc; > + } > +} > + > void CGDebugInfo::setLocation(SourceLocation Loc) { > // If the new location isn't valid return. > if (Loc.isInvalid()) return; > @@ -2449,7 +2487,6 @@ void CGDebugInfo::EmitFunctionStart(Glob > /// previous location will be reused. > void CGDebugInfo::EmitLocation(CGBuilderTy &Builder, SourceLocation Loc, > bool ForceColumnInfo) { > - > // Update our current location > setLocation(Loc); > > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.h?rev=186552&r1=186551&r2=186552&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original) > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Wed Jul 17 19:28:02 2013 > @@ -47,6 +47,8 @@ namespace CodeGen { > /// and is responsible for emitting to llvm globals or pass directly to > /// the backend. > class CGDebugInfo { > + friend class NoLocation; > + friend class BuiltinLocation; > CodeGenModule &CGM; > const CodeGenOptions::DebugInfoKind DebugKind; > llvm::DIBuilder DBuilder; > @@ -387,6 +389,40 @@ private: > /// \param Force Assume DebugColumnInfo option is true. > unsigned getColumnNumber(SourceLocation Loc, bool Force=false); > }; > + > +/// 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 { > + SourceLocation SavedLoc; > + CGDebugInfo *DI; > + CGBuilderTy &Builder; > +public: > + NoLocation(CodeGenFunction &CGF, CGBuilderTy &B); > + /// ~NoLocation - Autorestore everything back to normal. > + ~NoLocation(); > +}; > + > +/// BuiltinLocation - An RAII object that temporarily switches to an > +/// artificial debug location that has a valid scope, but no line > +/// information. This is useful when emitting compiler-generated > +/// helper functions that have no source location associated with > +/// them. > +/// > +/// This is necessary because pasing an empty SourceLocation to > +/// CGDebugInfo::setLocation() will result in the last valid location > +/// being reused. > +class BuiltinLocation { > + SourceLocation SavedLoc; > + CGDebugInfo *DI; > + CGBuilderTy &Builder; > +public: > + BuiltinLocation(CodeGenFunction &CGF, CGBuilderTy &B); > + /// ~BuildinLocation - Autorestore everything back to normal. > + ~BuiltinLocation(); > +}; > + > + > } // namespace CodeGen > } // namespace clang > > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
