[prev in list] [next in list] [prev in thread] [next in thread]
List: cfe-commits
Subject: [PATCH] D17737: [PGO] change profile use cc1 option
From: Rong Xu via cfe-commits <cfe-commits () lists ! llvm ! org>
Date: 2016-02-29 21:55:24
Message-ID: differential-rev-PHID-DREV-ymrjsmdd4x72i7nhuvqc-req () reviews ! llvm ! org
[Download RAW message or body]
xur created this revision.
xur added reviewers: davidxl, silvas, bogner.
xur added subscribers: davidxl, xur, cfe-commits.
This patch takes the suggestion by Sean Silva in https://reviews.llvm.org/D17622 to \
decouple cc1 option from driver level option.
-fprofile-instr-use={} is now a driver only option. The cc1 part is replaced by \
-fprofile-instrument-use={llvm,clang}. It sets a CodeGenOpt `ProfileUse` which is \
either {None, Clang, LLVM}, a common enum for -fprofile-instrument={} (for the \
profile instrument).
The profile path cc1 option now becomes -fprofile-instrument-usepath={}.
http://reviews.llvm.org/D17737
Files:
include/clang/Driver/CC1Options.td
include/clang/Driver/Options.td
include/clang/Frontend/CodeGenOptions.def
include/clang/Frontend/CodeGenOptions.h
lib/CodeGen/BackendUtil.cpp
lib/CodeGen/CodeGenModule.cpp
lib/Driver/Tools.cpp
lib/Frontend/CompilerInvocation.cpp
test/CodeGen/Inputs/pgotestclang.profraw
test/CodeGen/Inputs/pgotestir.profraw
test/CodeGen/pgo-instrumentation.c
test/Driver/clang_f_opts.c
test/Profile/c-captured.c
test/Profile/c-counter-overflows.c
test/Profile/c-general.c
test/Profile/c-outdated-data.c
test/Profile/c-unprofiled-blocks.c
test/Profile/c-unprofiled.c
test/Profile/cxx-lambda.cpp
test/Profile/cxx-rangefor.cpp
test/Profile/cxx-templates.cpp
test/Profile/objc-general.m
test/Profile/profile-does-not-exist.c
["D17737.49421.patch" (text/x-patch)]
Index: test/Profile/profile-does-not-exist.c
===================================================================
--- test/Profile/profile-does-not-exist.c
+++ test/Profile/profile-does-not-exist.c
@@ -1,4 +1,4 @@
-// RUN: not %clang_cc1 -emit-llvm %s -o - \
-fprofile-instr-use=%t.nonexistent.profdata 2>&1 | FileCheck %s +// RUN: not \
%clang_cc1 -emit-llvm %s -o - -fprofile-instrument-usepath=%t.nonexistent.profdata \
-fprofile-instrument-use=clang 2>&1 | FileCheck %s
// CHECK: error: Could not read profile {{.*}}.nonexistent.profdata:
// CHECK-NOT: Assertion failed
Index: test/Profile/objc-general.m
===================================================================
--- test/Profile/objc-general.m
+++ test/Profile/objc-general.m
@@ -3,7 +3,7 @@
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name objc-general.m %s \
-o - -emit-llvm -fblocks -fprofile-instrument=clang | FileCheck -check-prefix=PGOGEN \
%s
// RUN: llvm-profdata merge %S/Inputs/objc-general.proftext -o %t.profdata
-// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name objc-general.m %s \
-o - -emit-llvm -fblocks -fprofile-instr-use=%t.profdata | FileCheck \
-check-prefix=PGOUSE %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 \
-main-file-name objc-general.m %s -o - -emit-llvm -fblocks \
-fprofile-instrument-usepath=%t.profdata -fprofile-instrument-use=clang | FileCheck \
-check-prefix=PGOUSE %s
#ifdef HAVE_FOUNDATION
Index: test/Profile/cxx-templates.cpp
===================================================================
--- test/Profile/cxx-templates.cpp
+++ test/Profile/cxx-templates.cpp
@@ -6,7 +6,7 @@
// RUN: FileCheck --input-file=%tgen -check-prefix=T100GEN -check-prefix=ALL %s
// RUN: llvm-profdata merge %S/Inputs/cxx-templates.proftext -o %t.profdata
-// RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name \
cxx-templates.cpp -std=c++11 -o - -emit-llvm -fprofile-instr-use=%t.profdata > %tuse \
+// RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name \
cxx-templates.cpp -std=c++11 -o - -emit-llvm -fprofile-instrument-usepath=%t.profdata \
-fprofile-instrument-use=clang > %tuse // RUN: FileCheck --input-file=%tuse \
-check-prefix=T0USE -check-prefix=ALL %s // RUN: FileCheck --input-file=%tuse \
-check-prefix=T100USE -check-prefix=ALL %s
Index: test/Profile/cxx-rangefor.cpp
===================================================================
--- test/Profile/cxx-rangefor.cpp
+++ test/Profile/cxx-rangefor.cpp
@@ -4,7 +4,7 @@
// RUN: FileCheck --input-file=%tgen -check-prefix=CHECK -check-prefix=PGOGEN %s
// RUN: llvm-profdata merge %S/Inputs/cxx-rangefor.proftext -o %t.profdata
-// RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name \
cxx-rangefor.cpp -std=c++11 -o - -emit-llvm -fprofile-instr-use=%t.profdata > %tuse \
+// RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name \
cxx-rangefor.cpp -std=c++11 -o - -emit-llvm -fprofile-instrument-usepath=%t.profdata \
-fprofile-instrument-use=clang > %tuse // RUN: FileCheck --input-file=%tuse \
-check-prefix=CHECK -check-prefix=PGOUSE %s
// PGOGEN: @[[RFC:__profc__Z9range_forv]] = private global [5 x i64] zeroinitializer
Index: test/Profile/cxx-lambda.cpp
===================================================================
--- test/Profile/cxx-lambda.cpp
+++ test/Profile/cxx-lambda.cpp
@@ -5,7 +5,7 @@
// RUN: FileCheck --input-file=%tgen -check-prefix=LMBGEN %s
// RUN: llvm-profdata merge %S/Inputs/cxx-lambda.proftext -o %t.profdata
-// RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name \
cxx-lambda.cpp -std=c++11 -o - -emit-llvm -fprofile-instr-use=%t.profdata > %tuse +// \
RUN: %clang_cc1 -x c++ %s -triple %itanium_abi_triple -main-file-name cxx-lambda.cpp \
-std=c++11 -o - -emit-llvm -fprofile-instrument-usepath=%t.profdata \
-fprofile-instrument-use=clang > %tuse // RUN: FileCheck --input-file=%tuse \
-check-prefix=PGOUSE %s // RUN: FileCheck --input-file=%tuse -check-prefix=LMBUSE %s
Index: test/Profile/c-unprofiled.c
===================================================================
--- test/Profile/c-unprofiled.c
+++ test/Profile/c-unprofiled.c
@@ -7,7 +7,7 @@
// doesn't play well with warnings that have no line number.
// RUN: llvm-profdata merge %S/Inputs/c-unprofiled.proftext -o %t.profdata
-// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-unprofiled.c -I \
%S/Inputs/ %s -o /dev/null -emit-llvm -fprofile-instr-use=%t.profdata \
-Wprofile-instr-unprofiled 2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple \
x86_64-apple-macosx10.9 -main-file-name c-unprofiled.c -I %S/Inputs/ %s -o /dev/null \
-emit-llvm -fprofile-instrument-usepath=%t.profdata -fprofile-instrument-use=clang \
-Wprofile-instr-unprofiled 2>&1 | FileCheck %s
// CHECK: warning: no profile data available for file "c-unprofiled.c"
Index: test/Profile/c-unprofiled-blocks.c
===================================================================
--- test/Profile/c-unprofiled-blocks.c
+++ test/Profile/c-unprofiled-blocks.c
@@ -2,7 +2,7 @@
// runs) shouldn't have any branch weight metadata added.
// RUN: llvm-profdata merge %S/Inputs/c-unprofiled-blocks.proftext -o %t.profdata
-// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name \
c-unprofiled-blocks.c %s -o - -emit-llvm -fprofile-instr-use=%t.profdata | FileCheck \
-check-prefix=PGOUSE %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 \
-main-file-name c-unprofiled-blocks.c %s -o - -emit-llvm \
-fprofile-instrument-usepath=%t.profdata -fprofile-instrument-use=clang | FileCheck \
-check-prefix=PGOUSE %s
// PGOUSE-LABEL: @never_called(i32 %i)
int never_called(int i) {
Index: test/Profile/c-outdated-data.c
===================================================================
--- test/Profile/c-outdated-data.c
+++ test/Profile/c-outdated-data.c
@@ -4,7 +4,7 @@
// doesn't play well with warnings that have no line number.
// RUN: llvm-profdata merge %S/Inputs/c-outdated-data.proftext -o %t.profdata
-// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-outdated-data.c \
%s -o /dev/null -emit-llvm -fprofile-instr-use=%t.profdata -Wprofile-instr-dropped \
2>&1 | FileCheck %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 \
-main-file-name c-outdated-data.c %s -o /dev/null -emit-llvm \
-fprofile-instrument-usepath=%t.profdata -fprofile-instrument-use=clang \
-Wprofile-instr-dropped 2>&1 | FileCheck %s // CHECK: warning: profile data may be \
out of date: of 3 functions, 1 has no data and 1 has mismatched data that will be \
ignored
void no_usable_data() {
Index: test/Profile/c-general.c
===================================================================
--- test/Profile/c-general.c
+++ test/Profile/c-general.c
@@ -3,10 +3,10 @@
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o \
- -emit-llvm -fprofile-instrument=clang | FileCheck -check-prefix=PGOGEN %s
// RUN: llvm-profdata merge %S/Inputs/c-general.proftext -o %t.profdata
-// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o \
- -emit-llvm -fprofile-instr-use=%t.profdata | FileCheck \
-check-prefix=PGOUSE %s
-// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o \
- -emit-llvm -fprofile-instr-use=%S/Inputs/c-general.profdata.v3 | FileCheck \
-check-prefix=PGOUSE %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 \
-main-file-name c-general.c %s -o - -emit-llvm \
-fprofile-instrument-usepath=%t.profdata -fprofile-instrument-use=clang | FileCheck \
-check-prefix=PGOUSE %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 \
-main-file-name c-general.c %s -o - -emit-llvm \
-fprofile-instrument-usepath=%S/Inputs/c-general.profdata.v3 \
-fprofile-instrument-use=clang | FileCheck -check-prefix=PGOUSE %s // Also check \
compatibility with older profiles.
-// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-general.c %s -o \
- -emit-llvm -fprofile-instr-use=%S/Inputs/c-general.profdata.v1 | FileCheck \
-check-prefix=PGOUSE %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 \
-main-file-name c-general.c %s -o - -emit-llvm \
-fprofile-instrument-usepath=%S/Inputs/c-general.profdata.v1 \
-fprofile-instrument-use=clang | FileCheck -check-prefix=PGOUSE %s
// PGOGEN: @[[SLC:__profc_simple_loops]] = private global [4 x i64] zeroinitializer
// PGOGEN: @[[IFC:__profc_conditionals]] = private global [11 x i64] zeroinitializer
Index: test/Profile/c-counter-overflows.c
===================================================================
--- test/Profile/c-counter-overflows.c
+++ test/Profile/c-counter-overflows.c
@@ -2,7 +2,7 @@
// truncated.
// RUN: llvm-profdata merge %S/Inputs/c-counter-overflows.proftext -o %t.profdata
-// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name \
c-counter-overflows.c %s -o - -emit-llvm -fprofile-instr-use=%t.profdata | FileCheck \
%s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name \
c-counter-overflows.c %s -o - -emit-llvm -fprofile-instrument-usepath=%t.profdata \
-fprofile-instrument-use=clang | FileCheck %s
typedef unsigned long long uint64_t;
Index: test/Profile/c-captured.c
===================================================================
--- test/Profile/c-captured.c
+++ test/Profile/c-captured.c
@@ -1,7 +1,7 @@
// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-captured.c %s \
-o - -emit-llvm -fprofile-instrument=clang | FileCheck -check-prefix=PGOGEN \
-check-prefix=PGOALL %s
// RUN: llvm-profdata merge %S/Inputs/c-captured.proftext -o %t.profdata
-// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 -main-file-name c-captured.c %s \
-o - -emit-llvm -fprofile-instr-use=%t.profdata | FileCheck -check-prefix=PGOUSE \
-check-prefix=PGOALL %s +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9 \
-main-file-name c-captured.c %s -o - -emit-llvm \
-fprofile-instrument-usepath=%t.profdata -fprofile-instrument-use=clang | FileCheck \
-check-prefix=PGOUSE -check-prefix=PGOALL %s
// PGOGEN: @[[DCC:__profc_debug_captured]] = private global [3 x i64] \
zeroinitializer // PGOGEN: @[[CSC:__profc_c_captured.c___captured_stmt]] = private \
global [2 x i64] zeroinitializer
Index: test/Driver/clang_f_opts.c
===================================================================
--- test/Driver/clang_f_opts.c
+++ test/Driver/clang_f_opts.c
@@ -111,9 +111,12 @@
// RUN: mkdir -p %t.d/some/dir
// RUN: %clang -### -S -fprofile-use=%t.d/some/dir %s 2>&1 | FileCheck \
-check-prefix=CHECK-PROFILE-USE-DIR %s // RUN: %clang -### -S \
-fprofile-instr-use=/tmp/somefile.prof %s 2>&1 | FileCheck \
-check-prefix=CHECK-PROFILE-USE-FILE %s
-// CHECK-PROFILE-USE: "-fprofile-instr-use=default.profdata"
-// CHECK-PROFILE-USE-DIR: \
"-fprofile-instr-use={{.*}}.d/some/dir{{/|\\\\}}default.profdata"
-// CHECK-PROFILE-USE-FILE: "-fprofile-instr-use=/tmp/somefile.prof"
+// CHECK-PROFILE-USE-DAG: "-fprofile-instrument-use=clang
+// CHECK-PROFILE-USE-DAG: "-fprofile-instrument-usepath=default.profdata"
+// CHECK-PROFILE-USE-DIR-DAG: "-fprofile-instrument-use=clang
+// CHECK-PROFILE-USE-DIR-DAG: \
"-fprofile-instrument-usepath={{.*}}.d/some/dir{{/|\\\\}}default.profdata" +// \
CHECK-PROFILE-USE-FILE-DAG: "-fprofile-instrument-use=clang +// \
CHECK-PROFILE-USE-FILE-DAG: "-fprofile-instrument-usepath=/tmp/somefile.prof"
// RUN: %clang -### -S -fvectorize %s 2>&1 | FileCheck -check-prefix=CHECK-VECTORIZE \
%s // RUN: %clang -### -S -fno-vectorize -fvectorize %s 2>&1 | FileCheck \
-check-prefix=CHECK-VECTORIZE %s
Index: test/CodeGen/pgo-instrumentation.c
===================================================================
--- test/CodeGen/pgo-instrumentation.c
+++ test/CodeGen/pgo-instrumentation.c
@@ -7,3 +7,14 @@
// Ensure Pass PGOInstrumentationGenPass is not invoked.
// RUN: %clang_cc1 -O2 -fprofile-instrument=clang %s -mllvm -debug-pass=Structure \
-emit-llvm -o - 2>&1 | FileCheck %s \
-check-prefix=CHECK-PGOGENPASS-INVOKED-INSTR-GEN-CLANG // \
CHECK-PGOGENPASS-INVOKED-INSTR-GEN-CLANG-NOT: PGOInstrumentationGenPass +
+// Ensure Pass PGOInstrumentationUsePass is invoked.
+// RUN: llvm-profdata merge -o %t.profdata %S/Inputs/pgotestir.profraw
+// RUN: %clang_cc1 -O2 -fprofile-instrument-use=llvm \
-fprofile-instrument-usepath=%t.profdata %s -mllvm -debug-pass=Structure -emit-llvm \
-o - 2>&1 | FileCheck %s -check-prefix=CHECK-PGOUSEPASS-INVOKED-INSTR-USE +// \
CHECK-PGOUSEPASS-INVOKED-INSTR-USE: PGOInstrumentationUsePass +//
+// Ensure Pass PGOInstrumentationUsePass is not invoked.
+// RUN: llvm-profdata merge -o %t.profdata %S/Inputs/pgotestclang.profraw
+// RUN: %clang_cc1 -O2 -fprofile-instrument-use=clang \
-fprofile-instrument-usepath=%t.profdata %s -mllvm -debug-pass=Structure -emit-llvm \
-o - 2>&1 | FileCheck %s -check-prefix=CHECK-PGOUSEPASS-INVOKED-USE-CLANG +// \
CHECK-PGOUSEPASS-INVOKED-USE-CLANG-NOT: PGOInstrumentationUsePass +
Index: test/CodeGen/Inputs/pgotestir.profraw
===================================================================
--- test/CodeGen/Inputs/pgotestir.profraw
+++ test/CodeGen/Inputs/pgotestir.profraw
@@ -0,0 +1 @@
+:ir
Index: test/CodeGen/Inputs/pgotestclang.profraw
===================================================================
--- test/CodeGen/Inputs/pgotestclang.profraw
+++ test/CodeGen/Inputs/pgotestclang.profraw
@@ -0,0 +1 @@
+:fe
Index: lib/Frontend/CompilerInvocation.cpp
===================================================================
--- lib/Frontend/CompilerInvocation.cpp
+++ lib/Frontend/CompilerInvocation.cpp
@@ -375,6 +375,15 @@
}
}
+enum PGOInstrumentor { ProfileUnknown, ProfileNone, ProfileClang, ProfileLLVM };
+static PGOInstrumentor getPGOInstrumentor(StringRef S) {
+ return llvm::StringSwitch<PGOInstrumentor>(S)
+ .Case("none", ProfileNone)
+ .Case("clang", ProfileClang)
+ .Case("llvm", ProfileLLVM)
+ .Default(ProfileUnknown);
+}
+
static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
DiagnosticsEngine &Diags,
const TargetOptions &TargetOpts) {
@@ -481,33 +490,48 @@
Opts.Autolink = !Args.hasArg(OPT_fno_autolink);
Opts.SampleProfileFile = Args.getLastArgValue(OPT_fprofile_sample_use_EQ);
- enum PGOInstrumentor { Unknown, None, Clang, LLVM };
if (Arg *A = Args.getLastArg(OPT_fprofile_instrument_EQ)) {
- StringRef Value = A->getValue();
- PGOInstrumentor Method = llvm::StringSwitch<PGOInstrumentor>(Value)
- .Case("none", None)
- .Case("clang", Clang)
- .Case("llvm", LLVM)
- .Default(Unknown);
+ PGOInstrumentor Method = getPGOInstrumentor(A->getValue());
switch (Method) {
- case LLVM:
+ case ProfileLLVM:
Opts.setProfileInstr(CodeGenOptions::ProfileIRInstr);
break;
- case Clang:
+ case ProfileClang:
Opts.setProfileInstr(CodeGenOptions::ProfileClangInstr);
break;
- case None:
+ case ProfileNone:
+ // Null operation -- The default is ProfileNone.
+ break;
+ case ProfileUnknown:
+ Diags.Report(diag::err_drv_invalid_pgo_instrumentor)
+ << A->getAsString(Args) << A->getValue();
+ break;
+ }
+ }
+
+ if (Arg *A = Args.getLastArg(OPT_fprofile_instrument_use_EQ)) {
+ PGOInstrumentor Method = getPGOInstrumentor(A->getValue());
+ switch (Method) {
+ case ProfileLLVM:
+ Opts.setProfileUse(CodeGenOptions::ProfileIRInstr);
+ break;
+ case ProfileClang:
+ Opts.setProfileUse(CodeGenOptions::ProfileClangInstr);
+ break;
+ case ProfileNone:
// Null operation -- The default is ProfileNone.
break;
- case Unknown:
+ case ProfileUnknown:
Diags.Report(diag::err_drv_invalid_pgo_instrumentor)
- << A->getAsString(Args) << Value;
+ << A->getAsString(Args) << A->getValue();
break;
}
}
- Opts.InstrProfileOutput = Args.getLastArgValue(OPT_fprofile_instrument_path_EQ);
- Opts.InstrProfileInput = Args.getLastArgValue(OPT_fprofile_instr_use_EQ);
+ Opts.InstrProfileOutput =
+ Args.getLastArgValue(OPT_fprofile_instrument_path_EQ);
+ Opts.InstrProfileInput =
+ Args.getLastArgValue(OPT_fprofile_instrument_usepath_EQ);
Opts.CoverageMapping =
Args.hasFlag(OPT_fcoverage_mapping, OPT_fno_coverage_mapping, false);
Opts.DumpCoverageMapping = Args.hasArg(OPT_dump_coverage_mapping);
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -3239,7 +3239,8 @@
if (ProfileUseArg) {
if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
- ProfileUseArg->render(Args, CmdArgs);
+ CmdArgs.push_back(Args.MakeArgString(
+ Twine("-fprofile-instrument-usepath=") + ProfileUseArg->getValue()));
else if ((ProfileUseArg->getOption().matches(
options::OPT_fprofile_use_EQ) ||
ProfileUseArg->getOption().matches(
@@ -3249,8 +3250,10 @@
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));
+ Args.MakeArgString(Twine("-fprofile-instrument-usepath=") + Path));
}
+ // The default is to use Clang instrumentation profile.
+ CmdArgs.push_back("-fprofile-instrument-use=clang");
}
if (Args.hasArg(options::OPT_ftest_coverage) ||
Index: lib/CodeGen/CodeGenModule.cpp
===================================================================
--- lib/CodeGen/CodeGenModule.cpp
+++ lib/CodeGen/CodeGenModule.cpp
@@ -149,7 +149,9 @@
if (C.getLangOpts().ObjC1)
ObjCData = new ObjCEntrypoints();
- if (!CodeGenOpts.InstrProfileInput.empty()) {
+ if (CodeGenOpts.hasProfileClangUse()) {
+ assert(!CodeGenOpts.InstrProfileInput.empty() &&
+ "Need to explicitly specify the profile name.");
auto ReaderOrErr =
llvm::IndexedInstrProfReader::create(CodeGenOpts.InstrProfileInput);
if (std::error_code EC = ReaderOrErr.getError()) {
Index: lib/CodeGen/BackendUtil.cpp
===================================================================
--- lib/CodeGen/BackendUtil.cpp
+++ lib/CodeGen/BackendUtil.cpp
@@ -443,6 +443,12 @@
else
PMBuilder.PGOInstrGen = "default.profraw";
}
+ if (CodeGenOpts.hasProfileIRUse()) {
+ if (!CodeGenOpts.InstrProfileInput.empty())
+ PMBuilder.PGOInstrUse = CodeGenOpts.InstrProfileInput;
+ else
+ PMBuilder.PGOInstrGen = "default.profdata";
+ }
if (!CodeGenOpts.SampleProfileFile.empty())
MPM->add(createSampleProfileLoaderPass(CodeGenOpts.SampleProfileFile));
Index: include/clang/Frontend/CodeGenOptions.h
===================================================================
--- include/clang/Frontend/CodeGenOptions.h
+++ include/clang/Frontend/CodeGenOptions.h
@@ -232,6 +232,16 @@
bool hasProfileIRInstr() const {
return getProfileInstr() == ProfileIRInstr;
}
+
+ /// \brief Check if Clang profile use is on.
+ bool hasProfileClangUse () const {
+ return getProfileUse() == ProfileClangInstr;
+ }
+
+ /// \brief Check if IR level profile use is on.
+ bool hasProfileIRUse () const {
+ return getProfileUse() == ProfileIRInstr;
+ }
};
} // end namespace clang
Index: include/clang/Frontend/CodeGenOptions.def
===================================================================
--- include/clang/Frontend/CodeGenOptions.def
+++ include/clang/Frontend/CodeGenOptions.def
@@ -105,6 +105,8 @@
/// \brief Choose profile instrumenation kind or no instrumentation.
ENUM_CODEGENOPT(ProfileInstr, ProfileInstrKind, 2, ProfileNone)
+/// \brief Choose profile kind for PGO use compilation.
+ENUM_CODEGENOPT(ProfileUse, ProfileInstrKind, 2, ProfileNone)
CODEGENOPT(CoverageMapping , 1, 0) ///< Generate coverage mapping regions to
///< enable code coverage analysis.
CODEGENOPT(DumpCoverageMapping , 1, 0) ///< Dump the generated coverage mapping
Index: include/clang/Driver/Options.td
===================================================================
--- include/clang/Driver/Options.td
+++ include/clang/Driver/Options.td
@@ -456,7 +456,7 @@
def fprofile_instr_use : Flag<["-"], "fprofile-instr-use">, Group<f_Group>,
Flags<[DriverOption]>;
def fprofile_instr_use_EQ : Joined<["-"], "fprofile-instr-use=">,
- Group<f_Group>, Flags<[CC1Option]>,
+ Group<f_Group>, Flags<[DriverOption]>,
HelpText<"Use instrumentation data for profile-guided optimization">;
def fcoverage_mapping : Flag<["-"], "fcoverage-mapping">,
Group<f_Group>, Flags<[CC1Option]>,
Index: include/clang/Driver/CC1Options.td
===================================================================
--- include/clang/Driver/CC1Options.td
+++ include/clang/Driver/CC1Options.td
@@ -279,6 +279,12 @@
def fprofile_instrument_path_EQ : Joined<["-"], "fprofile-instrument-path=">,
HelpText<"Generate instrumented code to collect execution counts into "
"<file> (overridden by LLVM_PROFILE_FILE env var)">;
+def fprofile_instrument_use_EQ : Joined<["-"], "fprofile-instrument-use=">,
+ HelpText<"Enable PGO profile use compilation. The accepted value is clang, "
+ "llvm, or none">;
+def fprofile_instrument_usepath_EQ :
+ Joined<["-"], "fprofile-instrument-usepath=">,
+ HelpText<"Specify the profile path in PGO use compilation">;
//===----------------------------------------------------------------------===//
// Dependency Output Options
[Attachment #4 (text/plain)]
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic