1 //===- ProfileCommon.h - Common profiling APIs. -----------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file contains data structures and functions common to both instrumented
10 // and sample profiling.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_PROFILEDATA_PROFILECOMMON_H
15 #define LLVM_PROFILEDATA_PROFILECOMMON_H
17 #include "llvm/ADT/ArrayRef.h"
18 #include "llvm/IR/ProfileSummary.h"
19 #include "llvm/ProfileData/InstrProf.h"
20 #include "llvm/Support/Error.h"
30 namespace sampleprof
{
32 class FunctionSamples
;
34 } // end namespace sampleprof
36 inline const char *getHotSectionPrefix() { return ".hot"; }
37 inline const char *getUnlikelySectionPrefix() { return ".unlikely"; }
39 class ProfileSummaryBuilder
{
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
44 std::map
<uint64_t, uint32_t, std::greater
<uint64_t>> CountFrequencies
;
45 std::vector
<uint32_t> DetailedSummaryCutoffs
;
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;
55 ProfileSummaryBuilder(std::vector
<uint32_t> Cutoffs
)
56 : DetailedSummaryCutoffs(std::move(Cutoffs
)) {}
57 ~ProfileSummaryBuilder() = default;
59 inline void addCount(uint64_t Count
);
60 void computeDetailedSummary();
63 /// A vector of useful cutoff values for detailed summary.
64 static const ArrayRef
<uint32_t> DefaultCutoffs
;
67 class InstrProfSummaryBuilder final
: public ProfileSummaryBuilder
{
68 uint64_t MaxInternalBlockCount
= 0;
70 inline void addEntryCount(uint64_t Count
);
71 inline void addInternalCount(uint64_t Count
);
74 InstrProfSummaryBuilder(std::vector
<uint32_t> Cutoffs
)
75 : ProfileSummaryBuilder(std::move(Cutoffs
)) {}
77 void addRecord(const InstrProfRecord
&);
78 std::unique_ptr
<ProfileSummary
> getSummary();
81 class SampleProfileSummaryBuilder final
: public ProfileSummaryBuilder
{
83 SampleProfileSummaryBuilder(std::vector
<uint32_t> Cutoffs
)
84 : ProfileSummaryBuilder(std::move(Cutoffs
)) {}
86 void addRecord(const sampleprof::FunctionSamples
&FS
,
87 bool isCallsiteSample
= false);
88 std::unique_ptr
<ProfileSummary
> getSummary();
91 /// This is called when a count is seen in the profile.
92 void ProfileSummaryBuilder::addCount(uint64_t Count
) {
97 CountFrequencies
[Count
]++;
100 } // end namespace llvm
102 #endif // LLVM_PROFILEDATA_PROFILECOMMON_H