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" 56 using namespace clang;
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::bpfel:
324 case llvm::Triple::bpfeb:
325 case llvm::Triple::sparc:
326 case llvm::Triple::sparcel:
327 case llvm::Triple::sparcv9:
328 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
329 return A->getValue();
332 case llvm::Triple::x86:
333 case llvm::Triple::x86_64:
336 case llvm::Triple::hexagon:
340 case llvm::Triple::lanai:
343 case llvm::Triple::systemz:
346 case llvm::Triple::r600:
347 case llvm::Triple::amdgcn:
350 case llvm::Triple::wasm32:
351 case llvm::Triple::wasm64:
357 unsigned Parallelism = 0;
358 Arg *LtoJobsArg = Args.getLastArg(options::OPT_flto_jobs_EQ);
360 StringRef(LtoJobsArg->getValue()).getAsInteger(10, Parallelism))
361 D.
Diag(diag::err_drv_invalid_int_value) << LtoJobsArg->getAsString(Args)
362 << LtoJobsArg->getValue();
369 return Triple.getOS() == llvm::Triple::CloudABI ||
370 Triple.getArch() == llvm::Triple::wasm32 ||
371 Triple.getArch() == llvm::Triple::wasm64;
375 ArgStringList &CmdArgs,
bool IsThinLTO,
380 CmdArgs.push_back(
"-plugin");
382 #if defined(LLVM_ON_WIN32) 383 const char *Suffix =
".dll";
384 #elif defined(__APPLE__) 385 const char *Suffix =
".dylib";
387 const char *Suffix =
".so";
391 llvm::sys::path::native(Twine(ToolChain.
getDriver().
Dir) +
392 "/../lib" CLANG_LIBDIR_SUFFIX
"/LLVMgold" +
395 CmdArgs.push_back(Args.MakeArgString(Plugin));
403 CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-opt=mcpu=") + CPU));
405 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
407 if (A->getOption().matches(options::OPT_O4) ||
408 A->getOption().matches(options::OPT_Ofast))
410 else if (A->getOption().matches(options::OPT_O))
411 OOpt = A->getValue();
412 else if (A->getOption().matches(options::OPT_O0))
415 CmdArgs.push_back(Args.MakeArgString(Twine(
"-plugin-opt=O") + OOpt));
419 CmdArgs.push_back(
"-plugin-opt=thinlto");
423 Args.MakeArgString(
"-plugin-opt=jobs=" + Twine(Parallelism)));
426 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
427 options::OPT_ggdbN_Group)) {
428 if (A->getOption().matches(options::OPT_glldb))
429 CmdArgs.push_back(
"-plugin-opt=-debugger-tune=lldb");
430 else if (A->getOption().matches(options::OPT_gsce))
431 CmdArgs.push_back(
"-plugin-opt=-debugger-tune=sce");
433 CmdArgs.push_back(
"-plugin-opt=-debugger-tune=gdb");
436 bool UseSeparateSections =
439 if (Args.hasFlag(options::OPT_ffunction_sections,
440 options::OPT_fno_function_sections, UseSeparateSections)) {
441 CmdArgs.push_back(
"-plugin-opt=-function-sections");
444 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
445 UseSeparateSections)) {
446 CmdArgs.push_back(
"-plugin-opt=-data-sections");
450 StringRef FName = A->getValue();
451 if (!llvm::sys::fs::exists(FName))
452 D.
Diag(diag::err_drv_no_such_file) << FName;
455 Args.MakeArgString(Twine(
"-plugin-opt=sample-profile=") + FName));
459 if (Args.hasFlag(options::OPT_fexperimental_new_pass_manager,
460 options::OPT_fno_experimental_new_pass_manager,
462 CmdArgs.push_back(
"-plugin-opt=new-pass-manager");
468 ArgStringList &CmdArgs) {
471 CmdArgs.push_back(
"-rpath");
472 CmdArgs.push_back(Args.MakeArgString(CandidateRPath.c_str()));
477 const ArgList &Args,
bool IsOffloadingHost,
479 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
480 options::OPT_fno_openmp,
false))
485 CmdArgs.push_back(
"-lomp");
488 CmdArgs.push_back(
"-lgomp");
491 CmdArgs.push_back(
"-lrt");
494 CmdArgs.push_back(
"-liomp5");
501 if (IsOffloadingHost)
502 CmdArgs.push_back(
"-lomptarget");
510 ArgStringList &CmdArgs, StringRef Sanitizer,
511 bool IsShared,
bool IsWhole) {
514 if (IsWhole) CmdArgs.push_back(
"-whole-archive");
516 if (IsWhole) CmdArgs.push_back(
"-no-whole-archive");
526 ArgStringList &CmdArgs,
527 StringRef Sanitizer) {
529 if (llvm::sys::fs::exists(SanRT +
".syms")) {
530 CmdArgs.push_back(Args.MakeArgString(
"--dynamic-list=" + SanRT +
".syms"));
537 ArgStringList &CmdArgs) {
540 CmdArgs.push_back(
"--no-as-needed");
542 if (TC.
getTriple().getOS() != llvm::Triple::RTEMS) {
543 CmdArgs.push_back(
"-lpthread");
544 CmdArgs.push_back(
"-lrt");
546 CmdArgs.push_back(
"-lm");
548 if (TC.
getTriple().getOS() != llvm::Triple::FreeBSD &&
549 TC.
getTriple().getOS() != llvm::Triple::NetBSD &&
550 TC.
getTriple().getOS() != llvm::Triple::RTEMS)
551 CmdArgs.push_back(
"-ldl");
553 if (TC.
getTriple().getOS() == llvm::Triple::NetBSD)
554 CmdArgs.push_back(
"-lutil");
556 if (TC.
getTriple().getOS() == llvm::Triple::NetBSD)
557 CmdArgs.push_back(
"-lexecinfo");
571 SharedRuntimes.push_back(
"asan");
572 if (!Args.hasArg(options::OPT_shared) && !TC.
getTriple().isAndroid())
573 HelperStaticRuntimes.push_back(
"asan-preinit");
577 SharedRuntimes.push_back(
"ubsan_minimal");
579 SharedRuntimes.push_back(
"ubsan_standalone");
583 SharedRuntimes.push_back(
"scudo");
585 SharedRuntimes.push_back(
"hwasan");
590 StaticRuntimes.push_back(
"stats_client");
593 if (Args.hasArg(options::OPT_shared) || SanArgs.
needsSharedRt()) {
598 StaticRuntimes.push_back(
"asan");
600 StaticRuntimes.push_back(
"asan_cxx");
604 StaticRuntimes.push_back(
"hwasan");
606 StaticRuntimes.push_back(
"hwasan_cxx");
609 StaticRuntimes.push_back(
"dfsan");
611 StaticRuntimes.push_back(
"lsan");
613 StaticRuntimes.push_back(
"msan");
615 StaticRuntimes.push_back(
"msan_cxx");
618 StaticRuntimes.push_back(
"tsan");
620 StaticRuntimes.push_back(
"tsan_cxx");
624 StaticRuntimes.push_back(
"ubsan_minimal");
626 StaticRuntimes.push_back(
"ubsan_standalone");
628 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
632 NonWholeStaticRuntimes.push_back(
"safestack");
633 RequiredSymbols.push_back(
"__safestack_init");
636 StaticRuntimes.push_back(
"cfi");
638 StaticRuntimes.push_back(
"cfi_diag");
640 StaticRuntimes.push_back(
"ubsan_standalone_cxx");
643 NonWholeStaticRuntimes.push_back(
"stats");
644 RequiredSymbols.push_back(
"__sanitizer_stats_register");
647 StaticRuntimes.push_back(
"esan");
649 StaticRuntimes.push_back(
"scudo");
651 StaticRuntimes.push_back(
"scudo_cxx");
658 ArgStringList &CmdArgs) {
660 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
662 NonWholeStaticRuntimes, HelperStaticRuntimes,
667 && !Args.hasArg(options::OPT_shared)) {
670 if (!Args.hasArg(clang::driver::options::OPT_nostdlibxx))
674 for (
auto RT : SharedRuntimes)
676 for (
auto RT : HelperStaticRuntimes)
678 bool AddExportDynamic =
false;
679 for (
auto RT : StaticRuntimes) {
683 for (
auto RT : NonWholeStaticRuntimes) {
687 for (
auto S : RequiredSymbols) {
688 CmdArgs.push_back(
"-u");
689 CmdArgs.push_back(Args.MakeArgString(S));
693 if (AddExportDynamic)
694 CmdArgs.push_back(
"-export-dynamic");
698 CmdArgs.push_back(
"-export-dynamic-symbol=__cfi_check");
700 return !StaticRuntimes.empty() || !NonWholeStaticRuntimes.empty();
705 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
706 return !A->getOption().matches(options::OPT_O0);
712 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
713 if (FinalOutput && Args.hasArg(options::OPT_c)) {
715 llvm::sys::path::replace_extension(
T,
"dwo");
716 return Args.MakeArgString(
T);
720 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
722 llvm::sys::path::replace_extension(F,
"dwo");
724 return Args.MakeArgString(F);
729 const JobAction &JA,
const ArgList &Args,
730 const InputInfo &Output,
const char *OutFile) {
731 ArgStringList ExtractArgs;
732 ExtractArgs.push_back(
"--extract-dwo");
734 ArgStringList StripArgs;
735 StripArgs.push_back(
"--strip-dwo");
740 ExtractArgs.push_back(OutFile);
747 C.
addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
750 C.
addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
759 Args.ClaimAllArgs(options::OPT_flto_EQ);
760 Args.ClaimAllArgs(options::OPT_flto);
761 Args.ClaimAllArgs(options::OPT_fno_lto);
765 auto *ProfileUseArg = Args.getLastArg(
766 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
767 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
768 options::OPT_fno_profile_instr_use);
771 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
772 ProfileUseArg =
nullptr;
774 return ProfileUseArg;
778 auto *ProfileSampleUseArg = Args.getLastArg(
779 options::OPT_fprofile_sample_use, options::OPT_fprofile_sample_use_EQ,
780 options::OPT_fauto_profile, options::OPT_fauto_profile_EQ,
781 options::OPT_fno_profile_sample_use, options::OPT_fno_auto_profile);
783 if (ProfileSampleUseArg &&
784 (ProfileSampleUseArg->getOption().matches(
785 options::OPT_fno_profile_sample_use) ||
786 ProfileSampleUseArg->getOption().matches(options::OPT_fno_auto_profile)))
789 return Args.getLastArg(options::OPT_fprofile_sample_use_EQ,
790 options::OPT_fauto_profile_EQ);
797 std::tuple<llvm::Reloc::Model, unsigned, bool>
800 const llvm::Triple &Triple = ToolChain.
getTriple();
805 if (Triple.isOSBinFormatMachO() && Args.hasArg(options::OPT_static))
807 bool IsPICLevelTwo = PIC;
810 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
813 if (Triple.isAndroid()) {
814 switch (Triple.getArch()) {
815 case llvm::Triple::arm:
816 case llvm::Triple::armeb:
817 case llvm::Triple::thumb:
818 case llvm::Triple::thumbeb:
819 case llvm::Triple::aarch64:
820 case llvm::Triple::mips:
821 case llvm::Triple::mipsel:
822 case llvm::Triple::mips64:
823 case llvm::Triple::mips64el:
827 case llvm::Triple::x86:
828 case llvm::Triple::x86_64:
830 IsPICLevelTwo =
true;
839 if (Triple.getOS() == llvm::Triple::OpenBSD) {
841 case llvm::Triple::arm:
842 case llvm::Triple::aarch64:
843 case llvm::Triple::mips64:
844 case llvm::Triple::mips64el:
845 case llvm::Triple::x86:
846 case llvm::Triple::x86_64:
847 IsPICLevelTwo =
false;
850 case llvm::Triple::ppc:
851 case llvm::Triple::sparc:
852 case llvm::Triple::sparcel:
853 case llvm::Triple::sparcv9:
854 IsPICLevelTwo =
true;
866 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
867 options::OPT_fpic, options::OPT_fno_pic,
868 options::OPT_fPIE, options::OPT_fno_PIE,
869 options::OPT_fpie, options::OPT_fno_pie);
870 if (Triple.isOSWindows() && LastPICArg &&
872 Args.getLastArg(options::OPT_fPIC, options::OPT_fpic,
873 options::OPT_fPIE, options::OPT_fpie)) {
874 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
875 << LastPICArg->getSpelling() << Triple.str();
876 if (Triple.getArch() == llvm::Triple::x86_64)
877 return std::make_tuple(llvm::Reloc::PIC_, 2U,
false);
878 return std::make_tuple(llvm::Reloc::Static, 0U,
false);
885 Option O = LastPICArg->getOption();
886 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
887 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
888 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
890 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
892 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
895 if (EffectiveTriple.isPS4CPU()) {
896 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
897 StringRef Model = ModelArg ? ModelArg->getValue() :
"";
898 if (Model !=
"kernel") {
901 << LastPICArg->getSpelling();
911 if (PIC && (Triple.isOSDarwin() || EffectiveTriple.isPS4CPU()))
917 ((!EffectiveTriple.isiOS() || EffectiveTriple.isOSVersionLT(6)) &&
918 !EffectiveTriple.isWatchOS()))
921 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
924 if (!Triple.isOSDarwin())
925 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
926 << A->getSpelling() << Triple.str();
935 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2U : 0U,
false);
938 bool EmbeddedPISupported;
939 switch (Triple.getArch()) {
940 case llvm::Triple::arm:
941 case llvm::Triple::armeb:
942 case llvm::Triple::thumb:
943 case llvm::Triple::thumbeb:
944 EmbeddedPISupported =
true;
947 EmbeddedPISupported =
false;
951 bool ROPI =
false, RWPI =
false;
952 Arg* LastROPIArg = Args.getLastArg(options::OPT_fropi, options::OPT_fno_ropi);
953 if (LastROPIArg && LastROPIArg->getOption().matches(options::OPT_fropi)) {
954 if (!EmbeddedPISupported)
955 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
956 << LastROPIArg->getSpelling() << Triple.str();
959 Arg *LastRWPIArg = Args.getLastArg(options::OPT_frwpi, options::OPT_fno_rwpi);
960 if (LastRWPIArg && LastRWPIArg->getOption().matches(options::OPT_frwpi)) {
961 if (!EmbeddedPISupported)
962 ToolChain.
getDriver().
Diag(diag::err_drv_unsupported_opt_for_target)
963 << LastRWPIArg->getSpelling() << Triple.str();
968 if ((ROPI || RWPI) && (PIC || PIE))
969 ToolChain.
getDriver().
Diag(diag::err_drv_ropi_rwpi_incompatible_with_pic);
973 if ((Triple.getArch() == llvm::Triple::mips64 ||
974 Triple.getArch() == llvm::Triple::mips64el) &&
975 Args.hasArg(options::OPT_mno_abicalls))
976 return std::make_tuple(llvm::Reloc::Static, 0U,
false);
979 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2U : 1U, PIE);
981 llvm::Reloc::Model RelocM = llvm::Reloc::Static;
983 RelocM = llvm::Reloc::ROPI_RWPI;
985 RelocM = llvm::Reloc::ROPI;
987 RelocM = llvm::Reloc::RWPI;
989 return std::make_tuple(RelocM, 0U,
false);
993 ArgStringList &CmdArgs) {
994 llvm::Reloc::Model RelocationModel;
997 std::tie(RelocationModel, PICLevel, IsPIE) =
ParsePICArgs(ToolChain, Args);
999 if (RelocationModel != llvm::Reloc::Static)
1000 CmdArgs.push_back(
"-KPIC");
1006 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc,
false);
1010 ArgStringList &CmdArgs,
const ArgList &Args) {
1011 bool isAndroid = Triple.isAndroid();
1012 bool isCygMing = Triple.isOSCygMing();
1013 bool IsIAMCU = Triple.isOSIAMCU();
1014 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
1015 Args.hasArg(options::OPT_static);
1017 CmdArgs.push_back(
"-lgcc");
1019 if (StaticLibgcc || isAndroid) {
1021 CmdArgs.push_back(
"-lgcc");
1024 CmdArgs.push_back(
"--as-needed");
1025 CmdArgs.push_back(
"-lgcc_s");
1027 CmdArgs.push_back(
"--no-as-needed");
1030 if (StaticLibgcc && !isAndroid && !IsIAMCU)
1031 CmdArgs.push_back(
"-lgcc_eh");
1032 else if (!Args.hasArg(options::OPT_shared) && D.
CCCIsCXX())
1033 CmdArgs.push_back(
"-lgcc");
1040 if (isAndroid && !StaticLibgcc)
1041 CmdArgs.push_back(
"-ldl");
1045 ArgStringList &CmdArgs,
const ArgList &Args) {
1055 if (TC.
getTriple().isKnownWindowsMSVCEnvironment()) {
1058 if (Args.hasArg(options::OPT_rtlib_EQ)) {
1059 TC.
getDriver().
Diag(diag::err_drv_unsupported_rtlib_for_platform)
1060 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() <<
"MSVC";
1077 const ArgList &Args, ArgStringList &CmdArgs,
1088 llvm::sys::path::replace_extension(Name,
"lk");
1089 LKS = C.
getArgs().MakeArgString(Name.c_str());
1091 llvm::sys::path::replace_extension(Name,
"");
1097 CmdArgs.push_back(
"-T");
1098 CmdArgs.push_back(LKS);
1101 std::string LksBuffer;
1102 llvm::raw_string_ostream LksStream(LksBuffer);
1107 assert(OpenMPToolChains.first != OpenMPToolChains.second &&
1108 "No OpenMP toolchains??");
1118 LksStream <<
"/*\n";
1119 LksStream <<
" OpenMP Offload Linker Script\n";
1120 LksStream <<
" *** Automatically generated by Clang ***\n";
1121 LksStream <<
"*/\n";
1122 LksStream <<
"TARGET(binary)\n";
1123 auto DTC = OpenMPToolChains.first;
1124 for (
auto &II : Inputs) {
1125 const Action *A = II.getAction();
1127 if (A && isa<LinkJobAction>(A) &&
1129 assert(DTC != OpenMPToolChains.second &&
1130 "More device inputs than device toolchains??");
1131 InputBinaryInfo.push_back(std::make_pair(
1132 DTC->second->getTriple().normalize(), II.getFilename()));
1134 LksStream <<
"INPUT(" << II.getFilename() <<
")\n";
1138 assert(DTC == OpenMPToolChains.second &&
1139 "Less device inputs than device toolchains??");
1141 LksStream <<
"SECTIONS\n";
1145 for (
const auto &BI : InputBinaryInfo) {
1146 LksStream <<
" .omp_offloading." << BI.first <<
" :\n";
1147 LksStream <<
" ALIGN(0x10)\n";
1148 LksStream <<
" {\n";
1149 LksStream <<
" PROVIDE_HIDDEN(.omp_offloading.img_start." << BI.first
1151 LksStream <<
" " << BI.second <<
"\n";
1152 LksStream <<
" PROVIDE_HIDDEN(.omp_offloading.img_end." << BI.first
1154 LksStream <<
" }\n";
1160 LksStream <<
" .omp_offloading.entries :\n";
1161 LksStream <<
" ALIGN(0x10)\n";
1162 LksStream <<
" SUBALIGN(0x01)\n";
1163 LksStream <<
" {\n";
1164 LksStream <<
" PROVIDE_HIDDEN(.omp_offloading.entries_begin = .);\n";
1165 LksStream <<
" *(.omp_offloading.entries)\n";
1166 LksStream <<
" PROVIDE_HIDDEN(.omp_offloading.entries_end = .);\n";
1167 LksStream <<
" }\n";
1169 LksStream <<
"INSERT BEFORE .data\n";
1174 if (C.
getArgs().hasArg(options::OPT_fopenmp_dump_offload_linker_script))
1175 llvm::errs() << LksBuffer;
1178 if (C.
getArgs().hasArg(options::OPT__HASH_HASH_HASH))
1183 llvm::raw_fd_ostream Lksf(LKS, EC, llvm::sys::fs::F_None);
1186 C.
getDriver().
Diag(clang::diag::err_unable_to_make_temp) << EC.message();
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)
static void AddLibgcc(const llvm::Triple &Triple, const Driver &D, ArgStringList &CmdArgs, const ArgList &Args)
bool needsUbsanRt() 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.
static std::string getNios2TargetCPU(const ArgList &Args)
bool isDeviceOffloading(OffloadKind OKind) const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
An unknown OpenMP runtime.
bool hasCrossDsoCfi() const
bool needsCfiDiagRt() 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.
const FunctionProtoType * T
Defines version macros and version-related utility functions for Clang.
void addCommand(std::unique_ptr< Command > C)
bool needsSafeStackRt() const
const_offload_toolchains_range getOffloadToolChains() const
bool needsDfsanRt() const
bool needsScudoRt() const
const llvm::opt::DerivedArgList & getArgs() const
vfs::FileSystem & getVFS() 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.
Defines the virtual file system interface vfs::FileSystem.
static std::string getLanaiTargetCPU(const ArgList &Args)
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.
const Driver & getDriver() const
static std::string getR600TargetGPU(const ArgList &Args)
Get the (LLVM) name of the R600 gpu we are targeting.
const char * addTempFile(const char *Name)
addTempFile - Add a file to remove on exit, and returns its argument.
bool needsSharedRt() const
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