diff options
author | Easwaran Raman <eraman@google.com> | 2016-02-19 03:15:33 +0000 |
---|---|---|
committer | Easwaran Raman <eraman@google.com> | 2016-02-19 03:15:33 +0000 |
commit | 40ee23dbd24e08062b0404d16cd56ab102c4f596 (patch) | |
tree | ed729901bc24eecbf95d3a81028137eecc6e2946 /llvm/lib/ProfileData/SampleProfWriter.cpp | |
parent | bd1b8c088963e7f7ea7417e8a4fe5cabdaf500ad (diff) | |
download | llvm-40ee23dbd24e08062b0404d16cd56ab102c4f596.zip llvm-40ee23dbd24e08062b0404d16cd56ab102c4f596.tar.gz llvm-40ee23dbd24e08062b0404d16cd56ab102c4f596.tar.bz2 |
Add profile summary support for sample profile.
Differential Revision: http://reviews.llvm.org/D17178
llvm-svn: 261304
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 51feee5a..a8c542c 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(); +} |