31 #include "clang/Config/config.h"
43 #include "llvm/ADT/STLExtras.h"
44 #include "llvm/ADT/SmallSet.h"
45 #include "llvm/ADT/SmallString.h"
46 #include "llvm/ADT/StringExtras.h"
47 #include "llvm/ADT/StringSwitch.h"
48 #include "llvm/ADT/Twine.h"
49 #include "llvm/BinaryFormat/Magic.h"
50 #include "llvm/Config/llvm-config.h"
51 #include "llvm/Option/Arg.h"
52 #include "llvm/Option/ArgList.h"
53 #include "llvm/Option/Option.h"
54 #include "llvm/Support/CodeGen.h"
55 #include "llvm/Support/Compression.h"
56 #include "llvm/Support/Debug.h"
57 #include "llvm/Support/ErrorHandling.h"
58 #include "llvm/Support/FileSystem.h"
59 #include "llvm/Support/Path.h"
60 #include "llvm/Support/Process.h"
61 #include "llvm/Support/Program.h"
62 #include "llvm/Support/ScopedPrinter.h"
63 #include "llvm/Support/Threading.h"
64 #include "llvm/Support/VirtualFileSystem.h"
65 #include "llvm/Support/YAMLParser.h"
66 #include "llvm/TargetParser/Host.h"
67 #include "llvm/TargetParser/TargetParser.h"
72 using namespace clang;
76 const llvm::Triple &Triple) {
77 if (Args.hasArg(clang::driver::options::OPT_pg) &&
78 !Args.hasArg(clang::driver::options::OPT_mfentry))
81 if (Triple.isAndroid()) {
82 switch (Triple.getArch()) {
83 case llvm::Triple::aarch64:
84 case llvm::Triple::arm:
85 case llvm::Triple::armeb:
86 case llvm::Triple::thumb:
87 case llvm::Triple::thumbeb:
88 case llvm::Triple::riscv64:
95 switch (Triple.getArch()) {
96 case llvm::Triple::xcore:
97 case llvm::Triple::wasm32:
98 case llvm::Triple::wasm64:
99 case llvm::Triple::msp430:
103 case llvm::Triple::ppc:
104 case llvm::Triple::ppcle:
105 case llvm::Triple::ppc64:
106 case llvm::Triple::ppc64le:
107 case llvm::Triple::riscv32:
108 case llvm::Triple::riscv64:
109 case llvm::Triple::sparc:
110 case llvm::Triple::sparcel:
111 case llvm::Triple::sparcv9:
112 case llvm::Triple::amdgcn:
113 case llvm::Triple::r600:
114 case llvm::Triple::csky:
115 case llvm::Triple::loongarch32:
116 case llvm::Triple::loongarch64:
117 case llvm::Triple::m68k:
123 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
127 if (Triple.isOSLinux() || Triple.isOSHurd()) {
128 switch (Triple.getArch()) {
130 case llvm::Triple::arm:
131 case llvm::Triple::armeb:
132 case llvm::Triple::thumb:
133 case llvm::Triple::thumbeb:
134 case llvm::Triple::mips64:
135 case llvm::Triple::mips64el:
136 case llvm::Triple::mips:
137 case llvm::Triple::mipsel:
138 case llvm::Triple::systemz:
139 case llvm::Triple::x86:
140 case llvm::Triple::x86_64:
147 if (Triple.isOSWindows()) {
148 switch (Triple.getArch()) {
149 case llvm::Triple::x86:
151 case llvm::Triple::x86_64:
152 return Triple.isOSBinFormatMachO();
153 case llvm::Triple::arm:
154 case llvm::Triple::thumb:
168 switch (Triple.getArch()) {
171 case llvm::Triple::arm:
172 case llvm::Triple::thumb:
175 return Triple.isOSDarwin();
181 const llvm::Triple &Triple) {
193 Args.getLastArg(clang::driver::options::OPT_fomit_frame_pointer,
194 clang::driver::options::OPT_fno_omit_frame_pointer);
196 bool OmitFP = A && A->getOption().matches(
197 clang::driver::options::OPT_fomit_frame_pointer);
198 bool NoOmitFP = A && A->getOption().matches(
199 clang::driver::options::OPT_fno_omit_frame_pointer);
201 Args.hasFlag(clang::driver::options::OPT_momit_leaf_frame_pointer,
202 clang::driver::options::OPT_mno_omit_leaf_frame_pointer,
203 Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
204 (Triple.isAndroid() && Triple.isRISCV64()));
215 const StringRef PluginOptPrefix) {
216 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
217 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
218 "-pass-remarks=" + A->getValue()));
220 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
221 CmdArgs.push_back(Args.MakeArgString(
222 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
224 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
225 CmdArgs.push_back(Args.MakeArgString(
226 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
230 const llvm::Triple &Triple,
233 const StringRef PluginOptPrefix) {
234 StringRef Format =
"yaml";
235 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
236 Format = A->getValue();
239 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
245 assert(!F.empty() &&
"Cannot determine remarks output name.");
247 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
248 "opt-remarks-filename=" + F +
249 ".opt.ld." + Format));
252 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
253 CmdArgs.push_back(Args.MakeArgString(
254 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
256 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
257 "opt-remarks-format=" + Format.data()));
261 ArgStringList &CmdArgs,
262 const StringRef PluginOptPrefix) {
263 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
264 options::OPT_fno_diagnostics_show_hotness,
false))
265 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
266 "opt-remarks-with-hotness"));
269 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
271 Args.MakeArgString(Twine(PluginOptPrefix) +
272 "opt-remarks-hotness-threshold=" + A->getValue()));
277 StringRef Processor) {
281 auto GPUKind =
T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
282 : llvm::AMDGPU::parseArchR600(Processor);
283 auto GPUFeatures =
T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
284 : llvm::AMDGPU::getArchAttrR600(GPUKind);
285 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
287 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
292 if (D.
getVFS().exists(Path))
293 Paths.push_back(Path.str());
297 const llvm::Triple &Triple,
299 std::vector<StringRef> &Features,
300 OptSpecifier
Group) {
301 std::set<StringRef> Warned;
302 for (
const Arg *A : Args.filtered(
Group)) {
303 StringRef Name = A->getOption().getName();
307 assert(Name.starts_with(
"m") &&
"Invalid feature name.");
308 Name = Name.substr(1);
312 if (Warned.count(Name) == 0) {
314 clang::diag::warn_drv_unsupported_option_for_processor)
315 << A->getAsString(Args) << Proc;
321 bool IsNegative = Name.consume_front(
"no-");
323 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
332 for (StringRef Feature : llvm::reverse(Features)) {
333 if (UsedFeatures.insert(Feature.drop_front()).second)
334 UnifiedFeatures.insert(UnifiedFeatures.begin(), Feature);
337 return UnifiedFeatures;
341 const char *ArgName,
const char *EnvVar) {
342 const char *DirList = ::getenv(EnvVar);
343 bool CombinedArg =
false;
348 StringRef Name(ArgName);
349 if (Name ==
"-I" || Name ==
"-L" || Name.empty())
352 StringRef Dirs(DirList);
356 StringRef::size_type Delim;
357 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
360 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
362 CmdArgs.push_back(ArgName);
363 CmdArgs.push_back(
".");
368 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
370 CmdArgs.push_back(ArgName);
371 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
374 Dirs = Dirs.substr(Delim + 1);
379 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
381 CmdArgs.push_back(ArgName);
382 CmdArgs.push_back(
".");
386 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
388 CmdArgs.push_back(ArgName);
389 CmdArgs.push_back(Args.MakeArgString(Dirs));
395 const ArgList &Args, ArgStringList &CmdArgs,
401 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
408 for (
const auto &II : Inputs) {
412 if (
auto *IA = II.getAction())
421 if (II.getType() == types::TY_Tempfilelist) {
423 std::string
FileName(II.getFilename());
424 const char *ArgFile = Args.MakeArgString(
"@" + FileName);
425 CmdArgs.push_back(ArgFile);
430 if (II.isFilename()) {
431 CmdArgs.push_back(II.getFilename());
440 const Arg &A = II.getInputArg();
443 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
445 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
448 A.renderAsInput(Args, CmdArgs);
453 const ToolChain &TC,
const llvm::opt::ArgList &Args,
454 llvm::opt::ArgStringList &CmdArgs) {
460 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
461 StringRef
V = A->getValue();
462 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
463 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
465 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
466 << A->getSpelling() <<
V;
471 std::vector<StringRef> &Features,
472 OptSpecifier OnOpt, OptSpecifier OffOpt,
473 StringRef FeatureName) {
474 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
475 if (A->getOption().matches(OnOpt))
476 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
478 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
484 const ArgList &Args) {
485 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
486 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
488 return llvm::StringSwitch<std::string>(GPUName)
489 .Cases(
"rv630",
"rv635",
"r600")
490 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
491 .Case(
"rv740",
"rv770")
492 .Case(
"palm",
"cedar")
493 .Cases(
"sumo",
"sumo2",
"sumo")
494 .Case(
"hemlock",
"cypress")
495 .Case(
"aruba",
"cayman")
496 .Default(GPUName.str());
504 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
505 return A->getValue();
513 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
514 StringRef CPU = A->getValue();
520 return llvm::sys::getHostCPUName();
530 const llvm::Triple &
T,
bool FromAs) {
533 switch (
T.getArch()) {
537 case llvm::Triple::aarch64:
538 case llvm::Triple::aarch64_32:
539 case llvm::Triple::aarch64_be:
542 case llvm::Triple::arm:
543 case llvm::Triple::armeb:
544 case llvm::Triple::thumb:
545 case llvm::Triple::thumbeb: {
546 StringRef MArch, MCPU;
551 case llvm::Triple::avr:
552 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
553 return A->getValue();
556 case llvm::Triple::m68k:
559 case llvm::Triple::mips:
560 case llvm::Triple::mipsel:
561 case llvm::Triple::mips64:
562 case llvm::Triple::mips64el: {
566 return std::string(CPUName);
569 case llvm::Triple::nvptx:
570 case llvm::Triple::nvptx64:
571 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
572 return A->getValue();
575 case llvm::Triple::ppc:
576 case llvm::Triple::ppcle:
577 case llvm::Triple::ppc64:
578 case llvm::Triple::ppc64le:
581 case llvm::Triple::csky:
582 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
583 return A->getValue();
584 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
585 return A->getValue();
588 case llvm::Triple::riscv32:
589 case llvm::Triple::riscv64:
592 case llvm::Triple::bpfel:
593 case llvm::Triple::bpfeb:
594 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
595 return A->getValue();
598 case llvm::Triple::sparc:
599 case llvm::Triple::sparcel:
600 case llvm::Triple::sparcv9:
603 case llvm::Triple::x86:
604 case llvm::Triple::x86_64:
607 case llvm::Triple::hexagon:
611 case llvm::Triple::lanai:
614 case llvm::Triple::systemz:
617 case llvm::Triple::r600:
618 case llvm::Triple::amdgcn:
621 case llvm::Triple::wasm32:
622 case llvm::Triple::wasm64:
625 case llvm::Triple::loongarch32:
626 case llvm::Triple::loongarch64:
632 const llvm::Triple &Triple,
634 std::vector<StringRef> &Features) {
636 options::OPT_m_wasm_Features_Group);
640 const ArgList &Args, ArgStringList &CmdArgs,
641 bool ForAS,
bool IsAux) {
642 std::vector<StringRef> Features;
643 switch (Triple.getArch()) {
646 case llvm::Triple::mips:
647 case llvm::Triple::mipsel:
648 case llvm::Triple::mips64:
649 case llvm::Triple::mips64el:
652 case llvm::Triple::arm:
653 case llvm::Triple::armeb:
654 case llvm::Triple::thumb:
655 case llvm::Triple::thumbeb:
658 case llvm::Triple::ppc:
659 case llvm::Triple::ppcle:
660 case llvm::Triple::ppc64:
661 case llvm::Triple::ppc64le:
664 case llvm::Triple::riscv32:
665 case llvm::Triple::riscv64:
668 case llvm::Triple::systemz:
671 case llvm::Triple::aarch64:
672 case llvm::Triple::aarch64_32:
673 case llvm::Triple::aarch64_be:
676 case llvm::Triple::x86:
677 case llvm::Triple::x86_64:
680 case llvm::Triple::hexagon:
683 case llvm::Triple::wasm32:
684 case llvm::Triple::wasm64:
687 case llvm::Triple::sparc:
688 case llvm::Triple::sparcel:
689 case llvm::Triple::sparcv9:
692 case llvm::Triple::r600:
693 case llvm::Triple::amdgcn:
696 case llvm::Triple::nvptx:
697 case llvm::Triple::nvptx64:
700 case llvm::Triple::m68k:
703 case llvm::Triple::msp430:
706 case llvm::Triple::ve:
709 case llvm::Triple::csky:
712 case llvm::Triple::loongarch32:
713 case llvm::Triple::loongarch64:
719 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
720 CmdArgs.push_back(Feature.data());
725 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
728 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
729 D.
Diag(diag::err_drv_invalid_int_value)
730 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
731 return LtoJobsArg->getValue();
736 return Triple.isPS();
740 const llvm::opt::ArgList &Args) {
742 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
744 return Triple.hasDefaultTLSDESC();
745 StringRef
V = A->getValue();
746 bool SupportedArgument =
false, EnableTLSDESC =
false;
748 if (Triple.isLoongArch() || Triple.isRISCV()) {
749 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
750 EnableTLSDESC =
V ==
"desc";
751 }
else if (Triple.isX86()) {
752 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
753 EnableTLSDESC =
V ==
"gnu2";
758 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
759 << A->getSpelling() << Triple.getTriple();
760 }
else if (!SupportedArgument) {
761 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
762 << A->getSpelling() <<
V << Triple.getTriple();
764 return EnableTLSDESC;
768 ArgStringList &CmdArgs,
const InputInfo &Output,
769 const InputInfo &Input,
bool IsThinLTO) {
771 const bool IsOSAIX = Triple.isOSAIX();
772 const bool IsAMDGCN = Triple.isAMDGCN();
775 const bool IsFatLTO = Args.hasArg(options::OPT_ffat_lto_objects);
776 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
777 if (llvm::sys::path::filename(Linker) !=
"ld.lld" &&
778 llvm::sys::path::stem(Linker) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
782 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
783 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
786 CmdArgs.push_back(
"-plugin");
789 const char *Suffix =
".dll";
790 #elif defined(__APPLE__)
791 const char *Suffix =
".dylib";
793 const char *Suffix =
".so";
797 llvm::sys::path::native(Twine(D.
Dir) +
798 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
801 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
806 CmdArgs.push_back(
"--fat-lto-objects");
809 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
810 const char *ExtraDash = IsOSAIX ?
"-" :
"";
811 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
816 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
817 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
818 "-generate-arange-section"));
822 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
823 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
826 std::optional<StringRef> OptVal =
827 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
828 .Case(
"Accelerate",
"Accelerate")
829 .Case(
"LIBMVEC",
"LIBMVEC-X86")
830 .Case(
"MASSV",
"MASSV")
831 .Case(
"SVML",
"SVML")
832 .Case(
"SLEEF",
"sleefgnuabi")
833 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
834 .Case(
"ArmPL",
"ArmPL")
835 .Case(
"none",
"none")
836 .Default(std::nullopt);
839 CmdArgs.push_back(Args.MakeArgString(
840 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
847 std::string CPU =
getCPUName(D, Args, Triple);
850 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
852 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
856 if (A->getOption().matches(options::OPT_O4) ||
857 A->getOption().matches(options::OPT_Ofast))
859 else if (A->getOption().matches(options::OPT_O)) {
860 OOpt = A->getValue();
863 else if (OOpt ==
"s" || OOpt ==
"z")
865 }
else if (A->getOption().matches(options::OPT_O0))
869 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"O" + OOpt));
871 CmdArgs.push_back(Args.MakeArgString(Twine(
"--lto-CGO") + OOpt));
875 if (Args.hasArg(options::OPT_gsplit_dwarf))
876 CmdArgs.push_back(Args.MakeArgString(
877 Twine(PluginOptPrefix) +
"dwo_dir=" + Output.
getFilename() +
"_dwo"));
879 if (IsThinLTO && !IsOSAIX)
880 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
881 else if (IsThinLTO && IsOSAIX)
882 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
887 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
888 Args.hasArg(options::OPT_fenable_matrix))
890 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
893 if (!Parallelism.empty())
894 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
895 ParallelismOpt + Parallelism));
898 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
899 options::OPT_fno_global_isel)) {
902 CmdArgs.push_back(Args.MakeArgString(
903 Twine(PluginOptPrefix) +
"-global-isel=" +
904 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
909 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
910 if (A->getOption().matches(options::OPT_glldb))
912 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
913 else if (A->getOption().matches(options::OPT_gsce))
915 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
916 else if (A->getOption().matches(options::OPT_gdbx))
918 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
921 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
927 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
931 Arg *A = Args.getLastArg(options::OPT_g_Group);
932 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
933 !A->getOption().matches(options::OPT_ggdb0);
934 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
935 options::OPT_gno_strict_dwarf,
true))
937 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
939 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
940 StringRef
V = A->getValue();
941 if (
V ==
"vec-default")
943 if (
V ==
"vec-extabi") {
945 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
951 bool UseSeparateSections =
954 if (Args.hasFlag(options::OPT_ffunction_sections,
955 options::OPT_fno_function_sections, UseSeparateSections))
957 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
958 else if (Args.hasArg(options::OPT_fno_function_sections))
960 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
962 bool DataSectionsTurnedOff =
false;
963 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
964 UseSeparateSections)) {
966 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
967 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
968 DataSectionsTurnedOff =
true;
970 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
973 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
974 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
975 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
976 options::OPT_mno_xcoff_roptr,
false);
977 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
979 D.
Diag(diag::err_drv_unsupported_opt_for_target)
980 << OptStr << Triple.str();
986 if (DataSectionsTurnedOff)
987 D.
Diag(diag::err_roptr_requires_data_sections);
990 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
995 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
996 options::OPT_fno_split_machine_functions)) {
997 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
998 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
999 "-split-machine-functions"));
1003 StringRef FName = A->getValue();
1004 if (!llvm::sys::fs::exists(FName))
1005 D.
Diag(diag::err_drv_no_such_file) << FName;
1007 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1008 "sample-profile=" + FName));
1012 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1013 "cs-profile-generate"));
1014 if (CSPGOGenerateArg->getOption().matches(
1015 options::OPT_fcs_profile_generate_EQ)) {
1017 llvm::sys::path::append(Path,
"default_%m.profraw");
1018 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1019 "cs-profile-path=" + Path));
1022 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1023 "cs-profile-path=default_%m.profraw"));
1026 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1027 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1028 llvm::sys::path::append(Path,
"default.profdata");
1029 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1030 "cs-profile-path=" + Path));
1034 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1036 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1037 "-enable-jmc-instrument"));
1039 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1042 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1043 Triple.hasDefaultEmulatedTLS())) {
1045 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1049 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1051 if (Args.hasFlag(options::OPT_fstack_size_section,
1052 options::OPT_fno_stack_size_section,
false))
1054 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1058 if (!StatsFile.empty())
1060 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1063 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1064 CmdArgs.push_back(Args.MakeArgString(
1065 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1076 Output, PluginOptPrefix);
1082 true, PluginOptPrefix);
1088 ArgStringList &CmdArgs) {
1089 if (Args.hasArg(options::OPT_nogpulib) || Args.hasArg(options::OPT_nolibc))
1095 llvm::sys::path::append(LibCDecls,
"include",
"llvm_libc_wrappers",
1097 bool HasLibC = llvm::sys::fs::exists(LibCDecls) &&
1098 llvm::sys::fs::is_directory(LibCDecls);
1099 if (!Args.hasFlag(options::OPT_gpulibc, options::OPT_nogpulibc, HasLibC))
1104 for (
auto TI = TCRange.first, TE = TCRange.second; TI != TE; ++TI)
1105 ToolChains.push_back(TI->second);
1107 if (llvm::any_of(ToolChains, [](
const ToolChain *TC) {
1110 CmdArgs.push_back(
"-lcgpu-amdgpu");
1111 CmdArgs.push_back(
"-lmgpu-amdgpu");
1113 if (llvm::any_of(ToolChains, [](
const ToolChain *TC) {
1116 CmdArgs.push_back(
"-lcgpu-nvptx");
1117 CmdArgs.push_back(
"-lmgpu-nvptx");
1122 const ArgList &Args,
1123 ArgStringList &CmdArgs) {
1128 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1129 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1133 ArgStringList &CmdArgs) {
1134 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1135 options::OPT_fno_rtlib_add_rpath,
false))
1140 CandidateRPaths.emplace_back(*CandidateRPath);
1142 for (
const auto &CandidateRPath : CandidateRPaths) {
1143 if (TC.
getVFS().exists(CandidateRPath)) {
1144 CmdArgs.push_back(
"-rpath");
1145 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1151 const ToolChain &TC,
const ArgList &Args,
1152 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1154 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1155 options::OPT_fno_openmp,
false))
1164 if (ForceStaticHostRuntime)
1165 CmdArgs.push_back(
"-Bstatic");
1169 CmdArgs.push_back(
"-lomp");
1172 CmdArgs.push_back(
"-lgomp");
1175 CmdArgs.push_back(
"-liomp5");
1179 if (ForceStaticHostRuntime)
1180 CmdArgs.push_back(
"-Bdynamic");
1183 CmdArgs.push_back(
"-lrt");
1185 if (IsOffloadingHost)
1186 CmdArgs.push_back(
"-lomptarget");
1188 if (IsOffloadingHost && !Args.hasArg(options::OPT_nogpulib))
1189 CmdArgs.push_back(
"-lomptarget.devicertl");
1191 if (IsOffloadingHost)
1202 llvm::opt::ArgStringList &CmdArgs) {
1207 if (!TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1209 F128LibName.consume_front_insensitive(
"lib");
1210 if (!F128LibName.empty()) {
1211 bool AsNeeded = !TC.
getTriple().isOSAIX();
1212 CmdArgs.push_back(
"-lFortranFloat128Math");
1215 CmdArgs.push_back(Args.MakeArgString(
"-l" + F128LibName));
1219 CmdArgs.push_back(
"-lFortranRuntime");
1220 CmdArgs.push_back(
"-lFortranDecimal");
1225 const llvm::opt::ArgList &Args,
1226 ArgStringList &CmdArgs) {
1233 llvm::sys::path::append(DefaultLibPath,
"lib");
1234 if (TC.
getTriple().isKnownWindowsMSVCEnvironment())
1235 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + DefaultLibPath));
1237 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1241 ArgStringList &CmdArgs, StringRef Sanitizer,
1242 bool IsShared,
bool IsWhole) {
1245 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1248 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1258 ArgStringList &CmdArgs,
1259 StringRef Sanitizer) {
1264 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1267 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1268 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1275 const llvm::opt::ArgList &Args,
1276 llvm::opt::ArgStringList &CmdArgs,
1279 "AIX linker does not support any form of --as-needed option yet.");
1287 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1288 CmdArgs.push_back(
"-z");
1289 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1291 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1296 const llvm::opt::ArgList &Args,
1297 ArgStringList &CmdArgs) {
1302 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1304 CmdArgs.push_back(
"-lpthread");
1306 CmdArgs.push_back(
"-lrt");
1308 CmdArgs.push_back(
"-lm");
1312 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1313 CmdArgs.push_back(
"-ldl");
1318 CmdArgs.push_back(
"-lexecinfo");
1324 CmdArgs.push_back(
"-lresolv");
1338 SharedRuntimes.push_back(
"asan");
1339 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1340 HelperStaticRuntimes.push_back(
"asan-preinit");
1343 SharedRuntimes.push_back(
"memprof");
1344 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1345 HelperStaticRuntimes.push_back(
"memprof-preinit");
1349 SharedRuntimes.push_back(
"ubsan_minimal");
1351 SharedRuntimes.push_back(
"ubsan_standalone");
1354 SharedRuntimes.push_back(
"scudo_standalone");
1357 SharedRuntimes.push_back(
"tsan");
1360 SharedRuntimes.push_back(
"hwasan_aliases");
1362 SharedRuntimes.push_back(
"hwasan");
1363 if (!Args.hasArg(options::OPT_shared))
1364 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1370 StaticRuntimes.push_back(
"stats_client");
1374 HelperStaticRuntimes.push_back(
"asan_static");
1377 if (Args.hasArg(options::OPT_shared)) {
1386 StaticRuntimes.push_back(
"asan");
1388 StaticRuntimes.push_back(
"asan_cxx");
1392 StaticRuntimes.push_back(
"memprof");
1394 StaticRuntimes.push_back(
"memprof_cxx");
1399 StaticRuntimes.push_back(
"hwasan_aliases");
1401 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1403 StaticRuntimes.push_back(
"hwasan");
1405 StaticRuntimes.push_back(
"hwasan_cxx");
1409 StaticRuntimes.push_back(
"dfsan");
1411 StaticRuntimes.push_back(
"lsan");
1413 StaticRuntimes.push_back(
"msan");
1415 StaticRuntimes.push_back(
"msan_cxx");
1418 StaticRuntimes.push_back(
"tsan");
1420 StaticRuntimes.push_back(
"tsan_cxx");
1424 StaticRuntimes.push_back(
"ubsan_minimal");
1426 StaticRuntimes.push_back(
"ubsan_standalone");
1428 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1432 NonWholeStaticRuntimes.push_back(
"safestack");
1433 RequiredSymbols.push_back(
"__safestack_init");
1437 StaticRuntimes.push_back(
"cfi");
1439 StaticRuntimes.push_back(
"cfi_diag");
1441 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1445 NonWholeStaticRuntimes.push_back(
"stats");
1446 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1449 StaticRuntimes.push_back(
"scudo_standalone");
1451 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1458 ArgStringList &CmdArgs) {
1461 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1464 NonWholeStaticRuntimes, HelperStaticRuntimes,
1470 !Args.hasArg(options::OPT_shared)) {
1476 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
1477 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1478 !Args.hasArg(options::OPT_static);
1479 if (OnlyLibstdcxxStatic)
1480 CmdArgs.push_back(
"-Bstatic");
1482 if (OnlyLibstdcxxStatic)
1483 CmdArgs.push_back(
"-Bdynamic");
1487 for (
auto RT : SharedRuntimes)
1489 for (
auto RT : HelperStaticRuntimes)
1491 bool AddExportDynamic =
false;
1492 for (
auto RT : StaticRuntimes) {
1496 for (
auto RT : NonWholeStaticRuntimes) {
1500 for (
auto S : RequiredSymbols) {
1501 CmdArgs.push_back(
"-u");
1502 CmdArgs.push_back(Args.MakeArgString(S));
1506 if (AddExportDynamic)
1507 CmdArgs.push_back(
"--export-dynamic");
1510 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1514 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1515 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1518 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1520 CmdArgs.push_back(
"--android-memtag-heap");
1522 CmdArgs.push_back(
"--android-memtag-stack");
1525 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1529 if (Args.hasArg(options::OPT_shared))
1533 CmdArgs.push_back(
"--whole-archive");
1537 CmdArgs.push_back(
"--no-whole-archive");
1545 const llvm::opt::ArgList &Args,
1546 ArgStringList &CmdArgs) {
1548 CmdArgs.push_back(
"-lpthread");
1550 CmdArgs.push_back(
"-lrt");
1551 CmdArgs.push_back(
"-lm");
1556 CmdArgs.push_back(
"-ldl");
1561 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1562 return !A->getOption().matches(options::OPT_O0);
1571 return llvm::any_of(Args.getAllArgValues(options::OPT_Xclang),
1572 [&DepLib](StringRef Option) { return Option == DepLib; });
1578 auto AddPostfix = [JA](
auto &F) {
1583 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1584 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1588 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1591 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1592 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1593 T = FinalOutput->getValue();
1594 llvm::sys::path::remove_filename(
T);
1595 llvm::sys::path::append(
T,
1596 llvm::sys::path::stem(FinalOutput->getValue()));
1598 return Args.MakeArgString(
T);
1604 return Args.MakeArgString(
T);
1608 const JobAction &JA,
const ArgList &Args,
1609 const InputInfo &Output,
const char *OutFile) {
1610 ArgStringList ExtractArgs;
1611 ExtractArgs.push_back(
"--extract-dwo");
1613 ArgStringList StripArgs;
1614 StripArgs.push_back(
"--strip-dwo");
1619 ExtractArgs.push_back(OutFile);
1626 C.addCommand(std::make_unique<Command>(JA,
T,
1628 Exec, ExtractArgs, II, Output));
1631 C.addCommand(std::make_unique<Command>(
1641 Args.ClaimAllArgs(options::OPT_flto_EQ);
1642 Args.ClaimAllArgs(options::OPT_flto);
1643 Args.ClaimAllArgs(options::OPT_fno_lto);
1647 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1648 options::OPT_fcs_profile_generate_EQ,
1649 options::OPT_fno_profile_generate);
1650 if (CSPGOGenerateArg &&
1651 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1652 CSPGOGenerateArg =
nullptr;
1654 return CSPGOGenerateArg;
1658 auto *ProfileUseArg = Args.getLastArg(
1659 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1660 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1661 options::OPT_fno_profile_instr_use);
1663 if (ProfileUseArg &&
1664 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1665 ProfileUseArg =
nullptr;
1667 return ProfileUseArg;
1671 auto *ProfileSampleUseArg = Args.getLastArg(
1672 options::OPT_fprofile_sample_use, options::OPT_fprofile_sample_use_EQ,
1673 options::OPT_fauto_profile, options::OPT_fauto_profile_EQ,
1674 options::OPT_fno_profile_sample_use, options::OPT_fno_auto_profile);
1676 if (ProfileSampleUseArg &&
1677 (ProfileSampleUseArg->getOption().matches(
1678 options::OPT_fno_profile_sample_use) ||
1679 ProfileSampleUseArg->getOption().matches(options::OPT_fno_auto_profile)))
1682 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ,
1683 options::OPT_fauto_profile_EQ);
1688 case llvm::Reloc::Static:
1690 case llvm::Reloc::PIC_:
1692 case llvm::Reloc::DynamicNoPIC:
1693 return "dynamic-no-pic";
1694 case llvm::Reloc::ROPI:
1696 case llvm::Reloc::RWPI:
1698 case llvm::Reloc::ROPI_RWPI:
1701 llvm_unreachable(
"Unknown Reloc::Model kind");
1708 std::tuple<llvm::Reloc::Model, unsigned, bool>
1716 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1718 bool IsPICLevelTwo = PIC;
1721 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1724 if (Triple.isAndroid()) {
1725 switch (Triple.getArch()) {
1726 case llvm::Triple::arm:
1727 case llvm::Triple::armeb:
1728 case llvm::Triple::thumb:
1729 case llvm::Triple::thumbeb:
1730 case llvm::Triple::aarch64:
1731 case llvm::Triple::mips:
1732 case llvm::Triple::mipsel:
1733 case llvm::Triple::mips64:
1734 case llvm::Triple::mips64el:
1738 case llvm::Triple::x86:
1739 case llvm::Triple::x86_64:
1741 IsPICLevelTwo =
true;
1750 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
1754 if (Triple.isOSOpenBSD()) {
1756 case llvm::Triple::arm:
1757 case llvm::Triple::aarch64:
1758 case llvm::Triple::mips64:
1759 case llvm::Triple::mips64el:
1760 case llvm::Triple::x86:
1761 case llvm::Triple::x86_64:
1762 IsPICLevelTwo =
false;
1765 case llvm::Triple::ppc:
1766 case llvm::Triple::sparcv9:
1767 IsPICLevelTwo =
true;
1779 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1780 options::OPT_fpic, options::OPT_fno_pic,
1781 options::OPT_fPIE, options::OPT_fno_PIE,
1782 options::OPT_fpie, options::OPT_fno_pie);
1783 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
1784 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
1785 options::OPT_fPIE, options::OPT_fpie)) {
1787 << LastPICArg->getSpelling() << Triple.str();
1788 if (Triple.getArch() == llvm::Triple::x86_64)
1789 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
1790 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1797 Option O = LastPICArg->getOption();
1798 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1799 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1800 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1802 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1804 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
1807 if (EffectiveTriple.isPS()) {
1808 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
1809 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
1810 if (Model !=
"kernel") {
1813 << LastPICArg->getSpelling()
1814 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
1824 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
1830 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
1831 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
1834 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1837 if (!Triple.isOSDarwin())
1839 << A->getSpelling() << Triple.str();
1848 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
1851 bool EmbeddedPISupported;
1852 switch (Triple.getArch()) {
1853 case llvm::Triple::arm:
1854 case llvm::Triple::armeb:
1855 case llvm::Triple::thumb:
1856 case llvm::Triple::thumbeb:
1857 EmbeddedPISupported =
true;
1860 EmbeddedPISupported =
false;
1864 bool ROPI =
false, RWPI =
false;
1865 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
1866 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
1867 if (!EmbeddedPISupported)
1869 << LastROPIArg->getSpelling() << Triple.str();
1872 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
1873 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
1874 if (!EmbeddedPISupported)
1876 << LastRWPIArg->getSpelling() << Triple.str();
1881 if ((ROPI || RWPI) && (PIC || PIE))
1884 if (Triple.isMIPS()) {
1891 if (ABIName ==
"n64")
1894 if(Args.hasArg(options::OPT_mno_abicalls))
1895 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1898 IsPICLevelTwo =
false;
1902 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
1904 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
1906 RelocM = llvm::Reloc::ROPI_RWPI;
1908 RelocM = llvm::Reloc::ROPI;
1910 RelocM = llvm::Reloc::RWPI;
1912 return std::make_tuple(RelocM, 0
U,
false);
1932 const ArgList &Args) {
1933 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
1934 options::OPT_falign_functions_EQ,
1935 options::OPT_fno_align_functions);
1936 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
1939 if (A->getOption().matches(options::OPT_falign_functions))
1943 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
1945 << A->getAsString(Args) << A->getValue();
1950 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
1951 switch (DebugInfoKind) {
1952 case llvm::codegenoptions::DebugDirectivesOnly:
1953 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
1955 case llvm::codegenoptions::DebugLineTablesOnly:
1956 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
1958 case llvm::codegenoptions::DebugInfoConstructor:
1959 CmdArgs.push_back(
"-debug-info-kind=constructor");
1961 case llvm::codegenoptions::LimitedDebugInfo:
1962 CmdArgs.push_back(
"-debug-info-kind=limited");
1964 case llvm::codegenoptions::FullDebugInfo:
1965 CmdArgs.push_back(
"-debug-info-kind=standalone");
1967 case llvm::codegenoptions::UnusedTypeInfo:
1968 CmdArgs.push_back(
"-debug-info-kind=unused-types");
1978 assert(A.getOption().matches(options::OPT_gN_Group) &&
1979 "Not a -g option that specifies a debug-info level");
1980 if (A.getOption().matches(options::OPT_g0) ||
1981 A.getOption().matches(options::OPT_ggdb0))
1982 return llvm::codegenoptions::NoDebugInfo;
1983 if (A.getOption().matches(options::OPT_gline_tables_only) ||
1984 A.getOption().matches(options::OPT_ggdb1))
1985 return llvm::codegenoptions::DebugLineTablesOnly;
1986 if (A.getOption().matches(options::OPT_gline_directives_only))
1987 return llvm::codegenoptions::DebugDirectivesOnly;
1988 return llvm::codegenoptions::DebugInfoConstructor;
1992 const ArgList &Args) {
1993 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
1999 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 5 ||
2002 << A->getAsString(Args) << A->getValue();
2007 return llvm::StringSwitch<unsigned>(ArgValue)
2008 .Case(
"-gdwarf-2", 2)
2009 .Case(
"-gdwarf-3", 3)
2010 .Case(
"-gdwarf-4", 4)
2011 .Case(
"-gdwarf-5", 5)
2016 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2017 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2018 options::OPT_gdwarf);
2022 const llvm::opt::ArgList &Args) {
2027 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2028 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2029 << GDwarfN->getSpelling() << TC.
getTriple().str();
2031 if (DwarfVersion == 0) {
2033 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2035 return DwarfVersion;
2039 ArgStringList &CmdArgs) {
2040 llvm::Reloc::Model RelocationModel;
2045 if (RelocationModel != llvm::Reloc::Static)
2046 CmdArgs.push_back(
"-KPIC");
2052 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2058 const ArgList &Args) {
2059 if (Args.hasArg(options::OPT_static_libgcc) ||
2060 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2064 if (Args.hasArg(options::OPT_shared_libgcc))
2083 ArgStringList &CmdArgs,
const ArgList &Args) {
2087 CmdArgs.push_back(
"-l:libunwind.a");
2108 CmdArgs.push_back(
"-lgcc_eh");
2110 CmdArgs.push_back(
"-lgcc_s");
2118 CmdArgs.push_back(
"-lunwind");
2120 CmdArgs.push_back(
"-l:libunwind.a");
2123 CmdArgs.push_back(
"-l:libunwind.dll.a");
2125 CmdArgs.push_back(
"-l:libunwind.so");
2129 CmdArgs.push_back(
"-lunwind");
2139 ArgStringList &CmdArgs,
const ArgList &Args) {
2143 CmdArgs.push_back(
"-lgcc");
2147 CmdArgs.push_back(
"-lgcc");
2151 ArgStringList &CmdArgs,
const ArgList &Args) {
2162 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2165 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2166 if (A && A->getValue() != StringRef(
"platform")) {
2167 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2168 << A->getValue() <<
"MSVC";
2178 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2179 !Args.hasArg(options::OPT_static_pie))
2180 CmdArgs.push_back(
"-ldl");
2187 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2193 StringRef SaveStats = A->getValue();
2194 if (SaveStats ==
"obj" && Output.
isFilename()) {
2196 llvm::sys::path::remove_filename(StatsFile);
2197 }
else if (SaveStats !=
"cwd") {
2198 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2202 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2203 llvm::sys::path::append(StatsFile, BaseName);
2204 llvm::sys::path::replace_extension(StatsFile,
"stats");
2216 assert(Flag.front() ==
'-');
2218 Flags.push_back(Flag.str());
2220 Flags.push_back((
"!" + Flag.substr(1)).str());
2225 ArgStringList &CmdArgs,
bool IsLTO,
2226 const StringRef PluginOptPrefix) {
2227 auto addArg = [&, IsLTO](
const Twine &Arg) {
2229 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2230 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2232 CmdArgs.push_back(
"-mllvm");
2233 CmdArgs.push_back(Args.MakeArgString(Arg));
2237 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2238 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2240 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2241 StringRef
Value = A->getValue();
2243 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2244 !llvm::isPowerOf2_64(Boundary)) {
2245 D.
Diag(diag::err_drv_invalid_argument_to_option)
2246 <<
Value << A->getOption().getName();
2248 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2251 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2252 std::string AlignBranch;
2253 for (StringRef
T : A->getValues()) {
2254 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2255 T !=
"ret" &&
T !=
"indirect")
2256 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2257 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2258 if (!AlignBranch.empty())
2262 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2264 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2265 StringRef
Value = A->getValue();
2266 unsigned PrefixSize;
2267 if (
Value.getAsInteger(10, PrefixSize)) {
2268 D.
Diag(diag::err_drv_invalid_argument_to_option)
2269 <<
Value << A->getOption().getName();
2271 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2297 llvm::opt::ArgStringList &CC1Args,
2299 StringRef Lib, StringRef Arch, StringRef
Target,
2300 bool isBitCodeSDL) {
2303 std::string LibDeviceLoc =
"/libdevice";
2304 std::string LibBcPrefix =
"/libbc-";
2305 std::string LibPrefix =
"/lib";
2322 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2323 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2325 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2326 Twine(Lib +
"-" + Arch).str(), Twine(Lib).str()}) {
2327 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2328 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2338 const auto *Ext =
".a";
2340 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2341 Twine(Lib +
"-" + Arch).str()}) {
2342 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2343 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2354 bool FoundSDL =
false;
2355 for (
auto LPath : LibraryPaths) {
2356 for (
auto SDL : SDLs) {
2357 auto FullName = Twine(LPath + SDL).str();
2358 if (llvm::sys::fs::exists(FullName)) {
2359 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2377 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2378 llvm::opt::ArgStringList &CC1Args,
2380 StringRef Arch, StringRef
Target,
bool isBitCodeSDL) {
2383 if (isBitCodeSDL && Arch.contains(
"nvptx"))
2386 bool FoundAOB =
false;
2387 std::string ArchiveOfBundles;
2390 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2391 auto Ext = IsMSVC ?
".lib" :
".a";
2392 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2393 if (llvm::sys::fs::exists(Lib)) {
2394 ArchiveOfBundles = Lib;
2398 Lib.consume_front(
"-l");
2399 for (
auto LPath : LibraryPaths) {
2400 ArchiveOfBundles.clear();
2401 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2402 : IsMSVC ? Lib + Ext
2403 :
"lib" + Lib + Ext)
2405 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2406 auto AOB = Twine(LPath + Prefix + LibFile).str();
2407 if (llvm::sys::fs::exists(AOB)) {
2408 ArchiveOfBundles = AOB;
2421 llvm::file_magic Magic;
2422 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2423 if (EC || Magic != llvm::file_magic::archive)
2426 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2427 std::string OutputLib =
2433 C.addTempFile(C.getArgs().MakeArgString(OutputLib));
2435 ArgStringList CmdArgs;
2438 DeviceTriple +=
'-';
2439 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize();
2440 DeviceTriple += NormalizedTriple;
2442 DeviceTriple +=
'-';
2446 std::string UnbundleArg(
"-unbundle");
2447 std::string TypeArg(
"-type=a");
2448 std::string InputArg(
"-input=" + ArchiveOfBundles);
2449 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2450 std::string OutputArg(
"-output=" + OutputLib);
2452 const char *UBProgram = DriverArgs.MakeArgString(
2453 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2455 ArgStringList UBArgs;
2456 UBArgs.push_back(C.getArgs().MakeArgString(UnbundleArg));
2457 UBArgs.push_back(C.getArgs().MakeArgString(TypeArg));
2458 UBArgs.push_back(C.getArgs().MakeArgString(InputArg));
2459 UBArgs.push_back(C.getArgs().MakeArgString(OffloadArg));
2460 UBArgs.push_back(C.getArgs().MakeArgString(OutputArg));
2464 std::string AdditionalArgs(
"-allow-missing-bundles");
2465 UBArgs.push_back(C.getArgs().MakeArgString(AdditionalArgs));
2470 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2471 UBArgs.push_back(C.getArgs().MakeArgString(HipCompatibleArgs));
2473 C.addCommand(std::make_unique<Command>(
2475 InputInfo(&JA, C.getArgs().MakeArgString(OutputLib))));
2477 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2486 const llvm::opt::ArgList &DriverArgs,
2487 llvm::opt::ArgStringList &CC1Args,
2488 StringRef Arch, StringRef
Target,
2489 bool isBitCodeSDL) {
2491 Arch,
Target, isBitCodeSDL);
2497 const llvm::opt::ArgList &DriverArgs,
2498 llvm::opt::ArgStringList &CC1Args,
2499 StringRef Arch, StringRef
Target,
2500 bool isBitCodeSDL,
bool postClangLink) {
2502 CC1Args, Arch,
Target, isBitCodeSDL);
2533 const llvm::opt::ArgList &DriverArgs,
2534 llvm::opt::ArgStringList &CC1Args,
2535 StringRef Arch, StringRef
Target,
2536 bool isBitCodeSDL) {
2540 std::optional<std::string> LibPath =
2541 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2544 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2545 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2546 for (StringRef Path : Frags)
2547 LibraryPaths.emplace_back(Path.trim());
2551 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2552 LibraryPaths.emplace_back(Search_Dir);
2556 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2557 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2560 llvm::SmallSet<std::string, 16> SDLNames;
2561 static const StringRef HostOnlyArchives[] = {
2562 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2563 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2564 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2565 SDLNames.insert(std::string(
"-l") + SDLName);
2569 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2576 const StringRef LibFileExt =
".lib";
2577 if (!llvm::sys::path::has_extension(
FileName) ||
2579 llvm::sys::path::extension(
FileName).drop_front()) ==
2581 llvm::sys::path::extension(
FileName) == LibFileExt)
2582 SDLNames.insert(Input);
2590 for (
auto SDLName : SDLNames) {
2592 if (!
SDLSearch(D, DriverArgs, CC1Args, LibraryPaths, SDLName, Arch,
Target,
2595 LibraryPaths, SDLName, Arch,
Target,
2601 static llvm::opt::Arg *
2603 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2607 const llvm::opt::ArgList &Args) {
2608 const unsigned MinCodeObjVer = 4;
2609 const unsigned MaxCodeObjVer = 6;
2612 if (CodeObjArg->getOption().getID() ==
2613 options::OPT_mcode_object_version_EQ) {
2614 unsigned CodeObjVer = MaxCodeObjVer;
2616 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2617 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2618 D.
Diag(diag::err_drv_invalid_int_value)
2619 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2624 if (CodeObjVer == 6)
2625 D.
Diag(diag::warn_drv_amdgpu_cov6);
2631 const llvm::opt::ArgList &Args) {
2632 unsigned CodeObjVer = 4;
2634 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2639 const Driver &D,
const llvm::opt::ArgList &Args) {
2644 const llvm::opt::ArgList &Args,
2645 llvm::opt::ArgStringList &CmdArgs,
2646 const llvm::Triple &Triple,
bool IsLTO,
2647 const StringRef PluginOptPrefix) {
2648 auto addArg = [&, IsLTO](
const Twine &Arg) {
2650 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2651 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2653 CmdArgs.push_back(
"-mllvm");
2654 CmdArgs.push_back(Args.MakeArgString(Arg));
2658 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2659 options::OPT_mno_outline)) {
2660 if (A->getOption().matches(options::OPT_moutline)) {
2664 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2665 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2667 addArg(Twine(
"-enable-machine-outliner"));
2671 addArg(Twine(
"-enable-machine-outliner=never"));
2677 const llvm::opt::ArgList &DriverArgs,
2678 llvm::opt::ArgStringList &CC1Args,
2679 StringRef BitcodeSuffix,
2680 const llvm::Triple &Triple,
2685 std::optional<std::string> LibPath =
2686 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2689 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2690 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2691 for (StringRef Path : Frags)
2692 LibraryPaths.emplace_back(Path.trim());
2697 LibraryPaths.emplace_back(LibPath);
2699 OptSpecifier LibomptargetBCPathOpt =
2700 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2701 : options::OPT_libomptarget_nvptx_bc_path_EQ;
2703 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu" :
"nvptx";
2704 std::string LibOmpTargetName =
2705 (
"libomptarget-" + ArchPrefix +
"-" + BitcodeSuffix +
".bc").str();
2708 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2710 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2711 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2712 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2715 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2716 CC1Args.push_back(
"-mlink-builtin-bitcode");
2717 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2719 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2720 << LibOmpTargetFile;
2723 bool FoundBCLibrary =
false;
2725 for (StringRef LibraryPath : LibraryPaths) {
2727 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2728 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2729 CC1Args.push_back(
"-mlink-builtin-bitcode");
2730 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2731 FoundBCLibrary =
true;
2736 if (!FoundBCLibrary)
2737 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2738 << LibOmpTargetName << ArchPrefix;
2742 const llvm::opt::ArgList &Args,
2743 llvm::opt::ArgStringList &CmdArgs) {
2745 !Args.hasArg(options::OPT_nostdlib) &&
2746 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
2750 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
2757 const llvm::opt::ArgList &Args,
2758 llvm::opt::ArgStringList &CmdArgs,
2759 const llvm::Triple &Triple) {
2760 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
2761 options::OPT_mno_outline_atomics)) {
2763 if (!Triple.isAArch64()) {
2764 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
2765 << Triple.getArchName() << A->getOption().getName();
2767 if (A->getOption().matches(options::OPT_moutline_atomics)) {
2768 CmdArgs.push_back(
"-target-feature");
2769 CmdArgs.push_back(
"+outline-atomics");
2771 CmdArgs.push_back(
"-target-feature");
2772 CmdArgs.push_back(
"-outline-atomics");
2776 CmdArgs.push_back(
"-target-feature");
2777 CmdArgs.push_back(
"+outline-atomics");
2782 llvm::opt::ArgStringList &CmdArgs) {
2783 if (TCArgs.hasFlag(options::OPT_offload_compress,
2784 options::OPT_no_offload_compress,
false))
2785 CmdArgs.push_back(
"-compress");
2786 if (TCArgs.hasArg(options::OPT_v))
2787 CmdArgs.push_back(
"-verbose");
2788 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
2790 TCArgs.MakeArgString(Twine(
"-compression-level=") + Arg->getValue()));
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 llvm::opt::Arg * getAMDGPUCodeObjectArgument(const Driver &D, const llvm::opt::ArgList &Args)
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static void addOpenMPDeviceLibC(const Compilation &C, const ArgList &Args, ArgStringList &CmdArgs)
Adds the '-lcgpu' and '-lmgpu' libraries to the compilation to include the LLVM C library for GPUs.
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 bool SDLSearch(const Driver &D, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
SDLSearch: Search for Static Device Library The search for SDL bitcode files is consistent with how s...
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 void GetSDLFromOffloadArchive(Compilation &C, const Driver &D, const Tool &T, const JobAction &JA, const InputInfoList &Inputs, const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, const SmallVectorImpl< std::string > &LibraryPaths, StringRef Lib, StringRef Arch, StringRef Target, bool isBitCodeSDL)
Search if a user provided archive file lib<libname>.a exists in any of the library paths.
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 bool useFramePointerForTargetByDefault(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
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)
clang::CodeGenOptions::FramePointerKind getFramePointerKind(const llvm::opt::ArgList &Args, const llvm::Triple &Triple)
static std::string getAMDGPUTargetGPU(const llvm::Triple &T, const ArgList &Args)
Get the (LLVM) name of the AMDGPU gpu we are targeting.
static bool mustUseNonLeafFramePointerForTarget(const llvm::Triple &Triple)
static bool shouldIgnoreUnsupportedTargetFeature(const Arg &TargetFeatureArg, llvm::Triple T, StringRef Processor)
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
Defines types useful for describing an Objective-C runtime.
Defines version macros and version-related utility functions for Clang.
__DEVICE__ int min(int __a, int __b)
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
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.
const char * getOffloadingArch() const
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.
llvm::vfs::FileSystem & getVFS() 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...
StringRef getFlangF128MathLibrary() const
DiagnosticsEngine & getDiags() 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
const std::string & getMemtagMode() const
bool hasCrossDsoCfi() const
bool hasMemtagHeap() const
bool needsSafeStackRt() const
bool requiresMinimalRuntime() const
bool hasMemtagStack() const
bool needsDfsanRt() const
bool needsScudoRt() 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)
The JSON file list parser is used to communicate input to InstallAPI.
llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, llvm::StringRef OffloadArch)
Get processor name from target ID.
const FunctionProtoType * T
static constexpr ResponseFileSupport AtFileCurCP()