[llvm] r204162 - Debug info: Remove OdrMemberMap from DwarfDebug, it's not necessary.
David Blaikie
dblaikie at gmail.com
Fri Mar 21 10:54:58 PDT 2014
On Fri, Mar 21, 2014 at 10:52 AM, Adrian Prantl <aprantl at apple.com> wrote:
>
> On Mar 21, 2014, at 10:44 AM, David Blaikie <dblaikie at gmail.com> wrote:
>
>> On Fri, Mar 21, 2014 at 10:34 AM, Manman Ren <manman.ren at gmail.com> wrote:
>>>
>>>
>>>
>>> On Tue, Mar 18, 2014 at 10:41 AM, Adrian Prantl <aprantl at apple.com> wrote:
>>>>
>>>> Author: adrian
>>>> Date: Tue Mar 18 12:41:15 2014
>>>> New Revision: 204162
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=204162&view=rev
>>>> Log:
>>>> Debug info: Remove OdrMemberMap from DwarfDebug, it's not necessary.
>>>> Follow-up to r203982.
>>>>
>>>> Modified:
>>>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>>>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>>>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
>>>>
>>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=204162&r1=204161&r2=204162&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Tue Mar 18 12:41:15
>>>> 2014
>>>> @@ -369,7 +369,6 @@ bool DwarfDebug::isSubprogramContext(con
>>>> // scope then create and insert DIEs for these variables.
>>>> DIE *DwarfDebug::updateSubprogramScopeDIE(DwarfCompileUnit *SPCU,
>>>> DISubprogram SP) {
>>>> - SP = SPCU->getOdrUniqueSubprogram(resolve(SP.getContext()), SP);
>>>> DIE *SPDie = SPCU->getDIE(SP);
>>>>
>>>> assert(SPDie && "Unable to find subprogram DIE!");
>>>> @@ -604,7 +603,8 @@ DIE *DwarfDebug::constructScopeDIE(Dwarf
>>>> if (!Scope || !Scope->getScopeNode())
>>>> return NULL;
>>>>
>>>> - DIScope DS(Scope->getScopeNode());
>>>> + // Unique scope where applicable.
>>>> + DIScope DS(resolve(DIScope(Scope->getScopeNode()).getRef()));
>>>
>>>
>>> Just to recapture what Adrian and I discussed earlier. We try not to unique
>>> types in the backend. All references to
>>> DITypes with an identifier should be converted to DIRef if possible (with
>>> the exception of the retained type list).
>>
>> OK - so I'm a bit confused by this code, then. Are you suggesting that
>> "we try not to unique types in the backend, but this case above is an
>> exception that we need to do in the backend for <reason>" or are you
>> saying that this code isn't an instance of what you would call
>> "uniquing types in the backend".
>>
>> It looks as if we still want to change this code so it doesn't loop
>> back through "uniquing" by getting a ref to the current entity and
>> "uniquing" it. Instead we should change getScopeNode to return an
>> MDNode or MDString as other "refs" do - and resolve it directly
>> (rather than having it reference the MDNode directly, querying that
>> for the name, then looking the name up to find (possibly the same)
>> MDNode)?
>>
>>>
>>>
>>> Adrian tried reverting r203982, the testing case for r203982 will still
>>> work, it is working because of his earlier commit on converting DIVariable's
>>> type to use DIRef.
>>>
>>>>
>>>>
>>>> SmallVector<DIE *, 8> Children;
>>>> DIE *ObjectPointer = NULL;
>>>>
>>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=204162&r1=204161&r2=204162&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
>>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Tue Mar 18 12:41:15
>>>> 2014
>>>> @@ -346,9 +346,6 @@ class DwarfDebug : public AsmPrinterHand
>>>> /// of in DwarfCompileUnit.
>>>> DenseMap<const MDNode *, DIE *> MDTypeNodeToDieMap;
>>>>
>>>> - // Used to unique C++ member function declarations.
>>>> - StringMap<const MDNode *> OdrMemberMap;
>>>> -
>>>> // List of all labels used in aranges generation.
>>>> std::vector<SymbolCU> ArangeLabels;
>>>>
>>>> @@ -700,11 +697,6 @@ public:
>>>> return MDTypeNodeToDieMap.lookup(TypeMD);
>>>> }
>>>>
>>>> - /// \brief Look up or create an entry in the OdrMemberMap.
>>>> - const MDNode *&getOrCreateOdrMember(StringRef Key) {
>>>> - return OdrMemberMap.GetOrCreateValue(Key).getValue();
>>>> - }
>>>> -
>>>> /// \brief Emit all Dwarf sections that should come prior to the
>>>> /// content.
>>>> void beginModule();
>>>>
>>>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=204162&r1=204161&r2=204162&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
>>>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Tue Mar 18 12:41:15
>>>> 2014
>>>> @@ -1427,24 +1427,6 @@ DIE *DwarfUnit::getOrCreateNameSpace(DIN
>>>> return NDie;
>>>> }
>>>>
>>>> -/// Unique C++ member function declarations based on their
>>>> -/// context and mangled name.
>>>> -DISubprogram
>>>> -DwarfUnit::getOdrUniqueSubprogram(DIScope Context, DISubprogram SP) const
>>>> {
>>>> - if (!hasODR() ||
>>>> - !Context.isCompositeType() ||
>>>> - SP.getLinkageName().empty() ||
>>>> - SP.isDefinition())
>>>> - return SP;
>>>> - // Create a key with the UID of the parent class and this SP's name.
>>>> - Twine Key = SP.getContext().getName() + SP.getLinkageName();
>>>> - const MDNode *&Entry = DD->getOrCreateOdrMember(Key.str());
>>>> - if (!Entry)
>>>> - Entry = &*SP;
>>>> -
>>>> - return DISubprogram(Entry);
>>>> -}
>>>> -
>>>> /// getOrCreateSubprogramDIE - Create new DIE using SP.
>>>> DIE *DwarfUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
>>>> // Construct the context before querying for the existence of the DIE
>>>> in case
>>>> @@ -1452,8 +1434,10 @@ DIE *DwarfUnit::getOrCreateSubprogramDIE
>>>> // declarations).
>>>> DIScope Context = resolve(SP.getContext());
>>>> DIE *ContextDIE = getOrCreateContextDIE(Context);
>>>> +
>>>> // Unique declarations based on the ODR, where applicable.
>>>> - SP = getOdrUniqueSubprogram(Context, SP);
>>>> + SP = DISubprogram(DD->resolve(SP.getRef()));
>>>
>>>
>>> This line of code does nothing, since we don't have identifiers for
>>> DISubprogram.
>>
>> Nice catch - yeah... this is more of that loop-back "uniquing" anyway
>> - it'd be nice to get rid of any code like this in favor of fixing the
>> ways objects are referenced. (I understand there's a reasonable
>> exception when visiting the retained types list, potentially - though
>> we could think about that a bit further too)
>
> .. the exception being that we do need to store direct references to the types *somewhere*, otherwise they will be dropped.
Right - sorry, didn't mean we shouldn't store MDNode references to
types in retained types - that's clearly needed. I just meant that we
might do something different when we emit types from the retained
types list. (maybe we should build the ID (mangled name) -> type
mapping, then just emit the types by walking that map - then we
wouldn't have to do the uniquing resolve step - we would've already
done that work when we build up the resolver map)
>
>>
>> So we should remove this line of code, right?
>
> I'll take care of that,
> thanks again for noticing, Manman!
>
> -- adrian
>
More information about the llvm-commits
mailing list