mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:40:38 +00:00
Port InstrProfiling pass to the new pass manager
Differential Revision: http://reviews.llvm.org/D18126 llvm-svn: 266637
This commit is contained in:
parent
3b3d060fd0
commit
8a449b13f6
@ -124,7 +124,7 @@ void initializeAAResultsWrapperPassPass(PassRegistry &);
|
||||
void initializeGCOVProfilerPass(PassRegistry&);
|
||||
void initializePGOInstrumentationGenPass(PassRegistry&);
|
||||
void initializePGOInstrumentationUsePass(PassRegistry&);
|
||||
void initializeInstrProfilingPass(PassRegistry&);
|
||||
void initializeInstrProfilingLegacyPassPass(PassRegistry &);
|
||||
void initializeAddressSanitizerPass(PassRegistry&);
|
||||
void initializeAddressSanitizerModulePass(PassRegistry&);
|
||||
void initializeMemorySanitizerPass(PassRegistry&);
|
||||
|
@ -91,7 +91,7 @@ namespace {
|
||||
(void) llvm::createGCOVProfilerPass();
|
||||
(void) llvm::createPGOInstrumentationGenPass();
|
||||
(void) llvm::createPGOInstrumentationUsePass();
|
||||
(void) llvm::createInstrProfilingPass();
|
||||
(void) llvm::createInstrProfilingLegacyPass();
|
||||
(void) llvm::createFunctionImportPass();
|
||||
(void) llvm::createFunctionInliningPass();
|
||||
(void) llvm::createAlwaysInlinerPass();
|
||||
|
@ -96,7 +96,7 @@ struct InstrProfOptions {
|
||||
};
|
||||
|
||||
/// Insert frontend instrumentation based profiling.
|
||||
ModulePass *createInstrProfilingPass(
|
||||
ModulePass *createInstrProfilingLegacyPass(
|
||||
const InstrProfOptions &Options = InstrProfOptions());
|
||||
|
||||
// Insert AddressSanitizer (address sanity checking) instrumentation
|
||||
|
@ -49,6 +49,7 @@
|
||||
#include "llvm/Transforms/IPO/InferFunctionAttrs.h"
|
||||
#include "llvm/Transforms/IPO/StripDeadPrototypes.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombine.h"
|
||||
#include "llvm/Transforms/InstrProfiling.h"
|
||||
#include "llvm/Transforms/Scalar/ADCE.h"
|
||||
#include "llvm/Transforms/Scalar/EarlyCSE.h"
|
||||
#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
|
||||
|
@ -37,6 +37,7 @@ MODULE_ALIAS_ANALYSIS("globals-aa", GlobalsAA())
|
||||
#endif
|
||||
MODULE_PASS("forceattrs", ForceFunctionAttrsPass())
|
||||
MODULE_PASS("inferattrs", InferFunctionAttrsPass())
|
||||
MODULE_PASS("instrprof", InstrProfiling())
|
||||
MODULE_PASS("invalidate<all>", InvalidateAllAnalysesPass())
|
||||
MODULE_PASS("no-op-module", NoOpModulePass())
|
||||
MODULE_PASS("print", PrintModulePass(dbgs()))
|
||||
|
@ -220,7 +220,7 @@ void PassManagerBuilder::addPGOInstrPasses(legacy::PassManagerBase &MPM) {
|
||||
// Add the profile lowering pass.
|
||||
InstrProfOptions Options;
|
||||
Options.InstrProfileOutput = PGOInstrGen;
|
||||
MPM.add(createInstrProfilingPass(Options));
|
||||
MPM.add(createInstrProfilingLegacyPass(Options));
|
||||
}
|
||||
if (!PGOInstrUse.empty())
|
||||
MPM.add(createPGOInstrumentationUsePass(PGOInstrUse));
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/ProfileData/InstrProf.h"
|
||||
#include "llvm/Transforms/Instrumentation.h"
|
||||
#include "llvm/Transforms/InstrProfiling.h"
|
||||
#include "llvm/Transforms/Utils/ModuleUtils.h"
|
||||
|
||||
using namespace llvm;
|
||||
@ -31,113 +31,68 @@ cl::opt<bool> DoNameCompression("enable-name-compression",
|
||||
cl::desc("Enable name string compression"),
|
||||
cl::init(true));
|
||||
|
||||
class InstrProfiling : public ModulePass {
|
||||
class InstrProfilingLegacyPass : public ModulePass {
|
||||
InstrProfiling InstrProf;
|
||||
|
||||
public:
|
||||
static char ID;
|
||||
|
||||
InstrProfiling() : ModulePass(ID) {}
|
||||
|
||||
InstrProfiling(const InstrProfOptions &Options)
|
||||
: ModulePass(ID), Options(Options) {}
|
||||
|
||||
InstrProfilingLegacyPass() : ModulePass(ID), InstrProf() {}
|
||||
InstrProfilingLegacyPass(const InstrProfOptions &Options)
|
||||
: ModulePass(ID), InstrProf(Options) {}
|
||||
const char *getPassName() const override {
|
||||
return "Frontend instrumentation-based coverage lowering";
|
||||
}
|
||||
|
||||
bool runOnModule(Module &M) override;
|
||||
bool runOnModule(Module &M) override { return InstrProf.run(M); }
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.setPreservesCFG();
|
||||
}
|
||||
|
||||
private:
|
||||
InstrProfOptions Options;
|
||||
Module *M;
|
||||
typedef 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));
|
||||
}
|
||||
} PerFunctionProfileData;
|
||||
DenseMap<GlobalVariable *, PerFunctionProfileData> ProfileDataMap;
|
||||
std::vector<Value *> UsedVars;
|
||||
std::vector<GlobalVariable *> ReferencedNames;
|
||||
GlobalVariable *NamesVar;
|
||||
size_t NamesSize;
|
||||
|
||||
bool isMachO() const {
|
||||
return Triple(M->getTargetTriple()).isOSBinFormatMachO();
|
||||
}
|
||||
|
||||
/// Get the section name for the counter variables.
|
||||
StringRef getCountersSection() const {
|
||||
return getInstrProfCountersSectionName(isMachO());
|
||||
}
|
||||
|
||||
/// Get the section name for the name variables.
|
||||
StringRef getNameSection() const {
|
||||
return getInstrProfNameSectionName(isMachO());
|
||||
}
|
||||
|
||||
/// Get the section name for the profile data variables.
|
||||
StringRef getDataSection() const {
|
||||
return getInstrProfDataSectionName(isMachO());
|
||||
}
|
||||
|
||||
/// Get the section name for the coverage mapping data.
|
||||
StringRef getCoverageSection() const {
|
||||
return getInstrProfCoverageSectionName(isMachO());
|
||||
}
|
||||
|
||||
/// 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 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();
|
||||
};
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
char InstrProfiling::ID = 0;
|
||||
INITIALIZE_PASS(InstrProfiling, "instrprof",
|
||||
PreservedAnalyses InstrProfiling::run(Module &M, AnalysisManager<Module> &AM) {
|
||||
if (!run(M))
|
||||
return PreservedAnalyses::all();
|
||||
|
||||
return PreservedAnalyses::none();
|
||||
}
|
||||
|
||||
char InstrProfilingLegacyPass::ID = 0;
|
||||
INITIALIZE_PASS(InstrProfilingLegacyPass, "instrprof",
|
||||
"Frontend instrumentation-based coverage lowering.", false,
|
||||
false)
|
||||
|
||||
ModulePass *llvm::createInstrProfilingPass(const InstrProfOptions &Options) {
|
||||
return new InstrProfiling(Options);
|
||||
ModulePass *llvm::createInstrProfilingLegacyPass(const InstrProfOptions &Options) {
|
||||
return new InstrProfilingLegacyPass(Options);
|
||||
}
|
||||
|
||||
bool InstrProfiling::runOnModule(Module &M) {
|
||||
bool InstrProfiling::isMachO() const {
|
||||
return Triple(M->getTargetTriple()).isOSBinFormatMachO();
|
||||
}
|
||||
|
||||
/// Get the section name for the counter variables.
|
||||
StringRef InstrProfiling::getCountersSection() const {
|
||||
return getInstrProfCountersSectionName(isMachO());
|
||||
}
|
||||
|
||||
/// Get the section name for the name variables.
|
||||
StringRef InstrProfiling::getNameSection() const {
|
||||
return getInstrProfNameSectionName(isMachO());
|
||||
}
|
||||
|
||||
/// Get the section name for the profile data variables.
|
||||
StringRef InstrProfiling::getDataSection() const {
|
||||
return getInstrProfDataSectionName(isMachO());
|
||||
}
|
||||
|
||||
/// Get the section name for the coverage mapping data.
|
||||
StringRef InstrProfiling::getCoverageSection() const {
|
||||
return getInstrProfCoverageSectionName(isMachO());
|
||||
}
|
||||
|
||||
bool InstrProfiling::run(Module &M) {
|
||||
bool MadeChange = false;
|
||||
|
||||
this->M = &M;
|
||||
|
@ -62,7 +62,7 @@ void llvm::initializeInstrumentation(PassRegistry &Registry) {
|
||||
initializeGCOVProfilerPass(Registry);
|
||||
initializePGOInstrumentationGenPass(Registry);
|
||||
initializePGOInstrumentationUsePass(Registry);
|
||||
initializeInstrProfilingPass(Registry);
|
||||
initializeInstrProfilingLegacyPassPass(Registry);
|
||||
initializeMemorySanitizerPass(Registry);
|
||||
initializeThreadSanitizerPass(Registry);
|
||||
initializeSanitizerCoverageModulePass(Registry);
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -instrprof -S | FileCheck %s
|
||||
; RUN: opt < %s -mtriple=x86_64-unknown-linux -instrprof -S | FileCheck %s
|
||||
; RUN: opt < %s -mtriple=x86_64-unknown-linux -passes=instrprof -S | FileCheck %s
|
||||
; RUN: opt < %s -mtriple=x86_64-pc-win32-coff -instrprof -S | FileCheck %s --check-prefix=COFF
|
||||
|
||||
$_Z3barIvEvv = comdat any
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -instrprof -S | FileCheck %s --check-prefix=OTHER --check-prefix=COMMON
|
||||
; RUN: opt < %s -mtriple=x86_64-unknown-linux -instrprof -S | FileCheck %s --check-prefix=LINUX --check-prefix=COMMON
|
||||
; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -passes=instrprof -S | FileCheck %s --check-prefix=OTHER --check-prefix=COMMON
|
||||
; RUN: opt < %s -mtriple=x86_64-unknown-linux -passes=instrprof -S | FileCheck %s --check-prefix=LINUX --check-prefix=COMMON
|
||||
|
||||
@__profn_foo = hidden constant [3 x i8] c"foo"
|
||||
@__profn_foo_weak = weak hidden constant [8 x i8] c"foo_weak"
|
||||
|
@ -1,6 +1,7 @@
|
||||
;; No instrumentation should be emitted if there are no counter increments.
|
||||
|
||||
; RUN: opt < %s -instrprof -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=instrprof -S | FileCheck %s
|
||||
; CHECK-NOT: @__profc
|
||||
; CHECK-NOT: @__profd
|
||||
; CHECK-NOT: @__llvm_profile_runtime
|
||||
|
@ -1,6 +1,7 @@
|
||||
;; Check that we don't emit the runtime hooks if the user provided them.
|
||||
|
||||
; RUN: opt < %s -instrprof -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=instrprof -S | FileCheck %s
|
||||
; CHECK-NOT: define {{.*}} @__llvm_profile_runtime_user()
|
||||
; CHECK-NOT: load i32, i32* @__llvm_profile_runtime
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
; RUN: opt < %s -mtriple=x86_64-apple-macosx10.10.0 -instrprof -S | FileCheck %s -check-prefix=MACHO
|
||||
; RUN: opt < %s -mtriple=x86_64-unknown-linux -instrprof -S | FileCheck %s -check-prefix=LINUX
|
||||
; RUN: opt < %s -mtriple=x86_64-unknown-linux -passes=instrprof -S | FileCheck %s -check-prefix=LINUX
|
||||
; RUN: opt < %s -mtriple=x86_64-unknown-freebsd -instrprof -S | FileCheck %s -check-prefix=FREEBSD
|
||||
; RUN: opt < %s -mtriple=x86_64-scei-ps4 -instrprof -S | FileCheck %s -check-prefix=PS4
|
||||
; RUN: opt < %s -mtriple=x86_64-pc-solaris -instrprof -S | FileCheck %s -check-prefix=SOLARIS
|
||||
|
@ -1,4 +1,5 @@
|
||||
; RUN: opt < %s -instrprof -S | FileCheck %s
|
||||
; RUN: opt < %s -passes=instrprof -S | FileCheck %s
|
||||
|
||||
target triple = "x86_64-apple-macosx10.10.0"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user