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