@@ -527,9 +527,56 @@ Expected<StringRef> clang(ArrayRef<StringRef> InputFiles, const ArgList &Args) {
527
527
528
528
// Forward all of the `--offload-opt` and similar options to the device.
529
529
if (linkerSupportsLTO (Args)) {
530
- for (auto &Arg : Args.filtered (OPT_offload_opt_eq_minus, OPT_mllvm))
531
- CmdArgs.push_back (
532
- Args.MakeArgString (" -Wl,--plugin-opt=" + StringRef (Arg->getValue ())));
530
+ for (auto &Arg : Args.filtered (OPT_offload_opt_eq_minus, OPT_mllvm)) {
531
+ StringRef Val = Arg->getValue ();
532
+ // --help documents them with "--" but option parsing accepts them with
533
+ // "-" too, so either could arrive here.
534
+ auto consumeOpt = [](StringRef &Val, StringRef Opt) {
535
+ assert (Opt.starts_with (" --" ));
536
+ return Val.consume_front (Opt) || Val.consume_front (Opt.substr (1 ));
537
+ };
538
+ // Use -Xlinker not -Wl, which doesn't treat commas as plain text.
539
+ if (consumeOpt (Val, " --pass-remarks-with-hotness=" )) {
540
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
541
+ CmdArgs.push_back (Args.MakeArgString (" --opt-remarks-with-hotness" ));
542
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
543
+ CmdArgs.push_back (Args.MakeArgString (Val));
544
+ } else if (consumeOpt (Val, " --pass-remarks-hotness-threshold=" )) {
545
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
546
+ CmdArgs.push_back (Args.MakeArgString (" --opt-remarks-hotness-threshold" ));
547
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
548
+ CmdArgs.push_back (Args.MakeArgString (Val));
549
+ } else if (consumeOpt (Val, " --pass-remarks-output=" )) {
550
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
551
+ CmdArgs.push_back (Args.MakeArgString (" --opt-remarks-filename" ));
552
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
553
+ CmdArgs.push_back (Args.MakeArgString (Val));
554
+ } else if (consumeOpt (Val, " --pass-remarks-filter=" )) {
555
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
556
+ CmdArgs.push_back (Args.MakeArgString (" --opt-remarks-passes" ));
557
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
558
+ CmdArgs.push_back (Args.MakeArgString (Val));
559
+ } else if (consumeOpt (Val, " --pass-remarks-format=" )) {
560
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
561
+ CmdArgs.push_back (Args.MakeArgString (" --opt-remarks-format" ));
562
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
563
+ CmdArgs.push_back (Args.MakeArgString (Val));
564
+ } else if (consumeOpt (Val, " --load-pass-plugin=" )) {
565
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
566
+ CmdArgs.push_back (Args.MakeArgString (" --load-pass-plugin=" + Val));
567
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
568
+ CmdArgs.push_back (Args.MakeArgString (" -mllvm=-load=" + Val));
569
+ } else if (consumeOpt (Val, " --passes=" ) || Val.consume_front (" -p=" )) {
570
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
571
+ CmdArgs.push_back (Args.MakeArgString (" --lto-newpm-passes=" + Val));
572
+ } else {
573
+ // This is needed for at least -pass-remarks and options defined by any
574
+ // loaded plugins (e.g., -wave-goodbye defined by Bye.so).
575
+ CmdArgs.push_back (Args.MakeArgString (" -Xlinker" ));
576
+ CmdArgs.push_back (
577
+ Args.MakeArgString (" -mllvm=" + StringRef (Arg->getValue ())));
578
+ }
579
+ }
533
580
}
534
581
535
582
if (!Triple.isNVPTX ())
0 commit comments