1 //===- Transforms/InstrProfiling.h - Instrumentation passes -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 /// This file provides the interface for LLVM's PGO Instrumentation lowering
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_TRANSFORMS_INSTRPROFILING_H
15 #define LLVM_TRANSFORMS_INSTRPROFILING_H
17 #include "llvm/ADT/DenseMap.h"
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/IR/IntrinsicInst.h"
20 #include "llvm/IR/PassManager.h"
21 #include "llvm/ProfileData/InstrProf.h"
22 #include "llvm/Transforms/Instrumentation.h"
30 class TargetLibraryInfo;
32 /// Instrumentation based profiling lowering pass. This pass lowers
33 /// the profile instrumented code generated by FE or the IR based
34 /// instrumentation pass.
35 class InstrProfiling : public PassInfoMixin<InstrProfiling> {
37 InstrProfiling() = default;
38 InstrProfiling(const InstrProfOptions &Options) : Options(Options) {}
40 PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
41 bool run(Module &M, const TargetLibraryInfo &TLI);
44 InstrProfOptions Options;
47 const TargetLibraryInfo *TLI;
48 struct PerFunctionProfileData {
49 uint32_t NumValueSites[IPVK_Last + 1];
50 GlobalVariable *RegionCounters = nullptr;
51 GlobalVariable *DataVar = nullptr;
53 PerFunctionProfileData() {
54 memset(NumValueSites, 0, sizeof(uint32_t) * (IPVK_Last + 1));
57 DenseMap<GlobalVariable *, PerFunctionProfileData> ProfileDataMap;
58 std::vector<GlobalValue *> UsedVars;
59 std::vector<GlobalVariable *> ReferencedNames;
60 GlobalVariable *NamesVar;
63 // The start value of precise value profile range for memory intrinsic sizes.
64 int64_t MemOPSizeRangeStart;
65 // The end value of precise value profile range for memory intrinsic sizes.
66 int64_t MemOPSizeRangeLast;
68 /// Count the number of instrumented value sites for the function.
69 void computeNumValueSiteCounts(InstrProfValueProfileInst *Ins);
71 /// Replace instrprof_value_profile with a call to runtime library.
72 void lowerValueProfileInst(InstrProfValueProfileInst *Ins);
74 /// Replace instrprof_increment with an increment of the appropriate value.
75 void lowerIncrement(InstrProfIncrementInst *Inc);
77 /// Force emitting of name vars for unused functions.
78 void lowerCoverageData(GlobalVariable *CoverageNamesVar);
80 /// Get the region counters for an increment, creating them if necessary.
82 /// If the counter array doesn't yet exist, the profile data variables
83 /// referring to them will also be created.
84 GlobalVariable *getOrCreateRegionCounters(InstrProfIncrementInst *Inc);
86 /// Emit the section with compressed function names.
89 /// Emit value nodes section for value profiling.
92 /// Emit runtime registration functions for each profile data variable.
93 void emitRegistration();
95 /// Emit the necessary plumbing to pull in the runtime initialization.
96 void emitRuntimeHook();
98 /// Add uses of our data variables and runtime hook.
101 /// Create a static initializer for our data, on platforms that need it,
102 /// and for any profile output file that was specified.
103 void emitInitialization();
106 } // end namespace llvm
108 #endif // LLVM_TRANSFORMS_INSTRPROFILING_H