[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