[llvm] r293971 - DebugInfo: ensure type and namespace names are included in pubnames/pubtypes even when they are only present in type units
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 2 18:34:05 PST 2017
On Thu, Feb 2, 2017 at 4:55 PM David Blaikie via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: dblaikie
> Date: Thu Feb 2 18:44:18 2017
> New Revision: 293971
>
> URL: http://llvm.org/viewvc/llvm-project?rev=293971&view=rev
> Log:
> DebugInfo: ensure type and namespace names are included in
> pubnames/pubtypes even when they are only present in type units
>
> While looking to add support for placing singular types (types that will
> only be emitted in one place (such as attached to a strong vtable or
> explicit template instantiation definition)) not in type units (since
> type units have overhead) I stumbled across that change causing an
> increase in pubtypes.
>
> Turns out we were missing some types from type units if they were only
> referenced from other type units and not from the debug_info section.
>
> This fixes that, following GCC's line of describing the offset of such
> entities as the CU die (since there's no compile unit-relative offset
> that would describe such an entity - they aren't in the CU). Also like
> GCC, this change prefers to describe the type stub within the CU rather
> than the "just use the CU offset" fallback where possible. This may give
> the DWARF consumer some opportunity to find the extra info in the type
> stub - though I'm not sure GDB does anything with this currently.
>
> The size of the pubnames/pubtypes sections now match exactly with or
> without type units enabled.
>
> This nearly triples (+189%) the pubtypes section for a clang self-host
> and grows pubnames by 0.07% (without compression). For a total of 8%
> increase in debug info sections of the objects of a Split DWARF build
> when using type units.
>
Actually a bit worse - +8% of total object size (for -gsplit-dwarf
-fdebug-types-section) in an unoptimized build (where pubnames/pubtypes are
rather dominant: biggest sections in order: pubnames, strtab, text,
pubtypes (& that's with non-gnu pubnames/types, the gnu ones are a bit
bigger I think)). Without compression, though. Blah, always so many
tradeoffs/axes on which to evaluate these things.
>
> Added:
> llvm/trunk/test/DebugInfo/X86/gnu-public-names-tu.ll
> Modified:
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=293971&r1=293970&r2=293971&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Thu Feb 2
> 18:44:18 2017
> @@ -697,7 +697,7 @@ void DwarfCompileUnit::emitHeader(bool U
> }
>
> /// addGlobalName - Add a new global name to the compile unit.
> -void DwarfCompileUnit::addGlobalName(StringRef Name, DIE &Die,
> +void DwarfCompileUnit::addGlobalName(StringRef Name, const DIE &Die,
> const DIScope *Context) {
> if (includeMinimalInlineScopes())
> return;
> @@ -705,6 +705,18 @@ void DwarfCompileUnit::addGlobalName(Str
> GlobalNames[FullName] = &Die;
> }
>
> +void DwarfCompileUnit::addGlobalNameForTypeUnit(StringRef Name,
> + const DIScope *Context) {
> + if (includeMinimalInlineScopes())
> + return;
> + std::string FullName = getParentContextString(Context) + Name.str();
> + // Insert, allowing the entry to remain as-is if it's already present
> + // This way the CU-level type DIE is preferred over the "can't describe
> this
> + // type as a unit offset because it's not really in the CU at all, it's
> only
> + // in a type unit"
> + GlobalNames.insert(std::make_pair(std::move(FullName), &getUnitDie()));
> +}
> +
> /// Add a new global type to the unit.
> void DwarfCompileUnit::addGlobalType(const DIType *Ty, const DIE &Die,
> const DIScope *Context) {
> @@ -714,6 +726,18 @@ void DwarfCompileUnit::addGlobalType(con
> GlobalTypes[FullName] = &Die;
> }
>
> +void DwarfCompileUnit::addGlobalTypeUnitType(const DIType *Ty,
> + const DIScope *Context) {
> + if (includeMinimalInlineScopes())
> + return;
> + std::string FullName = getParentContextString(Context) +
> Ty->getName().str();
> + // Insert, allowing the entry to remain as-is if it's already present
> + // This way the CU-level type DIE is preferred over the "can't describe
> this
> + // type as a unit offset because it's not really in the CU at all, it's
> only
> + // in a type unit"
> + GlobalTypes.insert(std::make_pair(std::move(FullName), &getUnitDie()));
> +}
> +
> /// addVariableAddress - Add DW_AT_location attribute for a
> /// DbgVariable based on provided MachineLocation.
> void DwarfCompileUnit::addVariableAddress(const DbgVariable &DV, DIE &Die,
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h?rev=293971&r1=293970&r2=293971&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h Thu Feb 2
> 18:44:18 2017
> @@ -210,12 +210,19 @@ public:
> }
>
> /// Add a new global name to the compile unit.
> - void addGlobalName(StringRef Name, DIE &Die, const DIScope *Context)
> override;
> + void addGlobalName(StringRef Name, const DIE &Die,
> + const DIScope *Context) override;
> +
> + /// Add a new global name present in a type unit to this compile unit.
> + void addGlobalNameForTypeUnit(StringRef Name, const DIScope *Context);
>
> /// Add a new global type to the compile unit.
> void addGlobalType(const DIType *Ty, const DIE &Die,
> const DIScope *Context) override;
>
> + /// Add a new global type present in a type unit to this compile unit.
> + void addGlobalTypeUnitType(const DIType *Ty, const DIScope *Context);
> +
> const StringMap<const DIE *> &getGlobalNames() const { return
> GlobalNames; }
> const StringMap<const DIE *> &getGlobalTypes() const { return
> GlobalTypes; }
>
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=293971&r1=293970&r2=293971&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Thu Feb 2 18:44:18
> 2017
> @@ -1351,6 +1351,18 @@ void DwarfDebug::emitAccelTypes() {
> /// computeIndexValue - Compute the gdb index value for the DIE and CU.
> static dwarf::PubIndexEntryDescriptor computeIndexValue(DwarfUnit *CU,
> const DIE *Die) {
> + // Entities that ended up only in a Type Unit reference the CU instead
> (since
> + // the pub entry has offsets within the CU there's no real offset that
> can be
> + // provided anyway). As it happens all such entities (namespaces and
> types,
> + // types only in C++ at that) are rendered as TYPE+EXTERNAL. If this
> turns out
> + // not to be true it would be necessary to persist this information
> from the
> + // point at which the entry is added to the index data structure -
> since by
> + // the time the index is built from that, the original type/namespace
> DIE in a
> + // type unit has already been destroyed so it can't be queried for
> properties
> + // like tag, etc.
> + if (Die->getTag() == dwarf::DW_TAG_compile_unit)
> + return dwarf::PubIndexEntryDescriptor(dwarf::GIEK_TYPE,
> + dwarf::GIEL_EXTERNAL);
> dwarf::GDBIndexEntryLinkage Linkage = dwarf::GIEL_STATIC;
>
> // We could have a specification DIE that has our most of our knowledge,
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=293971&r1=293970&r2=293971&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Thu Feb 2 18:44:18
> 2017
> @@ -672,7 +672,7 @@ DIE *DwarfUnit::getOrCreateContextDIE(co
> return getDIE(Context);
> }
>
> -DIE *DwarfUnit::createTypeDIE(const DICompositeType *Ty) {
> +DIE *DwarfTypeUnit::createTypeDIE(const DICompositeType *Ty) {
> auto *Context = resolve(Ty->getScope());
> DIE *ContextDIE = getOrCreateContextDIE(Context);
>
> @@ -1569,3 +1569,13 @@ bool DwarfTypeUnit::isDwoUnit() const {
> // when split DWARF is being used.
> return DD->useSplitDwarf();
> }
> +
> +void DwarfTypeUnit::addGlobalName(StringRef Name, const DIE &Die,
> + const DIScope *Context) {
> + getCU().addGlobalNameForTypeUnit(Name, Context);
> +}
> +
> +void DwarfTypeUnit::addGlobalType(const DIType *Ty, const DIE &Die,
> + const DIScope *Context) {
> + getCU().addGlobalTypeUnitType(Ty, Context);
> +}
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h?rev=293971&r1=293970&r2=293971&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.h Thu Feb 2 18:44:18 2017
> @@ -124,12 +124,12 @@ public:
> std::string getParentContextString(const DIScope *Context) const;
>
> /// Add a new global name to the compile unit.
> - virtual void addGlobalName(StringRef Name, DIE &Die, const DIScope
> *Context) {
> - }
> + virtual void addGlobalName(StringRef Name, const DIE &Die,
> + const DIScope *Context) = 0;
>
> /// Add a new global type to the compile unit.
> virtual void addGlobalType(const DIType *Ty, const DIE &Die,
> - const DIScope *Context) {}
> + const DIScope *Context) = 0;
>
> /// Returns the DIE map slot for the specified debug variable.
> ///
> @@ -262,9 +262,6 @@ public:
> DIE *getOrCreateTypeDIE(const MDNode *N);
>
> /// Get context owner's DIE.
> - DIE *createTypeDIE(const DICompositeType *Ty);
> -
> - /// Get context owner's DIE.
> DIE *getOrCreateContextDIE(const DIScope *Context);
>
> /// Construct DIEs for types that contain vtables.
> @@ -306,6 +303,11 @@ protected:
> return Ref.resolve();
> }
>
> + /// If this is a named finished type then include it in the list of
> types for
> + /// the accelerator tables.
> + void updateAcceleratorTables(const DIScope *Context, const DIType *Ty,
> + const DIE &TyDIE);
> +
> private:
> void constructTypeDIE(DIE &Buffer, const DIBasicType *BTy);
> void constructTypeDIE(DIE &Buffer, const DIDerivedType *DTy);
> @@ -330,11 +332,6 @@ private:
> /// Set D as anonymous type for index which can be reused later.
> void setIndexTyDie(DIE *D) { IndexTyDie = D; }
>
> - /// If this is a named finished type then include it in the list of
> types for
> - /// the accelerator tables.
> - void updateAcceleratorTables(const DIScope *Context, const DIType *Ty,
> - const DIE &TyDIE);
> -
> virtual bool isDwoUnit() const = 0;
> };
>
> @@ -354,12 +351,19 @@ public:
> void setTypeSignature(uint64_t Signature) { TypeSignature = Signature; }
> void setType(const DIE *Ty) { this->Ty = Ty; }
>
> + /// Get context owner's DIE.
> + DIE *createTypeDIE(const DICompositeType *Ty);
> +
> /// Emit the header for this unit, not including the initial length
> field.
> void emitHeader(bool UseOffsets) override;
> unsigned getHeaderSize() const override {
> return DwarfUnit::getHeaderSize() + sizeof(uint64_t) + // Type
> Signature
> sizeof(uint32_t); // Type DIE
> Offset
> }
> + void addGlobalName(StringRef Name, const DIE &Die,
> + const DIScope *Context) override;
> + void addGlobalType(const DIType *Ty, const DIE &Die,
> + const DIScope *Context) override;
> DwarfCompileUnit &getCU() override { return CU; }
> };
> } // end llvm namespace
>
> Added: llvm/trunk/test/DebugInfo/X86/gnu-public-names-tu.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/gnu-public-names-tu.ll?rev=293971&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/X86/gnu-public-names-tu.ll (added)
> +++ llvm/trunk/test/DebugInfo/X86/gnu-public-names-tu.ll Thu Feb 2
> 18:44:18 2017
> @@ -0,0 +1,54 @@
> +; RUN: llc -mtriple=x86_64-pc-linux-gnu -generate-type-units
> -generate-gnu-dwarf-pub-sections -filetype=obj < %s | llvm-dwarfdump - |
> FileCheck %s
> +
> +; Generated from:
> +
> +; namespace ns {
> +; struct foo {
> +; };
> +; }
> +; struct bar {
> +; ns::foo f;
> +; };
> +; bar b;
> +
> +; CHECK-LABEL: .debug_info contents:
> +; CHECK: [[CU:0x[0-9a-f]+]]: DW_TAG_compile_unit
> +; CHECK: [[BAR:0x[0-9a-f]+]]: DW_TAG_structure_type
> +
> +
> +; CHECK-LABEL: .debug_gnu_pubnames contents:
> +; CHECK-NEXT: length = {{.*}} version = 0x0002 unit_offset = 0x00000000
> unit_size = {{.*}}
> +; CHECK-NEXT: Offset Linkage Kind Name
> +; CHECK-NEXT: [[CU]] EXTERNAL TYPE "ns"
> +; CHECK-NEXT: {{.*}} EXTERNAL VARIABLE "b"
> +
> +; CHECK-LABEL: debug_gnu_pubtypes contents:
> +; CHECK-NEXT: length = {{.*}} version = 0x0002 unit_offset = 0x00000000
> unit_size = {{.*}}
> +; CHECK-NEXT: Offset Linkage Kind Name
> +; CHECK-NEXT: [[BAR]] EXTERNAL TYPE "bar"
> +; CHECK-NEXT: [[CU]] EXTERNAL TYPE "ns::foo"
> +
> +%struct.bar = type { %"struct.ns::foo" }
> +%"struct.ns::foo" = type { i8 }
> +
> + at b = global %struct.bar zeroinitializer, align 1, !dbg !0
> +
> +!llvm.dbg.cu = !{!2}
> +!llvm.module.flags = !{!11, !12}
> +!llvm.ident = !{!13}
> +
> +!0 = !DIGlobalVariableExpression(var: !1)
> +!1 = distinct !DIGlobalVariable(name: "b", scope: !2, file: !3, line: 8,
> type: !6, isLocal: false, isDefinition: true)
> +!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !3,
> producer: "clang version 5.0.0 (trunk 293904) (llvm/trunk 293908)",
> isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !4,
> globals: !5)
> +!3 = !DIFile(filename: "type.cpp", directory: "/tmp/dbginfo")
> +!4 = !{}
> +!5 = !{!0}
> +!6 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "bar",
> file: !3, line: 5, size: 8, elements: !7, identifier: "_ZTS3bar")
> +!7 = !{!8}
> +!8 = !DIDerivedType(tag: DW_TAG_member, name: "f", scope: !6, file: !3,
> line: 6, baseType: !9, size: 8)
> +!9 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "foo",
> scope: !10, file: !3, line: 2, size: 8, elements: !4, identifier:
> "_ZTSN2ns3fooE")
> +!10 = !DINamespace(name: "ns", scope: null, file: !3, line: 1)
> +!11 = !{i32 2, !"Dwarf Version", i32 4}
> +!12 = !{i32 2, !"Debug Info Version", i32 3}
> +!13 = !{!"clang version 5.0.0 (trunk 293904) (llvm/trunk 293908)"}
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170203/269ba05d/attachment.html>
More information about the llvm-commits
mailing list