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:
122 if (Triple.isOSFuchsia() || Triple.isOSNetBSD()) {
126 if (Triple.isOSLinux() || Triple.isOSHurd()) {
127 switch (Triple.getArch()) {
129 case llvm::Triple::arm:
130 case llvm::Triple::armeb:
131 case llvm::Triple::thumb:
132 case llvm::Triple::thumbeb:
133 case llvm::Triple::mips64:
134 case llvm::Triple::mips64el:
135 case llvm::Triple::mips:
136 case llvm::Triple::mipsel:
137 case llvm::Triple::systemz:
138 case llvm::Triple::x86:
139 case llvm::Triple::x86_64:
146 if (Triple.isOSWindows()) {
147 switch (Triple.getArch()) {
148 case llvm::Triple::x86:
150 case llvm::Triple::x86_64:
151 return Triple.isOSBinFormatMachO();
152 case llvm::Triple::arm:
153 case llvm::Triple::thumb:
167 switch (Triple.getArch()) {
170 case llvm::Triple::arm:
171 case llvm::Triple::thumb:
174 return Triple.isOSDarwin();
180 const llvm::Triple &Triple) {
192 Args.getLastArg(clang::driver::options::OPT_fomit_frame_pointer,
193 clang::driver::options::OPT_fno_omit_frame_pointer);
195 bool OmitFP = A && A->getOption().matches(
196 clang::driver::options::OPT_fomit_frame_pointer);
197 bool NoOmitFP = A && A->getOption().matches(
198 clang::driver::options::OPT_fno_omit_frame_pointer);
200 Args.hasFlag(clang::driver::options::OPT_momit_leaf_frame_pointer,
201 clang::driver::options::OPT_mno_omit_leaf_frame_pointer,
202 Triple.isAArch64() || Triple.isPS() || Triple.isVE() ||
203 (Triple.isAndroid() && Triple.isRISCV64()));
214 const StringRef PluginOptPrefix) {
215 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
216 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
217 "-pass-remarks=" + A->getValue()));
219 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
220 CmdArgs.push_back(Args.MakeArgString(
221 Twine(PluginOptPrefix) +
"-pass-remarks-missed=" + A->getValue()));
223 if (
const Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
224 CmdArgs.push_back(Args.MakeArgString(
225 Twine(PluginOptPrefix) +
"-pass-remarks-analysis=" + A->getValue()));
229 const llvm::Triple &Triple,
232 const StringRef PluginOptPrefix) {
233 StringRef Format =
"yaml";
234 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
235 Format = A->getValue();
238 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
244 assert(!F.empty() &&
"Cannot determine remarks output name.");
246 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
247 "opt-remarks-filename=" + F +
248 ".opt.ld." + Format));
251 Args.getLastArg(options::OPT_foptimization_record_passes_EQ))
252 CmdArgs.push_back(Args.MakeArgString(
253 Twine(PluginOptPrefix) +
"opt-remarks-passes=" + A->getValue()));
255 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
256 "opt-remarks-format=" + Format.data()));
260 ArgStringList &CmdArgs,
261 const StringRef PluginOptPrefix) {
262 if (Args.hasFlag(options::OPT_fdiagnostics_show_hotness,
263 options::OPT_fno_diagnostics_show_hotness,
false))
264 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
265 "opt-remarks-with-hotness"));
268 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ))
270 Args.MakeArgString(Twine(PluginOptPrefix) +
271 "opt-remarks-hotness-threshold=" + A->getValue()));
276 StringRef Processor) {
280 auto GPUKind = T.isAMDGCN() ? llvm::AMDGPU::parseArchAMDGCN(Processor)
281 : llvm::AMDGPU::parseArchR600(Processor);
282 auto GPUFeatures = T.isAMDGCN() ? llvm::AMDGPU::getArchAttrAMDGCN(GPUKind)
283 : llvm::AMDGPU::getArchAttrR600(GPUKind);
284 if (GPUFeatures & llvm::AMDGPU::FEATURE_WGP)
286 return TargetFeatureArg.getOption().matches(options::OPT_mno_cumode);
291 if (D.
getVFS().exists(Path))
292 Paths.push_back(Path.str());
296 const llvm::Triple &Triple,
298 std::vector<StringRef> &Features,
299 OptSpecifier Group) {
300 std::set<StringRef> Warned;
301 for (
const Arg *A : Args.filtered(Group)) {
302 StringRef Name = A->getOption().getName();
306 assert(Name.startswith(
"m") &&
"Invalid feature name.");
307 Name = Name.substr(1);
311 if (Warned.count(Name) == 0) {
313 clang::diag::warn_drv_unsupported_option_for_processor)
314 << A->getAsString(Args) << Proc;
320 bool IsNegative = Name.startswith(
"no-");
322 Name = Name.substr(3);
324 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
333 for (StringRef Feature : llvm::reverse(Features)) {
334 if (UsedFeatures.insert(Feature.drop_front()).second)
335 UnifiedFeatures.insert(UnifiedFeatures.begin(), Feature);
338 return UnifiedFeatures;
342 const char *ArgName,
const char *EnvVar) {
343 const char *DirList = ::getenv(EnvVar);
344 bool CombinedArg =
false;
349 StringRef Name(ArgName);
350 if (Name.equals(
"-I") || Name.equals(
"-L") || Name.empty())
353 StringRef Dirs(DirList);
357 StringRef::size_type Delim;
358 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
361 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
363 CmdArgs.push_back(ArgName);
364 CmdArgs.push_back(
".");
369 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
371 CmdArgs.push_back(ArgName);
372 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
375 Dirs = Dirs.substr(Delim + 1);
380 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
382 CmdArgs.push_back(ArgName);
383 CmdArgs.push_back(
".");
387 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
389 CmdArgs.push_back(ArgName);
390 CmdArgs.push_back(Args.MakeArgString(Dirs));
396 const ArgList &Args, ArgStringList &CmdArgs,
402 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
409 for (
const auto &II : Inputs) {
413 if (
auto *IA = II.getAction())
423 if (II.isFilename()) {
424 CmdArgs.push_back(II.getFilename());
433 const Arg &A = II.getInputArg();
436 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
438 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
441 A.renderAsInput(Args, CmdArgs);
446 const ToolChain &TC,
const llvm::opt::ArgList &Args,
447 llvm::opt::ArgStringList &CmdArgs) {
453 if (
const Arg *A = Args.getLastArg(options::OPT_gz_EQ)) {
454 StringRef
V = A->getValue();
455 if (
V ==
"none" ||
V ==
"zlib" ||
V ==
"zstd")
456 CmdArgs.push_back(Args.MakeArgString(
"--compress-debug-sections=" +
V));
458 TC.
getDriver().
Diag(diag::err_drv_unsupported_option_argument)
459 << A->getSpelling() <<
V;
464 std::vector<StringRef> &Features,
465 OptSpecifier OnOpt, OptSpecifier OffOpt,
466 StringRef FeatureName) {
467 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
468 if (A->getOption().matches(OnOpt))
469 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
471 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
477 const ArgList &Args) {
478 Arg *MArch = Args.getLastArg(options::OPT_march_EQ);
479 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
481 return llvm::StringSwitch<std::string>(GPUName)
482 .Cases(
"rv630",
"rv635",
"r600")
483 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
484 .Case(
"rv740",
"rv770")
485 .Case(
"palm",
"cedar")
486 .Cases(
"sumo",
"sumo2",
"sumo")
487 .Case(
"hemlock",
"cypress")
488 .Case(
"aruba",
"cayman")
489 .Default(GPUName.str());
497 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
498 return A->getValue();
506 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
507 StringRef CPU = A->getValue();
513 return llvm::sys::getHostCPUName();
523 const llvm::Triple &T,
bool FromAs) {
526 switch (T.getArch()) {
530 case llvm::Triple::aarch64:
531 case llvm::Triple::aarch64_32:
532 case llvm::Triple::aarch64_be:
535 case llvm::Triple::arm:
536 case llvm::Triple::armeb:
537 case llvm::Triple::thumb:
538 case llvm::Triple::thumbeb: {
539 StringRef MArch, MCPU;
544 case llvm::Triple::avr:
545 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
546 return A->getValue();
549 case llvm::Triple::m68k:
552 case llvm::Triple::mips:
553 case llvm::Triple::mipsel:
554 case llvm::Triple::mips64:
555 case llvm::Triple::mips64el: {
559 return std::string(CPUName);
562 case llvm::Triple::nvptx:
563 case llvm::Triple::nvptx64:
564 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
565 return A->getValue();
568 case llvm::Triple::ppc:
569 case llvm::Triple::ppcle:
570 case llvm::Triple::ppc64:
571 case llvm::Triple::ppc64le:
574 case llvm::Triple::csky:
575 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
576 return A->getValue();
577 else if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
578 return A->getValue();
581 case llvm::Triple::riscv32:
582 case llvm::Triple::riscv64:
585 case llvm::Triple::bpfel:
586 case llvm::Triple::bpfeb:
587 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
588 return A->getValue();
591 case llvm::Triple::sparc:
592 case llvm::Triple::sparcel:
593 case llvm::Triple::sparcv9:
596 case llvm::Triple::x86:
597 case llvm::Triple::x86_64:
600 case llvm::Triple::hexagon:
604 case llvm::Triple::lanai:
607 case llvm::Triple::systemz:
610 case llvm::Triple::r600:
611 case llvm::Triple::amdgcn:
614 case llvm::Triple::wasm32:
615 case llvm::Triple::wasm64:
618 case llvm::Triple::loongarch32:
619 case llvm::Triple::loongarch64:
625 const llvm::Triple &Triple,
627 std::vector<StringRef> &Features) {
629 options::OPT_m_wasm_Features_Group);
633 const ArgList &Args, ArgStringList &CmdArgs,
634 bool ForAS,
bool IsAux) {
635 std::vector<StringRef> Features;
636 switch (Triple.getArch()) {
639 case llvm::Triple::mips:
640 case llvm::Triple::mipsel:
641 case llvm::Triple::mips64:
642 case llvm::Triple::mips64el:
645 case llvm::Triple::arm:
646 case llvm::Triple::armeb:
647 case llvm::Triple::thumb:
648 case llvm::Triple::thumbeb:
651 case llvm::Triple::ppc:
652 case llvm::Triple::ppcle:
653 case llvm::Triple::ppc64:
654 case llvm::Triple::ppc64le:
657 case llvm::Triple::riscv32:
658 case llvm::Triple::riscv64:
661 case llvm::Triple::systemz:
664 case llvm::Triple::aarch64:
665 case llvm::Triple::aarch64_32:
666 case llvm::Triple::aarch64_be:
669 case llvm::Triple::x86:
670 case llvm::Triple::x86_64:
673 case llvm::Triple::hexagon:
676 case llvm::Triple::wasm32:
677 case llvm::Triple::wasm64:
680 case llvm::Triple::sparc:
681 case llvm::Triple::sparcel:
682 case llvm::Triple::sparcv9:
685 case llvm::Triple::r600:
686 case llvm::Triple::amdgcn:
689 case llvm::Triple::nvptx:
690 case llvm::Triple::nvptx64:
693 case llvm::Triple::m68k:
696 case llvm::Triple::msp430:
699 case llvm::Triple::ve:
702 case llvm::Triple::csky:
705 case llvm::Triple::loongarch32:
706 case llvm::Triple::loongarch64:
712 CmdArgs.push_back(IsAux ?
"-aux-target-feature" :
"-target-feature");
713 CmdArgs.push_back(Feature.data());
718 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
721 if (!llvm::get_threadpool_strategy(LtoJobsArg->getValue()))
722 D.
Diag(diag::err_drv_invalid_int_value)
723 << LtoJobsArg->getAsString(Args) << LtoJobsArg->getValue();
724 return LtoJobsArg->getValue();
729 return Triple.isPS();
733 ArgStringList &CmdArgs,
const InputInfo &Output,
734 const InputInfo &Input,
bool IsThinLTO) {
739 if (llvm::sys::path::filename(Linker) !=
"ld.lld" &&
740 llvm::sys::path::stem(Linker) !=
"ld.lld" &&
745 const char *PluginPrefix = IsOSAIX ?
"-bplugin:" :
"";
746 const char *PluginName = IsOSAIX ?
"/libLTO" :
"/LLVMgold";
749 CmdArgs.push_back(
"-plugin");
752 const char *Suffix =
".dll";
753#elif defined(__APPLE__)
754 const char *Suffix =
".dylib";
756 const char *Suffix =
".so";
760 llvm::sys::path::native(Twine(D.
Dir) +
761 "/../" CLANG_INSTALL_LIBDIR_BASENAME +
764 CmdArgs.push_back(Args.MakeArgString(Twine(PluginPrefix) + Plugin));
768 if (Args.hasArg(options::OPT_ffat_lto_objects))
769 CmdArgs.push_back(
"--fat-lto-objects");
772 const char *PluginOptPrefix = IsOSAIX ?
"-bplugin_opt:" :
"-plugin-opt=";
773 const char *ExtraDash = IsOSAIX ?
"-" :
"";
774 const char *ParallelismOpt = IsOSAIX ?
"-threads=" :
"jobs=";
779 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
780 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
781 "-generate-arange-section"));
791 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"mcpu=" + CPU));
793 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
797 if (A->getOption().matches(options::OPT_O4) ||
798 A->getOption().matches(options::OPT_Ofast))
800 else if (A->getOption().matches(options::OPT_O)) {
801 OOpt = A->getValue();
804 else if (OOpt ==
"s" || OOpt ==
"z")
806 }
else if (A->getOption().matches(options::OPT_O0))
810 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
"O" + OOpt));
812 CmdArgs.push_back(Args.MakeArgString(Twine(
"--lto-CGO") + OOpt));
816 if (Args.hasArg(options::OPT_gsplit_dwarf))
817 CmdArgs.push_back(Args.MakeArgString(
818 Twine(PluginOptPrefix) +
"dwo_dir=" + Output.
getFilename() +
"_dwo"));
820 if (IsThinLTO && !IsOSAIX)
821 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
"thinlto"));
822 else if (IsThinLTO && IsOSAIX)
823 CmdArgs.push_back(Args.MakeArgString(Twine(
"-bdbg:thinlto")));
828 if (IsThinLTO && Args.hasArg(options::OPT_fenable_matrix))
830 Args.MakeArgString(Twine(PluginOptPrefix) +
"-enable-matrix"));
833 if (!Parallelism.empty())
834 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
835 ParallelismOpt + Parallelism));
838 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
839 options::OPT_fno_global_isel)) {
842 CmdArgs.push_back(Args.MakeArgString(
843 Twine(PluginOptPrefix) +
"-global-isel=" +
844 (A->getOption().matches(options::OPT_fglobal_isel) ?
"1" :
"0")));
849 Args.getLastArg(options::OPT_gTune_Group, options::OPT_ggdbN_Group)) {
850 if (A->getOption().matches(options::OPT_glldb))
852 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=lldb"));
853 else if (A->getOption().matches(options::OPT_gsce))
855 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=sce"));
856 else if (A->getOption().matches(options::OPT_gdbx))
858 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=dbx"));
861 Args.MakeArgString(Twine(PluginOptPrefix) +
"-debugger-tune=gdb"));
867 Args.MakeArgString(Twine(PluginOptPrefix) +
"-no-integrated-as=1"));
871 Arg *A = Args.getLastArg(options::OPT_g_Group);
872 bool EnableDebugInfo = A && !A->getOption().matches(options::OPT_g0) &&
873 !A->getOption().matches(options::OPT_ggdb0);
874 if (EnableDebugInfo && Args.hasFlag(options::OPT_gstrict_dwarf,
875 options::OPT_gno_strict_dwarf,
true))
877 Args.MakeArgString(Twine(PluginOptPrefix) +
"-strict-dwarf=true"));
879 for (
const Arg *A : Args.filtered_reverse(options::OPT_mabi_EQ)) {
880 StringRef
V = A->getValue();
881 if (
V ==
"vec-default")
883 if (
V ==
"vec-extabi") {
885 Args.MakeArgString(Twine(PluginOptPrefix) +
"-vec-extabi"));
891 bool UseSeparateSections =
894 if (Args.hasFlag(options::OPT_ffunction_sections,
895 options::OPT_fno_function_sections, UseSeparateSections))
897 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=1"));
898 else if (Args.hasArg(options::OPT_fno_function_sections))
900 Args.MakeArgString(Twine(PluginOptPrefix) +
"-function-sections=0"));
902 bool DataSectionsTurnedOff =
false;
903 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
904 UseSeparateSections)) {
906 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=1"));
907 }
else if (Args.hasArg(options::OPT_fno_data_sections)) {
908 DataSectionsTurnedOff =
true;
910 Args.MakeArgString(Twine(PluginOptPrefix) +
"-data-sections=0"));
913 if (Args.hasArg(options::OPT_mxcoff_roptr) ||
914 Args.hasArg(options::OPT_mno_xcoff_roptr)) {
915 bool HasRoptr = Args.hasFlag(options::OPT_mxcoff_roptr,
916 options::OPT_mno_xcoff_roptr,
false);
917 StringRef OptStr = HasRoptr ?
"-mxcoff-roptr" :
"-mno-xcoff-roptr";
920 D.
Diag(diag::err_drv_unsupported_opt_for_target)
927 if (DataSectionsTurnedOff)
928 D.
Diag(diag::err_roptr_requires_data_sections);
931 Args.MakeArgString(Twine(PluginOptPrefix) +
"-mxcoff-roptr"));
936 if (
auto *A = Args.getLastArg(options::OPT_fsplit_machine_functions,
937 options::OPT_fno_split_machine_functions)) {
938 if (A->getOption().matches(options::OPT_fsplit_machine_functions))
939 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
940 "-split-machine-functions"));
944 StringRef FName = A->getValue();
945 if (!llvm::sys::fs::exists(FName))
946 D.
Diag(diag::err_drv_no_such_file) << FName;
948 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
949 "sample-profile=" + FName));
953 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
954 "cs-profile-generate"));
955 if (CSPGOGenerateArg->getOption().matches(
956 options::OPT_fcs_profile_generate_EQ)) {
958 llvm::sys::path::append(Path,
"default_%m.profraw");
959 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
960 "cs-profile-path=" + Path));
963 Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
964 "cs-profile-path=default_%m.profraw"));
967 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
968 if (Path.empty() || llvm::sys::fs::is_directory(Path))
969 llvm::sys::path::append(Path,
"default.profdata");
970 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + ExtraDash +
971 "cs-profile-path=" + Path));
975 if (Args.hasFlag(options::OPT_fjmc, options::OPT_fno_jmc,
false)) {
977 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) +
978 "-enable-jmc-instrument"));
980 D.
Diag(clang::diag::warn_drv_fjmc_for_elf_only);
983 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
986 Args.MakeArgString(Twine(PluginOptPrefix) +
"-emulated-tls"));
989 if (Args.hasFlag(options::OPT_fstack_size_section,
990 options::OPT_fno_stack_size_section,
false))
992 Args.MakeArgString(Twine(PluginOptPrefix) +
"-stack-size-section"));
996 if (!StatsFile.empty())
998 Args.MakeArgString(Twine(PluginOptPrefix) +
"stats-file=" + StatsFile));
1001 if (Arg *A = Args.getLastArg(options::OPT_fcrash_diagnostics_dir))
1002 CmdArgs.push_back(Args.MakeArgString(
1003 Twine(PluginOptPrefix) +
"-crash-diagnostics-dir=" + A->getValue()));
1014 Output, PluginOptPrefix);
1020 true, PluginOptPrefix);
1026 ArgStringList &CmdArgs) {
1027 if (Args.hasArg(options::OPT_nogpulib) || Args.hasArg(options::OPT_nolibc))
1033 llvm::sys::path::append(LibCDecls,
"include",
"llvm_libc_wrappers",
1035 bool HasLibC = llvm::sys::fs::exists(LibCDecls) &&
1036 llvm::sys::fs::is_directory(LibCDecls);
1037 if (Args.hasFlag(options::OPT_gpulibc, options::OPT_nogpulibc, HasLibC)) {
1038 CmdArgs.push_back(
"-lcgpu");
1039 CmdArgs.push_back(
"-lmgpu");
1044 const ArgList &Args,
1045 ArgStringList &CmdArgs) {
1050 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
1051 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1055 ArgStringList &CmdArgs) {
1056 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
1057 options::OPT_fno_rtlib_add_rpath,
false))
1061 if (TC.
getVFS().exists(CandidateRPath)) {
1062 CmdArgs.push_back(
"-rpath");
1063 CmdArgs.push_back(Args.MakeArgString(CandidateRPath));
1069 const ArgList &Args,
bool ForceStaticHostRuntime,
1070 bool IsOffloadingHost,
bool GompNeedsRT) {
1071 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
1072 options::OPT_fno_openmp,
false))
1081 if (ForceStaticHostRuntime)
1082 CmdArgs.push_back(
"-Bstatic");
1086 CmdArgs.push_back(
"-lomp");
1089 CmdArgs.push_back(
"-lgomp");
1092 CmdArgs.push_back(
"-liomp5");
1098 if (ForceStaticHostRuntime)
1099 CmdArgs.push_back(
"-Bdynamic");
1102 CmdArgs.push_back(
"-lrt");
1104 if (IsOffloadingHost)
1105 CmdArgs.push_back(
"-lomptarget");
1107 if (IsOffloadingHost && !Args.hasArg(options::OPT_nogpulib))
1108 CmdArgs.push_back(
"-lomptarget.devicertl");
1110 if (IsOffloadingHost)
1120 llvm::opt::ArgStringList &CmdArgs) {
1123 if (!TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1130 bool WholeArchiveActive =
false;
1131 for (
auto *Arg : Args.filtered(options::OPT_Wl_COMMA))
1133 for (StringRef ArgValue : Arg->getValues()) {
1134 if (ArgValue ==
"--whole-archive")
1135 WholeArchiveActive =
true;
1136 if (ArgValue ==
"--no-whole-archive")
1137 WholeArchiveActive =
false;
1140 if (!WholeArchiveActive)
1141 CmdArgs.push_back(
"--whole-archive");
1142 CmdArgs.push_back(
"-lFortran_main");
1143 if (!WholeArchiveActive)
1144 CmdArgs.push_back(
"--no-whole-archive");
1147 CmdArgs.push_back(
"-lFortranRuntime");
1148 CmdArgs.push_back(
"-lFortranDecimal");
1150 unsigned RTOptionID = options::OPT__SLASH_MT;
1151 if (
auto *rtl = Args.getLastArg(options::OPT_fms_runtime_lib_EQ)) {
1152 RTOptionID = llvm::StringSwitch<unsigned>(rtl->getValue())
1153 .Case(
"static", options::OPT__SLASH_MT)
1154 .Case(
"static_dbg", options::OPT__SLASH_MTd)
1155 .Case(
"dll", options::OPT__SLASH_MD)
1156 .Case(
"dll_dbg", options::OPT__SLASH_MDd)
1157 .Default(options::OPT__SLASH_MT);
1159 switch (RTOptionID) {
1160 case options::OPT__SLASH_MT:
1161 CmdArgs.push_back(
"/WHOLEARCHIVE:Fortran_main.static.lib");
1163 case options::OPT__SLASH_MTd:
1164 CmdArgs.push_back(
"/WHOLEARCHIVE:Fortran_main.static_dbg.lib");
1166 case options::OPT__SLASH_MD:
1167 CmdArgs.push_back(
"/WHOLEARCHIVE:Fortran_main.dynamic.lib");
1169 case options::OPT__SLASH_MDd:
1170 CmdArgs.push_back(
"/WHOLEARCHIVE:Fortran_main.dynamic_dbg.lib");
1177 const llvm::opt::ArgList &Args,
1178 ArgStringList &CmdArgs) {
1185 llvm::sys::path::append(DefaultLibPath,
"lib");
1186 if (TC.
getTriple().isKnownWindowsMSVCEnvironment())
1187 CmdArgs.push_back(Args.MakeArgString(
"-libpath:" + DefaultLibPath));
1189 CmdArgs.push_back(Args.MakeArgString(
"-L" + DefaultLibPath));
1193 ArgStringList &CmdArgs, StringRef Sanitizer,
1194 bool IsShared,
bool IsWhole) {
1197 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
1200 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
1210 ArgStringList &CmdArgs,
1211 StringRef Sanitizer) {
1216 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd)
1219 if (llvm::sys::fs::exists(SanRT +
".syms")) {
1220 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
1227 const llvm::opt::ArgList &Args,
1228 llvm::opt::ArgStringList &CmdArgs,
1231 "AIX linker does not support any form of --as-needed option yet.");
1239 if (TC.
getTriple().isOSSolaris() && !LinkerIsGnuLd) {
1240 CmdArgs.push_back(
"-z");
1241 CmdArgs.push_back(as_needed ?
"ignore" :
"record");
1243 CmdArgs.push_back(as_needed ?
"--as-needed" :
"--no-as-needed");
1248 const llvm::opt::ArgList &Args,
1249 ArgStringList &CmdArgs) {
1254 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
1256 CmdArgs.push_back(
"-lpthread");
1258 CmdArgs.push_back(
"-lrt");
1260 CmdArgs.push_back(
"-lm");
1264 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
1265 CmdArgs.push_back(
"-ldl");
1270 CmdArgs.push_back(
"-lexecinfo");
1276 CmdArgs.push_back(
"-lresolv");
1290 SharedRuntimes.push_back(
"asan");
1291 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1292 HelperStaticRuntimes.push_back(
"asan-preinit");
1295 SharedRuntimes.push_back(
"memprof");
1296 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
1297 HelperStaticRuntimes.push_back(
"memprof-preinit");
1301 SharedRuntimes.push_back(
"ubsan_minimal");
1303 SharedRuntimes.push_back(
"ubsan_standalone");
1306 SharedRuntimes.push_back(
"scudo_standalone");
1309 SharedRuntimes.push_back(
"tsan");
1312 SharedRuntimes.push_back(
"hwasan_aliases");
1314 SharedRuntimes.push_back(
"hwasan");
1315 if (!Args.hasArg(options::OPT_shared))
1316 HelperStaticRuntimes.push_back(
"hwasan-preinit");
1322 StaticRuntimes.push_back(
"stats_client");
1326 HelperStaticRuntimes.push_back(
"asan_static");
1329 if (Args.hasArg(options::OPT_shared)) {
1338 StaticRuntimes.push_back(
"asan");
1340 StaticRuntimes.push_back(
"asan_cxx");
1345 StaticRuntimes.push_back(
"memprof");
1347 StaticRuntimes.push_back(
"memprof_cxx");
1352 StaticRuntimes.push_back(
"hwasan_aliases");
1354 StaticRuntimes.push_back(
"hwasan_aliases_cxx");
1356 StaticRuntimes.push_back(
"hwasan");
1358 StaticRuntimes.push_back(
"hwasan_cxx");
1362 StaticRuntimes.push_back(
"dfsan");
1364 StaticRuntimes.push_back(
"lsan");
1366 StaticRuntimes.push_back(
"msan");
1368 StaticRuntimes.push_back(
"msan_cxx");
1372 StaticRuntimes.push_back(
"tsan");
1374 StaticRuntimes.push_back(
"tsan_cxx");
1378 StaticRuntimes.push_back(
"ubsan_minimal");
1380 StaticRuntimes.push_back(
"ubsan_standalone");
1382 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1386 NonWholeStaticRuntimes.push_back(
"safestack");
1387 RequiredSymbols.push_back(
"__safestack_init");
1391 StaticRuntimes.push_back(
"cfi");
1393 StaticRuntimes.push_back(
"cfi_diag");
1395 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
1399 NonWholeStaticRuntimes.push_back(
"stats");
1400 RequiredSymbols.push_back(
"__sanitizer_stats_register");
1403 StaticRuntimes.push_back(
"scudo_standalone");
1405 StaticRuntimes.push_back(
"scudo_standalone_cxx");
1412 ArgStringList &CmdArgs) {
1414 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
1416 NonWholeStaticRuntimes, HelperStaticRuntimes,
1422 !Args.hasArg(options::OPT_shared)) {
1428 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx)) {
1429 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
1430 !Args.hasArg(options::OPT_static);
1431 if (OnlyLibstdcxxStatic)
1432 CmdArgs.push_back(
"-Bstatic");
1434 if (OnlyLibstdcxxStatic)
1435 CmdArgs.push_back(
"-Bdynamic");
1439 for (
auto RT : SharedRuntimes)
1441 for (
auto RT : HelperStaticRuntimes)
1443 bool AddExportDynamic =
false;
1444 for (
auto RT : StaticRuntimes) {
1448 for (
auto RT : NonWholeStaticRuntimes) {
1452 for (
auto S : RequiredSymbols) {
1453 CmdArgs.push_back(
"-u");
1454 CmdArgs.push_back(Args.MakeArgString(S));
1458 if (AddExportDynamic)
1459 CmdArgs.push_back(
"--export-dynamic");
1462 CmdArgs.push_back(
"--export-dynamic-symbol=__cfi_check");
1466 TC.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1467 <<
"-fsanitize=memtag*" << TC.
getTriple().str();
1470 Args.MakeArgString(
"--android-memtag-mode=" + SanArgs.
getMemtagMode()));
1472 CmdArgs.push_back(
"--android-memtag-heap");
1474 CmdArgs.push_back(
"--android-memtag-stack");
1477 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
1481 if (Args.hasArg(options::OPT_shared))
1485 CmdArgs.push_back(
"--whole-archive");
1489 CmdArgs.push_back(
"--no-whole-archive");
1497 const llvm::opt::ArgList &Args,
1498 ArgStringList &CmdArgs) {
1500 CmdArgs.push_back(
"-lpthread");
1502 CmdArgs.push_back(
"-lrt");
1503 CmdArgs.push_back(
"-lm");
1508 CmdArgs.push_back(
"-ldl");
1513 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1514 return !A->getOption().matches(options::OPT_O0);
1522 auto AddPostfix = [JA](
auto &F) {
1527 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
1528 if (StringRef(A->getValue()) ==
"single" && Output.
isFilename())
1532 if (
const Arg *A = Args.getLastArg(options::OPT_dumpdir)) {
1535 Arg *FinalOutput = Args.getLastArg(options::OPT_o, options::OPT__SLASH_o);
1536 if (FinalOutput && Args.hasArg(options::OPT_c)) {
1537 T = FinalOutput->getValue();
1538 llvm::sys::path::remove_filename(T);
1539 llvm::sys::path::append(T,
1540 llvm::sys::path::stem(FinalOutput->getValue()));
1542 return Args.MakeArgString(T);
1548 return Args.MakeArgString(T);
1552 const JobAction &JA,
const ArgList &Args,
1553 const InputInfo &Output,
const char *OutFile) {
1554 ArgStringList ExtractArgs;
1555 ExtractArgs.push_back(
"--extract-dwo");
1557 ArgStringList StripArgs;
1558 StripArgs.push_back(
"--strip-dwo");
1563 ExtractArgs.push_back(OutFile);
1570 C.addCommand(std::make_unique<Command>(JA, T,
1572 Exec, ExtractArgs, II, Output));
1575 C.addCommand(std::make_unique<Command>(
1585 Args.ClaimAllArgs(options::OPT_flto_EQ);
1586 Args.ClaimAllArgs(options::OPT_flto);
1587 Args.ClaimAllArgs(options::OPT_fno_lto);
1591 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
1592 options::OPT_fcs_profile_generate_EQ,
1593 options::OPT_fno_profile_generate);
1594 if (CSPGOGenerateArg &&
1595 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
1596 CSPGOGenerateArg =
nullptr;
1598 return CSPGOGenerateArg;
1602 auto *ProfileUseArg = Args.getLastArg(
1603 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
1604 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
1605 options::OPT_fno_profile_instr_use);
1607 if (ProfileUseArg &&
1608 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
1609 ProfileUseArg =
nullptr;
1611 return ProfileUseArg;
1615 auto *ProfileSampleUseArg = Args.getLastArg(
1616 options::OPT_fprofile_sample_use, options::OPT_fprofile_sample_use_EQ,
1617 options::OPT_fauto_profile, options::OPT_fauto_profile_EQ,
1618 options::OPT_fno_profile_sample_use, options::OPT_fno_auto_profile);
1620 if (ProfileSampleUseArg &&
1621 (ProfileSampleUseArg->getOption().matches(
1622 options::OPT_fno_profile_sample_use) ||
1623 ProfileSampleUseArg->getOption().matches(options::OPT_fno_auto_profile)))
1626 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ,
1627 options::OPT_fauto_profile_EQ);
1632 case llvm::Reloc::Static:
1634 case llvm::Reloc::PIC_:
1636 case llvm::Reloc::DynamicNoPIC:
1637 return "dynamic-no-pic";
1638 case llvm::Reloc::ROPI:
1640 case llvm::Reloc::RWPI:
1642 case llvm::Reloc::ROPI_RWPI:
1645 llvm_unreachable(
"Unknown Reloc::Model kind");
1652std::tuple<llvm::Reloc::Model, unsigned, bool>
1660 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
1662 bool IsPICLevelTwo = PIC;
1665 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
1668 if (Triple.isAndroid()) {
1669 switch (Triple.getArch()) {
1670 case llvm::Triple::arm:
1671 case llvm::Triple::armeb:
1672 case llvm::Triple::thumb:
1673 case llvm::Triple::thumbeb:
1674 case llvm::Triple::aarch64:
1675 case llvm::Triple::mips:
1676 case llvm::Triple::mipsel:
1677 case llvm::Triple::mips64:
1678 case llvm::Triple::mips64el:
1682 case llvm::Triple::x86:
1683 case llvm::Triple::x86_64:
1685 IsPICLevelTwo =
true;
1694 if (Triple.isOHOSFamily() && Triple.getArch() == llvm::Triple::aarch64)
1698 if (Triple.isOSOpenBSD()) {
1700 case llvm::Triple::arm:
1701 case llvm::Triple::aarch64:
1702 case llvm::Triple::mips64:
1703 case llvm::Triple::mips64el:
1704 case llvm::Triple::x86:
1705 case llvm::Triple::x86_64:
1706 IsPICLevelTwo =
false;
1709 case llvm::Triple::ppc:
1710 case llvm::Triple::sparcv9:
1711 IsPICLevelTwo =
true;
1723 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
1724 options::OPT_fpic, options::OPT_fno_pic,
1725 options::OPT_fPIE, options::OPT_fno_PIE,
1726 options::OPT_fpie, options::OPT_fno_pie);
1727 if (Triple.isOSWindows() && !Triple.isOSCygMing() && LastPICArg &&
1728 LastPICArg == Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
1729 options::OPT_fPIE, options::OPT_fpie)) {
1731 << LastPICArg->getSpelling() << Triple.str();
1732 if (Triple.getArch() == llvm::Triple::x86_64)
1733 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
1734 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1741 Option O = LastPICArg->getOption();
1742 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
1743 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
1744 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
1746 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
1748 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
1751 if (EffectiveTriple.isPS()) {
1752 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
1753 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
1754 if (Model !=
"kernel") {
1757 << LastPICArg->getSpelling()
1758 << (EffectiveTriple.isPS4() ?
"PS4" :
"PS5");
1768 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS()))
1774 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
1775 !EffectiveTriple.isWatchOS() && !EffectiveTriple.isDriverKit()))
1778 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1781 if (!Triple.isOSDarwin())
1783 << A->getSpelling() << Triple.str();
1792 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0
U,
false);
1795 bool EmbeddedPISupported;
1796 switch (Triple.getArch()) {
1797 case llvm::Triple::arm:
1798 case llvm::Triple::armeb:
1799 case llvm::Triple::thumb:
1800 case llvm::Triple::thumbeb:
1801 EmbeddedPISupported =
true;
1804 EmbeddedPISupported =
false;
1808 bool ROPI =
false, RWPI =
false;
1809 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
1810 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
1811 if (!EmbeddedPISupported)
1813 << LastROPIArg->getSpelling() << Triple.str();
1816 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
1817 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
1818 if (!EmbeddedPISupported)
1820 << LastRWPIArg->getSpelling() << Triple.str();
1825 if ((ROPI || RWPI) && (PIC || PIE))
1828 if (Triple.isMIPS()) {
1835 if (ABIName ==
"n64")
1838 if(Args.hasArg(options::OPT_mno_abicalls))
1839 return std::make_tuple(llvm::Reloc::Static, 0
U,
false);
1842 IsPICLevelTwo =
false;
1846 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
1848 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
1850 RelocM = llvm::Reloc::ROPI_RWPI;
1852 RelocM = llvm::Reloc::ROPI;
1854 RelocM = llvm::Reloc::RWPI;
1856 return std::make_tuple(RelocM, 0
U,
false);
1876 const ArgList &Args) {
1877 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
1878 options::OPT_falign_functions_EQ,
1879 options::OPT_fno_align_functions);
1880 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
1883 if (A->getOption().matches(options::OPT_falign_functions))
1887 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 65536)
1889 << A->getAsString(Args) << A->getValue();
1894 ArgStringList &CmdArgs, llvm::codegenoptions::DebugInfoKind DebugInfoKind) {
1895 switch (DebugInfoKind) {
1896 case llvm::codegenoptions::DebugDirectivesOnly:
1897 CmdArgs.push_back(
"-debug-info-kind=line-directives-only");
1899 case llvm::codegenoptions::DebugLineTablesOnly:
1900 CmdArgs.push_back(
"-debug-info-kind=line-tables-only");
1902 case llvm::codegenoptions::DebugInfoConstructor:
1903 CmdArgs.push_back(
"-debug-info-kind=constructor");
1905 case llvm::codegenoptions::LimitedDebugInfo:
1906 CmdArgs.push_back(
"-debug-info-kind=limited");
1908 case llvm::codegenoptions::FullDebugInfo:
1909 CmdArgs.push_back(
"-debug-info-kind=standalone");
1911 case llvm::codegenoptions::UnusedTypeInfo:
1912 CmdArgs.push_back(
"-debug-info-kind=unused-types");
1922 assert(A.getOption().matches(options::OPT_gN_Group) &&
1923 "Not a -g option that specifies a debug-info level");
1924 if (A.getOption().matches(options::OPT_g0) ||
1925 A.getOption().matches(options::OPT_ggdb0))
1926 return llvm::codegenoptions::NoDebugInfo;
1927 if (A.getOption().matches(options::OPT_gline_tables_only) ||
1928 A.getOption().matches(options::OPT_ggdb1))
1929 return llvm::codegenoptions::DebugLineTablesOnly;
1930 if (A.getOption().matches(options::OPT_gline_directives_only))
1931 return llvm::codegenoptions::DebugDirectivesOnly;
1932 return llvm::codegenoptions::DebugInfoConstructor;
1936 const ArgList &Args) {
1937 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
1943 if (StringRef(A->getValue()).getAsInteger(10,
Value) ||
Value > 5 ||
1946 << A->getAsString(Args) << A->getValue();
1951 return llvm::StringSwitch<unsigned>(ArgValue)
1952 .Case(
"-gdwarf-2", 2)
1953 .Case(
"-gdwarf-3", 3)
1954 .Case(
"-gdwarf-4", 4)
1955 .Case(
"-gdwarf-5", 5)
1960 return Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
1961 options::OPT_gdwarf_4, options::OPT_gdwarf_5,
1962 options::OPT_gdwarf);
1966 const llvm::opt::ArgList &Args) {
1971 if (DwarfVersion == 0) {
1973 assert(DwarfVersion &&
"toolchain default DWARF version must be nonzero");
1975 return DwarfVersion;
1979 ArgStringList &CmdArgs) {
1980 llvm::Reloc::Model RelocationModel;
1985 if (RelocationModel != llvm::Reloc::Static)
1986 CmdArgs.push_back(
"-KPIC");
1992 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
1998 const ArgList &Args) {
1999 if (Args.hasArg(options::OPT_static_libgcc) ||
2000 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie) ||
2004 if (Args.hasArg(options::OPT_shared_libgcc))
2023 ArgStringList &CmdArgs,
const ArgList &Args) {
2027 CmdArgs.push_back(
"-l:libunwind.a");
2050 CmdArgs.push_back(
"-lgcc_eh");
2052 CmdArgs.push_back(
"-lgcc_s");
2060 CmdArgs.push_back(
"-lunwind");
2062 CmdArgs.push_back(
"-l:libunwind.a");
2065 CmdArgs.push_back(
"-l:libunwind.dll.a");
2067 CmdArgs.push_back(
"-l:libunwind.so");
2071 CmdArgs.push_back(
"-lunwind");
2081 ArgStringList &CmdArgs,
const ArgList &Args) {
2085 CmdArgs.push_back(
"-lgcc");
2089 CmdArgs.push_back(
"-lgcc");
2093 ArgStringList &CmdArgs,
const ArgList &Args) {
2104 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
2107 Arg *A = Args.getLastArg(options::OPT_rtlib_EQ);
2108 if (A && A->getValue() != StringRef(
"platform")) {
2109 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
2110 << A->getValue() <<
"MSVC";
2120 if (TC.
getTriple().isAndroid() && !Args.hasArg(options::OPT_static) &&
2121 !Args.hasArg(options::OPT_static_pie))
2122 CmdArgs.push_back(
"-ldl");
2129 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
2135 StringRef SaveStats = A->getValue();
2136 if (SaveStats ==
"obj" && Output.
isFilename()) {
2138 llvm::sys::path::remove_filename(StatsFile);
2139 }
else if (SaveStats !=
"cwd") {
2140 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
2144 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
2145 llvm::sys::path::append(StatsFile, BaseName);
2146 llvm::sys::path::replace_extension(StatsFile,
"stats");
2158 assert(Flag.front() ==
'-');
2160 Flags.push_back(Flag.str());
2162 Flags.push_back((
"!" + Flag.substr(1)).str());
2167 ArgStringList &CmdArgs,
bool IsLTO,
2168 const StringRef PluginOptPrefix) {
2169 auto addArg = [&, IsLTO](
const Twine &Arg) {
2171 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2172 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2174 CmdArgs.push_back(
"-mllvm");
2175 CmdArgs.push_back(Args.MakeArgString(Arg));
2179 if (Args.hasArg(options::OPT_mbranches_within_32B_boundaries)) {
2180 addArg(Twine(
"-x86-branches-within-32B-boundaries"));
2182 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_boundary_EQ)) {
2183 StringRef
Value = A->getValue();
2185 if (
Value.getAsInteger(10, Boundary) || Boundary < 16 ||
2186 !llvm::isPowerOf2_64(Boundary)) {
2187 D.
Diag(diag::err_drv_invalid_argument_to_option)
2188 <<
Value << A->getOption().getName();
2190 addArg(
"-x86-align-branch-boundary=" + Twine(Boundary));
2193 if (
const Arg *A = Args.getLastArg(options::OPT_malign_branch_EQ)) {
2194 std::string AlignBranch;
2195 for (StringRef T : A->getValues()) {
2196 if (T !=
"fused" && T !=
"jcc" && T !=
"jmp" && T !=
"call" &&
2197 T !=
"ret" && T !=
"indirect")
2198 D.
Diag(diag::err_drv_invalid_malign_branch_EQ)
2199 << T <<
"fused, jcc, jmp, call, ret, indirect";
2200 if (!AlignBranch.empty())
2204 addArg(
"-x86-align-branch=" + Twine(AlignBranch));
2206 if (
const Arg *A = Args.getLastArg(options::OPT_mpad_max_prefix_size_EQ)) {
2207 StringRef
Value = A->getValue();
2208 unsigned PrefixSize;
2209 if (
Value.getAsInteger(10, PrefixSize)) {
2210 D.
Diag(diag::err_drv_invalid_argument_to_option)
2211 <<
Value << A->getOption().getName();
2213 addArg(
"-x86-pad-max-prefix-size=" + Twine(PrefixSize));
2239 llvm::opt::ArgStringList &CC1Args,
2241 StringRef Lib, StringRef Arch, StringRef Target,
2242 bool isBitCodeSDL) {
2245 std::string LibDeviceLoc =
"/libdevice";
2246 std::string LibBcPrefix =
"/libbc-";
2247 std::string LibPrefix =
"/lib";
2264 for (StringRef
Base : {LibBcPrefix, LibPrefix}) {
2265 const auto *Ext =
Base.contains(LibBcPrefix) ?
".a" :
".bc";
2267 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2268 Twine(Lib +
"-" + Arch).str(), Twine(Lib).str()}) {
2269 SDLs.push_back(Twine(LibDeviceLoc +
Base + Suffix + Ext).str());
2270 SDLs.push_back(Twine(
Base + Suffix + Ext).str());
2280 const auto *Ext =
".a";
2282 for (
auto Suffix : {Twine(Lib +
"-" + Arch +
"-" +
Target).str(),
2283 Twine(Lib +
"-" + Arch).str()}) {
2284 SDLs.push_back(Twine(LibDeviceLoc + LibPrefix + Suffix + Ext).str());
2285 SDLs.push_back(Twine(LibPrefix + Suffix + Ext).str());
2296 bool FoundSDL =
false;
2297 for (
auto LPath : LibraryPaths) {
2298 for (
auto SDL : SDLs) {
2299 auto FullName = Twine(LPath + SDL).str();
2300 if (llvm::sys::fs::exists(FullName)) {
2301 CC1Args.push_back(DriverArgs.MakeArgString(FullName));
2318 const InputInfoList &Inputs,
const llvm::opt::ArgList &DriverArgs,
2319 llvm::opt::ArgStringList &CC1Args,
2321 StringRef Arch, StringRef Target,
bool isBitCodeSDL) {
2324 if (isBitCodeSDL && Arch.contains(
"nvptx"))
2327 bool FoundAOB =
false;
2328 std::string ArchiveOfBundles;
2331 bool IsMSVC = Triple.isWindowsMSVCEnvironment();
2332 auto Ext = IsMSVC ?
".lib" :
".a";
2333 if (!Lib.startswith(
":") && !Lib.startswith(
"-l")) {
2334 if (llvm::sys::fs::exists(Lib)) {
2335 ArchiveOfBundles = Lib;
2339 if (Lib.startswith(
"-l"))
2340 Lib = Lib.drop_front(2);
2341 for (
auto LPath : LibraryPaths) {
2342 ArchiveOfBundles.clear();
2344 (Lib.startswith(
":") ? Lib.drop_front()
2345 : IsMSVC ? Lib + Ext :
"lib" + Lib + Ext)
2347 for (
auto Prefix : {
"/libdevice/",
"/"}) {
2348 auto AOB = Twine(LPath + Prefix + LibFile).str();
2349 if (llvm::sys::fs::exists(AOB)) {
2350 ArchiveOfBundles = AOB;
2363 llvm::file_magic Magic;
2364 auto EC = llvm::identify_magic(ArchiveOfBundles, Magic);
2365 if (EC || Magic != llvm::file_magic::archive)
2368 StringRef Prefix = isBitCodeSDL ?
"libbc-" :
"lib";
2369 std::string OutputLib =
2375 C.addTempFile(
C.getArgs().MakeArgString(OutputLib));
2377 ArgStringList CmdArgs;
2380 DeviceTriple +=
'-';
2382 DeviceTriple += NormalizedTriple;
2384 DeviceTriple +=
'-';
2388 std::string UnbundleArg(
"-unbundle");
2389 std::string TypeArg(
"-type=a");
2390 std::string InputArg(
"-input=" + ArchiveOfBundles);
2391 std::string OffloadArg(
"-targets=" + std::string(DeviceTriple));
2392 std::string OutputArg(
"-output=" + OutputLib);
2394 const char *UBProgram = DriverArgs.MakeArgString(
2397 ArgStringList UBArgs;
2398 UBArgs.push_back(
C.getArgs().MakeArgString(UnbundleArg));
2399 UBArgs.push_back(
C.getArgs().MakeArgString(TypeArg));
2400 UBArgs.push_back(
C.getArgs().MakeArgString(InputArg));
2401 UBArgs.push_back(
C.getArgs().MakeArgString(OffloadArg));
2402 UBArgs.push_back(
C.getArgs().MakeArgString(OutputArg));
2406 std::string AdditionalArgs(
"-allow-missing-bundles");
2407 UBArgs.push_back(
C.getArgs().MakeArgString(AdditionalArgs));
2412 std::string HipCompatibleArgs(
"-hip-openmp-compatible");
2413 UBArgs.push_back(
C.getArgs().MakeArgString(HipCompatibleArgs));
2415 C.addCommand(std::make_unique<Command>(
2417 InputInfo(&JA,
C.getArgs().MakeArgString(OutputLib))));
2419 CC1Args.push_back(DriverArgs.MakeArgString(OutputLib));
2428 const llvm::opt::ArgList &DriverArgs,
2429 llvm::opt::ArgStringList &CC1Args,
2430 StringRef Arch, StringRef Target,
2431 bool isBitCodeSDL) {
2433 Arch,
Target, isBitCodeSDL);
2462 const llvm::opt::ArgList &DriverArgs,
2463 llvm::opt::ArgStringList &CC1Args,
2464 StringRef Arch, StringRef Target,
2465 bool isBitCodeSDL) {
2469 std::optional<std::string> LibPath =
2470 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2473 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2474 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2475 for (StringRef Path : Frags)
2476 LibraryPaths.emplace_back(Path.trim());
2480 for (std::string Search_Dir : DriverArgs.getAllArgValues(options::OPT_L))
2481 LibraryPaths.emplace_back(Search_Dir);
2485 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2486 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2489 llvm::SmallSet<std::string, 16> SDLNames;
2490 static const StringRef HostOnlyArchives[] = {
2491 "omp",
"cudart",
"m",
"gcc",
"gcc_s",
"pthread",
"hip_hcc"};
2492 for (
auto SDLName : DriverArgs.getAllArgValues(options::OPT_l)) {
2493 if (!llvm::is_contained(HostOnlyArchives, SDLName)) {
2494 SDLNames.insert(std::string(
"-l") + SDLName);
2498 for (
auto Input : DriverArgs.getAllArgValues(options::OPT_INPUT)) {
2505 const StringRef LibFileExt =
".lib";
2506 if (!llvm::sys::path::has_extension(
FileName) ||
2508 llvm::sys::path::extension(
FileName).drop_front()) ==
2510 llvm::sys::path::extension(
FileName) == LibFileExt)
2511 SDLNames.insert(Input);
2518 for (
auto SDLName : SDLNames) {
2520 if (!
SDLSearch(D, DriverArgs, CC1Args, LibraryPaths, SDLName, Arch,
Target,
2523 LibraryPaths, SDLName, Arch,
Target,
2529static llvm::opt::Arg *
2531 return Args.getLastArg(options::OPT_mcode_object_version_EQ);
2535 const llvm::opt::ArgList &Args) {
2536 const unsigned MinCodeObjVer = 4;
2537 const unsigned MaxCodeObjVer = 5;
2540 if (CodeObjArg->getOption().getID() ==
2541 options::OPT_mcode_object_version_EQ) {
2542 unsigned CodeObjVer = MaxCodeObjVer;
2544 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2545 if (Remnant || CodeObjVer < MinCodeObjVer || CodeObjVer > MaxCodeObjVer)
2546 D.
Diag(diag::err_drv_invalid_int_value)
2547 << CodeObjArg->getAsString(Args) << CodeObjArg->getValue();
2553 const llvm::opt::ArgList &Args) {
2554 unsigned CodeObjVer = 4;
2556 StringRef(CodeObjArg->getValue()).getAsInteger(0, CodeObjVer);
2561 const Driver &D,
const llvm::opt::ArgList &Args) {
2566 const llvm::opt::ArgList &Args,
2567 llvm::opt::ArgStringList &CmdArgs,
2568 const llvm::Triple &Triple,
bool IsLTO,
2569 const StringRef PluginOptPrefix) {
2570 auto addArg = [&, IsLTO](
const Twine &Arg) {
2572 assert(!PluginOptPrefix.empty() &&
"Cannot have empty PluginOptPrefix!");
2573 CmdArgs.push_back(Args.MakeArgString(Twine(PluginOptPrefix) + Arg));
2575 CmdArgs.push_back(
"-mllvm");
2576 CmdArgs.push_back(Args.MakeArgString(Arg));
2580 if (Arg *A = Args.getLastArg(options::OPT_moutline,
2581 options::OPT_mno_outline)) {
2582 if (A->getOption().matches(options::OPT_moutline)) {
2586 if (!(Triple.isARM() || Triple.isThumb() ||
2587 Triple.getArch() == llvm::Triple::aarch64 ||
2588 Triple.getArch() == llvm::Triple::aarch64_32)) {
2589 D.
Diag(diag::warn_drv_moutline_unsupported_opt) << Triple.getArchName();
2591 addArg(Twine(
"-enable-machine-outliner"));
2595 addArg(Twine(
"-enable-machine-outliner=never"));
2601 const llvm::opt::ArgList &DriverArgs,
2602 llvm::opt::ArgStringList &CC1Args,
2603 StringRef BitcodeSuffix,
2604 const llvm::Triple &Triple) {
2609 llvm::sys::path::append(DefaultLibPath, CLANG_INSTALL_LIBDIR_BASENAME);
2610 LibraryPaths.emplace_back(DefaultLibPath.c_str());
2613 std::optional<std::string> LibPath =
2614 llvm::sys::Process::GetEnv(
"LIBRARY_PATH");
2617 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,
'\0'};
2618 llvm::SplitString(*LibPath, Frags, EnvPathSeparatorStr);
2619 for (StringRef Path : Frags)
2620 LibraryPaths.emplace_back(Path.trim());
2623 OptSpecifier LibomptargetBCPathOpt =
2624 Triple.isAMDGCN() ? options::OPT_libomptarget_amdgpu_bc_path_EQ
2625 : options::OPT_libomptarget_nvptx_bc_path_EQ;
2627 StringRef ArchPrefix = Triple.isAMDGCN() ?
"amdgpu" :
"nvptx";
2628 std::string LibOmpTargetName =
2629 (
"libomptarget-" + ArchPrefix +
"-" + BitcodeSuffix +
".bc").str();
2632 if (
const Arg *A = DriverArgs.getLastArg(LibomptargetBCPathOpt)) {
2634 if (llvm::sys::fs::exists(LibOmpTargetFile) &&
2635 llvm::sys::fs::is_directory(LibOmpTargetFile)) {
2636 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2639 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2640 CC1Args.push_back(
"-mlink-builtin-bitcode");
2641 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2643 D.
Diag(diag::err_drv_omp_offload_target_bcruntime_not_found)
2644 << LibOmpTargetFile;
2647 bool FoundBCLibrary =
false;
2649 for (StringRef LibraryPath : LibraryPaths) {
2651 llvm::sys::path::append(LibOmpTargetFile, LibOmpTargetName);
2652 if (llvm::sys::fs::exists(LibOmpTargetFile)) {
2653 CC1Args.push_back(
"-mlink-builtin-bitcode");
2654 CC1Args.push_back(DriverArgs.MakeArgString(LibOmpTargetFile));
2655 FoundBCLibrary =
true;
2660 if (!FoundBCLibrary)
2661 D.
Diag(diag::err_drv_omp_offload_target_missingbcruntime)
2662 << LibOmpTargetName << ArchPrefix;
2666 const llvm::opt::ArgList &Args,
2667 llvm::opt::ArgStringList &CmdArgs) {
2669 !Args.hasArg(options::OPT_nostdlib) &&
2670 !Args.hasArg(options::OPT_no_hip_rt)) {
2674 for (
auto *Arg : Args.filtered(options::OPT_no_hip_rt)) {
static unsigned ParseDebugDefaultVersion(const ToolChain &TC, const ArgList &Args)
static void getWebAssemblyTargetFeatures(const Driver &D, const llvm::Triple &Triple, const ArgList &Args, std::vector< StringRef > &Features)
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static llvm::opt::Arg * getAMDGPUCodeObjectArgument(const Driver &D, const llvm::opt::ArgList &Args)
static void collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
static 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 void addOpenMPDeviceLibC(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs)
Adds the '-lcgpu' and '-lmgpu' libraries to the compilation to include the LLVM C library for GPUs.
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.
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...
std::string ResourceDir
The path to the compiler resource directory.
llvm::vfs::FileSystem & getVFS() const
std::string GetTemporaryPath(StringRef Prefix, StringRef Suffix) const
GetTemporaryPath - Return the pathname of a temporary file to use as part of compilation; the file wi...
std::string Dir
The path the driver executable was in, as invoked from the command line.
@ OMPRT_IOMP5
The legacy name for the LLVM OpenMP runtime from when it was the Intel OpenMP runtime.
@ OMPRT_OMP
The LLVM OpenMP runtime.
@ OMPRT_Unknown
An unknown OpenMP runtime.
@ OMPRT_GOMP
The GNU OpenMP runtime.
std::string getTargetTriple() const
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
std::vector< std::string > flags_list
bool needsFuzzerInterceptors() const
bool needsHwasanAliasesRt() const
bool needsStatsRt() const
bool needsMemProfRt() const
bool needsCfiDiagRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsHwasanRt() const
bool hasCrossDsoCfi() const
bool hasMemtagHeap() const
bool needsSafeStackRt() const
bool requiresMinimalRuntime() const
bool hasMemtagStack() const
bool needsDfsanRt() const
bool needsScudoRt() const
const std::string & getMemtagMode() const
bool needsSharedRt() const
bool linkCXXRuntimes() const
llvm::ArrayRef< std::string > modeList() const
bool isLLVMIR(ID Id)
Is this LLVM IR.
ID lookupTypeForExtension(llvm::StringRef Ext)
lookupTypeForExtension - Lookup the type to use for the file extension Ext.
bool willEmitRemarks(const llvm::opt::ArgList &Args)
llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, llvm::StringRef OffloadArch)
Get processor name from target ID.
static constexpr ResponseFileSupport AtFileCurCP()