[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
Fri Aug 8 14:40:29 PDT 2014


On Wed, Aug 6, 2014 at 3:54 PM, Reid Kleckner <rnk at google.com> wrote:
> Here's an O0 .ll file that breaks llc if you run opt -O2 on it, but passes
> if you run llc:
> $ llc t.ll  # succeeds
> $ opt -O2 t.ll -o - | llc -o t.s
> Assertion failed: DISubprogram(Scope).describes(MF->getFunction()), file
> ..\lib\CodeGen\LexicalScopes.cpp, line 179

Haven't had any luck getting this to fail... any ideas? I can
side-by-side debug it with you next week, if it comes to that...

>
>
>
>
> On Wed, Aug 6, 2014 at 1:53 PM, Reid Kleckner <rnk at google.com> wrote:
>>
>> Here's an unreduced .ii file with a -cc1 invocation.  I haven't scrubbed
>> out the bits of the command line that are specific to my machine yet.
>>
>>
>> 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