[llvm] r216861 - DebugInfo: Elide lexical scopes which only contain other (inline or lexical) scopes.
Kostya Serebryany
kcc at google.com
Tue Sep 2 16:12:12 PDT 2014
On Sun, Aug 31, 2014 at 2:40 PM, David Blaikie <dblaikie at gmail.com> wrote:
> Not sure if you guys have found binary size of -gmlt to be an issue - but
> if you have, this might be of interest.
>
For -gline-tables-only we did see issues with binary size, but then Alexey
added compression and the issue reduced significantly, IIRC
>
> (the numbers here are uncompressed debug info)
>
>
> On Sun, Aug 31, 2014 at 2:26 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>> Author: dblaikie
>> Date: Sun Aug 31 16:26:22 2014
>> New Revision: 216861
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=216861&view=rev
>> Log:
>> DebugInfo: Elide lexical scopes which only contain other (inline or
>> lexical) scopes.
>>
>> DW_TAG_lexical_scopes inform debuggers about the instruction range for
>> which a given variable (or imported declaration/module/etc) is valid. If
>> the scope doesn't itself contain any such entities, it's a waste of
>> space and should be omitted.
>>
>> We were correctly doing this for entirely empty leaves, but not for
>> intermediate nodes.
>>
>> Reduces total (not just debug sections) .o file size for a bootstrap
>> -gmlt LLVM by 22% and bootstrap -gmlt clang executable by 13%. The wins
>> for a full -g build will be less as a % (and in absolute terms), but
>> should still be substantial - with some of that win being fewer
>> relocations, thus more substantiall reducing link times than fewer bytes
>> alone would have.
>>
>> Modified:
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>> llvm/trunk/test/DebugInfo/PR20038.ll
>> llvm/trunk/test/DebugInfo/X86/concrete_out_of_line.ll
>> llvm/trunk/test/DebugInfo/X86/fission-ranges.ll
>> llvm/trunk/test/DebugInfo/missing-abstract-variable.ll
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=216861&r1=216860&r2=216861&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Sun Aug 31 16:26:22
>> 2014
>> @@ -455,15 +455,21 @@ static std::unique_ptr<DIE> constructVar
>>
>> DIE *DwarfDebug::createScopeChildrenDIE(
>> DwarfCompileUnit &TheCU, LexicalScope *Scope,
>> - SmallVectorImpl<std::unique_ptr<DIE>> &Children) {
>> + SmallVectorImpl<std::unique_ptr<DIE>> &Children,
>> + unsigned *ChildScopeCount) {
>> DIE *ObjectPointer = nullptr;
>>
>> for (DbgVariable *DV : ScopeVariables.lookup(Scope))
>> Children.push_back(constructVariableDIE(TheCU, *DV, *Scope,
>> ObjectPointer));
>>
>> + unsigned ChildCountWithoutScopes = Children.size();
>> +
>> for (LexicalScope *LS : Scope->getChildren())
>> - if (std::unique_ptr<DIE> Nested = constructScopeDIE(TheCU, LS))
>> - Children.push_back(std::move(Nested));
>> + constructScopeDIE(TheCU, LS, Children);
>> +
>> + if (ChildScopeCount)
>> + *ChildScopeCount = Children.size() - ChildCountWithoutScopes;
>> +
>> return ObjectPointer;
>> }
>>
>> @@ -565,10 +571,11 @@ DIE &DwarfDebug::constructSubprogramScop
>> }
>>
>> // Construct a DIE for this scope.
>> -std::unique_ptr<DIE> DwarfDebug::constructScopeDIE(DwarfCompileUnit
>> &TheCU,
>> - LexicalScope *Scope) {
>> +void DwarfDebug::constructScopeDIE(
>> + DwarfCompileUnit &TheCU, LexicalScope *Scope,
>> + SmallVectorImpl<std::unique_ptr<DIE>> &FinalChildren) {
>> if (!Scope || !Scope->getScopeNode())
>> - return nullptr;
>> + return;
>>
>> DIScope DS(Scope->getScopeNode());
>>
>> @@ -586,17 +593,19 @@ std::unique_ptr<DIE> DwarfDebug::constru
>> if (Scope->getParent() && DS.isSubprogram()) {
>> ScopeDIE = constructInlinedScopeDIE(TheCU, Scope);
>> if (!ScopeDIE)
>> - return nullptr;
>> + return;
>> // We create children when the scope DIE is not null.
>> createScopeChildrenDIE(TheCU, Scope, Children);
>> } else {
>> // Early exit when we know the scope DIE is going to be null.
>> if (isLexicalScopeDIENull(Scope))
>> - return nullptr;
>> + return;
>> +
>> + unsigned ChildScopeCount;
>>
>> // We create children here when we know the scope DIE is not going
>> to be
>> // null and the children will be added to the scope DIE.
>> - createScopeChildrenDIE(TheCU, Scope, Children);
>> + createScopeChildrenDIE(TheCU, Scope, Children, &ChildScopeCount);
>>
>> // There is no need to emit empty lexical block DIE.
>> std::pair<ImportedEntityMap::const_iterator,
>> @@ -609,8 +618,14 @@ std::unique_ptr<DIE> DwarfDebug::constru
>> ++i)
>> Children.push_back(
>> constructImportedEntityDIE(TheCU,
>> DIImportedEntity(i->second)));
>> - if (Children.empty())
>> - return nullptr;
>> + // If there are only other scopes as children, put them directly in
>> the
>> + // parent instead, as this scope would serve no purpose.
>> + if (Children.size() == ChildScopeCount) {
>> + FinalChildren.insert(FinalChildren.end(),
>> + std::make_move_iterator(Children.begin()),
>> + std::make_move_iterator(Children.end()));
>> + return;
>> + }
>> ScopeDIE = constructLexicalScopeDIE(TheCU, Scope);
>> assert(ScopeDIE && "Scope DIE should not be null.");
>> }
>> @@ -619,7 +634,7 @@ std::unique_ptr<DIE> DwarfDebug::constru
>> for (auto &I : Children)
>> ScopeDIE->addChild(std::move(I));
>>
>> - return ScopeDIE;
>> + FinalChildren.push_back(std::move(ScopeDIE));
>> }
>>
>> void DwarfDebug::addGnuPubAttributes(DwarfUnit &U, DIE &D) const {
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h?rev=216861&r1=216860&r2=216861&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.h Sun Aug 31 16:26:22
>> 2014
>> @@ -377,8 +377,8 @@ class DwarfDebug : public AsmPrinterHand
>> LexicalScope *Scope);
>>
>> /// \brief Construct a DIE for this scope.
>> - std::unique_ptr<DIE> constructScopeDIE(DwarfCompileUnit &TheCU,
>> - LexicalScope *Scope);
>> + void constructScopeDIE(DwarfCompileUnit &TheCU, LexicalScope *Scope,
>> + SmallVectorImpl<std::unique_ptr<DIE>>
>> &FinalChildren);
>> DIE *createAndAddScopeChildren(DwarfCompileUnit &TheCU, LexicalScope
>> *Scope,
>> DIE &ScopeDIE);
>> /// \brief Construct a DIE for this abstract scope.
>> @@ -389,7 +389,8 @@ class DwarfDebug : public AsmPrinterHand
>> LexicalScope *Scope);
>> /// A helper function to create children of a Scope DIE.
>> DIE *createScopeChildrenDIE(DwarfCompileUnit &TheCU, LexicalScope
>> *Scope,
>> - SmallVectorImpl<std::unique_ptr<DIE>>
>> &Children);
>> + SmallVectorImpl<std::unique_ptr<DIE>>
>> &Children,
>> + unsigned *ChildScopeCount = nullptr);
>>
>> /// \brief Emit initial Dwarf sections with a label at the start of
>> each one.
>> void emitSectionLabels();
>>
>> Modified: llvm/trunk/test/DebugInfo/PR20038.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/PR20038.ll?rev=216861&r1=216860&r2=216861&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/PR20038.ll (original)
>> +++ llvm/trunk/test/DebugInfo/PR20038.ll Sun Aug 31 16:26:22 2014
>> @@ -30,23 +30,19 @@
>> ; CHECK-NOT: DW_TAG
>> ; CHECK: DW_AT_name {{.*}} "fun4"
>> ; CHECK-NOT: {{DW_TAG|NULL}}
>> -; CHECK: DW_TAG_lexical_block
>> -; CHECK-NOT: {{DW_TAG|NULL}}
>> -; CHECK: DW_TAG_inlined_subroutine
>> +; CHECK: DW_TAG_inlined_subroutine
>> ; CHECK-NOT: DW_TAG
>> -; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_ABS]]}
>> +; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_ABS]]}
>> ; CHECK-NOT: {{DW_TAG|NULL}}
>> -; CHECK: DW_TAG_formal_parameter
>> +; CHECK: DW_TAG_formal_parameter
>> ; CHECK-NOT: DW_TAG
>> -; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_THIS_ABS]]}
>> +; CHECK: DW_AT_abstract_origin {{.*}} {[[D1_THIS_ABS]]}
>>
>> ; FIXME: D2 is actually inlined into D1 but doesn't show up here,
>> possibly due
>> ; to there being no work in D2 (calling another member function from the
>> dtor
>> ; causes D2 to show up, calling a free function doesn't).
>>
>> ; CHECK-NOT: DW_TAG
>> -; CHECK: NULL
>> -; CHECK-NOT: DW_TAG
>> ; CHECK: NULL
>> ; CHECK-NOT: DW_TAG
>> ; CHECK: NULL
>>
>> Modified: llvm/trunk/test/DebugInfo/X86/concrete_out_of_line.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/concrete_out_of_line.ll?rev=216861&r1=216860&r2=216861&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/X86/concrete_out_of_line.ll (original)
>> +++ llvm/trunk/test/DebugInfo/X86/concrete_out_of_line.ll Sun Aug 31
>> 16:26:22 2014
>> @@ -32,9 +32,6 @@
>> ; CHECK: DW_TAG_formal_parameter
>> ; CHECK-NOT: NULL
>> ; CHECK-NOT: DW_TAG
>> -; CHECK: DW_TAG_lexical_block
>> -; CHECK-NOT: NULL
>> -; CHECK-NOT: DW_TAG
>> ; CHECK: DW_TAG_inlined_subroutine
>> ; CHECK-NEXT: DW_AT_abstract_origin {{.*}} {[[ASSIGN:0x........]]}
>> ; CHECK-NOT: NULL
>>
>> Modified: llvm/trunk/test/DebugInfo/X86/fission-ranges.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/fission-ranges.ll?rev=216861&r1=216860&r2=216861&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/X86/fission-ranges.ll (original)
>> +++ llvm/trunk/test/DebugInfo/X86/fission-ranges.ll Sun Aug 31 16:26:22
>> 2014
>> @@ -16,7 +16,7 @@
>> ; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[E:0x[0-9a-z]*]])
>> ; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[B:0x[0-9a-z]*]])
>> ; CHECK: DW_AT_location [DW_FORM_sec_offset] ([[D:0x[0-9a-z]*]])
>> -; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x000000a0)
>> +; CHECK: DW_AT_ranges [DW_FORM_sec_offset] (0x00000000)
>> ; CHECK: .debug_loc contents:
>> ; CHECK-NOT: Beginning address offset
>> ; CHECK: .debug_loc.dwo contents:
>>
>> Modified: llvm/trunk/test/DebugInfo/missing-abstract-variable.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/missing-abstract-variable.ll?rev=216861&r1=216860&r2=216861&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/DebugInfo/missing-abstract-variable.ll (original)
>> +++ llvm/trunk/test/DebugInfo/missing-abstract-variable.ll Sun Aug 31
>> 16:26:22 2014
>> @@ -45,8 +45,6 @@
>> ; CHECK-NOT: DW_TAG
>> ; CHECK: DW_AT_name {{.*}} "b"
>> ; CHECK-NOT: {{DW_TAG|NULL}}
>> -; CHECK: DW_TAG_lexical_block
>> -; CHECK-NOT: {{DW_TAG|NULL}}
>> ; CHECK: DW_TAG_lexical_block
>> ; CHECK-NOT: {{DW_TAG|NULL}}
>> ; CHECK: [[ABS_S:.*]]: DW_TAG_variable
>> @@ -89,19 +87,12 @@
>> ; CHECK-NOT: DW_TAG
>> ; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_B]]}
>>
>> -; The two lexical blocks here are caused by the scope of the if that
>> includes
>> -; the condition variable, and the scope within the if's composite
>> statement. I'm
>> -; not sure we really need both of them since there's no variable
>> declared in the
>> -; outer of the two
>> -
>> ; CHECK-NOT: {{DW_TAG|NULL}}
>> ; CHECK: DW_TAG_lexical_block
>> ; CHECK-NOT: {{DW_TAG|NULL}}
>> -; CHECK: DW_TAG_lexical_block
>> -; CHECK-NOT: {{DW_TAG|NULL}}
>> -; CHECK: DW_TAG_variable
>> +; CHECK: DW_TAG_variable
>> ; CHECK-NOT: DW_TAG
>> -; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_S]]}
>> +; CHECK: DW_AT_abstract_origin {{.*}} {[[ABS_S]]}
>>
>> @t = external global i32
>>
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140902/3e6d762c/attachment.html>
More information about the llvm-commits
mailing list