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/ProfileData/SampleProf.h"
21#include "llvm/Support/Error.h"
22#include <algorithm>
23#include <cstdint>
24#include <functional>
25#include <map>
26#include <memory>
27#include <vector>
28
29namespace llvm {
30
31namespace sampleprof {
32
33class FunctionSamples;
34
35} // end namespace sampleprof
36
37inline const char *getHotSectionPrefix() { return "hot"; }
38inline const char *getUnlikelySectionPrefix() { return "unlikely"; }
39
40class ProfileSummaryBuilder {
41private:
42  /// We keep track of the number of times a count (block count or samples)
43  /// appears in the profile. The map is kept sorted in the descending order of
44  /// counts.
45  std::map<uint64_t, uint32_t, std::greater<uint64_t>> CountFrequencies;
46  std::vector<uint32_t> DetailedSummaryCutoffs;
47
48protected:
49  SummaryEntryVector DetailedSummary;
50  uint64_t TotalCount = 0;
51  uint64_t MaxCount = 0;
52  uint64_t MaxFunctionCount = 0;
53  uint32_t NumCounts = 0;
54  uint32_t NumFunctions = 0;
55
56  ProfileSummaryBuilder(std::vector<uint32_t> Cutoffs)
57      : DetailedSummaryCutoffs(std::move(Cutoffs)) {}
58  ~ProfileSummaryBuilder() = default;
59
60  inline void addCount(uint64_t Count);
61  void computeDetailedSummary();
62
63public:
64  /// A vector of useful cutoff values for detailed summary.
65  static const ArrayRef<uint32_t> DefaultCutoffs;
66
67  /// Find the summary entry for a desired percentile of counts.
68  static const ProfileSummaryEntry &
69  getEntryForPercentile(const SummaryEntryVector &DS, uint64_t Percentile);
70  static uint64_t getHotCountThreshold(const SummaryEntryVector &DS);
71  static uint64_t getColdCountThreshold(const SummaryEntryVector &DS);
72};
73
74class InstrProfSummaryBuilder final : public ProfileSummaryBuilder {
75  uint64_t MaxInternalBlockCount = 0;
76
77  inline void addEntryCount(uint64_t Count);
78  inline void addInternalCount(uint64_t Count);
79
80public:
81  InstrProfSummaryBuilder(std::vector<uint32_t> Cutoffs)
82      : ProfileSummaryBuilder(std::move(Cutoffs)) {}
83
84  void addRecord(const InstrProfRecord &);
85  std::unique_ptr<ProfileSummary> getSummary();
86};
87
88class SampleProfileSummaryBuilder final : public ProfileSummaryBuilder {
89public:
90  SampleProfileSummaryBuilder(std::vector<uint32_t> Cutoffs)
91      : ProfileSummaryBuilder(std::move(Cutoffs)) {}
92
93  void addRecord(const sampleprof::FunctionSamples &FS,
94                 bool isCallsiteSample = false);
95  std::unique_ptr<ProfileSummary>
96  computeSummaryForProfiles(const sampleprof::SampleProfileMap &Profiles);
97  std::unique_ptr<ProfileSummary> getSummary();
98};
99
100/// This is called when a count is seen in the profile.
101void ProfileSummaryBuilder::addCount(uint64_t Count) {
102  TotalCount += Count;
103  if (Count > MaxCount)
104    MaxCount = Count;
105  NumCounts++;
106  CountFrequencies[Count]++;
107}
108
109} // end namespace llvm
110
111#endif // LLVM_PROFILEDATA_PROFILECOMMON_H
112