//===- ProfileCommon.h - Common profiling APIs. -----------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file contains data structures and functions common to both instrumented // and sample profiling. // //===----------------------------------------------------------------------===// #ifndef LLVM_PROFILEDATA_PROFILECOMMON_H #define LLVM_PROFILEDATA_PROFILECOMMON_H #include "llvm/ADT/ArrayRef.h" #include "llvm/IR/ProfileSummary.h" #include "llvm/ProfileData/InstrProf.h" #include "llvm/ProfileData/SampleProf.h" #include "llvm/Support/Error.h" #include #include #include #include #include #include namespace llvm { namespace sampleprof { class FunctionSamples; } // end namespace sampleprof inline const char *getHotSectionPrefix() { return "hot"; } inline const char *getUnlikelySectionPrefix() { return "unlikely"; } class ProfileSummaryBuilder { private: /// We keep track of the number of times a count (block count or samples) /// appears in the profile. The map is kept sorted in the descending order of /// counts. std::map> CountFrequencies; std::vector DetailedSummaryCutoffs; protected: SummaryEntryVector DetailedSummary; uint64_t TotalCount = 0; uint64_t MaxCount = 0; uint64_t MaxFunctionCount = 0; uint32_t NumCounts = 0; uint32_t NumFunctions = 0; ProfileSummaryBuilder(std::vector Cutoffs) : DetailedSummaryCutoffs(std::move(Cutoffs)) {} ~ProfileSummaryBuilder() = default; inline void addCount(uint64_t Count); void computeDetailedSummary(); public: /// A vector of useful cutoff values for detailed summary. static const ArrayRef DefaultCutoffs; /// Find the summary entry for a desired percentile of counts. static const ProfileSummaryEntry & getEntryForPercentile(SummaryEntryVector &DS, uint64_t Percentile); }; class InstrProfSummaryBuilder final : public ProfileSummaryBuilder { uint64_t MaxInternalBlockCount = 0; inline void addEntryCount(uint64_t Count); inline void addInternalCount(uint64_t Count); public: InstrProfSummaryBuilder(std::vector Cutoffs) : ProfileSummaryBuilder(std::move(Cutoffs)) {} void addRecord(const InstrProfRecord &); std::unique_ptr getSummary(); }; class SampleProfileSummaryBuilder final : public ProfileSummaryBuilder { public: SampleProfileSummaryBuilder(std::vector Cutoffs) : ProfileSummaryBuilder(std::move(Cutoffs)) {} void addRecord(const sampleprof::FunctionSamples &FS, bool isCallsiteSample = false); std::unique_ptr computeSummaryForProfiles( const StringMap &Profiles); std::unique_ptr getSummary(); }; /// This is called when a count is seen in the profile. void ProfileSummaryBuilder::addCount(uint64_t Count) { TotalCount += Count; if (Count > MaxCount) MaxCount = Count; NumCounts++; CountFrequencies[Count]++; } } // end namespace llvm #endif // LLVM_PROFILEDATA_PROFILECOMMON_H