bool InstrProfLookupTrait::ReadValueProfilingData(
const unsigned char *&D, const unsigned char *const End) {
+ ErrorOr<std::unique_ptr<IndexedInstrProf::ValueProfData>> VDataPtrOrErr =
+ IndexedInstrProf::ValueProfData::getValueProfData(
+ D, End, ValueProfDataEndianness);
- using namespace support;
- // Read number of value kinds with value sites.
- if (D + sizeof(uint64_t) > End)
+ if (VDataPtrOrErr.getError())
return false;
- uint64_t ValueKindCount = endian::readNext<uint64_t, little, unaligned>(D);
-
- InstrProfRecord &ProfRecord = DataBuffer.back();
- for (uint32_t Kind = 0; Kind < ValueKindCount; ++Kind) {
-
- // Read value kind and number of value sites for kind.
- if (D + 2 * sizeof(uint64_t) > End)
- return false;
-
- uint64_t ValueKind = endian::readNext<uint64_t, little, unaligned>(D);
- uint64_t ValueSiteCount = endian::readNext<uint64_t, little, unaligned>(D);
- ProfRecord.reserveSites(ValueKind, ValueSiteCount);
+ VDataPtrOrErr.get()->deserializeTo(DataBuffer.back(), &HashKeys);
+ D += VDataPtrOrErr.get()->TotalSize;
- for (uint64_t VSite = 0; VSite < ValueSiteCount; ++VSite) {
- // Read number of value data pairs at value site.
- if (D + sizeof(uint64_t) > End)
- return false;
-
- uint64_t ValueDataCount =
- endian::readNext<uint64_t, little, unaligned>(D);
-
- // Check if there are as many ValueDataPairs as ValueDataCount in memory.
- if (D + (ValueDataCount << 1) * sizeof(uint64_t) > End)
- return false;
-
- std::unique_ptr<InstrProfValueData[]> VDataPtr(
- ValueDataCount == 0 ? nullptr
- : new InstrProfValueData[ValueDataCount]);
-
- for (uint64_t VCount = 0; VCount < ValueDataCount; ++VCount) {
- VDataPtr[VCount].Value =
- endian::readNext<uint64_t, little, unaligned>(D);
- VDataPtr[VCount].Count =
- endian::readNext<uint64_t, little, unaligned>(D);
- }
- ProfRecord.addValueData(ValueKind, VSite, VDataPtr.get(), ValueDataCount,
- &HashKeys);
- }
- }
return true;
}