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

David Blaikie dblaikie at gmail.com
Sat Jan 17 18:49:51 PST 2015


On Mon, Jan 5, 2015 at 3:29 PM, Eric Christopher <echristo at gmail.com> wrote:

>
>
> 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?
>

Sure - little tricky to explain, but added some words in r226393


>
> -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/20150117/5b7897cb/attachment.html>


More information about the cfe-commits mailing list