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/Path.h"
58#include "llvm/Support/Process.h"
59#include "llvm/Support/Program.h"
60#include "llvm/Support/ScopedPrinter.h"
61#include "llvm/Support/Threading.h"
62#include "llvm/Support/VirtualFileSystem.h"
63#include "llvm/Support/YAMLParser.h"
64#include "llvm/TargetParser/Host.h"
65#include "llvm/TargetParser/TargetParser.h"
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 StringRef Processor) {
140 auto GPUKind = T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
141 : llvm::AMDGPU::parseArchR600(Processor);
142 auto GPUFeatures = T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
143 : llvm::AMDGPU::getArchAttrR600(GPUKind);
144 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
146 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
151 if (D.
getVFS().exists(Path))
152 Paths.push_back(Path.str());
156 const llvm::Triple &Triple,
158 std::vector<StringRef> &Features,
159 OptSpecifier Group) {
160 std::set<StringRef> Warned;
161 for (
const Arg *A : Args.filtered(Group)) {
162 StringRef Name = A->getOption().getName();
166 assert(Name.startswith(
"m") &&
"Invalid feature name.");
167 Name = Name.substr(1);
171 if (Warned.count(Name) == 0) {
173 clang::diag::warn_drv_unsupported_option_for_processor)
174 << A->getAsString(Args) << Proc;
180 bool IsNegative = Name.startswith(
"no-");
182 Name = Name.substr(3);
184 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
193 for (StringRef Feature : llvm::reverse(Features)) {
194 if (UsedFeatures.insert(Feature.drop_front()).second)
195 UnifiedFeatures.insert(UnifiedFeatures.begin(), Feature);
198 return UnifiedFeatures;
202 const char *ArgName,
const char *EnvVar) {
203 const char *DirList = ::getenv(EnvVar);
204 bool CombinedArg =
false;
209 StringRef Name(ArgName);
210 if (Name.equals(
"-I") || Name.equals(
"-L") || Name.empty())
213 StringRef Dirs(DirList);
217 StringRef::size_type Delim;
218 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
221 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
223 CmdArgs.push_back(ArgName);
224 CmdArgs.push_back(
".");
229 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
231 CmdArgs.push_back(ArgName);
232 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
235 Dirs = Dirs.substr(Delim + 1);
240 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
242 CmdArgs.push_back(ArgName);
243 CmdArgs.push_back(
".");
247 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
249 CmdArgs.push_back(ArgName);
250 CmdArgs.push_back(Args.MakeArgString(Dirs));
256 const ArgList &Args, ArgStringList &CmdArgs,
262 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
269 Args.AddAllArgs(CmdArgs, options::OPT_L);
271 for (
const auto &II : Inputs) {
275 if (
auto *IA = II.getAction())
285 if (II.isFilename()) {
286 CmdArgs.push_back(II.getFilename());
295 const Arg &A = II.getInputArg();
298 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
300 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
303 A.renderAsInput(Args, CmdArgs);
308 const ToolChain &TC,
const llvm::opt::ArgList &Args,
309 llvm::opt::ArgStringList &CmdArgs) {
315 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
316 StringRef
V = A->getValue();
317 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
318 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
320 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
321 << A->getSpelling() <<
V;
326 std::vector<StringRef> &Features,
327 OptSpecifier OnOpt, OptSpecifier OffOpt,
328 StringRef FeatureName) {
329 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
330 if (A->getOption().matches(OnOpt))
331 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
333 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
339 const ArgList &Args) {
340 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
341 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
343 return llvm::StringSwitch<std::string>(GPUName)
344 .Cases(
"rv630",
"rv635",
"r600")
345 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
346 .Case(
"rv740",
"rv770")
347 .Case(
"palm",
"cedar")
348 .Cases(
"sumo",
"sumo2",
"sumo")
349 .Case(
"hemlock",
"cypress")
350 .Case(
"aruba",
"cayman")
351 .Default(GPUName.str());
359 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
360 return A->getValue();
368 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
369 StringRef CPU = A->getValue();
375 return llvm::sys::getHostCPUName();
385 const llvm::Triple &T,
bool FromAs) {
388 switch (T.getArch()) {
392 case llvm::Triple::aarch64:
393 case llvm::Triple::aarch64_32:
394 case llvm::Triple::aarch64_be:
397 case llvm::Triple::arm:
398 case llvm::Triple::armeb:
399 case llvm::Triple::thumb:
400 case llvm::Triple::thumbeb: {
401 StringRef MArch, MCPU;
406 case llvm::Triple::avr:
407 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
408 return A->getValue();
411 case llvm::Triple::m68k:
414 case llvm::Triple::mips:
415 case llvm::Triple::mipsel:
416 case llvm::Triple::mips64:
417 case llvm::Triple::mips64el: {
421 return std::string(CPUName);
424 case llvm::Triple::nvptx:
425 case llvm::Triple::nvptx64:
426 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
427 return A->getValue();
430 case llvm::Triple::ppc:
431 case llvm::Triple::ppcle:
432 case llvm::Triple::ppc64:
433 case llvm::Triple::ppc64le:
436 case llvm::Triple::csky:
437 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
438 return A->getValue();
439 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
440 return A->getValue();
443 case llvm::Triple::riscv32:
444 case llvm::Triple::riscv64:
447 case llvm::Triple::bpfel:
448 case llvm::Triple::bpfeb:
449 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
450 return A->getValue();
453 case llvm::Triple::sparc:
454 case llvm::Triple::sparcel:
455 case llvm::Triple::sparcv9:
458 case llvm::Triple::x86:
459 case llvm::Triple::x86_64:
462 case llvm::Triple::hexagon:
466 case llvm::Triple::lanai:
469 case llvm::Triple::systemz:
472 case llvm::Triple::r600:
473 case llvm::Triple::amdgcn:
476 case llvm::Triple::wasm32:
477 case llvm::Triple::wasm64:
483 const llvm::Triple &Triple,
485 std::vector<StringRef> &Features) {
487 options::OPT_m_wasm_Features_Group);
491 const ArgList &Args, ArgStringList &CmdArgs,
492 bool ForAS,
bool IsAux) {
493 std::vector<StringRef> Features;
494 switch (Triple.getArch()) {
497 case llvm::Triple::mips:
498 case llvm::Triple::mipsel:
499 case llvm::Triple::mips64:
500 case llvm::Triple::mips64el:
503 case llvm::Triple::arm:
504 case llvm::Triple::armeb:
505 case llvm::Triple::thumb:
506 case llvm::Triple::thumbeb:
509 case llvm::Triple::ppc:
510 case llvm::Triple::ppcle:
511 case llvm::Triple::ppc64:
512 case llvm::Triple::ppc64le:
515 case llvm::Triple::riscv32:
516 case llvm::Triple::riscv64:
519 case llvm::Triple::systemz:
522 case llvm::Triple::aarch64:
523 case llvm::Triple::aarch64_32:
524 case llvm::Triple::aarch64_be:
527 case llvm::Triple::x86:
528 case llvm::Triple::x86_64:
531 case llvm::Triple::hexagon:
534 case llvm::Triple::wasm32:
535 case llvm::Triple::wasm64:
538 case llvm::Triple::sparc:
539 case llvm::Triple::sparcel:
540 case llvm::Triple::sparcv9:
543 case llvm::Triple::r600:
544 case llvm::Triple::amdgcn:
547 case llvm::Triple::nvptx:
548 case llvm::Triple::nvptx64:
551 case llvm::Triple::m68k:
554 case llvm::Triple::msp430:
557 case llvm::Triple::ve:
560 case llvm::Triple::csky:
563 case llvm::Triple::loongarch32:
564 case llvm::Triple::loongarch64:
570 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
571 CmdArgs.push_back(Feature.data());
576 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
579 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
580 D.
Diag(diag::err_drv_invalid_int_value)
581 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
582 return LtoJobsArg->getValue();
587 return Triple.getOS() == llvm::Triple::CloudABI || Triple.isPS();
591 ArgStringList &CmdArgs,
const InputInfo &Output,
592 const InputInfo &Input,
bool IsThinLTO) {
597 if (llvm::sys::path::filename(Linker) !=
"ld.lld" &&
598 llvm::sys::path::stem(Linker) !=
"ld.lld") {
602 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
603 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
606 CmdArgs.push_back(
"-plugin");
609 const char *Suffix =
".dll";
610#elif defined(__APPLE__)
611 const char *Suffix =
".dylib";
613 const char *Suffix =
".so";
617 llvm::sys::path::native(Twine(D.
Dir) +
618 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
621 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
624 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
625 const char *ExtraDash = IsOSAIX ?
"-" :
"";
630 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
631 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
632 "-generate-arange-section"));
642 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
644 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
648 if (A->getOption().matches(options::OPT_O4) ||
649 A->getOption().matches(options::OPT_Ofast))
651 else if (A->getOption().matches(options::OPT_O)) {
652 OOpt = A->getValue();
655 else if (OOpt ==
"s" || OOpt ==
"z")
657 }
else if (A->getOption().matches(options::OPT_O0))
661 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"O" + OOpt));
663 CmdArgs.push_back(Args.MakeArgString(Twine(
"--lto-CGO") + OOpt));
667 if (Args.hasArg(options::OPT_gsplit_dwarf))
668 CmdArgs.push_back(Args.MakeArgString(
669 Twine(PluginOptPrefix) +
"dwo_dir=" + Output.
getFilename() +
"_dwo"));
672 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
675 if (!Parallelism.empty())
677 Args.MakeArgString(Twine(PluginOptPrefix) +
"jobs=" + Parallelism));
681 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
682 if (A->getOption().matches(options::OPT_glldb))
684 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
685 else if (A->getOption().matches(options::OPT_gsce))
687 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
688 else if (A->getOption().matches(options::OPT_gdbx))
690 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
693 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
699 Arg *A = Args.getLastArg(options::OPT_g_Group);
700 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
701 !A->getOption().matches(options::OPT_ggdb0);
702 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
703 options::OPT_gno_strict_dwarf,
true))
705 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
707 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
708 StringRef
V = A->getValue();
709 if (
V ==
"vec-default")
711 if (
V ==
"vec-extabi") {
713 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
719 bool UseSeparateSections =
722 if (Args.hasFlag(options::OPT_ffunction_sections,
723 options::OPT_fno_function_sections, UseSeparateSections))
725 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
726 else if (Args.hasArg(options::OPT_fno_function_sections))
728 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
730 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
731 UseSeparateSections))
733 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
734 else if (Args.hasArg(options::OPT_fno_data_sections))
736 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
738 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
739 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
740 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
741 options::OPT_mno_xcoff_roptr,
false);
742 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
745 D.
Diag(diag::err_drv_unsupported_opt_for_target)
749 if (!Args.hasFlag(options::OPT_fdata_sections,
750 options::OPT_fno_data_sections, UseSeparateSections))
751 D.
Diag(diag::err_roptr_requires_data_sections);
754 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
759 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
760 options::OPT_fno_split_machine_functions)) {
761 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
762 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
763 "-split-machine-functions"));
767 StringRef FName = A->getValue();
768 if (!llvm::sys::fs::exists(FName))
769 D.
Diag(diag::err_drv_no_such_file) << FName;
771 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
772 "sample-profile=" + FName));
776 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
777 "cs-profile-generate"));
778 if (CSPGOGenerateArg->getOption().matches(
779 options::OPT_fcs_profile_generate_EQ)) {
781 llvm::sys::path::append(Path,
"default_%m.profraw");
782 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
783 "cs-profile-path=" + Path));
786 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
787 "cs-profile-path=default_%m.profraw"));
790 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
791 if (Path.empty() || llvm::sys::fs::is_directory(Path))
792 llvm::sys::path::append(Path,
"default.profdata");
793 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
794 "cs-profile-path=" + Path));
798 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
800 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
801 "-enable-jmc-instrument"));
803 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
806 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
809 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
812 if (Args.hasFlag(options::OPT_fstack_size_section,
813 options::OPT_fno_stack_size_section,
false))
815 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
819 if (!StatsFile.empty())
821 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
824 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
825 CmdArgs.push_back(Args.MakeArgString(
826 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
837 Output, PluginOptPrefix);
843 true, PluginOptPrefix);
848 ArgStringList &CmdArgs) {
853 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
854 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
858 ArgStringList &CmdArgs) {
861 bool DefaultValue = IsVE;
862 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
863 options::OPT_fno_rtlib_add_rpath, DefaultValue))
867 if (TC.
getVFS().exists(CandidateRPath)) {
868 CmdArgs.push_back(
"-rpath");
869 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
875 const ArgList &Args,
bool ForceStaticHostRuntime,
876 bool IsOffloadingHost,
bool GompNeedsRT) {
877 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
878 options::OPT_fno_openmp,
false))
887 if (ForceStaticHostRuntime)
888 CmdArgs.push_back(
"-Bstatic");
892 CmdArgs.push_back(
"-lomp");
895 CmdArgs.push_back(
"-lgomp");
898 CmdArgs.push_back(
"-liomp5");
904 if (ForceStaticHostRuntime)
905 CmdArgs.push_back(
"-Bdynamic");
908 CmdArgs.push_back(
"-lrt");
910 if (IsOffloadingHost)
911 CmdArgs.push_back(
"-lomptarget");
913 if (IsOffloadingHost && !Args.hasArg(options::OPT_nogpulib))
914 CmdArgs.push_back(
"-lomptarget.devicertl");
923 llvm::opt::ArgStringList &CmdArgs) {
924 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
925 CmdArgs.push_back(
"Fortran_main.lib");
926 CmdArgs.push_back(
"FortranRuntime.lib");
927 CmdArgs.push_back(
"FortranDecimal.lib");
929 CmdArgs.push_back(
"-lFortran_main");
930 CmdArgs.push_back(
"-lFortranRuntime");
931 CmdArgs.push_back(
"-lFortranDecimal");
936 const llvm::opt::ArgList &Args,
937 ArgStringList &CmdArgs) {
941 if (!Args.hasArg(options::OPT_flang_experimental_exec))
950 llvm::sys::path::append(DefaultLibPath,
"lib");
951 if (TC.
getTriple().isKnownWindowsMSVCEnvironment())
952 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + DefaultLibPath));
954 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
958 ArgStringList &CmdArgs, StringRef Sanitizer,
959 bool IsShared,
bool IsWhole) {
962 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
965 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
975 ArgStringList &CmdArgs,
976 StringRef Sanitizer) {
979 if (TC.
getTriple().getOS() == llvm::Triple::Solaris)
982 if (llvm::sys::fs::exists(SanRT +
".syms")) {
983 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
991 "AIX linker does not support any form of --as-needed option yet.");
997 return as_needed ?
"-zignore" :
"-zrecord";
999 return as_needed ?
"--as-needed" :
"--no-as-needed";
1003 ArgStringList &CmdArgs) {
1008 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1010 CmdArgs.push_back(
"-lpthread");
1012 CmdArgs.push_back(
"-lrt");
1014 CmdArgs.push_back(
"-lm");
1018 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1019 CmdArgs.push_back(
"-ldl");
1024 CmdArgs.push_back(
"-lexecinfo");
1030 CmdArgs.push_back(
"-lresolv");
1044 SharedRuntimes.push_back(
"asan");
1045 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1046 HelperStaticRuntimes.push_back(
"asan-preinit");
1049 SharedRuntimes.push_back(
"memprof");
1050 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1051 HelperStaticRuntimes.push_back(
"memprof-preinit");
1055 SharedRuntimes.push_back(
"ubsan_minimal");
1057 SharedRuntimes.push_back(
"ubsan_standalone");
1060 SharedRuntimes.push_back(
"scudo_standalone");
1063 SharedRuntimes.push_back(
"tsan");
1066 SharedRuntimes.push_back(
"hwasan_aliases");
1068 SharedRuntimes.push_back(
"hwasan");
1069 if (!Args.hasArg(options::OPT_shared))
1070 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1076 StaticRuntimes.push_back(
"stats_client");
1080 HelperStaticRuntimes.push_back(
"asan_static");
1083 if (Args.hasArg(options::OPT_shared)) {
1092 StaticRuntimes.push_back(
"asan");
1094 StaticRuntimes.push_back(
"asan_cxx");
1099 StaticRuntimes.push_back(
"memprof");
1101 StaticRuntimes.push_back(
"memprof_cxx");
1106 StaticRuntimes.push_back(
"hwasan_aliases");
1108 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1110 StaticRuntimes.push_back(
"hwasan");
1112 StaticRuntimes.push_back(
"hwasan_cxx");
1116 StaticRuntimes.push_back(
"dfsan");
1118 StaticRuntimes.push_back(
"lsan");
1120 StaticRuntimes.push_back(
"msan");
1122 StaticRuntimes.push_back(
"msan_cxx");
1126 StaticRuntimes.push_back(
"tsan");
1128 StaticRuntimes.push_back(
"tsan_cxx");
1132 StaticRuntimes.push_back(
"ubsan_minimal");
1134 StaticRuntimes.push_back(
"ubsan_standalone");
1136 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1140 NonWholeStaticRuntimes.push_back(
"safestack");
1141 RequiredSymbols.push_back(
"__safestack_init");
1145 StaticRuntimes.push_back(
"cfi");
1147 StaticRuntimes.push_back(
"cfi_diag");
1149 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1153 NonWholeStaticRuntimes.push_back(
"stats");
1154 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1157 StaticRuntimes.push_back(
"scudo_standalone");
1159 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1166 ArgStringList &CmdArgs) {
1168 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1170 NonWholeStaticRuntimes, HelperStaticRuntimes,
1176 !Args.hasArg(options::OPT_shared)) {
1182 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
1183 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1184 !Args.hasArg(options::OPT_static);
1185 if (OnlyLibstdcxxStatic)
1186 CmdArgs.push_back(
"-Bstatic");
1188 if (OnlyLibstdcxxStatic)
1189 CmdArgs.push_back(
"-Bdynamic");
1193 for (
auto RT : SharedRuntimes)
1195 for (
auto RT : HelperStaticRuntimes)
1197 bool AddExportDynamic =
false;
1198 for (
auto RT : StaticRuntimes) {
1202 for (
auto RT : NonWholeStaticRuntimes) {
1206 for (
auto S : RequiredSymbols) {
1207 CmdArgs.push_back(
"-u");
1208 CmdArgs.push_back(Args.MakeArgString(S));
1212 if (AddExportDynamic)
1213 CmdArgs.push_back(
"--export-dynamic");
1216 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1220 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1221 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1224 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1226 CmdArgs.push_back(
"--android-memtag-heap");
1228 CmdArgs.push_back(
"--android-memtag-stack");
1231 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1235 if (Args.hasArg(options::OPT_shared))
1239 CmdArgs.push_back(
"-whole-archive");
1243 CmdArgs.push_back(
"-no-whole-archive");
1252 CmdArgs.push_back(
"-lpthread");
1254 CmdArgs.push_back(
"-lrt");
1255 CmdArgs.push_back(
"-lm");
1260 CmdArgs.push_back(
"-ldl");
1265 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1266 return !A->getOption().matches(options::OPT_O0);
1274 auto AddPostfix = [JA](
auto &F) {
1279 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1280 if (StringRef(A->getValue()) ==
"single")
1284 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1287 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
1288 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1289 T = FinalOutput->getValue();
1290 llvm::sys::path::remove_filename(T);
1291 llvm::sys::path::append(T,
1292 llvm::sys::path::stem(FinalOutput->getValue()));
1294 return Args.MakeArgString(T);
1300 return Args.MakeArgString(T);
1304 const JobAction &JA,
const ArgList &Args,
1305 const InputInfo &Output,
const char *OutFile) {
1306 ArgStringList ExtractArgs;
1307 ExtractArgs.push_back(
"--extract-dwo");
1309 ArgStringList StripArgs;
1310 StripArgs.push_back(
"--strip-dwo");
1315 ExtractArgs.push_back(OutFile);
1322 C.addCommand(std::make_unique<Command>(JA, T,
1324 Exec, ExtractArgs, II, Output));
1327 C.addCommand(std::make_unique<Command>(
1337 Args.ClaimAllArgs(options::OPT_flto_EQ);
1338 Args.ClaimAllArgs(options::OPT_flto);
1339 Args.ClaimAllArgs(options::OPT_fno_lto);
1343 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1344 options::OPT_fcs_profile_generate_EQ,
1345 options::OPT_fno_profile_generate);
1346 if (CSPGOGenerateArg &&
1347 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1348 CSPGOGenerateArg =
nullptr;
1350 return CSPGOGenerateArg;
1354 auto *ProfileUseArg = Args.getLastArg(
1355 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1356 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1357 options::OPT_fno_profile_instr_use);
1359 if (ProfileUseArg &&
1360 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1361 ProfileUseArg =
nullptr;
1363 return ProfileUseArg;
1367 auto *ProfileSampleUseArg = Args.getLastArg(
1368 options::OPT_fprofile_sample_use, options::OPT_fprofile_sample_use_EQ,
1369 options::OPT_fauto_profile, options::OPT_fauto_profile_EQ,
1370 options::OPT_fno_profile_sample_use, options::OPT_fno_auto_profile);
1372 if (ProfileSampleUseArg &&
1373 (ProfileSampleUseArg->getOption().matches(
1374 options::OPT_fno_profile_sample_use) ||
1375 ProfileSampleUseArg->getOption().matches(options::OPT_fno_auto_profile)))
1378 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ,
1379 options::OPT_fauto_profile_EQ);
1384 case llvm::Reloc::Static:
1386 case llvm::Reloc::PIC_:
1388 case llvm::Reloc::DynamicNoPIC:
1389 return "dynamic-no-pic";
1390 case llvm::Reloc::ROPI:
1392 case llvm::Reloc::RWPI:
1394 case llvm::Reloc::ROPI_RWPI:
1397 llvm_unreachable(
"Unknown Reloc::Model kind");
1404std::tuple<llvm::Reloc::Model, unsigned, bool>
1412 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1414 bool IsPICLevelTwo = PIC;
1417 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1420 if (Triple.isAndroid()) {
1421 switch (Triple.getArch()) {
1422 case llvm::Triple::arm:
1423 case llvm::Triple::armeb:
1424 case llvm::Triple::thumb:
1425 case llvm::Triple::thumbeb:
1426 case llvm::Triple::aarch64:
1427 case llvm::Triple::mips:
1428 case llvm::Triple::mipsel:
1429 case llvm::Triple::mips64:
1430 case llvm::Triple::mips64el:
1434 case llvm::Triple::x86:
1435 case llvm::Triple::x86_64:
1437 IsPICLevelTwo =
true;
1446 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
1450 if (Triple.isOSOpenBSD()) {
1452 case llvm::Triple::arm:
1453 case llvm::Triple::aarch64:
1454 case llvm::Triple::mips64:
1455 case llvm::Triple::mips64el:
1456 case llvm::Triple::x86:
1457 case llvm::Triple::x86_64:
1458 IsPICLevelTwo =
false;
1461 case llvm::Triple::ppc:
1462 case llvm::Triple::sparcv9:
1463 IsPICLevelTwo =
true;
1475 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1476 options::OPT_fpic, options::OPT_fno_pic,
1477 options::OPT_fPIE, options::OPT_fno_PIE,
1478 options::OPT_fpie, options::OPT_fno_pie);
1479 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
1480 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
1481 options::OPT_fPIE, options::OPT_fpie)) {
1483 << LastPICArg->getSpelling() << Triple.str();
1484 if (Triple.getArch() == llvm::Triple::x86_64)
1485 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
1486 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1493 Option O = LastPICArg->getOption();
1494 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1495 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1496 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1498 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1500 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
1503 if (EffectiveTriple.isPS()) {
1504 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
1505 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
1506 if (Model !=
"kernel") {
1509 << LastPICArg->getSpelling()
1510 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
1520 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
1526 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
1527 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
1530 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1533 if (!Triple.isOSDarwin())
1535 << A->getSpelling() << Triple.str();
1544 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
1547 bool EmbeddedPISupported;
1548 switch (Triple.getArch()) {
1549 case llvm::Triple::arm:
1550 case llvm::Triple::armeb:
1551 case llvm::Triple::thumb:
1552 case llvm::Triple::thumbeb:
1553 EmbeddedPISupported =
true;
1556 EmbeddedPISupported =
false;
1560 bool ROPI =
false, RWPI =
false;
1561 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
1562 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
1563 if (!EmbeddedPISupported)
1565 << LastROPIArg->getSpelling() << Triple.str();
1568 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
1569 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
1570 if (!EmbeddedPISupported)
1572 << LastRWPIArg->getSpelling() << Triple.str();
1577 if ((ROPI || RWPI) && (PIC || PIE))
1580 if (Triple.isMIPS()) {
1587 if (ABIName ==
"n64")
1590 if(Args.hasArg(options::OPT_mno_abicalls))
1591 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1594 IsPICLevelTwo =
false;
1598 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
1600 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
1602 RelocM = llvm::Reloc::ROPI_RWPI;
1604 RelocM = llvm::Reloc::ROPI;
1606 RelocM = llvm::Reloc::RWPI;
1608 return std::make_tuple(RelocM, 0
U,
false);
1628 const ArgList &Args) {
1629 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
1630 options::OPT_falign_functions_EQ,
1631 options::OPT_fno_align_functions);
1632 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
1635 if (A->getOption().matches(options::OPT_falign_functions))
1639 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
1641 << A->getAsString(Args) << A->getValue();
1646 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
1647 switch (DebugInfoKind) {
1648 case llvm::codegenoptions::DebugDirectivesOnly:
1649 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
1651 case llvm::codegenoptions::DebugLineTablesOnly:
1652 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
1654 case llvm::codegenoptions::DebugInfoConstructor:
1655 CmdArgs.push_back(
"-debug-info-kind=constructor");
1657 case llvm::codegenoptions::LimitedDebugInfo:
1658 CmdArgs.push_back(
"-debug-info-kind=limited");
1660 case llvm::codegenoptions::FullDebugInfo:
1661 CmdArgs.push_back(
"-debug-info-kind=standalone");
1663 case llvm::codegenoptions::UnusedTypeInfo:
1664 CmdArgs.push_back(
"-debug-info-kind=unused-types");
1674 assert(A.getOption().matches(options::OPT_gN_Group) &&
1675 "Not a -g option that specifies a debug-info level");
1676 if (A.getOption().matches(options::OPT_g0) ||
1677 A.getOption().matches(options::OPT_ggdb0))
1678 return llvm::codegenoptions::NoDebugInfo;
1679 if (A.getOption().matches(options::OPT_gline_tables_only) ||
1680 A.getOption().matches(options::OPT_ggdb1))
1681 return llvm::codegenoptions::DebugLineTablesOnly;
1682 if (A.getOption().matches(options::OPT_gline_directives_only))
1683 return llvm::codegenoptions::DebugDirectivesOnly;
1684 return llvm::codegenoptions::DebugInfoConstructor;
1688 const ArgList &Args) {
1689 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
1695 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 5 ||
1698 << A->getAsString(Args) << A->getValue();
1703 return llvm::StringSwitch<unsigned>(ArgValue)
1704 .Case(
"-gdwarf-2", 2)
1705 .Case(
"-gdwarf-3", 3)
1706 .Case(
"-gdwarf-4", 4)
1707 .Case(
"-gdwarf-5", 5)
1712 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
1713 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
1714 options::OPT_gdwarf);
1718 const llvm::opt::ArgList &Args) {
1723 if (DwarfVersion == 0) {
1725 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
1727 return DwarfVersion;
1731 ArgStringList &CmdArgs) {
1732 llvm::Reloc::Model RelocationModel;
1737 if (RelocationModel != llvm::Reloc::Static)
1738 CmdArgs.push_back(
"-KPIC");
1744 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
1750 const ArgList &Args) {
1751 if (Args.hasArg(options::OPT_static_libgcc) ||
1752 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
1756 if (Args.hasArg(options::OPT_shared_libgcc))
1775 ArgStringList &CmdArgs,
const ArgList &Args) {
1779 CmdArgs.push_back(
"-l:libunwind.a");
1802 CmdArgs.push_back(
"-lgcc_eh");
1804 CmdArgs.push_back(
"-lgcc_s");
1812 CmdArgs.push_back(
"-lunwind");
1814 CmdArgs.push_back(
"-l:libunwind.a");
1817 CmdArgs.push_back(
"-l:libunwind.dll.a");
1819 CmdArgs.push_back(
"-l:libunwind.so");
1823 CmdArgs.push_back(
"-lunwind");
1833 ArgStringList &CmdArgs,
const ArgList &Args) {
1837 CmdArgs.push_back(
"-lgcc");
1841 CmdArgs.push_back(
"-lgcc");
1845 ArgStringList &CmdArgs,
const ArgList &Args) {
1856 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1859 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
1860 if (A && A->getValue() != StringRef(
"platform")) {
1861 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
1862 << A->getValue() <<
"MSVC";
1872 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
1873 !Args.hasArg(options::OPT_static_pie))
1874 CmdArgs.push_back(
"-ldl");
1881 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
1887 StringRef SaveStats = A->getValue();
1888 if (SaveStats ==
"obj" && Output.
isFilename()) {
1890 llvm::sys::path::remove_filename(StatsFile);
1891 }
else if (SaveStats !=
"cwd") {
1892 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
1896 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
1897 llvm::sys::path::append(StatsFile, BaseName);
1898 llvm::sys::path::replace_extension(StatsFile,
"stats");
1910 Flags.push_back(std::string(Enabled ?
"+" :
"-") + Flag);
1914 ArgStringList &CmdArgs,
bool IsLTO,
1915 const StringRef PluginOptPrefix) {
1916 auto addArg = [&, IsLTO](
const Twine &Arg) {
1918 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
1919 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
1921 CmdArgs.push_back(
"-mllvm");
1922 CmdArgs.push_back(Args.MakeArgString(Arg));
1926 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
1927 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
1929 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
1930 StringRef
Value = A->getValue();
1932 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
1933 !llvm::isPowerOf2_64(Boundary)) {
1934 D.
Diag(diag::err_drv_invalid_argument_to_option)
1935 <<
Value << A->getOption().getName();
1937 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
1940 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
1941 std::string AlignBranch;
1942 for (StringRef T : A->getValues()) {
1943 if (T !=
"fused" && T !=
"jcc" && T !=
"jmp" && T !=
"call" &&
1944 T !=
"ret" && T !=
"indirect")
1945 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
1946 << T <<
"fused, jcc, jmp, call, ret, indirect";
1947 if (!AlignBranch.empty())
1951 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
1953 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
1954 StringRef
Value = A->getValue();
1955 unsigned PrefixSize;
1956 if (
Value.getAsInteger(10, PrefixSize)) {
1957 D.
Diag(diag::err_drv_invalid_argument_to_option)
1958 <<
Value << A->getOption().getName();
1960 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
1986 llvm::opt::ArgStringList &CC1Args,
1988 StringRef Arch, StringRef Target,
bool isBitCodeSDL,
1989 bool postClangLink) {
1992 std::string LibDeviceLoc =
"/libdevice";
1993 std::string LibBcPrefix =
"/libbc-";
1994 std::string LibPrefix =
"/lib";
2011 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2012 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2014 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2015 Twine(Lib +
"-" + Arch).str(), Twine(Lib).str()}) {
2016 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2017 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2027 const auto *Ext =
".a";
2029 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2030 Twine(Lib +
"-" + Arch).str()}) {
2031 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2032 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2043 bool FoundSDL =
false;
2044 for (
auto LPath : LibraryPaths) {
2045 for (
auto SDL : SDLs) {
2046 auto FullName = Twine(LPath + SDL).str();
2047 if (llvm::sys::fs::exists(FullName)) {
2049 CC1Args.push_back(
"-mlink-builtin-bitcode");
2050 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2067 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2069 StringRef Lib, StringRef Arch, StringRef Target,
bool isBitCodeSDL,
2070 bool postClangLink) {
2073 if (isBitCodeSDL && Arch.contains(
"nvptx"))
2076 bool FoundAOB =
false;
2077 std::string ArchiveOfBundles;
2080 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2081 auto Ext = IsMSVC ?
".lib" :
".a";
2082 if (!Lib.startswith(
":") && !Lib.startswith(
"-l")) {
2083 if (llvm::sys::fs::exists(Lib)) {
2084 ArchiveOfBundles = Lib;
2088 if (Lib.startswith(
"-l"))
2089 Lib = Lib.drop_front(2);
2090 for (
auto LPath : LibraryPaths) {
2091 ArchiveOfBundles.clear();
2094 (Lib.startswith(
":") ? Lib.drop_front()
2095 : IsMSVC ? Lib + Ext :
"lib" + Lib + Ext)
2097 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2098 auto AOB = Twine(LPath + Prefix + LibFile).str();
2099 if (llvm::sys::fs::exists(AOB)) {
2100 ArchiveOfBundles = AOB;
2113 llvm::file_magic Magic;
2114 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2115 if (EC || Magic != llvm::file_magic::archive)
2118 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2119 std::string OutputLib =
2125 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2127 ArgStringList CmdArgs;
2130 DeviceTriple +=
'-';
2132 DeviceTriple += NormalizedTriple;
2134 DeviceTriple +=
'-';
2138 std::string UnbundleArg(
"-unbundle");
2139 std::string TypeArg(
"-type=a");
2140 std::string InputArg(
"-input=" + ArchiveOfBundles);
2141 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2142 std::string OutputArg(
"-output=" + OutputLib);
2144 const char *UBProgram = DriverArgs.MakeArgString(
2147 ArgStringList UBArgs;
2148 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2149 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2150 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2151 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2152 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2156 std::string AdditionalArgs(
"-allow-missing-bundles");
2157 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2162 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2163 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2165 C.addCommand(std::make_unique<Command>(
2167 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2169 CC1Args.push_back(
"-mlink-builtin-bitcode");
2171 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2180 const llvm::opt::ArgList &DriverArgs,
2181 llvm::opt::ArgStringList &CC1Args,
2182 StringRef Arch, StringRef Target,
2183 bool isBitCodeSDL,
bool postClangLink) {
2185 Arch,
Target, isBitCodeSDL, postClangLink);
2214 const llvm::opt::ArgList &DriverArgs,
2215 llvm::opt::ArgStringList &CC1Args,
2216 StringRef Arch, StringRef Target,
2217 bool isBitCodeSDL,
bool postClangLink) {
2221 std::optional<std::string> LibPath =
2222 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2225 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2226 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2227 for (StringRef Path : Frags)
2228 LibraryPaths.emplace_back(Path.trim());
2232 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2233 LibraryPaths.emplace_back(Search_Dir);
2237 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2238 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2241 llvm::SmallSet<std::string, 16> SDLNames;
2242 static const StringRef HostOnlyArchives[] = {
2243 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2244 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2245 if (!HostOnlyArchives->contains(SDLName)) {
2246 SDLNames.insert(std::string(
"-l") + SDLName);
2250 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2251 auto FileName = StringRef(Input);
2257 const StringRef LibFileExt =
".lib";
2258 if (!llvm::sys::path::has_extension(FileName) ||
2260 llvm::sys::path::extension(FileName).drop_front()) ==
2262 llvm::sys::path::extension(FileName) == LibFileExt)
2263 SDLNames.insert(Input);
2270 for (
auto SDLName : SDLNames) {
2272 if (!
SDLSearch(D, DriverArgs, CC1Args, LibraryPaths, SDLName, Arch,
Target,
2273 isBitCodeSDL, postClangLink)) {
2275 LibraryPaths, SDLName, Arch,
Target,
2276 isBitCodeSDL, postClangLink);
2281static llvm::opt::Arg *
2283 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2287 const llvm::opt::ArgList &Args) {
2288 const unsigned MinCodeObjVer = 2;
2289 const unsigned MaxCodeObjVer = 5;
2292 if (CodeObjArg->getOption().getID() ==
2293 options::OPT_mcode_object_version_EQ) {
2294 unsigned CodeObjVer = MaxCodeObjVer;
2296 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2297 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2298 D.
Diag(diag::err_drv_invalid_int_value)
2299 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2305 const llvm::opt::ArgList &Args) {
2306 unsigned CodeObjVer = 4;
2308 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2313 const Driver &D,
const llvm::opt::ArgList &Args) {
2318 const llvm::opt::ArgList &Args,
2319 llvm::opt::ArgStringList &CmdArgs,
2320 const llvm::Triple &Triple,
bool IsLTO,
2321 const StringRef PluginOptPrefix) {
2322 auto addArg = [&, IsLTO](
const Twine &Arg) {
2324 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2325 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2327 CmdArgs.push_back(
"-mllvm");
2328 CmdArgs.push_back(Args.MakeArgString(Arg));
2332 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2333 options::OPT_mno_outline)) {
2334 if (A->getOption().matches(options::OPT_moutline)) {
2338 if (!(Triple.isARM() || Triple.isThumb() ||
2339 Triple.getArch() == llvm::Triple::aarch64 ||
2340 Triple.getArch() == llvm::Triple::aarch64_32)) {
2341 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2343 addArg(Twine(
"-enable-machine-outliner"));
2347 addArg(Twine(
"-enable-machine-outliner=never"));
2353 const llvm::opt::ArgList &DriverArgs,
2354 llvm::opt::ArgStringList &CC1Args,
2355 StringRef BitcodeSuffix,
2356 const llvm::Triple &Triple) {
2361 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2362 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2365 std::optional<std::string> LibPath =
2366 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2369 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2370 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2371 for (StringRef Path : Frags)
2372 LibraryPaths.emplace_back(Path.trim());
2375 OptSpecifier LibomptargetBCPathOpt =
2376 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2377 : options::OPT_libomptarget_nvptx_bc_path_EQ;
2379 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu" :
"nvptx";
2380 std::string LibOmpTargetName =
2381 (
"libomptarget-" + ArchPrefix +
"-" + BitcodeSuffix +
".bc").str();
2384 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2386 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2387 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2388 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2391 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2392 CC1Args.push_back(
"-mlink-builtin-bitcode");
2393 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2395 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2396 << LibOmpTargetFile;
2399 bool FoundBCLibrary =
false;
2401 for (StringRef LibraryPath : LibraryPaths) {
2403 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2404 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2405 CC1Args.push_back(
"-mlink-builtin-bitcode");
2406 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2407 FoundBCLibrary =
true;
2412 if (!FoundBCLibrary)
2413 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2414 << LibOmpTargetName << ArchPrefix;
2418 const llvm::opt::ArgList &Args,
2419 llvm::opt::ArgStringList &CmdArgs) {
2420 if (Args.hasArg(options::OPT_hip_link) &&
2421 !Args.hasArg(options::OPT_nostdlib) &&
2422 !Args.hasArg(options::OPT_no_hip_rt)) {
2426 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static void getWebAssemblyTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector< StringRef > &Features)
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static llvm::opt::Arg * getAMDGPUCodeObjectArgument(const Driver &D, const llvm::opt::ArgList &Args)
static void collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static void renderRpassOptions(const ArgList &Args, ArgStringList &CmdArgs, const StringRef PluginOptPrefix)
static StringRef getWebAssemblyTargetCPU(const ArgList &Args)
Get the (LLVM) name of the WebAssembly cpu we are targeting.
static void renderRemarksHotnessOptions(const ArgList &Args, ArgStringList &CmdArgs, const StringRef PluginOptPrefix)
static std::string getLanaiTargetCPU(const ArgList &Args)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const StringRef PluginOptPrefix)
static void AddLibgcc(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static LibGccType getLibGccType(const ToolChain &TC, const Driver &D, const ArgList &Args)
static std::string getAMDGPUTargetGPU(const llvm::Triple &T, const ArgList &Args)
Get the (LLVM) name of the AMDGPU gpu we are targeting.
static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, llvm::Triple T, StringRef Processor)
Defines the clang::LangOptions interface.
Defines types useful for describing an Objective-C runtime.
Defines version macros and version-related utility functions for Clang.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
const char * getOffloadingArch() const
static StringRef GetOffloadKindName(OffloadKind Kind)
Return a string containing a offload kind name.
OffloadKind getOffloadingDeviceKind() const
bool isHostOffloading(unsigned int OKind) const
Check if this action have any offload kinds.
Compilation - A set of tasks to perform for a single driver invocation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
std::string CCPrintInternalStatReportFilename
The file to log CC_PRINT_INTERNAL_STAT_FILE output to, if enabled.
DiagnosticsEngine & getDiags() const
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const
Compute the desired OpenMP runtime from the flags provided.
DiagnosticBuilder Diag(unsigned DiagID) const
unsigned CCPrintInternalStats
Set CC_PRINT_INTERNAL_STAT mode, which causes the driver to dump internal performance report to CC_PR...
llvm::vfs::FileSystem & getVFS() const
std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const
GetTemporaryPath - Return the pathname of a temporary file to use as part of compilation; the file wi...
std::string Dir
The path the driver executable was in, as invoked from the command line.
@ OMPRT_IOMP5
The legacy name for the LLVM OpenMP runtime from when it was the Intel OpenMP runtime.
@ OMPRT_OMP
The LLVM OpenMP runtime.
@ OMPRT_Unknown
An unknown OpenMP runtime.
@ OMPRT_GOMP
The GNU OpenMP runtime.
std::string getTargetTriple() const
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
std::vector< std::string > flags_list
bool needsFuzzerInterceptors() const
bool needsHwasanAliasesRt() const
bool needsStatsRt() const
bool needsMemProfRt() const
bool needsCfiDiagRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsHwasanRt() const
bool hasCrossDsoCfi() const
bool hasMemtagHeap() const
bool needsSafeStackRt() const
bool requiresMinimalRuntime() const
bool hasMemtagStack() const
bool needsDfsanRt() const
bool needsScudoRt() const
const std::string & getMemtagMode() const
bool needsSharedRt() const
bool linkCXXRuntimes() const
llvm::ArrayRef< std::string > modeList() const
bool isLLVMIR(ID Id)
Is this LLVM IR.
ID lookupTypeForExtension(llvm::StringRef Ext)
lookupTypeForExtension - Lookup the type to use for the file extension Ext.
bool willEmitRemarks(const llvm::opt::ArgList &Args)
llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, llvm::StringRef OffloadArch)
Get processor name from target ID.
@ C
Languages that the frontend can parse and compile.
static constexpr ResponseFileSupport AtFileCurCP()