mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
InstrProf: Instrumenter support for setting profile output from command line
This change is the second of 3 patches to add support for specifying the profile output from the command line via -fprofile-instr-generate=<path>, where the specified output path/file will be overridden by the LLVM_PROFILE_FILE environment variable. This patch adds the necessary support to the llvm instrumenter, specifically a new member of GCOVOptions for clang to save the specified filename, and support for calling the new compiler-rt interface from __llvm_profile_init. Patch by Teresa Johnson. Thanks! llvm-svn: 236288
This commit is contained in:
parent
8e960d3ffb
commit
6f44b3969b
@ -74,6 +74,9 @@ struct InstrProfOptions {
|
||||
|
||||
// Add the 'noredzone' attribute to added runtime library calls.
|
||||
bool NoRedZone;
|
||||
|
||||
// Name of the profile file to use as output
|
||||
std::string InstrProfileOutput;
|
||||
};
|
||||
|
||||
/// Insert frontend instrumentation based profiling.
|
||||
|
@ -97,7 +97,8 @@ private:
|
||||
/// Add uses of our data variables and runtime hook.
|
||||
void emitUses();
|
||||
|
||||
/// Create a static initializer for our data, on platforms that need it.
|
||||
/// Create a static initializer for our data, on platforms that need it,
|
||||
/// and for any profile output file that was specified.
|
||||
void emitInitialization();
|
||||
};
|
||||
|
||||
@ -328,8 +329,10 @@ void InstrProfiling::emitUses() {
|
||||
}
|
||||
|
||||
void InstrProfiling::emitInitialization() {
|
||||
std::string InstrProfileOutput = Options.InstrProfileOutput;
|
||||
|
||||
Constant *RegisterF = M->getFunction("__llvm_profile_register_functions");
|
||||
if (!RegisterF)
|
||||
if (!RegisterF && InstrProfileOutput.empty())
|
||||
return;
|
||||
|
||||
// Create the initialization function.
|
||||
@ -344,7 +347,24 @@ void InstrProfiling::emitInitialization() {
|
||||
|
||||
// Add the basic block and the necessary calls.
|
||||
IRBuilder<> IRB(BasicBlock::Create(M->getContext(), "", F));
|
||||
IRB.CreateCall(RegisterF);
|
||||
if (RegisterF)
|
||||
IRB.CreateCall(RegisterF);
|
||||
if (!InstrProfileOutput.empty()) {
|
||||
auto *Int8PtrTy = Type::getInt8PtrTy(M->getContext());
|
||||
auto *SetNameTy = FunctionType::get(VoidTy, Int8PtrTy, false);
|
||||
auto *SetNameF =
|
||||
Function::Create(SetNameTy, GlobalValue::ExternalLinkage,
|
||||
"__llvm_profile_set_filename_env_override", M);
|
||||
|
||||
// Create variable for profile name
|
||||
Constant *ProfileNameConst =
|
||||
ConstantDataArray::getString(M->getContext(), InstrProfileOutput, true);
|
||||
GlobalVariable *ProfileName =
|
||||
new GlobalVariable(*M, ProfileNameConst->getType(), true,
|
||||
GlobalValue::PrivateLinkage, ProfileNameConst);
|
||||
|
||||
IRB.CreateCall(SetNameF, IRB.CreatePointerCast(ProfileName, Int8PtrTy));
|
||||
}
|
||||
IRB.CreateRetVoid();
|
||||
|
||||
appendToGlobalCtors(*M, F, 0);
|
||||
|
Loading…
x
Reference in New Issue
Block a user