Skip to content

Commit

Permalink
[Driver][Windows] Add dependent lib argument for profile instr generate
Browse files Browse the repository at this point in the history
This is needed so lld-link can find clang_rt.profile when self hosting
on Windows with PGO. Using clang-cl as a linker knows to add the library
but self hosting, using -DCMAKE_LINKER=<...>/lld-link.exe doesn't.

Differential Revision: https://reviews.llvm.org/D61742

llvm-svn: 360674
  • Loading branch information
rgal authored and MrSidims committed May 17, 2019
1 parent 0c8b9f6 commit f7f6e87
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 4 deletions.
12 changes: 9 additions & 3 deletions clang/lib/Driver/ToolChains/Clang.cpp
Expand Up @@ -738,8 +738,9 @@ static void appendUserToPath(SmallVectorImpl<char> &Result) {
Result.append(UID.begin(), UID.end());
}

static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
const InputInfo &Output, const ArgList &Args,
static void addPGOAndCoverageFlags(const ToolChain &TC, Compilation &C,
const Driver &D, const InputInfo &Output,
const ArgList &Args,
ArgStringList &CmdArgs) {

auto *PGOGenerateArg = Args.getLastArg(options::OPT_fprofile_generate,
Expand Down Expand Up @@ -790,6 +791,11 @@ static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
ProfileGenerateArg->getValue()));
// The default is to use Clang Instrumentation.
CmdArgs.push_back("-fprofile-instrument=clang");
if (TC.getTriple().isWindowsMSVCEnvironment()) {
// Add dependent lib for clang_rt.profile
CmdArgs.push_back(Args.MakeArgString("--dependent-lib=" +
TC.getCompilerRT(Args, "profile")));
}
}

Arg *PGOGenArg = nullptr;
Expand Down Expand Up @@ -4204,7 +4210,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
// sampling, overhead of call arc collection is way too high and there's no
// way to collect the output.
if (!Triple.isNVPTX())
addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
addPGOAndCoverageFlags(TC, C, D, Output, Args, CmdArgs);

if (auto *ABICompatArg = Args.getLastArg(options::OPT_fclang_abi_compat_EQ))
ABICompatArg->render(Args, CmdArgs);
Expand Down
2 changes: 1 addition & 1 deletion clang/test/Driver/cl-options.c
Expand Up @@ -66,7 +66,7 @@
// RUN: %clang_cl -### /FA -fprofile-instr-generate=/tmp/somefile.profraw -- %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-GENERATE-FILE %s
// RUN: %clang_cl -### /FA -fprofile-instr-generate -fprofile-instr-use -- %s 2>&1 | FileCheck -check-prefix=CHECK-NO-MIX-GEN-USE %s
// RUN: %clang_cl -### /FA -fprofile-instr-generate -fprofile-instr-use=file -- %s 2>&1 | FileCheck -check-prefix=CHECK-NO-MIX-GEN-USE %s
// CHECK-PROFILE-GENERATE: "-fprofile-instrument=clang"
// CHECK-PROFILE-GENERATE: "-fprofile-instrument=clang" "--dependent-lib={{[^"]*}}clang_rt.profile-{{[^"]*}}.lib"
// CHECK-PROFILE-GENERATE-FILE: "-fprofile-instrument-path=/tmp/somefile.profraw"
// CHECK-NO-MIX-GEN-USE: '{{[a-z=-]*}}' not allowed with '{{[a-z=-]*}}'

Expand Down
14 changes: 14 additions & 0 deletions clang/test/Driver/instrprof-ld.c
Expand Up @@ -129,3 +129,17 @@
//
// CHECK-MINGW-X86-64: "{{(.*[^.0-9A-Z_a-z])?}}ld{{(.exe)?}}"
// CHECK-MINGW-X86-64: "{{.*}}/Inputs/resource_dir{{/|\\\\}}lib{{/|\\\\}}windows{{/|\\\\}}libclang_rt.profile-x86_64.a"

// Test instrumented profiling dependent-lib flags
//
// RUN: %clang %s -### -o %t.o -target x86_64-pc-win32 \
// RUN: -fprofile-instr-generate 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-WINDOWS-X86-64-DEPENDENT-LIB %s
//
// CHECK-WINDOWS-X86-64-DEPENDENT-LIB: "--dependent-lib={{[^"]*}}clang_rt.profile-{{[^"]*}}.lib"
//
// RUN: %clang %s -### -o %t.o -target x86_64-mingw32 \
// RUN: -fprofile-instr-generate 2>&1 \
// RUN: | FileCheck --check-prefix=CHECK-MINGW-X86-64-DEPENDENT-LIB %s
//
// CHECK-MINGW-X86-64-DEPENDENT-LIB-NOT: "--dependent-lib={{[^"]*}}clang_rt.profile-{{[^"]*}}.a"

0 comments on commit f7f6e87

Please sign in to comment.