Add support for emitting profiles into a directory other than '.'
Justin Bogner
mail at justinbogner.com
Thu Jun 25 16:18:27 PDT 2015
Diego Novillo <dnovillo at google.com> writes:
> This add support for the front end to override the directory where the
> profile will be emitted:
>
> 1- If only a directory DIRNAME is given, the compiler will override the
> default profile name with <DIRNAME>/default.profraw.
>
> 2- If the directory is empty, then the existing behaviour is preserved:
> the call to override the default is only emitted if a filename is
> provided.
>
> This supports the upcoming GCC-compatible flag -fprofile-generate in
> Clang.
Is it enough to set InstrProfileFile to $dir/default.profraw in the
frontend? Seems more complicated than it needs to be to have two
variables at the LLVM level.
>
> Diego.
>
> commit f9300c58384d07b1330decf8300786ecaae8b7a7
> Author: Diego Novillo <dnovillo at google.com>
> Date: Thu Jun 25 18:23:02 2015 -0400
>
> Add support for emitting profiles into a directory other than '.'
>
> This add support for the front end to override the directory where the
> profile will be emitted:
>
> 1- If only a directory DIRNAME is given, the compiler will override the
> default profile name with <DIRNAME>/default.profraw.
>
> 2- If the directory is empty, then the existing behaviour is preserved:
> the call to override the default is only emitted if a filename is
> provided.
>
> This supports the upcoming GCC-compatible flag -fprofile-generate in
> Clang.
>
> diff --git a/include/llvm/Transforms/Instrumentation.h b/include/llvm/Transforms/Instrumentation.h
> index 250e389..d3abd2d 100644
> --- a/include/llvm/Transforms/Instrumentation.h
> +++ b/include/llvm/Transforms/Instrumentation.h
> @@ -77,6 +77,9 @@ struct InstrProfOptions {
>
> // Name of the profile file to use as output
> std::string InstrProfileOutput;
> +
> + // Name of the directory where the profile file will reside.
> + std::string InstrProfileDir;
> };
>
> /// Insert frontend instrumentation based profiling.
> diff --git a/lib/Transforms/Instrumentation/InstrProfiling.cpp b/lib/Transforms/Instrumentation/InstrProfiling.cpp
> index 05a9c8a..9582c3f 100644
> --- a/lib/Transforms/Instrumentation/InstrProfiling.cpp
> +++ b/lib/Transforms/Instrumentation/InstrProfiling.cpp
> @@ -336,9 +336,10 @@ void InstrProfiling::emitUses() {
>
> void InstrProfiling::emitInitialization() {
> std::string InstrProfileOutput = Options.InstrProfileOutput;
> + std::string InstrProfileDir = Options.InstrProfileDir;
>
> Constant *RegisterF = M->getFunction("__llvm_profile_register_functions");
> - if (!RegisterF && InstrProfileOutput.empty())
> + if (!RegisterF && InstrProfileOutput.empty() && InstrProfileDir.empty())
> return;
>
> // Create the initialization function.
> @@ -355,16 +356,31 @@ void InstrProfiling::emitInitialization() {
> IRBuilder<> IRB(BasicBlock::Create(M->getContext(), "", F));
> if (RegisterF)
> IRB.CreateCall(RegisterF, {});
> - if (!InstrProfileOutput.empty()) {
> + if (!InstrProfileOutput.empty() || !InstrProfileDir.empty()) {
> auto *Int8PtrTy = Type::getInt8PtrTy(M->getContext());
> auto *SetNameTy = FunctionType::get(VoidTy, Int8PtrTy, false);
> auto *SetNameF =
> Function::Create(SetNameTy, GlobalValue::ExternalLinkage,
> "__llvm_profile_override_default_filename", M);
>
> - // Create variable for profile name
> + // If the directory is the only component set, then choose a default
> + // filename. Note that we do not need to handle the opposite case, since
> + // that will simply mean that the file is produced in the current directory.
> + //
> + // FIXME: This setting needs to keep in sync with the default chosen in
> + // compiler-rt/lib/profile/InstrProfilingFile.c:resetFilenameToDefault().
> + // Perhaps there's a better way?
> + if (InstrProfileOutput.empty())
> + InstrProfileOutput = "default.profraw";
> +
> + // Create the full path name by joining the directory and file name.
> + std::string Pathname = (InstrProfileDir.empty())
> + ? InstrProfileOutput
> + : InstrProfileDir + "/" + InstrProfileOutput;
> +
> + // Create variable for profile name.
> Constant *ProfileNameConst =
> - ConstantDataArray::getString(M->getContext(), InstrProfileOutput, true);
> + ConstantDataArray::getString(M->getContext(), Pathname, true);
> GlobalVariable *ProfileName =
> new GlobalVariable(*M, ProfileNameConst->getType(), true,
> GlobalValue::PrivateLinkage, ProfileNameConst);
More information about the llvm-commits
mailing list