+ return success();
+}
+
+template <class IntPtrT>
+std::error_code RawInstrProfReader<IntPtrT>::readValueData(
+ InstrProfRecord &Record) {
+
+ Record.clearValueData();
+ if (!Data->Values || (ValueDataDelta == 0))
+ return success();
+
+ // Read value data.
+ uint64_t NumVSites = 0;
+ for (uint32_t Kind = IPVK_First; Kind <= ValueKindLast; ++Kind)
+ NumVSites += swap(Data->NumValueSites[Kind]);
+ NumVSites += getNumPaddingBytes(NumVSites);
+
+ auto VDataCounts = makeArrayRef(getValueDataCounts(Data->Values), NumVSites);
+ // Check bounds.
+ if (VDataCounts.data() < ValueDataStart ||
+ VDataCounts.data() + VDataCounts.size() >
+ reinterpret_cast<const uint8_t *>(ProfileEnd))
+ return error(instrprof_error::malformed);
+
+ const InstrProfValueData *VDataPtr =
+ getValueData(swap(Data->Values) + NumVSites);
+ for (uint32_t Kind = IPVK_First; Kind <= ValueKindLast; ++Kind) {
+ NumVSites = swap(Data->NumValueSites[Kind]);
+ Record.reserveSites(Kind, NumVSites);
+ for (uint32_t VSite = 0; VSite < NumVSites; ++VSite) {
+
+ uint32_t VDataCount = VDataCounts[VSite];
+ if ((const char *)(VDataPtr + VDataCount) > ProfileEnd)
+ return error(instrprof_error::malformed);
+
+ std::vector<InstrProfValueData> CurrentValues;
+ CurrentValues.reserve(VDataCount);
+ for (uint32_t VIndex = 0; VIndex < VDataCount; ++VIndex) {
+ uint64_t TargetValue = swap(VDataPtr->Value);
+ uint64_t Count = swap(VDataPtr->Count);
+ CurrentValues.push_back({TargetValue, Count});
+ ++VDataPtr;
+ }
+ Record.addValueData(Kind, VSite, CurrentValues.data(),
+ VDataCount, &FunctionPtrToNameMap);
+ }
+ }
+ return success();
+}
+
+template <class IntPtrT>
+std::error_code RawInstrProfReader<IntPtrT>::readNextRecord(
+ InstrProfRecord &Record) {
+ if (atEnd())
+ if (std::error_code EC = readNextHeader(ProfileEnd))
+ return EC;
+
+ // Read name ad set it in Record.
+ if (std::error_code EC = readName(Record))
+ return EC;
+
+ // Read FuncHash and set it in Record.
+ if (std::error_code EC = readFuncHash(Record))
+ return EC;
+
+ // Read raw counts and set Record.
+ if (std::error_code EC = readRawCounts(Record))
+ return EC;
+
+ // Read value data and set Record.
+ if (std::error_code EC = readValueData(Record)) return EC;
+