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"
30#ifdef CLANG_USE_XCSELECT
41 return VersionTuple(13, 1);
57 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
58 .Cases({
"i386",
"i486",
"i486SX",
"i586",
"i686"}, llvm::Triple::x86)
59 .Cases({
"pentium",
"pentpro",
"pentIIm3",
"pentIIm5",
"pentium4"},
61 .Cases({
"x86_64",
"x86_64h"}, llvm::Triple::x86_64)
63 .Cases({
"arm",
"armv4t",
"armv5",
"armv6",
"armv6m"}, llvm::Triple::arm)
64 .Cases({
"armv7",
"armv7em",
"armv7k",
"armv7m"}, llvm::Triple::arm)
65 .Cases({
"armv7s",
"xscale"}, llvm::Triple::arm)
66 .Cases({
"armv8m.base",
"armv8m.main",
"armv8.1m.main"}, llvm::Triple::arm)
67 .Cases({
"arm64",
"arm64e"}, llvm::Triple::aarch64)
68 .Case(
"arm64_32", llvm::Triple::aarch64_32)
69 .Cases({
"amdgpu",
"amdgcn"}, llvm::Triple::amdgpu)
70 .Case(
"r600", llvm::Triple::r600)
71 .Case(
"nvptx", llvm::Triple::nvptx)
72 .Case(
"nvptx64", llvm::Triple::nvptx64)
73 .Case(
"amdil", llvm::Triple::amdil)
74 .Case(
"spir", llvm::Triple::spir)
75 .Default(llvm::Triple::UnknownArch);
79 const ArgList &Args) {
80 const llvm::Triple::ArchType
Arch = getArchTypeForMachOArchName(Str);
81 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
83 if (
Arch != llvm::Triple::UnknownArch)
89 if ((
T.getOS() != llvm::Triple::Firmware) &&
90 (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
91 ArchKind == llvm::ARM::ArchKind::ARMV7M ||
92 ArchKind == llvm::ARM::ArchKind::ARMV7EM ||
93 ArchKind == llvm::ARM::ArchKind::ARMV8MBaseline ||
94 ArchKind == llvm::ARM::ArchKind::ARMV8MMainline ||
95 ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline)) {
97 if (
T.getOS() == llvm::Triple::IOS)
98 for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
99 A->ignoreTargetSpecific();
100 if (
T.getOS() == llvm::Triple::WatchOS)
101 for (Arg *A : Args.filtered(options::OPT_mwatchos_version_min_EQ))
102 A->ignoreTargetSpecific();
103 if (
T.getOS() == llvm::Triple::TvOS)
104 for (Arg *A : Args.filtered(options::OPT_mtvos_version_min_EQ))
105 A->ignoreTargetSpecific();
107 T.setOS(llvm::Triple::UnknownOS);
108 T.setObjectFormat(llvm::Triple::MachO);
116 const char *LinkingOutput)
const {
119 ArgStringList CmdArgs;
121 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
125 const Action *SourceAction = &JA;
127 assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
128 SourceAction = SourceAction->
getInputs()[0];
136 if (Args.hasArg(options::OPT_fno_integrated_as)) {
137 if (!(
T.isMacOSX() &&
T.isMacOSXVersionLT(10, 7)))
138 CmdArgs.push_back(
"-Q");
142 if (SourceAction->
getType() == types::TY_Asm ||
143 SourceAction->
getType() == types::TY_PP_Asm) {
144 if (Args.hasArg(options::OPT_gstabs))
145 CmdArgs.push_back(
"--gstabs");
146 else if (Args.hasArg(options::OPT_g_Group))
147 CmdArgs.push_back(
"-g");
154 if (
T.isX86() || Args.hasArg(options::OPT_force__cpusubtype__ALL))
155 CmdArgs.push_back(
"-force_cpusubtype_ALL");
158 (((Args.hasArg(options::OPT_mkernel) ||
159 Args.hasArg(options::OPT_fapple_kext)) &&
161 Args.hasArg(options::OPT_static)))
162 CmdArgs.push_back(
"-static");
164 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
166 assert(Output.
isFilename() &&
"Unexpected lipo output.");
167 CmdArgs.push_back(
"-o");
170 assert(Input.
isFilename() &&
"Invalid input.");
175 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
177 Exec, CmdArgs, Inputs, Output));
180void darwin::MachOTool::anchor() {}
183 ArgStringList &CmdArgs)
const {
187 CmdArgs.push_back(
"-arch");
188 CmdArgs.push_back(Args.MakeArgString(ArchName));
191 if (ArchName ==
"arm")
192 CmdArgs.push_back(
"-force_cpusubtype_ALL");
196 ArgStringList &CmdArgs)
const {
206 CmdArgs.push_back(
"-arch_only");
207 CmdArgs.push_back(Args.MakeArgString(ArchName));
211 ArgStringList &CmdArgs) {
216 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
217 CmdArgs.push_back(
"-syslibroot");
218 CmdArgs.push_back(A->getValue());
219 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
220 CmdArgs.push_back(
"-syslibroot");
221 CmdArgs.push_back(A->getValue());
222 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
223 CmdArgs.push_back(
"-syslibroot");
224 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
228bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
232 for (
const auto &Input : Inputs)
233 if (Input.getType() != types::TY_Object)
247 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
248 if (A->getOption().matches(options::OPT_O0))
250 if (A->getOption().matches(options::OPT_O))
251 return llvm::StringSwitch<bool>(A->getValue())
257 if (!IsLinkerOnlyAction)
262void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
263 ArgStringList &CmdArgs,
265 VersionTuple Version,
bool LinkerIsLLD,
266 bool UsePlatformVersion)
const {
267 const Driver &D = getToolChain().getDriver();
268 const toolchains::MachO &MachOTC = getMachOToolChain();
272 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
273 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
274 CmdArgs.push_back(
"-demangle");
276 if (Args.hasArg(options::OPT_rdynamic) &&
277 (Version >= VersionTuple(137) || LinkerIsLLD))
278 CmdArgs.push_back(
"-export_dynamic");
282 if (Args.hasFlag(options::OPT_fapplication_extension,
283 options::OPT_fno_application_extension,
false))
284 CmdArgs.push_back(
"-application_extension");
286 if (
auto LTO = getToolChain().getLTOMode(Args);
287 LTO !=
LTOK_None && (Version >= VersionTuple(116) || LinkerIsLLD) &&
288 NeedsTempPath(Inputs)) {
289 std::string TmpPathName;
300 if (!TmpPathName.empty()) {
301 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
302 C.addTempFile(TmpPath);
303 CmdArgs.push_back(
"-object_path_lto");
304 CmdArgs.push_back(TmpPath);
317 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
319 StringRef P = llvm::sys::path::parent_path(D.
Dir);
320 SmallString<128> LibLTOPath(P);
321 llvm::sys::path::append(LibLTOPath,
"lib");
322 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
323 CmdArgs.push_back(
"-lto_library");
324 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
330 if (Version >= VersionTuple(262) &&
332 CmdArgs.push_back(
"-no_deduplicate");
335 Args.AddAllArgs(CmdArgs, options::OPT_static);
336 if (!Args.hasArg(options::OPT_static))
337 CmdArgs.push_back(
"-dynamic");
338 if (Args.hasArg(options::OPT_fgnu_runtime)) {
343 if (!Args.hasArg(options::OPT_dynamiclib)) {
344 AddMachOArch(Args, CmdArgs);
346 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
348 Args.AddLastArg(CmdArgs, options::OPT_bundle);
349 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
350 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
353 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
354 (A = Args.getLastArg(options::OPT_current__version)) ||
355 (A = Args.getLastArg(options::OPT_install__name)))
356 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
359 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
360 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
361 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
363 CmdArgs.push_back(
"-dylib");
366 if ((A = Args.getLastArg(options::OPT_bundle)) ||
367 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
368 (A = Args.getLastArg(options::OPT_client__name)) ||
369 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
370 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
371 (A = Args.getLastArg(options::OPT_private__bundle)))
372 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
375 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
376 "-dylib_compatibility_version");
377 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
378 "-dylib_current_version");
380 AddMachOArch(Args, CmdArgs);
382 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
383 "-dylib_install_name");
386 Args.AddLastArg(CmdArgs, options::OPT_all__load);
387 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
388 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
390 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
391 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
392 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
393 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
394 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
395 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
396 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
397 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
398 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
399 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
400 Args.AddAllArgs(CmdArgs, options::OPT_init);
403 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
408 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
409 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
410 Args.AddLastArg(CmdArgs, options::OPT_single__module);
411 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
412 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
415 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
416 options::OPT_fno_pie, options::OPT_fno_PIE)) {
417 if (A->getOption().matches(options::OPT_fpie) ||
418 A->getOption().matches(options::OPT_fPIE))
419 CmdArgs.push_back(
"-pie");
421 CmdArgs.push_back(
"-no_pie");
425 if (
C.getDriver().embedBitcodeEnabled()) {
428 CmdArgs.push_back(
"-bitcode_bundle");
430 if (
C.getDriver().embedBitcodeMarkerOnly() &&
431 Version >= VersionTuple(278)) {
432 CmdArgs.push_back(
"-bitcode_process_mode");
433 CmdArgs.push_back(
"marker");
436 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
440 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
441 options::OPT_fno_global_isel)) {
442 if (A->getOption().matches(options::OPT_fglobal_isel)) {
443 CmdArgs.push_back(
"-mllvm");
444 CmdArgs.push_back(
"-global-isel");
446 CmdArgs.push_back(
"-mllvm");
447 CmdArgs.push_back(
"-global-isel-abort=0");
451 if (Args.hasArg(options::OPT_mkernel) ||
452 Args.hasArg(options::OPT_fapple_kext) ||
453 Args.hasArg(options::OPT_ffreestanding)) {
454 CmdArgs.push_back(
"-mllvm");
455 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
458 Args.AddLastArg(CmdArgs, options::OPT_prebind);
459 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
460 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
461 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
462 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
463 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
464 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
465 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
466 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
467 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
468 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
469 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
470 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
471 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
472 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
473 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
477 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
478 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
479 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
480 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
481 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
482 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
483 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
484 Args.AddAllArgs(CmdArgs, options::OPT_y);
485 Args.AddLastArg(CmdArgs, options::OPT_w);
486 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
487 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
488 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
489 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
490 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
491 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
492 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
493 Args.AddLastArg(CmdArgs, options::OPT_why_load);
494 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
495 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
496 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
497 Args.AddLastArg(CmdArgs, options::OPT_Mach);
501 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
503 : CSPGOGenerateArg->getValue());
504 llvm::sys::path::append(Path,
"default_%m.profraw");
505 CmdArgs.push_back(
"--cs-profile-generate");
506 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
508 SmallString<128> Path(
509 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
510 if (Path.empty() || llvm::sys::fs::is_directory(Path))
511 llvm::sys::path::append(Path,
"default.profdata");
512 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
515 auto *CodeGenDataGenArg =
516 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
517 if (CodeGenDataGenArg)
519 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
520 CodeGenDataGenArg->getValue()));
523 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
525 : CSPGOGenerateArg->getValue());
526 llvm::sys::path::append(Path,
"default_%m.profraw");
527 CmdArgs.push_back(
"-mllvm");
528 CmdArgs.push_back(
"-cs-profile-generate");
529 CmdArgs.push_back(
"-mllvm");
530 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
532 SmallString<128> Path(
533 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
534 if (Path.empty() || llvm::sys::fs::is_directory(Path))
535 llvm::sys::path::append(Path,
"default.profdata");
536 CmdArgs.push_back(
"-mllvm");
537 CmdArgs.push_back(Args.MakeArgString(Twine(
"-cs-profile-path=") + Path));
542 CmdArgs.push_back(
"-mllvm");
544 Args.MakeArgString(Twine(
"-sample-profile-file=") + A->getValue()));
551 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
554 return Args.hasArg(options::OPT_fobjc_link_runtime);
558 const llvm::Triple &Triple) {
563 Args.getAllArgValues(options::OPT_arch).size() > 1;
564 bool hasExplicitOutputFile =
565 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
567 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
568 <<
"-foptimization-record-file";
575 const llvm::Triple &Triple,
577 StringRef Format =
"yaml";
578 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
579 Format = A->getValue();
581 CmdArgs.push_back(
"-mllvm");
582 CmdArgs.push_back(
"-lto-pass-remarks-output");
583 CmdArgs.push_back(
"-mllvm");
585 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
587 CmdArgs.push_back(A->getValue());
589 assert(Output.
isFilename() &&
"Unexpected ld output.");
595 CmdArgs.push_back(Args.MakeArgString(F));
599 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
600 CmdArgs.push_back(
"-mllvm");
602 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
603 CmdArgs.push_back(Args.MakeArgString(Passes));
606 if (!Format.empty()) {
607 CmdArgs.push_back(
"-mllvm");
608 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
609 CmdArgs.push_back(Args.MakeArgString(FormatArg));
613 CmdArgs.push_back(
"-mllvm");
614 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
617 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
618 CmdArgs.push_back(
"-mllvm");
620 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
621 CmdArgs.push_back(Args.MakeArgString(Opt));
630 const char *LinkingOutput)
const {
631 assert((Output.
getType() == types::TY_Image ||
632 Output.
getType() == types::TY_Object) &&
633 "Invalid linker output type.");
639 llvm::opt::ArgStringList InputFileList;
644 ArgStringList CmdArgs;
650 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
654 bool UsePlatformVersion = Triple.isXROS() || Triple.isOSFirmware();
658 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
668 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
669 if (A->getOption().matches(options::OPT_moutline)) {
671 CmdArgs.push_back(
"-mllvm");
672 CmdArgs.push_back(
"-enable-machine-outliner");
678 CmdArgs.push_back(
"-mllvm");
679 CmdArgs.push_back(
"-enable-machine-outliner=never");
686 CmdArgs.push_back(
"-mllvm");
687 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
690 auto *CodeGenDataGenArg =
691 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
692 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
696 if (CodeGenDataGenArg && CodeGenDataUseArg)
697 D.
Diag(diag::err_drv_argument_not_allowed_with)
698 << CodeGenDataGenArg->getAsString(Args)
699 << CodeGenDataUseArg->getAsString(Args);
703 if (CodeGenDataGenArg) {
704 CmdArgs.push_back(
"-mllvm");
705 CmdArgs.push_back(
"-codegen-data-generate");
709 if (CodeGenDataUseArg) {
710 CmdArgs.push_back(
"-mllvm");
711 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
712 CodeGenDataUseArg->getValue()));
718 if (!StatsFile.empty()) {
719 CmdArgs.push_back(
"-mllvm");
720 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
724 if (Args.hasArg(options::OPT_fstack_usage)) {
726 llvm::sys::path::replace_extension(StackUsageFile,
"su");
727 CmdArgs.push_back(
"-mllvm");
729 Args.MakeArgString(
"-stack-usage-file=" + StackUsageFile));
734 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
735 options::OPT_Z_Flag, options::OPT_u_Group});
740 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
741 CmdArgs.push_back(
"-ObjC");
743 CmdArgs.push_back(
"-o");
746 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
749 Args.AddAllArgs(CmdArgs, options::OPT_L);
754 for (
const auto &II : Inputs) {
755 if (!II.isFilename()) {
760 if (InputFileList.size() > 0)
766 InputFileList.push_back(II.getFilename());
772 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
773 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
777 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
781 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
785 CmdArgs.push_back(
"-framework");
786 CmdArgs.push_back(
"Foundation");
788 CmdArgs.push_back(
"-lobjc");
792 CmdArgs.push_back(
"-arch_multiple");
793 CmdArgs.push_back(
"-final_output");
794 CmdArgs.push_back(LinkingOutput);
797 if (Args.hasArg(options::OPT_fnested_functions))
798 CmdArgs.push_back(
"-allow_stack_execute");
803 if (!Parallelism.empty()) {
804 CmdArgs.push_back(
"-mllvm");
805 unsigned NumThreads =
806 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
807 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
813 bool NoStdOrDefaultLibs =
814 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
815 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
816 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
821 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
829 Args.ClaimAllArgs(options::OPT_pthread);
830 Args.ClaimAllArgs(options::OPT_pthreads);
834 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
838 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
839 Args.AddAllArgs(CmdArgs, options::OPT_F);
842 for (
const Arg *A : Args.filtered(options::OPT_iframework))
843 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
845 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
846 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
847 if (A->getValue() == StringRef(
"Accelerate")) {
848 CmdArgs.push_back(
"-framework");
849 CmdArgs.push_back(
"Accelerate");
858 bool NonStandardSearchPath =
false;
860 if (Triple.isDriverKit()) {
862 NonStandardSearchPath =
863 Version.getMajor() < 605 ||
864 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
869 if (NonStandardSearchPath) {
870 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
871 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
874 llvm::sys::path::append(P, SearchPath);
876 CmdArgs.push_back(Args.MakeArgString(Flag + P));
879 AddSearchPath(
"-L",
"/usr/lib");
880 AddSearchPath(
"-F",
"/System/Library/Frameworks");
886 if (Version >= VersionTuple(705) || LinkerIsLLD) {
894 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
895 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
896 Cmd->setInputFileList(std::move(InputFileList));
897 C.addCommand(std::move(Cmd));
904 const char *LinkingOutput)
const {
908 Args.ClaimAllArgs(options::OPT_g_Group);
910 Args.ClaimAllArgs(options::OPT_emit_llvm);
913 Args.ClaimAllArgs(options::OPT_w);
915 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
917 ArgStringList CmdArgs;
918 CmdArgs.push_back(
"-static");
920 if (Args.hasArg(options::OPT_static_lib_target_arch_only))
923 if (Args.hasFlag(options::OPT_static_lib_deterministic,
924 options::OPT_no_static_lib_deterministic,
926 CmdArgs.push_back(
"-D");
929 Args.AddAllArgs(CmdArgs, options::OPT_L);
931 if (!Args.hasFlag(options::OPT_static_lib_warn_no_symbols,
932 options::OPT_no_static_lib_warn_no_symbols,
934 CmdArgs.push_back(
"-no_warning_for_no_symbols");
936 Args.AddAllArgValues(CmdArgs, options::OPT_Xstatic_lib_tool);
938 CmdArgs.push_back(
"-o");
941 Args.AddLastArg(CmdArgs, options::OPT_filelist);
942 for (
const auto &II : Inputs) {
943 if (II.isFilename()) {
944 CmdArgs.push_back(II.getFilename());
951 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
952 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
953 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
958 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
959 C.addCommand(std::make_unique<Command>(JA, *
this,
961 Exec, CmdArgs, Inputs, Output));
968 const char *LinkingOutput)
const {
969 ArgStringList CmdArgs;
971 CmdArgs.push_back(
"-create");
972 assert(Output.
isFilename() &&
"Unexpected lipo output.");
974 CmdArgs.push_back(
"-output");
977 for (
const auto &II : Inputs) {
978 assert(II.isFilename() &&
"Unexpected lipo input.");
979 CmdArgs.push_back(II.getFilename());
982 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
984 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
986 Exec, CmdArgs, Inputs, Output));
993 const char *LinkingOutput)
const {
994 ArgStringList CmdArgs;
996 CmdArgs.push_back(
"-o");
999 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
1001 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
1005 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
1007 Exec, CmdArgs, Inputs, Output));
1013 const ArgList &Args,
1014 const char *LinkingOutput)
const {
1015 ArgStringList CmdArgs;
1016 CmdArgs.push_back(
"--verify");
1017 CmdArgs.push_back(
"--debug-info");
1018 CmdArgs.push_back(
"--eh-frame");
1019 CmdArgs.push_back(
"--quiet");
1021 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
1023 assert(Input.
isFilename() &&
"Unexpected verify input");
1029 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
1031 Exec, CmdArgs, Inputs, Output));
1041 const ArgList &Args)
1053 if (Ty == types::TY_PP_Asm)
1054 return types::TY_Asm;
1074 auto T = llvm::Triple(Twine(
"arm64-apple-") +
1075 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1099 ArgStringList &CC1Args)
const {
1104 ArgStringList &CC1Args)
const {
1109 ArgStringList &CC1Args)
const {
1118 return llvm::StringSwitch<const char *>(
Arch)
1119 .Case(
"armv6k",
"armv6")
1120 .Case(
"armv6m",
"armv6m")
1121 .Case(
"armv5tej",
"armv5")
1122 .Case(
"xscale",
"xscale")
1123 .Case(
"armv4t",
"armv4t")
1124 .Case(
"armv7",
"armv7")
1125 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1126 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1127 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1128 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1129 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1130 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1131 .Cases({
"armv8-m.base",
"armv8m.base"},
"armv8m.base")
1132 .Cases({
"armv8-m.main",
"armv8m.main"},
"armv8m.main")
1133 .Cases({
"armv8.1-m.main",
"armv8m.main"},
"armv8.1m.main")
1138 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1139 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1141 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1145 if (
Arch.starts_with(
"armv5"))
1148 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1151 else if (
Arch.ends_with(
"v7a"))
1161 case llvm::Triple::aarch64_32:
1164 case llvm::Triple::aarch64: {
1170 case llvm::Triple::thumb:
1171 case llvm::Triple::arm:
1172 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1176 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1185 if (LinkerVersion) {
1187 VersionTuple NewLinkerVersion;
1188 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1189 (void)NewLinkerVersion.tryParse(A->getValue());
1190 assert(NewLinkerVersion == LinkerVersion);
1192 return *LinkerVersion;
1195 VersionTuple NewLinkerVersion;
1196 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1199 if (NewLinkerVersion.tryParse(A->getValue()) ||
1200 NewLinkerVersion.getSubbuild())
1202 << A->getAsString(Args);
1205 LinkerVersion = NewLinkerVersion;
1206 return *LinkerVersion;
1215 llvm::Triple::OSType OS =
getTriple().getOS();
1219 case llvm::Triple::Darwin:
1220 case llvm::Triple::MacOSX:
1223 case llvm::Triple::IOS:
1226 case llvm::Triple::TvOS:
1229 case llvm::Triple::WatchOS:
1232 case llvm::Triple::XROS:
1235 case llvm::Triple::DriverKit:
1244 if (
getTriple().isSimulatorEnvironment())
1246 else if (
getTriple().isMacCatalystEnvironment())
1250 if (Platform ==
MacOS) {
1254 if (!
getTriple().getMacOSXVersion(OsVer))
1259 setTarget(Platform, Environment, OsVer.getMajor(),
1260 OsVer.getMinor().value_or(0), OsVer.getSubminor().value_or(0),
1272void Darwin::VerifyTripleForSDK(
const llvm::opt::ArgList &Args,
1273 const llvm::Triple &Triple)
const {
1275 if (!
SDKInfo->supportsTriple(Triple))
1277 <<
SDKInfo->getDisplayName() << Triple.getTriple();
1278 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
1281 const char *isysroot = A->getValue();
1283 if (!SDKName.empty()) {
1284 bool supported =
true;
1285 if (Triple.isWatchOS())
1286 supported = SDKName.starts_with(
"Watch");
1287 else if (Triple.isTvOS())
1288 supported = SDKName.starts_with(
"AppleTV");
1289 else if (Triple.isDriverKit())
1290 supported = SDKName.starts_with(
"DriverKit");
1291 else if (Triple.isiOS())
1292 supported = SDKName.starts_with(
"iPhone");
1293 else if (Triple.isMacOSX())
1294 supported = SDKName.starts_with(
"MacOSX");
1300 << SDKName << Triple.getTriple();
1317 return Triple.getTriple();
1329 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1331 Str += llvm::Triple::getOSTypeName(llvm::Triple::Firmware);
1335 Triple.setOSName(Str);
1337 VerifyTripleForSDK(Args, Triple);
1339 return Triple.getTriple();
1351 return Dsymutil.get();
1355 return VerifyDebug.get();
1372 const ArgList &Args)
1373 :
Darwin(D, Triple, Args) {}
1377 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1378 CC1Args.push_back(
"-Werror=undef-prefix");
1389 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1390 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1395 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1400 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1410 static constexpr llvm::StringLiteral XcodeAppSuffix(
1411 ".app/Contents/Developer");
1412 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1413 if (Index == StringRef::npos)
1415 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1419 ArgStringList &CmdArgs)
const {
1438 llvm::sys::path::remove_filename(P);
1439 llvm::sys::path::remove_filename(P);
1440 llvm::sys::path::append(P,
"lib",
"arc");
1446 if (!
getVFS().exists(P)) {
1447 auto updatePath = [&](
const Arg *A) {
1451 if (XcodePathForSDK.empty())
1454 P = XcodePathForSDK;
1455 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1457 return getVFS().exists(P);
1460 bool updated =
false;
1461 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1462 updated = updatePath(A);
1465 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1470 CmdArgs.push_back(
"-force_load");
1471 llvm::sys::path::append(P,
"libarclite_");
1474 P +=
"watchsimulator";
1478 P +=
"appletvsimulator";
1482 P +=
"iphonesimulator";
1490 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1492 CmdArgs.push_back(Args.MakeArgString(P));
1529 bool IsShared)
const {
1537 const char *LibArg = Args.MakeArgString(P);
1538 CmdArgs.push_back(LibArg);
1546 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1550 CmdArgs.push_back(
"-rpath");
1551 CmdArgs.push_back(
"@executable_path");
1555 CmdArgs.push_back(
"-rpath");
1556 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1563 "it doesn't make sense to ask for the compiler-rt library name as an "
1567 if (Component !=
"builtins") {
1568 MachOLibName +=
'.';
1569 MachOLibName += Component;
1574 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1576 return std::string(FullPath);
1586 "it doesn't make sense to ask for the compiler-rt library name as an "
1590 if (Component !=
"builtins") {
1591 DarwinLibName += Component;
1592 DarwinLibName +=
'_';
1598 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1599 return std::string(FullPath);
1604 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1605 auto EndSDK = llvm::sys::path::rend(isysroot);
1606 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1607 StringRef SDK = *IT;
1608 if (SDK.consume_back(
".sdk"))
1638 llvm_unreachable(
"Unsupported platform");
1643 for (Arg *A : Args) {
1644 if (A->getOption().matches(options::OPT_exported__symbols__list))
1646 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1647 !A->getOption().matches(options::OPT_Xlinker))
1649 if (A->containsValue(
"-exported_symbols_list") ||
1650 A->containsValue(
"-exported_symbol"))
1658 CmdArgs.push_back(
"-exported_symbol");
1659 CmdArgs.push_back(Symbol);
1669 StringRef Segment, StringRef Section) {
1670 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1671 Args.MakeArgString(Section),
"0x4000"})
1672 CmdArgs.push_back(A);
1676 ArgStringList &CmdArgs)
const {
1705 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1707 Args, CmdArgs,
"__DATA",
1708 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1714void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1715 ArgStringList &CmdArgs,
1716 StringRef Sanitizer,
1717 bool Shared)
const {
1723 const ArgList &Args)
const {
1724 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1725 StringRef
Value = A->getValue();
1726 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1727 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1728 <<
Value <<
"darwin";
1735 ArgStringList &CmdArgs,
1736 bool ForceLinkBuiltinRT)
const {
1746 if (Args.hasArg(options::OPT_static) ||
1747 Args.hasArg(options::OPT_fapple_kext) ||
1748 Args.hasArg(options::OPT_mkernel)) {
1749 if (ForceLinkBuiltinRT)
1757 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1758 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1765 const char *sanitizer =
nullptr;
1767 sanitizer =
"UndefinedBehaviorSanitizer";
1769 sanitizer =
"RealtimeSanitizer";
1771 sanitizer =
"AddressSanitizer";
1773 sanitizer =
"ThreadSanitizer";
1776 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1785 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1788 "Static sanitizer runtimes not supported");
1789 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1794 "Static sanitizer runtimes not supported");
1795 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1798 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1801 "Static sanitizer runtimes not supported");
1802 AddLinkSanitizerLibArgs(
1808 "Static sanitizer runtimes not supported");
1809 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1812 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1813 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1814 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1826 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1834 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1844 CmdArgs.push_back(
"-framework");
1845 CmdArgs.push_back(
"DriverKit");
1851 CmdArgs.push_back(
"-lSystem");
1863 CmdArgs.push_back(
"-lgcc_s.1");
1872 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1873 if (!SystemTriple.isMacOSX())
1874 return std::string(MacOSSDKVersion);
1875 VersionTuple SystemVersion;
1876 SystemTriple.getMacOSXVersion(SystemVersion);
1878 unsigned Major, Minor, Micro;
1882 return std::string(MacOSSDKVersion);
1883 VersionTuple SDKVersion(Major, Minor, Micro);
1885 if (SDKVersion > SystemVersion)
1886 return SystemVersion.getAsString();
1887 return std::string(MacOSSDKVersion);
1894struct DarwinPlatform {
1903 DeploymentTargetEnv,
1913 DarwinPlatformKind getPlatform()
const {
return Platform; }
1915 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1917 void setEnvironment(DarwinEnvironmentKind Kind) {
1919 InferSimulatorFromArch =
false;
1922 const VersionTuple getOSVersion()
const {
1923 return UnderlyingOSVersion.value_or(VersionTuple());
1926 VersionTuple takeOSVersion() {
1927 assert(UnderlyingOSVersion.has_value() &&
1928 "attempting to get an unset OS version");
1929 VersionTuple
Result = *UnderlyingOSVersion;
1930 UnderlyingOSVersion.reset();
1933 bool isValidOSVersion()
const {
1934 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1938 VersionTuple getCanonicalOSVersion()
const {
1939 return llvm::Triple::getCanonicalVersionForOS(
1940 getOSFromPlatform(Platform), getOSVersion(),
true);
1943 void setOSVersion(
const VersionTuple &Version) {
1944 UnderlyingOSVersion = Version;
1947 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1949 VersionTuple getZipperedOSVersion()
const {
1950 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1951 "zippered target version is specified only for Mac Catalyst");
1952 return ZipperedOSVersion;
1956 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1959 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1961 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1962 return TargetVariantTriple;
1966 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1970 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1974 case DarwinPlatformKind::MacOS:
1975 Opt = options::OPT_mmacos_version_min_EQ;
1977 case DarwinPlatformKind::IPhoneOS:
1978 Opt = options::OPT_mios_version_min_EQ;
1980 case DarwinPlatformKind::TvOS:
1981 Opt = options::OPT_mtvos_version_min_EQ;
1983 case DarwinPlatformKind::WatchOS:
1984 Opt = options::OPT_mwatchos_version_min_EQ;
1990 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1996 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
2002 assert(Arg &&
"OS version argument not yet inferred");
2003 return Arg->getAsString(Args);
2004 case DeploymentTargetEnv:
2005 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
2006 case InferredFromSDK:
2007 case InferredFromArch:
2008 llvm_unreachable(
"Cannot print arguments for inferred OS version");
2010 llvm_unreachable(
"Unsupported Darwin Source Kind");
2014 std::string getInferredSource() {
2015 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
2016 return InferredSource.str();
2019 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
2020 const VersionTuple &OSVersion,
2021 const std::optional<DarwinSDKInfo> &SDKInfo) {
2023 case llvm::Triple::Simulator:
2024 Environment = DarwinEnvironmentKind::Simulator;
2026 case llvm::Triple::MacABI: {
2027 Environment = DarwinEnvironmentKind::MacCatalyst;
2029 ZipperedOSVersion = VersionTuple(10, 15);
2030 if (hasOSVersion() && SDKInfo) {
2031 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
2033 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
2034 OSVersion, ZipperedOSVersion, std::nullopt)) {
2035 ZipperedOSVersion = *MacOSVersion;
2042 if (TargetVariantTriple) {
2043 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
2044 if (TargetVariantVersion.getMajor()) {
2045 if (TargetVariantVersion < ZipperedOSVersion)
2046 ZipperedOSVersion = std::move(TargetVariantVersion);
2056 static DarwinPlatform
2057 createFromTarget(
const llvm::Triple &TT, Arg *A,
2058 std::optional<llvm::Triple> TargetVariantTriple,
2059 const std::optional<DarwinSDKInfo> &SDKInfo) {
2060 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
2061 TT.getOSVersion(), A);
2062 VersionTuple OsVersion = TT.getOSVersion();
2063 Result.TargetVariantTriple = std::move(TargetVariantTriple);
2064 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
2067 static DarwinPlatform
2068 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
2069 llvm::Triple::EnvironmentType Environment, Arg *A,
2070 const std::optional<DarwinSDKInfo> &SDKInfo) {
2071 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
2072 Result.InferSimulatorFromArch =
false;
2073 Result.setEnvironment(Environment, OSVersion, SDKInfo);
2076 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
2078 DarwinPlatform
Result{OSVersionArg, Platform,
2079 getVersionFromString(A->getValue()), A};
2081 Result.Environment = DarwinEnvironmentKind::Simulator;
2084 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
2085 StringRef EnvVarName,
2086 StringRef OSVersion) {
2087 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
2088 getVersionFromString(OSVersion));
2089 Result.EnvVarName = EnvVarName;
2092 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
2093 const DarwinSDKInfo &SDKInfo) {
2095 const llvm::Triple::OSType
OS = PlatformTriple.getOS();
2097 if (OS == llvm::Triple::MacOSX)
2098 Version = getVersionFromString(
2100 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
2101 Result.Environment = getEnvKindFromEnvType(PlatformTriple.getEnvironment());
2102 Result.InferSimulatorFromArch =
false;
2103 Result.InferredSource = SDKRoot;
2106 static DarwinPlatform createFromSDK(StringRef SDKRoot,
2107 DarwinPlatformKind Platform,
2109 bool IsSimulator =
false) {
2110 DarwinPlatform
Result(InferredFromSDK, Platform,
2111 getVersionFromString(
Value));
2113 Result.Environment = DarwinEnvironmentKind::Simulator;
2114 Result.InferSimulatorFromArch =
false;
2115 Result.InferredSource = SDKRoot;
2118 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
2119 VersionTuple Version) {
2121 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
2129 DarwinSDKInfo inferSDKInfo() {
2130 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
2131 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
2132 llvm::Triple::EnvironmentType EnvironmentType =
2133 getEnvTypeFromEnvKind(Environment);
2134 return DarwinSDKInfo(OS, EnvironmentType, getOSVersion(),
2135 getDisplayName(Platform, Environment, getOSVersion()),
2137 VersionTuple(getOSVersion().getMajor(), 0, 99));
2141 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2143 Arguments({Argument, VersionTuple().getAsString()}) {}
2144 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2145 VersionTuple
Value, Arg *Argument =
nullptr)
2149 UnderlyingOSVersion =
Value;
2152 static VersionTuple getVersionFromString(
const StringRef Input) {
2153 llvm::VersionTuple Version;
2154 bool IsValid = !Version.tryParse(Input);
2155 assert(IsValid &&
"unable to convert input version to version tuple");
2160 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2162 case llvm::Triple::Darwin:
2163 case llvm::Triple::MacOSX:
2164 return DarwinPlatformKind::MacOS;
2165 case llvm::Triple::IOS:
2166 return DarwinPlatformKind::IPhoneOS;
2167 case llvm::Triple::TvOS:
2168 return DarwinPlatformKind::TvOS;
2169 case llvm::Triple::WatchOS:
2170 return DarwinPlatformKind::WatchOS;
2171 case llvm::Triple::XROS:
2172 return DarwinPlatformKind::XROS;
2173 case llvm::Triple::DriverKit:
2174 return DarwinPlatformKind::DriverKit;
2175 case llvm::Triple::Firmware:
2176 return DarwinPlatformKind::Firmware;
2178 llvm_unreachable(
"Unable to infer Darwin variant");
2182 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2184 case DarwinPlatformKind::MacOS:
2185 return llvm::Triple::MacOSX;
2186 case DarwinPlatformKind::IPhoneOS:
2187 return llvm::Triple::IOS;
2188 case DarwinPlatformKind::TvOS:
2189 return llvm::Triple::TvOS;
2190 case DarwinPlatformKind::WatchOS:
2191 return llvm::Triple::WatchOS;
2192 case DarwinPlatformKind::DriverKit:
2193 return llvm::Triple::DriverKit;
2194 case DarwinPlatformKind::XROS:
2195 return llvm::Triple::XROS;
2196 case DarwinPlatformKind::Firmware:
2197 return llvm::Triple::Firmware;
2199 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2202 static DarwinEnvironmentKind
2203 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2204 switch (EnvironmentType) {
2205 case llvm::Triple::UnknownEnvironment:
2206 return DarwinEnvironmentKind::NativeEnvironment;
2207 case llvm::Triple::Simulator:
2208 return DarwinEnvironmentKind::Simulator;
2209 case llvm::Triple::MacABI:
2210 return DarwinEnvironmentKind::MacCatalyst;
2212 llvm_unreachable(
"Unable to infer Darwin environment");
2216 static llvm::Triple::EnvironmentType
2217 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2218 switch (EnvironmentKind) {
2219 case DarwinEnvironmentKind::NativeEnvironment:
2220 return llvm::Triple::UnknownEnvironment;
2221 case DarwinEnvironmentKind::Simulator:
2222 return llvm::Triple::Simulator;
2223 case DarwinEnvironmentKind::MacCatalyst:
2224 return llvm::Triple::MacABI;
2226 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2229 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2230 DarwinEnvironmentKind TargetEnvironment,
2231 VersionTuple Version) {
2232 SmallVector<std::string, 3> Components;
2233 switch (TargetPlatform) {
2234 case DarwinPlatformKind::MacOS:
2235 Components.push_back(
"macOS");
2237 case DarwinPlatformKind::IPhoneOS:
2238 Components.push_back(
"iOS");
2240 case DarwinPlatformKind::TvOS:
2241 Components.push_back(
"tvOS");
2243 case DarwinPlatformKind::WatchOS:
2244 Components.push_back(
"watchOS");
2246 case DarwinPlatformKind::DriverKit:
2247 Components.push_back(
"DriverKit");
2250 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2251 std::to_string(TargetPlatform) +
2252 "' is unsupported when inferring SDK Info.");
2254 switch (TargetEnvironment) {
2255 case DarwinEnvironmentKind::NativeEnvironment:
2257 case DarwinEnvironmentKind::Simulator:
2258 Components.push_back(
"Simulator");
2261 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2262 std::to_string(TargetEnvironment) +
2263 "' is unsupported when inferring SDK Info.");
2265 Components.push_back(Version.getAsString());
2266 return join(Components,
" ");
2270 DarwinPlatformKind Platform;
2271 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2275 VersionTuple ZipperedOSVersion;
2280 std::optional<VersionTuple> UnderlyingOSVersion;
2281 bool InferSimulatorFromArch =
true;
2282 std::pair<Arg *, std::string>
Arguments;
2283 StringRef EnvVarName;
2286 StringRef InferredSource;
2289 std::optional<llvm::Triple> TargetVariantTriple;
2294std::optional<DarwinPlatform>
2295getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2296 const Driver &TheDriver) {
2297 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2298 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2299 options::OPT_mios_simulator_version_min_EQ);
2301 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2302 options::OPT_mtvos_simulator_version_min_EQ);
2303 Arg *WatchOSVersion =
2304 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2305 options::OPT_mwatchos_simulator_version_min_EQ);
2307 auto GetDarwinPlatform =
2308 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2309 bool IsSimulator) -> std::optional<DarwinPlatform> {
2310 if (StringRef(VersionArg->getValue()).empty()) {
2311 TheDriver.
Diag(diag::err_drv_missing_version_number)
2312 << VersionArg->getAsString(Args);
2313 return std::nullopt;
2315 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2320 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2321 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2322 << macOSVersion->getAsString(Args)
2323 << (iOSVersion ? iOSVersion
2324 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2330 }
else if (iOSVersion) {
2331 if (TvOSVersion || WatchOSVersion) {
2332 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2333 << iOSVersion->getAsString(Args)
2334 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2337 iOSVersion->getOption().getID() ==
2338 options::OPT_mios_simulator_version_min_EQ);
2339 }
else if (TvOSVersion) {
2340 if (WatchOSVersion) {
2341 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2342 << TvOSVersion->getAsString(Args)
2343 << WatchOSVersion->getAsString(Args);
2346 TvOSVersion->getOption().getID() ==
2347 options::OPT_mtvos_simulator_version_min_EQ);
2348 }
else if (WatchOSVersion)
2349 return GetDarwinPlatform(
2351 WatchOSVersion->getOption().getID() ==
2352 options::OPT_mwatchos_simulator_version_min_EQ);
2353 return std::nullopt;
2358std::optional<DarwinPlatform>
2359getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2360 const llvm::Triple &Triple) {
2361 const char *EnvVars[] = {
2362 "MACOSX_DEPLOYMENT_TARGET",
2363 "IPHONEOS_DEPLOYMENT_TARGET",
2364 "TVOS_DEPLOYMENT_TARGET",
2365 "WATCHOS_DEPLOYMENT_TARGET",
2366 "DRIVERKIT_DEPLOYMENT_TARGET",
2367 "XROS_DEPLOYMENT_TARGET"
2369 std::string Targets[std::size(EnvVars)];
2370 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2371 if (
char *Env = ::getenv(I.value()))
2372 Targets[I.index()] = Env;
2381 if (Triple.getArch() == llvm::Triple::arm ||
2382 Triple.getArch() == llvm::Triple::aarch64 ||
2383 Triple.getArch() == llvm::Triple::thumb)
2390 unsigned FirstTarget = std::size(Targets);
2391 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2392 if (Targets[I].empty())
2394 if (FirstTarget == std::size(Targets))
2397 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2398 << Targets[FirstTarget] << Targets[I];
2402 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2403 if (!
Target.value().empty())
2404 return DarwinPlatform::createDeploymentTargetEnv(
2408 return std::nullopt;
2414std::optional<DarwinPlatform>
2415inferDeploymentTargetFromSDK(DerivedArgList &Args,
2416 const std::optional<DarwinSDKInfo> &SDKInfo) {
2417 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2419 return std::nullopt;
2420 StringRef isysroot = A->getValue();
2422 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2426 return std::nullopt;
2428 std::string Version;
2431 size_t StartVer = SDK.find_first_of(
"0123456789");
2432 size_t EndVer = SDK.find_last_of(
"0123456789");
2433 if (StartVer != StringRef::npos && EndVer > StartVer)
2434 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2435 if (Version.empty())
2436 return std::nullopt;
2438 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2439 return DarwinPlatform::createFromSDK(
2441 SDK.starts_with(
"iPhoneSimulator"));
2442 else if (SDK.starts_with(
"MacOSX"))
2443 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2445 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2446 return DarwinPlatform::createFromSDK(
2448 SDK.starts_with(
"WatchSimulator"));
2449 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2450 return DarwinPlatform::createFromSDK(
2452 SDK.starts_with(
"AppleTVSimulator"));
2453 else if (SDK.starts_with(
"DriverKit"))
2455 return std::nullopt;
2459VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2460 const llvm::Triple &Triple,
2461 const Driver &TheDriver) {
2462 VersionTuple OsVersion;
2463 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2465 case llvm::Triple::Darwin:
2466 case llvm::Triple::MacOSX:
2469 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2470 !Triple.getOSMajorVersion())
2471 SystemTriple.getMacOSXVersion(OsVersion);
2472 else if (!Triple.getMacOSXVersion(OsVersion))
2473 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2474 << Triple.getOSName();
2476 case llvm::Triple::IOS:
2477 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2478 OsVersion = VersionTuple(13, 1);
2480 OsVersion = Triple.getiOSVersion();
2482 case llvm::Triple::TvOS:
2483 OsVersion = Triple.getOSVersion();
2485 case llvm::Triple::WatchOS:
2486 OsVersion = Triple.getWatchOSVersion();
2488 case llvm::Triple::DriverKit:
2489 OsVersion = Triple.getDriverKitVersion();
2492 OsVersion = Triple.getOSVersion();
2493 if (!OsVersion.getMajor())
2494 OsVersion = OsVersion.withMajorReplaced(1);
2501std::optional<DarwinPlatform>
2502inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2503 const llvm::Triple &Triple,
2504 const Driver &TheDriver) {
2505 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2508 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2509 OSTy = llvm::Triple::MacOSX;
2510 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2511 MachOArchName ==
"armv6")
2512 OSTy = llvm::Triple::IOS;
2513 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2514 OSTy = llvm::Triple::WatchOS;
2515 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2516 MachOArchName !=
"armv7em" && MachOArchName !=
"armv8m.base" &&
2517 MachOArchName !=
"armv8m.main" && MachOArchName !=
"armv8.1m.main")
2518 OSTy = llvm::Triple::MacOSX;
2519 if (OSTy == llvm::Triple::UnknownOS)
2520 return std::nullopt;
2521 return DarwinPlatform::createFromArch(
2522 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2526std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2527 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2528 const std::optional<DarwinSDKInfo> &SDKInfo) {
2529 if (!Args.hasArg(options::OPT_target))
2530 return std::nullopt;
2531 if (Triple.getOS() == llvm::Triple::Darwin ||
2532 Triple.getOS() == llvm::Triple::UnknownOS)
2533 return std::nullopt;
2534 std::optional<llvm::Triple> TargetVariantTriple;
2535 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2536 llvm::Triple TVT(A->getValue());
2538 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2539 TVT.getArchName() == Triple.getArchName()) &&
2540 TVT.getArch() == Triple.getArch() &&
2541 TVT.getSubArch() == Triple.getSubArch() &&
2542 TVT.getVendor() == Triple.getVendor()) {
2543 if (TargetVariantTriple)
2548 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2549 TVT.isMacCatalystEnvironment()) ||
2550 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2551 Triple.isMacCatalystEnvironment())) {
2552 TargetVariantTriple = TVT;
2555 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2556 << A->getSpelling() << A->getValue();
2559 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2560 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2563 return PlatformAndVersion;
2567std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2568 DerivedArgList &Args,
const Driver &TheDriver,
2569 const std::optional<DarwinSDKInfo> &SDKInfo) {
2570 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2572 return std::nullopt;
2573 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2574 switch (TT.getOS()) {
2575 case llvm::Triple::MacOSX:
2576 case llvm::Triple::IOS:
2577 case llvm::Triple::TvOS:
2578 case llvm::Triple::WatchOS:
2579 case llvm::Triple::XROS:
2582 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2583 << TT.getOSName() << A->getAsString(Args);
2584 return std::nullopt;
2587 VersionTuple Version = TT.getOSVersion();
2588 if (!Version.getMajor()) {
2589 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2590 << A->getAsString(Args);
2591 return std::nullopt;
2593 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2594 TT.getEnvironment(), A, SDKInfo);
2597std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2598 const ArgList &Args,
2599 const Driver &TheDriver) {
2600 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2602 return std::nullopt;
2603 StringRef isysroot = A->getValue();
2605 if (!SDKInfoOrErr) {
2606 llvm::consumeError(SDKInfoOrErr.takeError());
2607 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2608 return std::nullopt;
2610 return *SDKInfoOrErr;
2615void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2621 bool TryXcselect =
false;
2627 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2629 if (!
getVFS().exists(A->getValue()))
2630 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2631 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2634 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2635 StringRef(env) !=
"/") {
2636 Args.append(Args.MakeSeparateArg(
2637 nullptr, Opts.getOption(options::OPT_isysroot), env));
2640 TryXcselect = !Args.hasArg(options::OPT__sysroot_EQ) &&
2641 !Args.hasArg(options::OPT_no_xcselect);
2651 std::optional<DarwinPlatform> PlatformAndVersion =
2653 if (PlatformAndVersion) {
2655 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2656 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2657 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2659 << TargetArgStr << MTargetOSArgStr;
2662 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2663 if (!TripleProvidedOSVersion)
2664 PlatformAndVersion->setOSVersion(
2667 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2668 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2669 if (PlatformAndVersionFromOSVersionArg) {
2670 unsigned TargetMajor, TargetMinor, TargetMicro;
2672 unsigned ArgMajor, ArgMinor, ArgMicro;
2674 if (PlatformAndVersion->getPlatform() !=
2675 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2677 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2678 TargetMinor, TargetMicro, TargetExtra) &&
2680 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2681 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2682 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2683 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2684 TargetExtra != ArgExtra))) {
2687 if (PlatformAndVersion->getPlatform() ==
2688 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2689 !TripleProvidedOSVersion) {
2690 PlatformAndVersion->setOSVersion(
2691 PlatformAndVersionFromOSVersionArg->getOSVersion());
2695 std::string OSVersionArg =
2696 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2697 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2699 << OSVersionArg << TargetArg;
2703 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2707 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2708 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2709 if (PlatformAndVersionFromOSVersionArg) {
2710 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2711 std::string OSVersionArgStr =
2712 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2714 << MTargetOSArgStr << OSVersionArgStr;
2718 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2721 if (!PlatformAndVersion) {
2722 PlatformAndVersion =
2724 if (PlatformAndVersion) {
2726 std::optional<DarwinPlatform> SDKTarget =
2727 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2729 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2735 if (!PlatformAndVersion) {
2736 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2739 if (PlatformAndVersion && !
SDKInfo)
2740 SDKInfo = PlatformAndVersion->inferSDKInfo();
2744 if (!PlatformAndVersion)
2745 PlatformAndVersion =
2749 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2750 if (!PlatformAndVersion->isValidOSVersion()) {
2751 if (PlatformAndVersion->isExplicitlySpecified())
2753 << PlatformAndVersion->getAsString(Args, Opts);
2755 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2756 << PlatformAndVersion->getOSVersion().getAsString()
2757 << PlatformAndVersion->getInferredSource();
2762 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2763 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2764 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2765 << PlatformAndVersion->getOSVersion().getAsString()
2766 << CanonicalVersion.getAsString();
2767 PlatformAndVersion->setOSVersion(CanonicalVersion);
2770 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2773 unsigned Major, Minor, Micro;
2776 const unsigned MajorVersionLimit = 1000;
2777 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2778 const std::string OSVersionStr = OSVersion.getAsString();
2780 if (Platform ==
MacOS) {
2781#ifdef CLANG_USE_XCSELECT
2784 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2785 Args.append(Args.MakeSeparateArg(
2786 nullptr, Opts.getOption(options::OPT_isysroot), p));
2795 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2798 << PlatformAndVersion->getAsString(Args, Opts);
2802 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2804 << PlatformAndVersion->getAsString(Args, Opts);
2806 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2807 (Major < 13 || (Major == 13 && Minor < 1))) {
2809 << PlatformAndVersion->getAsString(Args, Opts);
2816 if (
getTriple().isArch32Bit() && Major >= 11) {
2818 if (PlatformAndVersion->isExplicitlySpecified()) {
2819 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2820 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2823 << PlatformAndVersion->getAsString(Args, Opts);
2831 }
else if (Platform ==
TvOS) {
2834 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2836 << PlatformAndVersion->getAsString(Args, Opts);
2837 }
else if (Platform ==
WatchOS) {
2840 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2842 << PlatformAndVersion->getAsString(Args, Opts);
2846 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2849 << PlatformAndVersion->getAsString(Args, Opts);
2853 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2856 << PlatformAndVersion->getAsString(Args, Opts);
2863 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2866 VersionTuple ZipperedOSVersion;
2868 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2869 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2881 return !
SDKInfo->getPlatformPrefix(
T).empty();
2890 const llvm::Triple &
T)
const {
2892 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(
T);
2893 if (!PlatformPrefix.empty())
2894 llvm::sys::path::append(Path, PlatformPrefix);
2895 }
else if (
T.isDriverKit()) {
2898 llvm::sys::path::append(Path,
"System",
"DriverKit");
2907 if (DriverArgs.hasArg(options::OPT_isysroot))
2908 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2919 const llvm::opt::ArgList &DriverArgs,
2920 llvm::opt::ArgStringList &CC1Args)
const {
2925 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2926 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2927 bool NoBuiltinInc = DriverArgs.hasFlag(
2928 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2929 bool ForceBuiltinInc = DriverArgs.hasFlag(
2930 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2933 if (!NoStdInc && !NoStdlibInc) {
2935 llvm::sys::path::append(P,
"usr",
"local",
"include");
2940 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2942 llvm::sys::path::append(P,
"include");
2946 if (NoStdInc || NoStdlibInc)
2950 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2951 if (!CIncludeDirs.empty()) {
2953 CIncludeDirs.split(dirs,
":");
2954 for (llvm::StringRef dir : dirs) {
2955 llvm::StringRef Prefix =
2956 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2962 llvm::sys::path::append(P,
"usr",
"include");
2968 const llvm::opt::ArgList &DriverArgs,
2969 llvm::opt::ArgStringList &CC1Args)
const {
2972 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2981 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2982 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2983 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2987bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2988 llvm::opt::ArgStringList &CC1Args,
2990 llvm::StringRef Version,
2991 llvm::StringRef ArchDir,
2992 llvm::StringRef BitDir)
const {
2993 llvm::sys::path::append(
Base, Version);
3001 if (!ArchDir.empty())
3002 llvm::sys::path::append(P, ArchDir);
3003 if (!BitDir.empty())
3004 llvm::sys::path::append(P, BitDir);
3011 llvm::sys::path::append(P,
"backward");
3019 const llvm::opt::ArgList &DriverArgs,
3020 llvm::opt::ArgStringList &CC1Args)
const {
3028 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
3029 options::OPT_nostdincxx))
3050 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
3051 if (
getVFS().exists(InstallBin)) {
3054 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3055 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
3061 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
3062 if (
getVFS().exists(SysrootUsr)) {
3065 }
else if (DriverArgs.hasArg(options::OPT_v)) {
3066 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
3075 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
3080void AppleMachO::AddGnuCPlusPlusIncludePaths(
3081 const llvm::opt::ArgList &DriverArgs,
3082 llvm::opt::ArgStringList &CC1Args)
const {}
3084void DarwinClang::AddGnuCPlusPlusIncludePaths(
3085 const llvm::opt::ArgList &DriverArgs,
3086 llvm::opt::ArgStringList &CC1Args)
const {
3088 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
3090 llvm::Triple::ArchType arch =
getTriple().getArch();
3091 bool IsBaseFound =
true;
3096 case llvm::Triple::x86:
3097 case llvm::Triple::x86_64:
3098 IsBaseFound = AddGnuCPlusPlusIncludePaths(
3099 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
3100 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
3101 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
3102 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
3105 case llvm::Triple::arm:
3106 case llvm::Triple::thumb:
3108 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3109 "arm-apple-darwin10",
"v7");
3111 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3112 "arm-apple-darwin10",
"v6");
3115 case llvm::Triple::aarch64:
3117 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
3118 "arm64-apple-darwin10",
"");
3128 ArgStringList &CmdArgs)
const {
3133 CmdArgs.push_back(
"-lc++");
3134 if (Args.hasArg(options::OPT_fexperimental_library))
3135 CmdArgs.push_back(
"-lc++experimental");
3145 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3147 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3149 if (!
getVFS().exists(P)) {
3150 llvm::sys::path::remove_filename(P);
3151 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3152 if (
getVFS().exists(P)) {
3153 CmdArgs.push_back(Args.MakeArgString(P));
3162 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3163 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3164 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3169 CmdArgs.push_back(
"-lstdc++");
3175 ArgStringList &CmdArgs)
const {
3181 llvm::sys::path::append(P,
"lib",
"darwin");
3185 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3187 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3189 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3193 llvm::sys::path::append(
3194 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3195 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3197 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3203 CmdArgs.push_back(Args.MakeArgString(P));
3208 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3218 for (Arg *A : Args) {
3227 case options::OPT_mkernel:
3228 case options::OPT_fapple_kext:
3230 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3233 case options::OPT_dependency_file:
3234 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3237 case options::OPT_gfull:
3238 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3240 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3243 case options::OPT_gused:
3244 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3246 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3249 case options::OPT_shared:
3250 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3253 case options::OPT_fconstant_cfstrings:
3254 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3257 case options::OPT_fno_constant_cfstrings:
3258 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3261 case options::OPT_Wnonportable_cfstrings:
3263 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3266 case options::OPT_Wno_nonportable_cfstrings:
3268 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3277 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3278 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3284 else if (Name ==
"ppc601")
3285 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3286 else if (Name ==
"ppc603")
3287 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3288 else if (Name ==
"ppc604")
3289 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3290 else if (Name ==
"ppc604e")
3291 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3292 else if (Name ==
"ppc750")
3293 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3294 else if (Name ==
"ppc7400")
3295 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3296 else if (Name ==
"ppc7450")
3297 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3298 else if (Name ==
"ppc970")
3299 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3301 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3302 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3304 else if (Name ==
"i386")
3306 else if (Name ==
"i486")
3307 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3308 else if (Name ==
"i586")
3309 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3310 else if (Name ==
"i686")
3311 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3312 else if (Name ==
"pentium")
3313 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3314 else if (Name ==
"pentium2")
3315 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3316 else if (Name ==
"pentpro")
3317 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3318 else if (Name ==
"pentIIm3")
3319 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3321 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3322 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3324 else if (Name ==
"arm")
3325 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3326 else if (Name ==
"armv4t")
3327 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3328 else if (Name ==
"armv5")
3329 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3330 else if (Name ==
"xscale")
3331 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3332 else if (Name ==
"armv6")
3333 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3334 else if (Name ==
"armv6m")
3335 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3336 else if (Name ==
"armv7")
3337 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3338 else if (Name ==
"armv7em")
3339 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3340 else if (Name ==
"armv7k")
3341 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3342 else if (Name ==
"armv7m")
3343 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3344 else if (Name ==
"armv7s")
3345 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3346 else if (Name ==
"armv8-m.base" || Name ==
"armv8m.base")
3347 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.base");
3348 else if (Name ==
"armv8-m.main" || Name ==
"armv8m.main")
3349 DAL->AddJoinedArg(
nullptr, MArch,
"armv8m.main");
3350 else if (Name ==
"armv8.1-m.main" || Name ==
"armv8.1m.main")
3351 DAL->AddJoinedArg(
nullptr, MArch,
"armv8.1m.main");
3358 ArgStringList &CmdArgs,
3359 bool ForceLinkBuiltinRT)
const {
3368 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3374 llvm::Triple::OSType OS;
3380 OS = llvm::Triple::MacOSX;
3383 OS = llvm::Triple::IOS;
3386 OS = llvm::Triple::TvOS;
3389 OS = llvm::Triple::WatchOS;
3405 switch (SDKInfo->getEnvironment()) {
3406 case llvm::Triple::UnknownEnvironment:
3407 case llvm::Triple::Simulator:
3408 case llvm::Triple::MacABI:
3417 VersionTuple SDKVersion = SDKInfo->getVersion();
3418 switch (SDKInfo->getOS()) {
3421 case llvm::Triple::MacOSX:
3422 return SDKVersion >= VersionTuple(15U);
3423 case llvm::Triple::IOS:
3424 return SDKVersion >= VersionTuple(18U);
3425 case llvm::Triple::TvOS:
3426 return SDKVersion >= VersionTuple(18U);
3427 case llvm::Triple::WatchOS:
3428 return SDKVersion >= VersionTuple(11U);
3429 case llvm::Triple::XROS:
3430 return SDKVersion >= VersionTuple(2U);
3438static inline llvm::VersionTuple
3443 case llvm::Triple::Darwin:
3444 case llvm::Triple::MacOSX:
3445 return llvm::VersionTuple(10U, 12U);
3446 case llvm::Triple::IOS:
3447 case llvm::Triple::TvOS:
3448 return llvm::VersionTuple(10U);
3449 case llvm::Triple::WatchOS:
3450 return llvm::VersionTuple(3U);
3453 llvm_unreachable(
"Unexpected OS");
3457 llvm::Triple::OSType OS;
3463 OS = llvm::Triple::MacOSX;
3466 OS = llvm::Triple::IOS;
3469 OS = llvm::Triple::TvOS;
3472 OS = llvm::Triple::WatchOS;
3483 llvm::opt::ArgStringList &CC1Args,
3493 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3494 options::OPT_fno_ptrauth_calls))
3495 CC1Args.push_back(
"-fptrauth-calls");
3496 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3497 options::OPT_fno_ptrauth_returns))
3498 CC1Args.push_back(
"-fptrauth-returns");
3499 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3500 options::OPT_fno_ptrauth_intrinsics))
3501 CC1Args.push_back(
"-fptrauth-intrinsics");
3502 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3503 options::OPT_fno_ptrauth_indirect_gotos))
3504 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3505 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3506 options::OPT_fno_ptrauth_auth_traps))
3507 CC1Args.push_back(
"-fptrauth-auth-traps");
3510 if (!DriverArgs.hasArg(
3511 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3512 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3513 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3514 if (!DriverArgs.hasArg(
3515 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3516 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3517 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3520 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3521 options::OPT_fno_ptrauth_objc_isa))
3522 CC1Args.push_back(
"-fptrauth-objc-isa");
3523 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3524 options::OPT_fno_ptrauth_objc_class_ro))
3525 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3526 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3527 options::OPT_fno_ptrauth_objc_interface_sel))
3528 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3533 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3546 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3547 options::OPT_fno_aligned_allocation) &&
3549 CC1Args.push_back(
"-faligned-alloc-unavailable");
3553 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3554 options::OPT_fno_objc_msgsend_selector_stubs) &&
3557 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3561 if (!DriverArgs.hasArgNoClaim(
3562 options::OPT_fobjc_msgsend_class_selector_stubs,
3563 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3566 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3570 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3571 options::OPT_fno_sized_deallocation) &&
3573 CC1Args.push_back(
"-fno-sized-deallocation");
3580 if (!
SDKInfo->getFilePath().empty()) {
3582 ExtraDepOpt +=
SDKInfo->getFilePath();
3583 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3589 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3593 if (!DriverArgs.getLastArgNoClaim(
3594 options::OPT_fvisibility_inlines_hidden_static_local_var,
3595 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3596 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3610 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3612 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3613 options::OPT_fno_define_target_os_macros))
3614 CC1Args.push_back(
"-fdefine-target-os-macros");
3618 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3619 options::OPT_fno_modulemap_allow_subdirectory_search,
3621 bool RequiresSubdirectorySearch;
3622 VersionTuple SDKVersion =
SDKInfo->getVersion();
3625 RequiresSubdirectorySearch =
true;
3628 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3632 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3635 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3638 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3641 if (!RequiresSubdirectorySearch)
3642 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3647 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3649 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3656 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3658 llvm::raw_string_ostream OS(Arg);
3659 OS <<
"-target-sdk-version=" <<
V;
3660 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3664 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3666 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3669 EmitTargetSDKVersionArg(
3673 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3681 llvm::raw_string_ostream OS(Arg);
3682 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3683 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3684 }
else if (
const auto *MacOStoMacCatalystMapping =
3687 if (std::optional<VersionTuple> SDKVersion =
3688 MacOStoMacCatalystMapping->map(
3692 llvm::raw_string_ostream OS(Arg);
3693 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3694 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3714 AddDeploymentTarget(*DAL);
3722 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3725 if (A->getOption().getID() != options::OPT_mkernel &&
3726 A->getOption().getID() != options::OPT_fapple_kext)
3728 assert(it != ie &&
"unexpected argument translation");
3730 assert(A->getOption().getID() == options::OPT_static &&
3731 "missing expected -static argument");
3738 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3739 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3740 options::OPT_fno_omit_frame_pointer,
false))
3741 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3742 <<
"-fomit-frame-pointer" << BA.
ArchName;
3751 if (
getArch() == llvm::Triple::x86_64 ||
3753 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3755 return (
getArch() == llvm::Triple::aarch64 ||
3756 getArch() == llvm::Triple::aarch64_32)
3764 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3765 return S[0] !=
'\0';
3770 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3779 return llvm::ExceptionHandling::None;
3783 if (Triple.isWatchABI())
3784 return llvm::ExceptionHandling::DwarfCFI;
3786 return llvm::ExceptionHandling::SjLj;
3801 return (
getArch() == llvm::Triple::x86_64 ||
3802 getArch() == llvm::Triple::aarch64);
3811 ArgStringList &CmdArgs)
const {
3814 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3817 CmdArgs.push_back(
"-watchos_version_min");
3819 CmdArgs.push_back(
"-watchos_simulator_version_min");
3821 CmdArgs.push_back(
"-tvos_version_min");
3823 CmdArgs.push_back(
"-tvos_simulator_version_min");
3825 CmdArgs.push_back(
"-driverkit_version_min");
3827 CmdArgs.push_back(
"-ios_simulator_version_min");
3829 CmdArgs.push_back(
"-iphoneos_version_min");
3831 CmdArgs.push_back(
"-maccatalyst_version_min");
3834 CmdArgs.push_back(
"-macosx_version_min");
3840 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3843 VersionTuple VariantTargetVersion;
3845 CmdArgs.push_back(
"-macosx_version_min");
3850 "unexpected target variant triple");
3851 CmdArgs.push_back(
"-maccatalyst_version_min");
3854 VersionTuple MinTgtVers =
3856 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3857 VariantTargetVersion = MinTgtVers;
3858 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3869 return "mac catalyst";
3882 llvm_unreachable(
"invalid platform");
3886 llvm::opt::ArgStringList &CmdArgs)
const {
3891 auto EmitPlatformVersionArg =
3894 const llvm::Triple &TT) {
3897 CmdArgs.push_back(
"-platform_version");
3898 std::string PlatformName =
3901 PlatformName +=
"-simulator";
3902 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3911 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3914 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3919 std::optional<VersionTuple> iOSSDKVersion;
3921 if (
const auto *MacOStoMacCatalystMapping =
3924 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3925 SDKInfo->getVersion().withoutBuild(),
3929 CmdArgs.push_back(Args.MakeArgString(
3930 (iOSSDKVersion ? *iOSSDKVersion
3937 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3938 if (!SDKVersion.getMinor())
3939 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3940 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3951 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3960 VersionTuple TargetVariantVersion;
3968 "unexpected target variant triple");
3973 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3979 ArgStringList &CmdArgs) {
3983 CmdArgs.push_back(
"-ldylib1.o");
3990 CmdArgs.push_back(
"-ldylib1.o");
3992 CmdArgs.push_back(
"-ldylib1.10.5.o");
3997 ArgStringList &CmdArgs) {
3998 if (Args.hasArg(options::OPT_static))
4003 CmdArgs.push_back(
"-lbundle1.o");
4008 ArgStringList &CmdArgs) {
4010 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
4011 Args.hasArg(options::OPT_preload)) {
4012 CmdArgs.push_back(
"-lgcrt0.o");
4014 CmdArgs.push_back(
"-lgcrt1.o");
4024 CmdArgs.push_back(
"-no_new_main");
4026 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
4032 ArgStringList &CmdArgs) {
4035 if (D.
getArch() == llvm::Triple::aarch64)
4038 CmdArgs.push_back(
"-lcrt1.o");
4040 CmdArgs.push_back(
"-lcrt1.3.1.o");
4047 CmdArgs.push_back(
"-lcrt1.o");
4049 CmdArgs.push_back(
"-lcrt1.10.5.o");
4051 CmdArgs.push_back(
"-lcrt1.10.6.o");
4056 ArgStringList &CmdArgs)
const {
4062 if (Args.hasArg(options::OPT_dynamiclib))
4064 else if (Args.hasArg(options::OPT_bundle))
4068 else if (Args.hasArg(options::OPT_static) ||
4069 Args.hasArg(options::OPT_object) ||
4070 Args.hasArg(options::OPT_preload))
4071 CmdArgs.push_back(
"-lcrt0.o");
4075 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
4077 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
4078 CmdArgs.push_back(Str);
4095 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
4096 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
4098 Res |= SanitizerKind::Address;
4099 Res |= SanitizerKind::PointerCompare;
4100 Res |= SanitizerKind::PointerSubtract;
4101 Res |= SanitizerKind::Realtime;
4102 Res |= SanitizerKind::Leak;
4103 Res |= SanitizerKind::Fuzzer;
4104 Res |= SanitizerKind::FuzzerNoLink;
4105 Res |= SanitizerKind::ObjCCast;
4115 Res |= SanitizerKind::Vptr;
4117 if ((IsX86_64 || IsAArch64) &&
4120 Res |= SanitizerKind::Thread;
4124 Res |= SanitizerKind::Type;
4128 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 void AddMachOSysLibRoot(Compilation &C, const ArgList &Args, ArgStringList &CmdArgs)
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 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.
Result
Implement __builtin_bit_cast and related operations.
static StringRef getTriple(const Command &Job)
Defines types useful for describing an Objective-C runtime.
const llvm::VersionTuple & getDefaultDeploymentTarget() const
const llvm::Triple & getCanonicalPlatformTriple() const
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 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)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
SetTy< T > join(SetTy< T > A, SetTy< T > B, typename SetTy< T >::Factory &F)
Computes the union of two ImmutableSets.
Top level wrappers for InstallAPI frontend operations.
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
@ Default
Set to the current date and time.
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
Represents a bound architecture for offload / multiple architecture compilation.
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()