diff options
Diffstat (limited to 'llvm/lib/ProfileData/SampleProfWriter.cpp')
-rw-r--r-- | llvm/lib/ProfileData/SampleProfWriter.cpp | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/llvm/lib/ProfileData/SampleProfWriter.cpp b/llvm/lib/ProfileData/SampleProfWriter.cpp index 51feee5ad7d..a8c542cf200 100644 --- a/llvm/lib/ProfileData/SampleProfWriter.cpp +++ b/llvm/lib/ProfileData/SampleProfWriter.cpp @@ -120,6 +120,10 @@ std::error_code SampleProfileWriterBinary::writeHeader( encodeULEB128(SPMagic(), OS); encodeULEB128(SPVersion(), OS); + computeSummary(ProfileMap); + if (auto EC = writeSummary()) + return EC; + // Generate the name table for all the functions referenced in the profile. for (const auto &I : ProfileMap) { addName(I.first()); @@ -132,10 +136,25 @@ std::error_code SampleProfileWriterBinary::writeHeader( OS << N.first; encodeULEB128(0, OS); } - return sampleprof_error::success; } +std::error_code SampleProfileWriterBinary::writeSummary() { + auto &OS = *OutputStream; + encodeULEB128(Summary->getTotalSamples(), OS); + encodeULEB128(Summary->getMaxSamplesPerLine(), OS); + encodeULEB128(Summary->getMaxHeadSamples(), OS); + encodeULEB128(Summary->getNumLinesWithSamples(), OS); + encodeULEB128(Summary->getNumFunctions(), OS); + std::vector<ProfileSummaryEntry> &Entries = Summary->getDetailedSummary(); + encodeULEB128(Entries.size(), OS); + for (auto Entry : Entries) { + encodeULEB128(Entry.Cutoff, OS); + encodeULEB128(Entry.MinCount, OS); + encodeULEB128(Entry.NumCounts, OS); + } + return sampleprof_error::success; +} std::error_code SampleProfileWriterBinary::writeBody(StringRef FName, const FunctionSamples &S) { auto &OS = *OutputStream; @@ -238,3 +257,13 @@ SampleProfileWriter::create(std::unique_ptr<raw_ostream> &OS, return std::move(Writer); } + +void SampleProfileWriter::computeSummary( + const StringMap<FunctionSamples> &ProfileMap) { + Summary.reset(new SampleProfileSummary(ProfileSummary::DefaultCutoffs)); + for (const auto &I : ProfileMap) { + const FunctionSamples &Profile = I.second; + Summary->addRecord(Profile); + } + Summary->computeDetailedSummary(); +} |