| //===- ProfileSummary.h - Profile summary data structure. -------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines the profile summary data structure. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_IR_PROFILESUMMARY_H |
| #define LLVM_IR_PROFILESUMMARY_H |
| |
| #include <algorithm> |
| #include <cstdint> |
| #include <vector> |
| |
| namespace llvm { |
| |
| class LLVMContext; |
| class Metadata; |
| |
| // The profile summary is one or more (Cutoff, MinCount, NumCounts) triplets. |
| // The semantics of counts depend on the type of profile. For instrumentation |
| // profile, counts are block counts and for sample profile, counts are |
| // per-line samples. Given a target counts percentile, we compute the minimum |
| // number of counts needed to reach this target and the minimum among these |
| // counts. |
| struct ProfileSummaryEntry { |
| uint32_t Cutoff; ///< The required percentile of counts. |
| uint64_t MinCount; ///< The minimum count for this percentile. |
| uint64_t NumCounts; ///< Number of counts >= the minimum count. |
| |
| ProfileSummaryEntry(uint32_t TheCutoff, uint64_t TheMinCount, |
| uint64_t TheNumCounts) |
| : Cutoff(TheCutoff), MinCount(TheMinCount), NumCounts(TheNumCounts) {} |
| }; |
| |
| using SummaryEntryVector = std::vector<ProfileSummaryEntry>; |
| |
| class ProfileSummary { |
| public: |
| enum Kind { PSK_Instr, PSK_Sample }; |
| |
| private: |
| const Kind PSK; |
| static const char *KindStr[2]; |
| SummaryEntryVector DetailedSummary; |
| uint64_t TotalCount, MaxCount, MaxInternalCount, MaxFunctionCount; |
| uint32_t NumCounts, NumFunctions; |
| /// Return detailed summary as metadata. |
| Metadata *getDetailedSummaryMD(LLVMContext &Context); |
| |
| public: |
| static const int Scale = 1000000; |
| |
| ProfileSummary(Kind K, SummaryEntryVector DetailedSummary, |
| uint64_t TotalCount, uint64_t MaxCount, |
| uint64_t MaxInternalCount, uint64_t MaxFunctionCount, |
| uint32_t NumCounts, uint32_t NumFunctions) |
| : PSK(K), DetailedSummary(std::move(DetailedSummary)), |
| TotalCount(TotalCount), MaxCount(MaxCount), |
| MaxInternalCount(MaxInternalCount), MaxFunctionCount(MaxFunctionCount), |
| NumCounts(NumCounts), NumFunctions(NumFunctions) {} |
| |
| Kind getKind() const { return PSK; } |
| /// Return summary information as metadata. |
| Metadata *getMD(LLVMContext &Context); |
| /// Construct profile summary from metdata. |
| static ProfileSummary *getFromMD(Metadata *MD); |
| SummaryEntryVector &getDetailedSummary() { return DetailedSummary; } |
| uint32_t getNumFunctions() { return NumFunctions; } |
| uint64_t getMaxFunctionCount() { return MaxFunctionCount; } |
| uint32_t getNumCounts() { return NumCounts; } |
| uint64_t getTotalCount() { return TotalCount; } |
| uint64_t getMaxCount() { return MaxCount; } |
| uint64_t getMaxInternalCount() { return MaxInternalCount; } |
| }; |
| |
| } // end namespace llvm |
| |
| #endif // LLVM_IR_PROFILESUMMARY_H |