diff options
Diffstat (limited to 'llvm/include')
-rw-r--r-- | llvm/include/llvm/ProfileData/InstrProf.h | 8 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/ProfileCommon.h | 31 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/SampleProf.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/SampleProfReader.h | 40 | ||||
-rw-r--r-- | llvm/include/llvm/ProfileData/SampleProfWriter.h | 9 |
5 files changed, 80 insertions, 10 deletions
diff --git a/llvm/include/llvm/ProfileData/InstrProf.h b/llvm/include/llvm/ProfileData/InstrProf.h index 56f56c37121..3f3a7e472f6 100644 --- a/llvm/include/llvm/ProfileData/InstrProf.h +++ b/llvm/include/llvm/ProfileData/InstrProf.h @@ -681,14 +681,6 @@ struct Header { uint64_t HashOffset; }; -static const uint32_t SummaryCutoffs[] = { - 10000, /* 1% */ - 100000, /* 10% */ - 200000, 300000, 400000, 500000, 600000, 500000, 600000, 700000, - 800000, 900000, 950000, 990000, 999000, 999900, 999990, 999999}; -static const uint32_t NumSummaryCutoffs = - sizeof(SummaryCutoffs) / sizeof(*SummaryCutoffs); - // Profile summary data recorded in the profile data file in indexed // format. It is introduced in version 4. The summary data follows // right after the profile file header. diff --git a/llvm/include/llvm/ProfileData/ProfileCommon.h b/llvm/include/llvm/ProfileData/ProfileCommon.h index 71031fe73a3..e7d69431542 100644 --- a/llvm/include/llvm/ProfileData/ProfileCommon.h +++ b/llvm/include/llvm/ProfileData/ProfileCommon.h @@ -24,6 +24,9 @@ namespace llvm { namespace IndexedInstrProf { struct Summary; } +namespace sampleprof { +class FunctionSamples; +} struct InstrProfRecord; // The profile summary is one or more (Cutoff, MinCount, NumCounts) triplets. // The semantics of counts depend on the type of profile. For instrumentation @@ -55,12 +58,18 @@ protected: : DetailedSummaryCutoffs(Cutoffs), TotalCount(0), MaxCount(0), NumCounts(0) {} ProfileSummary() : TotalCount(0), MaxCount(0), NumCounts(0) {} + ProfileSummary(std::vector<ProfileSummaryEntry> DetailedSummary, + uint64_t TotalCount, uint64_t MaxCount, uint32_t NumCounts) + : DetailedSummary(DetailedSummary), TotalCount(TotalCount), + MaxCount(MaxCount), NumCounts(NumCounts) {} inline void addCount(uint64_t Count); public: static const int Scale = 1000000; inline std::vector<ProfileSummaryEntry> &getDetailedSummary(); void computeDetailedSummary(); + /// \brief A vector of useful cutoff values for detailed summary. + static const std::vector<uint32_t> DefaultCutoffs; }; class InstrProfSummary : public ProfileSummary { @@ -83,6 +92,28 @@ public: uint64_t getMaxInternalBlockCount() { return MaxInternalBlockCount; } }; +class SampleProfileSummary : public ProfileSummary { + uint64_t MaxHeadSamples; + uint32_t NumFunctions; + +public: + uint32_t getNumLinesWithSamples() { return NumCounts; } + uint64_t getTotalSamples() { return TotalCount; } + uint32_t getNumFunctions() { return NumFunctions; } + uint64_t getMaxHeadSamples() { return MaxHeadSamples; } + uint64_t getMaxSamplesPerLine() { return MaxCount; } + void addRecord(const sampleprof::FunctionSamples &FS); + SampleProfileSummary(std::vector<uint32_t> Cutoffs) + : ProfileSummary(Cutoffs), MaxHeadSamples(0), NumFunctions(0) {} + SampleProfileSummary(uint64_t TotalSamples, uint64_t MaxSamplesPerLine, + uint64_t MaxHeadSamples, int32_t NumLinesWithSamples, + uint32_t NumFunctions, + std::vector<ProfileSummaryEntry> DetailedSummary) + : ProfileSummary(DetailedSummary, TotalSamples, MaxSamplesPerLine, + NumLinesWithSamples), + MaxHeadSamples(MaxHeadSamples), NumFunctions(NumFunctions) {} +}; + // This is called when a count is seen in the profile. void ProfileSummary::addCount(uint64_t Count) { TotalCount += Count; diff --git a/llvm/include/llvm/ProfileData/SampleProf.h b/llvm/include/llvm/ProfileData/SampleProf.h index 6c39cf9458d..a4223b4f216 100644 --- a/llvm/include/llvm/ProfileData/SampleProf.h +++ b/llvm/include/llvm/ProfileData/SampleProf.h @@ -74,7 +74,7 @@ static inline uint64_t SPMagic() { uint64_t('2') << (64 - 56) | uint64_t(0xff); } -static inline uint64_t SPVersion() { return 102; } +static inline uint64_t SPVersion() { return 103; } /// Represents the relative location of an instruction. /// diff --git a/llvm/include/llvm/ProfileData/SampleProfReader.h b/llvm/include/llvm/ProfileData/SampleProfReader.h index 6db0fbb0e7a..eb4bcc57312 100644 --- a/llvm/include/llvm/ProfileData/SampleProfReader.h +++ b/llvm/include/llvm/ProfileData/SampleProfReader.h @@ -129,6 +129,30 @@ // VERSION (uint32_t) // File format version number computed by SPVersion() // +// SUMMARY +// TOTAL_COUNT (uint64_t) +// Total number of samples in the profile. +// MAX_COUNT (uint64_t) +// Maximum value of samples on a line. +// MAX_HEAD_SAMPLES (uint64_t) +// Maximum number of head samples. +// NUM_COUNTS (uint64_t) +// Number of lines with samples. +// NUM_FUNCTIONS (uint64_t) +// Number of functions with samples. +// NUM_DETAILED_SUMMARY_ENTRIES (size_t) +// Number of entries in detailed summary +// DETAILED_SUMMARY +// A list of detailed summary entry. Each entry consists of +// CUTOFF (uint32_t) +// Required percentile of total sample count expressed as a fraction +// multiplied by 1000000. +// MIN_COUNT (uint64_t) +// The minimum number of samples required to reach the target +// CUTOFF. +// NUM_COUNTS (uint64_t) +// Number of samples to get to the desrired percentile. +// // NAME TABLE // SIZE (uint32_t) // Number of entries in the name table. @@ -190,6 +214,7 @@ #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/Function.h" #include "llvm/IR/LLVMContext.h" +#include "llvm/ProfileData/ProfileCommon.h" #include "llvm/ProfileData/SampleProf.h" #include "llvm/Support/Debug.h" #include "llvm/Support/ErrorHandling.h" @@ -270,6 +295,9 @@ public: static ErrorOr<std::unique_ptr<SampleProfileReader>> create(std::unique_ptr<MemoryBuffer> &B, LLVMContext &C); + /// \brief Return the profile summary. + SampleProfileSummary &getSummary() { return *(Summary.get()); } + protected: /// \brief Map every function to its associated profile. /// @@ -283,6 +311,12 @@ protected: /// \brief Memory buffer holding the profile file. std::unique_ptr<MemoryBuffer> Buffer; + + /// \brief Profile summary information. + std::unique_ptr<SampleProfileSummary> Summary; + + /// \brief Compute summary for this profile. + void computeSummary(); }; class SampleProfileReaderText : public SampleProfileReader { @@ -348,6 +382,12 @@ protected: /// Function name table. std::vector<StringRef> NameTable; + +private: + std::error_code readSummaryEntry(std::vector<ProfileSummaryEntry> &Entries); + + /// \brief Read profile summary. + std::error_code readSummary(); }; typedef SmallVector<FunctionSamples *, 10> InlineCallStack; diff --git a/llvm/include/llvm/ProfileData/SampleProfWriter.h b/llvm/include/llvm/ProfileData/SampleProfWriter.h index 029dd2ebacb..03bbf481bec 100644 --- a/llvm/include/llvm/ProfileData/SampleProfWriter.h +++ b/llvm/include/llvm/ProfileData/SampleProfWriter.h @@ -15,6 +15,7 @@ #include "llvm/ADT/MapVector.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ProfileData/ProfileCommon.h" #include "llvm/ProfileData/SampleProf.h" #include "llvm/Support/ErrorOr.h" #include "llvm/Support/FileSystem.h" @@ -42,7 +43,6 @@ public: std::error_code write(const StringMap<FunctionSamples> &ProfileMap) { if (std::error_code EC = writeHeader(ProfileMap)) return EC; - for (const auto &I : ProfileMap) { StringRef FName = I.first(); const FunctionSamples &Profile = I.second; @@ -75,6 +75,12 @@ protected: /// \brief Output stream where to emit the profile to. std::unique_ptr<raw_ostream> OutputStream; + + /// \brief Profile summary. + std::unique_ptr<SampleProfileSummary> Summary; + + /// \brief Compute summary for this profile. + void computeSummary(const StringMap<FunctionSamples> &ProfileMap); }; /// \brief Sample-based profile writer (text format). @@ -113,6 +119,7 @@ protected: std::error_code writeHeader(const StringMap<FunctionSamples> &ProfileMap) override; + std::error_code writeSummary(); std::error_code writeNameIdx(StringRef FName); std::error_code writeBody(StringRef FName, const FunctionSamples &S); |