Index: include/llvm/DebugInfo/DWARF/DWARFDebugPubTable.h =================================================================== --- include/llvm/DebugInfo/DWARF/DWARFDebugPubTable.h +++ include/llvm/DebugInfo/DWARF/DWARFDebugPubTable.h @@ -13,6 +13,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include "llvm/BinaryFormat/Dwarf.h" +#include "llvm/DebugInfo/DWARF/DWARFObject.h" #include #include @@ -67,7 +68,8 @@ bool GnuStyle; public: - DWARFDebugPubTable(StringRef Data, bool LittleEndian, bool GnuStyle); + DWARFDebugPubTable(const DWARFObject &Obj, const DWARFSection &Sec, + bool LittleEndian, bool GnuStyle); void dump(raw_ostream &OS) const; Index: include/llvm/DebugInfo/DWARF/DWARFObject.h =================================================================== --- include/llvm/DebugInfo/DWARF/DWARFObject.h +++ include/llvm/DebugInfo/DWARF/DWARFObject.h @@ -49,10 +49,10 @@ virtual const DWARFSection &getRangeSection() const { return Dummy; } virtual const DWARFSection &getRnglistsSection() const { return Dummy; } virtual StringRef getMacinfoSection() const { return ""; } - virtual StringRef getPubNamesSection() const { return ""; } - virtual StringRef getPubTypesSection() const { return ""; } - virtual StringRef getGnuPubNamesSection() const { return ""; } - virtual StringRef getGnuPubTypesSection() const { return ""; } + virtual const DWARFSection &getPubNamesSection() const { return Dummy; } + virtual const DWARFSection &getPubTypesSection() const { return Dummy; } + virtual const DWARFSection &getGnuPubNamesSection() const { return Dummy; } + virtual const DWARFSection &getGnuPubTypesSection() const { return Dummy; } virtual const DWARFSection &getStringOffsetSection() const { return Dummy; } virtual void forEachInfoDWOSections(function_ref F) const {} Index: lib/DebugInfo/DWARF/DWARFContext.cpp =================================================================== --- lib/DebugInfo/DWARF/DWARFContext.cpp +++ lib/DebugInfo/DWARF/DWARFContext.cpp @@ -549,24 +549,24 @@ } if (shouldDump(Explicit, ".debug_pubnames", DIDT_ID_DebugPubnames, - DObj->getPubNamesSection())) - DWARFDebugPubTable(DObj->getPubNamesSection(), isLittleEndian(), false) + DObj->getPubNamesSection().Data)) + DWARFDebugPubTable(*DObj, DObj->getPubNamesSection(), isLittleEndian(), false) .dump(OS); if (shouldDump(Explicit, ".debug_pubtypes", DIDT_ID_DebugPubtypes, - DObj->getPubTypesSection())) - DWARFDebugPubTable(DObj->getPubTypesSection(), isLittleEndian(), false) + DObj->getPubTypesSection().Data)) + DWARFDebugPubTable(*DObj, DObj->getPubTypesSection(), isLittleEndian(), false) .dump(OS); if (shouldDump(Explicit, ".debug_gnu_pubnames", DIDT_ID_DebugGnuPubnames, - DObj->getGnuPubNamesSection())) - DWARFDebugPubTable(DObj->getGnuPubNamesSection(), isLittleEndian(), + DObj->getGnuPubNamesSection().Data)) + DWARFDebugPubTable(*DObj, DObj->getGnuPubNamesSection(), isLittleEndian(), true /* GnuStyle */) .dump(OS); if (shouldDump(Explicit, ".debug_gnu_pubtypes", DIDT_ID_DebugGnuPubtypes, - DObj->getGnuPubTypesSection())) - DWARFDebugPubTable(DObj->getGnuPubTypesSection(), isLittleEndian(), + DObj->getGnuPubTypesSection().Data)) + DWARFDebugPubTable(*DObj, DObj->getGnuPubTypesSection(), isLittleEndian(), true /* GnuStyle */) .dump(OS); @@ -1265,6 +1265,10 @@ DWARFSectionMap AppleNamespacesSection; DWARFSectionMap AppleObjCSection; DWARFSectionMap DebugNamesSection; + DWARFSectionMap PubNamesSection; + DWARFSectionMap PubTypesSection; + DWARFSectionMap GnuPubNamesSection; + DWARFSectionMap GnuPubTypesSection; DWARFSectionMap *mapNameToDWARFSection(StringRef Name) { return StringSwitch(Name) @@ -1281,6 +1285,10 @@ .Case("debug_str_offsets.dwo", &StringOffsetDWOSection) .Case("debug_addr", &AddrSection) .Case("apple_names", &AppleNamesSection) + .Case("debug_pubnames", &PubNamesSection) + .Case("debug_pubtypes", &PubTypesSection) + .Case("debug_gnu_pubnames", &GnuPubNamesSection) + .Case("debug_gnu_pubtypes", &GnuPubTypesSection) .Case("apple_types", &AppleTypesSection) .Case("apple_namespaces", &AppleNamespacesSection) .Case("apple_namespac", &AppleNamespacesSection) @@ -1294,12 +1302,8 @@ StringRef EHFrameSection; StringRef StringSection; StringRef MacinfoSection; - StringRef PubNamesSection; - StringRef PubTypesSection; - StringRef GnuPubNamesSection; StringRef AbbrevDWOSection; StringRef StringDWOSection; - StringRef GnuPubTypesSection; StringRef CUIndexSection; StringRef GdbIndexSection; StringRef TUIndexSection; @@ -1319,10 +1323,6 @@ .Case("eh_frame", &EHFrameSection) .Case("debug_str", &StringSection) .Case("debug_macinfo", &MacinfoSection) - .Case("debug_pubnames", &PubNamesSection) - .Case("debug_pubtypes", &PubTypesSection) - .Case("debug_gnu_pubnames", &GnuPubNamesSection) - .Case("debug_gnu_pubtypes", &GnuPubTypesSection) .Case("debug_abbrev.dwo", &AbbrevDWOSection) .Case("debug_str.dwo", &StringDWOSection) .Case("debug_cu_index", &CUIndexSection) @@ -1598,12 +1598,12 @@ return RnglistsSection; } StringRef getMacinfoSection() const override { return MacinfoSection; } - StringRef getPubNamesSection() const override { return PubNamesSection; } - StringRef getPubTypesSection() const override { return PubTypesSection; } - StringRef getGnuPubNamesSection() const override { + const DWARFSection &getPubNamesSection() const override { return PubNamesSection; } + const DWARFSection &getPubTypesSection() const override { return PubTypesSection; } + const DWARFSection &getGnuPubNamesSection() const override { return GnuPubNamesSection; } - StringRef getGnuPubTypesSection() const override { + const DWARFSection &getGnuPubTypesSection() const override { return GnuPubTypesSection; } const DWARFSection &getAppleNamesSection() const override { Index: lib/DebugInfo/DWARF/DWARFDebugPubTable.cpp =================================================================== --- lib/DebugInfo/DWARF/DWARFDebugPubTable.cpp +++ lib/DebugInfo/DWARF/DWARFDebugPubTable.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/DWARF/DWARFDebugPubTable.h" +#include "llvm/DebugInfo/DWARF/DWARFDataExtractor.h" #include "llvm/ADT/StringRef.h" #include "llvm/BinaryFormat/Dwarf.h" #include "llvm/Support/DataExtractor.h" @@ -18,10 +19,11 @@ using namespace llvm; using namespace dwarf; -DWARFDebugPubTable::DWARFDebugPubTable(StringRef Data, bool LittleEndian, - bool GnuStyle) +DWARFDebugPubTable::DWARFDebugPubTable(const DWARFObject &Obj, + const DWARFSection &Sec, + bool LittleEndian, bool GnuStyle) : GnuStyle(GnuStyle) { - DataExtractor PubNames(Data, LittleEndian, 0); + DWARFDataExtractor PubNames(Obj, Sec, LittleEndian, 0); uint32_t Offset = 0; while (PubNames.isValidOffset(Offset)) { Sets.push_back({}); @@ -29,10 +31,10 @@ SetData.Length = PubNames.getU32(&Offset); SetData.Version = PubNames.getU16(&Offset); - SetData.Offset = PubNames.getU32(&Offset); + SetData.Offset = PubNames.getRelocatedValue(4, &Offset); SetData.Size = PubNames.getU32(&Offset); - while (Offset < Data.size()) { + while (Offset < Sec.Data.size()) { uint32_t DieRef = PubNames.getU32(&Offset); if (DieRef == 0) break; Index: test/DebugInfo/X86/gnu-public-names-multiple-cus-2.s =================================================================== --- /dev/null +++ test/DebugInfo/X86/gnu-public-names-multiple-cus-2.s @@ -0,0 +1,35 @@ +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: llvm-dwarfdump -debug-gnu-pubnames %t.o | FileCheck %s + +# CHECK: unit_offset = 0x00000000 +# CHECK: unit_offset = 0x0000000c + + .section .debug_abbrev,"",@progbits + .byte 1 + + .section .debug_info,"",@progbits +.Lcu_begin0: + .long 8 # Length of Unit + .short 4 # DWARF version number + .long 0 # Offset Into Abbrev. Section + .byte 4 # Address Size + .byte 0 # NULL +.Lcu_begin1: + .long 8 # Length of Unit + .short 4 # DWARF version number + .long 0 # Offset Into Abbrev. Section + .byte 4 # Address Size + .byte 0 # NULL + + .section .debug_gnu_pubnames,"",@progbits + .long 14 + .short 2 # DWARF Version + .long .Lcu_begin0 + .long 12 # Compilation Unit Length + .long 0 + + .long 14 + .short 2 # DWARF Version + .long .Lcu_begin1 + .long 12 # Compilation Unit Length + .long 0 Index: tools/obj2yaml/dwarf2yaml.cpp =================================================================== --- tools/obj2yaml/dwarf2yaml.cpp +++ tools/obj2yaml/dwarf2yaml.cpp @@ -81,8 +81,9 @@ } void dumpPubSection(DWARFContext &DCtx, DWARFYAML::PubSection &Y, - StringRef Section) { - DataExtractor PubSectionData(Section, DCtx.isLittleEndian(), 0); + DWARFSection Section) { + DWARFDataExtractor PubSectionData(DCtx.getDWARFObj(), Section, + DCtx.isLittleEndian(), 0); uint32_t Offset = 0; dumpInitialLength(PubSectionData, Offset, Y.Length); Y.Version = PubSectionData.getU16(&Offset);