[llvm] r252842 - dwarfdump: Dump the contents of DWP indexes
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 11 17:41:53 PST 2015
Author: dblaikie
Date: Wed Nov 11 19:41:52 2015
New Revision: 252842
URL: http://llvm.org/viewvc/llvm-project?rev=252842&view=rev
Log:
dwarfdump: Dump the contents of DWP indexes
Modified:
llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h
llvm/trunk/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp
llvm/trunk/test/DebugInfo/Inputs/dwarfdump-dwp.x86_64.o
llvm/trunk/test/DebugInfo/dwarfdump-dwp.test
Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h?rev=252842&r1=252841&r2=252842&view=diff
==============================================================================
--- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h (original)
+++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h Wed Nov 11 19:41:52 2015
@@ -18,18 +18,42 @@
namespace llvm {
class DWARFUnitIndex {
- class Header {
+ struct Header {
uint32_t Version;
uint32_t NumColumns;
uint32_t NumUnits;
uint32_t NumBuckets;
- public:
bool parse(DataExtractor IndexData, uint32_t *OffsetPtr);
void dump(raw_ostream &OS) const;
};
- class Header Header;
+ struct HashRow {
+ uint64_t Signature;
+ struct SectionContribution {
+ uint32_t Offset;
+ uint32_t Size;
+ };
+ std::unique_ptr<SectionContribution[]> Contributions;
+ };
+
+ enum DwarfSection {
+ DW_SECT_INFO = 1,
+ DW_SECT_TYPES,
+ DW_SECT_ABBREV,
+ DW_SECT_LINE,
+ DW_SECT_LOC,
+ DW_SECT_STR_OFFSETS,
+ DW_SECT_MACINFO,
+ DW_SECT_MACRO,
+ };
+
+ struct Header Header;
+
+ std::unique_ptr<DwarfSection[]> ColumnKinds;
+ std::unique_ptr<HashRow[]> Rows;
+
+ static StringRef getColumnHeader(DwarfSection DS);
public:
bool parse(DataExtractor IndexData);
Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp?rev=252842&r1=252841&r2=252842&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp Wed Nov 11 19:41:52 2015
@@ -9,6 +9,9 @@
#include "llvm/DebugInfo/DWARF/DWARFUnitIndex.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/ErrorHandling.h"
+
namespace llvm {
bool DWARFUnitIndex::Header::parse(DataExtractor IndexData,
@@ -21,10 +24,7 @@ bool DWARFUnitIndex::Header::parse(DataE
}
void DWARFUnitIndex::Header::dump(raw_ostream &OS) const {
- OS << "Index header:\n" << format(" version: %u\n", Version)
- << format(" columns: %u\n", NumColumns)
- << format(" units: %u\n", NumUnits)
- << format(" buckets: %u\n", NumBuckets);
+ OS << format("version = %u slots = %u\n\n", Version, NumBuckets);
}
bool DWARFUnitIndex::parse(DataExtractor IndexData) {
@@ -32,8 +32,85 @@ bool DWARFUnitIndex::parse(DataExtractor
if (!Header.parse(IndexData, &Offset))
return false;
+ Rows = llvm::make_unique<HashRow[]>(Header.NumBuckets);
+ auto Contribs =
+ llvm::make_unique<HashRow::SectionContribution *[]>(Header.NumUnits);
+ ColumnKinds = llvm::make_unique<DwarfSection[]>(Header.NumColumns);
+
+ // Read Hash Table of Signatures
+ for (unsigned i = 0; i != Header.NumBuckets; ++i)
+ Rows[i].Signature = IndexData.getU64(&Offset);
+
+ // Read Parallel Table of Indexes
+ for (unsigned i = 0; i != Header.NumBuckets; ++i) {
+ auto Index = IndexData.getU32(&Offset);
+ if (!Index)
+ continue;
+ Rows[i].Contributions =
+ llvm::make_unique<HashRow::SectionContribution[]>(Header.NumColumns);
+ Contribs[Index - 1] = Rows[i].Contributions.get();
+ }
+
+ // Read the Column Headers
+ for (unsigned i = 0; i != Header.NumColumns; ++i)
+ ColumnKinds[i] = static_cast<DwarfSection>(IndexData.getU32(&Offset));
+
+ // Read Table of Section Offsets
+ for (unsigned i = 0; i != Header.NumUnits; ++i) {
+ auto *Contrib = Contribs[i];
+ for (unsigned i = 0; i != Header.NumColumns; ++i) {
+ Contrib[i].Offset = IndexData.getU32(&Offset);
+ }
+ }
+
+ // Read Table of Section Sizes
+ for (unsigned i = 0; i != Header.NumUnits; ++i) {
+ auto *Contrib = Contribs[i];
+ for (unsigned i = 0; i != Header.NumColumns; ++i) {
+ Contrib[i].Size = IndexData.getU32(&Offset);
+ }
+ }
+
return true;
}
-void DWARFUnitIndex::dump(raw_ostream &OS) const { Header.dump(OS); }
+StringRef DWARFUnitIndex::getColumnHeader(DwarfSection DS) {
+#define CASE(DS) \
+ case DW_SECT_##DS: \
+ return #DS;
+ switch (DS) {
+ CASE(INFO);
+ CASE(TYPES);
+ CASE(ABBREV);
+ CASE(LINE);
+ CASE(LOC);
+ CASE(STR_OFFSETS);
+ CASE(MACINFO);
+ CASE(MACRO);
+ }
+ llvm_unreachable("unknown DwarfSection");
+}
+
+void DWARFUnitIndex::dump(raw_ostream &OS) const {
+ Header.dump(OS);
+ OS << "Index Signature ";
+ for (unsigned i = 0; i != Header.NumColumns; ++i)
+ OS << format(" %-24s", getColumnHeader(ColumnKinds[i]));
+ OS << "\n----- ------------------";
+ for (unsigned i = 0; i != Header.NumColumns; ++i)
+ OS << " ------------------------";
+ OS << '\n';
+ for (unsigned i = 0; i != Header.NumBuckets; ++i) {
+ auto &Row = Rows[i];
+ if (auto *Contribs = Row.Contributions.get()) {
+ OS << format("%5u 0x%016" PRIx64 " ", i, Row.Signature);
+ for (unsigned i = 0; i != Header.NumColumns; ++i) {
+ auto &Contrib = Contribs[i];
+ OS << format("[0x%08u, 0x%08u) ", Contrib.Offset,
+ Contrib.Offset + Contrib.Size);
+ }
+ OS << '\n';
+ }
+ }
+}
}
Modified: llvm/trunk/test/DebugInfo/Inputs/dwarfdump-dwp.x86_64.o
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/Inputs/dwarfdump-dwp.x86_64.o?rev=252842&r1=252841&r2=252842&view=diff
==============================================================================
Binary files llvm/trunk/test/DebugInfo/Inputs/dwarfdump-dwp.x86_64.o (original) and llvm/trunk/test/DebugInfo/Inputs/dwarfdump-dwp.x86_64.o Wed Nov 11 19:41:52 2015 differ
Modified: llvm/trunk/test/DebugInfo/dwarfdump-dwp.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/dwarfdump-dwp.test?rev=252842&r1=252841&r2=252842&view=diff
==============================================================================
--- llvm/trunk/test/DebugInfo/dwarfdump-dwp.test (original)
+++ llvm/trunk/test/DebugInfo/dwarfdump-dwp.test Wed Nov 11 19:41:52 2015
@@ -5,22 +5,21 @@ RUN: llvm-dwarfdump %p/Inputs/dwarfdump-
; struct foo { };
; foo a;
; b.cpp:
-; struct foo { };
-; foo b;
+; struct bar { };
+; bar b;
; CHECK: .debug_cu_index contents:
-; CHECK-NEXT: Index header:
-; CHECK-NEXT: version: 2
-; CHECK-NEXT: columns: 4
-; CHECK-NEXT: units: 2
-; CHECK-NEXT: buckets: 16
+; CHECK-NEXT: version = 2 slots = 16
+; CHECK: Index Signature INFO ABBREV LINE STR_OFFSETS
+; CHECK-NEXT: ----- ------------------ ------------------------ ------------------------ ------------------------ ------------------------
+; CHECK-NEXT: 8 0x03c30756e2d45008 [0x00000000, 0x00000045) [0x00000000, 0x00000067) [0x00000000, 0x00000026) [0x00000000, 0x00000016)
+; CHECK-NEXT: 12 0x9aeb3a61ed48510c [0x00000045, 0x00000090) [0x00000067, 0x00000134) [0x00000026, 0x00000052) [0x00000016, 0x00000032)
; CHECK: .debug_tu_index contents:
-; CHECK-NEXT: Index header:
-; CHECK-NEXT: version: 2
-; CHECK-NEXT: columns: 4
-; CHECK-NEXT: units: 1
-; CHECK-NEXT: buckets: 16
+; CHECK-NEXT: version = 2 slots = 16
+; CHECK: Index Signature TYPES ABBREV LINE STR_OFFSETS
+; CHECK-NEXT: ----- ------------------ ------------------------ ------------------------ ------------------------ ------------------------
+; CHECK-NEXT: 8 0x1d02f3be30cc5688 [0x00000036, 0x00000072) [0x00000067, 0x00000134) [0x00000026, 0x00000052) [0x00000016, 0x00000032)
+; CHECK-NEXT: 12 0x3875c0e21cda63fc [0x00000000, 0x00000036) [0x00000000, 0x00000067) [0x00000000, 0x00000026) [0x00000000, 0x00000016)
-; TODO: dump the index contents
; TODO: use the index section offset info to correctly dump debug_info
More information about the llvm-commits
mailing list