1//===- ProfileCommon.h - Common profiling APIs. -----------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file contains data structures and functions common to both instrumented 10// and sample profiling. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_PROFILEDATA_PROFILECOMMON_H 15#define LLVM_PROFILEDATA_PROFILECOMMON_H 16 17#include "llvm/ADT/ArrayRef.h" 18#include "llvm/IR/ProfileSummary.h" 19#include "llvm/ProfileData/InstrProf.h" 20#include "llvm/Support/Error.h" 21#include <algorithm> 22#include <cstdint> 23#include <functional> 24#include <map> 25#include <memory> 26#include <vector> 27 28namespace llvm { 29 30namespace sampleprof { 31 32class FunctionSamples; 33 34} // end namespace sampleprof 35 36inline const char *getHotSectionPrefix() { return ".hot"; } 37inline const char *getUnlikelySectionPrefix() { return ".unlikely"; } 38 39class ProfileSummaryBuilder { 40private: 41 /// We keep track of the number of times a count (block count or samples) 42 /// appears in the profile. The map is kept sorted in the descending order of 43 /// counts. 44 std::map<uint64_t, uint32_t, std::greater<uint64_t>> CountFrequencies; 45 std::vector<uint32_t> DetailedSummaryCutoffs; 46 47protected: 48 SummaryEntryVector DetailedSummary; 49 uint64_t TotalCount = 0; 50 uint64_t MaxCount = 0; 51 uint64_t MaxFunctionCount = 0; 52 uint32_t NumCounts = 0; 53 uint32_t NumFunctions = 0; 54 55 ProfileSummaryBuilder(std::vector<uint32_t> Cutoffs) 56 : DetailedSummaryCutoffs(std::move(Cutoffs)) {} 57 ~ProfileSummaryBuilder() = default; 58 59 inline void addCount(uint64_t Count); 60 void computeDetailedSummary(); 61 62public: 63 /// A vector of useful cutoff values for detailed summary. 64 static const ArrayRef<uint32_t> DefaultCutoffs; 65}; 66 67class InstrProfSummaryBuilder final : public ProfileSummaryBuilder { 68 uint64_t MaxInternalBlockCount = 0; 69 70 inline void addEntryCount(uint64_t Count); 71 inline void addInternalCount(uint64_t Count); 72 73public: 74 InstrProfSummaryBuilder(std::vector<uint32_t> Cutoffs) 75 : ProfileSummaryBuilder(std::move(Cutoffs)) {} 76 77 void addRecord(const InstrProfRecord &); 78 std::unique_ptr<ProfileSummary> getSummary(); 79}; 80 81class SampleProfileSummaryBuilder final : public ProfileSummaryBuilder { 82public: 83 SampleProfileSummaryBuilder(std::vector<uint32_t> Cutoffs) 84 : ProfileSummaryBuilder(std::move(Cutoffs)) {} 85 86 void addRecord(const sampleprof::FunctionSamples &FS, 87 bool isCallsiteSample = false); 88 std::unique_ptr<ProfileSummary> getSummary(); 89}; 90 91/// This is called when a count is seen in the profile. 92void ProfileSummaryBuilder::addCount(uint64_t Count) { 93 TotalCount += Count; 94 if (Count > MaxCount) 95 MaxCount = Count; 96 NumCounts++; 97 CountFrequencies[Count]++; 98} 99 100} // end namespace llvm 101 102#endif // LLVM_PROFILEDATA_PROFILECOMMON_H 103