24 #include "clang/Config/config.h"
34 #include "llvm/ADT/STLExtras.h"
35 #include "llvm/ADT/SmallString.h"
36 #include "llvm/ADT/StringExtras.h"
37 #include "llvm/ADT/StringSwitch.h"
38 #include "llvm/ADT/Twine.h"
39 #include "llvm/Option/Arg.h"
40 #include "llvm/Option/ArgList.h"
41 #include "llvm/Option/Option.h"
42 #include "llvm/Support/CodeGen.h"
43 #include "llvm/Support/Compression.h"
44 #include "llvm/Support/ErrorHandling.h"
45 #include "llvm/Support/FileSystem.h"
46 #include "llvm/Support/Host.h"
47 #include "llvm/Support/Path.h"
48 #include "llvm/Support/Process.h"
49 #include "llvm/Support/Program.h"
50 #include "llvm/Support/ScopedPrinter.h"
51 #include "llvm/Support/TargetParser.h"
52 #include "llvm/Support/YAMLParser.h"
54 using namespace clang::driver;
55 using namespace clang::driver::tools;
56 using namespace clang;
57 using namespace llvm::opt;
62 Paths.push_back(Path.str());
66 std::vector<StringRef> &Features,
68 for (
const Arg *A : Args.filtered(Group)) {
69 StringRef
Name = A->getOption().getName();
73 assert(Name.startswith(
"m") &&
"Invalid feature name.");
74 Name = Name.substr(1);
76 bool IsNegative = Name.startswith(
"no-");
78 Name = Name.substr(3);
79 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
84 const char *ArgName,
const char *EnvVar) {
85 const char *DirList = ::getenv(EnvVar);
86 bool CombinedArg =
false;
91 StringRef
Name(ArgName);
92 if (Name.equals(
"-I") || Name.equals(
"-L"))
95 StringRef Dirs(DirList);
99 StringRef::size_type Delim;
100 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
103 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
105 CmdArgs.push_back(ArgName);
106 CmdArgs.push_back(
".");
111 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
113 CmdArgs.push_back(ArgName);
114 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
117 Dirs = Dirs.substr(Delim + 1);
122 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
124 CmdArgs.push_back(ArgName);
125 CmdArgs.push_back(
".");
129 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
131 CmdArgs.push_back(ArgName);
132 CmdArgs.push_back(Args.MakeArgString(Dirs));
138 const ArgList &Args, ArgStringList &CmdArgs,
144 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
146 for (
const auto &II : Inputs) {
150 if (
auto *IA = II.getAction())
160 if (II.isFilename()) {
161 CmdArgs.push_back(II.getFilename());
166 const Arg &A = II.getInputArg();
169 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
171 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
173 else if (A.getOption().matches(options::OPT_z)) {
176 A.render(Args, CmdArgs);
178 A.renderAsInput(Args, CmdArgs);
190 std::vector<StringRef> &Features,
191 OptSpecifier OnOpt, OptSpecifier OffOpt,
192 StringRef FeatureName) {
193 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
194 if (A->getOption().matches(OnOpt))
195 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
197 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
203 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
204 const char *GPUName = A->getValue();
205 return llvm::StringSwitch<const char *>(GPUName)
206 .Cases(
"rv630",
"rv635",
"r600")
207 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
208 .Case(
"rv740",
"rv770")
209 .Case(
"palm",
"cedar")
210 .Cases(
"sumo",
"sumo2",
"sumo")
211 .Case(
"hemlock",
"cypress")
212 .Case(
"aruba",
"cayman")
219 Arg *A = Args.getLastArg(options::OPT_mcpu_EQ);
221 A = Args.getLastArg(options::OPT_march_EQ);
226 const char *name = A->getValue();
227 return llvm::StringSwitch<const char *>(name)
228 .Case(
"r1",
"nios2r1")
229 .Case(
"r2",
"nios2r2")
234 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
235 return A->getValue();
243 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
244 StringRef CPU = A->getValue();
250 return llvm::sys::getHostCPUName();
263 switch (T.getArch()) {
267 case llvm::Triple::aarch64:
268 case llvm::Triple::aarch64_be:
271 case llvm::Triple::arm:
272 case llvm::Triple::armeb:
273 case llvm::Triple::thumb:
274 case llvm::Triple::thumbeb: {
275 StringRef MArch, MCPU;
280 case llvm::Triple::avr:
281 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
282 return A->getValue();
285 case llvm::Triple::nios2: {
289 case llvm::Triple::mips:
290 case llvm::Triple::mipsel:
291 case llvm::Triple::mips64:
292 case llvm::Triple::mips64el: {
299 case llvm::Triple::nvptx:
300 case llvm::Triple::nvptx64:
301 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
302 return A->getValue();
305 case llvm::Triple::ppc:
306 case llvm::Triple::ppc64:
307 case llvm::Triple::ppc64le: {
312 if (TargetCPUName.empty() && !T.isOSDarwin()) {
313 if (T.getArch() == llvm::Triple::ppc64)
314 TargetCPUName =
"ppc64";
315 else if (T.getArch() == llvm::Triple::ppc64le)
316 TargetCPUName =
"ppc64le";
318 TargetCPUName =
"ppc";
320 return TargetCPUName;
323 case llvm::Triple::sparc:
324 case llvm::Triple::sparcel:
325 case llvm::Triple::sparcv9:
326 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
327 return A->getValue();
330 case llvm::Triple::x86:
331 case llvm::Triple::x86_64:
334 case llvm::Triple::hexagon:
338 case llvm::Triple::lanai:
341 case llvm::Triple::systemz:
344 case llvm::Triple::r600:
345 case llvm::Triple::amdgcn:
348 case llvm::Triple::wasm32:
349 case llvm::Triple::wasm64:
355 unsigned Parallelism = 0;
356 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
358 StringRef(LtoJobsArg->getValue()).getAsInteger(10, Parallelism))
359 D.
Diag(diag::err_drv_invalid_int_value) << LtoJobsArg->getAsString(Args)
360 << LtoJobsArg->getValue();
367 return Triple.getOS() == llvm::Triple::CloudABI ||
368 Triple.getArch() == llvm::Triple::wasm32 ||
369 Triple.getArch() == llvm::Triple::wasm64;
373 ArgStringList &CmdArgs,
bool IsThinLTO,
378 CmdArgs.push_back(
"-plugin");
380 ToolChain.
getDriver().
Dir +
"/../lib" CLANG_LIBDIR_SUFFIX
"/LLVMgold.so";
381 CmdArgs.push_back(Args.MakeArgString(Plugin));
389 CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-opt=mcpu=") + CPU));
391 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
393 if (A->getOption().matches(options::OPT_O4) ||
394 A->getOption().matches(options::OPT_Ofast))
396 else if (A->getOption().matches(options::OPT_O))
397 OOpt = A->getValue();
398 else if (A->getOption().matches(options::OPT_O0))
401 CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-opt=O") + OOpt));
405 CmdArgs.push_back(
"-plugin-opt=thinlto");
408 CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-opt=jobs=") +
409 llvm::to_string(Parallelism)));
412 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
413 options::OPT_ggdbN_Group)) {
414 if (A->getOption().matches(options::OPT_glldb))
415 CmdArgs.push_back(
"-plugin-opt=-debugger-tune=lldb");
416 else if (A->getOption().matches(options::OPT_gsce))
417 CmdArgs.push_back(
"-plugin-opt=-debugger-tune=sce");
419 CmdArgs.push_back(
"-plugin-opt=-debugger-tune=gdb");
422 bool UseSeparateSections =
425 if (Args.hasFlag(options::OPT_ffunction_sections,
426 options::OPT_fno_function_sections, UseSeparateSections)) {
427 CmdArgs.push_back(
"-plugin-opt=-function-sections");
430 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
431 UseSeparateSections)) {
432 CmdArgs.push_back(
"-plugin-opt=-data-sections");
436 StringRef FName = A->getValue();
437 if (!llvm::sys::fs::exists(FName))
438 D.
Diag(diag::err_drv_no_such_file) << FName;
441 Args.MakeArgString(Twine(
"-plugin-opt=sample-profile=") + FName));
446 ArgStringList &CmdArgs) {
449 CmdArgs.push_back(
"-rpath");
450 CmdArgs.push_back(Args.MakeArgString(CandidateRPath.c_str()));
455 const ArgList &Args,
bool IsOffloadingHost,
457 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
458 options::OPT_fno_openmp,
false))
463 CmdArgs.push_back(
"-lomp");
466 CmdArgs.push_back(
"-lgomp");
469 CmdArgs.push_back(
"-lrt");
472 CmdArgs.push_back(
"-liomp5");
479 if (IsOffloadingHost)
480 CmdArgs.push_back(
"-lomptarget");
488 ArgStringList &CmdArgs, StringRef Sanitizer,
489 bool IsShared,
bool IsWhole) {
492 if (IsWhole) CmdArgs.push_back(
"-whole-archive");
494 if (IsWhole) CmdArgs.push_back(
"-no-whole-archive");
504 ArgStringList &CmdArgs,
505 StringRef Sanitizer) {
507 if (llvm::sys::fs::exists(SanRT +
".syms")) {
508 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
515 ArgStringList &CmdArgs) {
518 CmdArgs.push_back(
"--no-as-needed");
520 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS) {
521 CmdArgs.push_back(
"-lpthread");
522 CmdArgs.push_back(
"-lrt");
524 CmdArgs.push_back(
"-lm");
526 if (TC.
getTriple().getOS() != llvm::Triple::FreeBSD &&
527 TC.
getTriple().getOS() != llvm::Triple::NetBSD &&
528 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
529 CmdArgs.push_back(
"-ldl");
542 SharedRuntimes.push_back(
"asan");
546 StaticRuntimes.push_back(
"stats_client");
549 if (Args.hasArg(options::OPT_shared) || TC.
getTriple().isAndroid()) {
555 HelperStaticRuntimes.push_back(
"asan-preinit");
557 StaticRuntimes.push_back(
"asan");
559 StaticRuntimes.push_back(
"asan_cxx");
563 StaticRuntimes.push_back(
"dfsan");
565 StaticRuntimes.push_back(
"lsan");
567 StaticRuntimes.push_back(
"msan");
569 StaticRuntimes.push_back(
"msan_cxx");
572 StaticRuntimes.push_back(
"tsan");
574 StaticRuntimes.push_back(
"tsan_cxx");
577 StaticRuntimes.push_back(
"ubsan_standalone");
579 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
582 NonWholeStaticRuntimes.push_back(
"safestack");
583 RequiredSymbols.push_back(
"__safestack_init");
586 StaticRuntimes.push_back(
"cfi");
588 StaticRuntimes.push_back(
"cfi_diag");
590 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
593 NonWholeStaticRuntimes.push_back(
"stats");
594 RequiredSymbols.push_back(
"__sanitizer_stats_register");
597 StaticRuntimes.push_back(
"esan");
602 ArgStringList &CmdArgs) {
605 llvm::sys::path::append(P,
"lib",
"libLLVMFuzzer.a");
606 CmdArgs.push_back(Args.MakeArgString(P));
614 ArgStringList &CmdArgs) {
616 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
618 NonWholeStaticRuntimes, HelperStaticRuntimes,
622 && !Args.hasArg(options::OPT_shared)) {
626 for (
auto RT : SharedRuntimes)
628 for (
auto RT : HelperStaticRuntimes)
630 bool AddExportDynamic =
false;
631 for (
auto RT : StaticRuntimes) {
635 for (
auto RT : NonWholeStaticRuntimes) {
639 for (
auto S : RequiredSymbols) {
640 CmdArgs.push_back(
"-u");
641 CmdArgs.push_back(Args.MakeArgString(
S));
645 if (AddExportDynamic)
646 CmdArgs.push_back(
"-export-dynamic");
650 CmdArgs.push_back(
"-export-dynamic-symbol=__cfi_check");
652 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
657 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
658 return !A->getOption().matches(options::OPT_O0);
664 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
665 if (FinalOutput && Args.hasArg(options::OPT_c)) {
667 llvm::sys::path::replace_extension(T,
"dwo");
668 return Args.MakeArgString(T);
672 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
674 llvm::sys::path::replace_extension(F,
"dwo");
676 return Args.MakeArgString(F);
681 const JobAction &JA,
const ArgList &Args,
682 const InputInfo &Output,
const char *OutFile) {
683 ArgStringList ExtractArgs;
684 ExtractArgs.push_back(
"--extract-dwo");
686 ArgStringList StripArgs;
687 StripArgs.push_back(
"--strip-dwo");
692 ExtractArgs.push_back(OutFile);
694 const char *Exec = Args.MakeArgString(TC.
GetProgramPath(
"objcopy"));
698 C.
addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
701 C.
addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
710 Args.ClaimAllArgs(options::OPT_flto_EQ);
711 Args.ClaimAllArgs(options::OPT_flto);
712 Args.ClaimAllArgs(options::OPT_fno_lto);
716 auto *ProfileUseArg = Args.getLastArg(
717 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
718 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
719 options::OPT_fno_profile_instr_use);
722 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
723 ProfileUseArg =
nullptr;
725 return ProfileUseArg;
729 auto *ProfileSampleUseArg = Args.getLastArg(
730 options::OPT_fprofile_sample_use, options::OPT_fprofile_sample_use_EQ,
731 options::OPT_fauto_profile, options::OPT_fauto_profile_EQ,
732 options::OPT_fno_profile_sample_use, options::OPT_fno_auto_profile);
734 if (ProfileSampleUseArg &&
735 (ProfileSampleUseArg->getOption().matches(
736 options::OPT_fno_profile_sample_use) ||
737 ProfileSampleUseArg->getOption().matches(options::OPT_fno_auto_profile)))
740 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ,
741 options::OPT_fauto_profile_EQ);
748 std::tuple<llvm::Reloc::Model, unsigned, bool>
751 const llvm::Triple &Triple = ToolChain.
getTriple();
756 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
758 bool IsPICLevelTwo = PIC;
761 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
764 if (Triple.isAndroid()) {
765 switch (Triple.getArch()) {
766 case llvm::Triple::arm:
767 case llvm::Triple::armeb:
768 case llvm::Triple::thumb:
769 case llvm::Triple::thumbeb:
770 case llvm::Triple::aarch64:
771 case llvm::Triple::mips:
772 case llvm::Triple::mipsel:
773 case llvm::Triple::mips64:
774 case llvm::Triple::mips64el:
778 case llvm::Triple::x86:
779 case llvm::Triple::x86_64:
781 IsPICLevelTwo =
true;
790 if (Triple.getOS() == llvm::Triple::OpenBSD) {
792 case llvm::Triple::arm:
793 case llvm::Triple::aarch64:
794 case llvm::Triple::mips64:
795 case llvm::Triple::mips64el:
796 case llvm::Triple::x86:
797 case llvm::Triple::x86_64:
798 IsPICLevelTwo =
false;
801 case llvm::Triple::ppc:
802 case llvm::Triple::sparc:
803 case llvm::Triple::sparcel:
804 case llvm::Triple::sparcv9:
805 IsPICLevelTwo =
true;
817 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
818 options::OPT_fpic, options::OPT_fno_pic,
819 options::OPT_fPIE, options::OPT_fno_PIE,
820 options::OPT_fpie, options::OPT_fno_pie);
821 if (Triple.isOSWindows() && LastPICArg &&
823 Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
824 options::OPT_fPIE, options::OPT_fpie)) {
825 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
826 << LastPICArg->getSpelling() << Triple.str();
827 if (Triple.getArch() == llvm::Triple::x86_64)
828 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
829 return std::make_tuple(llvm::Reloc::Static, 0U,
false);
836 Option O = LastPICArg->getOption();
837 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
838 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
839 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
841 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
843 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
846 if (EffectiveTriple.isPS4CPU()) {
847 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
848 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
849 if (Model !=
"kernel") {
852 << LastPICArg->getSpelling();
862 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS4CPU()))
868 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
869 !EffectiveTriple.isWatchOS()))
872 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
875 if (!Triple.isOSDarwin())
876 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
877 << A->getSpelling() << Triple.str();
886 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0U,
false);
889 bool EmbeddedPISupported;
890 switch (Triple.getArch()) {
891 case llvm::Triple::arm:
892 case llvm::Triple::armeb:
893 case llvm::Triple::thumb:
894 case llvm::Triple::thumbeb:
895 EmbeddedPISupported =
true;
898 EmbeddedPISupported =
false;
902 bool ROPI =
false, RWPI =
false;
903 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
904 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
905 if (!EmbeddedPISupported)
906 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
907 << LastROPIArg->getSpelling() << Triple.str();
910 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
911 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
912 if (!EmbeddedPISupported)
913 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
914 << LastRWPIArg->getSpelling() << Triple.str();
919 if ((ROPI || RWPI) && (PIC || PIE))
920 ToolChain.
getDriver().
Diag(diag::err_drv_ropi_rwpi_incompatible_with_pic);
924 if ((Triple.getArch() == llvm::Triple::mips64 ||
925 Triple.getArch() == llvm::Triple::mips64el) &&
926 Args.hasArg(options::OPT_mno_abicalls))
927 return std::make_tuple(llvm::Reloc::Static, 0U,
false);
930 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
932 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
934 RelocM = llvm::Reloc::ROPI_RWPI;
936 RelocM = llvm::Reloc::ROPI;
938 RelocM = llvm::Reloc::RWPI;
940 return std::make_tuple(RelocM, 0U,
false);
944 ArgStringList &CmdArgs) {
945 llvm::Reloc::Model RelocationModel;
948 std::tie(RelocationModel, PICLevel, IsPIE) =
ParsePICArgs(ToolChain, Args);
950 if (RelocationModel != llvm::Reloc::Static)
951 CmdArgs.push_back(
"-KPIC");
957 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
961 ArgStringList &CmdArgs,
const ArgList &Args) {
962 bool isAndroid = Triple.isAndroid();
963 bool isCygMing = Triple.isOSCygMing();
964 bool IsIAMCU = Triple.isOSIAMCU();
965 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
966 Args.hasArg(options::OPT_static);
968 CmdArgs.push_back(
"-lgcc");
970 if (StaticLibgcc || isAndroid) {
972 CmdArgs.push_back(
"-lgcc");
975 CmdArgs.push_back(
"--as-needed");
976 CmdArgs.push_back(
"-lgcc_s");
978 CmdArgs.push_back(
"--no-as-needed");
981 if (StaticLibgcc && !isAndroid && !IsIAMCU)
982 CmdArgs.push_back(
"-lgcc_eh");
983 else if (!Args.hasArg(options::OPT_shared) && D.
CCCIsCXX())
984 CmdArgs.push_back(
"-lgcc");
991 if (isAndroid && !StaticLibgcc)
992 CmdArgs.push_back(
"-ldl");
996 ArgStringList &CmdArgs,
const ArgList &Args) {
1004 llvm_unreachable(
"unsupported OS");
1005 case llvm::Triple::Win32:
1006 case llvm::Triple::Linux:
1007 case llvm::Triple::Fuchsia:
1014 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1017 if (Args.hasArg(options::OPT_rtlib_EQ)) {
1018 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
1019 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() <<
"MSVC";
Defines types useful for describing an Objective-C runtime.
DiagnosticBuilder Diag(unsigned DiagID) const
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
bool needsDfsanRt() const
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
static void AddLibgcc(const llvm::Triple &Triple, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
std::string Dir
The path the driver executable was in, as invoked from the command line.
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const
Compute the desired OpenMP runtime from the flags provided.
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
static std::string getNios2TargetCPU(const ArgList &Args)
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
An unknown OpenMP runtime.
static void addLibFuzzerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs)
bool needsSharedAsanRt() const
Defines the clang::LangOptions interface.
static StringRef getWebAssemblyTargetCPU(const ArgList &Args)
Get the (LLVM) name of the WebAssembly cpu we are targeting.
Defines version macros and version-related utility functions for Clang.
bool needsUbsanRt() const
bool hasCrossDsoCfi() const
void addCommand(std::unique_ptr< Command > C)
bool isHostOffloading(OffloadKind OKind) const
Check if this action have any offload kinds.
vfs::FileSystem & getVFS() const
The legacy name for the LLVM OpenMP runtime from when it was the Intel OpenMP runtime.
std::string InstalledDir
The path to the installed clang directory, if any.
bool needsSafeStackRt() const
Defines the virtual file system interface vfs::FileSystem.
static std::string getLanaiTargetCPU(const ArgList &Args)
bool needsCfiDiagRt() const
bool exists(const Twine &Path)
Check whether a file exists. Provided for convenience.
Compilation - A set of tasks to perform for a single driver invocation.
bool needsStatsRt() const
static std::string getR600TargetGPU(const ArgList &Args)
Get the (LLVM) name of the R600 gpu we are targeting.
bool isLLVMIR(ID Id)
Is this LLVM IR.
bool linkCXXRuntimes() const
static void collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)