From e38825f490b898644089d5cd9cb90cec681bded8 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Tue, 12 Feb 2013 16:20:28 +0000 Subject: [PATCH] Add support for the pubnames section to llvm-dwarfdump. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174976 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/DebugInfo/DIContext.h | 1 + lib/DebugInfo/DWARFContext.cpp | 20 ++++++++++++++++++++ lib/DebugInfo/DWARFContext.h | 3 +++ tools/llvm-dwarfdump/llvm-dwarfdump.cpp | 1 + 4 files changed, 25 insertions(+) diff --git a/include/llvm/DebugInfo/DIContext.h b/include/llvm/DebugInfo/DIContext.h index 679b490caf8..8fcd9e0b824 100644 --- a/include/llvm/DebugInfo/DIContext.h +++ b/include/llvm/DebugInfo/DIContext.h @@ -106,6 +106,7 @@ enum DIDumpType { DIDT_InfoDwo, DIDT_Line, DIDT_Ranges, + DIDT_Pubnames, DIDT_Str, DIDT_StrDwo, DIDT_StrOffsetsDwo diff --git a/lib/DebugInfo/DWARFContext.cpp b/lib/DebugInfo/DWARFContext.cpp index d061f4e1f8e..9e19310a99c 100644 --- a/lib/DebugInfo/DWARFContext.cpp +++ b/lib/DebugInfo/DWARFContext.cpp @@ -88,6 +88,24 @@ 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_AbbrevDwo) { OS << "\n.debug_abbrev.dwo contents:\n"; getDebugAbbrevDWO()->dump(OS); @@ -494,6 +512,8 @@ DWARFContextInMemory::DWARFContextInMemory(object::ObjectFile *Obj) : RangeDWOSection = data; RangeSection = data; } + else if (name == "debug_pubnames") + PubNamesSection = data; else if (name == "debug_info.dwo") InfoDWOSection = data; else if (name == "debug_abbrev.dwo") diff --git a/lib/DebugInfo/DWARFContext.h b/lib/DebugInfo/DWARFContext.h index f12a05479be..37b272993f3 100644 --- a/lib/DebugInfo/DWARFContext.h +++ b/lib/DebugInfo/DWARFContext.h @@ -111,6 +111,7 @@ public: virtual StringRef getLineSection() = 0; virtual StringRef getStringSection() = 0; virtual StringRef getRangeSection() = 0; + virtual StringRef getPubNamesSection() = 0; // Sections for DWARF5 split dwarf proposal. virtual StringRef getInfoDWOSection() = 0; @@ -149,6 +150,7 @@ class DWARFContextInMemory : public DWARFContext { StringRef LineSection; StringRef StringSection; StringRef RangeSection; + StringRef PubNamesSection; // Sections for DWARF5 split dwarf proposal. RelocAddrMap InfoDWORelocMap; @@ -172,6 +174,7 @@ public: virtual StringRef getLineSection() { return LineSection; } virtual StringRef getStringSection() { return StringSection; } virtual StringRef getRangeSection() { return RangeSection; } + virtual StringRef getPubNamesSection() { return PubNamesSection; } // Sections for DWARF5 split dwarf proposal. virtual StringRef getInfoDWOSection() { return InfoDWOSection; } diff --git a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp index 290f3a66185..80948560ca9 100644 --- a/tools/llvm-dwarfdump/llvm-dwarfdump.cpp +++ b/tools/llvm-dwarfdump/llvm-dwarfdump.cpp @@ -65,6 +65,7 @@ DumpType("debug-dump", cl::init(DIDT_All), clEnumValN(DIDT_Line, "line", ".debug_line"), clEnumValN(DIDT_Frames, "frames", ".debug_frame"), clEnumValN(DIDT_Ranges, "ranges", ".debug_ranges"), + clEnumValN(DIDT_Pubnames, "pubnames", ".debug_pubnames"), clEnumValN(DIDT_Str, "str", ".debug_str"), clEnumValN(DIDT_StrDwo, "str.dwo", ".debug_str.dwo"), clEnumValN(DIDT_StrOffsetsDwo, "str_offsets.dwo", ".debug_str_offsets.dwo"),