Index: llvm/trunk/include/llvm/ProfileData/InstrProfReader.h =================================================================== --- llvm/trunk/include/llvm/ProfileData/InstrProfReader.h +++ llvm/trunk/include/llvm/ProfileData/InstrProfReader.h @@ -162,10 +162,19 @@ private: std::error_code readNextHeader(const char *CurrentPos); std::error_code readHeader(const RawInstrProf::Header &Header); - template - IntT swap(IntT Int) const { + template IntT swap(IntT Int) const { return ShouldSwapBytes ? sys::getSwappedBytes(Int) : Int; } + support::endianness getDataEndianness() const { + support::endianness HostEndian = getHostEndianness(); + if (!ShouldSwapBytes) + return HostEndian; + if (HostEndian == support::little) + return support::big; + else + return support::little; + } + inline uint8_t getNumPaddingBytes(uint64_t SizeInBytes) { return 7 & (sizeof(uint64_t) - SizeInBytes % sizeof(uint64_t)); } Index: llvm/trunk/lib/ProfileData/InstrProfReader.cpp =================================================================== --- llvm/trunk/lib/ProfileData/InstrProfReader.cpp +++ llvm/trunk/lib/ProfileData/InstrProfReader.cpp @@ -296,55 +296,28 @@ } template -std::error_code RawInstrProfReader::readValueProfilingData( - InstrProfRecord &Record) { +std::error_code +RawInstrProfReader::readValueProfilingData(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); + ErrorOr> VDataPtrOrErr = + ValueProfData::getValueProfData(getValueDataCounts(Data->Values), + (const unsigned char *)ProfileEnd, + getDataEndianness()); - auto VDataCounts = makeArrayRef(getValueDataCounts(Data->Values), NumVSites); - // Check bounds. - if (VDataCounts.data() < ValueDataStart || - VDataCounts.data() + VDataCounts.size() > - reinterpret_cast(ProfileEnd)) - return error(instrprof_error::malformed); + if (VDataPtrOrErr.getError()) + return VDataPtrOrErr.getError(); - 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 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); - } - } + VDataPtrOrErr.get()->deserializeTo(Record, &FunctionPtrToNameMap); return success(); } template -std::error_code RawInstrProfReader::readNextRecord( - InstrProfRecord &Record) { +std::error_code +RawInstrProfReader::readNextRecord(InstrProfRecord &Record) { if (atEnd()) if (std::error_code EC = readNextHeader(ProfileEnd)) return EC;