13#include "clang/Config/config.h"
19#include "llvm/ADT/StringSwitch.h"
20#include "llvm/Option/ArgList.h"
21#include "llvm/ProfileData/InstrProf.h"
22#include "llvm/ProfileData/MemProf.h"
23#include "llvm/Support/Path.h"
24#include "llvm/Support/Threading.h"
25#include "llvm/Support/VirtualFileSystem.h"
26#include "llvm/TargetParser/TargetParser.h"
27#include "llvm/TargetParser/Triple.h"
37 return VersionTuple(13, 1);
53 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
54 .Cases(
"i386",
"i486",
"i486SX",
"i586",
"i686", llvm::Triple::x86)
55 .Cases(
"pentium",
"pentpro",
"pentIIm3",
"pentIIm5",
"pentium4",
57 .Cases(
"x86_64",
"x86_64h", llvm::Triple::x86_64)
59 .Cases(
"arm",
"armv4t",
"armv5",
"armv6",
"armv6m", llvm::Triple::arm)
60 .Cases(
"armv7",
"armv7em",
"armv7k",
"armv7m", llvm::Triple::arm)
61 .Cases(
"armv7s",
"xscale", llvm::Triple::arm)
62 .Cases(
"arm64",
"arm64e", llvm::Triple::aarch64)
63 .Case(
"arm64_32", llvm::Triple::aarch64_32)
64 .Case(
"r600", llvm::Triple::r600)
65 .Case(
"amdgcn", llvm::Triple::amdgcn)
66 .Case(
"nvptx", llvm::Triple::nvptx)
67 .Case(
"nvptx64", llvm::Triple::nvptx64)
68 .Case(
"amdil", llvm::Triple::amdil)
69 .Case(
"spir", llvm::Triple::spir)
70 .Default(llvm::Triple::UnknownArch);
74 const ArgList &Args) {
75 const llvm::Triple::ArchType
Arch = getArchTypeForMachOArchName(Str);
76 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
78 if (
Arch != llvm::Triple::UnknownArch)
81 if (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
82 ArchKind == llvm::ARM::ArchKind::ARMV7M ||
83 ArchKind == llvm::ARM::ArchKind::ARMV7EM) {
85 if (
T.getOS() == llvm::Triple::IOS)
86 for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
87 A->ignoreTargetSpecific();
88 if (
T.getOS() == llvm::Triple::WatchOS)
89 for (Arg *A : Args.filtered(options::OPT_mwatchos_version_min_EQ))
90 A->ignoreTargetSpecific();
91 if (
T.getOS() == llvm::Triple::TvOS)
92 for (Arg *A : Args.filtered(options::OPT_mtvos_version_min_EQ))
93 A->ignoreTargetSpecific();
95 T.setOS(llvm::Triple::UnknownOS);
96 T.setObjectFormat(llvm::Triple::MachO);
104 const char *LinkingOutput)
const {
107 ArgStringList CmdArgs;
109 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
113 const Action *SourceAction = &JA;
115 assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
116 SourceAction = SourceAction->
getInputs()[0];
124 if (Args.hasArg(options::OPT_fno_integrated_as)) {
125 if (!(
T.isMacOSX() &&
T.isMacOSXVersionLT(10, 7)))
126 CmdArgs.push_back(
"-Q");
130 if (SourceAction->
getType() == types::TY_Asm ||
131 SourceAction->
getType() == types::TY_PP_Asm) {
132 if (Args.hasArg(options::OPT_gstabs))
133 CmdArgs.push_back(
"--gstabs");
134 else if (Args.hasArg(options::OPT_g_Group))
135 CmdArgs.push_back(
"-g");
142 if (
T.isX86() || Args.hasArg(options::OPT_force__cpusubtype__ALL))
143 CmdArgs.push_back(
"-force_cpusubtype_ALL");
146 (((Args.hasArg(options::OPT_mkernel) ||
147 Args.hasArg(options::OPT_fapple_kext)) &&
149 Args.hasArg(options::OPT_static)))
150 CmdArgs.push_back(
"-static");
152 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
154 assert(Output.
isFilename() &&
"Unexpected lipo output.");
155 CmdArgs.push_back(
"-o");
158 assert(Input.
isFilename() &&
"Invalid input.");
163 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
165 Exec, CmdArgs, Inputs, Output));
168void darwin::MachOTool::anchor() {}
171 ArgStringList &CmdArgs)
const {
175 CmdArgs.push_back(
"-arch");
176 CmdArgs.push_back(Args.MakeArgString(ArchName));
179 if (ArchName ==
"arm")
180 CmdArgs.push_back(
"-force_cpusubtype_ALL");
183bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
187 for (
const auto &Input : Inputs)
188 if (Input.getType() != types::TY_Object)
202 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
203 if (A->getOption().matches(options::OPT_O0))
205 if (A->getOption().matches(options::OPT_O))
206 return llvm::StringSwitch<bool>(A->getValue())
212 if (!IsLinkerOnlyAction)
217void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
218 ArgStringList &CmdArgs,
220 VersionTuple Version,
bool LinkerIsLLD,
221 bool UsePlatformVersion)
const {
222 const Driver &D = getToolChain().getDriver();
223 const toolchains::MachO &MachOTC = getMachOToolChain();
227 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
228 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
229 CmdArgs.push_back(
"-demangle");
231 if (Args.hasArg(options::OPT_rdynamic) &&
232 (Version >= VersionTuple(137) || LinkerIsLLD))
233 CmdArgs.push_back(
"-export_dynamic");
237 if (Args.hasFlag(options::OPT_fapplication_extension,
238 options::OPT_fno_application_extension,
false))
239 CmdArgs.push_back(
"-application_extension");
241 if (D.
isUsingLTO() && (Version >= VersionTuple(116) || LinkerIsLLD) &&
242 NeedsTempPath(Inputs)) {
243 std::string TmpPathName;
254 if (!TmpPathName.empty()) {
255 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
256 C.addTempFile(TmpPath);
257 CmdArgs.push_back(
"-object_path_lto");
258 CmdArgs.push_back(TmpPath);
271 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
273 StringRef P = llvm::sys::path::parent_path(D.
Dir);
274 SmallString<128> LibLTOPath(P);
275 llvm::sys::path::append(LibLTOPath,
"lib");
276 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
277 CmdArgs.push_back(
"-lto_library");
278 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
284 if (Version >= VersionTuple(262) &&
286 CmdArgs.push_back(
"-no_deduplicate");
289 Args.AddAllArgs(CmdArgs, options::OPT_static);
290 if (!Args.hasArg(options::OPT_static))
291 CmdArgs.push_back(
"-dynamic");
292 if (Args.hasArg(options::OPT_fgnu_runtime)) {
297 if (!Args.hasArg(options::OPT_dynamiclib)) {
298 AddMachOArch(Args, CmdArgs);
300 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
302 Args.AddLastArg(CmdArgs, options::OPT_bundle);
303 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
304 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
307 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
308 (A = Args.getLastArg(options::OPT_current__version)) ||
309 (A = Args.getLastArg(options::OPT_install__name)))
310 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
313 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
314 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
315 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
317 CmdArgs.push_back(
"-dylib");
320 if ((A = Args.getLastArg(options::OPT_bundle)) ||
321 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
322 (A = Args.getLastArg(options::OPT_client__name)) ||
323 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
324 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
325 (A = Args.getLastArg(options::OPT_private__bundle)))
326 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
329 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
330 "-dylib_compatibility_version");
331 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
332 "-dylib_current_version");
334 AddMachOArch(Args, CmdArgs);
336 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
337 "-dylib_install_name");
340 Args.AddLastArg(CmdArgs, options::OPT_all__load);
341 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
342 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
344 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
345 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
346 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
347 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
348 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
349 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
350 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
351 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
352 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
353 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
354 Args.AddAllArgs(CmdArgs, options::OPT_init);
357 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
362 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
363 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
364 Args.AddLastArg(CmdArgs, options::OPT_single__module);
365 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
366 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
369 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
370 options::OPT_fno_pie, options::OPT_fno_PIE)) {
371 if (A->getOption().matches(options::OPT_fpie) ||
372 A->getOption().matches(options::OPT_fPIE))
373 CmdArgs.push_back(
"-pie");
375 CmdArgs.push_back(
"-no_pie");
379 if (
C.getDriver().embedBitcodeEnabled()) {
382 CmdArgs.push_back(
"-bitcode_bundle");
384 if (
C.getDriver().embedBitcodeMarkerOnly() &&
385 Version >= VersionTuple(278)) {
386 CmdArgs.push_back(
"-bitcode_process_mode");
387 CmdArgs.push_back(
"marker");
390 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
394 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
395 options::OPT_fno_global_isel)) {
396 if (A->getOption().matches(options::OPT_fglobal_isel)) {
397 CmdArgs.push_back(
"-mllvm");
398 CmdArgs.push_back(
"-global-isel");
400 CmdArgs.push_back(
"-mllvm");
401 CmdArgs.push_back(
"-global-isel-abort=0");
405 if (Args.hasArg(options::OPT_mkernel) ||
406 Args.hasArg(options::OPT_fapple_kext) ||
407 Args.hasArg(options::OPT_ffreestanding)) {
408 CmdArgs.push_back(
"-mllvm");
409 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
412 Args.AddLastArg(CmdArgs, options::OPT_prebind);
413 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
414 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
415 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
416 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
417 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
418 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
419 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
420 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
421 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
422 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
423 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
424 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
425 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
426 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
427 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
433 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
434 CmdArgs.push_back(
"-syslibroot");
435 CmdArgs.push_back(A->getValue());
436 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
437 CmdArgs.push_back(
"-syslibroot");
438 CmdArgs.push_back(A->getValue());
439 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
440 CmdArgs.push_back(
"-syslibroot");
441 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
444 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
445 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
446 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
447 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
448 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
449 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
450 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
451 Args.AddAllArgs(CmdArgs, options::OPT_y);
452 Args.AddLastArg(CmdArgs, options::OPT_w);
453 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
454 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
455 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
456 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
457 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
458 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
459 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
460 Args.AddLastArg(CmdArgs, options::OPT_why_load);
461 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
462 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
463 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
464 Args.AddLastArg(CmdArgs, options::OPT_Mach);
468 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
470 : CSPGOGenerateArg->getValue());
471 llvm::sys::path::append(Path,
"default_%m.profraw");
472 CmdArgs.push_back(
"--cs-profile-generate");
473 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
475 SmallString<128> Path(
476 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
477 if (Path.empty() || llvm::sys::fs::is_directory(Path))
478 llvm::sys::path::append(Path,
"default.profdata");
479 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
482 auto *CodeGenDataGenArg =
483 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
484 if (CodeGenDataGenArg)
486 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
487 CodeGenDataGenArg->getValue()));
494 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
497 return Args.hasArg(options::OPT_fobjc_link_runtime);
501 const llvm::Triple &Triple) {
506 Args.getAllArgValues(options::OPT_arch).size() > 1;
507 bool hasExplicitOutputFile =
508 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
510 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
511 <<
"-foptimization-record-file";
518 const llvm::Triple &Triple,
520 StringRef Format =
"yaml";
521 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
522 Format = A->getValue();
524 CmdArgs.push_back(
"-mllvm");
525 CmdArgs.push_back(
"-lto-pass-remarks-output");
526 CmdArgs.push_back(
"-mllvm");
528 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
530 CmdArgs.push_back(A->getValue());
532 assert(Output.
isFilename() &&
"Unexpected ld output.");
538 CmdArgs.push_back(Args.MakeArgString(F));
542 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
543 CmdArgs.push_back(
"-mllvm");
545 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
546 CmdArgs.push_back(Args.MakeArgString(Passes));
549 if (!Format.empty()) {
550 CmdArgs.push_back(
"-mllvm");
551 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
552 CmdArgs.push_back(Args.MakeArgString(FormatArg));
556 CmdArgs.push_back(
"-mllvm");
557 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
560 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
561 CmdArgs.push_back(
"-mllvm");
563 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
564 CmdArgs.push_back(Args.MakeArgString(Opt));
575 const char *LinkingOutput)
const {
576 assert(Output.
getType() == types::TY_Image &&
"Invalid linker output type.");
582 llvm::opt::ArgStringList InputFileList;
587 ArgStringList CmdArgs;
593 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
596 bool UsePlatformVersion =
getToolChain().getTriple().isXROS();
600 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
610 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
611 if (A->getOption().matches(options::OPT_moutline)) {
613 CmdArgs.push_back(
"-mllvm");
614 CmdArgs.push_back(
"-enable-machine-outliner");
620 CmdArgs.push_back(
"-mllvm");
621 CmdArgs.push_back(
"-enable-machine-outliner=never");
628 CmdArgs.push_back(
"-mllvm");
629 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
632 auto *CodeGenDataGenArg =
633 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
634 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
638 if (CodeGenDataGenArg && CodeGenDataUseArg)
639 D.
Diag(diag::err_drv_argument_not_allowed_with)
640 << CodeGenDataGenArg->getAsString(Args)
641 << CodeGenDataUseArg->getAsString(Args);
645 if (CodeGenDataGenArg) {
646 CmdArgs.push_back(
"-mllvm");
647 CmdArgs.push_back(
"-codegen-data-generate");
651 if (CodeGenDataUseArg) {
652 CmdArgs.push_back(
"-mllvm");
653 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
654 CodeGenDataUseArg->getValue()));
660 if (!StatsFile.empty()) {
661 CmdArgs.push_back(
"-mllvm");
662 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
667 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
668 options::OPT_Z_Flag, options::OPT_u_Group});
673 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
674 CmdArgs.push_back(
"-ObjC");
676 CmdArgs.push_back(
"-o");
679 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
682 Args.AddAllArgs(CmdArgs, options::OPT_L);
687 for (
const auto &II : Inputs) {
688 if (!II.isFilename()) {
693 if (InputFileList.size() > 0)
699 InputFileList.push_back(II.getFilename());
705 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
706 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
710 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
714 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
718 CmdArgs.push_back(
"-framework");
719 CmdArgs.push_back(
"Foundation");
721 CmdArgs.push_back(
"-lobjc");
725 CmdArgs.push_back(
"-arch_multiple");
726 CmdArgs.push_back(
"-final_output");
727 CmdArgs.push_back(LinkingOutput);
730 if (Args.hasArg(options::OPT_fnested_functions))
731 CmdArgs.push_back(
"-allow_stack_execute");
736 if (!Parallelism.empty()) {
737 CmdArgs.push_back(
"-mllvm");
738 unsigned NumThreads =
739 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
740 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
746 bool NoStdOrDefaultLibs =
747 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
748 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
749 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
754 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
762 Args.ClaimAllArgs(options::OPT_pthread);
763 Args.ClaimAllArgs(options::OPT_pthreads);
767 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
771 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
772 Args.AddAllArgs(CmdArgs, options::OPT_F);
775 for (
const Arg *A : Args.filtered(options::OPT_iframework))
776 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
778 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
779 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
780 if (A->getValue() == StringRef(
"Accelerate")) {
781 CmdArgs.push_back(
"-framework");
782 CmdArgs.push_back(
"Accelerate");
791 bool NonStandardSearchPath =
false;
793 if (Triple.isDriverKit()) {
795 NonStandardSearchPath =
796 Version.getMajor() < 605 ||
797 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
800 if (NonStandardSearchPath) {
801 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
802 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
805 llvm::sys::path::append(P, SearchPath);
807 CmdArgs.push_back(Args.MakeArgString(Flag + P));
810 AddSearchPath(
"-L",
"/usr/lib");
811 AddSearchPath(
"-F",
"/System/Library/Frameworks");
817 if (Version >= VersionTuple(705) || LinkerIsLLD) {
825 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
826 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
827 Cmd->setInputFileList(std::move(InputFileList));
828 C.addCommand(std::move(Cmd));
835 const char *LinkingOutput)
const {
839 Args.ClaimAllArgs(options::OPT_g_Group);
841 Args.ClaimAllArgs(options::OPT_emit_llvm);
844 Args.ClaimAllArgs(options::OPT_w);
846 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
849 ArgStringList CmdArgs;
851 CmdArgs.push_back(
"-static");
852 CmdArgs.push_back(
"-D");
853 CmdArgs.push_back(
"-no_warning_for_no_symbols");
854 CmdArgs.push_back(
"-o");
857 for (
const auto &II : Inputs) {
858 if (II.isFilename()) {
859 CmdArgs.push_back(II.getFilename());
866 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
867 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
868 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
873 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
874 C.addCommand(std::make_unique<Command>(JA, *
this,
876 Exec, CmdArgs, Inputs, Output));
883 const char *LinkingOutput)
const {
884 ArgStringList CmdArgs;
886 CmdArgs.push_back(
"-create");
887 assert(Output.
isFilename() &&
"Unexpected lipo output.");
889 CmdArgs.push_back(
"-output");
892 for (
const auto &II : Inputs) {
893 assert(II.isFilename() &&
"Unexpected lipo input.");
894 CmdArgs.push_back(II.getFilename());
897 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
899 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
901 Exec, CmdArgs, Inputs, Output));
908 const char *LinkingOutput)
const {
909 ArgStringList CmdArgs;
911 CmdArgs.push_back(
"-o");
914 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
916 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
920 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
922 Exec, CmdArgs, Inputs, Output));
929 const char *LinkingOutput)
const {
930 ArgStringList CmdArgs;
931 CmdArgs.push_back(
"--verify");
932 CmdArgs.push_back(
"--debug-info");
933 CmdArgs.push_back(
"--eh-frame");
934 CmdArgs.push_back(
"--quiet");
936 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
938 assert(Input.
isFilename() &&
"Unexpected verify input");
944 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
946 Exec, CmdArgs, Inputs, Output));
968 if (Ty == types::TY_PP_Asm)
969 return types::TY_Asm;
989 auto T = llvm::Triple(Twine(
"arm64-apple-") +
990 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1012 ArgStringList &CC1Args)
const {
1017 ArgStringList &CC1Args)
const {
1022 ArgStringList &CC1Args)
const {
1031 return llvm::StringSwitch<const char *>(
Arch)
1032 .Case(
"armv6k",
"armv6")
1033 .Case(
"armv6m",
"armv6m")
1034 .Case(
"armv5tej",
"armv5")
1035 .Case(
"xscale",
"xscale")
1036 .Case(
"armv4t",
"armv4t")
1037 .Case(
"armv7",
"armv7")
1038 .Cases(
"armv7a",
"armv7-a",
"armv7")
1039 .Cases(
"armv7r",
"armv7-r",
"armv7")
1040 .Cases(
"armv7em",
"armv7e-m",
"armv7em")
1041 .Cases(
"armv7k",
"armv7-k",
"armv7k")
1042 .Cases(
"armv7m",
"armv7-m",
"armv7m")
1043 .Cases(
"armv7s",
"armv7-s",
"armv7s")
1048 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1049 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1051 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1055 if (
Arch.starts_with(
"armv5"))
1058 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1061 else if (
Arch.ends_with(
"v7a"))
1071 case llvm::Triple::aarch64_32:
1074 case llvm::Triple::aarch64: {
1080 case llvm::Triple::thumb:
1081 case llvm::Triple::arm:
1082 if (
const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ))
1086 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1095 if (LinkerVersion) {
1097 VersionTuple NewLinkerVersion;
1098 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1099 (void)NewLinkerVersion.tryParse(A->getValue());
1100 assert(NewLinkerVersion == LinkerVersion);
1102 return *LinkerVersion;
1105 VersionTuple NewLinkerVersion;
1106 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1107 if (NewLinkerVersion.tryParse(A->getValue()))
1109 << A->getAsString(Args);
1111 LinkerVersion = NewLinkerVersion;
1112 return *LinkerVersion;
1128 return Triple.getTriple();
1140 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1144 Triple.setOSName(Str);
1146 return Triple.getTriple();
1158 return Dsymutil.get();
1162 return VerifyDebug.get();
1179 const ArgList &Args)
1180 :
Darwin(D, Triple, Args) {}
1184 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1185 CC1Args.push_back(
"-Werror=undef-prefix");
1191 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1192 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1197 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1202 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1212 static constexpr llvm::StringLiteral XcodeAppSuffix(
1213 ".app/Contents/Developer");
1214 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1215 if (Index == StringRef::npos)
1217 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1221 ArgStringList &CmdArgs)
const {
1240 llvm::sys::path::remove_filename(P);
1241 llvm::sys::path::remove_filename(P);
1242 llvm::sys::path::append(P,
"lib",
"arc");
1248 if (!
getVFS().exists(P)) {
1249 auto updatePath = [&](
const Arg *A) {
1253 if (XcodePathForSDK.empty())
1256 P = XcodePathForSDK;
1257 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1259 return getVFS().exists(P);
1262 bool updated =
false;
1263 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1264 updated = updatePath(A);
1267 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1272 CmdArgs.push_back(
"-force_load");
1273 llvm::sys::path::append(P,
"libarclite_");
1276 P +=
"watchsimulator";
1280 P +=
"appletvsimulator";
1284 P +=
"iphonesimulator";
1292 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1294 CmdArgs.push_back(Args.MakeArgString(P));
1316 bool IsShared)
const {
1324 const char *LibArg = Args.MakeArgString(P);
1325 CmdArgs.push_back(LibArg);
1333 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1337 CmdArgs.push_back(
"-rpath");
1338 CmdArgs.push_back(
"@executable_path");
1342 CmdArgs.push_back(
"-rpath");
1343 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1350 "it doesn't make sense to ask for the compiler-rt library name as an "
1354 if (Component !=
"builtins") {
1355 MachOLibName +=
'.';
1356 MachOLibName += Component;
1361 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1363 return std::string(FullPath);
1369 "it doesn't make sense to ask for the compiler-rt library name as an "
1373 if (Component !=
"builtins") {
1374 DarwinLibName += Component;
1375 DarwinLibName +=
'_';
1381 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1382 return std::string(FullPath);
1402 llvm_unreachable(
"Unsupported platform");
1407 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1408 auto EndSDK = llvm::sys::path::rend(isysroot);
1409 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1410 StringRef SDK = *IT;
1411 if (SDK.consume_back(
".sdk"))
1438 llvm_unreachable(
"Unsupported platform");
1443 for (Arg *A : Args) {
1444 if (A->getOption().matches(options::OPT_exported__symbols__list))
1446 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1447 !A->getOption().matches(options::OPT_Xlinker))
1449 if (A->containsValue(
"-exported_symbols_list") ||
1450 A->containsValue(
"-exported_symbol"))
1458 CmdArgs.push_back(
"-exported_symbol");
1459 CmdArgs.push_back(Symbol);
1469 StringRef Segment, StringRef Section) {
1470 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1471 Args.MakeArgString(Section),
"0x4000"})
1472 CmdArgs.push_back(A);
1476 ArgStringList &CmdArgs)
const {
1505 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1507 Args, CmdArgs,
"__DATA",
1508 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1514void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1515 ArgStringList &CmdArgs,
1516 StringRef Sanitizer,
1517 bool Shared)
const {
1523 const ArgList &Args)
const {
1524 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1525 StringRef
Value = A->getValue();
1526 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1527 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1528 <<
Value <<
"darwin";
1535 ArgStringList &CmdArgs,
1536 bool ForceLinkBuiltinRT)
const {
1542 if (Args.hasArg(options::OPT_static) ||
1543 Args.hasArg(options::OPT_fapple_kext) ||
1544 Args.hasArg(options::OPT_mkernel)) {
1545 if (ForceLinkBuiltinRT)
1553 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1554 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1561 const char *sanitizer =
nullptr;
1563 sanitizer =
"UndefinedBehaviorSanitizer";
1565 sanitizer =
"RealtimeSanitizer";
1567 sanitizer =
"AddressSanitizer";
1569 sanitizer =
"ThreadSanitizer";
1572 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1581 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1584 "Static sanitizer runtimes not supported");
1585 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1590 "Static sanitizer runtimes not supported");
1591 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1594 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1597 "Static sanitizer runtimes not supported");
1598 AddLinkSanitizerLibArgs(
1604 "Static sanitizer runtimes not supported");
1605 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1608 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1609 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1610 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1622 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1630 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1640 CmdArgs.push_back(
"-framework");
1641 CmdArgs.push_back(
"DriverKit");
1647 CmdArgs.push_back(
"-lSystem");
1659 CmdArgs.push_back(
"-lgcc_s.1");
1668 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1669 if (!SystemTriple.isMacOSX())
1670 return std::string(MacOSSDKVersion);
1671 VersionTuple SystemVersion;
1672 SystemTriple.getMacOSXVersion(SystemVersion);
1674 unsigned Major, Minor, Micro;
1678 return std::string(MacOSSDKVersion);
1679 VersionTuple SDKVersion(Major, Minor, Micro);
1681 if (SDKVersion > SystemVersion)
1682 return SystemVersion.getAsString();
1683 return std::string(MacOSSDKVersion);
1690struct DarwinPlatform {
1699 DeploymentTargetEnv,
1709 DarwinPlatformKind getPlatform()
const {
return Platform; }
1711 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1713 void setEnvironment(DarwinEnvironmentKind Kind) {
1715 InferSimulatorFromArch =
false;
1718 const VersionTuple getOSVersion()
const {
1719 return UnderlyingOSVersion.value_or(VersionTuple());
1722 VersionTuple takeOSVersion() {
1723 assert(UnderlyingOSVersion.has_value() &&
1724 "attempting to get an unset OS version");
1725 VersionTuple
Result = *UnderlyingOSVersion;
1726 UnderlyingOSVersion.reset();
1729 bool isValidOSVersion()
const {
1730 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1734 VersionTuple getCanonicalOSVersion()
const {
1735 return llvm::Triple::getCanonicalVersionForOS(
1736 getOSFromPlatform(Platform), getOSVersion(),
true);
1739 void setOSVersion(
const VersionTuple &Version) {
1740 UnderlyingOSVersion = Version;
1743 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1745 VersionTuple getZipperedOSVersion()
const {
1746 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1747 "zippered target version is specified only for Mac Catalyst");
1748 return ZipperedOSVersion;
1752 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1755 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1757 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1758 return TargetVariantTriple;
1762 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1766 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1770 case DarwinPlatformKind::MacOS:
1771 Opt = options::OPT_mmacos_version_min_EQ;
1773 case DarwinPlatformKind::IPhoneOS:
1774 Opt = options::OPT_mios_version_min_EQ;
1776 case DarwinPlatformKind::TvOS:
1777 Opt = options::OPT_mtvos_version_min_EQ;
1779 case DarwinPlatformKind::WatchOS:
1780 Opt = options::OPT_mwatchos_version_min_EQ;
1782 case DarwinPlatformKind::XROS:
1785 case DarwinPlatformKind::DriverKit:
1789 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1795 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1801 assert(Arg &&
"OS version argument not yet inferred");
1802 return Arg->getAsString(Args);
1803 case DeploymentTargetEnv:
1804 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1805 case InferredFromSDK:
1806 case InferredFromArch:
1807 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1809 llvm_unreachable(
"Unsupported Darwin Source Kind");
1813 std::string getInferredSource() {
1814 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1815 return InferredSource.str();
1818 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1819 const VersionTuple &OSVersion,
1820 const std::optional<DarwinSDKInfo> &SDKInfo) {
1822 case llvm::Triple::Simulator:
1823 Environment = DarwinEnvironmentKind::Simulator;
1825 case llvm::Triple::MacABI: {
1826 Environment = DarwinEnvironmentKind::MacCatalyst;
1828 ZipperedOSVersion = VersionTuple(10, 15);
1829 if (hasOSVersion() && SDKInfo) {
1830 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1832 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1833 OSVersion, ZipperedOSVersion, std::nullopt)) {
1834 ZipperedOSVersion = *MacOSVersion;
1841 if (TargetVariantTriple) {
1842 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
1843 if (TargetVariantVersion.getMajor()) {
1844 if (TargetVariantVersion < ZipperedOSVersion)
1845 ZipperedOSVersion = TargetVariantVersion;
1855 static DarwinPlatform
1856 createFromTarget(
const llvm::Triple &TT, Arg *A,
1857 std::optional<llvm::Triple> TargetVariantTriple,
1858 const std::optional<DarwinSDKInfo> &SDKInfo) {
1859 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
1860 TT.getOSVersion(), A);
1861 VersionTuple OsVersion = TT.getOSVersion();
1862 Result.TargetVariantTriple = TargetVariantTriple;
1863 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
1866 static DarwinPlatform
1867 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
1868 llvm::Triple::EnvironmentType Environment, Arg *A,
1869 const std::optional<DarwinSDKInfo> &SDKInfo) {
1870 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
1871 Result.InferSimulatorFromArch =
false;
1872 Result.setEnvironment(Environment, OSVersion, SDKInfo);
1875 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
1877 DarwinPlatform
Result{OSVersionArg, Platform,
1878 getVersionFromString(A->getValue()), A};
1880 Result.Environment = DarwinEnvironmentKind::Simulator;
1883 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
1884 StringRef EnvVarName,
1885 StringRef OSVersion) {
1886 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
1887 getVersionFromString(OSVersion));
1888 Result.EnvVarName = EnvVarName;
1891 static DarwinPlatform createFromSDK(StringRef SDKRoot,
1892 DarwinPlatformKind Platform,
1894 bool IsSimulator =
false) {
1895 DarwinPlatform
Result(InferredFromSDK, Platform,
1896 getVersionFromString(
Value));
1898 Result.Environment = DarwinEnvironmentKind::Simulator;
1899 Result.InferSimulatorFromArch =
false;
1900 Result.InferredSource = SDKRoot;
1903 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
1904 VersionTuple Version) {
1906 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
1914 DarwinSDKInfo inferSDKInfo() {
1915 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
1916 return DarwinSDKInfo(getOSVersion(),
1918 VersionTuple(getOSVersion().getMajor(), 0, 99),
1919 getOSFromPlatform(Platform));
1923 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
1925 Arguments({Argument, VersionTuple().getAsString()}) {}
1926 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
1927 VersionTuple
Value, Arg *Argument =
nullptr)
1931 UnderlyingOSVersion =
Value;
1934 static VersionTuple getVersionFromString(
const StringRef Input) {
1935 llvm::VersionTuple Version;
1936 bool IsValid = !Version.tryParse(Input);
1937 assert(IsValid &&
"unable to convert input version to version tuple");
1942 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
1944 case llvm::Triple::Darwin:
1945 case llvm::Triple::MacOSX:
1946 return DarwinPlatformKind::MacOS;
1947 case llvm::Triple::IOS:
1948 return DarwinPlatformKind::IPhoneOS;
1949 case llvm::Triple::TvOS:
1950 return DarwinPlatformKind::TvOS;
1951 case llvm::Triple::WatchOS:
1952 return DarwinPlatformKind::WatchOS;
1953 case llvm::Triple::XROS:
1954 return DarwinPlatformKind::XROS;
1955 case llvm::Triple::DriverKit:
1956 return DarwinPlatformKind::DriverKit;
1958 llvm_unreachable(
"Unable to infer Darwin variant");
1962 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
1964 case DarwinPlatformKind::MacOS:
1965 return llvm::Triple::MacOSX;
1966 case DarwinPlatformKind::IPhoneOS:
1967 return llvm::Triple::IOS;
1968 case DarwinPlatformKind::TvOS:
1969 return llvm::Triple::TvOS;
1970 case DarwinPlatformKind::WatchOS:
1971 return llvm::Triple::WatchOS;
1972 case DarwinPlatformKind::DriverKit:
1973 return llvm::Triple::DriverKit;
1974 case DarwinPlatformKind::XROS:
1975 return llvm::Triple::XROS;
1977 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
1981 DarwinPlatformKind Platform;
1982 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
1986 VersionTuple ZipperedOSVersion;
1991 std::optional<VersionTuple> UnderlyingOSVersion;
1992 bool InferSimulatorFromArch =
true;
1993 std::pair<Arg *, std::string>
Arguments;
1994 StringRef EnvVarName;
1997 StringRef InferredSource;
2000 std::optional<llvm::Triple> TargetVariantTriple;
2005std::optional<DarwinPlatform>
2006getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2007 const Driver &TheDriver) {
2008 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2009 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2010 options::OPT_mios_simulator_version_min_EQ);
2012 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2013 options::OPT_mtvos_simulator_version_min_EQ);
2014 Arg *WatchOSVersion =
2015 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2016 options::OPT_mwatchos_simulator_version_min_EQ);
2018 auto GetDarwinPlatform =
2019 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2020 bool IsSimulator) -> std::optional<DarwinPlatform> {
2021 if (StringRef(VersionArg->getValue()).empty()) {
2022 TheDriver.
Diag(diag::err_drv_missing_version_number)
2023 << VersionArg->getAsString(Args);
2024 return std::nullopt;
2026 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2031 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2032 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2033 << macOSVersion->getAsString(Args)
2034 << (iOSVersion ? iOSVersion
2035 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2041 }
else if (iOSVersion) {
2042 if (TvOSVersion || WatchOSVersion) {
2043 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2044 << iOSVersion->getAsString(Args)
2045 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2048 iOSVersion->getOption().getID() ==
2049 options::OPT_mios_simulator_version_min_EQ);
2050 }
else if (TvOSVersion) {
2051 if (WatchOSVersion) {
2052 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2053 << TvOSVersion->getAsString(Args)
2054 << WatchOSVersion->getAsString(Args);
2057 TvOSVersion->getOption().getID() ==
2058 options::OPT_mtvos_simulator_version_min_EQ);
2059 }
else if (WatchOSVersion)
2060 return GetDarwinPlatform(
2062 WatchOSVersion->getOption().getID() ==
2063 options::OPT_mwatchos_simulator_version_min_EQ);
2064 return std::nullopt;
2069std::optional<DarwinPlatform>
2070getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2071 const llvm::Triple &Triple) {
2073 const char *EnvVars[] = {
2074 "MACOSX_DEPLOYMENT_TARGET",
2075 "IPHONEOS_DEPLOYMENT_TARGET",
2076 "TVOS_DEPLOYMENT_TARGET",
2077 "WATCHOS_DEPLOYMENT_TARGET",
2078 "DRIVERKIT_DEPLOYMENT_TARGET",
2079 "XROS_DEPLOYMENT_TARGET"
2082 "Missing platform");
2083 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2084 if (
char *Env = ::getenv(I.value()))
2085 Targets[I.index()] = Env;
2094 if (Triple.getArch() == llvm::Triple::arm ||
2095 Triple.getArch() == llvm::Triple::aarch64 ||
2096 Triple.getArch() == llvm::Triple::thumb)
2103 unsigned FirstTarget = std::size(Targets);
2104 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2105 if (Targets[I].empty())
2107 if (FirstTarget == std::size(Targets))
2110 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2111 << Targets[FirstTarget] << Targets[I];
2115 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2116 if (!
Target.value().empty())
2117 return DarwinPlatform::createDeploymentTargetEnv(
2121 return std::nullopt;
2126static StringRef dropSDKNamePrefix(StringRef SDKName) {
2127 size_t PrefixPos = SDKName.find(
'.');
2128 if (PrefixPos == StringRef::npos)
2130 return SDKName.substr(PrefixPos + 1);
2136std::optional<DarwinPlatform>
2137inferDeploymentTargetFromSDK(DerivedArgList &Args,
2138 const std::optional<DarwinSDKInfo> &SDKInfo) {
2139 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2141 return std::nullopt;
2142 StringRef isysroot = A->getValue();
2145 return std::nullopt;
2147 std::string Version;
2150 Version = SDKInfo->getVersion().getAsString();
2154 size_t StartVer = SDK.find_first_of(
"0123456789");
2155 size_t EndVer = SDK.find_last_of(
"0123456789");
2156 if (StartVer != StringRef::npos && EndVer > StartVer)
2157 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2159 if (Version.empty())
2160 return std::nullopt;
2162 auto CreatePlatformFromSDKName =
2163 [&](StringRef SDK) -> std::optional<DarwinPlatform> {
2164 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2165 return DarwinPlatform::createFromSDK(
2167 SDK.starts_with(
"iPhoneSimulator"));
2168 else if (SDK.starts_with(
"MacOSX"))
2169 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2171 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2172 return DarwinPlatform::createFromSDK(
2174 SDK.starts_with(
"WatchSimulator"));
2175 else if (SDK.starts_with(
"AppleTVOS") ||
2176 SDK.starts_with(
"AppleTVSimulator"))
2177 return DarwinPlatform::createFromSDK(
2179 SDK.starts_with(
"AppleTVSimulator"));
2180 else if (SDK.starts_with(
"XR"))
2181 return DarwinPlatform::createFromSDK(
2183 SDK.contains(
"Simulator"));
2184 else if (SDK.starts_with(
"DriverKit"))
2187 return std::nullopt;
2189 if (
auto Result = CreatePlatformFromSDKName(SDK))
2192 return CreatePlatformFromSDKName(dropSDKNamePrefix(SDK));
2195VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2196 const llvm::Triple &Triple,
2197 const Driver &TheDriver) {
2198 VersionTuple OsVersion;
2199 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2201 case llvm::Triple::Darwin:
2202 case llvm::Triple::MacOSX:
2205 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2206 !Triple.getOSMajorVersion())
2207 SystemTriple.getMacOSXVersion(OsVersion);
2208 else if (!Triple.getMacOSXVersion(OsVersion))
2209 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2210 << Triple.getOSName();
2212 case llvm::Triple::IOS:
2213 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2214 OsVersion = VersionTuple(13, 1);
2216 OsVersion = Triple.getiOSVersion();
2218 case llvm::Triple::TvOS:
2219 OsVersion = Triple.getOSVersion();
2221 case llvm::Triple::WatchOS:
2222 OsVersion = Triple.getWatchOSVersion();
2224 case llvm::Triple::XROS:
2225 OsVersion = Triple.getOSVersion();
2226 if (!OsVersion.getMajor())
2227 OsVersion = OsVersion.withMajorReplaced(1);
2229 case llvm::Triple::DriverKit:
2230 OsVersion = Triple.getDriverKitVersion();
2233 llvm_unreachable(
"Unexpected OS type");
2240std::optional<DarwinPlatform>
2241inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2242 const llvm::Triple &Triple,
2243 const Driver &TheDriver) {
2244 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2247 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2248 OSTy = llvm::Triple::MacOSX;
2249 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2250 MachOArchName ==
"armv6")
2251 OSTy = llvm::Triple::IOS;
2252 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2253 OSTy = llvm::Triple::WatchOS;
2254 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2255 MachOArchName !=
"armv7em")
2256 OSTy = llvm::Triple::MacOSX;
2257 if (OSTy == llvm::Triple::UnknownOS)
2258 return std::nullopt;
2259 return DarwinPlatform::createFromArch(
2260 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2264std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2265 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2266 const std::optional<DarwinSDKInfo> &SDKInfo) {
2267 if (!Args.hasArg(options::OPT_target))
2268 return std::nullopt;
2269 if (Triple.getOS() == llvm::Triple::Darwin ||
2270 Triple.getOS() == llvm::Triple::UnknownOS)
2271 return std::nullopt;
2272 std::optional<llvm::Triple> TargetVariantTriple;
2273 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2274 llvm::Triple TVT(A->getValue());
2276 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2277 TVT.getArchName() == Triple.getArchName()) &&
2278 TVT.getArch() == Triple.getArch() &&
2279 TVT.getSubArch() == Triple.getSubArch() &&
2280 TVT.getVendor() == Triple.getVendor()) {
2281 if (TargetVariantTriple)
2286 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2287 TVT.isMacCatalystEnvironment()) ||
2288 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2289 Triple.isMacCatalystEnvironment())) {
2290 TargetVariantTriple = TVT;
2293 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2294 << A->getSpelling() << A->getValue();
2297 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2298 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2301 return PlatformAndVersion;
2305std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2306 DerivedArgList &Args,
const Driver &TheDriver,
2307 const std::optional<DarwinSDKInfo> &SDKInfo) {
2308 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2310 return std::nullopt;
2311 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2312 switch (TT.getOS()) {
2313 case llvm::Triple::MacOSX:
2314 case llvm::Triple::IOS:
2315 case llvm::Triple::TvOS:
2316 case llvm::Triple::WatchOS:
2317 case llvm::Triple::XROS:
2320 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2321 << TT.getOSName() << A->getAsString(Args);
2322 return std::nullopt;
2325 VersionTuple Version = TT.getOSVersion();
2326 if (!Version.getMajor()) {
2327 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2328 << A->getAsString(Args);
2329 return std::nullopt;
2331 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2332 TT.getEnvironment(), A, SDKInfo);
2335std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2336 const ArgList &Args,
2337 const Driver &TheDriver) {
2338 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2340 return std::nullopt;
2341 StringRef isysroot = A->getValue();
2343 if (!SDKInfoOrErr) {
2344 llvm::consumeError(SDKInfoOrErr.takeError());
2345 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2346 return std::nullopt;
2348 return *SDKInfoOrErr;
2353void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2359 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2361 if (!
getVFS().exists(A->getValue()))
2362 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2364 if (
char *env = ::getenv(
"SDKROOT")) {
2367 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2368 StringRef(env) !=
"/") {
2369 Args.append(Args.MakeSeparateArg(
2370 nullptr, Opts.getOption(options::OPT_isysroot), env));
2380 std::optional<DarwinPlatform> PlatformAndVersion =
2382 if (PlatformAndVersion) {
2384 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2385 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2386 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2388 << TargetArgStr << MTargetOSArgStr;
2391 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2392 if (!TripleProvidedOSVersion)
2393 PlatformAndVersion->setOSVersion(
2396 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2397 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2398 if (PlatformAndVersionFromOSVersionArg) {
2399 unsigned TargetMajor, TargetMinor, TargetMicro;
2401 unsigned ArgMajor, ArgMinor, ArgMicro;
2403 if (PlatformAndVersion->getPlatform() !=
2404 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2406 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2407 TargetMinor, TargetMicro, TargetExtra) &&
2409 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2410 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2411 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2412 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2413 TargetExtra != ArgExtra))) {
2416 if (PlatformAndVersion->getPlatform() ==
2417 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2418 !TripleProvidedOSVersion) {
2419 PlatformAndVersion->setOSVersion(
2420 PlatformAndVersionFromOSVersionArg->getOSVersion());
2424 std::string OSVersionArg =
2425 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2426 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2428 << OSVersionArg << TargetArg;
2432 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2436 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2437 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2438 if (PlatformAndVersionFromOSVersionArg) {
2439 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2440 std::string OSVersionArgStr =
2441 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2443 << MTargetOSArgStr << OSVersionArgStr;
2447 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2450 if (!PlatformAndVersion) {
2451 PlatformAndVersion =
2453 if (PlatformAndVersion) {
2455 std::optional<DarwinPlatform> SDKTarget =
2456 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2458 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2464 if (!PlatformAndVersion) {
2465 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2468 if (PlatformAndVersion && !
SDKInfo)
2469 SDKInfo = PlatformAndVersion->inferSDKInfo();
2473 if (!PlatformAndVersion)
2474 PlatformAndVersion =
2478 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2479 if (!PlatformAndVersion->isValidOSVersion()) {
2480 if (PlatformAndVersion->isExplicitlySpecified())
2482 << PlatformAndVersion->getAsString(Args, Opts);
2484 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2485 << PlatformAndVersion->getOSVersion().getAsString()
2486 << PlatformAndVersion->getInferredSource();
2491 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2492 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2493 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2494 << PlatformAndVersion->getOSVersion().getAsString()
2495 << CanonicalVersion.getAsString();
2496 PlatformAndVersion->setOSVersion(CanonicalVersion);
2499 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2502 unsigned Major, Minor, Micro;
2505 const unsigned MajorVersionLimit = 1000;
2506 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2507 const std::string OSVersionStr = OSVersion.getAsString();
2509 if (Platform ==
MacOS) {
2512 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2515 << PlatformAndVersion->getAsString(Args, Opts);
2519 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2521 << PlatformAndVersion->getAsString(Args, Opts);
2523 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2524 (Major < 13 || (Major == 13 && Minor < 1))) {
2526 << PlatformAndVersion->getAsString(Args, Opts);
2533 if (
getTriple().isArch32Bit() && Major >= 11) {
2535 if (PlatformAndVersion->isExplicitlySpecified()) {
2536 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2537 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2540 << PlatformAndVersion->getAsString(Args, Opts);
2548 }
else if (Platform ==
TvOS) {
2551 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2553 << PlatformAndVersion->getAsString(Args, Opts);
2554 }
else if (Platform ==
WatchOS) {
2557 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2559 << PlatformAndVersion->getAsString(Args, Opts);
2563 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2566 << PlatformAndVersion->getAsString(Args, Opts);
2567 }
else if (Platform ==
XROS) {
2570 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2573 << PlatformAndVersion->getAsString(Args, Opts);
2575 llvm_unreachable(
"unknown kind of Darwin platform");
2581 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2584 VersionTuple ZipperedOSVersion;
2586 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2587 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2596 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2598 if (SDK.size() > 0) {
2599 size_t StartVer = SDK.find_first_of(
"0123456789");
2600 StringRef SDKName = SDK.slice(0, StartVer);
2613 const llvm::Triple &
T) {
2614 if (
T.isDriverKit()) {
2615 llvm::sys::path::append(Path,
"System",
"DriverKit");
2621llvm::SmallString<128>
2624 if (DriverArgs.hasArg(options::OPT_isysroot))
2625 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2636 const llvm::opt::ArgList &DriverArgs,
2637 llvm::opt::ArgStringList &CC1Args)
const {
2642 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2643 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2644 bool NoBuiltinInc = DriverArgs.hasFlag(
2645 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2646 bool ForceBuiltinInc = DriverArgs.hasFlag(
2647 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2650 if (!NoStdInc && !NoStdlibInc) {
2652 llvm::sys::path::append(P,
"usr",
"local",
"include");
2657 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2659 llvm::sys::path::append(P,
"include");
2663 if (NoStdInc || NoStdlibInc)
2667 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2668 if (!CIncludeDirs.empty()) {
2670 CIncludeDirs.split(dirs,
":");
2671 for (llvm::StringRef dir : dirs) {
2672 llvm::StringRef Prefix =
2673 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2679 llvm::sys::path::append(P,
"usr",
"include");
2685 const llvm::opt::ArgList &DriverArgs,
2686 llvm::opt::ArgStringList &CC1Args)
const {
2689 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2698 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2699 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2700 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2704bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2705 llvm::opt::ArgStringList &CC1Args,
2707 llvm::StringRef Version,
2708 llvm::StringRef ArchDir,
2709 llvm::StringRef BitDir)
const {
2710 llvm::sys::path::append(
Base, Version);
2718 if (!ArchDir.empty())
2719 llvm::sys::path::append(P, ArchDir);
2720 if (!BitDir.empty())
2721 llvm::sys::path::append(P, BitDir);
2728 llvm::sys::path::append(P,
"backward");
2736 const llvm::opt::ArgList &DriverArgs,
2737 llvm::opt::ArgStringList &CC1Args)
const {
2745 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2746 options::OPT_nostdincxx))
2767 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
2768 if (
getVFS().exists(InstallBin)) {
2771 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2772 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
2778 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
2779 if (
getVFS().exists(SysrootUsr)) {
2782 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2783 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
2792 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
2797void AppleMachO::AddGnuCPlusPlusIncludePaths(
2798 const llvm::opt::ArgList &DriverArgs,
2799 llvm::opt::ArgStringList &CC1Args)
const {}
2801void DarwinClang::AddGnuCPlusPlusIncludePaths(
2802 const llvm::opt::ArgList &DriverArgs,
2803 llvm::opt::ArgStringList &CC1Args)
const {
2805 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
2807 llvm::Triple::ArchType arch =
getTriple().getArch();
2808 bool IsBaseFound =
true;
2813 case llvm::Triple::x86:
2814 case llvm::Triple::x86_64:
2815 IsBaseFound = AddGnuCPlusPlusIncludePaths(
2816 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
2817 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
2818 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
2819 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
2822 case llvm::Triple::arm:
2823 case llvm::Triple::thumb:
2825 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2826 "arm-apple-darwin10",
"v7");
2828 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2829 "arm-apple-darwin10",
"v6");
2832 case llvm::Triple::aarch64:
2834 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2835 "arm64-apple-darwin10",
"");
2845 ArgStringList &CmdArgs)
const {
2850 CmdArgs.push_back(
"-lc++");
2851 if (Args.hasArg(options::OPT_fexperimental_library))
2852 CmdArgs.push_back(
"-lc++experimental");
2862 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2864 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
2866 if (!
getVFS().exists(P)) {
2867 llvm::sys::path::remove_filename(P);
2868 llvm::sys::path::append(P,
"libstdc++.6.dylib");
2869 if (
getVFS().exists(P)) {
2870 CmdArgs.push_back(Args.MakeArgString(P));
2879 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
2880 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
2881 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
2886 CmdArgs.push_back(
"-lstdc++");
2892 ArgStringList &CmdArgs)
const {
2898 llvm::sys::path::append(P,
"lib",
"darwin");
2902 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
2904 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
2906 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
2910 llvm::sys::path::append(
2911 P, llvm::Twine(
"libclang_rt.cc_kext_") +
2912 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
2914 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
2920 CmdArgs.push_back(Args.MakeArgString(P));
2924 StringRef BoundArch,
2926 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
2936 for (Arg *A : Args) {
2945 case options::OPT_mkernel:
2946 case options::OPT_fapple_kext:
2948 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
2951 case options::OPT_dependency_file:
2952 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
2955 case options::OPT_gfull:
2956 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
2958 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
2961 case options::OPT_gused:
2962 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
2964 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
2967 case options::OPT_shared:
2968 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
2971 case options::OPT_fconstant_cfstrings:
2972 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
2975 case options::OPT_fno_constant_cfstrings:
2976 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
2979 case options::OPT_Wnonportable_cfstrings:
2981 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
2984 case options::OPT_Wno_nonportable_cfstrings:
2986 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
2993 if (!BoundArch.empty()) {
2994 StringRef Name = BoundArch;
2995 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
2996 const Option MArch = Opts.getOption(clang::driver::options::OPT_march_EQ);
3002 else if (Name ==
"ppc601")
3003 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3004 else if (Name ==
"ppc603")
3005 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3006 else if (Name ==
"ppc604")
3007 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3008 else if (Name ==
"ppc604e")
3009 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3010 else if (Name ==
"ppc750")
3011 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3012 else if (Name ==
"ppc7400")
3013 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3014 else if (Name ==
"ppc7450")
3015 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3016 else if (Name ==
"ppc970")
3017 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3019 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3020 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3022 else if (Name ==
"i386")
3024 else if (Name ==
"i486")
3025 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3026 else if (Name ==
"i586")
3027 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3028 else if (Name ==
"i686")
3029 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3030 else if (Name ==
"pentium")
3031 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3032 else if (Name ==
"pentium2")
3033 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3034 else if (Name ==
"pentpro")
3035 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3036 else if (Name ==
"pentIIm3")
3037 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3039 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3040 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3042 else if (Name ==
"arm")
3043 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3044 else if (Name ==
"armv4t")
3045 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3046 else if (Name ==
"armv5")
3047 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3048 else if (Name ==
"xscale")
3049 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3050 else if (Name ==
"armv6")
3051 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3052 else if (Name ==
"armv6m")
3053 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3054 else if (Name ==
"armv7")
3055 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3056 else if (Name ==
"armv7em")
3057 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3058 else if (Name ==
"armv7k")
3059 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3060 else if (Name ==
"armv7m")
3061 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3062 else if (Name ==
"armv7s")
3063 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3070 ArgStringList &CmdArgs,
3071 bool ForceLinkBuiltinRT)
const {
3080 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3086 llvm::Triple::OSType OS;
3092 OS = llvm::Triple::MacOSX;
3095 OS = llvm::Triple::IOS;
3098 OS = llvm::Triple::TvOS;
3101 OS = llvm::Triple::WatchOS;
3123 VersionTuple SDKVersion = SDKInfo->getVersion();
3124 switch (SDKInfo->getOS()) {
3127 case llvm::Triple::MacOSX:
3128 return SDKVersion >= VersionTuple(15U);
3129 case llvm::Triple::IOS:
3130 return SDKVersion >= VersionTuple(18U);
3131 case llvm::Triple::TvOS:
3132 return SDKVersion >= VersionTuple(18U);
3133 case llvm::Triple::WatchOS:
3134 return SDKVersion >= VersionTuple(11U);
3135 case llvm::Triple::XROS:
3136 return SDKVersion >= VersionTuple(2U);
3144static inline llvm::VersionTuple
3149 case llvm::Triple::Darwin:
3150 case llvm::Triple::MacOSX:
3151 return llvm::VersionTuple(10U, 12U);
3152 case llvm::Triple::IOS:
3153 case llvm::Triple::TvOS:
3154 return llvm::VersionTuple(10U);
3155 case llvm::Triple::WatchOS:
3156 return llvm::VersionTuple(3U);
3159 llvm_unreachable(
"Unexpected OS");
3163 llvm::Triple::OSType OS;
3169 OS = llvm::Triple::MacOSX;
3172 OS = llvm::Triple::IOS;
3175 OS = llvm::Triple::TvOS;
3178 OS = llvm::Triple::WatchOS;
3190 llvm::opt::ArgStringList &CC1Args,
3199 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3200 options::OPT_fno_ptrauth_calls))
3201 CC1Args.push_back(
"-fptrauth-calls");
3202 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3203 options::OPT_fno_ptrauth_returns))
3204 CC1Args.push_back(
"-fptrauth-returns");
3205 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3206 options::OPT_fno_ptrauth_intrinsics))
3207 CC1Args.push_back(
"-fptrauth-intrinsics");
3208 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3209 options::OPT_fno_ptrauth_indirect_gotos))
3210 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3211 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3212 options::OPT_fno_ptrauth_auth_traps))
3213 CC1Args.push_back(
"-fptrauth-auth-traps");
3216 if (!DriverArgs.hasArg(
3217 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3218 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3219 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3220 if (!DriverArgs.hasArg(
3221 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3222 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3223 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3226 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3227 options::OPT_fno_ptrauth_objc_isa))
3228 CC1Args.push_back(
"-fptrauth-objc-isa");
3229 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3230 options::OPT_fno_ptrauth_objc_class_ro))
3231 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3232 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3233 options::OPT_fno_ptrauth_objc_interface_sel))
3234 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3239 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3246 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3247 options::OPT_fno_aligned_allocation) &&
3249 CC1Args.push_back(
"-faligned-alloc-unavailable");
3253 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3254 options::OPT_fno_sized_deallocation) &&
3256 CC1Args.push_back(
"-fno-sized-deallocation");
3262 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3266 if (!DriverArgs.getLastArgNoClaim(
3267 options::OPT_fvisibility_inlines_hidden_static_local_var,
3268 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3269 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3283 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3285 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3286 options::OPT_fno_define_target_os_macros))
3287 CC1Args.push_back(
"-fdefine-target-os-macros");
3291 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3292 options::OPT_fno_modulemap_allow_subdirectory_search,
3294 bool RequiresSubdirectorySearch;
3295 VersionTuple SDKVersion =
SDKInfo->getVersion();
3298 RequiresSubdirectorySearch =
true;
3301 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3305 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3308 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3311 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3314 if (!RequiresSubdirectorySearch)
3315 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3320 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3322 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3329 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3331 llvm::raw_string_ostream OS(Arg);
3332 OS <<
"-target-sdk-version=" <<
V;
3333 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3337 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3339 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3342 EmitTargetSDKVersionArg(
3346 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3354 llvm::raw_string_ostream OS(Arg);
3355 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3356 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3357 }
else if (
const auto *MacOStoMacCatalystMapping =
3360 if (std::optional<VersionTuple> SDKVersion =
3361 MacOStoMacCatalystMapping->map(
3365 llvm::raw_string_ostream OS(Arg);
3366 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3367 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3378 DerivedArgList *DAL =
3382 if (BoundArch.empty())
3388 AddDeploymentTarget(*DAL);
3396 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3399 if (A->getOption().getID() != options::OPT_mkernel &&
3400 A->getOption().getID() != options::OPT_fapple_kext)
3402 assert(it != ie &&
"unexpected argument translation");
3404 assert(A->getOption().getID() == options::OPT_static &&
3405 "missing expected -static argument");
3412 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3413 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3414 options::OPT_fno_omit_frame_pointer,
false))
3415 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3416 <<
"-fomit-frame-pointer" << BoundArch;
3425 if (
getArch() == llvm::Triple::x86_64 ||
3427 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3429 return (
getArch() == llvm::Triple::aarch64 ||
3430 getArch() == llvm::Triple::aarch64_32)
3438 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3439 return S[0] !=
'\0';
3444 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3453 return llvm::ExceptionHandling::None;
3457 if (Triple.isWatchABI())
3458 return llvm::ExceptionHandling::DwarfCFI;
3460 return llvm::ExceptionHandling::SjLj;
3475 return (
getArch() == llvm::Triple::x86_64 ||
3476 getArch() == llvm::Triple::aarch64);
3485 ArgStringList &CmdArgs)
const {
3488 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3491 CmdArgs.push_back(
"-watchos_version_min");
3493 CmdArgs.push_back(
"-watchos_simulator_version_min");
3495 CmdArgs.push_back(
"-tvos_version_min");
3497 CmdArgs.push_back(
"-tvos_simulator_version_min");
3499 CmdArgs.push_back(
"-driverkit_version_min");
3501 CmdArgs.push_back(
"-ios_simulator_version_min");
3503 CmdArgs.push_back(
"-iphoneos_version_min");
3505 CmdArgs.push_back(
"-maccatalyst_version_min");
3508 CmdArgs.push_back(
"-macosx_version_min");
3514 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3517 VersionTuple VariantTargetVersion;
3519 CmdArgs.push_back(
"-macosx_version_min");
3524 "unexpected target variant triple");
3525 CmdArgs.push_back(
"-maccatalyst_version_min");
3528 VersionTuple MinTgtVers =
3530 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3531 VariantTargetVersion = MinTgtVers;
3532 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3543 return "mac catalyst";
3554 llvm_unreachable(
"invalid platform");
3558 llvm::opt::ArgStringList &CmdArgs)
const {
3559 auto EmitPlatformVersionArg =
3562 const llvm::Triple &TT) {
3565 CmdArgs.push_back(
"-platform_version");
3566 std::string PlatformName =
3569 PlatformName +=
"-simulator";
3570 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3579 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3582 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3587 std::optional<VersionTuple> iOSSDKVersion;
3589 if (
const auto *MacOStoMacCatalystMapping =
3592 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3593 SDKInfo->getVersion().withoutBuild(),
3597 CmdArgs.push_back(Args.MakeArgString(
3598 (iOSSDKVersion ? *iOSSDKVersion
3605 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3606 if (!SDKVersion.getMinor())
3607 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3608 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3619 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3628 VersionTuple TargetVariantVersion;
3636 "unexpected target variant triple");
3641 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3647 ArgStringList &CmdArgs) {
3651 CmdArgs.push_back(
"-ldylib1.o");
3658 CmdArgs.push_back(
"-ldylib1.o");
3660 CmdArgs.push_back(
"-ldylib1.10.5.o");
3665 ArgStringList &CmdArgs) {
3666 if (Args.hasArg(options::OPT_static))
3671 CmdArgs.push_back(
"-lbundle1.o");
3676 ArgStringList &CmdArgs) {
3678 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3679 Args.hasArg(options::OPT_preload)) {
3680 CmdArgs.push_back(
"-lgcrt0.o");
3682 CmdArgs.push_back(
"-lgcrt1.o");
3692 CmdArgs.push_back(
"-no_new_main");
3694 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3700 ArgStringList &CmdArgs) {
3703 if (D.
getArch() == llvm::Triple::aarch64)
3706 CmdArgs.push_back(
"-lcrt1.o");
3708 CmdArgs.push_back(
"-lcrt1.3.1.o");
3715 CmdArgs.push_back(
"-lcrt1.o");
3717 CmdArgs.push_back(
"-lcrt1.10.5.o");
3719 CmdArgs.push_back(
"-lcrt1.10.6.o");
3724 ArgStringList &CmdArgs)
const {
3726 if (Args.hasArg(options::OPT_dynamiclib))
3728 else if (Args.hasArg(options::OPT_bundle))
3732 else if (Args.hasArg(options::OPT_static) ||
3733 Args.hasArg(options::OPT_object) ||
3734 Args.hasArg(options::OPT_preload))
3735 CmdArgs.push_back(
"-lcrt0.o");
3739 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
3741 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
3742 CmdArgs.push_back(Str);
3754 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
3755 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
3757 Res |= SanitizerKind::Address;
3758 Res |= SanitizerKind::PointerCompare;
3759 Res |= SanitizerKind::PointerSubtract;
3760 Res |= SanitizerKind::Realtime;
3761 Res |= SanitizerKind::Leak;
3762 Res |= SanitizerKind::Fuzzer;
3763 Res |= SanitizerKind::FuzzerNoLink;
3764 Res |= SanitizerKind::ObjCCast;
3771 Res |= SanitizerKind::Vptr;
3773 if ((IsX86_64 || IsAArch64) &&
3776 Res |= SanitizerKind::Thread;
3780 Res |= SanitizerKind::Type;
3784 Res |= SanitizerKind::NumericalStability;
Defines a function that returns the minimum OS versions supporting C++17's aligned allocation functio...
static bool hasMultipleInvocations(const llvm::Triple &Triple, const ArgList &Args)
static bool checkRemarksOptions(const Driver &D, const ArgList &Args, const llvm::Triple &Triple)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const JobAction &JA)
static bool sdkSupportsBuiltinModules(const std::optional< DarwinSDKInfo > &SDKInfo)
static void addPgProfilingLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static const char * ArmMachOArchName(StringRef Arch)
static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args)
Pass -no_deduplicate to ld64 under certain conditions:
static bool hasExportSymbolDirective(const ArgList &Args)
Check if the link command contains a symbol export directive.
static void addDefaultCRTLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static void addBundleLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static llvm::VersionTuple sizedDeallocMinVersion(llvm::Triple::OSType OS)
static VersionTuple minimumMacCatalystDeploymentTarget()
static std::string getSystemOrSDKMacOSVersion(StringRef MacOSSDKVersion)
Returns the most appropriate macOS target version for the current process.
static void addDynamicLibLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static void AppendPlatformPrefix(SmallString< 128 > &Path, const llvm::Triple &T)
static bool isObjCRuntimeLinked(const ArgList &Args)
Determine whether we are linking the ObjC runtime.
static const char * getPlatformName(Darwin::DarwinPlatformKind Platform, Darwin::DarwinEnvironmentKind Environment)
static const char * ArmMachOArchNameCPU(StringRef CPU)
static void addExportedSymbol(ArgStringList &CmdArgs, const char *Symbol)
Add an export directive for Symbol to the link command.
static StringRef getXcodeDeveloperPath(StringRef PathIntoXcode)
Take a path that speculatively points into Xcode and return the XCODE/Contents/Developer path if it i...
static void addSectalignToPage(const ArgList &Args, ArgStringList &CmdArgs, StringRef Segment, StringRef Section)
Add a sectalign directive for Segment and Section to the maximum expected page size for Darwin.
Defines types useful for describing an Objective-C runtime.
The basic abstraction for the target Objective-C runtime.
bool hasNativeARC() const
Does this runtime natively provide the ARC entrypoints?
bool hasSubscripting() const
Does this runtime directly support the subscripting methods?
@ MacOSX
'macosx' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the non-fragile AB...
@ FragileMacOSX
'macosx-fragile' is the Apple-provided NeXT-derived runtime on Mac OS X platforms that use the fragil...
@ iOS
'ios' is the Apple-provided NeXT-derived runtime on iOS or the iOS simulator; it is always non-fragil...
@ WatchOS
'watchos' is a variant of iOS for Apple's watchOS.
The base class of the type hierarchy.
Action - Represent an abstract compilation step to perform.
types::ID getType() const
ActionClass getKind() const
@ VerifyDebugInfoJobClass
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 SysRoot
sysroot, if present
std::string GetTemporaryDirectory(StringRef Prefix) const
GetTemporaryDirectory - Return the pathname of a temporary directory to use as part of compilation; t...
DiagnosticBuilder Diag(unsigned DiagID) const
static bool GetReleaseVersion(StringRef Str, unsigned &Major, unsigned &Minor, unsigned &Micro, bool &HadExtra)
GetReleaseVersion - Parse (([0-9]+)(.
const llvm::opt::OptTable & getOpts() 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.
bool isUsingLTO() const
Returns true if we are performing any kind of LTO.
LTOKind getLTOMode() const
Get the specific kind of LTO being performed.
bool needsStatsRt() const
bool needsMemProfRt() const
bool linkRuntimes() const
bool needsUbsanRt() const
bool needsRtsanRt() const
bool requiresMinimalRuntime() const
bool needsSharedRt() const
bool needsTysanRt() const
bool needsStableAbi() const
const char * getTypeTempSuffix(ID Id, bool CLStyle=false)
getTypeTempSuffix - Return the suffix to use when creating a temp file of this type,...
SmallVector< InputInfo, 4 > InputInfoList
bool willEmitRemarks(const llvm::opt::ArgList &Args)
The JSON file list parser is used to communicate input to InstallAPI.
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
@ Result
The result type of a method or function.
const FunctionProtoType * T
llvm::VersionTuple alignedAllocMinVersion(llvm::Triple::OSType OS)
llvm::StringRef getAsString(SyncScope S)
bool(*)(llvm::ArrayRef< const char * >, llvm::raw_ostream &, llvm::raw_ostream &, bool, bool) Driver
static constexpr OSEnvPair macCatalystToMacOSPair()
Returns the os-environment mapping pair that's used to represent the Mac Catalyst -> macOS version ma...
static constexpr OSEnvPair macOStoMacCatalystPair()
Returns the os-environment mapping pair that's used to represent the macOS -> Mac Catalyst version ma...
static constexpr ResponseFileSupport None()
Returns a ResponseFileSupport indicating that response files are not supported.
static constexpr ResponseFileSupport AtFileUTF8()