Add profile summary support for sample profile.
Differential Revision: http://reviews.llvm.org/D17178 llvm-svn: 261304
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
|
||||
#include "llvm/ProfileData/SampleProfReader.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorOr.h"
|
||||
@@ -220,6 +221,8 @@ std::error_code SampleProfileReaderText::read() {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Result == sampleprof_error::success)
|
||||
computeSummary();
|
||||
|
||||
return Result;
|
||||
}
|
||||
@@ -400,6 +403,9 @@ std::error_code SampleProfileReaderBinary::readHeader() {
|
||||
else if (*Version != SPVersion())
|
||||
return sampleprof_error::unsupported_version;
|
||||
|
||||
if (std::error_code EC = readSummary())
|
||||
return EC;
|
||||
|
||||
// Read the name table.
|
||||
auto Size = readNumber<uint32_t>();
|
||||
if (std::error_code EC = Size.getError())
|
||||
@@ -415,6 +421,62 @@ std::error_code SampleProfileReaderBinary::readHeader() {
|
||||
return sampleprof_error::success;
|
||||
}
|
||||
|
||||
std::error_code SampleProfileReaderBinary::readSummaryEntry(
|
||||
std::vector<ProfileSummaryEntry> &Entries) {
|
||||
auto Cutoff = readNumber<uint64_t>();
|
||||
if (std::error_code EC = Cutoff.getError())
|
||||
return EC;
|
||||
|
||||
auto MinBlockCount = readNumber<uint64_t>();
|
||||
if (std::error_code EC = MinBlockCount.getError())
|
||||
return EC;
|
||||
|
||||
auto NumBlocks = readNumber<uint64_t>();
|
||||
if (std::error_code EC = NumBlocks.getError())
|
||||
return EC;
|
||||
|
||||
Entries.emplace_back(*Cutoff, *MinBlockCount, *NumBlocks);
|
||||
return sampleprof_error::success;
|
||||
}
|
||||
|
||||
std::error_code SampleProfileReaderBinary::readSummary() {
|
||||
auto TotalCount = readNumber<uint64_t>();
|
||||
if (std::error_code EC = TotalCount.getError())
|
||||
return EC;
|
||||
|
||||
auto MaxBlockCount = readNumber<uint64_t>();
|
||||
if (std::error_code EC = MaxBlockCount.getError())
|
||||
return EC;
|
||||
|
||||
auto MaxFunctionCount = readNumber<uint64_t>();
|
||||
if (std::error_code EC = MaxFunctionCount.getError())
|
||||
return EC;
|
||||
|
||||
auto NumBlocks = readNumber<uint64_t>();
|
||||
if (std::error_code EC = NumBlocks.getError())
|
||||
return EC;
|
||||
|
||||
auto NumFunctions = readNumber<uint64_t>();
|
||||
if (std::error_code EC = NumFunctions.getError())
|
||||
return EC;
|
||||
|
||||
auto NumSummaryEntries = readNumber<uint64_t>();
|
||||
if (std::error_code EC = NumSummaryEntries.getError())
|
||||
return EC;
|
||||
|
||||
std::vector<ProfileSummaryEntry> Entries;
|
||||
for (unsigned i = 0; i < *NumSummaryEntries; i++) {
|
||||
std::error_code EC = readSummaryEntry(Entries);
|
||||
if (EC != sampleprof_error::success)
|
||||
return EC;
|
||||
}
|
||||
Summary = llvm::make_unique<SampleProfileSummary>(
|
||||
*TotalCount, *MaxBlockCount, *MaxFunctionCount, *NumBlocks, *NumFunctions,
|
||||
Entries);
|
||||
|
||||
return sampleprof_error::success;
|
||||
}
|
||||
|
||||
bool SampleProfileReaderBinary::hasFormat(const MemoryBuffer &Buffer) {
|
||||
const uint8_t *Data =
|
||||
reinterpret_cast<const uint8_t *>(Buffer.getBufferStart());
|
||||
@@ -518,6 +580,7 @@ std::error_code SampleProfileReaderGCC::readFunctionProfiles() {
|
||||
if (std::error_code EC = readOneFunctionProfile(Stack, true, 0))
|
||||
return EC;
|
||||
|
||||
computeSummary();
|
||||
return sampleprof_error::success;
|
||||
}
|
||||
|
||||
@@ -725,3 +788,14 @@ SampleProfileReader::create(std::unique_ptr<MemoryBuffer> &B, LLVMContext &C) {
|
||||
|
||||
return std::move(Reader);
|
||||
}
|
||||
|
||||
// For text and GCC file formats, we compute the summary after reading the
|
||||
// profile. Binary format has the profile summary in its header.
|
||||
void SampleProfileReader::computeSummary() {
|
||||
Summary.reset(new SampleProfileSummary(ProfileSummary::DefaultCutoffs));
|
||||
for (const auto &I : Profiles) {
|
||||
const FunctionSamples &Profile = I.second;
|
||||
Summary->addRecord(Profile);
|
||||
}
|
||||
Summary->computeDetailedSummary();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user