summaryrefslogtreecommitdiffstats
path: root/llvm/include
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/include')
-rw-r--r--llvm/include/llvm/ProfileData/InstrProf.h8
-rw-r--r--llvm/include/llvm/ProfileData/ProfileCommon.h31
-rw-r--r--llvm/include/llvm/ProfileData/SampleProf.h2
-rw-r--r--llvm/include/llvm/ProfileData/SampleProfReader.h40
-rw-r--r--llvm/include/llvm/ProfileData/SampleProfWriter.h9
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);
OpenPOWER on IntegriCloud