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