[llvm] r192749 - Make sure we're not attempting to construct a subprogram DIE

Eric Christopher echristo at gmail.com
Mon May 26 00:07:00 PDT 2014


Cool, thanks!

-eric

On Mon, May 26, 2014 at 12:00 AM, David Blaikie <dblaikie at gmail.com> wrote:
> Added test coverage for this issue in r209614.
>
> On Thu, Oct 17, 2013 at 7:02 PM, Eric Christopher <echristo at gmail.com> wrote:
>> For the record I've reverted this here in r192938 as it causes some
>> problems with function definitions in multiple TUs/CUs being
>> constructed twice. The resultant debug info isn't very good, but at
>> least isn't crashing the compiler for now. I'll need to think about a
>> solution for that.
>>
>> -eric
>>
>> On Tue, Oct 15, 2013 at 4:31 PM, Eric Christopher <echristo at gmail.com> wrote:
>>> Author: echristo
>>> Date: Tue Oct 15 18:31:38 2013
>>> New Revision: 192749
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=192749&view=rev
>>> Log:
>>> Make sure we're not attempting to construct a subprogram DIE
>>> twice and just look up the value. Fix the one case where
>>> we were trying to create a subprogram DIE and we should already
>>> have had one. Reflow formatting in collectDeadVariables while fixing.
>>>
>>> Modified:
>>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>>
>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=192749&r1=192748&r2=192749&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Oct 15 18:31:38 2013
>>> @@ -826,12 +826,8 @@ CompileUnit *DwarfDebug::constructCompil
>>>  }
>>>
>>>  // Construct subprogram DIE.
>>> -void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU,
>>> -                                        const MDNode *N) {
>>> -  CompileUnit *&CURef = SPMap[N];
>>> -  if (CURef)
>>> -    return;
>>> -  CURef = TheCU;
>>> +void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU, const MDNode *N) {
>>> +  assert(!SPMap[N] && "Trying to create a subprogram DIE twice!");
>>>
>>>    DISubprogram SP(N);
>>>    if (!SP.isDefinition())
>>> @@ -840,6 +836,7 @@ void DwarfDebug::constructSubprogramDIE(
>>>      return;
>>>
>>>    DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP);
>>> +  SPMap[N] = TheCU;
>>>
>>>    // Expose as a global name.
>>>    TheCU->addGlobalName(SP.getName(), SubprogramDie);
>>> @@ -974,28 +971,33 @@ void DwarfDebug::collectDeadVariables()
>>>        DIArray Subprograms = TheCU.getSubprograms();
>>>        for (unsigned i = 0, e = Subprograms.getNumElements(); i != e; ++i) {
>>>          DISubprogram SP(Subprograms.getElement(i));
>>> -        if (ProcessedSPNodes.count(SP) != 0) continue;
>>> -        if (!SP.isSubprogram()) continue;
>>> -        if (!SP.isDefinition()) continue;
>>> +        if (ProcessedSPNodes.count(SP) != 0)
>>> +          continue;
>>> +        if (!SP.isSubprogram())
>>> +          continue;
>>> +        if (!SP.isDefinition())
>>> +          continue;
>>>          DIArray Variables = SP.getVariables();
>>> -        if (Variables.getNumElements() == 0) continue;
>>> +        if (Variables.getNumElements() == 0)
>>> +          continue;
>>>
>>>          LexicalScope *Scope =
>>> -          new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
>>> +            new LexicalScope(NULL, DIDescriptor(SP), NULL, false);
>>>          DeadFnScopeMap[SP] = Scope;
>>>
>>>          // Construct subprogram DIE and add variables DIEs.
>>>          CompileUnit *SPCU = CUMap.lookup(TheCU);
>>>          assert(SPCU && "Unable to find Compile Unit!");
>>> -        constructSubprogramDIE(SPCU, SP);
>>> -        DIE *ScopeDIE = SPCU->getDIE(SP);
>>> +        DIE *SPDIE = SPCU->getDIE(SP);
>>> +        assert(SPDIE && "Subprogram wasn't created?");
>>>          for (unsigned vi = 0, ve = Variables.getNumElements(); vi != ve; ++vi) {
>>>            DIVariable DV(Variables.getElement(vi));
>>> -          if (!DV.isVariable()) continue;
>>> +          if (!DV.isVariable())
>>> +            continue;
>>>            DbgVariable NewVar(DV, NULL, this);
>>>            if (DIE *VariableDIE =
>>> -              SPCU->constructVariableDIE(&NewVar, Scope->isAbstractScope()))
>>> -            ScopeDIE->addChild(VariableDIE);
>>> +                  SPCU->constructVariableDIE(&NewVar, Scope->isAbstractScope()))
>>> +            SPDIE->addChild(VariableDIE);
>>>          }
>>>        }
>>>      }
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>> _______________________________________________
>> 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