[llvm] r214761 - Reapply "DebugInfo: Ensure that all debug location scope chains from instructions within a function, lead to the function itself."

David Blaikie dblaikie at gmail.com
Wed Aug 6 15:42:16 PDT 2014


Reverted in r214999 due to discussion with Reid on IRC about some
difficulties reproducing this.

Reid - if you could follow up with a source reproduction when you have
one, that'd be great... otherwise I'm not really sure where to go with
this. (I'm still investigating the Darwin failure, though)

On Wed, Aug 6, 2014 at 1:44 PM, Reid Kleckner <rnk at google.com> wrote:
> On Mon, Aug 4, 2014 at 12:30 PM, David Blaikie <dblaikie at gmail.com> wrote:
>>
>> Author: dblaikie
>> Date: Mon Aug  4 14:30:08 2014
>> New Revision: 214761
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=214761&view=rev
>> Log:
>> Reapply "DebugInfo: Ensure that all debug location scope chains from
>> instructions within a function, lead to the function itself."
>>
>> Originally reverted in r213432 with flakey failures on an ASan self-host
>> build. After reduction it seems to be the same issue fixed in r213805
>> (ArgPromo + DebugInfo: Handle updating debug info over multiple
>> applications of argument promotion) and r213952 (by having
>> LiveDebugVariables strip dbg_value intrinsics in functions that are not
>> described by debug info). Though I cannot explain why this failure was
>> flakey...
>>
>> Modified:
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>     llvm/trunk/lib/CodeGen/LexicalScopes.cpp
>>     llvm/trunk/lib/IR/DebugInfo.cpp
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=214761&r1=214760&r2=214761&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Mon Aug  4 14:30:08
>> 2014
>> @@ -796,8 +796,7 @@ void DwarfDebug::finishVariableDefinitio
>>    for (const auto &Var : ConcreteVariables) {
>>      DIE *VariableDie = Var->getDIE();
>>      // FIXME: There shouldn't be any variables without DIEs.
>> -    if (!VariableDie)
>> -      continue;
>> +    assert(VariableDie);
>>      // FIXME: Consider the time-space tradeoff of just storing the unit
>> pointer
>>      // in the ConcreteVariables list, rather than looking it up again
>> here.
>>      // DIE::getUnit isn't simple - it walks parent pointers, etc.
>>
>> Modified: llvm/trunk/lib/CodeGen/LexicalScopes.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LexicalScopes.cpp?rev=214761&r1=214760&r2=214761&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/LexicalScopes.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/LexicalScopes.cpp Mon Aug  4 14:30:08 2014
>> @@ -137,6 +137,8 @@ LexicalScope *LexicalScopes::findLexical
>>  /// getOrCreateLexicalScope - Find lexical scope for the given DebugLoc.
>> If
>>  /// not available then create new lexical scope.
>>  LexicalScope *LexicalScopes::getOrCreateLexicalScope(DebugLoc DL) {
>> +  if (DL.isUnknown())
>> +    return nullptr;
>>    MDNode *Scope = nullptr;
>>    MDNode *InlinedAt = nullptr;
>>    DL.getScopeAndInlinedAt(Scope, InlinedAt,
>> MF->getFunction()->getContext());
>> @@ -172,9 +174,12 @@ LexicalScope *LexicalScopes::getOrCreate
>>                                std::make_tuple(Parent,
>> DIDescriptor(Scope),
>>                                                nullptr, false)).first;
>>
>> -  if (!Parent && DIDescriptor(Scope).isSubprogram() &&
>> -      DISubprogram(Scope).describes(MF->getFunction()))
>> +  if (!Parent) {
>> +    assert(DIDescriptor(Scope).isSubprogram());
>> +    assert(DISubprogram(Scope).describes(MF->getFunction()));
>
>
> ^ This assertion is failing during a self-host on Windows that uses -gmlt.
> I'll post a .ii file soon.
>
>>
>> +    assert(!CurrentFnLexicalScope);
>>      CurrentFnLexicalScope = &I->second;
>> +  }
>>
>>    return &I->second;
>>  }
>>
>> Modified: llvm/trunk/lib/IR/DebugInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=214761&r1=214760&r2=214761&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
>> +++ llvm/trunk/lib/IR/DebugInfo.cpp Mon Aug  4 14:30:08 2014
>> @@ -560,6 +560,32 @@ bool DISubprogram::Verify() const {
>>    if (isLValueReference() && isRValueReference())
>>      return false;
>>
>> +  if (auto *F = getFunction()) {
>> +    LLVMContext &Ctxt = F->getContext();
>> +    for (auto &BB : *F) {
>> +      for (auto &I : BB) {
>> +        DebugLoc DL = I.getDebugLoc();
>> +        if (DL.isUnknown())
>> +          continue;
>> +
>> +        MDNode *Scope = nullptr;
>> +        MDNode *IA = nullptr;
>> +        // walk the inlined-at scopes
>> +        while (DL.getScopeAndInlinedAt(Scope, IA, F->getContext()), IA)
>> +          DL = DebugLoc::getFromDILocation(IA);
>> +        DL.getScopeAndInlinedAt(Scope, IA, Ctxt);
>> +        assert(!IA);
>> +        while (!DIDescriptor(Scope).isSubprogram()) {
>> +          DILexicalBlockFile D(Scope);
>> +          Scope = D.isLexicalBlockFile()
>> +                      ? D.getScope()
>> +                      :
>> DebugLoc::getFromDILexicalBlock(Scope).getScope(Ctxt);
>> +        }
>> +        if (!DISubprogram(Scope).describes(F))
>> +          return false;
>> +      }
>> +    }
>> +  }
>>    return DbgNode->getNumOperands() == 20;
>>  }
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>



More information about the llvm-commits mailing list