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