diff --git a/lib/DebugInfo/DWARFContext.cpp b/lib/DebugInfo/DWARFContext.cpp index 2477f3ed4cc..cc1f8f93905 100644 --- a/lib/DebugInfo/DWARFContext.cpp +++ b/lib/DebugInfo/DWARFContext.cpp @@ -29,7 +29,7 @@ DWARFContext::~DWARFContext() { } static void dumpPubSection(raw_ostream &OS, StringRef Name, StringRef Data, - bool LittleEndian) { + bool LittleEndian, bool GnuStyle) { OS << "\n." << Name << " contents:\n"; DataExtractor pubNames(Data, LittleEndian, 0); uint32_t offset = 0; @@ -37,16 +37,25 @@ static void dumpPubSection(raw_ostream &OS, StringRef Name, StringRef Data, OS << "Version: " << pubNames.getU16(&offset) << "\n"; OS << "Offset in .debug_info: " << pubNames.getU32(&offset) << "\n"; OS << "Size: " << pubNames.getU32(&offset) << "\n"; - OS << "Offset Linkage Kind Name\n"; + if (GnuStyle) + OS << "Offset Linkage Kind Name\n"; + else + OS << "Offset Name\n"; + while (offset < Data.size()) { uint32_t dieRef = pubNames.getU32(&offset); if (dieRef == 0) break; - PubIndexEntryDescriptor desc(pubNames.getU8(&offset)); - OS << format("0x%8.8x ", dieRef) - << format("%-8s", dwarf::GDBIndexEntryLinkageString(desc.Linkage)) << ' ' - << format("%-8s", dwarf::GDBIndexEntryKindString(desc.Kind)) << ' ' - << '\"' << pubNames.getCStr(&offset) << "\"\n"; + if (GnuStyle) { + PubIndexEntryDescriptor desc(pubNames.getU8(&offset)); + OS << format("0x%8.8x ", dieRef) + << format("%-8s", dwarf::GDBIndexEntryLinkageString(desc.Linkage)) + << ' ' << format("%-8s", dwarf::GDBIndexEntryKindString(desc.Kind)) + << ' ' << '\"' << pubNames.getCStr(&offset) << "\"\n"; + } else { + OS << format("0x%8.8x ", dieRef); + OS << pubNames.getCStr(&offset) << "\n"; + } } } @@ -130,31 +139,17 @@ void DWARFContext::dump(raw_ostream &OS, DIDumpType DumpType) { rangeList.dump(OS); } - if (DumpType == DIDT_All || DumpType == DIDT_Pubnames) { - OS << "\n.debug_pubnames contents:\n"; - DataExtractor pubNames(getPubNamesSection(), isLittleEndian(), 0); - offset = 0; - OS << "Length: " << pubNames.getU32(&offset) << "\n"; - OS << "Version: " << pubNames.getU16(&offset) << "\n"; - OS << "Offset in .debug_info: " << pubNames.getU32(&offset) << "\n"; - OS << "Size: " << pubNames.getU32(&offset) << "\n"; - OS << "\n Offset Name\n"; - while (offset < getPubNamesSection().size()) { - uint32_t n = pubNames.getU32(&offset); - if (n == 0) - break; - OS << format("%8x ", n); - OS << pubNames.getCStr(&offset) << "\n"; - } - } + if (DumpType == DIDT_All || DumpType == DIDT_Pubnames) + dumpPubSection(OS, "debug_pubnames", getPubNamesSection(), + isLittleEndian(), false); if (DumpType == DIDT_All || DumpType == DIDT_GnuPubnames) dumpPubSection(OS, "debug_gnu_pubnames", getGnuPubNamesSection(), - isLittleEndian()); + isLittleEndian(), true /* GnuStyle */); if (DumpType == DIDT_All || DumpType == DIDT_GnuPubtypes) dumpPubSection(OS, "debug_gnu_pubtypes", getGnuPubTypesSection(), - isLittleEndian()); + isLittleEndian(), true /* GnuStyle */); if (DumpType == DIDT_All || DumpType == DIDT_AbbrevDwo) { const DWARFDebugAbbrev *D = getDebugAbbrevDWO(); diff --git a/test/DebugInfo/dwarfdump-pubnames.test b/test/DebugInfo/dwarfdump-pubnames.test index e1b16c2f274..15200366607 100644 --- a/test/DebugInfo/dwarfdump-pubnames.test +++ b/test/DebugInfo/dwarfdump-pubnames.test @@ -7,10 +7,11 @@ CHECK: Version: 2 CHECK: Offset in .debug_info: 0 CHECK: Size: 321 -CHECK: Offset Name -CHECK: 98 global_namespace_variable -CHECK: a7 global_namespace_function -CHECK: ec static_member_function -CHECK: 7c global_variable -CHECK: 103 global_function -CHECK: c2 member_function +CHECK: Offset Name +CHECK: 0x00000098 "global_namespace_variable" +CHECK: 0x000000a7 "global_namespace_function" +CHECK: 0x000000ec "static_member_function" +CHECK: 0x0000007c "global_variable" +CHECK: 0x00000103 "global_function" +CHECK: 0x000000c2 "member_function" +