Skip to content

Commit ba8b305

Browse files
committed
[Driver] Handle all optimization-record options for Darwin LTO
clang with -flto does not handle -foptimization-record-path=<path> This dulicates the code from ToolChains/Clang.cpp with modifications to support everything in the same fashion.
1 parent 90eb7be commit ba8b305

File tree

3 files changed

+114
-75
lines changed

3 files changed

+114
-75
lines changed

clang/lib/Driver/ToolChains/Darwin.cpp

Lines changed: 72 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,75 @@ static bool isObjCRuntimeLinked(const ArgList &Args) {
430430
return Args.hasArg(options::OPT_fobjc_link_runtime);
431431
}
432432

433+
static bool checkRemarksOptions(const Driver &D, const ArgList &Args,
434+
const llvm::Triple &Triple) {
435+
// When enabling remarks, we need to error if:
436+
// * The remark file is specified but we're targeting multiple architectures,
437+
// which means more than one remark file is being generated.
438+
bool hasMultipleInvocations =
439+
Args.getAllArgValues(options::OPT_arch).size() > 1;
440+
bool hasExplicitOutputFile =
441+
Args.getLastArg(options::OPT_foptimization_record_file_EQ);
442+
if (hasMultipleInvocations && hasExplicitOutputFile) {
443+
D.Diag(diag::err_drv_invalid_output_with_multiple_archs)
444+
<< "-foptimization-record-file";
445+
return false;
446+
}
447+
return true;
448+
}
449+
450+
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs,
451+
const llvm::Triple &Triple,
452+
const InputInfo &Output, const JobAction &JA) {
453+
StringRef Format = "yaml";
454+
if (const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
455+
Format = A->getValue();
456+
457+
CmdArgs.push_back("-mllvm");
458+
CmdArgs.push_back("-lto-pass-remarks-output");
459+
CmdArgs.push_back("-mllvm");
460+
461+
const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
462+
if (A) {
463+
CmdArgs.push_back(A->getValue());
464+
} else {
465+
assert(Output.isFilename() && "Unexpected ld output.");
466+
SmallString<128> F;
467+
F = Output.getFilename();
468+
F += ".opt.";
469+
F += Format;
470+
471+
CmdArgs.push_back(Args.MakeArgString(F));
472+
}
473+
474+
if (const Arg *A =
475+
Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
476+
CmdArgs.push_back("-mllvm");
477+
std::string Passes =
478+
std::string("-lto-pass-remarks-filter=") + A->getValue();
479+
CmdArgs.push_back(Args.MakeArgString(Passes));
480+
}
481+
482+
if (!Format.empty()) {
483+
CmdArgs.push_back("-mllvm");
484+
Twine FormatArg = Twine("-lto-pass-remarks-format=") + Format;
485+
CmdArgs.push_back(Args.MakeArgString(FormatArg));
486+
}
487+
488+
if (getLastProfileUseArg(Args)) {
489+
CmdArgs.push_back("-mllvm");
490+
CmdArgs.push_back("-lto-pass-remarks-with-hotness");
491+
492+
if (const Arg *A =
493+
Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
494+
CmdArgs.push_back("-mllvm");
495+
std::string Opt =
496+
std::string("-lto-pass-remarks-hotness-threshold=") + A->getValue();
497+
CmdArgs.push_back(Args.MakeArgString(Opt));
498+
}
499+
}
500+
}
501+
433502
void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
434503
const InputInfo &Output,
435504
const InputInfoList &Inputs,
@@ -464,55 +533,9 @@ void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
464533
// we follow suite for ease of comparison.
465534
AddLinkArgs(C, Args, CmdArgs, Inputs);
466535

467-
// For LTO, pass the name of the optimization record file and other
468-
// opt-remarks flags.
469-
if (Args.hasFlag(options::OPT_fsave_optimization_record,
470-
options::OPT_fsave_optimization_record_EQ,
471-
options::OPT_fno_save_optimization_record, false)) {
472-
CmdArgs.push_back("-mllvm");
473-
CmdArgs.push_back("-lto-pass-remarks-output");
474-
CmdArgs.push_back("-mllvm");
475-
476-
SmallString<128> F;
477-
F = Output.getFilename();
478-
F += ".opt.";
479-
if (const Arg *A =
480-
Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
481-
F += A->getValue();
482-
else
483-
F += "yaml";
484-
485-
CmdArgs.push_back(Args.MakeArgString(F));
486-
487-
if (getLastProfileUseArg(Args)) {
488-
CmdArgs.push_back("-mllvm");
489-
CmdArgs.push_back("-lto-pass-remarks-with-hotness");
490-
491-
if (const Arg *A =
492-
Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
493-
CmdArgs.push_back("-mllvm");
494-
std::string Opt =
495-
std::string("-lto-pass-remarks-hotness-threshold=") + A->getValue();
496-
CmdArgs.push_back(Args.MakeArgString(Opt));
497-
}
498-
}
499-
500-
if (const Arg *A =
501-
Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
502-
CmdArgs.push_back("-mllvm");
503-
std::string Passes =
504-
std::string("-lto-pass-remarks-filter=") + A->getValue();
505-
CmdArgs.push_back(Args.MakeArgString(Passes));
506-
}
507-
508-
if (const Arg *A =
509-
Args.getLastArg(options::OPT_fsave_optimization_record_EQ)) {
510-
CmdArgs.push_back("-mllvm");
511-
std::string Format =
512-
std::string("-lto-pass-remarks-format=") + A->getValue();
513-
CmdArgs.push_back(Args.MakeArgString(Format));
514-
}
515-
}
536+
if (checkRemarksOptions(getToolChain().getDriver(), Args,
537+
getToolChain().getTriple()))
538+
renderRemarksOptions(Args, CmdArgs, getToolChain().getTriple(), Output, JA);
516539

517540
// Propagate the -moutline flag to the linker in LTO.
518541
if (Arg *A =

clang/test/Driver/darwin-ld.c

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -309,32 +309,6 @@
309309
// LINK_VERSION_DIGITS: invalid version number in '-mlinker-version=133.3.0.1.a'
310310
// LINK_VERSION_DIGITS: invalid version number in '-mlinker-version=133.3.0.1a'
311311

312-
// Check that we're passing -lto-pass-remarks-output for LTO
313-
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record -### -o foo/bar.out 2> %t.log
314-
// RUN: FileCheck -check-prefix=PASS_REMARKS_OUTPUT %s < %t.log
315-
// PASS_REMARKS_OUTPUT: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "foo/bar.out.opt.yaml"
316-
// PASS_REMARKS_OUTPUT-NOT: -lto-pass-remarks-with-hotness
317-
318-
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record -### 2> %t.log
319-
// RUN: FileCheck -check-prefix=PASS_REMARKS_OUTPUT_NO_O %s < %t.log
320-
// PASS_REMARKS_OUTPUT_NO_O: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "a.out.opt.yaml"
321-
322-
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record -fprofile-instr-use=blah -### -o foo/bar.out 2> %t.log
323-
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_HOTNESS %s < %t.log
324-
// PASS_REMARKS_WITH_HOTNESS: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "foo/bar.out.opt.yaml" "-mllvm" "-lto-pass-remarks-with-hotness"
325-
326-
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record -fprofile-instr-use=blah -fdiagnostics-hotness-threshold=100 -### -o foo/bar.out 2> %t.log
327-
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_HOTNESS_THRESHOLD %s < %t.log
328-
// PASS_REMARKS_WITH_HOTNESS_THRESHOLD: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "foo/bar.out.opt.yaml" "-mllvm" "-lto-pass-remarks-with-hotness" "-mllvm" "-lto-pass-remarks-hotness-threshold=100"
329-
330-
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record -foptimization-record-passes=inline -### -o foo/bar.out 2> %t.log
331-
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_PASSES %s < %t.log
332-
// PASS_REMARKS_WITH_PASSES: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "foo/bar.out.opt.yaml" "-mllvm" "-lto-pass-remarks-filter=inline"
333-
//
334-
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record=some-format -### -o foo/bar.out 2> %t.log
335-
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_FORMAT %s < %t.log
336-
// PASS_REMARKS_WITH_FORMAT: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "foo/bar.out.opt.some-format" "-mllvm" "-lto-pass-remarks-format=some-format"
337-
338312
// RUN: %clang -target x86_64-apple-ios6.0 -miphoneos-version-min=6.0 -fprofile-instr-generate -### %t.o 2> %t.log
339313
// RUN: FileCheck -check-prefix=LINK_PROFILE_FIRST %s < %t.log
340314
// RUN: %clang -target x86_64-apple-darwin12 -fprofile-instr-generate -### %t.o 2> %t.log
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// REQUIRES: system-darwin
2+
3+
// RUN: touch %t.o
4+
//
5+
// Check that we're passing -lto-pass-remarks-output for LTO
6+
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record -### -o foo/bar.out 2> %t.log
7+
// RUN: FileCheck -check-prefix=PASS_REMARKS_OUTPUT %s < %t.log
8+
// PASS_REMARKS_OUTPUT: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "foo/bar.out.opt.yaml" "-mllvm" "-lto-pass-remarks-format=yaml"
9+
// PASS_REMARKS_OUTPUT-NOT: -lto-pass-remarks-with-hotness
10+
11+
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record -### 2> %t.log
12+
// RUN: FileCheck -check-prefix=PASS_REMARKS_OUTPUT_NO_O %s < %t.log
13+
// PASS_REMARKS_OUTPUT_NO_O: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "a.out.opt.yaml"
14+
15+
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record -fprofile-instr-use=blah -### -o foo/bar.out 2> %t.log
16+
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_HOTNESS %s < %t.log
17+
// PASS_REMARKS_WITH_HOTNESS: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "foo/bar.out.opt.yaml" "-mllvm" "-lto-pass-remarks-format=yaml" "-mllvm" "-lto-pass-remarks-with-hotness"
18+
19+
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record -fprofile-instr-use=blah -fdiagnostics-hotness-threshold=100 -### -o foo/bar.out 2> %t.log
20+
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_HOTNESS_THRESHOLD %s < %t.log
21+
// PASS_REMARKS_WITH_HOTNESS_THRESHOLD: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "foo/bar.out.opt.yaml" "-mllvm" "-lto-pass-remarks-format=yaml" "-mllvm" "-lto-pass-remarks-with-hotness" "-mllvm" "-lto-pass-remarks-hotness-threshold=100"
22+
23+
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record -foptimization-record-passes=inline -### -o foo/bar.out 2> %t.log
24+
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_PASSES %s < %t.log
25+
// PASS_REMARKS_WITH_PASSES: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "foo/bar.out.opt.yaml" "-mllvm" "-lto-pass-remarks-filter=inline"
26+
//
27+
// RUN: %clang -target x86_64-apple-darwin12 %t.o -fsave-optimization-record=some-format -### -o foo/bar.out 2> %t.log
28+
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_FORMAT %s < %t.log
29+
// PASS_REMARKS_WITH_FORMAT: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "foo/bar.out.opt.some-format" "-mllvm" "-lto-pass-remarks-format=some-format"
30+
31+
// RUN: %clang -target x86_64-apple-darwin12 %t.o -foptimization-record-file=remarks-custom.opt.yaml -### -o foo/bar.out 2> %t.log
32+
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_FILE %s < %t.log
33+
// PASS_REMARKS_WITH_FILE: "-mllvm" "-lto-pass-remarks-output" "-mllvm" "remarks-custom.opt.yaml"
34+
35+
// RUN: %clang -target x86_64-apple-darwin12 -arch x86_64 -arch x86_64h %t.o -fsave-optimization-record -### -o foo/bar.out 2> %t.log
36+
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_FAT %s < %t.log
37+
// PASS_REMARKS_WITH_FAT: "-arch" "x86_64"{{.*}}"-mllvm" "-lto-pass-remarks-output"
38+
// PASS_REMARKS_WITH_FAT-NEXT: "-arch" "x86_64h"{{.*}}"-mllvm" "-lto-pass-remarks-output"
39+
//
40+
// RUN: %clang -target x86_64-apple-darwin12 -arch x86_64 -arch x86_64h %t.o -foptimization-record-file=custom.opt.yaml -### -o foo/bar.out 2> %t.log
41+
// RUN: FileCheck -check-prefix=PASS_REMARKS_WITH_FILE_FAT %s < %t.log
42+
// PASS_REMARKS_WITH_FILE_FAT: error: cannot use '-foptimization-record-file' output with multiple -arch options

0 commit comments

Comments
 (0)