mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-10 13:51:37 +00:00
[PGO] RawProf Reader code cleanup
Add a couple of helper methods to make the primary raw profile reader interface's implementation more readable. It also hides more format details. This patch has no functional change. llvm-svn: 251546
This commit is contained in:
parent
ab633c201f
commit
a9583eda4e
@ -156,6 +156,13 @@ private:
|
||||
IntT swap(IntT Int) const {
|
||||
return ShouldSwapBytes ? sys::getSwappedBytes(Int) : Int;
|
||||
}
|
||||
|
||||
std::error_code readName(InstrProfRecord &Record);
|
||||
std::error_code readFuncHash(InstrProfRecord &Record);
|
||||
std::error_code readRawCounts(InstrProfRecord &Record);
|
||||
bool atEnd() const { return Data == DataEnd; }
|
||||
void advanceData() { Data++; }
|
||||
|
||||
const uint64_t *getCounter(IntPtrT CounterPtr) const {
|
||||
ptrdiff_t Offset = (swap(CounterPtr) - CountersDelta) / sizeof(uint64_t);
|
||||
return CountersStart + Offset;
|
||||
|
@ -220,30 +220,38 @@ std::error_code RawInstrProfReader<IntPtrT>::readHeader(
|
||||
}
|
||||
|
||||
template <class IntPtrT>
|
||||
std::error_code
|
||||
RawInstrProfReader<IntPtrT>::readNextRecord(InstrProfRecord &Record) {
|
||||
if (Data == DataEnd)
|
||||
if (std::error_code EC = readNextHeader(ProfileEnd))
|
||||
return EC;
|
||||
std::error_code RawInstrProfReader<IntPtrT>::readName(InstrProfRecord &Record) {
|
||||
Record.Name = StringRef(getName(Data->NamePtr), swap(Data->NameSize));
|
||||
if (Record.Name.data() < NamesStart ||
|
||||
Record.Name.data() + Record.Name.size() > DataBuffer->getBufferEnd())
|
||||
return error(instrprof_error::malformed);
|
||||
|
||||
// Get the raw data.
|
||||
StringRef RawName(getName(Data->NamePtr), swap(Data->NameSize));
|
||||
return success();
|
||||
}
|
||||
|
||||
template <class IntPtrT>
|
||||
std::error_code RawInstrProfReader<IntPtrT>::readFuncHash(
|
||||
InstrProfRecord &Record) {
|
||||
Record.Hash = swap(Data->FuncHash);
|
||||
return success();
|
||||
}
|
||||
|
||||
template <class IntPtrT>
|
||||
std::error_code RawInstrProfReader<IntPtrT>::readRawCounts(
|
||||
InstrProfRecord &Record) {
|
||||
uint32_t NumCounters = swap(Data->NumCounters);
|
||||
IntPtrT CounterPtr = Data->CounterPtr;
|
||||
if (NumCounters == 0)
|
||||
return error(instrprof_error::malformed);
|
||||
auto RawCounts = makeArrayRef(getCounter(Data->CounterPtr), NumCounters);
|
||||
|
||||
auto RawCounts = makeArrayRef(getCounter(CounterPtr), NumCounters);
|
||||
auto *NamesStartAsCounter = reinterpret_cast<const uint64_t *>(NamesStart);
|
||||
|
||||
// Check bounds.
|
||||
auto *NamesStartAsCounter = reinterpret_cast<const uint64_t *>(NamesStart);
|
||||
if (RawName.data() < NamesStart ||
|
||||
RawName.data() + RawName.size() > DataBuffer->getBufferEnd() ||
|
||||
RawCounts.data() < CountersStart ||
|
||||
if (RawCounts.data() < CountersStart ||
|
||||
RawCounts.data() + RawCounts.size() > NamesStartAsCounter)
|
||||
return error(instrprof_error::malformed);
|
||||
|
||||
// Store the data in Record, byte-swapping as necessary.
|
||||
Record.Hash = swap(Data->FuncHash);
|
||||
Record.Name = RawName;
|
||||
if (ShouldSwapBytes) {
|
||||
Record.Counts.clear();
|
||||
Record.Counts.reserve(RawCounts.size());
|
||||
@ -252,8 +260,26 @@ RawInstrProfReader<IntPtrT>::readNextRecord(InstrProfRecord &Record) {
|
||||
} else
|
||||
Record.Counts = RawCounts;
|
||||
|
||||
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;
|
||||
|
||||
// Iterate.
|
||||
++Data;
|
||||
advanceData();
|
||||
return success();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user