29 #include "clang/Config/config.h"
41 #include "llvm/ADT/STLExtras.h"
42 #include "llvm/ADT/SmallSet.h"
43 #include "llvm/ADT/SmallString.h"
44 #include "llvm/ADT/StringExtras.h"
45 #include "llvm/ADT/StringSwitch.h"
46 #include "llvm/ADT/Twine.h"
47 #include "llvm/BinaryFormat/Magic.h"
48 #include "llvm/Config/llvm-config.h"
49 #include "llvm/Option/Arg.h"
50 #include "llvm/Option/ArgList.h"
51 #include "llvm/Option/Option.h"
52 #include "llvm/Support/CodeGen.h"
53 #include "llvm/Support/Compression.h"
54 #include "llvm/Support/Debug.h"
55 #include "llvm/Support/ErrorHandling.h"
56 #include "llvm/Support/FileSystem.h"
57 #include "llvm/Support/Host.h"
58 #include "llvm/Support/Path.h"
59 #include "llvm/Support/Process.h"
60 #include "llvm/Support/Program.h"
61 #include "llvm/Support/ScopedPrinter.h"
62 #include "llvm/Support/TargetParser.h"
63 #include "llvm/Support/Threading.h"
64 #include "llvm/Support/VirtualFileSystem.h"
65 #include "llvm/Support/YAMLParser.h"
70 using namespace clang;
74 const StringRef PluginOptPrefix) {
75 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
76 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
77 "-pass-remarks=" + A->getValue()));
79 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
80 CmdArgs.push_back(Args.MakeArgString(
81 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
83 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
84 CmdArgs.push_back(Args.MakeArgString(
85 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
89 const llvm::Triple &Triple,
92 const StringRef PluginOptPrefix) {
93 StringRef Format =
"yaml";
94 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
95 Format = A->getValue();
98 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
104 assert(!F.empty() &&
"Cannot determine remarks output name.");
106 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
107 "opt-remarks-filename=" + F +
108 ".opt.ld." + Format));
111 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
112 CmdArgs.push_back(Args.MakeArgString(
113 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
115 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
116 "opt-remarks-format=" + Format.data()));
120 ArgStringList &CmdArgs,
121 const StringRef PluginOptPrefix) {
122 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
123 options::OPT_fno_diagnostics_show_hotness,
false))
124 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
125 "opt-remarks-with-hotness"));
128 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
130 Args.MakeArgString(Twine(PluginOptPrefix) +
131 "opt-remarks-hotness-threshold=" + A->getValue()));
136 if (D.
getVFS().exists(Path))
137 Paths.push_back(Path.str());
141 std::vector<StringRef> &Features,
142 OptSpecifier
Group) {
143 for (
const Arg *A : Args.filtered(
Group)) {
144 StringRef Name = A->getOption().getName();
148 assert(Name.startswith(
"m") &&
"Invalid feature name.");
149 Name = Name.substr(1);
151 bool IsNegative = Name.startswith(
"no-");
153 Name = Name.substr(3);
154 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
158 SmallVector<StringRef>
163 for (StringRef Feature : llvm::reverse(Features)) {
164 if (UsedFeatures.insert(Feature.drop_front()).second)
165 UnifiedFeatures.insert(UnifiedFeatures.begin(), Feature);
168 return UnifiedFeatures;
172 const char *ArgName,
const char *EnvVar) {
173 const char *DirList = ::getenv(EnvVar);
174 bool CombinedArg =
false;
179 StringRef Name(ArgName);
180 if (Name.equals(
"-I") || Name.equals(
"-L") || Name.empty())
183 StringRef Dirs(DirList);
187 StringRef::size_type Delim;
188 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
191 CmdArgs.push_back(Args.MakeArgString(
std::string(ArgName) +
"."));
193 CmdArgs.push_back(ArgName);
194 CmdArgs.push_back(
".");
199 Args.MakeArgString(
std::string(ArgName) + Dirs.substr(0, Delim)));
201 CmdArgs.push_back(ArgName);
202 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
205 Dirs = Dirs.substr(Delim + 1);
210 CmdArgs.push_back(Args.MakeArgString(
std::string(ArgName) +
"."));
212 CmdArgs.push_back(ArgName);
213 CmdArgs.push_back(
".");
217 CmdArgs.push_back(Args.MakeArgString(
std::string(ArgName) + Dirs));
219 CmdArgs.push_back(ArgName);
220 CmdArgs.push_back(Args.MakeArgString(Dirs));
226 const ArgList &Args, ArgStringList &CmdArgs,
232 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
239 for (
const auto &II : Inputs) {
243 if (
auto *IA = II.getAction())
253 if (II.isFilename()) {
254 CmdArgs.push_back(II.getFilename());
263 const Arg &A = II.getInputArg();
266 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
268 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
270 else if (A.getOption().matches(options::OPT_z)) {
273 A.render(Args, CmdArgs);
274 }
else if (A.getOption().matches(options::OPT_b)) {
277 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
278 << A.getSpelling() << T.str();
282 A.render(Args, CmdArgs);
284 A.renderAsInput(Args, CmdArgs);
290 const ToolChain &TC,
const llvm::opt::ArgList &Args,
291 llvm::opt::ArgStringList &CmdArgs) {
297 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
298 StringRef
V = A->getValue();
299 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
300 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
302 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
303 << A->getSpelling() <<
V;
308 std::vector<StringRef> &Features,
309 OptSpecifier OnOpt, OptSpecifier OffOpt,
310 StringRef FeatureName) {
311 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
312 if (A->getOption().matches(OnOpt))
313 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
315 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
321 const ArgList &Args) {
322 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
324 return llvm::StringSwitch<std::string>(GPUName)
325 .Cases(
"rv630",
"rv635",
"r600")
326 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
327 .Case(
"rv740",
"rv770")
328 .Case(
"palm",
"cedar")
329 .Cases(
"sumo",
"sumo2",
"sumo")
330 .Case(
"hemlock",
"cypress")
331 .Case(
"aruba",
"cayman")
332 .Default(GPUName.str());
338 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
339 return A->getValue();
347 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
348 StringRef CPU = A->getValue();
354 return llvm::sys::getHostCPUName();
364 const llvm::Triple &T,
bool FromAs) {
367 switch (T.getArch()) {
371 case llvm::Triple::aarch64:
372 case llvm::Triple::aarch64_32:
373 case llvm::Triple::aarch64_be:
376 case llvm::Triple::arm:
377 case llvm::Triple::armeb:
378 case llvm::Triple::thumb:
379 case llvm::Triple::thumbeb: {
380 StringRef MArch, MCPU;
385 case llvm::Triple::avr:
386 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
387 return A->getValue();
390 case llvm::Triple::m68k:
393 case llvm::Triple::mips:
394 case llvm::Triple::mipsel:
395 case llvm::Triple::mips64:
396 case llvm::Triple::mips64el: {
403 case llvm::Triple::nvptx:
404 case llvm::Triple::nvptx64:
405 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
406 return A->getValue();
409 case llvm::Triple::ppc:
410 case llvm::Triple::ppcle:
411 case llvm::Triple::ppc64:
412 case llvm::Triple::ppc64le:
415 case llvm::Triple::csky:
416 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
417 return A->getValue();
418 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
419 return A->getValue();
422 case llvm::Triple::riscv32:
423 case llvm::Triple::riscv64:
426 case llvm::Triple::bpfel:
427 case llvm::Triple::bpfeb:
428 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
429 return A->getValue();
432 case llvm::Triple::sparc:
433 case llvm::Triple::sparcel:
434 case llvm::Triple::sparcv9:
437 case llvm::Triple::x86:
438 case llvm::Triple::x86_64:
441 case llvm::Triple::hexagon:
445 case llvm::Triple::lanai:
448 case llvm::Triple::systemz:
451 case llvm::Triple::r600:
452 case llvm::Triple::amdgcn:
455 case llvm::Triple::wasm32:
456 case llvm::Triple::wasm64:
462 std::vector<StringRef> &Features) {
467 const ArgList &Args, ArgStringList &CmdArgs,
468 bool ForAS,
bool IsAux) {
469 std::vector<StringRef> Features;
470 switch (Triple.getArch()) {
473 case llvm::Triple::mips:
474 case llvm::Triple::mipsel:
475 case llvm::Triple::mips64:
476 case llvm::Triple::mips64el:
479 case llvm::Triple::arm:
480 case llvm::Triple::armeb:
481 case llvm::Triple::thumb:
482 case llvm::Triple::thumbeb:
485 case llvm::Triple::ppc:
486 case llvm::Triple::ppcle:
487 case llvm::Triple::ppc64:
488 case llvm::Triple::ppc64le:
491 case llvm::Triple::riscv32:
492 case llvm::Triple::riscv64:
495 case llvm::Triple::systemz:
498 case llvm::Triple::aarch64:
499 case llvm::Triple::aarch64_32:
500 case llvm::Triple::aarch64_be:
503 case llvm::Triple::x86:
504 case llvm::Triple::x86_64:
507 case llvm::Triple::hexagon:
510 case llvm::Triple::wasm32:
511 case llvm::Triple::wasm64:
514 case llvm::Triple::sparc:
515 case llvm::Triple::sparcel:
516 case llvm::Triple::sparcv9:
519 case llvm::Triple::r600:
520 case llvm::Triple::amdgcn:
523 case llvm::Triple::nvptx:
524 case llvm::Triple::nvptx64:
527 case llvm::Triple::m68k:
530 case llvm::Triple::msp430:
533 case llvm::Triple::ve:
536 case llvm::Triple::csky:
539 case llvm::Triple::loongarch32:
540 case llvm::Triple::loongarch64:
546 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
547 CmdArgs.push_back(Feature.data());
552 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
555 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
556 D.
Diag(diag::err_drv_invalid_int_value)
557 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
558 return LtoJobsArg->getValue();
563 return Triple.getOS() == llvm::Triple::CloudABI || Triple.isPS();
567 ArgStringList &CmdArgs,
const InputInfo &Output,
568 const InputInfo &Input,
bool IsThinLTO) {
572 if (llvm::sys::path::filename(Linker) !=
"ld.lld" &&
573 llvm::sys::path::stem(Linker) !=
"ld.lld") {
577 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
578 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
581 CmdArgs.push_back(
"-plugin");
584 const char *Suffix =
".dll";
585 #elif defined(__APPLE__)
586 const char *Suffix =
".dylib";
588 const char *Suffix =
".so";
592 llvm::sys::path::native(Twine(D.
Dir) +
593 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
596 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
599 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
600 const char *ExtraDash = IsOSAIX ?
"-" :
"";
605 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
606 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
607 "-generate-arange-section"));
617 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
619 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
623 if (A->getOption().matches(options::OPT_O4) ||
624 A->getOption().matches(options::OPT_Ofast))
626 else if (A->getOption().matches(options::OPT_O)) {
627 OOpt = A->getValue();
630 else if (OOpt ==
"s" || OOpt ==
"z")
632 }
else if (A->getOption().matches(options::OPT_O0))
636 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"O" + OOpt));
639 if (Args.hasArg(options::OPT_gsplit_dwarf))
640 CmdArgs.push_back(Args.MakeArgString(
641 Twine(PluginOptPrefix) +
"dwo_dir=" + Output.
getFilename() +
"_dwo"));
644 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
647 if (!Parallelism.empty())
649 Args.MakeArgString(Twine(PluginOptPrefix) +
"jobs=" + Parallelism));
653 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
654 if (A->getOption().matches(options::OPT_glldb))
656 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
657 else if (A->getOption().matches(options::OPT_gsce))
659 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
660 else if (A->getOption().matches(options::OPT_gdbx))
662 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
665 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
671 Arg *A = Args.getLastArg(options::OPT_g_Group);
672 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
673 !A->getOption().matches(options::OPT_ggdb0);
674 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
675 options::OPT_gno_strict_dwarf,
true))
677 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
679 if (Args.getLastArg(options::OPT_mabi_EQ_vec_extabi))
681 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
684 bool UseSeparateSections =
687 if (Args.hasFlag(options::OPT_ffunction_sections,
688 options::OPT_fno_function_sections, UseSeparateSections))
690 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
691 else if (Args.hasArg(options::OPT_fno_function_sections))
693 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
695 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
696 UseSeparateSections))
698 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
699 else if (Args.hasArg(options::OPT_fno_data_sections))
701 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
704 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
705 options::OPT_fno_split_machine_functions)) {
706 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
707 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
708 "-split-machine-functions"));
712 StringRef FName = A->getValue();
713 if (!llvm::sys::fs::exists(FName))
714 D.
Diag(diag::err_drv_no_such_file) << FName;
716 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
717 "sample-profile=" + FName));
720 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
721 options::OPT_fcs_profile_generate_EQ,
722 options::OPT_fno_profile_generate);
723 if (CSPGOGenerateArg &&
724 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
725 CSPGOGenerateArg =
nullptr;
729 if (CSPGOGenerateArg) {
730 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
731 "cs-profile-generate"));
732 if (CSPGOGenerateArg->getOption().matches(
733 options::OPT_fcs_profile_generate_EQ)) {
735 llvm::sys::path::append(Path,
"default_%m.profraw");
736 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
737 "cs-profile-path=" + Path));
740 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
741 "cs-profile-path=default_%m.profraw"));
742 }
else if (ProfileUseArg) {
744 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
745 if (Path.empty() || llvm::sys::fs::is_directory(Path))
746 llvm::sys::path::append(Path,
"default.profdata");
747 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
748 "cs-profile-path=" + Path));
752 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
754 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
755 "-enable-jmc-instrument"));
757 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
760 if (Args.hasFlag(options::OPT_fstack_size_section,
761 options::OPT_fno_stack_size_section,
false))
763 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
767 if (!StatsFile.empty())
769 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
772 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
773 CmdArgs.push_back(Args.MakeArgString(
774 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
785 Output, PluginOptPrefix);
791 true, PluginOptPrefix);
796 ArgStringList &CmdArgs) {
798 if (Args.hasFlag(options::OPT_fopenmp_implicit_rpath,
799 options::OPT_fno_openmp_implicit_rpath,
true)) {
802 SmallString<256> DefaultLibPath =
804 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
805 CmdArgs.push_back(
"-rpath");
806 CmdArgs.push_back(Args.MakeArgString(DefaultLibPath));
812 ArgStringList &CmdArgs) {
815 SmallString<256> DefaultLibPath =
817 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
818 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
822 ArgStringList &CmdArgs) {
825 bool DefaultValue = IsVE;
826 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
827 options::OPT_fno_rtlib_add_rpath, DefaultValue))
831 if (TC.
getVFS().exists(CandidateRPath)) {
832 CmdArgs.push_back(
"-rpath");
833 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
838 const ArgList &Args,
bool ForceStaticHostRuntime,
839 bool IsOffloadingHost,
bool GompNeedsRT) {
840 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
841 options::OPT_fno_openmp,
false))
850 if (ForceStaticHostRuntime)
851 CmdArgs.push_back(
"-Bstatic");
855 CmdArgs.push_back(
"-lomp");
858 CmdArgs.push_back(
"-lgomp");
861 CmdArgs.push_back(
"-liomp5");
867 if (ForceStaticHostRuntime)
868 CmdArgs.push_back(
"-Bdynamic");
871 CmdArgs.push_back(
"-lrt");
873 if (IsOffloadingHost)
874 CmdArgs.push_back(
"-lomptarget");
876 if (IsOffloadingHost && !Args.hasArg(options::OPT_nogpulib))
877 CmdArgs.push_back(
"-lomptarget.devicertl");
889 llvm::opt::ArgStringList &CmdArgs) {
890 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
891 CmdArgs.push_back(
"Fortran_main.lib");
892 CmdArgs.push_back(
"FortranRuntime.lib");
893 CmdArgs.push_back(
"FortranDecimal.lib");
895 CmdArgs.push_back(
"-lFortran_main");
896 CmdArgs.push_back(
"-lFortranRuntime");
897 CmdArgs.push_back(
"-lFortranDecimal");
902 const llvm::opt::ArgList &Args,
903 ArgStringList &CmdArgs) {
907 if (!Args.hasArg(options::OPT_flang_experimental_exec))
916 llvm::sys::path::append(DefaultLibPath,
"lib");
917 if (TC.
getTriple().isKnownWindowsMSVCEnvironment())
918 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + DefaultLibPath));
920 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
924 ArgStringList &CmdArgs, StringRef Sanitizer,
925 bool IsShared,
bool IsWhole) {
928 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
931 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
941 ArgStringList &CmdArgs,
942 StringRef Sanitizer) {
945 if (TC.
getTriple().getOS() == llvm::Triple::Solaris)
948 if (llvm::sys::fs::exists(SanRT +
".syms")) {
949 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
957 "AIX linker does not support any form of --as-needed option yet.");
963 return as_needed ?
"-zignore" :
"-zrecord";
965 return as_needed ?
"--as-needed" :
"--no-as-needed";
969 ArgStringList &CmdArgs) {
974 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
976 CmdArgs.push_back(
"-lpthread");
978 CmdArgs.push_back(
"-lrt");
980 CmdArgs.push_back(
"-lm");
984 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
985 CmdArgs.push_back(
"-ldl");
990 CmdArgs.push_back(
"-lexecinfo");
996 CmdArgs.push_back(
"-lresolv");
1010 SharedRuntimes.push_back(
"asan");
1011 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1012 HelperStaticRuntimes.push_back(
"asan-preinit");
1015 SharedRuntimes.push_back(
"memprof");
1016 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1017 HelperStaticRuntimes.push_back(
"memprof-preinit");
1021 SharedRuntimes.push_back(
"ubsan_minimal");
1023 SharedRuntimes.push_back(
"ubsan_standalone");
1026 SharedRuntimes.push_back(
"scudo_standalone");
1029 SharedRuntimes.push_back(
"tsan");
1032 SharedRuntimes.push_back(
"hwasan_aliases");
1034 SharedRuntimes.push_back(
"hwasan");
1035 if (!Args.hasArg(options::OPT_shared))
1036 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1042 StaticRuntimes.push_back(
"stats_client");
1046 HelperStaticRuntimes.push_back(
"asan_static");
1049 if (Args.hasArg(options::OPT_shared)) {
1058 StaticRuntimes.push_back(
"asan");
1060 StaticRuntimes.push_back(
"asan_cxx");
1065 StaticRuntimes.push_back(
"memprof");
1067 StaticRuntimes.push_back(
"memprof_cxx");
1072 StaticRuntimes.push_back(
"hwasan_aliases");
1074 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1076 StaticRuntimes.push_back(
"hwasan");
1078 StaticRuntimes.push_back(
"hwasan_cxx");
1082 StaticRuntimes.push_back(
"dfsan");
1084 StaticRuntimes.push_back(
"lsan");
1086 StaticRuntimes.push_back(
"msan");
1088 StaticRuntimes.push_back(
"msan_cxx");
1092 StaticRuntimes.push_back(
"tsan");
1094 StaticRuntimes.push_back(
"tsan_cxx");
1098 StaticRuntimes.push_back(
"ubsan_minimal");
1100 StaticRuntimes.push_back(
"ubsan_standalone");
1102 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1106 NonWholeStaticRuntimes.push_back(
"safestack");
1107 RequiredSymbols.push_back(
"__safestack_init");
1111 StaticRuntimes.push_back(
"cfi");
1113 StaticRuntimes.push_back(
"cfi_diag");
1115 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1119 NonWholeStaticRuntimes.push_back(
"stats");
1120 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1123 StaticRuntimes.push_back(
"scudo_standalone");
1125 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1132 ArgStringList &CmdArgs) {
1133 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
1134 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1136 NonWholeStaticRuntimes, HelperStaticRuntimes,
1142 !Args.hasArg(options::OPT_shared)) {
1148 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
1149 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1150 !Args.hasArg(options::OPT_static);
1151 if (OnlyLibstdcxxStatic)
1152 CmdArgs.push_back(
"-Bstatic");
1154 if (OnlyLibstdcxxStatic)
1155 CmdArgs.push_back(
"-Bdynamic");
1159 for (
auto RT : SharedRuntimes)
1161 for (
auto RT : HelperStaticRuntimes)
1163 bool AddExportDynamic =
false;
1164 for (
auto RT : StaticRuntimes) {
1168 for (
auto RT : NonWholeStaticRuntimes) {
1172 for (
auto S : RequiredSymbols) {
1173 CmdArgs.push_back(
"-u");
1174 CmdArgs.push_back(Args.MakeArgString(S));
1178 if (AddExportDynamic)
1179 CmdArgs.push_back(
"--export-dynamic");
1182 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1186 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1187 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1190 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1192 CmdArgs.push_back(
"--android-memtag-heap");
1194 CmdArgs.push_back(
"--android-memtag-stack");
1197 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1201 if (Args.hasArg(options::OPT_shared))
1205 CmdArgs.push_back(
"-whole-archive");
1209 CmdArgs.push_back(
"-no-whole-archive");
1218 CmdArgs.push_back(
"-lpthread");
1220 CmdArgs.push_back(
"-lrt");
1221 CmdArgs.push_back(
"-lm");
1226 CmdArgs.push_back(
"-ldl");
1231 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1232 return !A->getOption().matches(options::OPT_O0);
1240 auto AddPostfix = [JA](
auto &F) {
1245 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1246 if (StringRef(A->getValue()) ==
"single")
1249 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1250 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1252 llvm::sys::path::remove_filename(T);
1253 llvm::sys::path::append(T, llvm::sys::path::stem(FinalOutput->getValue()));
1255 return Args.MakeArgString(T);
1258 Arg *A = Args.getLastArg(options::OPT_ffile_compilation_dir_EQ,
1259 options::OPT_fdebug_compilation_dir_EQ);
1264 return Args.MakeArgString(T);
1269 const JobAction &JA,
const ArgList &Args,
1270 const InputInfo &Output,
const char *OutFile) {
1271 ArgStringList ExtractArgs;
1272 ExtractArgs.push_back(
"--extract-dwo");
1274 ArgStringList StripArgs;
1275 StripArgs.push_back(
"--strip-dwo");
1280 ExtractArgs.push_back(OutFile);
1287 C.addCommand(std::make_unique<Command>(JA, T,
1289 Exec, ExtractArgs, II, Output));
1292 C.addCommand(std::make_unique<Command>(
1302 Args.ClaimAllArgs(options::OPT_flto_EQ);
1303 Args.ClaimAllArgs(options::OPT_flto);
1304 Args.ClaimAllArgs(options::OPT_fno_lto);
1308 auto *ProfileUseArg = Args.getLastArg(
1309 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1310 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1311 options::OPT_fno_profile_instr_use);
1313 if (ProfileUseArg &&
1314 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1315 ProfileUseArg =
nullptr;
1317 return ProfileUseArg;
1321 auto *ProfileSampleUseArg = Args.getLastArg(
1322 options::OPT_fprofile_sample_use, options::OPT_fprofile_sample_use_EQ,
1323 options::OPT_fauto_profile, options::OPT_fauto_profile_EQ,
1324 options::OPT_fno_profile_sample_use, options::OPT_fno_auto_profile);
1326 if (ProfileSampleUseArg &&
1327 (ProfileSampleUseArg->getOption().matches(
1328 options::OPT_fno_profile_sample_use) ||
1329 ProfileSampleUseArg->getOption().matches(options::OPT_fno_auto_profile)))
1332 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ,
1333 options::OPT_fauto_profile_EQ);
1338 case llvm::Reloc::Static:
1340 case llvm::Reloc::PIC_:
1342 case llvm::Reloc::DynamicNoPIC:
1343 return "dynamic-no-pic";
1344 case llvm::Reloc::ROPI:
1346 case llvm::Reloc::RWPI:
1348 case llvm::Reloc::ROPI_RWPI:
1351 llvm_unreachable(
"Unknown Reloc::Model kind");
1358 std::tuple<llvm::Reloc::Model, unsigned, bool>
1366 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1368 bool IsPICLevelTwo = PIC;
1371 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1374 if (Triple.isAndroid()) {
1375 switch (Triple.getArch()) {
1376 case llvm::Triple::arm:
1377 case llvm::Triple::armeb:
1378 case llvm::Triple::thumb:
1379 case llvm::Triple::thumbeb:
1380 case llvm::Triple::aarch64:
1381 case llvm::Triple::mips:
1382 case llvm::Triple::mipsel:
1383 case llvm::Triple::mips64:
1384 case llvm::Triple::mips64el:
1388 case llvm::Triple::x86:
1389 case llvm::Triple::x86_64:
1391 IsPICLevelTwo =
true;
1400 if (Triple.isOSOpenBSD()) {
1402 case llvm::Triple::arm:
1403 case llvm::Triple::aarch64:
1404 case llvm::Triple::mips64:
1405 case llvm::Triple::mips64el:
1406 case llvm::Triple::x86:
1407 case llvm::Triple::x86_64:
1408 IsPICLevelTwo =
false;
1411 case llvm::Triple::ppc:
1412 case llvm::Triple::sparcv9:
1413 IsPICLevelTwo =
true;
1422 if (Triple.getArch() == llvm::Triple::amdgcn)
1429 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1430 options::OPT_fpic, options::OPT_fno_pic,
1431 options::OPT_fPIE, options::OPT_fno_PIE,
1432 options::OPT_fpie, options::OPT_fno_pie);
1433 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
1434 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
1435 options::OPT_fPIE, options::OPT_fpie)) {
1437 << LastPICArg->getSpelling() << Triple.str();
1438 if (Triple.getArch() == llvm::Triple::x86_64)
1439 return std::make_tuple(llvm::Reloc::PIC_, 2
U,
false);
1440 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1447 Option O = LastPICArg->getOption();
1448 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1449 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1450 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1452 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1454 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
1457 if (EffectiveTriple.isPS()) {
1458 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
1459 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
1460 if (Model !=
"kernel") {
1463 << LastPICArg->getSpelling()
1464 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
1474 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
1480 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
1481 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
1484 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1487 if (!Triple.isOSDarwin())
1489 << A->getSpelling() << Triple.str();
1498 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2
U : 0
U,
false);
1501 bool EmbeddedPISupported;
1502 switch (Triple.getArch()) {
1503 case llvm::Triple::arm:
1504 case llvm::Triple::armeb:
1505 case llvm::Triple::thumb:
1506 case llvm::Triple::thumbeb:
1507 EmbeddedPISupported =
true;
1510 EmbeddedPISupported =
false;
1514 bool ROPI =
false, RWPI =
false;
1515 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
1516 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
1517 if (!EmbeddedPISupported)
1519 << LastROPIArg->getSpelling() << Triple.str();
1522 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
1523 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
1524 if (!EmbeddedPISupported)
1526 << LastRWPIArg->getSpelling() << Triple.str();
1531 if ((ROPI || RWPI) && (PIC || PIE))
1534 if (Triple.isMIPS()) {
1541 if (ABIName ==
"n64")
1544 if(Args.hasArg(options::OPT_mno_abicalls))
1545 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1548 IsPICLevelTwo =
false;
1552 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2
U : 1
U, PIE);
1554 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
1556 RelocM = llvm::Reloc::ROPI_RWPI;
1558 RelocM = llvm::Reloc::ROPI;
1560 RelocM = llvm::Reloc::RWPI;
1562 return std::make_tuple(RelocM, 0
U,
false);
1582 const ArgList &Args) {
1583 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
1584 options::OPT_falign_functions_EQ,
1585 options::OPT_fno_align_functions);
1586 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
1589 if (A->getOption().matches(options::OPT_falign_functions))
1593 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
1595 << A->getAsString(Args) << A->getValue();
1600 const ArgList &Args) {
1601 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
1607 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 5 ||
1610 << A->getAsString(Args) << A->getValue();
1615 return llvm::StringSwitch<unsigned>(ArgValue)
1616 .Case(
"-gdwarf-2", 2)
1617 .Case(
"-gdwarf-3", 3)
1618 .Case(
"-gdwarf-4", 4)
1619 .Case(
"-gdwarf-5", 5)
1624 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
1625 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
1626 options::OPT_gdwarf);
1630 const llvm::opt::ArgList &Args) {
1635 if (DwarfVersion == 0) {
1637 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
1639 return DwarfVersion;
1643 ArgStringList &CmdArgs) {
1644 llvm::Reloc::Model RelocationModel;
1649 if (RelocationModel != llvm::Reloc::Static)
1650 CmdArgs.push_back(
"-KPIC");
1656 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
1662 const ArgList &Args) {
1663 if (Args.hasArg(options::OPT_static_libgcc) ||
1664 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
1668 if (Args.hasArg(options::OPT_shared_libgcc))
1687 ArgStringList &CmdArgs,
const ArgList &Args) {
1708 CmdArgs.push_back(
"-lgcc_eh");
1710 CmdArgs.push_back(
"-lgcc_s");
1718 CmdArgs.push_back(
"-lunwind");
1720 CmdArgs.push_back(
"-l:libunwind.a");
1723 CmdArgs.push_back(
"-l:libunwind.dll.a");
1725 CmdArgs.push_back(
"-l:libunwind.so");
1729 CmdArgs.push_back(
"-lunwind");
1739 ArgStringList &CmdArgs,
const ArgList &Args) {
1743 CmdArgs.push_back(
"-lgcc");
1747 CmdArgs.push_back(
"-lgcc");
1751 ArgStringList &CmdArgs,
const ArgList &Args) {
1762 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1765 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
1766 if (A && A->getValue() != StringRef(
"platform")) {
1767 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
1768 << A->getValue() <<
"MSVC";
1778 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
1779 !Args.hasArg(options::OPT_static_pie))
1780 CmdArgs.push_back(
"-ldl");
1787 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
1791 StringRef SaveStats = A->getValue();
1793 if (SaveStats ==
"obj" && Output.
isFilename()) {
1795 llvm::sys::path::remove_filename(StatsFile);
1796 }
else if (SaveStats !=
"cwd") {
1797 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
1801 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
1802 llvm::sys::path::append(StatsFile, BaseName);
1803 llvm::sys::path::replace_extension(StatsFile,
"stats");
1809 Flags.push_back(
std::string(Enabled ?
"+" :
"-") + Flag);
1813 ArgStringList &CmdArgs,
bool IsLTO,
1814 const StringRef PluginOptPrefix) {
1815 auto addArg = [&, IsLTO](
const Twine &Arg) {
1817 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
1818 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
1820 CmdArgs.push_back(
"-mllvm");
1821 CmdArgs.push_back(Args.MakeArgString(Arg));
1825 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
1826 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
1828 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
1829 StringRef
Value = A->getValue();
1831 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
1832 !llvm::isPowerOf2_64(Boundary)) {
1833 D.
Diag(diag::err_drv_invalid_argument_to_option)
1834 <<
Value << A->getOption().getName();
1836 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
1839 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
1841 for (StringRef T : A->getValues()) {
1842 if (T !=
"fused" && T !=
"jcc" && T !=
"jmp" && T !=
"call" &&
1843 T !=
"ret" && T !=
"indirect")
1844 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
1845 << T <<
"fused, jcc, jmp, call, ret, indirect";
1846 if (!AlignBranch.empty())
1850 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
1852 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
1853 StringRef
Value = A->getValue();
1854 unsigned PrefixSize;
1855 if (
Value.getAsInteger(10, PrefixSize)) {
1856 D.
Diag(diag::err_drv_invalid_argument_to_option)
1857 <<
Value << A->getOption().getName();
1859 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
1885 llvm::opt::ArgStringList &CC1Args,
1887 StringRef Arch, StringRef Target,
bool isBitCodeSDL,
1888 bool postClangLink) {
1910 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
1911 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
1913 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
1914 Twine(Lib +
"-" + Arch).str(), Twine(Lib).str()}) {
1915 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
1916 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
1926 const auto *Ext =
".a";
1928 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
1929 Twine(Lib +
"-" + Arch).str()}) {
1930 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
1931 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
1942 bool FoundSDL =
false;
1943 for (
auto LPath : LibraryPaths) {
1944 for (
auto SDL : SDLs) {
1945 auto FullName = Twine(LPath + SDL).str();
1946 if (llvm::sys::fs::exists(FullName)) {
1948 CC1Args.push_back(
"-mlink-builtin-bitcode");
1949 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
1966 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
1968 StringRef Lib, StringRef Arch, StringRef Target,
bool isBitCodeSDL,
1969 bool postClangLink) {
1972 if (isBitCodeSDL && Arch.contains(
"nvptx"))
1975 bool FoundAOB =
false;
1979 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
1980 auto Ext = IsMSVC ?
".lib" :
".a";
1981 if (!Lib.startswith(
":") && !Lib.startswith(
"-l")) {
1982 if (llvm::sys::fs::exists(Lib)) {
1983 ArchiveOfBundles = Lib;
1987 if (Lib.startswith(
"-l"))
1988 Lib = Lib.drop_front(2);
1989 for (
auto LPath : LibraryPaths) {
1990 ArchiveOfBundles.clear();
1993 (Lib.startswith(
":") ? Lib.drop_front()
1994 : IsMSVC ? Lib + Ext :
"lib" + Lib + Ext)
1996 for (
auto Prefix : {
"/libdevice/",
"/"}) {
1997 auto AOB = Twine(LPath + Prefix + LibFile).str();
1998 if (llvm::sys::fs::exists(AOB)) {
1999 ArchiveOfBundles = AOB;
2012 llvm::file_magic Magic;
2013 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2014 if (EC || Magic != llvm::file_magic::archive)
2017 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2024 C.addTempFile(C.getArgs().MakeArgString(OutputLib));
2026 ArgStringList CmdArgs;
2029 DeviceTriple +=
'-';
2031 DeviceTriple += NormalizedTriple;
2033 DeviceTriple +=
'-';
2039 std::string InputArg(
"-input=" + ArchiveOfBundles);
2043 const char *UBProgram = DriverArgs.MakeArgString(
2046 ArgStringList UBArgs;
2047 UBArgs.push_back(C.getArgs().MakeArgString(UnbundleArg));
2048 UBArgs.push_back(C.getArgs().MakeArgString(TypeArg));
2049 UBArgs.push_back(C.getArgs().MakeArgString(InputArg));
2050 UBArgs.push_back(C.getArgs().MakeArgString(OffloadArg));
2051 UBArgs.push_back(C.getArgs().MakeArgString(OutputArg));
2055 std::string AdditionalArgs(
"-allow-missing-bundles");
2056 UBArgs.push_back(C.getArgs().MakeArgString(AdditionalArgs));
2061 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2062 UBArgs.push_back(C.getArgs().MakeArgString(HipCompatibleArgs));
2064 C.addCommand(std::make_unique<Command>(
2066 InputInfo(&JA, C.getArgs().MakeArgString(OutputLib))));
2068 CC1Args.push_back(
"-mlink-builtin-bitcode");
2070 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2079 const llvm::opt::ArgList &DriverArgs,
2080 llvm::opt::ArgStringList &CC1Args,
2081 StringRef Arch, StringRef Target,
2082 bool isBitCodeSDL,
bool postClangLink) {
2084 Arch,
Target, isBitCodeSDL, postClangLink);
2113 const llvm::opt::ArgList &DriverArgs,
2114 llvm::opt::ArgStringList &CC1Args,
2115 StringRef Arch, StringRef Target,
2116 bool isBitCodeSDL,
bool postClangLink) {
2120 std::optional<std::string> LibPath =
2121 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2124 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2125 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2126 for (StringRef Path : Frags)
2127 LibraryPaths.emplace_back(Path.trim());
2131 for (
std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2132 LibraryPaths.emplace_back(Search_Dir);
2136 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2137 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2140 llvm::SmallSet<std::string, 16> SDLNames;
2141 static const StringRef HostOnlyArchives[] = {
2142 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2143 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2144 if (!HostOnlyArchives->contains(SDLName)) {
2149 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2150 auto FileName = StringRef(Input);
2156 const StringRef LibFileExt =
".lib";
2157 if (!llvm::sys::path::has_extension(FileName) ||
2159 llvm::sys::path::extension(FileName).drop_front()) ==
2161 llvm::sys::path::extension(FileName) == LibFileExt)
2162 SDLNames.insert(Input);
2169 for (
auto SDLName : SDLNames) {
2171 if (!
SDLSearch(D, DriverArgs, CC1Args, LibraryPaths, SDLName, Arch,
Target,
2172 isBitCodeSDL, postClangLink)) {
2174 LibraryPaths, SDLName, Arch,
Target,
2175 isBitCodeSDL, postClangLink);
2180 static llvm::opt::Arg *
2184 return Args.getLastArg(options::OPT_mcode_object_v3_legacy,
2185 options::OPT_mno_code_object_v3_legacy,
2186 options::OPT_mcode_object_version_EQ);
2190 const llvm::opt::ArgList &Args) {
2191 const unsigned MinCodeObjVer = 2;
2192 const unsigned MaxCodeObjVer = 5;
2195 if (Args.hasArg(options::OPT_mno_code_object_v3_legacy))
2196 D.
Diag(diag::warn_drv_deprecated_arg) <<
"-mno-code-object-v3"
2197 <<
"-mcode-object-version=2";
2199 if (Args.hasArg(options::OPT_mcode_object_v3_legacy))
2200 D.
Diag(diag::warn_drv_deprecated_arg) <<
"-mcode-object-v3"
2201 <<
"-mcode-object-version=3";
2204 if (CodeObjArg->getOption().getID() ==
2205 options::OPT_mcode_object_version_EQ) {
2206 unsigned CodeObjVer = MaxCodeObjVer;
2208 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2209 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2210 D.
Diag(diag::err_drv_invalid_int_value)
2211 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2217 const llvm::opt::ArgList &Args) {
2218 unsigned CodeObjVer = 4;
2220 if (CodeObjArg->getOption().getID() ==
2221 options::OPT_mno_code_object_v3_legacy) {
2223 }
else if (CodeObjArg->getOption().getID() ==
2224 options::OPT_mcode_object_v3_legacy) {
2227 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2234 const Driver &D,
const llvm::opt::ArgList &Args) {
2239 const llvm::opt::ArgList &Args,
2240 llvm::opt::ArgStringList &CmdArgs,
2241 const llvm::Triple &Triple,
bool IsLTO,
2242 const StringRef PluginOptPrefix) {
2243 auto addArg = [&, IsLTO](
const Twine &Arg) {
2245 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2246 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2248 CmdArgs.push_back(
"-mllvm");
2249 CmdArgs.push_back(Args.MakeArgString(Arg));
2253 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2254 options::OPT_mno_outline)) {
2255 if (A->getOption().matches(options::OPT_moutline)) {
2259 if (!(Triple.isARM() || Triple.isThumb() ||
2260 Triple.getArch() == llvm::Triple::aarch64 ||
2261 Triple.getArch() == llvm::Triple::aarch64_32)) {
2262 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2264 addArg(Twine(
"-enable-machine-outliner"));
2268 addArg(Twine(
"-enable-machine-outliner=never"));
2274 const llvm::opt::ArgList &DriverArgs,
2275 llvm::opt::ArgStringList &CC1Args,
2276 StringRef BitcodeSuffix,
2277 const llvm::Triple &Triple) {
2282 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2283 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2286 std::optional<std::string> LibPath =
2287 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2290 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2291 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2292 for (StringRef Path : Frags)
2293 LibraryPaths.emplace_back(Path.trim());
2296 OptSpecifier LibomptargetBCPathOpt =
2297 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2298 : options::OPT_libomptarget_nvptx_bc_path_EQ;
2300 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu" :
"nvptx";
2302 (
"libomptarget-" + ArchPrefix +
"-" + BitcodeSuffix +
".bc").str();
2305 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2307 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2308 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2309 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2312 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2313 CC1Args.push_back(
"-mlink-builtin-bitcode");
2314 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2316 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2317 << LibOmpTargetFile;
2320 bool FoundBCLibrary =
false;
2322 for (StringRef LibraryPath : LibraryPaths) {
2324 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2325 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2326 CC1Args.push_back(
"-mlink-builtin-bitcode");
2327 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2328 FoundBCLibrary =
true;
2333 if (!FoundBCLibrary)
2334 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2335 << LibOmpTargetName << ArchPrefix;
2339 const llvm::opt::ArgList &Args,
2340 llvm::opt::ArgStringList &CmdArgs) {
2341 if (Args.hasArg(options::OPT_hip_link) &&
2342 !Args.hasArg(options::OPT_nostdlib) &&
2343 !Args.hasArg(options::OPT_no_hip_rt)) {
2347 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {