Skip to content

Commit

Permalink
[PGO] Unify VP data format between raw and indexed profile (Reader)
Browse files Browse the repository at this point in the history
With the latest refactoring and code sharing patches landed, 
it is possible to unify the value profile implementation between
raw and indexed profile. This is the patch in raw profile reader 
that uses the common interface. 

Differential Revision: http://reviews.llvm.org/D15056

llvm-svn: 254677
  • Loading branch information
david-xl committed Dec 4, 2015
1 parent 7fc3cb5 commit 01cb9bd
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 40 deletions.
13 changes: 11 additions & 2 deletions llvm/include/llvm/ProfileData/InstrProfReader.h
Expand Up @@ -162,10 +162,19 @@ class RawInstrProfReader : public InstrProfReader {
private:
std::error_code readNextHeader(const char *CurrentPos);
std::error_code readHeader(const RawInstrProf::Header &Header);
template <class IntT>
IntT swap(IntT Int) const {
template <class IntT> 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));
}
Expand Down
49 changes: 11 additions & 38 deletions llvm/lib/ProfileData/InstrProfReader.cpp
Expand Up @@ -296,55 +296,28 @@ std::error_code RawInstrProfReader<IntPtrT>::readRawCounts(
}

template <class IntPtrT>
std::error_code RawInstrProfReader<IntPtrT>::readValueProfilingData(
InstrProfRecord &Record) {
std::error_code
RawInstrProfReader<IntPtrT>::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<std::unique_ptr<ValueProfData>> 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<const uint8_t *>(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<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);
}
}
VDataPtrOrErr.get()->deserializeTo(Record, &FunctionPtrToNameMap);
return success();
}

template <class IntPtrT>
std::error_code RawInstrProfReader<IntPtrT>::readNextRecord(
InstrProfRecord &Record) {
std::error_code
RawInstrProfReader<IntPtrT>::readNextRecord(InstrProfRecord &Record) {
if (atEnd())
if (std::error_code EC = readNextHeader(ProfileEnd))
return EC;
Expand Down

0 comments on commit 01cb9bd

Please sign in to comment.