Diego Novillo <dnovi...@google.com> writes: > This patch adds flags -fno-profile-instr-generate and > -fno-profile-instr-use, and the GCC aliases -fno-profile-generate and > -fno-profile-use. > > These flags are used in situations where users need to disable profile > generation or use for specific files in a build, without affecting other > files. > > OK to commit?
Sure, but we should probably add a -fno-coverage-mapping as well, since `-fprofile-generate -fcoverage-mapping -fno-profile-generate` will error with this change. Do you mind adding that in a followup? > Thanks. Diego. > > From 016d91cdf4540497f338a3ad4e2da612e29c7502 Mon Sep 17 00:00:00 2001 > From: Diego Novillo <dnovi...@google.com> > Date: Wed, 5 Aug 2015 15:02:16 -0400 > Subject: [PATCH] Add flags to disable profile generation. > > This patch adds flags -fno-profile-instr-generate and > -fno-profile-instr-use, and the GCC aliases -fno-profile-generate and > -fno-profile-use. > > These flags are used in situations where users need to disable profile > generation or use for specific files in a build, without affecting other > files. > --- > docs/UsersManual.rst | 13 ++++++++ > include/clang/Driver/Options.td | 10 ++++++ > lib/Driver/Tools.cpp | 67 > ++++++++++++++++++++++++----------------- > test/Driver/clang_f_opts.c | 10 ++++++ > 4 files changed, 72 insertions(+), 28 deletions(-) > > diff --git a/docs/UsersManual.rst b/docs/UsersManual.rst > index 842538c..9a70d63 100644 > --- a/docs/UsersManual.rst > +++ b/docs/UsersManual.rst > @@ -1534,6 +1534,19 @@ with respect to profile creation and use. > profile file, it reads from that file. If ``pathname`` is a directory name, > it reads from ``pathname/default.profdata``. > > +Disabling Instrumentation > +^^^^^^^^^^^^^^^^^^^^^^^^^ > + > +In certain situations, it may be useful to disable profile generation or use > +for specific files in a build, without affecting the main compilation flags > +used for the other files in the project. > + > +In these cases, you can use the flag ``-fno-profile-instr-generate`` (or > +``-fno-profile-generate``) to disable profile generation, and > +``-fno-profile-instr-use`` (or ``-fno-profile-use``) to disable profile use. > + > +Note that these flags should appear after the corresponding profile > +flags to have an effect. > > Controlling Size of Debug Information > ------------------------------------- > diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td > index 63e880d..d84e03e 100644 > --- a/include/clang/Driver/Options.td > +++ b/include/clang/Driver/Options.td > @@ -446,6 +446,16 @@ def fprofile_use : Flag<["-"], "fprofile-use">, > Group<f_Group>, > def fprofile_use_EQ : Joined<["-"], "fprofile-use=">, > Group<f_Group>, Flags<[DriverOption]>, MetaVarName<"<pathname>">, > HelpText<"Use instrumentation data for profile-guided optimization. If > pathname is a directory, it reads from <pathname>/default.profdata. > Otherwise, it reads from file <pathname>.">; > +def fno_profile_instr_generate : Flag<["-"], "fno-profile-instr-generate">, > + Group<f_Group>, Flags<[DriverOption]>, > + HelpText<"Disable generation of profile instrumentation.">; > +def fno_profile_generate : Flag<["-"], "fno-profile-generate">, > + Alias<fno_profile_instr_generate>; > +def fno_profile_instr_use : Flag<["-"], "fno-profile-instr-use">, > + Group<f_Group>, Flags<[DriverOption]>, > + HelpText<"Disable using instrumentation data for profile-guided > optimization">; > +def fno_profile_use : Flag<["-"], "fno-profile-use">, > + Alias<fno_profile_instr_use>; > > def fblocks : Flag<["-"], "fblocks">, Group<f_Group>, Flags<[CC1Option]>, > HelpText<"Enable the 'blocks' language feature">; > diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp > index 2135b77..22863dc 100644 > --- a/lib/Driver/Tools.cpp > +++ b/lib/Driver/Tools.cpp > @@ -2848,42 +2848,53 @@ static void addPGOAndCoverageFlags(Compilation &C, > const Driver &D, > auto *ProfileGenerateArg = Args.getLastArg( > options::OPT_fprofile_instr_generate, > options::OPT_fprofile_instr_generate_EQ, > options::OPT_fprofile_generate, > - options::OPT_fprofile_generate_EQ); > + options::OPT_fprofile_generate_EQ, > + options::OPT_fno_profile_instr_generate); > + if (ProfileGenerateArg && > + ProfileGenerateArg->getOption().matches( > + options::OPT_fno_profile_instr_generate)) > + ProfileGenerateArg = nullptr; > > auto *ProfileUseArg = Args.getLastArg( > options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ, > - options::OPT_fprofile_use, options::OPT_fprofile_use_EQ); > + options::OPT_fprofile_use, options::OPT_fprofile_use_EQ, > + options::OPT_fno_profile_instr_use); > + if (ProfileUseArg && > + ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use)) > + ProfileUseArg = nullptr; > > if (ProfileGenerateArg && ProfileUseArg) > D.Diag(diag::err_drv_argument_not_allowed_with) > << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling(); > > - if (ProfileGenerateArg && > - ProfileGenerateArg->getOption().matches( > - options::OPT_fprofile_instr_generate_EQ)) > - ProfileGenerateArg->render(Args, CmdArgs); > - else if (ProfileGenerateArg && > - ProfileGenerateArg->getOption().matches( > - options::OPT_fprofile_generate_EQ)) { > - SmallString<128> Path(ProfileGenerateArg->getValue()); > - llvm::sys::path::append(Path, "default.profraw"); > - CmdArgs.push_back( > - Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path)); > - } else > - Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate); > - > - if (ProfileUseArg && > - ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ)) > - ProfileUseArg->render(Args, CmdArgs); > - else if (ProfileUseArg && > - (ProfileUseArg->getOption().matches(options::OPT_fprofile_use_EQ) > || > - ProfileUseArg->getOption().matches( > - options::OPT_fprofile_instr_use))) { > - SmallString<128> Path( > - ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue()); > - if (Path.empty() || llvm::sys::fs::is_directory(Path)) > - llvm::sys::path::append(Path, "default.profdata"); > - CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instr-use=") + > Path)); > + if (ProfileGenerateArg) { > + if (ProfileGenerateArg->getOption().matches( > + options::OPT_fprofile_instr_generate_EQ)) > + ProfileGenerateArg->render(Args, CmdArgs); > + else if (ProfileGenerateArg->getOption().matches( > + options::OPT_fprofile_generate_EQ)) { > + SmallString<128> Path(ProfileGenerateArg->getValue()); > + llvm::sys::path::append(Path, "default.profraw"); > + CmdArgs.push_back( > + Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path)); > + } else > + Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate); > + } > + > + if (ProfileUseArg) { > + if > (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ)) > + ProfileUseArg->render(Args, CmdArgs); > + else if ((ProfileUseArg->getOption().matches( > + options::OPT_fprofile_use_EQ) || > + ProfileUseArg->getOption().matches( > + options::OPT_fprofile_instr_use))) { > + SmallString<128> Path( > + ProfileUseArg->getNumValues() == 0 ? "" : > ProfileUseArg->getValue()); > + if (Path.empty() || llvm::sys::fs::is_directory(Path)) > + llvm::sys::path::append(Path, "default.profdata"); > + CmdArgs.push_back( > + Args.MakeArgString(Twine("-fprofile-instr-use=") + Path)); > + } > } > > if (Args.hasArg(options::OPT_ftest_coverage) || > diff --git a/test/Driver/clang_f_opts.c b/test/Driver/clang_f_opts.c > index 0034301..fd1f854 100644 > --- a/test/Driver/clang_f_opts.c > +++ b/test/Driver/clang_f_opts.c > @@ -86,10 +86,20 @@ > // RUN: %clang -### -S -fprofile-generate=dir -fprofile-use=dir %s 2>&1 | > FileCheck -check-prefix=CHECK-NO-MIX-GEN-USE %s > // RUN: %clang -### -S -fprofile-generate=dir -fprofile-instr-use %s 2>&1 | > FileCheck -check-prefix=CHECK-NO-MIX-GEN-USE %s > // RUN: %clang -### -S -fprofile-generate=dir -fprofile-instr-use=file %s > 2>&1 | FileCheck -check-prefix=CHECK-NO-MIX-GEN-USE %s > +// RUN: %clang -### -S -fprofile-instr-generate=file > -fno-profile-instr-generate %s 2>&1 | FileCheck > -check-prefix=CHECK-DISABLE-GEN %s > +// RUN: %clang -### -S -fprofile-instr-generate=file -fno-profile-generate > %s 2>&1 | FileCheck -check-prefix=CHECK-DISABLE-GEN %s > +// RUN: %clang -### -S -fprofile-generate=dir -fno-profile-generate %s 2>&1 > | FileCheck -check-prefix=CHECK-DISABLE-GEN %s > +// RUN: %clang -### -S -fprofile-generate=dir -fno-profile-instr-generate %s > 2>&1 | FileCheck -check-prefix=CHECK-DISABLE-GEN %s > +// RUN: %clang -### -S -fprofile-instr-use=file -fno-profile-instr-use %s > 2>&1 | FileCheck -check-prefix=CHECK-DISABLE-USE %s > +// RUN: %clang -### -S -fprofile-instr-use=file -fno-profile-use %s 2>&1 | > FileCheck -check-prefix=CHECK-DISABLE-USE %s > +// RUN: %clang -### -S -fprofile-use=file -fno-profile-use %s 2>&1 | > FileCheck -check-prefix=CHECK-DISABLE-USE %s > +// RUN: %clang -### -S -fprofile-use=file -fno-profile-instr-use %s 2>&1 | > FileCheck -check-prefix=CHECK-DISABLE-USE %s > // CHECK-PROFILE-GENERATE: "-fprofile-instr-generate" > // CHECK-PROFILE-GENERATE-DIR: > "-fprofile-instr-generate=/some/dir{{/|\\\\}}default.profraw" > // CHECK-PROFILE-GENERATE-FILE: > "-fprofile-instr-generate=/tmp/somefile.profraw" > // CHECK-NO-MIX-GEN-USE: '{{[a-z=-]*}}' not allowed with '{{[a-z=-]*}}' > +// CHECK-DISABLE-GEN-NOT: "-fprofile-instr-generate" > +// CHECK-DISABLE-USE-NOT: "-fprofile-instr-use" > > // RUN: %clang -### -S -fprofile-use %s 2>&1 | FileCheck > -check-prefix=CHECK-PROFILE-USE %s > // RUN: %clang -### -S -fprofile-instr-use %s 2>&1 | FileCheck > -check-prefix=CHECK-PROFILE-USE %s _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits