23 #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/Debug.h" 45 #include "llvm/Support/ErrorHandling.h" 46 #include "llvm/Support/FileSystem.h" 47 #include "llvm/Support/Host.h" 48 #include "llvm/Support/Path.h" 49 #include "llvm/Support/Process.h" 50 #include "llvm/Support/Program.h" 51 #include "llvm/Support/ScopedPrinter.h" 52 #include "llvm/Support/TargetParser.h" 53 #include "llvm/Support/VirtualFileSystem.h" 54 #include "llvm/Support/YAMLParser.h" 58 using namespace clang;
63 if (D.
getVFS().exists(Path))
64 Paths.push_back(Path.str());
68 std::vector<StringRef> &Features,
70 for (
const Arg *A : Args.filtered(Group)) {
71 StringRef Name = A->getOption().getName();
75 assert(Name.startswith(
"m") &&
"Invalid feature name.");
76 Name = Name.substr(1);
78 bool IsNegative = Name.startswith(
"no-");
80 Name = Name.substr(3);
81 Features.push_back(Args.MakeArgString((IsNegative ?
"-" :
"+") + Name));
86 const char *ArgName,
const char *EnvVar) {
87 const char *DirList = ::getenv(EnvVar);
88 bool CombinedArg =
false;
93 StringRef Name(ArgName);
94 if (Name.equals(
"-I") || Name.equals(
"-L"))
97 StringRef Dirs(DirList);
101 StringRef::size_type Delim;
102 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
105 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
107 CmdArgs.push_back(ArgName);
108 CmdArgs.push_back(
".");
113 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
115 CmdArgs.push_back(ArgName);
116 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
119 Dirs = Dirs.substr(Delim + 1);
124 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) +
"."));
126 CmdArgs.push_back(ArgName);
127 CmdArgs.push_back(
".");
131 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
133 CmdArgs.push_back(ArgName);
134 CmdArgs.push_back(Args.MakeArgString(Dirs));
140 const ArgList &Args, ArgStringList &CmdArgs,
146 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
153 for (
const auto &II : Inputs) {
157 if (
auto *IA = II.getAction())
169 if (II.isFilename()) {
170 CmdArgs.push_back(II.getFilename());
175 const Arg &A = II.getInputArg();
178 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
180 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
182 else if (A.getOption().matches(options::OPT_z)) {
185 A.render(Args, CmdArgs);
187 A.renderAsInput(Args, CmdArgs);
193 std::vector<StringRef> &Features,
194 OptSpecifier OnOpt, OptSpecifier OffOpt,
195 StringRef FeatureName) {
196 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
197 if (A->getOption().matches(OnOpt))
198 Features.push_back(Args.MakeArgString(
"+" + FeatureName));
200 Features.push_back(Args.MakeArgString(
"-" + FeatureName));
206 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
207 const char *GPUName = A->getValue();
208 return llvm::StringSwitch<const char *>(GPUName)
209 .Cases(
"rv630",
"rv635",
"r600")
210 .Cases(
"rv610",
"rv620",
"rs780",
"rs880")
211 .Case(
"rv740",
"rv770")
212 .Case(
"palm",
"cedar")
213 .Cases(
"sumo",
"sumo2",
"sumo")
214 .Case(
"hemlock",
"cypress")
215 .Case(
"aruba",
"cayman")
222 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
223 return A->getValue();
231 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
232 StringRef CPU = A->getValue();
238 return llvm::sys::getHostCPUName();
251 switch (T.getArch()) {
255 case llvm::Triple::aarch64:
256 case llvm::Triple::aarch64_32:
257 case llvm::Triple::aarch64_be:
260 case llvm::Triple::arm:
261 case llvm::Triple::armeb:
262 case llvm::Triple::thumb:
263 case llvm::Triple::thumbeb: {
264 StringRef MArch, MCPU;
269 case llvm::Triple::avr:
270 if (
const Arg *A = Args.getLastArg(options::OPT_mmcu_EQ))
271 return A->getValue();
274 case llvm::Triple::mips:
275 case llvm::Triple::mipsel:
276 case llvm::Triple::mips64:
277 case llvm::Triple::mips64el: {
284 case llvm::Triple::nvptx:
285 case llvm::Triple::nvptx64:
286 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
287 return A->getValue();
290 case llvm::Triple::ppc:
291 case llvm::Triple::ppc64:
292 case llvm::Triple::ppc64le: {
297 if (TargetCPUName.empty() && !T.isOSDarwin()) {
298 if (T.getArch() == llvm::Triple::ppc64)
299 TargetCPUName =
"ppc64";
300 else if (T.getArch() == llvm::Triple::ppc64le)
301 TargetCPUName =
"ppc64le";
303 TargetCPUName =
"ppc";
305 return TargetCPUName;
308 case llvm::Triple::bpfel:
309 case llvm::Triple::bpfeb:
310 case llvm::Triple::sparc:
311 case llvm::Triple::sparcel:
312 case llvm::Triple::sparcv9:
313 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
314 return A->getValue();
317 case llvm::Triple::x86:
318 case llvm::Triple::x86_64:
321 case llvm::Triple::hexagon:
325 case llvm::Triple::lanai:
328 case llvm::Triple::systemz:
331 case llvm::Triple::r600:
332 case llvm::Triple::amdgcn:
335 case llvm::Triple::wasm32:
336 case llvm::Triple::wasm64:
342 unsigned Parallelism = 0;
343 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
345 StringRef(LtoJobsArg->getValue()).getAsInteger(10, Parallelism))
346 D.
Diag(diag::err_drv_invalid_int_value) << LtoJobsArg->getAsString(Args)
347 << LtoJobsArg->getValue();
353 return Triple.getOS() == llvm::Triple::CloudABI;
357 ArgStringList &CmdArgs,
const InputInfo &Output,
358 const InputInfo &Input,
bool IsThinLTO) {
362 CmdArgs.push_back(
"-plugin");
365 const char *Suffix =
".dll";
366 #elif defined(__APPLE__) 367 const char *Suffix =
".dylib";
369 const char *Suffix =
".so";
373 llvm::sys::path::native(Twine(ToolChain.
getDriver().
Dir) +
374 "/../lib" CLANG_LIBDIR_SUFFIX
"/LLVMgold" +
377 CmdArgs.push_back(Args.MakeArgString(Plugin));
385 CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-opt=mcpu=") + CPU));
387 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
389 if (A->getOption().matches(options::OPT_O4) ||
390 A->getOption().matches(options::OPT_Ofast))
392 else if (A->getOption().matches(options::OPT_O))
393 OOpt = A->getValue();
394 else if (A->getOption().matches(options::OPT_O0))
397 CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-opt=O") + OOpt));
400 if (Args.hasArg(options::OPT_gsplit_dwarf)) {
402 Args.MakeArgString(Twine(
"-plugin-opt=dwo_dir=") +
407 CmdArgs.push_back(
"-plugin-opt=thinlto");
411 Args.MakeArgString(
"-plugin-opt=jobs=" + Twine(Parallelism)));
414 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
415 options::OPT_ggdbN_Group)) {
416 if (A->getOption().matches(options::OPT_glldb))
417 CmdArgs.push_back(
"-plugin-opt=-debugger-tune=lldb");
418 else if (A->getOption().matches(options::OPT_gsce))
419 CmdArgs.push_back(
"-plugin-opt=-debugger-tune=sce");
421 CmdArgs.push_back(
"-plugin-opt=-debugger-tune=gdb");
424 bool UseSeparateSections =
427 if (Args.hasFlag(options::OPT_ffunction_sections,
428 options::OPT_fno_function_sections, UseSeparateSections)) {
429 CmdArgs.push_back(
"-plugin-opt=-function-sections");
432 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
433 UseSeparateSections)) {
434 CmdArgs.push_back(
"-plugin-opt=-data-sections");
438 StringRef FName = A->getValue();
439 if (!llvm::sys::fs::exists(FName))
440 ToolChain.
getDriver().
Diag(diag::err_drv_no_such_file) << FName;
443 Args.MakeArgString(Twine(
"-plugin-opt=sample-profile=") + FName));
446 auto *CSPGOGenerateArg = Args.getLastArg(options::OPT_fcs_profile_generate,
447 options::OPT_fcs_profile_generate_EQ,
448 options::OPT_fno_profile_generate);
449 if (CSPGOGenerateArg &&
450 CSPGOGenerateArg->getOption().matches(options::OPT_fno_profile_generate))
451 CSPGOGenerateArg =
nullptr;
455 if (CSPGOGenerateArg) {
456 CmdArgs.push_back(Args.MakeArgString(
"-plugin-opt=cs-profile-generate"));
457 if (CSPGOGenerateArg->getOption().matches(
458 options::OPT_fcs_profile_generate_EQ)) {
460 llvm::sys::path::append(Path,
"default_%m.profraw");
462 Args.MakeArgString(Twine(
"-plugin-opt=cs-profile-path=") + Path));
465 Args.MakeArgString(
"-plugin-opt=cs-profile-path=default_%m.profraw"));
466 }
else if (ProfileUseArg) {
468 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
469 if (Path.empty() || llvm::sys::fs::is_directory(Path))
470 llvm::sys::path::append(Path,
"default.profdata");
471 CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-opt=cs-profile-path=") +
476 if (Args.hasFlag(options::OPT_fexperimental_new_pass_manager,
477 options::OPT_fno_experimental_new_pass_manager,
478 ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER)) {
479 CmdArgs.push_back(
"-plugin-opt=new-pass-manager");
485 if (!StatsFile.empty())
487 Args.MakeArgString(Twine(
"-plugin-opt=stats-file=") + StatsFile));
491 ArgStringList &CmdArgs) {
492 if (!Args.hasFlag(options::OPT_frtlib_add_rpath,
493 options::OPT_fno_rtlib_add_rpath,
false))
497 if (TC.
getVFS().exists(CandidateRPath)) {
498 CmdArgs.push_back(
"-rpath");
499 CmdArgs.push_back(Args.MakeArgString(CandidateRPath.c_str()));
504 const ArgList &Args,
bool ForceStaticHostRuntime,
505 bool IsOffloadingHost,
bool GompNeedsRT) {
506 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
507 options::OPT_fno_openmp,
false))
516 if (ForceStaticHostRuntime)
517 CmdArgs.push_back(
"-Bstatic");
521 CmdArgs.push_back(
"-lomp");
524 CmdArgs.push_back(
"-lgomp");
527 CmdArgs.push_back(
"-liomp5");
533 if (ForceStaticHostRuntime)
534 CmdArgs.push_back(
"-Bdynamic");
537 CmdArgs.push_back(
"-lrt");
539 if (IsOffloadingHost)
540 CmdArgs.push_back(
"-lomptarget");
548 ArgStringList &CmdArgs, StringRef Sanitizer,
549 bool IsShared,
bool IsWhole) {
552 if (IsWhole) CmdArgs.push_back(
"--whole-archive");
555 if (IsWhole) CmdArgs.push_back(
"--no-whole-archive");
565 ArgStringList &CmdArgs,
566 StringRef Sanitizer) {
569 if (TC.
getTriple().getOS() == llvm::Triple::Solaris)
574 if (TC.
getTriple().getVendor() == llvm::Triple::Myriad)
577 if (llvm::sys::fs::exists(SanRT +
".syms")) {
578 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
585 ArgStringList &CmdArgs) {
588 CmdArgs.push_back(
"--no-as-needed");
590 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS &&
592 CmdArgs.push_back(
"-lpthread");
594 CmdArgs.push_back(
"-lrt");
596 CmdArgs.push_back(
"-lm");
601 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
602 CmdArgs.push_back(
"-ldl");
606 CmdArgs.push_back(
"-lexecinfo");
620 SharedRuntimes.push_back(
"asan");
621 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
622 HelperStaticRuntimes.push_back(
"asan-preinit");
626 SharedRuntimes.push_back(
"ubsan_minimal");
628 SharedRuntimes.push_back(
"ubsan_standalone");
632 SharedRuntimes.push_back(
"scudo_minimal");
634 SharedRuntimes.push_back(
"scudo");
637 SharedRuntimes.push_back(
"hwasan");
642 StaticRuntimes.push_back(
"stats_client");
645 if (Args.hasArg(options::OPT_shared) || SanArgs.
needsSharedRt()) {
650 StaticRuntimes.push_back(
"asan");
652 StaticRuntimes.push_back(
"asan_cxx");
656 StaticRuntimes.push_back(
"hwasan");
658 StaticRuntimes.push_back(
"hwasan_cxx");
661 StaticRuntimes.push_back(
"dfsan");
663 StaticRuntimes.push_back(
"lsan");
665 StaticRuntimes.push_back(
"msan");
667 StaticRuntimes.push_back(
"msan_cxx");
670 StaticRuntimes.push_back(
"tsan");
672 StaticRuntimes.push_back(
"tsan_cxx");
676 StaticRuntimes.push_back(
"ubsan_minimal");
678 StaticRuntimes.push_back(
"ubsan_standalone");
680 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
684 NonWholeStaticRuntimes.push_back(
"safestack");
685 RequiredSymbols.push_back(
"__safestack_init");
688 StaticRuntimes.push_back(
"cfi");
690 StaticRuntimes.push_back(
"cfi_diag");
692 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
695 NonWholeStaticRuntimes.push_back(
"stats");
696 RequiredSymbols.push_back(
"__sanitizer_stats_register");
700 StaticRuntimes.push_back(
"scudo_minimal");
702 StaticRuntimes.push_back(
"scudo_cxx_minimal");
704 StaticRuntimes.push_back(
"scudo");
706 StaticRuntimes.push_back(
"scudo_cxx");
714 ArgStringList &CmdArgs) {
716 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
718 NonWholeStaticRuntimes, HelperStaticRuntimes,
724 !Args.hasArg(options::OPT_shared)) {
727 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx))
731 for (
auto RT : SharedRuntimes)
733 for (
auto RT : HelperStaticRuntimes)
735 bool AddExportDynamic =
false;
736 for (
auto RT : StaticRuntimes) {
740 for (
auto RT : NonWholeStaticRuntimes) {
744 for (
auto S : RequiredSymbols) {
745 CmdArgs.push_back(
"-u");
746 CmdArgs.push_back(Args.MakeArgString(S));
750 if (AddExportDynamic)
751 CmdArgs.push_back(
"--export-dynamic");
754 CmdArgs.push_back(
"-export-dynamic-symbol=__cfi_check");
756 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
760 if (Args.hasArg(options::OPT_shared))
764 CmdArgs.push_back(
"-whole-archive");
768 CmdArgs.push_back(
"-no-whole-archive");
776 CmdArgs.push_back(
"--no-as-needed");
777 CmdArgs.push_back(
"-lpthread");
779 CmdArgs.push_back(
"-lrt");
780 CmdArgs.push_back(
"-lm");
785 CmdArgs.push_back(
"-ldl");
790 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
791 return !A->getOption().matches(options::OPT_O0);
798 if (Arg *A = Args.getLastArg(options::OPT_gsplit_dwarf_EQ))
799 if (StringRef(A->getValue()) ==
"single")
802 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
803 if (FinalOutput && Args.hasArg(options::OPT_c)) {
805 llvm::sys::path::replace_extension(T,
"dwo");
806 return Args.MakeArgString(T);
810 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
812 llvm::sys::path::replace_extension(F,
"dwo");
814 return Args.MakeArgString(F);
819 const JobAction &JA,
const ArgList &Args,
820 const InputInfo &Output,
const char *OutFile) {
821 ArgStringList ExtractArgs;
822 ExtractArgs.push_back(
"--extract-dwo");
824 ArgStringList StripArgs;
825 StripArgs.push_back(
"--strip-dwo");
830 ExtractArgs.push_back(OutFile);
837 C.
addCommand(std::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
840 C.
addCommand(std::make_unique<Command>(JA, T, Exec, StripArgs, II));
849 Args.ClaimAllArgs(options::OPT_flto_EQ);
850 Args.ClaimAllArgs(options::OPT_flto);
851 Args.ClaimAllArgs(options::OPT_fno_lto);
855 auto *ProfileUseArg = Args.getLastArg(
856 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
857 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
858 options::OPT_fno_profile_instr_use);
861 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
862 ProfileUseArg =
nullptr;
864 return ProfileUseArg;
868 auto *ProfileSampleUseArg = Args.getLastArg(
869 options::OPT_fprofile_sample_use, options::OPT_fprofile_sample_use_EQ,
870 options::OPT_fauto_profile, options::OPT_fauto_profile_EQ,
871 options::OPT_fno_profile_sample_use, options::OPT_fno_auto_profile);
873 if (ProfileSampleUseArg &&
874 (ProfileSampleUseArg->getOption().matches(
875 options::OPT_fno_profile_sample_use) ||
876 ProfileSampleUseArg->getOption().matches(options::OPT_fno_auto_profile)))
879 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ,
880 options::OPT_fauto_profile_EQ);
887 std::tuple<llvm::Reloc::Model, unsigned, bool>
890 const llvm::Triple &Triple = ToolChain.
getTriple();
895 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
897 bool IsPICLevelTwo = PIC;
900 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
903 if (Triple.isAndroid()) {
904 switch (Triple.getArch()) {
905 case llvm::Triple::arm:
906 case llvm::Triple::armeb:
907 case llvm::Triple::thumb:
908 case llvm::Triple::thumbeb:
909 case llvm::Triple::aarch64:
910 case llvm::Triple::mips:
911 case llvm::Triple::mipsel:
912 case llvm::Triple::mips64:
913 case llvm::Triple::mips64el:
917 case llvm::Triple::x86:
918 case llvm::Triple::x86_64:
920 IsPICLevelTwo =
true;
929 if (Triple.isOSOpenBSD()) {
931 case llvm::Triple::arm:
932 case llvm::Triple::aarch64:
933 case llvm::Triple::mips64:
934 case llvm::Triple::mips64el:
935 case llvm::Triple::x86:
936 case llvm::Triple::x86_64:
937 IsPICLevelTwo =
false;
940 case llvm::Triple::ppc:
941 case llvm::Triple::sparc:
942 case llvm::Triple::sparcel:
943 case llvm::Triple::sparcv9:
944 IsPICLevelTwo =
true;
953 if (Triple.getArch() == llvm::Triple::amdgcn)
960 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
961 options::OPT_fpic, options::OPT_fno_pic,
962 options::OPT_fPIE, options::OPT_fno_PIE,
963 options::OPT_fpie, options::OPT_fno_pie);
964 if (Triple.isOSWindows() && LastPICArg &&
966 Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
967 options::OPT_fPIE, options::OPT_fpie)) {
968 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
969 << LastPICArg->getSpelling() << Triple.str();
970 if (Triple.getArch() == llvm::Triple::x86_64)
971 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
972 return std::make_tuple(llvm::Reloc::Static, 0U,
false);
979 Option O = LastPICArg->getOption();
980 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
981 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
982 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
984 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
986 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
989 if (EffectiveTriple.isPS4CPU()) {
990 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
991 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
992 if (Model !=
"kernel") {
995 << LastPICArg->getSpelling();
1005 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS4CPU()))
1011 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
1012 !EffectiveTriple.isWatchOS()))
1015 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
1018 if (!Triple.isOSDarwin())
1019 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1020 << A->getSpelling() << Triple.str();
1029 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0U,
false);
1032 bool EmbeddedPISupported;
1033 switch (Triple.getArch()) {
1034 case llvm::Triple::arm:
1035 case llvm::Triple::armeb:
1036 case llvm::Triple::thumb:
1037 case llvm::Triple::thumbeb:
1038 EmbeddedPISupported =
true;
1041 EmbeddedPISupported =
false;
1045 bool ROPI =
false, RWPI =
false;
1046 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
1047 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
1048 if (!EmbeddedPISupported)
1049 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1050 << LastROPIArg->getSpelling() << Triple.str();
1053 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
1054 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
1055 if (!EmbeddedPISupported)
1056 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
1057 << LastRWPIArg->getSpelling() << Triple.str();
1062 if ((ROPI || RWPI) && (PIC || PIE))
1063 ToolChain.
getDriver().
Diag(diag::err_drv_ropi_rwpi_incompatible_with_pic);
1065 if (Triple.isMIPS()) {
1072 if (ABIName ==
"n64")
1075 if(Args.hasArg(options::OPT_mno_abicalls))
1076 return std::make_tuple(llvm::Reloc::Static, 0U,
false);
1079 IsPICLevelTwo =
false;
1083 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
1085 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
1087 RelocM = llvm::Reloc::ROPI_RWPI;
1089 RelocM = llvm::Reloc::ROPI;
1091 RelocM = llvm::Reloc::RWPI;
1093 return std::make_tuple(RelocM, 0U,
false);
1113 const ArgList &Args) {
1114 const Arg *A = Args.getLastArg(options::OPT_falign_functions,
1115 options::OPT_falign_functions_EQ,
1116 options::OPT_fno_align_functions);
1117 if (!A || A->getOption().matches(options::OPT_fno_align_functions))
1120 if (A->getOption().matches(options::OPT_falign_functions))
1124 if (StringRef(A->getValue()).getAsInteger(10, Value) || Value > 65536)
1126 << A->getAsString(Args) << A->getValue();
1127 return Value ? llvm::Log2_32_Ceil(
std::min(Value, 65536u)) :
Value;
1131 const ArgList &Args) {
1132 const Arg *A = Args.getLastArg(options::OPT_fdebug_default_version);
1138 if (StringRef(A->getValue()).getAsInteger(10, Value) || Value > 5 ||
1141 << A->getAsString(Args) << A->getValue();
1146 ArgStringList &CmdArgs) {
1147 llvm::Reloc::Model RelocationModel;
1150 std::tie(RelocationModel, PICLevel, IsPIE) =
ParsePICArgs(ToolChain, Args);
1152 if (RelocationModel != llvm::Reloc::Static)
1153 CmdArgs.push_back(
"-KPIC");
1159 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
1165 if (Args.hasArg(options::OPT_static_libgcc) ||
1166 Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_static_pie))
1168 if (Args.hasArg(options::OPT_shared_libgcc) || D.
CCCIsCXX())
1187 ArgStringList &CmdArgs,
const ArgList &Args) {
1199 CmdArgs.push_back(
"--as-needed");
1206 CmdArgs.push_back(
"-lgcc_eh");
1208 CmdArgs.push_back(
"-lgcc_s");
1213 CmdArgs.push_back(
"-l:libunwind.a");
1215 CmdArgs.push_back(
"-l:libunwind.so");
1220 CmdArgs.push_back(
"--no-as-needed");
1224 ArgStringList &CmdArgs,
const ArgList &Args) {
1227 CmdArgs.push_back(
"-lgcc");
1230 CmdArgs.push_back(
"-lgcc");
1238 CmdArgs.push_back(
"-ldl");
1242 ArgStringList &CmdArgs,
const ArgList &Args) {
1253 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1256 if (Args.hasArg(options::OPT_rtlib_EQ)) {
1257 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
1258 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() <<
"MSVC";
1274 ArgStringList &CmdArgs,
const JobAction &JA,
1282 for (
const auto &II : Inputs) {
1283 const Action *A = II.getAction();
1286 DeviceInputs.push_back(II);
1290 if (DeviceInputs.empty())
1295 std::string Name = llvm::sys::path::filename(Output.
getFilename());
1297 LKS = C.
getArgs().MakeArgString(Name +
".lk");
1304 CmdArgs.push_back(
"-T");
1305 CmdArgs.push_back(LKS);
1308 std::string LksBuffer;
1309 llvm::raw_string_ostream LksStream(LksBuffer);
1314 assert(HIPTC->getTriple().getArch() == llvm::Triple::amdgcn &&
1318 const char *BundleFile;
1320 BundleFile = C.
getArgs().MakeArgString(Name +
".hipfb");
1331 LksStream <<
"/*\n";
1332 LksStream <<
" HIP Offload Linker Script\n";
1333 LksStream <<
" *** Automatically generated by Clang ***\n";
1334 LksStream <<
"*/\n";
1335 LksStream <<
"TARGET(binary)\n";
1336 LksStream <<
"INPUT(" << BundleFile <<
")\n";
1337 LksStream <<
"SECTIONS\n";
1339 LksStream <<
" .hip_fatbin :\n";
1340 LksStream <<
" ALIGN(0x10)\n";
1341 LksStream <<
" {\n";
1342 LksStream <<
" PROVIDE_HIDDEN(__hip_fatbin = .);\n";
1343 LksStream <<
" " << BundleFile <<
"\n";
1344 LksStream <<
" }\n";
1345 LksStream <<
" /DISCARD/ :\n";
1346 LksStream <<
" {\n";
1347 LksStream <<
" * ( __CLANG_OFFLOAD_BUNDLE__* )\n";
1348 LksStream <<
" }\n";
1350 LksStream <<
"INSERT BEFORE .data\n";
1355 if (C.
getArgs().hasArg(options::OPT_fhip_dump_offload_linker_script))
1356 llvm::errs() << LksBuffer;
1359 if (C.
getArgs().hasArg(options::OPT__HASH_HASH_HASH))
1364 llvm::raw_fd_ostream Lksf(LKS, EC, llvm::sys::fs::OF_None);
1367 C.
getDriver().
Diag(clang::diag::err_unable_to_make_temp) << EC.message();
1378 const Arg *A = Args.getLastArg(options::OPT_save_stats_EQ);
1382 StringRef SaveStats = A->getValue();
1384 if (SaveStats ==
"obj" && Output.
isFilename()) {
1386 llvm::sys::path::remove_filename(StatsFile);
1387 }
else if (SaveStats !=
"cwd") {
1388 D.
Diag(diag::err_drv_invalid_value) << A->getAsString(Args) << SaveStats;
1392 StringRef BaseName = llvm::sys::path::filename(Input.
getBaseInput());
1393 llvm::sys::path::append(StatsFile, BaseName);
1394 llvm::sys::path::replace_extension(StatsFile,
"stats");
1400 Flags.push_back(std::string(Enabled ?
"+" :
"-") + Flag);
bool needsStatsRt() const
OpenMPRuntimeKind getOpenMPRuntime(const llvm::opt::ArgList &Args) const
Compute the desired OpenMP runtime from the flags provided.
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...
bool needsHwasanRt() const
Defines types useful for describing an Objective-C runtime.
bool isHostOffloading(OffloadKind OKind) const
Check if this action have any offload kinds.
DiagnosticBuilder Diag(unsigned DiagID) const
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer, bool IsShared, bool IsWhole)
bool needsUbsanRt() const
bool linkRuntimes() const
std::string Dir
The path the driver executable was in, as invoked from the command line.
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs, StringRef Sanitizer)
Action - Represent an abstract compilation step to perform.
bool isDeviceOffloading(OffloadKind OKind) const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
An unknown OpenMP runtime.
static LibGccType getLibGccType(const Driver &D, const ArgList &Args)
static void AddLibgcc(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
llvm::vfs::FileSystem & getVFS() const
bool hasCrossDsoCfi() const
bool needsCfiDiagRt() const
llvm::ArrayRef< std::string > modeList() const
bool requiresMinimalRuntime() const
Defines the clang::LangOptions interface.
static StringRef getWebAssemblyTargetCPU(const ArgList &Args)
Get the (LLVM) name of the WebAssembly cpu we are targeting.
static void AddUnwindLibrary(const ToolChain &TC, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
Defines version macros and version-related utility functions for Clang.
std::vector< std::string > flags_list
void addCommand(std::unique_ptr< Command > C)
bool needsSafeStackRt() const
bool needsDfsanRt() const
bool needsScudoRt() const
const llvm::opt::DerivedArgList & getArgs() const
The legacy name for the LLVM OpenMP runtime from when it was the Intel OpenMP runtime.
bool CCCIsCXX() const
Whether the driver should follow g++ like behavior.
bool isSaveTempsEnabled() const
Dataflow Directional Tag Classes.
static std::string getLanaiTargetCPU(const ArgList &Args)
Compilation - A set of tasks to perform for a single driver invocation.
const Driver & getDriver() const
static std::string getR600TargetGPU(const ArgList &Args)
Get the (LLVM) name of the R600 gpu we are targeting.
__DEVICE__ int min(int __a, int __b)
const char * addTempFile(const char *Name)
addTempFile - Add a file to remove on exit, and returns its argument.
bool needsSharedRt() const
const ToolChain * getSingleOffloadToolChain() const
Return an offload toolchain of the provided kind.
bool isLLVMIR(ID Id)
Is this LLVM IR.
static void collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args, SmallVectorImpl< StringRef > &SharedRuntimes, SmallVectorImpl< StringRef > &StaticRuntimes, SmallVectorImpl< StringRef > &NonWholeStaticRuntimes, SmallVectorImpl< StringRef > &HelperStaticRuntimes, SmallVectorImpl< StringRef > &RequiredSymbols)
bool linkCXXRuntimes() const