1*9880d681SAndroid Build Coastguard Worker //===-- InstrProf.h - Instrumented profiling format support -----*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // Instrumentation-based profiling data is generated by instrumented
11*9880d681SAndroid Build Coastguard Worker // binaries through library functions in compiler-rt, and read by the clang
12*9880d681SAndroid Build Coastguard Worker // frontend to feed PGO.
13*9880d681SAndroid Build Coastguard Worker //
14*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_PROFILEDATA_INSTRPROF_H
17*9880d681SAndroid Build Coastguard Worker #define LLVM_PROFILEDATA_INSTRPROF_H
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringRef.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringSet.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GlobalValue.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Metadata.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/ProfileData/InstrProfData.inc"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/ProfileData/ProfileCommon.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Endian.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MD5.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MathExtras.h"
30*9880d681SAndroid Build Coastguard Worker #include <cstdint>
31*9880d681SAndroid Build Coastguard Worker #include <list>
32*9880d681SAndroid Build Coastguard Worker #include <system_error>
33*9880d681SAndroid Build Coastguard Worker #include <vector>
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker namespace llvm {
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker class Function;
38*9880d681SAndroid Build Coastguard Worker class GlobalVariable;
39*9880d681SAndroid Build Coastguard Worker class Module;
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker /// Return the name of data section containing profile counter variables.
getInstrProfCountersSectionName(bool AddSegment)42*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfCountersSectionName(bool AddSegment) {
43*9880d681SAndroid Build Coastguard Worker return AddSegment ? "__DATA," INSTR_PROF_CNTS_SECT_NAME_STR
44*9880d681SAndroid Build Coastguard Worker : INSTR_PROF_CNTS_SECT_NAME_STR;
45*9880d681SAndroid Build Coastguard Worker }
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker /// Return the name of data section containing names of instrumented
48*9880d681SAndroid Build Coastguard Worker /// functions.
getInstrProfNameSectionName(bool AddSegment)49*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfNameSectionName(bool AddSegment) {
50*9880d681SAndroid Build Coastguard Worker return AddSegment ? "__DATA," INSTR_PROF_NAME_SECT_NAME_STR
51*9880d681SAndroid Build Coastguard Worker : INSTR_PROF_NAME_SECT_NAME_STR;
52*9880d681SAndroid Build Coastguard Worker }
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker /// Return the name of the data section containing per-function control
55*9880d681SAndroid Build Coastguard Worker /// data.
getInstrProfDataSectionName(bool AddSegment)56*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfDataSectionName(bool AddSegment) {
57*9880d681SAndroid Build Coastguard Worker return AddSegment ? "__DATA," INSTR_PROF_DATA_SECT_NAME_STR
58*9880d681SAndroid Build Coastguard Worker : INSTR_PROF_DATA_SECT_NAME_STR;
59*9880d681SAndroid Build Coastguard Worker }
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker /// Return the name of data section containing pointers to value profile
62*9880d681SAndroid Build Coastguard Worker /// counters/nodes.
getInstrProfValuesSectionName(bool AddSegment)63*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfValuesSectionName(bool AddSegment) {
64*9880d681SAndroid Build Coastguard Worker return AddSegment ? "__DATA," INSTR_PROF_VALS_SECT_NAME_STR
65*9880d681SAndroid Build Coastguard Worker : INSTR_PROF_VALS_SECT_NAME_STR;
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker /// Return the name of data section containing nodes holdling value
69*9880d681SAndroid Build Coastguard Worker /// profiling data.
getInstrProfVNodesSectionName(bool AddSegment)70*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfVNodesSectionName(bool AddSegment) {
71*9880d681SAndroid Build Coastguard Worker return AddSegment ? "__DATA," INSTR_PROF_VNODES_SECT_NAME_STR
72*9880d681SAndroid Build Coastguard Worker : INSTR_PROF_VNODES_SECT_NAME_STR;
73*9880d681SAndroid Build Coastguard Worker }
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker /// Return the name profile runtime entry point to do value profiling
76*9880d681SAndroid Build Coastguard Worker /// for a given site.
getInstrProfValueProfFuncName()77*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfValueProfFuncName() {
78*9880d681SAndroid Build Coastguard Worker return INSTR_PROF_VALUE_PROF_FUNC_STR;
79*9880d681SAndroid Build Coastguard Worker }
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker /// Return the name of the section containing function coverage mapping
82*9880d681SAndroid Build Coastguard Worker /// data.
getInstrProfCoverageSectionName(bool AddSegment)83*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfCoverageSectionName(bool AddSegment) {
84*9880d681SAndroid Build Coastguard Worker return AddSegment ? "__DATA," INSTR_PROF_COVMAP_SECT_NAME_STR
85*9880d681SAndroid Build Coastguard Worker : INSTR_PROF_COVMAP_SECT_NAME_STR;
86*9880d681SAndroid Build Coastguard Worker }
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker /// Return the name prefix of variables containing instrumented function names.
getInstrProfNameVarPrefix()89*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfNameVarPrefix() { return "__profn_"; }
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker /// Return the name prefix of variables containing per-function control data.
getInstrProfDataVarPrefix()92*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfDataVarPrefix() { return "__profd_"; }
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker /// Return the name prefix of profile counter variables.
getInstrProfCountersVarPrefix()95*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfCountersVarPrefix() { return "__profc_"; }
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker /// Return the name prefix of value profile variables.
getInstrProfValuesVarPrefix()98*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfValuesVarPrefix() { return "__profvp_"; }
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker /// Return the name of value profile node array variables:
getInstrProfVNodesVarName()101*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfVNodesVarName() { return "__llvm_prf_vnodes"; }
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker /// Return the name prefix of the COMDAT group for instrumentation variables
104*9880d681SAndroid Build Coastguard Worker /// associated with a COMDAT function.
getInstrProfComdatPrefix()105*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfComdatPrefix() { return "__profv_"; }
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker /// Return the name of the variable holding the strings (possibly compressed)
108*9880d681SAndroid Build Coastguard Worker /// of all function's PGO names.
getInstrProfNamesVarName()109*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfNamesVarName() {
110*9880d681SAndroid Build Coastguard Worker return "__llvm_prf_nm";
111*9880d681SAndroid Build Coastguard Worker }
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker /// Return the name of a covarage mapping variable (internal linkage)
114*9880d681SAndroid Build Coastguard Worker /// for each instrumented source module. Such variables are allocated
115*9880d681SAndroid Build Coastguard Worker /// in the __llvm_covmap section.
getCoverageMappingVarName()116*9880d681SAndroid Build Coastguard Worker inline StringRef getCoverageMappingVarName() {
117*9880d681SAndroid Build Coastguard Worker return "__llvm_coverage_mapping";
118*9880d681SAndroid Build Coastguard Worker }
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker /// Return the name of the internal variable recording the array
121*9880d681SAndroid Build Coastguard Worker /// of PGO name vars referenced by the coverage mapping. The owning
122*9880d681SAndroid Build Coastguard Worker /// functions of those names are not emitted by FE (e.g, unused inline
123*9880d681SAndroid Build Coastguard Worker /// functions.)
getCoverageUnusedNamesVarName()124*9880d681SAndroid Build Coastguard Worker inline StringRef getCoverageUnusedNamesVarName() {
125*9880d681SAndroid Build Coastguard Worker return "__llvm_coverage_names";
126*9880d681SAndroid Build Coastguard Worker }
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker /// Return the name of function that registers all the per-function control
129*9880d681SAndroid Build Coastguard Worker /// data at program startup time by calling __llvm_register_function. This
130*9880d681SAndroid Build Coastguard Worker /// function has internal linkage and is called by __llvm_profile_init
131*9880d681SAndroid Build Coastguard Worker /// runtime method. This function is not generated for these platforms:
132*9880d681SAndroid Build Coastguard Worker /// Darwin, Linux, and FreeBSD.
getInstrProfRegFuncsName()133*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfRegFuncsName() {
134*9880d681SAndroid Build Coastguard Worker return "__llvm_profile_register_functions";
135*9880d681SAndroid Build Coastguard Worker }
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker /// Return the name of the runtime interface that registers per-function control
138*9880d681SAndroid Build Coastguard Worker /// data for one instrumented function.
getInstrProfRegFuncName()139*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfRegFuncName() {
140*9880d681SAndroid Build Coastguard Worker return "__llvm_profile_register_function";
141*9880d681SAndroid Build Coastguard Worker }
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker /// Return the name of the runtime interface that registers the PGO name strings.
getInstrProfNamesRegFuncName()144*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfNamesRegFuncName() {
145*9880d681SAndroid Build Coastguard Worker return "__llvm_profile_register_names_function";
146*9880d681SAndroid Build Coastguard Worker }
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker /// Return the name of the runtime initialization method that is generated by
149*9880d681SAndroid Build Coastguard Worker /// the compiler. The function calls __llvm_profile_register_functions and
150*9880d681SAndroid Build Coastguard Worker /// __llvm_profile_override_default_filename functions if needed. This function
151*9880d681SAndroid Build Coastguard Worker /// has internal linkage and invoked at startup time via init_array.
getInstrProfInitFuncName()152*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfInitFuncName() { return "__llvm_profile_init"; }
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker /// Return the name of the hook variable defined in profile runtime library.
155*9880d681SAndroid Build Coastguard Worker /// A reference to the variable causes the linker to link in the runtime
156*9880d681SAndroid Build Coastguard Worker /// initialization module (which defines the hook variable).
getInstrProfRuntimeHookVarName()157*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfRuntimeHookVarName() {
158*9880d681SAndroid Build Coastguard Worker return "__llvm_profile_runtime";
159*9880d681SAndroid Build Coastguard Worker }
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker /// Return the name of the compiler generated function that references the
162*9880d681SAndroid Build Coastguard Worker /// runtime hook variable. The function is a weak global.
getInstrProfRuntimeHookVarUseFuncName()163*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfRuntimeHookVarUseFuncName() {
164*9880d681SAndroid Build Coastguard Worker return "__llvm_profile_runtime_user";
165*9880d681SAndroid Build Coastguard Worker }
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker /// Return the name of the profile runtime interface that overrides the default
168*9880d681SAndroid Build Coastguard Worker /// profile data file name.
getInstrProfFileOverriderFuncName()169*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfFileOverriderFuncName() {
170*9880d681SAndroid Build Coastguard Worker return "__llvm_profile_override_default_filename";
171*9880d681SAndroid Build Coastguard Worker }
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker /// Return the marker used to separate PGO names during serialization.
getInstrProfNameSeparator()174*9880d681SAndroid Build Coastguard Worker inline StringRef getInstrProfNameSeparator() { return "\01"; }
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker /// Return the modified name for function \c F suitable to be
177*9880d681SAndroid Build Coastguard Worker /// used the key for profile lookup. Variable \c InLTO indicates if this
178*9880d681SAndroid Build Coastguard Worker /// is called in LTO optimization passes.
179*9880d681SAndroid Build Coastguard Worker std::string getPGOFuncName(const Function &F, bool InLTO = false,
180*9880d681SAndroid Build Coastguard Worker uint64_t Version = INSTR_PROF_INDEX_VERSION);
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker /// Return the modified name for a function suitable to be
183*9880d681SAndroid Build Coastguard Worker /// used the key for profile lookup. The function's original
184*9880d681SAndroid Build Coastguard Worker /// name is \c RawFuncName and has linkage of type \c Linkage.
185*9880d681SAndroid Build Coastguard Worker /// The function is defined in module \c FileName.
186*9880d681SAndroid Build Coastguard Worker std::string getPGOFuncName(StringRef RawFuncName,
187*9880d681SAndroid Build Coastguard Worker GlobalValue::LinkageTypes Linkage,
188*9880d681SAndroid Build Coastguard Worker StringRef FileName,
189*9880d681SAndroid Build Coastguard Worker uint64_t Version = INSTR_PROF_INDEX_VERSION);
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker /// Return the name of the global variable used to store a function
192*9880d681SAndroid Build Coastguard Worker /// name in PGO instrumentation. \c FuncName is the name of the function
193*9880d681SAndroid Build Coastguard Worker /// returned by the \c getPGOFuncName call.
194*9880d681SAndroid Build Coastguard Worker std::string getPGOFuncNameVarName(StringRef FuncName,
195*9880d681SAndroid Build Coastguard Worker GlobalValue::LinkageTypes Linkage);
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker /// Create and return the global variable for function name used in PGO
198*9880d681SAndroid Build Coastguard Worker /// instrumentation. \c FuncName is the name of the function returned
199*9880d681SAndroid Build Coastguard Worker /// by \c getPGOFuncName call.
200*9880d681SAndroid Build Coastguard Worker GlobalVariable *createPGOFuncNameVar(Function &F, StringRef PGOFuncName);
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker /// Create and return the global variable for function name used in PGO
203*9880d681SAndroid Build Coastguard Worker /// instrumentation. /// \c FuncName is the name of the function
204*9880d681SAndroid Build Coastguard Worker /// returned by \c getPGOFuncName call, \c M is the owning module,
205*9880d681SAndroid Build Coastguard Worker /// and \c Linkage is the linkage of the instrumented function.
206*9880d681SAndroid Build Coastguard Worker GlobalVariable *createPGOFuncNameVar(Module &M,
207*9880d681SAndroid Build Coastguard Worker GlobalValue::LinkageTypes Linkage,
208*9880d681SAndroid Build Coastguard Worker StringRef PGOFuncName);
209*9880d681SAndroid Build Coastguard Worker /// Return the initializer in string of the PGO name var \c NameVar.
210*9880d681SAndroid Build Coastguard Worker StringRef getPGOFuncNameVarInitializer(GlobalVariable *NameVar);
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Worker /// Given a PGO function name, remove the filename prefix and return
213*9880d681SAndroid Build Coastguard Worker /// the original (static) function name.
214*9880d681SAndroid Build Coastguard Worker StringRef getFuncNameWithoutPrefix(StringRef PGOFuncName,
215*9880d681SAndroid Build Coastguard Worker StringRef FileName = "<unknown>");
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker /// Given a vector of strings (function PGO names) \c NameStrs, the
218*9880d681SAndroid Build Coastguard Worker /// method generates a combined string \c Result thatis ready to be
219*9880d681SAndroid Build Coastguard Worker /// serialized. The \c Result string is comprised of three fields:
220*9880d681SAndroid Build Coastguard Worker /// The first field is the legnth of the uncompressed strings, and the
221*9880d681SAndroid Build Coastguard Worker /// the second field is the length of the zlib-compressed string.
222*9880d681SAndroid Build Coastguard Worker /// Both fields are encoded in ULEB128. If \c doCompress is false, the
223*9880d681SAndroid Build Coastguard Worker /// third field is the uncompressed strings; otherwise it is the
224*9880d681SAndroid Build Coastguard Worker /// compressed string. When the string compression is off, the
225*9880d681SAndroid Build Coastguard Worker /// second field will have value zero.
226*9880d681SAndroid Build Coastguard Worker Error collectPGOFuncNameStrings(const std::vector<std::string> &NameStrs,
227*9880d681SAndroid Build Coastguard Worker bool doCompression, std::string &Result);
228*9880d681SAndroid Build Coastguard Worker /// Produce \c Result string with the same format described above. The input
229*9880d681SAndroid Build Coastguard Worker /// is vector of PGO function name variables that are referenced.
230*9880d681SAndroid Build Coastguard Worker Error collectPGOFuncNameStrings(const std::vector<GlobalVariable *> &NameVars,
231*9880d681SAndroid Build Coastguard Worker std::string &Result, bool doCompression = true);
232*9880d681SAndroid Build Coastguard Worker class InstrProfSymtab;
233*9880d681SAndroid Build Coastguard Worker /// \c NameStrings is a string composed of one of more sub-strings encoded in
234*9880d681SAndroid Build Coastguard Worker /// the format described above. The substrings are seperated by 0 or more zero
235*9880d681SAndroid Build Coastguard Worker /// bytes. This method decodes the string and populates the \c Symtab.
236*9880d681SAndroid Build Coastguard Worker Error readPGOFuncNameStrings(StringRef NameStrings, InstrProfSymtab &Symtab);
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker enum InstrProfValueKind : uint32_t {
239*9880d681SAndroid Build Coastguard Worker #define VALUE_PROF_KIND(Enumerator, Value) Enumerator = Value,
240*9880d681SAndroid Build Coastguard Worker #include "llvm/ProfileData/InstrProfData.inc"
241*9880d681SAndroid Build Coastguard Worker };
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker struct InstrProfRecord;
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker /// Get the value profile data for value site \p SiteIdx from \p InstrProfR
246*9880d681SAndroid Build Coastguard Worker /// and annotate the instruction \p Inst with the value profile meta data.
247*9880d681SAndroid Build Coastguard Worker /// Annotate up to \p MaxMDCount (default 3) number of records per value site.
248*9880d681SAndroid Build Coastguard Worker void annotateValueSite(Module &M, Instruction &Inst,
249*9880d681SAndroid Build Coastguard Worker const InstrProfRecord &InstrProfR,
250*9880d681SAndroid Build Coastguard Worker InstrProfValueKind ValueKind, uint32_t SiteIndx,
251*9880d681SAndroid Build Coastguard Worker uint32_t MaxMDCount = 3);
252*9880d681SAndroid Build Coastguard Worker /// Same as the above interface but using an ArrayRef, as well as \p Sum.
253*9880d681SAndroid Build Coastguard Worker void annotateValueSite(Module &M, Instruction &Inst,
254*9880d681SAndroid Build Coastguard Worker ArrayRef<InstrProfValueData> VDs,
255*9880d681SAndroid Build Coastguard Worker uint64_t Sum, InstrProfValueKind ValueKind,
256*9880d681SAndroid Build Coastguard Worker uint32_t MaxMDCount);
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker /// Extract the value profile data from \p Inst which is annotated with
259*9880d681SAndroid Build Coastguard Worker /// value profile meta data. Return false if there is no value data annotated,
260*9880d681SAndroid Build Coastguard Worker /// otherwise return true.
261*9880d681SAndroid Build Coastguard Worker bool getValueProfDataFromInst(const Instruction &Inst,
262*9880d681SAndroid Build Coastguard Worker InstrProfValueKind ValueKind,
263*9880d681SAndroid Build Coastguard Worker uint32_t MaxNumValueData,
264*9880d681SAndroid Build Coastguard Worker InstrProfValueData ValueData[],
265*9880d681SAndroid Build Coastguard Worker uint32_t &ActualNumValueData, uint64_t &TotalC);
266*9880d681SAndroid Build Coastguard Worker
getPGOFuncNameMetadataName()267*9880d681SAndroid Build Coastguard Worker inline StringRef getPGOFuncNameMetadataName() { return "PGOFuncName"; }
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker /// Return the PGOFuncName meta data associated with a function.
270*9880d681SAndroid Build Coastguard Worker MDNode *getPGOFuncNameMetadata(const Function &F);
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker /// Create the PGOFuncName meta data if PGOFuncName is different from
273*9880d681SAndroid Build Coastguard Worker /// function's raw name. This should only apply to internal linkage functions
274*9880d681SAndroid Build Coastguard Worker /// declared by users only.
275*9880d681SAndroid Build Coastguard Worker void createPGOFuncNameMetadata(Function &F, StringRef PGOFuncName);
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker const std::error_category &instrprof_category();
278*9880d681SAndroid Build Coastguard Worker
279*9880d681SAndroid Build Coastguard Worker enum class instrprof_error {
280*9880d681SAndroid Build Coastguard Worker success = 0,
281*9880d681SAndroid Build Coastguard Worker eof,
282*9880d681SAndroid Build Coastguard Worker unrecognized_format,
283*9880d681SAndroid Build Coastguard Worker bad_magic,
284*9880d681SAndroid Build Coastguard Worker bad_header,
285*9880d681SAndroid Build Coastguard Worker unsupported_version,
286*9880d681SAndroid Build Coastguard Worker unsupported_hash_type,
287*9880d681SAndroid Build Coastguard Worker too_large,
288*9880d681SAndroid Build Coastguard Worker truncated,
289*9880d681SAndroid Build Coastguard Worker malformed,
290*9880d681SAndroid Build Coastguard Worker unknown_function,
291*9880d681SAndroid Build Coastguard Worker hash_mismatch,
292*9880d681SAndroid Build Coastguard Worker count_mismatch,
293*9880d681SAndroid Build Coastguard Worker counter_overflow,
294*9880d681SAndroid Build Coastguard Worker value_site_count_mismatch,
295*9880d681SAndroid Build Coastguard Worker compress_failed,
296*9880d681SAndroid Build Coastguard Worker uncompress_failed
297*9880d681SAndroid Build Coastguard Worker };
298*9880d681SAndroid Build Coastguard Worker
make_error_code(instrprof_error E)299*9880d681SAndroid Build Coastguard Worker inline std::error_code make_error_code(instrprof_error E) {
300*9880d681SAndroid Build Coastguard Worker return std::error_code(static_cast<int>(E), instrprof_category());
301*9880d681SAndroid Build Coastguard Worker }
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Worker class InstrProfError : public ErrorInfo<InstrProfError> {
304*9880d681SAndroid Build Coastguard Worker public:
InstrProfError(instrprof_error Err)305*9880d681SAndroid Build Coastguard Worker InstrProfError(instrprof_error Err) : Err(Err) {
306*9880d681SAndroid Build Coastguard Worker assert(Err != instrprof_error::success && "Not an error");
307*9880d681SAndroid Build Coastguard Worker }
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker std::string message() const override;
310*9880d681SAndroid Build Coastguard Worker
log(raw_ostream & OS)311*9880d681SAndroid Build Coastguard Worker void log(raw_ostream &OS) const override { OS << message(); }
312*9880d681SAndroid Build Coastguard Worker
convertToErrorCode()313*9880d681SAndroid Build Coastguard Worker std::error_code convertToErrorCode() const override {
314*9880d681SAndroid Build Coastguard Worker return make_error_code(Err);
315*9880d681SAndroid Build Coastguard Worker }
316*9880d681SAndroid Build Coastguard Worker
get()317*9880d681SAndroid Build Coastguard Worker instrprof_error get() const { return Err; }
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker /// Consume an Error and return the raw enum value contained within it. The
320*9880d681SAndroid Build Coastguard Worker /// Error must either be a success value, or contain a single InstrProfError.
take(Error E)321*9880d681SAndroid Build Coastguard Worker static instrprof_error take(Error E) {
322*9880d681SAndroid Build Coastguard Worker auto Err = instrprof_error::success;
323*9880d681SAndroid Build Coastguard Worker handleAllErrors(std::move(E), [&Err](const InstrProfError &IPE) {
324*9880d681SAndroid Build Coastguard Worker assert(Err == instrprof_error::success && "Multiple errors encountered");
325*9880d681SAndroid Build Coastguard Worker Err = IPE.get();
326*9880d681SAndroid Build Coastguard Worker });
327*9880d681SAndroid Build Coastguard Worker return Err;
328*9880d681SAndroid Build Coastguard Worker }
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker static char ID;
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Worker private:
333*9880d681SAndroid Build Coastguard Worker instrprof_error Err;
334*9880d681SAndroid Build Coastguard Worker };
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker class SoftInstrProfErrors {
337*9880d681SAndroid Build Coastguard Worker /// Count the number of soft instrprof_errors encountered and keep track of
338*9880d681SAndroid Build Coastguard Worker /// the first such error for reporting purposes.
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Worker /// The first soft error encountered.
341*9880d681SAndroid Build Coastguard Worker instrprof_error FirstError;
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker /// The number of hash mismatches.
344*9880d681SAndroid Build Coastguard Worker unsigned NumHashMismatches;
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Worker /// The number of count mismatches.
347*9880d681SAndroid Build Coastguard Worker unsigned NumCountMismatches;
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Worker /// The number of counter overflows.
350*9880d681SAndroid Build Coastguard Worker unsigned NumCounterOverflows;
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Worker /// The number of value site count mismatches.
353*9880d681SAndroid Build Coastguard Worker unsigned NumValueSiteCountMismatches;
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Worker public:
SoftInstrProfErrors()356*9880d681SAndroid Build Coastguard Worker SoftInstrProfErrors()
357*9880d681SAndroid Build Coastguard Worker : FirstError(instrprof_error::success), NumHashMismatches(0),
358*9880d681SAndroid Build Coastguard Worker NumCountMismatches(0), NumCounterOverflows(0),
359*9880d681SAndroid Build Coastguard Worker NumValueSiteCountMismatches(0) {}
360*9880d681SAndroid Build Coastguard Worker
~SoftInstrProfErrors()361*9880d681SAndroid Build Coastguard Worker ~SoftInstrProfErrors() {
362*9880d681SAndroid Build Coastguard Worker assert(FirstError == instrprof_error::success &&
363*9880d681SAndroid Build Coastguard Worker "Unchecked soft error encountered");
364*9880d681SAndroid Build Coastguard Worker }
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker /// Track a soft error (\p IE) and increment its associated counter.
367*9880d681SAndroid Build Coastguard Worker void addError(instrprof_error IE);
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Worker /// Get the number of hash mismatches.
getNumHashMismatches()370*9880d681SAndroid Build Coastguard Worker unsigned getNumHashMismatches() const { return NumHashMismatches; }
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard Worker /// Get the number of count mismatches.
getNumCountMismatches()373*9880d681SAndroid Build Coastguard Worker unsigned getNumCountMismatches() const { return NumCountMismatches; }
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Worker /// Get the number of counter overflows.
getNumCounterOverflows()376*9880d681SAndroid Build Coastguard Worker unsigned getNumCounterOverflows() const { return NumCounterOverflows; }
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker /// Get the number of value site count mismatches.
getNumValueSiteCountMismatches()379*9880d681SAndroid Build Coastguard Worker unsigned getNumValueSiteCountMismatches() const {
380*9880d681SAndroid Build Coastguard Worker return NumValueSiteCountMismatches;
381*9880d681SAndroid Build Coastguard Worker }
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Worker /// Return the first encountered error and reset FirstError to a success
384*9880d681SAndroid Build Coastguard Worker /// value.
takeError()385*9880d681SAndroid Build Coastguard Worker Error takeError() {
386*9880d681SAndroid Build Coastguard Worker if (FirstError == instrprof_error::success)
387*9880d681SAndroid Build Coastguard Worker return Error::success();
388*9880d681SAndroid Build Coastguard Worker auto E = make_error<InstrProfError>(FirstError);
389*9880d681SAndroid Build Coastguard Worker FirstError = instrprof_error::success;
390*9880d681SAndroid Build Coastguard Worker return E;
391*9880d681SAndroid Build Coastguard Worker }
392*9880d681SAndroid Build Coastguard Worker };
393*9880d681SAndroid Build Coastguard Worker
394*9880d681SAndroid Build Coastguard Worker namespace object {
395*9880d681SAndroid Build Coastguard Worker class SectionRef;
396*9880d681SAndroid Build Coastguard Worker }
397*9880d681SAndroid Build Coastguard Worker
398*9880d681SAndroid Build Coastguard Worker namespace IndexedInstrProf {
399*9880d681SAndroid Build Coastguard Worker uint64_t ComputeHash(StringRef K);
400*9880d681SAndroid Build Coastguard Worker }
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Worker /// A symbol table used for function PGO name look-up with keys
403*9880d681SAndroid Build Coastguard Worker /// (such as pointers, md5hash values) to the function. A function's
404*9880d681SAndroid Build Coastguard Worker /// PGO name or name's md5hash are used in retrieving the profile
405*9880d681SAndroid Build Coastguard Worker /// data of the function. See \c getPGOFuncName() method for details
406*9880d681SAndroid Build Coastguard Worker /// on how PGO name is formed.
407*9880d681SAndroid Build Coastguard Worker class InstrProfSymtab {
408*9880d681SAndroid Build Coastguard Worker public:
409*9880d681SAndroid Build Coastguard Worker typedef std::vector<std::pair<uint64_t, uint64_t>> AddrHashMap;
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Worker private:
412*9880d681SAndroid Build Coastguard Worker StringRef Data;
413*9880d681SAndroid Build Coastguard Worker uint64_t Address;
414*9880d681SAndroid Build Coastguard Worker // Unique name strings.
415*9880d681SAndroid Build Coastguard Worker StringSet<> NameTab;
416*9880d681SAndroid Build Coastguard Worker // A map from MD5 keys to function name strings.
417*9880d681SAndroid Build Coastguard Worker std::vector<std::pair<uint64_t, StringRef>> MD5NameMap;
418*9880d681SAndroid Build Coastguard Worker // A map from MD5 keys to function define. We only populate this map
419*9880d681SAndroid Build Coastguard Worker // when build the Symtab from a Module.
420*9880d681SAndroid Build Coastguard Worker std::vector<std::pair<uint64_t, Function *>> MD5FuncMap;
421*9880d681SAndroid Build Coastguard Worker // A map from function runtime address to function name MD5 hash.
422*9880d681SAndroid Build Coastguard Worker // This map is only populated and used by raw instr profile reader.
423*9880d681SAndroid Build Coastguard Worker AddrHashMap AddrToMD5Map;
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Worker public:
InstrProfSymtab()426*9880d681SAndroid Build Coastguard Worker InstrProfSymtab()
427*9880d681SAndroid Build Coastguard Worker : Data(), Address(0), NameTab(), MD5NameMap(), MD5FuncMap(),
428*9880d681SAndroid Build Coastguard Worker AddrToMD5Map() {}
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Worker /// Create InstrProfSymtab from an object file section which
431*9880d681SAndroid Build Coastguard Worker /// contains function PGO names. When section may contain raw
432*9880d681SAndroid Build Coastguard Worker /// string data or string data in compressed form. This method
433*9880d681SAndroid Build Coastguard Worker /// only initialize the symtab with reference to the data and
434*9880d681SAndroid Build Coastguard Worker /// the section base address. The decompression will be delayed
435*9880d681SAndroid Build Coastguard Worker /// until before it is used. See also \c create(StringRef) method.
436*9880d681SAndroid Build Coastguard Worker Error create(object::SectionRef &Section);
437*9880d681SAndroid Build Coastguard Worker /// This interface is used by reader of CoverageMapping test
438*9880d681SAndroid Build Coastguard Worker /// format.
439*9880d681SAndroid Build Coastguard Worker inline Error create(StringRef D, uint64_t BaseAddr);
440*9880d681SAndroid Build Coastguard Worker /// \c NameStrings is a string composed of one of more sub-strings
441*9880d681SAndroid Build Coastguard Worker /// encoded in the format described in \c collectPGOFuncNameStrings.
442*9880d681SAndroid Build Coastguard Worker /// This method is a wrapper to \c readPGOFuncNameStrings method.
443*9880d681SAndroid Build Coastguard Worker inline Error create(StringRef NameStrings);
444*9880d681SAndroid Build Coastguard Worker /// A wrapper interface to populate the PGO symtab with functions
445*9880d681SAndroid Build Coastguard Worker /// decls from module \c M. This interface is used by transformation
446*9880d681SAndroid Build Coastguard Worker /// passes such as indirect function call promotion. Variable \c InLTO
447*9880d681SAndroid Build Coastguard Worker /// indicates if this is called from LTO optimization passes.
448*9880d681SAndroid Build Coastguard Worker void create(Module &M, bool InLTO = false);
449*9880d681SAndroid Build Coastguard Worker /// Create InstrProfSymtab from a set of names iteratable from
450*9880d681SAndroid Build Coastguard Worker /// \p IterRange. This interface is used by IndexedProfReader.
451*9880d681SAndroid Build Coastguard Worker template <typename NameIterRange> void create(const NameIterRange &IterRange);
452*9880d681SAndroid Build Coastguard Worker // If the symtab is created by a series of calls to \c addFuncName, \c
453*9880d681SAndroid Build Coastguard Worker // finalizeSymtab needs to be called before looking up function names.
454*9880d681SAndroid Build Coastguard Worker // This is required because the underlying map is a vector (for space
455*9880d681SAndroid Build Coastguard Worker // efficiency) which needs to be sorted.
456*9880d681SAndroid Build Coastguard Worker inline void finalizeSymtab();
457*9880d681SAndroid Build Coastguard Worker /// Update the symtab by adding \p FuncName to the table. This interface
458*9880d681SAndroid Build Coastguard Worker /// is used by the raw and text profile readers.
addFuncName(StringRef FuncName)459*9880d681SAndroid Build Coastguard Worker void addFuncName(StringRef FuncName) {
460*9880d681SAndroid Build Coastguard Worker auto Ins = NameTab.insert(FuncName);
461*9880d681SAndroid Build Coastguard Worker if (Ins.second)
462*9880d681SAndroid Build Coastguard Worker MD5NameMap.push_back(std::make_pair(
463*9880d681SAndroid Build Coastguard Worker IndexedInstrProf::ComputeHash(FuncName), Ins.first->getKey()));
464*9880d681SAndroid Build Coastguard Worker }
465*9880d681SAndroid Build Coastguard Worker /// Map a function address to its name's MD5 hash. This interface
466*9880d681SAndroid Build Coastguard Worker /// is only used by the raw profiler reader.
mapAddress(uint64_t Addr,uint64_t MD5Val)467*9880d681SAndroid Build Coastguard Worker void mapAddress(uint64_t Addr, uint64_t MD5Val) {
468*9880d681SAndroid Build Coastguard Worker AddrToMD5Map.push_back(std::make_pair(Addr, MD5Val));
469*9880d681SAndroid Build Coastguard Worker }
getAddrHashMap()470*9880d681SAndroid Build Coastguard Worker AddrHashMap &getAddrHashMap() { return AddrToMD5Map; }
471*9880d681SAndroid Build Coastguard Worker /// Return function's PGO name from the function name's symbol
472*9880d681SAndroid Build Coastguard Worker /// address in the object file. If an error occurs, return
473*9880d681SAndroid Build Coastguard Worker /// an empty string.
474*9880d681SAndroid Build Coastguard Worker StringRef getFuncName(uint64_t FuncNameAddress, size_t NameSize);
475*9880d681SAndroid Build Coastguard Worker /// Return function's PGO name from the name's md5 hash value.
476*9880d681SAndroid Build Coastguard Worker /// If not found, return an empty string.
477*9880d681SAndroid Build Coastguard Worker inline StringRef getFuncName(uint64_t FuncMD5Hash);
478*9880d681SAndroid Build Coastguard Worker /// Return function from the name's md5 hash. Return nullptr if not found.
479*9880d681SAndroid Build Coastguard Worker inline Function *getFunction(uint64_t FuncMD5Hash);
480*9880d681SAndroid Build Coastguard Worker /// Return the function's original assembly name by stripping off
481*9880d681SAndroid Build Coastguard Worker /// the prefix attached (to symbols with priviate linkage). For
482*9880d681SAndroid Build Coastguard Worker /// global functions, it returns the same string as getFuncName.
483*9880d681SAndroid Build Coastguard Worker inline StringRef getOrigFuncName(uint64_t FuncMD5Hash);
484*9880d681SAndroid Build Coastguard Worker /// Return the name section data.
getNameData()485*9880d681SAndroid Build Coastguard Worker inline StringRef getNameData() const { return Data; }
486*9880d681SAndroid Build Coastguard Worker };
487*9880d681SAndroid Build Coastguard Worker
create(StringRef D,uint64_t BaseAddr)488*9880d681SAndroid Build Coastguard Worker Error InstrProfSymtab::create(StringRef D, uint64_t BaseAddr) {
489*9880d681SAndroid Build Coastguard Worker Data = D;
490*9880d681SAndroid Build Coastguard Worker Address = BaseAddr;
491*9880d681SAndroid Build Coastguard Worker return Error::success();
492*9880d681SAndroid Build Coastguard Worker }
493*9880d681SAndroid Build Coastguard Worker
create(StringRef NameStrings)494*9880d681SAndroid Build Coastguard Worker Error InstrProfSymtab::create(StringRef NameStrings) {
495*9880d681SAndroid Build Coastguard Worker return readPGOFuncNameStrings(NameStrings, *this);
496*9880d681SAndroid Build Coastguard Worker }
497*9880d681SAndroid Build Coastguard Worker
498*9880d681SAndroid Build Coastguard Worker template <typename NameIterRange>
create(const NameIterRange & IterRange)499*9880d681SAndroid Build Coastguard Worker void InstrProfSymtab::create(const NameIterRange &IterRange) {
500*9880d681SAndroid Build Coastguard Worker for (auto Name : IterRange)
501*9880d681SAndroid Build Coastguard Worker addFuncName(Name);
502*9880d681SAndroid Build Coastguard Worker
503*9880d681SAndroid Build Coastguard Worker finalizeSymtab();
504*9880d681SAndroid Build Coastguard Worker }
505*9880d681SAndroid Build Coastguard Worker
finalizeSymtab()506*9880d681SAndroid Build Coastguard Worker void InstrProfSymtab::finalizeSymtab() {
507*9880d681SAndroid Build Coastguard Worker std::sort(MD5NameMap.begin(), MD5NameMap.end(), less_first());
508*9880d681SAndroid Build Coastguard Worker std::sort(MD5FuncMap.begin(), MD5FuncMap.end(), less_first());
509*9880d681SAndroid Build Coastguard Worker std::sort(AddrToMD5Map.begin(), AddrToMD5Map.end(), less_first());
510*9880d681SAndroid Build Coastguard Worker AddrToMD5Map.erase(std::unique(AddrToMD5Map.begin(), AddrToMD5Map.end()),
511*9880d681SAndroid Build Coastguard Worker AddrToMD5Map.end());
512*9880d681SAndroid Build Coastguard Worker }
513*9880d681SAndroid Build Coastguard Worker
getFuncName(uint64_t FuncMD5Hash)514*9880d681SAndroid Build Coastguard Worker StringRef InstrProfSymtab::getFuncName(uint64_t FuncMD5Hash) {
515*9880d681SAndroid Build Coastguard Worker auto Result =
516*9880d681SAndroid Build Coastguard Worker std::lower_bound(MD5NameMap.begin(), MD5NameMap.end(), FuncMD5Hash,
517*9880d681SAndroid Build Coastguard Worker [](const std::pair<uint64_t, std::string> &LHS,
518*9880d681SAndroid Build Coastguard Worker uint64_t RHS) { return LHS.first < RHS; });
519*9880d681SAndroid Build Coastguard Worker if (Result != MD5NameMap.end() && Result->first == FuncMD5Hash)
520*9880d681SAndroid Build Coastguard Worker return Result->second;
521*9880d681SAndroid Build Coastguard Worker return StringRef();
522*9880d681SAndroid Build Coastguard Worker }
523*9880d681SAndroid Build Coastguard Worker
getFunction(uint64_t FuncMD5Hash)524*9880d681SAndroid Build Coastguard Worker Function* InstrProfSymtab::getFunction(uint64_t FuncMD5Hash) {
525*9880d681SAndroid Build Coastguard Worker auto Result =
526*9880d681SAndroid Build Coastguard Worker std::lower_bound(MD5FuncMap.begin(), MD5FuncMap.end(), FuncMD5Hash,
527*9880d681SAndroid Build Coastguard Worker [](const std::pair<uint64_t, Function*> &LHS,
528*9880d681SAndroid Build Coastguard Worker uint64_t RHS) { return LHS.first < RHS; });
529*9880d681SAndroid Build Coastguard Worker if (Result != MD5FuncMap.end() && Result->first == FuncMD5Hash)
530*9880d681SAndroid Build Coastguard Worker return Result->second;
531*9880d681SAndroid Build Coastguard Worker return nullptr;
532*9880d681SAndroid Build Coastguard Worker }
533*9880d681SAndroid Build Coastguard Worker
534*9880d681SAndroid Build Coastguard Worker // See also getPGOFuncName implementation. These two need to be
535*9880d681SAndroid Build Coastguard Worker // matched.
getOrigFuncName(uint64_t FuncMD5Hash)536*9880d681SAndroid Build Coastguard Worker StringRef InstrProfSymtab::getOrigFuncName(uint64_t FuncMD5Hash) {
537*9880d681SAndroid Build Coastguard Worker StringRef PGOName = getFuncName(FuncMD5Hash);
538*9880d681SAndroid Build Coastguard Worker size_t S = PGOName.find_first_of(':');
539*9880d681SAndroid Build Coastguard Worker if (S == StringRef::npos)
540*9880d681SAndroid Build Coastguard Worker return PGOName;
541*9880d681SAndroid Build Coastguard Worker return PGOName.drop_front(S + 1);
542*9880d681SAndroid Build Coastguard Worker }
543*9880d681SAndroid Build Coastguard Worker
544*9880d681SAndroid Build Coastguard Worker struct InstrProfValueSiteRecord {
545*9880d681SAndroid Build Coastguard Worker /// Value profiling data pairs at a given value site.
546*9880d681SAndroid Build Coastguard Worker std::list<InstrProfValueData> ValueData;
547*9880d681SAndroid Build Coastguard Worker
InstrProfValueSiteRecordInstrProfValueSiteRecord548*9880d681SAndroid Build Coastguard Worker InstrProfValueSiteRecord() { ValueData.clear(); }
549*9880d681SAndroid Build Coastguard Worker template <class InputIterator>
InstrProfValueSiteRecordInstrProfValueSiteRecord550*9880d681SAndroid Build Coastguard Worker InstrProfValueSiteRecord(InputIterator F, InputIterator L)
551*9880d681SAndroid Build Coastguard Worker : ValueData(F, L) {}
552*9880d681SAndroid Build Coastguard Worker
553*9880d681SAndroid Build Coastguard Worker /// Sort ValueData ascending by Value
sortByTargetValuesInstrProfValueSiteRecord554*9880d681SAndroid Build Coastguard Worker void sortByTargetValues() {
555*9880d681SAndroid Build Coastguard Worker ValueData.sort(
556*9880d681SAndroid Build Coastguard Worker [](const InstrProfValueData &left, const InstrProfValueData &right) {
557*9880d681SAndroid Build Coastguard Worker return left.Value < right.Value;
558*9880d681SAndroid Build Coastguard Worker });
559*9880d681SAndroid Build Coastguard Worker }
560*9880d681SAndroid Build Coastguard Worker /// Sort ValueData Descending by Count
561*9880d681SAndroid Build Coastguard Worker inline void sortByCount();
562*9880d681SAndroid Build Coastguard Worker
563*9880d681SAndroid Build Coastguard Worker /// Merge data from another InstrProfValueSiteRecord
564*9880d681SAndroid Build Coastguard Worker /// Optionally scale merged counts by \p Weight.
565*9880d681SAndroid Build Coastguard Worker void merge(SoftInstrProfErrors &SIPE, InstrProfValueSiteRecord &Input,
566*9880d681SAndroid Build Coastguard Worker uint64_t Weight = 1);
567*9880d681SAndroid Build Coastguard Worker /// Scale up value profile data counts.
568*9880d681SAndroid Build Coastguard Worker void scale(SoftInstrProfErrors &SIPE, uint64_t Weight);
569*9880d681SAndroid Build Coastguard Worker };
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Worker /// Profiling information for a single function.
572*9880d681SAndroid Build Coastguard Worker struct InstrProfRecord {
InstrProfRecordInstrProfRecord573*9880d681SAndroid Build Coastguard Worker InstrProfRecord() : SIPE() {}
InstrProfRecordInstrProfRecord574*9880d681SAndroid Build Coastguard Worker InstrProfRecord(StringRef Name, uint64_t Hash, std::vector<uint64_t> Counts)
575*9880d681SAndroid Build Coastguard Worker : Name(Name), Hash(Hash), Counts(std::move(Counts)), SIPE() {}
576*9880d681SAndroid Build Coastguard Worker StringRef Name;
577*9880d681SAndroid Build Coastguard Worker uint64_t Hash;
578*9880d681SAndroid Build Coastguard Worker std::vector<uint64_t> Counts;
579*9880d681SAndroid Build Coastguard Worker SoftInstrProfErrors SIPE;
580*9880d681SAndroid Build Coastguard Worker
581*9880d681SAndroid Build Coastguard Worker typedef std::vector<std::pair<uint64_t, uint64_t>> ValueMapType;
582*9880d681SAndroid Build Coastguard Worker
583*9880d681SAndroid Build Coastguard Worker /// Return the number of value profile kinds with non-zero number
584*9880d681SAndroid Build Coastguard Worker /// of profile sites.
585*9880d681SAndroid Build Coastguard Worker inline uint32_t getNumValueKinds() const;
586*9880d681SAndroid Build Coastguard Worker /// Return the number of instrumented sites for ValueKind.
587*9880d681SAndroid Build Coastguard Worker inline uint32_t getNumValueSites(uint32_t ValueKind) const;
588*9880d681SAndroid Build Coastguard Worker /// Return the total number of ValueData for ValueKind.
589*9880d681SAndroid Build Coastguard Worker inline uint32_t getNumValueData(uint32_t ValueKind) const;
590*9880d681SAndroid Build Coastguard Worker /// Return the number of value data collected for ValueKind at profiling
591*9880d681SAndroid Build Coastguard Worker /// site: Site.
592*9880d681SAndroid Build Coastguard Worker inline uint32_t getNumValueDataForSite(uint32_t ValueKind,
593*9880d681SAndroid Build Coastguard Worker uint32_t Site) const;
594*9880d681SAndroid Build Coastguard Worker /// Return the array of profiled values at \p Site. If \p TotalC
595*9880d681SAndroid Build Coastguard Worker /// is not null, the total count of all target values at this site
596*9880d681SAndroid Build Coastguard Worker /// will be stored in \c *TotalC.
597*9880d681SAndroid Build Coastguard Worker inline std::unique_ptr<InstrProfValueData[]>
598*9880d681SAndroid Build Coastguard Worker getValueForSite(uint32_t ValueKind, uint32_t Site,
599*9880d681SAndroid Build Coastguard Worker uint64_t *TotalC = 0) const;
600*9880d681SAndroid Build Coastguard Worker /// Get the target value/counts of kind \p ValueKind collected at site
601*9880d681SAndroid Build Coastguard Worker /// \p Site and store the result in array \p Dest. Return the total
602*9880d681SAndroid Build Coastguard Worker /// counts of all target values at this site.
603*9880d681SAndroid Build Coastguard Worker inline uint64_t getValueForSite(InstrProfValueData Dest[], uint32_t ValueKind,
604*9880d681SAndroid Build Coastguard Worker uint32_t Site) const;
605*9880d681SAndroid Build Coastguard Worker /// Reserve space for NumValueSites sites.
606*9880d681SAndroid Build Coastguard Worker inline void reserveSites(uint32_t ValueKind, uint32_t NumValueSites);
607*9880d681SAndroid Build Coastguard Worker /// Add ValueData for ValueKind at value Site.
608*9880d681SAndroid Build Coastguard Worker void addValueData(uint32_t ValueKind, uint32_t Site,
609*9880d681SAndroid Build Coastguard Worker InstrProfValueData *VData, uint32_t N,
610*9880d681SAndroid Build Coastguard Worker ValueMapType *ValueMap);
611*9880d681SAndroid Build Coastguard Worker
612*9880d681SAndroid Build Coastguard Worker /// Merge the counts in \p Other into this one.
613*9880d681SAndroid Build Coastguard Worker /// Optionally scale merged counts by \p Weight.
614*9880d681SAndroid Build Coastguard Worker void merge(InstrProfRecord &Other, uint64_t Weight = 1);
615*9880d681SAndroid Build Coastguard Worker
616*9880d681SAndroid Build Coastguard Worker /// Scale up profile counts (including value profile data) by
617*9880d681SAndroid Build Coastguard Worker /// \p Weight.
618*9880d681SAndroid Build Coastguard Worker void scale(uint64_t Weight);
619*9880d681SAndroid Build Coastguard Worker
620*9880d681SAndroid Build Coastguard Worker /// Sort value profile data (per site) by count.
sortValueDataInstrProfRecord621*9880d681SAndroid Build Coastguard Worker void sortValueData() {
622*9880d681SAndroid Build Coastguard Worker for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind) {
623*9880d681SAndroid Build Coastguard Worker std::vector<InstrProfValueSiteRecord> &SiteRecords =
624*9880d681SAndroid Build Coastguard Worker getValueSitesForKind(Kind);
625*9880d681SAndroid Build Coastguard Worker for (auto &SR : SiteRecords)
626*9880d681SAndroid Build Coastguard Worker SR.sortByCount();
627*9880d681SAndroid Build Coastguard Worker }
628*9880d681SAndroid Build Coastguard Worker }
629*9880d681SAndroid Build Coastguard Worker /// Clear value data entries
clearValueDataInstrProfRecord630*9880d681SAndroid Build Coastguard Worker void clearValueData() {
631*9880d681SAndroid Build Coastguard Worker for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
632*9880d681SAndroid Build Coastguard Worker getValueSitesForKind(Kind).clear();
633*9880d681SAndroid Build Coastguard Worker }
634*9880d681SAndroid Build Coastguard Worker
635*9880d681SAndroid Build Coastguard Worker /// Get the error contained within the record's soft error counter.
takeErrorInstrProfRecord636*9880d681SAndroid Build Coastguard Worker Error takeError() { return SIPE.takeError(); }
637*9880d681SAndroid Build Coastguard Worker
638*9880d681SAndroid Build Coastguard Worker private:
639*9880d681SAndroid Build Coastguard Worker std::vector<InstrProfValueSiteRecord> IndirectCallSites;
640*9880d681SAndroid Build Coastguard Worker const std::vector<InstrProfValueSiteRecord> &
getValueSitesForKindInstrProfRecord641*9880d681SAndroid Build Coastguard Worker getValueSitesForKind(uint32_t ValueKind) const {
642*9880d681SAndroid Build Coastguard Worker switch (ValueKind) {
643*9880d681SAndroid Build Coastguard Worker case IPVK_IndirectCallTarget:
644*9880d681SAndroid Build Coastguard Worker return IndirectCallSites;
645*9880d681SAndroid Build Coastguard Worker default:
646*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unknown value kind!");
647*9880d681SAndroid Build Coastguard Worker }
648*9880d681SAndroid Build Coastguard Worker return IndirectCallSites;
649*9880d681SAndroid Build Coastguard Worker }
650*9880d681SAndroid Build Coastguard Worker
651*9880d681SAndroid Build Coastguard Worker std::vector<InstrProfValueSiteRecord> &
getValueSitesForKindInstrProfRecord652*9880d681SAndroid Build Coastguard Worker getValueSitesForKind(uint32_t ValueKind) {
653*9880d681SAndroid Build Coastguard Worker return const_cast<std::vector<InstrProfValueSiteRecord> &>(
654*9880d681SAndroid Build Coastguard Worker const_cast<const InstrProfRecord *>(this)
655*9880d681SAndroid Build Coastguard Worker ->getValueSitesForKind(ValueKind));
656*9880d681SAndroid Build Coastguard Worker }
657*9880d681SAndroid Build Coastguard Worker
658*9880d681SAndroid Build Coastguard Worker // Map indirect call target name hash to name string.
659*9880d681SAndroid Build Coastguard Worker uint64_t remapValue(uint64_t Value, uint32_t ValueKind,
660*9880d681SAndroid Build Coastguard Worker ValueMapType *HashKeys);
661*9880d681SAndroid Build Coastguard Worker
662*9880d681SAndroid Build Coastguard Worker // Merge Value Profile data from Src record to this record for ValueKind.
663*9880d681SAndroid Build Coastguard Worker // Scale merged value counts by \p Weight.
664*9880d681SAndroid Build Coastguard Worker void mergeValueProfData(uint32_t ValueKind, InstrProfRecord &Src,
665*9880d681SAndroid Build Coastguard Worker uint64_t Weight);
666*9880d681SAndroid Build Coastguard Worker // Scale up value profile data count.
667*9880d681SAndroid Build Coastguard Worker void scaleValueProfData(uint32_t ValueKind, uint64_t Weight);
668*9880d681SAndroid Build Coastguard Worker };
669*9880d681SAndroid Build Coastguard Worker
getNumValueKinds()670*9880d681SAndroid Build Coastguard Worker uint32_t InstrProfRecord::getNumValueKinds() const {
671*9880d681SAndroid Build Coastguard Worker uint32_t NumValueKinds = 0;
672*9880d681SAndroid Build Coastguard Worker for (uint32_t Kind = IPVK_First; Kind <= IPVK_Last; ++Kind)
673*9880d681SAndroid Build Coastguard Worker NumValueKinds += !(getValueSitesForKind(Kind).empty());
674*9880d681SAndroid Build Coastguard Worker return NumValueKinds;
675*9880d681SAndroid Build Coastguard Worker }
676*9880d681SAndroid Build Coastguard Worker
getNumValueData(uint32_t ValueKind)677*9880d681SAndroid Build Coastguard Worker uint32_t InstrProfRecord::getNumValueData(uint32_t ValueKind) const {
678*9880d681SAndroid Build Coastguard Worker uint32_t N = 0;
679*9880d681SAndroid Build Coastguard Worker const std::vector<InstrProfValueSiteRecord> &SiteRecords =
680*9880d681SAndroid Build Coastguard Worker getValueSitesForKind(ValueKind);
681*9880d681SAndroid Build Coastguard Worker for (auto &SR : SiteRecords) {
682*9880d681SAndroid Build Coastguard Worker N += SR.ValueData.size();
683*9880d681SAndroid Build Coastguard Worker }
684*9880d681SAndroid Build Coastguard Worker return N;
685*9880d681SAndroid Build Coastguard Worker }
686*9880d681SAndroid Build Coastguard Worker
getNumValueSites(uint32_t ValueKind)687*9880d681SAndroid Build Coastguard Worker uint32_t InstrProfRecord::getNumValueSites(uint32_t ValueKind) const {
688*9880d681SAndroid Build Coastguard Worker return getValueSitesForKind(ValueKind).size();
689*9880d681SAndroid Build Coastguard Worker }
690*9880d681SAndroid Build Coastguard Worker
getNumValueDataForSite(uint32_t ValueKind,uint32_t Site)691*9880d681SAndroid Build Coastguard Worker uint32_t InstrProfRecord::getNumValueDataForSite(uint32_t ValueKind,
692*9880d681SAndroid Build Coastguard Worker uint32_t Site) const {
693*9880d681SAndroid Build Coastguard Worker return getValueSitesForKind(ValueKind)[Site].ValueData.size();
694*9880d681SAndroid Build Coastguard Worker }
695*9880d681SAndroid Build Coastguard Worker
696*9880d681SAndroid Build Coastguard Worker std::unique_ptr<InstrProfValueData[]>
getValueForSite(uint32_t ValueKind,uint32_t Site,uint64_t * TotalC)697*9880d681SAndroid Build Coastguard Worker InstrProfRecord::getValueForSite(uint32_t ValueKind, uint32_t Site,
698*9880d681SAndroid Build Coastguard Worker uint64_t *TotalC) const {
699*9880d681SAndroid Build Coastguard Worker uint64_t Dummy;
700*9880d681SAndroid Build Coastguard Worker uint64_t &TotalCount = (TotalC == 0 ? Dummy : *TotalC);
701*9880d681SAndroid Build Coastguard Worker uint32_t N = getNumValueDataForSite(ValueKind, Site);
702*9880d681SAndroid Build Coastguard Worker if (N == 0) {
703*9880d681SAndroid Build Coastguard Worker TotalCount = 0;
704*9880d681SAndroid Build Coastguard Worker return std::unique_ptr<InstrProfValueData[]>(nullptr);
705*9880d681SAndroid Build Coastguard Worker }
706*9880d681SAndroid Build Coastguard Worker
707*9880d681SAndroid Build Coastguard Worker auto VD = llvm::make_unique<InstrProfValueData[]>(N);
708*9880d681SAndroid Build Coastguard Worker TotalCount = getValueForSite(VD.get(), ValueKind, Site);
709*9880d681SAndroid Build Coastguard Worker
710*9880d681SAndroid Build Coastguard Worker return VD;
711*9880d681SAndroid Build Coastguard Worker }
712*9880d681SAndroid Build Coastguard Worker
getValueForSite(InstrProfValueData Dest[],uint32_t ValueKind,uint32_t Site)713*9880d681SAndroid Build Coastguard Worker uint64_t InstrProfRecord::getValueForSite(InstrProfValueData Dest[],
714*9880d681SAndroid Build Coastguard Worker uint32_t ValueKind,
715*9880d681SAndroid Build Coastguard Worker uint32_t Site) const {
716*9880d681SAndroid Build Coastguard Worker uint32_t I = 0;
717*9880d681SAndroid Build Coastguard Worker uint64_t TotalCount = 0;
718*9880d681SAndroid Build Coastguard Worker for (auto V : getValueSitesForKind(ValueKind)[Site].ValueData) {
719*9880d681SAndroid Build Coastguard Worker Dest[I].Value = V.Value;
720*9880d681SAndroid Build Coastguard Worker Dest[I].Count = V.Count;
721*9880d681SAndroid Build Coastguard Worker TotalCount = SaturatingAdd(TotalCount, V.Count);
722*9880d681SAndroid Build Coastguard Worker I++;
723*9880d681SAndroid Build Coastguard Worker }
724*9880d681SAndroid Build Coastguard Worker return TotalCount;
725*9880d681SAndroid Build Coastguard Worker }
726*9880d681SAndroid Build Coastguard Worker
reserveSites(uint32_t ValueKind,uint32_t NumValueSites)727*9880d681SAndroid Build Coastguard Worker void InstrProfRecord::reserveSites(uint32_t ValueKind, uint32_t NumValueSites) {
728*9880d681SAndroid Build Coastguard Worker std::vector<InstrProfValueSiteRecord> &ValueSites =
729*9880d681SAndroid Build Coastguard Worker getValueSitesForKind(ValueKind);
730*9880d681SAndroid Build Coastguard Worker ValueSites.reserve(NumValueSites);
731*9880d681SAndroid Build Coastguard Worker }
732*9880d681SAndroid Build Coastguard Worker
getHostEndianness()733*9880d681SAndroid Build Coastguard Worker inline support::endianness getHostEndianness() {
734*9880d681SAndroid Build Coastguard Worker return sys::IsLittleEndianHost ? support::little : support::big;
735*9880d681SAndroid Build Coastguard Worker }
736*9880d681SAndroid Build Coastguard Worker
737*9880d681SAndroid Build Coastguard Worker // Include definitions for value profile data
738*9880d681SAndroid Build Coastguard Worker #define INSTR_PROF_VALUE_PROF_DATA
739*9880d681SAndroid Build Coastguard Worker #include "llvm/ProfileData/InstrProfData.inc"
740*9880d681SAndroid Build Coastguard Worker
sortByCount()741*9880d681SAndroid Build Coastguard Worker void InstrProfValueSiteRecord::sortByCount() {
742*9880d681SAndroid Build Coastguard Worker ValueData.sort(
743*9880d681SAndroid Build Coastguard Worker [](const InstrProfValueData &left, const InstrProfValueData &right) {
744*9880d681SAndroid Build Coastguard Worker return left.Count > right.Count;
745*9880d681SAndroid Build Coastguard Worker });
746*9880d681SAndroid Build Coastguard Worker // Now truncate
747*9880d681SAndroid Build Coastguard Worker size_t max_s = INSTR_PROF_MAX_NUM_VAL_PER_SITE;
748*9880d681SAndroid Build Coastguard Worker if (ValueData.size() > max_s)
749*9880d681SAndroid Build Coastguard Worker ValueData.resize(max_s);
750*9880d681SAndroid Build Coastguard Worker }
751*9880d681SAndroid Build Coastguard Worker
752*9880d681SAndroid Build Coastguard Worker namespace IndexedInstrProf {
753*9880d681SAndroid Build Coastguard Worker
754*9880d681SAndroid Build Coastguard Worker enum class HashT : uint32_t {
755*9880d681SAndroid Build Coastguard Worker MD5,
756*9880d681SAndroid Build Coastguard Worker
757*9880d681SAndroid Build Coastguard Worker Last = MD5
758*9880d681SAndroid Build Coastguard Worker };
759*9880d681SAndroid Build Coastguard Worker
ComputeHash(HashT Type,StringRef K)760*9880d681SAndroid Build Coastguard Worker inline uint64_t ComputeHash(HashT Type, StringRef K) {
761*9880d681SAndroid Build Coastguard Worker switch (Type) {
762*9880d681SAndroid Build Coastguard Worker case HashT::MD5:
763*9880d681SAndroid Build Coastguard Worker return MD5Hash(K);
764*9880d681SAndroid Build Coastguard Worker }
765*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unhandled hash type");
766*9880d681SAndroid Build Coastguard Worker }
767*9880d681SAndroid Build Coastguard Worker
768*9880d681SAndroid Build Coastguard Worker const uint64_t Magic = 0x8169666f72706cff; // "\xfflprofi\x81"
769*9880d681SAndroid Build Coastguard Worker
770*9880d681SAndroid Build Coastguard Worker enum ProfVersion {
771*9880d681SAndroid Build Coastguard Worker // Version 1 is the first version. In this version, the value of
772*9880d681SAndroid Build Coastguard Worker // a key/value pair can only include profile data of a single function.
773*9880d681SAndroid Build Coastguard Worker // Due to this restriction, the number of block counters for a given
774*9880d681SAndroid Build Coastguard Worker // function is not recorded but derived from the length of the value.
775*9880d681SAndroid Build Coastguard Worker Version1 = 1,
776*9880d681SAndroid Build Coastguard Worker // The version 2 format supports recording profile data of multiple
777*9880d681SAndroid Build Coastguard Worker // functions which share the same key in one value field. To support this,
778*9880d681SAndroid Build Coastguard Worker // the number block counters is recorded as an uint64_t field right after the
779*9880d681SAndroid Build Coastguard Worker // function structural hash.
780*9880d681SAndroid Build Coastguard Worker Version2 = 2,
781*9880d681SAndroid Build Coastguard Worker // Version 3 supports value profile data. The value profile data is expected
782*9880d681SAndroid Build Coastguard Worker // to follow the block counter profile data.
783*9880d681SAndroid Build Coastguard Worker Version3 = 3,
784*9880d681SAndroid Build Coastguard Worker // In this version, profile summary data \c IndexedInstrProf::Summary is
785*9880d681SAndroid Build Coastguard Worker // stored after the profile header.
786*9880d681SAndroid Build Coastguard Worker Version4 = 4,
787*9880d681SAndroid Build Coastguard Worker // The current version is 4.
788*9880d681SAndroid Build Coastguard Worker CurrentVersion = INSTR_PROF_INDEX_VERSION
789*9880d681SAndroid Build Coastguard Worker };
790*9880d681SAndroid Build Coastguard Worker const uint64_t Version = ProfVersion::CurrentVersion;
791*9880d681SAndroid Build Coastguard Worker
792*9880d681SAndroid Build Coastguard Worker const HashT HashType = HashT::MD5;
793*9880d681SAndroid Build Coastguard Worker
ComputeHash(StringRef K)794*9880d681SAndroid Build Coastguard Worker inline uint64_t ComputeHash(StringRef K) { return ComputeHash(HashType, K); }
795*9880d681SAndroid Build Coastguard Worker
796*9880d681SAndroid Build Coastguard Worker // This structure defines the file header of the LLVM profile
797*9880d681SAndroid Build Coastguard Worker // data file in indexed-format.
798*9880d681SAndroid Build Coastguard Worker struct Header {
799*9880d681SAndroid Build Coastguard Worker uint64_t Magic;
800*9880d681SAndroid Build Coastguard Worker uint64_t Version;
801*9880d681SAndroid Build Coastguard Worker uint64_t Unused; // Becomes unused since version 4
802*9880d681SAndroid Build Coastguard Worker uint64_t HashType;
803*9880d681SAndroid Build Coastguard Worker uint64_t HashOffset;
804*9880d681SAndroid Build Coastguard Worker };
805*9880d681SAndroid Build Coastguard Worker
806*9880d681SAndroid Build Coastguard Worker // Profile summary data recorded in the profile data file in indexed
807*9880d681SAndroid Build Coastguard Worker // format. It is introduced in version 4. The summary data follows
808*9880d681SAndroid Build Coastguard Worker // right after the profile file header.
809*9880d681SAndroid Build Coastguard Worker struct Summary {
810*9880d681SAndroid Build Coastguard Worker
811*9880d681SAndroid Build Coastguard Worker struct Entry {
812*9880d681SAndroid Build Coastguard Worker uint64_t Cutoff; ///< The required percentile of total execution count.
813*9880d681SAndroid Build Coastguard Worker uint64_t
814*9880d681SAndroid Build Coastguard Worker MinBlockCount; ///< The minimum execution count for this percentile.
815*9880d681SAndroid Build Coastguard Worker uint64_t NumBlocks; ///< Number of blocks >= the minumum execution count.
816*9880d681SAndroid Build Coastguard Worker };
817*9880d681SAndroid Build Coastguard Worker // The field kind enumerator to assigned value mapping should remain
818*9880d681SAndroid Build Coastguard Worker // unchanged when a new kind is added or an old kind gets deleted in
819*9880d681SAndroid Build Coastguard Worker // the future.
820*9880d681SAndroid Build Coastguard Worker enum SummaryFieldKind {
821*9880d681SAndroid Build Coastguard Worker /// The total number of functions instrumented.
822*9880d681SAndroid Build Coastguard Worker TotalNumFunctions = 0,
823*9880d681SAndroid Build Coastguard Worker /// Total number of instrumented blocks/edges.
824*9880d681SAndroid Build Coastguard Worker TotalNumBlocks = 1,
825*9880d681SAndroid Build Coastguard Worker /// The maximal execution count among all functions.
826*9880d681SAndroid Build Coastguard Worker /// This field does not exist for profile data from IR based
827*9880d681SAndroid Build Coastguard Worker /// instrumentation.
828*9880d681SAndroid Build Coastguard Worker MaxFunctionCount = 2,
829*9880d681SAndroid Build Coastguard Worker /// Max block count of the program.
830*9880d681SAndroid Build Coastguard Worker MaxBlockCount = 3,
831*9880d681SAndroid Build Coastguard Worker /// Max internal block count of the program (excluding entry blocks).
832*9880d681SAndroid Build Coastguard Worker MaxInternalBlockCount = 4,
833*9880d681SAndroid Build Coastguard Worker /// The sum of all instrumented block counts.
834*9880d681SAndroid Build Coastguard Worker TotalBlockCount = 5,
835*9880d681SAndroid Build Coastguard Worker NumKinds = TotalBlockCount + 1
836*9880d681SAndroid Build Coastguard Worker };
837*9880d681SAndroid Build Coastguard Worker
838*9880d681SAndroid Build Coastguard Worker // The number of summmary fields following the summary header.
839*9880d681SAndroid Build Coastguard Worker uint64_t NumSummaryFields;
840*9880d681SAndroid Build Coastguard Worker // The number of Cutoff Entries (Summary::Entry) following summary fields.
841*9880d681SAndroid Build Coastguard Worker uint64_t NumCutoffEntries;
842*9880d681SAndroid Build Coastguard Worker
getSizeSummary843*9880d681SAndroid Build Coastguard Worker static uint32_t getSize(uint32_t NumSumFields, uint32_t NumCutoffEntries) {
844*9880d681SAndroid Build Coastguard Worker return sizeof(Summary) + NumCutoffEntries * sizeof(Entry) +
845*9880d681SAndroid Build Coastguard Worker NumSumFields * sizeof(uint64_t);
846*9880d681SAndroid Build Coastguard Worker }
847*9880d681SAndroid Build Coastguard Worker
getSummaryDataBaseSummary848*9880d681SAndroid Build Coastguard Worker const uint64_t *getSummaryDataBase() const {
849*9880d681SAndroid Build Coastguard Worker return reinterpret_cast<const uint64_t *>(this + 1);
850*9880d681SAndroid Build Coastguard Worker }
getSummaryDataBaseSummary851*9880d681SAndroid Build Coastguard Worker uint64_t *getSummaryDataBase() {
852*9880d681SAndroid Build Coastguard Worker return reinterpret_cast<uint64_t *>(this + 1);
853*9880d681SAndroid Build Coastguard Worker }
getCutoffEntryBaseSummary854*9880d681SAndroid Build Coastguard Worker const Entry *getCutoffEntryBase() const {
855*9880d681SAndroid Build Coastguard Worker return reinterpret_cast<const Entry *>(
856*9880d681SAndroid Build Coastguard Worker &getSummaryDataBase()[NumSummaryFields]);
857*9880d681SAndroid Build Coastguard Worker }
getCutoffEntryBaseSummary858*9880d681SAndroid Build Coastguard Worker Entry *getCutoffEntryBase() {
859*9880d681SAndroid Build Coastguard Worker return reinterpret_cast<Entry *>(&getSummaryDataBase()[NumSummaryFields]);
860*9880d681SAndroid Build Coastguard Worker }
861*9880d681SAndroid Build Coastguard Worker
getSummary862*9880d681SAndroid Build Coastguard Worker uint64_t get(SummaryFieldKind K) const {
863*9880d681SAndroid Build Coastguard Worker return getSummaryDataBase()[K];
864*9880d681SAndroid Build Coastguard Worker }
865*9880d681SAndroid Build Coastguard Worker
setSummary866*9880d681SAndroid Build Coastguard Worker void set(SummaryFieldKind K, uint64_t V) {
867*9880d681SAndroid Build Coastguard Worker getSummaryDataBase()[K] = V;
868*9880d681SAndroid Build Coastguard Worker }
869*9880d681SAndroid Build Coastguard Worker
getEntrySummary870*9880d681SAndroid Build Coastguard Worker const Entry &getEntry(uint32_t I) const { return getCutoffEntryBase()[I]; }
setEntrySummary871*9880d681SAndroid Build Coastguard Worker void setEntry(uint32_t I, const ProfileSummaryEntry &E) {
872*9880d681SAndroid Build Coastguard Worker Entry &ER = getCutoffEntryBase()[I];
873*9880d681SAndroid Build Coastguard Worker ER.Cutoff = E.Cutoff;
874*9880d681SAndroid Build Coastguard Worker ER.MinBlockCount = E.MinCount;
875*9880d681SAndroid Build Coastguard Worker ER.NumBlocks = E.NumCounts;
876*9880d681SAndroid Build Coastguard Worker }
877*9880d681SAndroid Build Coastguard Worker
SummarySummary878*9880d681SAndroid Build Coastguard Worker Summary(uint32_t Size) { memset(this, 0, Size); }
deleteSummary879*9880d681SAndroid Build Coastguard Worker void operator delete(void *ptr) { ::operator delete(ptr); }
880*9880d681SAndroid Build Coastguard Worker
881*9880d681SAndroid Build Coastguard Worker Summary() = delete;
882*9880d681SAndroid Build Coastguard Worker };
883*9880d681SAndroid Build Coastguard Worker
allocSummary(uint32_t TotalSize)884*9880d681SAndroid Build Coastguard Worker inline std::unique_ptr<Summary> allocSummary(uint32_t TotalSize) {
885*9880d681SAndroid Build Coastguard Worker return std::unique_ptr<Summary>(new (::operator new(TotalSize))
886*9880d681SAndroid Build Coastguard Worker Summary(TotalSize));
887*9880d681SAndroid Build Coastguard Worker }
888*9880d681SAndroid Build Coastguard Worker } // end namespace IndexedInstrProf
889*9880d681SAndroid Build Coastguard Worker
890*9880d681SAndroid Build Coastguard Worker namespace RawInstrProf {
891*9880d681SAndroid Build Coastguard Worker
892*9880d681SAndroid Build Coastguard Worker // Version 1: First version
893*9880d681SAndroid Build Coastguard Worker // Version 2: Added value profile data section. Per-function control data
894*9880d681SAndroid Build Coastguard Worker // struct has more fields to describe value profile information.
895*9880d681SAndroid Build Coastguard Worker // Version 3: Compressed name section support. Function PGO name reference
896*9880d681SAndroid Build Coastguard Worker // from control data struct is changed from raw pointer to Name's MD5 value.
897*9880d681SAndroid Build Coastguard Worker // Version 4: ValueDataBegin and ValueDataSizes fields are removed from the
898*9880d681SAndroid Build Coastguard Worker // raw header.
899*9880d681SAndroid Build Coastguard Worker const uint64_t Version = INSTR_PROF_RAW_VERSION;
900*9880d681SAndroid Build Coastguard Worker
901*9880d681SAndroid Build Coastguard Worker template <class IntPtrT> inline uint64_t getMagic();
902*9880d681SAndroid Build Coastguard Worker template <> inline uint64_t getMagic<uint64_t>() {
903*9880d681SAndroid Build Coastguard Worker return INSTR_PROF_RAW_MAGIC_64;
904*9880d681SAndroid Build Coastguard Worker }
905*9880d681SAndroid Build Coastguard Worker
906*9880d681SAndroid Build Coastguard Worker template <> inline uint64_t getMagic<uint32_t>() {
907*9880d681SAndroid Build Coastguard Worker return INSTR_PROF_RAW_MAGIC_32;
908*9880d681SAndroid Build Coastguard Worker }
909*9880d681SAndroid Build Coastguard Worker
910*9880d681SAndroid Build Coastguard Worker // Per-function profile data header/control structure.
911*9880d681SAndroid Build Coastguard Worker // The definition should match the structure defined in
912*9880d681SAndroid Build Coastguard Worker // compiler-rt/lib/profile/InstrProfiling.h.
913*9880d681SAndroid Build Coastguard Worker // It should also match the synthesized type in
914*9880d681SAndroid Build Coastguard Worker // Transforms/Instrumentation/InstrProfiling.cpp:getOrCreateRegionCounters.
915*9880d681SAndroid Build Coastguard Worker template <class IntPtrT> struct LLVM_ALIGNAS(8) ProfileData {
916*9880d681SAndroid Build Coastguard Worker #define INSTR_PROF_DATA(Type, LLVMType, Name, Init) Type Name;
917*9880d681SAndroid Build Coastguard Worker #include "llvm/ProfileData/InstrProfData.inc"
918*9880d681SAndroid Build Coastguard Worker };
919*9880d681SAndroid Build Coastguard Worker
920*9880d681SAndroid Build Coastguard Worker // File header structure of the LLVM profile data in raw format.
921*9880d681SAndroid Build Coastguard Worker // The definition should match the header referenced in
922*9880d681SAndroid Build Coastguard Worker // compiler-rt/lib/profile/InstrProfilingFile.c and
923*9880d681SAndroid Build Coastguard Worker // InstrProfilingBuffer.c.
924*9880d681SAndroid Build Coastguard Worker struct Header {
925*9880d681SAndroid Build Coastguard Worker #define INSTR_PROF_RAW_HEADER(Type, Name, Init) const Type Name;
926*9880d681SAndroid Build Coastguard Worker #include "llvm/ProfileData/InstrProfData.inc"
927*9880d681SAndroid Build Coastguard Worker };
928*9880d681SAndroid Build Coastguard Worker
929*9880d681SAndroid Build Coastguard Worker } // end namespace RawInstrProf
930*9880d681SAndroid Build Coastguard Worker
931*9880d681SAndroid Build Coastguard Worker } // end namespace llvm
932*9880d681SAndroid Build Coastguard Worker
933*9880d681SAndroid Build Coastguard Worker #endif // LLVM_PROFILEDATA_INSTRPROF_H
934