}
void DWARFUnitIndex::Header::dump(raw_ostream &OS) const {
- OS << format("version = %u slots = %u\n\n", Version, NumBuckets);
+ OS << "Index header:\n" << format(" version: %u\n", Version)
+ << format(" columns: %u\n", NumColumns)
+ << format(" units: %u\n", NumUnits)
+ << format(" buckets: %u\n", NumBuckets);
}
bool DWARFUnitIndex::parse(DataExtractor IndexData) {
(2 * Header.NumUnits + 1) * 4 * Header.NumColumns))
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);
- 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';
- }
- }
}
+
}
; bar b;
; CHECK: .debug_cu_index contents:
-; 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-NEXT: Index header:
+; CHECK-NEXT: version: 2
+; CHECK-NEXT: columns: 4
+; CHECK-NEXT: units: 2
+; CHECK-NEXT: buckets: 16
; CHECK: .debug_tu_index contents:
-; 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)
+; CHECK-NEXT: Index header:
+; CHECK-NEXT: version: 2
+; CHECK-NEXT: columns: 4
+; CHECK-NEXT: units: 2
+; CHECK-NEXT: buckets: 16
; TODO: use the index section offset info to correctly dump debug_info