diff options
author | David Blaikie <dblaikie@gmail.com> | 2013-10-03 20:07:20 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2013-10-03 20:07:20 +0000 |
commit | e5830c4e2603ab36f08911ff6bb117638ae529c7 (patch) | |
tree | 34b9ca548accd70adcdedd36962062f6b54e3ea7 /lib | |
parent | cee51c48030f37133ad4004d3e5c14d8ebfc91c4 (diff) | |
download | external_llvm-e5830c4e2603ab36f08911ff6bb117638ae529c7.zip external_llvm-e5830c4e2603ab36f08911ff6bb117638ae529c7.tar.gz external_llvm-e5830c4e2603ab36f08911ff6bb117638ae529c7.tar.bz2 |
DebugInfo: Avoid redundantly adding child DIEs to parents.
DIE::addChild had a shortcircuit that silently no-op'd when a child was
readded to the same parent. This hid some quirky/redundant code in
DwarfDebug/CompileUnit. By removing that functionality and replacing it
with an assert I was able to find and cleanup those cases, mostly
centering around adding members to types in various circumstances.
1) The original oddity I noticed while working on type units (which
actually was helping me in the short term, by accident) was the
addToContextOwner call in constructTypeDIE. This call was completely
bogus (why was it only done for non-virtual types? what relevance does
that have at all) and redundant with the more uniform addToContextOwner
made in getOrCreateTypeDIE.
2) If a member function definition was visited (createSubprogramDIE), it
would attempt to build the member function declaration. The declaration
DIE would then be added to its context, but in building the context (the
type for which this function is a member) the members of the type would
be added to the type automatically, so by the time the context was
constructed, the member function was already associated with it.
3) The same as (2) but without the member function being constructed
first. Whenever a type was constructed, the members would be created and
member functions would be created by getOrCreateSubprogramDIE - this
would lead to the subprogram being added to the (incomplete) type
already, then the general member-construction code would add it again.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191928 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/AsmPrinter/DIE.h | 5 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 16 | ||||
-rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 6 |
3 files changed, 12 insertions, 15 deletions
diff --git a/lib/CodeGen/AsmPrinter/DIE.h b/lib/CodeGen/AsmPrinter/DIE.h index 35b76b5..bff546f 100644 --- a/lib/CodeGen/AsmPrinter/DIE.h +++ b/lib/CodeGen/AsmPrinter/DIE.h @@ -169,10 +169,7 @@ namespace llvm { /// addChild - Add a child to the DIE. /// void addChild(DIE *Child) { - if (Child->getParent()) { - assert (Child->getParent() == this && "Unexpected DIE Parent!"); - return; - } + assert(!Child->getParent()); Abbrev.setChildrenFlag(dwarf::DW_CHILDREN_yes); Children.push_back(Child); Child->Parent = this; diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index afe8a7d..c6bd7ab 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -808,9 +808,16 @@ DIE *CompileUnit::getOrCreateContextDIE(DIDescriptor Context) { /// addToContextOwner - Add Die into the list of its context owner's children. void CompileUnit::addToContextOwner(DIE *Die, DIDescriptor Context) { - if (DIE *ContextDIE = getOrCreateContextDIE(Context)) + assert(!Die->getParent()); + if (DIE *ContextDIE = getOrCreateContextDIE(Context)) { + if (Die->getParent()) { + // While creating the context, if this is a type member, we will have + // added the child to the context already. + assert(Die->getParent() == ContextDIE); + return; + } ContextDIE->addChild(Die); - else + } else addDie(Die); } @@ -1124,6 +1131,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { ElemDie = createStaticMemberDIE(DDTy); else ElemDie = createMemberDIE(DDTy); + Buffer.addChild(ElemDie); } else if (Element.isObjCProperty()) { DIObjCProperty Property(Element); ElemDie = new DIE(Property.getTag()); @@ -1159,9 +1167,9 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { Entry = createDIEEntry(ElemDie); insertDIEEntry(Element, Entry); } + Buffer.addChild(ElemDie); } else continue; - Buffer.addChild(ElemDie); } if (CTy.isAppleBlockExtension()) @@ -1171,8 +1179,6 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) { if (DIDescriptor(ContainingType).isCompositeType()) addDIEEntry(&Buffer, dwarf::DW_AT_containing_type, dwarf::DW_FORM_ref4, getOrCreateTypeDIE(DIType(ContainingType))); - else - addToContextOwner(&Buffer, DD->resolve(CTy.getContext())); if (CTy.isObjcClassComplete()) addFlag(&Buffer, dwarf::DW_AT_APPLE_objc_complete_type); diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 1e08e2c..557ae1d 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -838,12 +838,6 @@ void DwarfDebug::constructSubprogramDIE(CompileUnit *TheCU, DIE *SubprogramDie = TheCU->getOrCreateSubprogramDIE(SP); - // Add to map. - TheCU->insertDIE(N, SubprogramDie); - - // Add to context owner. - TheCU->addToContextOwner(SubprogramDie, SP.getContext()); - // Expose as a global name. TheCU->addGlobalName(SP.getName(), SubprogramDie); } |