mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
beb273cb73
Besides a general consistently benefit, the extra layer of indirection allows the mechanical part of https://reviews.llvm.org/D23256 that requires touching every transformation and analysis to be factored out cleanly. Thanks to David for the suggestion. llvm-svn: 278078
106 lines
3.5 KiB
C++
106 lines
3.5 KiB
C++
//===- Transforms/InstrProfiling.h - Instrumentation passes ---*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
/// \file
|
|
/// This file provides the interface for LLVM's PGO Instrumentation lowering
|
|
/// pass.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TRANSFORMS_INSTRPROFILING_H
|
|
#define LLVM_TRANSFORMS_INSTRPROFILING_H
|
|
|
|
#include "llvm/IR/IntrinsicInst.h"
|
|
#include "llvm/IR/PassManager.h"
|
|
#include "llvm/ProfileData/InstrProf.h"
|
|
#include "llvm/Transforms/Instrumentation.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// Instrumenation based profiling lowering pass. This pass lowers
|
|
/// the profile instrumented code generated by FE or the IR based
|
|
/// instrumentation pass.
|
|
class InstrProfiling : public PassInfoMixin<InstrProfiling> {
|
|
public:
|
|
InstrProfiling() {}
|
|
InstrProfiling(const InstrProfOptions &Options) : Options(Options) {}
|
|
|
|
PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
|
|
bool run(Module &M);
|
|
|
|
private:
|
|
InstrProfOptions Options;
|
|
Module *M;
|
|
struct PerFunctionProfileData {
|
|
uint32_t NumValueSites[IPVK_Last + 1];
|
|
GlobalVariable *RegionCounters;
|
|
GlobalVariable *DataVar;
|
|
PerFunctionProfileData() : RegionCounters(nullptr), DataVar(nullptr) {
|
|
memset(NumValueSites, 0, sizeof(uint32_t) * (IPVK_Last + 1));
|
|
}
|
|
};
|
|
DenseMap<GlobalVariable *, PerFunctionProfileData> ProfileDataMap;
|
|
std::vector<Value *> UsedVars;
|
|
std::vector<GlobalVariable *> ReferencedNames;
|
|
GlobalVariable *NamesVar;
|
|
size_t NamesSize;
|
|
|
|
bool isMachO() const;
|
|
|
|
/// Get the section name for the counter variables.
|
|
StringRef getCountersSection() const;
|
|
|
|
/// Get the section name for the name variables.
|
|
StringRef getNameSection() const;
|
|
|
|
/// Get the section name for the profile data variables.
|
|
StringRef getDataSection() const;
|
|
|
|
/// Get the section name for the coverage mapping data.
|
|
StringRef getCoverageSection() const;
|
|
|
|
/// Count the number of instrumented value sites for the function.
|
|
void computeNumValueSiteCounts(InstrProfValueProfileInst *Ins);
|
|
|
|
/// Replace instrprof_value_profile with a call to runtime library.
|
|
void lowerValueProfileInst(InstrProfValueProfileInst *Ins);
|
|
|
|
/// Replace instrprof_increment with an increment of the appropriate value.
|
|
void lowerIncrement(InstrProfIncrementInst *Inc);
|
|
|
|
/// Force emitting of name vars for unused functions.
|
|
void lowerCoverageData(GlobalVariable *CoverageNamesVar);
|
|
|
|
/// Get the region counters for an increment, creating them if necessary.
|
|
///
|
|
/// If the counter array doesn't yet exist, the profile data variables
|
|
/// referring to them will also be created.
|
|
GlobalVariable *getOrCreateRegionCounters(InstrProfIncrementInst *Inc);
|
|
|
|
/// Emit the section with compressed function names.
|
|
void emitNameData();
|
|
|
|
/// Emit value nodes section for value profiling.
|
|
void emitVNodes();
|
|
|
|
/// Emit runtime registration functions for each profile data variable.
|
|
void emitRegistration();
|
|
|
|
/// Emit the necessary plumbing to pull in the runtime initialization.
|
|
void emitRuntimeHook();
|
|
|
|
/// Add uses of our data variables and runtime hook.
|
|
void emitUses();
|
|
|
|
/// Create a static initializer for our data, on platforms that need it,
|
|
/// and for any profile output file that was specified.
|
|
void emitInitialization();
|
|
};
|
|
|
|
} // End llvm namespace
|
|
#endif
|