From ab8c64ccda98184b17873bdb55774458498d862a Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Thu, 12 Nov 2015 01:41:52 +0000 Subject: [PATCH] dwarfdump: Dump the contents of DWP indexes git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252842 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h | 30 +++++- lib/DebugInfo/DWARF/DWARFUnitIndex.cpp | 87 +++++++++++++++++- test/DebugInfo/Inputs/dwarfdump-dwp.x86_64.o | Bin 1904 -> 1976 bytes test/DebugInfo/dwarfdump-dwp.test | 25 +++-- 4 files changed, 121 insertions(+), 21 deletions(-) diff --git a/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h b/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h index 647838217ca..dab7f2918c2 100644 --- a/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h +++ b/include/llvm/DebugInfo/DWARF/DWARFUnitIndex.h @@ -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 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 ColumnKinds; + std::unique_ptr Rows; + + static StringRef getColumnHeader(DwarfSection DS); public: bool parse(DataExtractor IndexData); diff --git a/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp b/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp index 172fb9279d4..a050d82c295 100644 --- a/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp +++ b/lib/DebugInfo/DWARF/DWARFUnitIndex.cpp @@ -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(DataExtractor IndexData, } 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 IndexData) { if (!Header.parse(IndexData, &Offset)) return false; + Rows = llvm::make_unique(Header.NumBuckets); + auto Contribs = + llvm::make_unique(Header.NumUnits); + ColumnKinds = llvm::make_unique(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(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(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'; + } + } +} } diff --git a/test/DebugInfo/Inputs/dwarfdump-dwp.x86_64.o b/test/DebugInfo/Inputs/dwarfdump-dwp.x86_64.o index 3588369af4785a6d244f5e20ca6328be2a548432..2b7ed526ca927a9ba25170880f1be857c2c9f456 100644 GIT binary patch delta 213 zcmeysw}XFz2IG&3ni(7&VP_2XeP)uKc*kYp-N}sJlM5Nug%ubW7+8RqfdMW*xt&qp zz}(VYQ$Zsqrz}^$q^LA6TfxZG$il!tlOa(rxuAd{ks&QVpCJj%PGU$(EZY2tQIB!* z2SyKsF^o(SlPj1VCa+);nS6%XhF1k>i8ByO0kOd5uguX*j2@E%*~~fjFakw@z<=^Y iHghHcrpc$+>^KdWA%Y5%1=-Cx10Zf>SUg#fRUQEKhBw#% delta 152 zcmdnN|AB9U2IGc_ni(8_l5fd8I#6mc@s7*HyOSC1Cl@lRPu{~QCvIk8p{byelT((f zUs6<>m#tuAYGh_%KKUb~*k*1fT}D<$1_lO!$%;(&lMR?uCNE%i0MY`JKQKFN4q)+M zVpN&Dkx72?4mJtS86cHF;0+e}!6w1