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"
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())
422 if (II.isFilename()) {
423 CmdArgs.push_back(II.getFilename());
432 const Arg &A = II.getInputArg();
435 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
437 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
440 A.renderAsInput(Args, CmdArgs);
445 const ToolChain &TC,
const llvm::opt::ArgList &Args,
446 llvm::opt::ArgStringList &CmdArgs) {
452 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
453 StringRef
V = A->getValue();
454 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
455 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
457 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
458 << A->getSpelling() <<
V;
463 std::vector<StringRef> &Features,
464 OptSpecifier OnOpt, OptSpecifier OffOpt,
465 StringRef FeatureName) {
466 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
467 if (A->getOption().matches(OnOpt))
468 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
470 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
476 const ArgList &Args) {
477 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
478 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
480 return llvm::StringSwitch<std::string>(GPUName)
481 .Cases(
"rv630",
"rv635",
"r600")
482 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
483 .Case(
"rv740",
"rv770")
484 .Case(
"palm",
"cedar")
485 .Cases(
"sumo",
"sumo2",
"sumo")
486 .Case(
"hemlock",
"cypress")
487 .Case(
"aruba",
"cayman")
488 .Default(GPUName.str());
496 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
497 return A->getValue();
505 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
506 StringRef CPU = A->getValue();
512 return llvm::sys::getHostCPUName();
522 const llvm::Triple &
T,
bool FromAs) {
525 switch (
T.getArch()) {
529 case llvm::Triple::aarch64:
530 case llvm::Triple::aarch64_32:
531 case llvm::Triple::aarch64_be:
534 case llvm::Triple::arm:
535 case llvm::Triple::armeb:
536 case llvm::Triple::thumb:
537 case llvm::Triple::thumbeb: {
538 StringRef MArch, MCPU;
543 case llvm::Triple::avr:
544 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
545 return A->getValue();
548 case llvm::Triple::m68k:
551 case llvm::Triple::mips:
552 case llvm::Triple::mipsel:
553 case llvm::Triple::mips64:
554 case llvm::Triple::mips64el: {
558 return std::string(CPUName);
561 case llvm::Triple::nvptx:
562 case llvm::Triple::nvptx64:
563 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
564 return A->getValue();
567 case llvm::Triple::ppc:
568 case llvm::Triple::ppcle:
569 case llvm::Triple::ppc64:
570 case llvm::Triple::ppc64le:
573 case llvm::Triple::csky:
574 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
575 return A->getValue();
576 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
577 return A->getValue();
580 case llvm::Triple::riscv32:
581 case llvm::Triple::riscv64:
584 case llvm::Triple::bpfel:
585 case llvm::Triple::bpfeb:
586 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
587 return A->getValue();
590 case llvm::Triple::sparc:
591 case llvm::Triple::sparcel:
592 case llvm::Triple::sparcv9:
595 case llvm::Triple::x86:
596 case llvm::Triple::x86_64:
599 case llvm::Triple::hexagon:
603 case llvm::Triple::lanai:
606 case llvm::Triple::systemz:
609 case llvm::Triple::r600:
610 case llvm::Triple::amdgcn:
613 case llvm::Triple::wasm32:
614 case llvm::Triple::wasm64:
617 case llvm::Triple::loongarch32:
618 case llvm::Triple::loongarch64:
624 const llvm::Triple &Triple,
626 std::vector<StringRef> &Features) {
628 options::OPT_m_wasm_Features_Group);
632 const ArgList &Args, ArgStringList &CmdArgs,
633 bool ForAS,
bool IsAux) {
634 std::vector<StringRef> Features;
635 switch (Triple.getArch()) {
638 case llvm::Triple::mips:
639 case llvm::Triple::mipsel:
640 case llvm::Triple::mips64:
641 case llvm::Triple::mips64el:
644 case llvm::Triple::arm:
645 case llvm::Triple::armeb:
646 case llvm::Triple::thumb:
647 case llvm::Triple::thumbeb:
650 case llvm::Triple::ppc:
651 case llvm::Triple::ppcle:
652 case llvm::Triple::ppc64:
653 case llvm::Triple::ppc64le:
656 case llvm::Triple::riscv32:
657 case llvm::Triple::riscv64:
660 case llvm::Triple::systemz:
663 case llvm::Triple::aarch64:
664 case llvm::Triple::aarch64_32:
665 case llvm::Triple::aarch64_be:
668 case llvm::Triple::x86:
669 case llvm::Triple::x86_64:
672 case llvm::Triple::hexagon:
675 case llvm::Triple::wasm32:
676 case llvm::Triple::wasm64:
679 case llvm::Triple::sparc:
680 case llvm::Triple::sparcel:
681 case llvm::Triple::sparcv9:
684 case llvm::Triple::r600:
685 case llvm::Triple::amdgcn:
688 case llvm::Triple::nvptx:
689 case llvm::Triple::nvptx64:
692 case llvm::Triple::m68k:
695 case llvm::Triple::msp430:
698 case llvm::Triple::ve:
701 case llvm::Triple::csky:
704 case llvm::Triple::loongarch32:
705 case llvm::Triple::loongarch64:
711 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
712 CmdArgs.push_back(Feature.data());
717 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
720 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
721 D.
Diag(diag::err_drv_invalid_int_value)
722 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
723 return LtoJobsArg->getValue();
728 return Triple.isPS();
732 const llvm::opt::ArgList &Args) {
734 Arg *A = Args.getLastArg(options::OPT_mtls_dialect_EQ);
736 return Triple.hasDefaultTLSDESC();
737 StringRef
V = A->getValue();
738 bool SupportedArgument =
false, EnableTLSDESC =
false;
739 bool Unsupported = !Triple.isOSBinFormatELF();
740 if (Triple.isLoongArch() || Triple.isRISCV()) {
741 SupportedArgument =
V ==
"desc" ||
V ==
"trad";
742 EnableTLSDESC =
V ==
"desc";
743 }
else if (Triple.isX86()) {
744 SupportedArgument =
V ==
"gnu" ||
V ==
"gnu2";
745 EnableTLSDESC =
V ==
"gnu2";
750 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
751 << A->getSpelling() << Triple.getTriple();
752 }
else if (!SupportedArgument) {
753 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument_for_target)
754 << A->getSpelling() <<
V << Triple.getTriple();
756 return EnableTLSDESC;
760 ArgStringList &CmdArgs,
const InputInfo &Output,
761 const InputInfo &Input,
bool IsThinLTO) {
763 const bool IsOSAIX = Triple.isOSAIX();
764 const bool IsAMDGCN = Triple.isAMDGCN();
767 const bool IsFatLTO = Args.hasArg(options::OPT_ffat_lto_objects);
768 const bool IsUnifiedLTO = Args.hasArg(options::OPT_funified_lto);
769 if (llvm::sys::path::filename(Linker) !=
"ld.lld" &&
770 llvm::sys::path::stem(Linker) !=
"ld.lld" && !Triple.isOSOpenBSD()) {
774 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
775 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
778 CmdArgs.push_back(
"-plugin");
781 const char *Suffix =
".dll";
782#elif defined(__APPLE__)
783 const char *Suffix =
".dylib";
785 const char *Suffix =
".so";
789 llvm::sys::path::native(Twine(D.
Dir) +
790 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
793 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
798 CmdArgs.push_back(
"--fat-lto-objects");
801 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
802 const char *ExtraDash = IsOSAIX ?
"-" :
"";
803 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
808 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
809 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
810 "-generate-arange-section"));
814 Arg *ArgVecLib = Args.getLastArg(options::OPT_fveclib);
815 if (ArgVecLib && ArgVecLib->getNumValues() == 1) {
818 std::optional<StringRef> OptVal =
819 llvm::StringSwitch<std::optional<StringRef>>(ArgVecLib->getValue())
820 .Case(
"Accelerate",
"Accelerate")
821 .Case(
"LIBMVEC",
"LIBMVEC-X86")
822 .Case(
"MASSV",
"MASSV")
823 .Case(
"SVML",
"SVML")
824 .Case(
"SLEEF",
"sleefgnuabi")
825 .Case(
"Darwin_libsystem_m",
"Darwin_libsystem_m")
826 .Case(
"ArmPL",
"ArmPL")
827 .Case(
"none",
"none")
828 .Default(std::nullopt);
831 CmdArgs.push_back(Args.MakeArgString(
832 Twine(PluginOptPrefix) +
"-vector-library=" + OptVal.value()));
839 std::string CPU =
getCPUName(D, Args, Triple);
842 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
844 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
848 if (A->getOption().matches(options::OPT_O4) ||
849 A->getOption().matches(options::OPT_Ofast))
851 else if (A->getOption().matches(options::OPT_O)) {
852 OOpt = A->getValue();
855 else if (OOpt ==
"s" || OOpt ==
"z")
857 }
else if (A->getOption().matches(options::OPT_O0))
861 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"O" + OOpt));
863 CmdArgs.push_back(Args.MakeArgString(Twine(
"--lto-CGO") + OOpt));
867 if (Args.hasArg(options::OPT_gsplit_dwarf))
868 CmdArgs.push_back(Args.MakeArgString(
869 Twine(PluginOptPrefix) +
"dwo_dir=" + Output.
getFilename() +
"_dwo"));
871 if (IsThinLTO && !IsOSAIX)
872 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
873 else if (IsThinLTO && IsOSAIX)
874 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
879 if ((IsThinLTO || IsFatLTO || IsUnifiedLTO) &&
880 Args.hasArg(options::OPT_fenable_matrix))
882 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
885 if (!Parallelism.empty())
886 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
887 ParallelismOpt + Parallelism));
890 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
891 options::OPT_fno_global_isel)) {
894 CmdArgs.push_back(Args.MakeArgString(
895 Twine(PluginOptPrefix) +
"-global-isel=" +
896 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
901 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
902 if (A->getOption().matches(options::OPT_glldb))
904 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
905 else if (A->getOption().matches(options::OPT_gsce))
907 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
908 else if (A->getOption().matches(options::OPT_gdbx))
910 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
913 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
919 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
923 Arg *A = Args.getLastArg(options::OPT_g_Group);
924 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
925 !A->getOption().matches(options::OPT_ggdb0);
926 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
927 options::OPT_gno_strict_dwarf,
true))
929 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
931 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
932 StringRef
V = A->getValue();
933 if (
V ==
"vec-default")
935 if (
V ==
"vec-extabi") {
937 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
943 bool UseSeparateSections =
946 if (Args.hasFlag(options::OPT_ffunction_sections,
947 options::OPT_fno_function_sections, UseSeparateSections))
949 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
950 else if (Args.hasArg(options::OPT_fno_function_sections))
952 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
954 bool DataSectionsTurnedOff =
false;
955 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
956 UseSeparateSections)) {
958 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
959 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
960 DataSectionsTurnedOff =
true;
962 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
965 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
966 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
967 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
968 options::OPT_mno_xcoff_roptr,
false);
969 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
971 D.
Diag(diag::err_drv_unsupported_opt_for_target)
972 << OptStr << Triple.str();
978 if (DataSectionsTurnedOff)
979 D.
Diag(diag::err_roptr_requires_data_sections);
982 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
987 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
988 options::OPT_fno_split_machine_functions)) {
989 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
990 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
991 "-split-machine-functions"));
995 StringRef FName = A->getValue();
996 if (!llvm::sys::fs::exists(FName))
997 D.
Diag(diag::err_drv_no_such_file) << FName;
999 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1000 "sample-profile=" + FName));
1004 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1005 "cs-profile-generate"));
1006 if (CSPGOGenerateArg->getOption().matches(
1007 options::OPT_fcs_profile_generate_EQ)) {
1009 llvm::sys::path::append(Path,
"default_%m.profraw");
1010 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1011 "cs-profile-path=" + Path));
1014 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1015 "cs-profile-path=default_%m.profraw"));
1018 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
1019 if (Path.empty() || llvm::sys::fs::is_directory(Path))
1020 llvm::sys::path::append(Path,
"default.profdata");
1021 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
1022 "cs-profile-path=" + Path));
1026 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
1028 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
1029 "-enable-jmc-instrument"));
1031 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
1034 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
1035 Triple.hasDefaultEmulatedTLS())) {
1037 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
1041 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-tlsdesc"));
1043 if (Args.hasFlag(options::OPT_fstack_size_section,
1044 options::OPT_fno_stack_size_section,
false))
1046 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
1050 if (!StatsFile.empty())
1052 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1055 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1056 CmdArgs.push_back(Args.MakeArgString(
1057 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1068 Output, PluginOptPrefix);
1074 true, PluginOptPrefix);
1080 ArgStringList &CmdArgs) {
1081 if (Args.hasArg(options::OPT_nogpulib) || Args.hasArg(options::OPT_nolibc))
1087 llvm::sys::path::append(LibCDecls,
"include",
"llvm_libc_wrappers",
1089 bool HasLibC = llvm::sys::fs::exists(LibCDecls) &&
1090 llvm::sys::fs::is_directory(LibCDecls);
1091 if (!Args.hasFlag(options::OPT_gpulibc, options::OPT_nogpulibc, HasLibC))
1096 for (
auto TI = TCRange.first, TE = TCRange.second; TI != TE; ++TI)
1097 ToolChains.push_back(TI->second);
1099 if (llvm::any_of(ToolChains, [](
const ToolChain *TC) {
1102 CmdArgs.push_back(
"-lcgpu-amdgpu");
1103 CmdArgs.push_back(
"-lmgpu-amdgpu");
1105 if (llvm::any_of(ToolChains, [](
const ToolChain *TC) {
1108 CmdArgs.push_back(
"-lcgpu-nvptx");
1109 CmdArgs.push_back(
"-lmgpu-nvptx");
1114 const ArgList &Args,
1115 ArgStringList &CmdArgs) {
1120 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1121 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1125 ArgStringList &CmdArgs) {
1126 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1127 options::OPT_fno_rtlib_add_rpath,
false))
1132 CandidateRPaths.emplace_back(*CandidateRPath);
1134 for (
const auto &CandidateRPath : CandidateRPaths) {
1135 if (TC.
getVFS().exists(CandidateRPath)) {
1136 CmdArgs.push_back(
"-rpath");
1137 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1143 const ToolChain &TC,
const ArgList &Args,
1144 bool ForceStaticHostRuntime,
bool IsOffloadingHost,
1146 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1147 options::OPT_fno_openmp,
false))
1156 if (ForceStaticHostRuntime)
1157 CmdArgs.push_back(
"-Bstatic");
1161 CmdArgs.push_back(
"-lomp");
1164 CmdArgs.push_back(
"-lgomp");
1167 CmdArgs.push_back(
"-liomp5");
1173 if (ForceStaticHostRuntime)
1174 CmdArgs.push_back(
"-Bdynamic");
1177 CmdArgs.push_back(
"-lrt");
1179 if (IsOffloadingHost)
1180 CmdArgs.push_back(
"-lomptarget");
1182 if (IsOffloadingHost && !Args.hasArg(options::OPT_nogpulib))
1183 CmdArgs.push_back(
"-lomptarget.devicertl");
1185 if (IsOffloadingHost)
1196 llvm::opt::ArgStringList &CmdArgs) {
1201 if (!TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1203 F128LibName.consume_front_insensitive(
"lib");
1204 if (!F128LibName.empty()) {
1205 bool AsNeeded = !TC.
getTriple().isOSAIX();
1206 CmdArgs.push_back(
"-lFortranFloat128Math");
1209 CmdArgs.push_back(Args.MakeArgString(
"-l" + F128LibName));
1213 CmdArgs.push_back(
"-lFortranRuntime");
1214 CmdArgs.push_back(
"-lFortranDecimal");
1219 const llvm::opt::ArgList &Args,
1220 ArgStringList &CmdArgs) {
1227 llvm::sys::path::append(DefaultLibPath,
"lib");
1228 if (TC.
getTriple().isKnownWindowsMSVCEnvironment())
1229 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + DefaultLibPath));
1231 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1235 ArgStringList &CmdArgs, StringRef Sanitizer,
1236 bool IsShared,
bool IsWhole) {
1239 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1242 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1252 ArgStringList &CmdArgs,
1253 StringRef Sanitizer) {
1258 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1261 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1262 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1269 const llvm::opt::ArgList &Args,
1270 llvm::opt::ArgStringList &CmdArgs,
1273 "AIX linker does not support any form of --as-needed option yet.");
1281 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1282 CmdArgs.push_back(
"-z");
1283 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1285 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1290 const llvm::opt::ArgList &Args,
1291 ArgStringList &CmdArgs) {
1296 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1298 CmdArgs.push_back(
"-lpthread");
1300 CmdArgs.push_back(
"-lrt");
1302 CmdArgs.push_back(
"-lm");
1306 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1307 CmdArgs.push_back(
"-ldl");
1312 CmdArgs.push_back(
"-lexecinfo");
1318 CmdArgs.push_back(
"-lresolv");
1332 SharedRuntimes.push_back(
"asan");
1333 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1334 HelperStaticRuntimes.push_back(
"asan-preinit");
1337 SharedRuntimes.push_back(
"memprof");
1338 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1339 HelperStaticRuntimes.push_back(
"memprof-preinit");
1343 SharedRuntimes.push_back(
"ubsan_minimal");
1345 SharedRuntimes.push_back(
"ubsan_standalone");
1348 SharedRuntimes.push_back(
"scudo_standalone");
1351 SharedRuntimes.push_back(
"tsan");
1354 SharedRuntimes.push_back(
"hwasan_aliases");
1356 SharedRuntimes.push_back(
"hwasan");
1357 if (!Args.hasArg(options::OPT_shared))
1358 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1364 StaticRuntimes.push_back(
"stats_client");
1368 HelperStaticRuntimes.push_back(
"asan_static");
1371 if (Args.hasArg(options::OPT_shared)) {
1380 StaticRuntimes.push_back(
"asan");
1382 StaticRuntimes.push_back(
"asan_cxx");
1386 StaticRuntimes.push_back(
"memprof");
1388 StaticRuntimes.push_back(
"memprof_cxx");
1393 StaticRuntimes.push_back(
"hwasan_aliases");
1395 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1397 StaticRuntimes.push_back(
"hwasan");
1399 StaticRuntimes.push_back(
"hwasan_cxx");
1403 StaticRuntimes.push_back(
"dfsan");
1405 StaticRuntimes.push_back(
"lsan");
1407 StaticRuntimes.push_back(
"msan");
1409 StaticRuntimes.push_back(
"msan_cxx");
1412 StaticRuntimes.push_back(
"tsan");
1414 StaticRuntimes.push_back(
"tsan_cxx");
1418 StaticRuntimes.push_back(
"ubsan_minimal");
1420 StaticRuntimes.push_back(
"ubsan_standalone");
1422 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1426 NonWholeStaticRuntimes.push_back(
"safestack");
1427 RequiredSymbols.push_back(
"__safestack_init");
1431 StaticRuntimes.push_back(
"cfi");
1433 StaticRuntimes.push_back(
"cfi_diag");
1435 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1439 NonWholeStaticRuntimes.push_back(
"stats");
1440 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1443 StaticRuntimes.push_back(
"scudo_standalone");
1445 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1452 ArgStringList &CmdArgs) {
1455 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1458 NonWholeStaticRuntimes, HelperStaticRuntimes,
1464 !Args.hasArg(options::OPT_shared)) {
1470 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
1471 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1472 !Args.hasArg(options::OPT_static);
1473 if (OnlyLibstdcxxStatic)
1474 CmdArgs.push_back(
"-Bstatic");
1476 if (OnlyLibstdcxxStatic)
1477 CmdArgs.push_back(
"-Bdynamic");
1481 for (
auto RT : SharedRuntimes)
1483 for (
auto RT : HelperStaticRuntimes)
1485 bool AddExportDynamic =
false;
1486 for (
auto RT : StaticRuntimes) {
1490 for (
auto RT : NonWholeStaticRuntimes) {
1494 for (
auto S : RequiredSymbols) {
1495 CmdArgs.push_back(
"-u");
1496 CmdArgs.push_back(Args.MakeArgString(S));
1500 if (AddExportDynamic)
1501 CmdArgs.push_back(
"--export-dynamic");
1504 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1508 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1509 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1512 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1514 CmdArgs.push_back(
"--android-memtag-heap");
1516 CmdArgs.push_back(
"--android-memtag-stack");
1519 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1523 if (Args.hasArg(options::OPT_shared))
1527 CmdArgs.push_back(
"--whole-archive");
1531 CmdArgs.push_back(
"--no-whole-archive");
1539 const llvm::opt::ArgList &Args,
1540 ArgStringList &CmdArgs) {
1542 CmdArgs.push_back(
"-lpthread");
1544 CmdArgs.push_back(
"-lrt");
1545 CmdArgs.push_back(
"-lm");
1550 CmdArgs.push_back(
"-ldl");
1555 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1556 return !A->getOption().matches(options::OPT_O0);
1564 auto AddPostfix = [JA](
auto &F) {
1569 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1570 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1574 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1577 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1578 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1579 T = FinalOutput->getValue();
1580 llvm::sys::path::remove_filename(
T);
1581 llvm::sys::path::append(
T,
1582 llvm::sys::path::stem(FinalOutput->getValue()));
1584 return Args.MakeArgString(
T);
1590 return Args.MakeArgString(
T);
1594 const JobAction &JA,
const ArgList &Args,
1595 const InputInfo &Output,
const char *OutFile) {
1596 ArgStringList ExtractArgs;
1597 ExtractArgs.push_back(
"--extract-dwo");
1599 ArgStringList StripArgs;
1600 StripArgs.push_back(
"--strip-dwo");
1605 ExtractArgs.push_back(OutFile);
1612 C.addCommand(std::make_unique<Command>(JA,
T,
1614 Exec, ExtractArgs, II, Output));
1617 C.addCommand(std::make_unique<Command>(
1627 Args.ClaimAllArgs(options::OPT_flto_EQ);
1628 Args.ClaimAllArgs(options::OPT_flto);
1629 Args.ClaimAllArgs(options::OPT_fno_lto);
1633 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1634 options::OPT_fcs_profile_generate_EQ,
1635 options::OPT_fno_profile_generate);
1636 if (CSPGOGenerateArg &&
1637 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1638 CSPGOGenerateArg =
nullptr;
1640 return CSPGOGenerateArg;
1644 auto *ProfileUseArg = Args.getLastArg(
1645 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1646 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1647 options::OPT_fno_profile_instr_use);
1649 if (ProfileUseArg &&
1650 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1651 ProfileUseArg =
nullptr;
1653 return ProfileUseArg;
1657 auto *ProfileSampleUseArg = Args.getLastArg(
1658 options::OPT_fprofile_sample_use, options::OPT_fprofile_sample_use_EQ,
1659 options::OPT_fauto_profile, options::OPT_fauto_profile_EQ,
1660 options::OPT_fno_profile_sample_use, options::OPT_fno_auto_profile);
1662 if (ProfileSampleUseArg &&
1663 (ProfileSampleUseArg->getOption().matches(
1664 options::OPT_fno_profile_sample_use) ||
1665 ProfileSampleUseArg->getOption().matches(options::OPT_fno_auto_profile)))
1668 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ,
1669 options::OPT_fauto_profile_EQ);
1674 case llvm::Reloc::Static:
1676 case llvm::Reloc::PIC_:
1678 case llvm::Reloc::DynamicNoPIC:
1679 return "dynamic-no-pic";
1680 case llvm::Reloc::ROPI:
1682 case llvm::Reloc::RWPI:
1684 case llvm::Reloc::ROPI_RWPI:
1687 llvm_unreachable(
"Unknown Reloc::Model kind");
1694std::tuple<llvm::Reloc::Model, unsigned, bool>
1702 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1704 bool IsPICLevelTwo = PIC;
1707 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1710 if (Triple.isAndroid()) {
1711 switch (Triple.getArch()) {
1712 case llvm::Triple::arm:
1713 case llvm::Triple::armeb:
1714 case llvm::Triple::thumb:
1715 case llvm::Triple::thumbeb:
1716 case llvm::Triple::aarch64:
1717 case llvm::Triple::mips:
1718 case llvm::Triple::mipsel:
1719 case llvm::Triple::mips64:
1720 case llvm::Triple::mips64el:
1724 case llvm::Triple::x86:
1725 case llvm::Triple::x86_64:
1727 IsPICLevelTwo =
true;
1736 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
1740 if (Triple.isOSOpenBSD()) {
1742 case llvm::Triple::arm:
1743 case llvm::Triple::aarch64:
1744 case llvm::Triple::mips64:
1745 case llvm::Triple::mips64el:
1746 case llvm::Triple::x86:
1747 case llvm::Triple::x86_64:
1748 IsPICLevelTwo =
false;
1751 case llvm::Triple::ppc:
1752 case llvm::Triple::sparcv9:
1753 IsPICLevelTwo =
true;
1765 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1766 options::OPT_fpic, options::OPT_fno_pic,
1767 options::OPT_fPIE, options::OPT_fno_PIE,
1768 options::OPT_fpie, options::OPT_fno_pie);
1769 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
1770 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
1771 options::OPT_fPIE, options::OPT_fpie)) {
1773 << LastPICArg->getSpelling() << Triple.str();
1774 if (Triple.getArch() == llvm::Triple::x86_64)
1775 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
1776 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1783 Option O = LastPICArg->getOption();
1784 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1785 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1786 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1788 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1790 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
1793 if (EffectiveTriple.isPS()) {
1794 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
1795 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
1796 if (Model !=
"kernel") {
1799 << LastPICArg->getSpelling()
1800 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
1810 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
1816 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
1817 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
1820 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1823 if (!Triple.isOSDarwin())
1825 << A->getSpelling() << Triple.str();
1834 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
1837 bool EmbeddedPISupported;
1838 switch (Triple.getArch()) {
1839 case llvm::Triple::arm:
1840 case llvm::Triple::armeb:
1841 case llvm::Triple::thumb:
1842 case llvm::Triple::thumbeb:
1843 EmbeddedPISupported =
true;
1846 EmbeddedPISupported =
false;
1850 bool ROPI =
false, RWPI =
false;
1851 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
1852 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
1853 if (!EmbeddedPISupported)
1855 << LastROPIArg->getSpelling() << Triple.str();
1858 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
1859 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
1860 if (!EmbeddedPISupported)
1862 << LastRWPIArg->getSpelling() << Triple.str();
1867 if ((ROPI || RWPI) && (PIC || PIE))
1870 if (Triple.isMIPS()) {
1877 if (ABIName ==
"n64")
1880 if(Args.hasArg(options::OPT_mno_abicalls))
1881 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1884 IsPICLevelTwo =
false;
1888 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
1890 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
1892 RelocM = llvm::Reloc::ROPI_RWPI;
1894 RelocM = llvm::Reloc::ROPI;
1896 RelocM = llvm::Reloc::RWPI;
1898 return std::make_tuple(RelocM, 0
U,
false);
1918 const ArgList &Args) {
1919 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
1920 options::OPT_falign_functions_EQ,
1921 options::OPT_fno_align_functions);
1922 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
1925 if (A->getOption().matches(options::OPT_falign_functions))
1929 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
1931 << A->getAsString(Args) << A->getValue();
1936 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
1937 switch (DebugInfoKind) {
1938 case llvm::codegenoptions::DebugDirectivesOnly:
1939 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
1941 case llvm::codegenoptions::DebugLineTablesOnly:
1942 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
1944 case llvm::codegenoptions::DebugInfoConstructor:
1945 CmdArgs.push_back(
"-debug-info-kind=constructor");
1947 case llvm::codegenoptions::LimitedDebugInfo:
1948 CmdArgs.push_back(
"-debug-info-kind=limited");
1950 case llvm::codegenoptions::FullDebugInfo:
1951 CmdArgs.push_back(
"-debug-info-kind=standalone");
1953 case llvm::codegenoptions::UnusedTypeInfo:
1954 CmdArgs.push_back(
"-debug-info-kind=unused-types");
1964 assert(A.getOption().matches(options::OPT_gN_Group) &&
1965 "Not a -g option that specifies a debug-info level");
1966 if (A.getOption().matches(options::OPT_g0) ||
1967 A.getOption().matches(options::OPT_ggdb0))
1968 return llvm::codegenoptions::NoDebugInfo;
1969 if (A.getOption().matches(options::OPT_gline_tables_only) ||
1970 A.getOption().matches(options::OPT_ggdb1))
1971 return llvm::codegenoptions::DebugLineTablesOnly;
1972 if (A.getOption().matches(options::OPT_gline_directives_only))
1973 return llvm::codegenoptions::DebugDirectivesOnly;
1974 return llvm::codegenoptions::DebugInfoConstructor;
1978 const ArgList &Args) {
1979 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
1985 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 5 ||
1988 << A->getAsString(Args) << A->getValue();
1993 return llvm::StringSwitch<unsigned>(ArgValue)
1994 .Case(
"-gdwarf-2", 2)
1995 .Case(
"-gdwarf-3", 3)
1996 .Case(
"-gdwarf-4", 4)
1997 .Case(
"-gdwarf-5", 5)
2002 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
2003 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
2004 options::OPT_gdwarf);
2008 const llvm::opt::ArgList &Args) {
2013 if (DwarfVersion == 5 && TC.
getTriple().isOSAIX())
2014 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
2015 << GDwarfN->getSpelling() << TC.
getTriple().str();
2017 if (DwarfVersion == 0) {
2019 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
2021 return DwarfVersion;
2025 ArgStringList &CmdArgs) {
2026 llvm::Reloc::Model RelocationModel;
2031 if (RelocationModel != llvm::Reloc::Static)
2032 CmdArgs.push_back(
"-KPIC");
2038 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
2044 const ArgList &Args) {
2045 if (Args.hasArg(options::OPT_static_libgcc) ||
2046 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2050 if (Args.hasArg(options::OPT_shared_libgcc))
2069 ArgStringList &CmdArgs,
const ArgList &Args) {
2073 CmdArgs.push_back(
"-l:libunwind.a");
2096 CmdArgs.push_back(
"-lgcc_eh");
2098 CmdArgs.push_back(
"-lgcc_s");
2106 CmdArgs.push_back(
"-lunwind");
2108 CmdArgs.push_back(
"-l:libunwind.a");
2111 CmdArgs.push_back(
"-l:libunwind.dll.a");
2113 CmdArgs.push_back(
"-l:libunwind.so");
2117 CmdArgs.push_back(
"-lunwind");
2127 ArgStringList &CmdArgs,
const ArgList &Args) {
2131 CmdArgs.push_back(
"-lgcc");
2135 CmdArgs.push_back(
"-lgcc");
2139 ArgStringList &CmdArgs,
const ArgList &Args) {
2150 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2153 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2154 if (A && A->getValue() != StringRef(
"platform")) {
2155 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2156 << A->getValue() <<
"MSVC";
2166 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2167 !Args.hasArg(options::OPT_static_pie))
2168 CmdArgs.push_back(
"-ldl");
2175 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2181 StringRef SaveStats = A->getValue();
2182 if (SaveStats ==
"obj" && Output.
isFilename()) {
2184 llvm::sys::path::remove_filename(StatsFile);
2185 }
else if (SaveStats !=
"cwd") {
2186 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2190 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2191 llvm::sys::path::append(StatsFile, BaseName);
2192 llvm::sys::path::replace_extension(StatsFile,
"stats");
2204 assert(Flag.front() ==
'-');
2206 Flags.push_back(Flag.str());
2208 Flags.push_back((
"!" + Flag.substr(1)).str());
2213 ArgStringList &CmdArgs,
bool IsLTO,
2214 const StringRef PluginOptPrefix) {
2215 auto addArg = [&, IsLTO](
const Twine &Arg) {
2217 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2218 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2220 CmdArgs.push_back(
"-mllvm");
2221 CmdArgs.push_back(Args.MakeArgString(Arg));
2225 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2226 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2228 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2229 StringRef
Value = A->getValue();
2231 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2232 !llvm::isPowerOf2_64(Boundary)) {
2233 D.
Diag(diag::err_drv_invalid_argument_to_option)
2234 <<
Value << A->getOption().getName();
2236 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2239 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2240 std::string AlignBranch;
2241 for (StringRef
T : A->getValues()) {
2242 if (
T !=
"fused" &&
T !=
"jcc" &&
T !=
"jmp" &&
T !=
"call" &&
2243 T !=
"ret" &&
T !=
"indirect")
2244 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2245 <<
T <<
"fused, jcc, jmp, call, ret, indirect";
2246 if (!AlignBranch.empty())
2250 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2252 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2253 StringRef
Value = A->getValue();
2254 unsigned PrefixSize;
2255 if (
Value.getAsInteger(10, PrefixSize)) {
2256 D.
Diag(diag::err_drv_invalid_argument_to_option)
2257 <<
Value << A->getOption().getName();
2259 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2285 llvm::opt::ArgStringList &CC1Args,
2287 StringRef Lib, StringRef Arch, StringRef
Target,
2288 bool isBitCodeSDL) {
2291 std::string LibDeviceLoc =
"/libdevice";
2292 std::string LibBcPrefix =
"/libbc-";
2293 std::string LibPrefix =
"/lib";
2310 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2311 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2313 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2314 Twine(Lib +
"-" + Arch).str(), Twine(Lib).str()}) {
2315 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2316 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2326 const auto *Ext =
".a";
2328 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2329 Twine(Lib +
"-" + Arch).str()}) {
2330 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2331 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2342 bool FoundSDL =
false;
2343 for (
auto LPath : LibraryPaths) {
2344 for (
auto SDL : SDLs) {
2345 auto FullName = Twine(LPath + SDL).str();
2346 if (llvm::sys::fs::exists(FullName)) {
2347 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2364 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2365 llvm::opt::ArgStringList &CC1Args,
2367 StringRef Arch, StringRef
Target,
bool isBitCodeSDL) {
2370 if (isBitCodeSDL && Arch.contains(
"nvptx"))
2373 bool FoundAOB =
false;
2374 std::string ArchiveOfBundles;
2377 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2378 auto Ext = IsMSVC ?
".lib" :
".a";
2379 if (!Lib.starts_with(
":") && !Lib.starts_with(
"-l")) {
2380 if (llvm::sys::fs::exists(Lib)) {
2381 ArchiveOfBundles = Lib;
2385 Lib.consume_front(
"-l");
2386 for (
auto LPath : LibraryPaths) {
2387 ArchiveOfBundles.clear();
2388 auto LibFile = (Lib.starts_with(
":") ? Lib.drop_front()
2389 : IsMSVC ? Lib + Ext
2390 :
"lib" + Lib + Ext)
2392 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2393 auto AOB = Twine(LPath + Prefix + LibFile).str();
2394 if (llvm::sys::fs::exists(AOB)) {
2395 ArchiveOfBundles = AOB;
2408 llvm::file_magic Magic;
2409 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2410 if (EC || Magic != llvm::file_magic::archive)
2413 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2414 std::string OutputLib =
2420 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2422 ArgStringList CmdArgs;
2425 DeviceTriple +=
'-';
2426 std::string NormalizedTriple =
T.getToolChain().getTriple().normalize();
2427 DeviceTriple += NormalizedTriple;
2429 DeviceTriple +=
'-';
2433 std::string UnbundleArg(
"-unbundle");
2434 std::string TypeArg(
"-type=a");
2435 std::string InputArg(
"-input=" + ArchiveOfBundles);
2436 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2437 std::string OutputArg(
"-output=" + OutputLib);
2439 const char *UBProgram = DriverArgs.MakeArgString(
2440 T.getToolChain().GetProgramPath(
"clang-offload-bundler"));
2442 ArgStringList UBArgs;
2443 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2444 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2445 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2446 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2447 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2451 std::string AdditionalArgs(
"-allow-missing-bundles");
2452 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2457 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2458 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2460 C.addCommand(std::make_unique<Command>(
2462 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2464 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2473 const llvm::opt::ArgList &DriverArgs,
2474 llvm::opt::ArgStringList &CC1Args,
2475 StringRef Arch, StringRef
Target,
2476 bool isBitCodeSDL) {
2478 Arch,
Target, isBitCodeSDL);
2507 const llvm::opt::ArgList &DriverArgs,
2508 llvm::opt::ArgStringList &CC1Args,
2509 StringRef Arch, StringRef
Target,
2510 bool isBitCodeSDL) {
2514 std::optional<std::string> LibPath =
2515 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2518 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2519 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2520 for (StringRef Path : Frags)
2521 LibraryPaths.emplace_back(Path.trim());
2525 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2526 LibraryPaths.emplace_back(Search_Dir);
2530 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2531 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2534 llvm::SmallSet<std::string, 16> SDLNames;
2535 static const StringRef HostOnlyArchives[] = {
2536 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2537 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2538 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2539 SDLNames.insert(std::string(
"-l") + SDLName);
2543 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2550 const StringRef LibFileExt =
".lib";
2551 if (!llvm::sys::path::has_extension(
FileName) ||
2553 llvm::sys::path::extension(
FileName).drop_front()) ==
2555 llvm::sys::path::extension(
FileName) == LibFileExt)
2556 SDLNames.insert(Input);
2563 for (
auto SDLName : SDLNames) {
2565 if (!
SDLSearch(D, DriverArgs, CC1Args, LibraryPaths, SDLName, Arch,
Target,
2568 LibraryPaths, SDLName, Arch,
Target,
2574static llvm::opt::Arg *
2576 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2580 const llvm::opt::ArgList &Args) {
2581 const unsigned MinCodeObjVer = 4;
2582 const unsigned MaxCodeObjVer = 6;
2585 if (CodeObjArg->getOption().getID() ==
2586 options::OPT_mcode_object_version_EQ) {
2587 unsigned CodeObjVer = MaxCodeObjVer;
2589 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2590 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2591 D.
Diag(diag::err_drv_invalid_int_value)
2592 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2597 if (CodeObjVer == 6)
2598 D.
Diag(diag::warn_drv_amdgpu_cov6);
2604 const llvm::opt::ArgList &Args) {
2605 unsigned CodeObjVer = 4;
2607 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2612 const Driver &D,
const llvm::opt::ArgList &Args) {
2617 const llvm::opt::ArgList &Args,
2618 llvm::opt::ArgStringList &CmdArgs,
2619 const llvm::Triple &Triple,
bool IsLTO,
2620 const StringRef PluginOptPrefix) {
2621 auto addArg = [&, IsLTO](
const Twine &Arg) {
2623 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2624 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2626 CmdArgs.push_back(
"-mllvm");
2627 CmdArgs.push_back(Args.MakeArgString(Arg));
2631 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2632 options::OPT_mno_outline)) {
2633 if (A->getOption().matches(options::OPT_moutline)) {
2637 if (!(Triple.isARM() || Triple.isThumb() || Triple.isAArch64())) {
2638 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2640 addArg(Twine(
"-enable-machine-outliner"));
2644 addArg(Twine(
"-enable-machine-outliner=never"));
2650 const llvm::opt::ArgList &DriverArgs,
2651 llvm::opt::ArgStringList &CC1Args,
2652 StringRef BitcodeSuffix,
2653 const llvm::Triple &Triple,
2658 std::optional<std::string> LibPath =
2659 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2662 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2663 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2664 for (StringRef Path : Frags)
2665 LibraryPaths.emplace_back(Path.trim());
2670 LibraryPaths.emplace_back(LibPath);
2672 OptSpecifier LibomptargetBCPathOpt =
2673 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2674 : options::OPT_libomptarget_nvptx_bc_path_EQ;
2676 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu" :
"nvptx";
2677 std::string LibOmpTargetName =
2678 (
"libomptarget-" + ArchPrefix +
"-" + BitcodeSuffix +
".bc").str();
2681 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2683 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2684 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2685 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2688 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2689 CC1Args.push_back(
"-mlink-builtin-bitcode");
2690 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2692 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2693 << LibOmpTargetFile;
2696 bool FoundBCLibrary =
false;
2698 for (StringRef LibraryPath : LibraryPaths) {
2700 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2701 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2702 CC1Args.push_back(
"-mlink-builtin-bitcode");
2703 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2704 FoundBCLibrary =
true;
2709 if (!FoundBCLibrary)
2710 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2711 << LibOmpTargetName << ArchPrefix;
2715 const llvm::opt::ArgList &Args,
2716 llvm::opt::ArgStringList &CmdArgs) {
2718 !Args.hasArg(options::OPT_nostdlib) &&
2719 !Args.hasArg(options::OPT_no_hip_rt) && !Args.hasArg(options::OPT_r)) {
2723 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
2730 const llvm::opt::ArgList &Args,
2731 llvm::opt::ArgStringList &CmdArgs,
2732 const llvm::Triple &Triple) {
2733 if (Arg *A = Args.getLastArg(options::OPT_moutline_atomics,
2734 options::OPT_mno_outline_atomics)) {
2736 if (!Triple.isAArch64()) {
2737 D.
Diag(diag::warn_drv_moutline_atomics_unsupported_opt)
2738 << Triple.getArchName() << A->getOption().getName();
2740 if (A->getOption().matches(options::OPT_moutline_atomics)) {
2741 CmdArgs.push_back(
"-target-feature");
2742 CmdArgs.push_back(
"+outline-atomics");
2744 CmdArgs.push_back(
"-target-feature");
2745 CmdArgs.push_back(
"-outline-atomics");
2749 CmdArgs.push_back(
"-target-feature");
2750 CmdArgs.push_back(
"+outline-atomics");
2755 llvm::opt::ArgStringList &CmdArgs) {
2756 if (TCArgs.hasFlag(options::OPT_offload_compress,
2757 options::OPT_no_offload_compress,
false))
2758 CmdArgs.push_back(
"-compress");
2759 if (TCArgs.hasArg(options::OPT_v))
2760 CmdArgs.push_back(
"-verbose");
2761 if (
auto *Arg = TCArgs.getLastArg(options::OPT_offload_compression_level_EQ))
2763 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 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 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 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.
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...
StringRef getFlangF128MathLibrary() const
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)
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()