From b7b335a2ce0acb82b680242c0910b423545f08f0 Mon Sep 17 00:00:00 2001 From: Xinliang David Li Date: Fri, 22 Jul 2016 22:25:01 +0000 Subject: [PATCH] [Profile] Enable profile merging with -fprofile-generat[=] This patch enables raw profile merging for this option which is the new intended behavior. llvm-svn: 276484 --- clang/docs/UsersManual.rst | 28 ++++++++++++++++------------ clang/lib/CodeGen/BackendUtil.cpp | 2 +- clang/lib/Driver/Tools.cpp | 2 +- clang/test/Driver/clang_f_opts.c | 2 +- clang/test/Profile/gcc-flag-compatibility.c | 2 +- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst index 77d77cc..5e39ae7 100644 --- a/clang/docs/UsersManual.rst +++ b/clang/docs/UsersManual.rst @@ -1546,27 +1546,31 @@ profile creation and use. The ``-fprofile-generate`` and ``-fprofile-generate=`` flags will use an alterantive instrumentation method for profile generation. When given a directory name, it generates the profile file - ``default.profraw`` in the directory named ``dirname``. If ``dirname`` - does not exist, it will be created at runtime. The environment variable - ``LLVM_PROFILE_FILE`` can be used to override the directory and - filename for the profile file at runtime. For example, + ``default_%m.profraw`` in the directory named ``dirname`` if specified. + If ``dirname`` does not exist, it will be created at runtime. ``%m`` specifier + will be substibuted with a unique id documented in step 2 above. In other words, + with ``-fprofile-generate[=]`` option, the "raw" profile data automatic + merging is turned on by default, so there will no longer any risk of profile + clobbering from different running processes. For example, .. code-block:: console $ clang++ -O2 -fprofile-generate=yyy/zzz code.cc -o code When ``code`` is executed, the profile will be written to the file - ``yyy/zzz/default.profraw``. This can be altered at runtime via the - ``LLVM_PROFILE_FILE`` environment variable: + ``yyy/zzz/default_xxxx.profraw``. - .. code-block:: console + To generate the profile data file with the compiler readable format, the + ``llvm-profdata`` tool can be used with the profile directory as the input: + + .. code-block:: console - $ LLVM_PROFILE_FILE=/tmp/myprofile/code.profraw ./code + $ llvm-profdata merge -output=code.profdata yyy/zzz/ - The above invocation will produce the profile file - ``/tmp/myprofile/code.profraw`` instead of ``yyy/zzz/default.profraw``. - Notice that ``LLVM_PROFILE_FILE`` overrides the directory *and* the file - name for the profile file. + If the user wants to turn off the auto-merging feature, or simply override the + the profile dumping path specified at command line, the environment variable + ``LLVM_PROFILE_FILE`` can still be used to override + the directory and filename for the profile file at runtime. .. option:: -fprofile-use[=] diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 165b6dd..c8594a10 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -456,7 +456,7 @@ void EmitAssemblyHelper::CreatePasses(legacy::PassManager &MPM, if (!CodeGenOpts.InstrProfileOutput.empty()) PMBuilder.PGOInstrGen = CodeGenOpts.InstrProfileOutput; else - PMBuilder.PGOInstrGen = "default.profraw"; + PMBuilder.PGOInstrGen = "default_%m.profraw"; } if (CodeGenOpts.hasProfileIRUse()) PMBuilder.PGOInstrUse = CodeGenOpts.ProfileInstrumentUsePath; diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 1c9527d..fda2f9b 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -3609,7 +3609,7 @@ static void addPGOAndCoverageFlags(Compilation &C, const Driver &D, if (PGOGenerateArg->getOption().matches( options::OPT_fprofile_generate_EQ)) { SmallString<128> Path(PGOGenerateArg->getValue()); - llvm::sys::path::append(Path, "default.profraw"); + llvm::sys::path::append(Path, "default_%m.profraw"); CmdArgs.push_back( Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path)); } diff --git a/clang/test/Driver/clang_f_opts.c b/clang/test/Driver/clang_f_opts.c index ea5b8d1..2b49069 100644 --- a/clang/test/Driver/clang_f_opts.c +++ b/clang/test/Driver/clang_f_opts.c @@ -99,7 +99,7 @@ // RUN: %clang -### -S -fprofile-instr-generate -fcoverage-mapping -fno-coverage-mapping %s 2>&1 | FileCheck -check-prefix=CHECK-DISABLE-COVERAGE %s // CHECK-PROFILE-GENERATE: "-fprofile-instrument=clang" // CHECK-PROFILE-GENERATE-LLVM: "-fprofile-instrument=llvm" -// CHECK-PROFILE-GENERATE-DIR: "-fprofile-instrument-path=/some/dir{{/|\\\\}}default.profraw" +// CHECK-PROFILE-GENERATE-DIR: "-fprofile-instrument-path=/some/dir{{/|\\\\}}{{.*}}" // CHECK-PROFILE-GENERATE-FILE: "-fprofile-instrument-path=/tmp/somefile.profraw" // CHECK-NO-MIX-GEN-USE: '{{[a-z=-]*}}' not allowed with '{{[a-z=-]*}}' // CHECK-NO-MIX-GENERATE: '{{[a-z=-]*}}' not allowed with '{{[a-z=-]*}}' diff --git a/clang/test/Profile/gcc-flag-compatibility.c b/clang/test/Profile/gcc-flag-compatibility.c index dce870e..0376b0b 100644 --- a/clang/test/Profile/gcc-flag-compatibility.c +++ b/clang/test/Profile/gcc-flag-compatibility.c @@ -12,7 +12,7 @@ // Check that -fprofile-generate=/path/to generates /path/to/default.profraw // RUN: %clang %s -c -S -o - -emit-llvm -fprofile-generate=/path/to | FileCheck -check-prefix=PROFILE-GEN-EQ %s -// PROFILE-GEN-EQ: constant [25 x i8] c"/path/to{{/|\\5C}}default.profraw\00" +// PROFILE-GEN-EQ: constant [{{.*}} x i8] c"/path/to{{/|\\5C}}{{.*}}\00" // Check that -fprofile-use=some/path reads some/path/default.profdata // RUN: rm -rf %t.dir -- 2.7.4