r186552 - Replace llvm::DIBuilder::DisableDebugLocations() with two RAII interfaces
Eric Christopher
echristo at gmail.com
Wed Jul 17 17:32:15 PDT 2013
ArtificialLocation maybe instead of BuiltinLocation?
-eric
On Wed, Jul 17, 2013 at 5:28 PM, Adrian Prantl <aprantl at apple.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list