+ 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);
+ }
+ }
+