r225090 - DebugInfo: Provide a less subtle way to set the debug location of simple ret instructions

Eric Christopher echristo at gmail.com
Mon Jan 5 15:29:02 PST 2015


On Fri Jan 02 2015 at 2:12:40 PM David Blaikie <dblaikie at gmail.com> wrote:

> Author: dblaikie
> Date: Fri Jan  2 16:07:26 2015
> New Revision: 225090
>
> URL: http://llvm.org/viewvc/llvm-project?rev=225090&view=rev
> Log:
> DebugInfo: Provide a less subtle way to set the debug location of simple
> ret instructions
>
> un-XFAILing the test XFAIL'd in r225086 after it regressed in r225083.
>
> Modified:
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>     cfe/trunk/lib/CodeGen/CGDebugInfo.h
>     cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>     cfe/trunk/lib/CodeGen/CodeGenFunction.h
>     cfe/trunk/test/CodeGen/debug-info-line3.c
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CGDebugInfo.cpp?rev=225090&r1=225089&r2=225090&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Fri Jan  2 16:07:26 2015
> @@ -75,6 +75,15 @@ ApplyDebugLocation::ApplyDebugLocation(C
>    }
>  }
>
> +ApplyDebugLocation::ApplyDebugLocation(CodeGenFunction &CGF,
> llvm::DebugLoc Loc)
> +    : CGF(CGF) {
> +  if (CGF.getDebugInfo()) {
> +    OriginalLocation = CGF.Builder.getCurrentDebugLocation();
> +    if (!Loc.isUnknown())
> +      CGF.Builder.SetCurrentDebugLocation(Loc);
> +  }
> +}
> +
>  ApplyDebugLocation::~ApplyDebugLocation() {
>    // Query CGF so the location isn't overwritten when location updates are
>    // temporarily disabled (for C++ default function arguments)
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CGDebugInfo.h?rev=225090&r1=225089&r2=225090&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.h (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.h Fri Jan  2 16:07:26 2015
> @@ -454,6 +454,7 @@ public:
>    ApplyDebugLocation(CodeGenFunction &CGF,
>                       SourceLocation TemporaryLocation = SourceLocation(),
>                       bool ForceColumnInfo = false);
> +  ApplyDebugLocation(CodeGenFunction &CGF, llvm::DebugLoc Loc);
>    ~ApplyDebugLocation();
>  };
>
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CodeGenFunction.cpp?rev=225090&r1=225089&r2=225090&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Fri Jan  2 16:07:26 2015
> @@ -158,7 +158,7 @@ TypeEvaluationKind CodeGenFunction::getE
>    }
>  }
>
> -void CodeGenFunction::EmitReturnBlock() {
> +llvm::DebugLoc CodeGenFunction::EmitReturnBlock() {
>

Update the block documentation for the function?

-eric


>    // For cleanliness, we try to avoid emitting the return block for
>    // simple cases.
>    llvm::BasicBlock *CurBB = Builder.GetInsertBlock();
> @@ -173,7 +173,7 @@ void CodeGenFunction::EmitReturnBlock()
>        delete ReturnBlock.getBlock();
>      } else
>        EmitBlock(ReturnBlock.getBlock());
> -    return;
> +    return llvm::DebugLoc();
>    }
>
>    // Otherwise, if the return block is the target of a single direct
> @@ -184,15 +184,13 @@ void CodeGenFunction::EmitReturnBlock()
>        dyn_cast<llvm::BranchInst>(*ReturnBlock.getBlock()->user_begin());
>      if (BI && BI->isUnconditional() &&
>          BI->getSuccessor(0) == ReturnBlock.getBlock()) {
> -      // Reset insertion point, including debug location, and delete the
> -      // branch.  This is really subtle and only works because the next
> change
> -      // in location will hit the caching in CGDebugInfo::EmitLocation
> and not
> -      // override this.
> -      Builder.SetCurrentDebugLocation(BI->getDebugLoc());
> +      // Record/return the DebugLoc of the simple 'return' expression to
> be used
> +      // later by the actual 'ret' instruction.
> +      llvm::DebugLoc Loc = BI->getDebugLoc();
>        Builder.SetInsertPoint(BI->getParent());
>        BI->eraseFromParent();
>        delete ReturnBlock.getBlock();
> -      return;
> +      return Loc;
>      }
>    }
>
> @@ -201,6 +199,7 @@ void CodeGenFunction::EmitReturnBlock()
>    // region.end for now.
>
>    EmitBlock(ReturnBlock.getBlock());
> +  return llvm::DebugLoc();
>  }
>
>  static void EmitIfUsed(CodeGenFunction &CGF, llvm::BasicBlock *BB) {
> @@ -254,16 +253,18 @@ void CodeGenFunction::FinishFunction(Sou
>    }
>
>    // Emit function epilog (to return).
> -  EmitReturnBlock();
> +  llvm::DebugLoc Loc = EmitReturnBlock();
>
>    if (ShouldInstrumentFunction())
>      EmitFunctionInstrumentation("__cyg_profile_func_exit");
>
>    // Emit debug descriptor for function end.
> -  if (CGDebugInfo *DI = getDebugInfo()) {
> +  if (CGDebugInfo *DI = getDebugInfo())
>      DI->EmitFunctionEnd(Builder);
> -  }
>
> +  // Reset the debug location to that of the simple 'return' expression,
> if any
> +  // rather than that of the end of the function's scope '}'.
> +  ApplyDebugLocation AL(*this, Loc);
>    EmitFunctionEpilog(*CurFnInfo, EmitRetDbgLoc, EndLoc);
>    EmitEndEHSpec(CurCodeDecl);
>
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/
> CodeGenFunction.h?rev=225090&r1=225089&r2=225090&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Fri Jan  2 16:07:26 2015
> @@ -1262,7 +1262,7 @@ public:
>
>    /// EmitReturnBlock - Emit the unified return block, trying to avoid its
>    /// emission when possible.
> -  void EmitReturnBlock();
> +  llvm::DebugLoc EmitReturnBlock();
>
>    /// FinishFunction - Complete IR generation of the current function. It
> is
>    /// legal to call this function even if there is no current insertion
> point.
>
> Modified: cfe/trunk/test/CodeGen/debug-info-line3.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> CodeGen/debug-info-line3.c?rev=225090&r1=225089&r2=225090&view=diff
> ============================================================
> ==================
> --- cfe/trunk/test/CodeGen/debug-info-line3.c (original)
> +++ cfe/trunk/test/CodeGen/debug-info-line3.c Fri Jan  2 16:07:26 2015
> @@ -1,10 +1,5 @@
>  // RUN: %clang_cc1 -g -S -emit-llvm %s -o - | FileCheck %s
>
> -// Temporarily XFAIL while investigating regression. (other improvements
> seem
> -// more important to keep rather than reverting them in favor of
> preserving
> -// this)
> -// XFAIL: *
> -
>  void func(char c, char* d)
>  {
>    *d = c + 1;
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150105/25d0f6ee/attachment.html>


More information about the cfe-commits mailing list