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