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({
"arm64",
"arm64e"}, llvm::Triple::aarch64)
67 .Case(
"arm64_32", llvm::Triple::aarch64_32)
68 .Case(
"r600", llvm::Triple::r600)
69 .Case(
"amdgcn", llvm::Triple::amdgcn)
70 .Case(
"nvptx", llvm::Triple::nvptx)
71 .Case(
"nvptx64", llvm::Triple::nvptx64)
72 .Case(
"amdil", llvm::Triple::amdil)
73 .Case(
"spir", llvm::Triple::spir)
74 .Default(llvm::Triple::UnknownArch);
78 const ArgList &Args) {
79 const llvm::Triple::ArchType
Arch = getArchTypeForMachOArchName(Str);
80 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
82 if (
Arch != llvm::Triple::UnknownArch)
88 if ((T.getOS() != llvm::Triple::Firmware) &&
89 (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
90 ArchKind == llvm::ARM::ArchKind::ARMV7M ||
91 ArchKind == llvm::ARM::ArchKind::ARMV7EM)) {
93 if (T.getOS() == llvm::Triple::IOS)
94 for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
95 A->ignoreTargetSpecific();
96 if (T.getOS() == llvm::Triple::WatchOS)
97 for (Arg *A : Args.filtered(options::OPT_mwatchos_version_min_EQ))
98 A->ignoreTargetSpecific();
99 if (T.getOS() == llvm::Triple::TvOS)
100 for (Arg *A : Args.filtered(options::OPT_mtvos_version_min_EQ))
101 A->ignoreTargetSpecific();
103 T.setOS(llvm::Triple::UnknownOS);
104 T.setObjectFormat(llvm::Triple::MachO);
112 const char *LinkingOutput)
const {
115 ArgStringList CmdArgs;
117 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
121 const Action *SourceAction = &JA;
123 assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
124 SourceAction = SourceAction->
getInputs()[0];
132 if (Args.hasArg(options::OPT_fno_integrated_as)) {
133 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
134 CmdArgs.push_back(
"-Q");
138 if (SourceAction->
getType() == types::TY_Asm ||
139 SourceAction->
getType() == types::TY_PP_Asm) {
140 if (Args.hasArg(options::OPT_gstabs))
141 CmdArgs.push_back(
"--gstabs");
142 else if (Args.hasArg(options::OPT_g_Group))
143 CmdArgs.push_back(
"-g");
150 if (T.isX86() || Args.hasArg(options::OPT_force__cpusubtype__ALL))
151 CmdArgs.push_back(
"-force_cpusubtype_ALL");
154 (((Args.hasArg(options::OPT_mkernel) ||
155 Args.hasArg(options::OPT_fapple_kext)) &&
157 Args.hasArg(options::OPT_static)))
158 CmdArgs.push_back(
"-static");
160 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
162 assert(Output.
isFilename() &&
"Unexpected lipo output.");
163 CmdArgs.push_back(
"-o");
166 assert(Input.
isFilename() &&
"Invalid input.");
171 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
173 Exec, CmdArgs, Inputs, Output));
176void darwin::MachOTool::anchor() {}
179 ArgStringList &CmdArgs)
const {
183 CmdArgs.push_back(
"-arch");
184 CmdArgs.push_back(Args.MakeArgString(ArchName));
187 if (ArchName ==
"arm")
188 CmdArgs.push_back(
"-force_cpusubtype_ALL");
191bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
195 for (
const auto &Input : Inputs)
196 if (Input.getType() != types::TY_Object)
210 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
211 if (A->getOption().matches(options::OPT_O0))
213 if (A->getOption().matches(options::OPT_O))
214 return llvm::StringSwitch<bool>(A->getValue())
220 if (!IsLinkerOnlyAction)
225void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
226 ArgStringList &CmdArgs,
228 VersionTuple Version,
bool LinkerIsLLD,
229 bool UsePlatformVersion)
const {
230 const Driver &D = getToolChain().getDriver();
231 const toolchains::MachO &MachOTC = getMachOToolChain();
235 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
236 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
237 CmdArgs.push_back(
"-demangle");
239 if (Args.hasArg(options::OPT_rdynamic) &&
240 (Version >= VersionTuple(137) || LinkerIsLLD))
241 CmdArgs.push_back(
"-export_dynamic");
245 if (Args.hasFlag(options::OPT_fapplication_extension,
246 options::OPT_fno_application_extension,
false))
247 CmdArgs.push_back(
"-application_extension");
249 if (D.
isUsingLTO() && (Version >= VersionTuple(116) || LinkerIsLLD) &&
250 NeedsTempPath(Inputs)) {
251 std::string TmpPathName;
262 if (!TmpPathName.empty()) {
263 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
264 C.addTempFile(TmpPath);
265 CmdArgs.push_back(
"-object_path_lto");
266 CmdArgs.push_back(TmpPath);
279 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
281 StringRef P = llvm::sys::path::parent_path(D.
Dir);
282 SmallString<128> LibLTOPath(P);
283 llvm::sys::path::append(LibLTOPath,
"lib");
284 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
285 CmdArgs.push_back(
"-lto_library");
286 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
292 if (Version >= VersionTuple(262) &&
294 CmdArgs.push_back(
"-no_deduplicate");
297 Args.AddAllArgs(CmdArgs, options::OPT_static);
298 if (!Args.hasArg(options::OPT_static))
299 CmdArgs.push_back(
"-dynamic");
300 if (Args.hasArg(options::OPT_fgnu_runtime)) {
305 if (!Args.hasArg(options::OPT_dynamiclib)) {
306 AddMachOArch(Args, CmdArgs);
308 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
310 Args.AddLastArg(CmdArgs, options::OPT_bundle);
311 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
312 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
315 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
316 (A = Args.getLastArg(options::OPT_current__version)) ||
317 (A = Args.getLastArg(options::OPT_install__name)))
318 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
321 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
322 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
323 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
325 CmdArgs.push_back(
"-dylib");
328 if ((A = Args.getLastArg(options::OPT_bundle)) ||
329 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
330 (A = Args.getLastArg(options::OPT_client__name)) ||
331 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
332 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
333 (A = Args.getLastArg(options::OPT_private__bundle)))
334 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
337 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
338 "-dylib_compatibility_version");
339 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
340 "-dylib_current_version");
342 AddMachOArch(Args, CmdArgs);
344 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
345 "-dylib_install_name");
348 Args.AddLastArg(CmdArgs, options::OPT_all__load);
349 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
350 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
352 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
353 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
354 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
355 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
356 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
357 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
358 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
359 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
360 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
361 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
362 Args.AddAllArgs(CmdArgs, options::OPT_init);
365 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
370 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
371 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
372 Args.AddLastArg(CmdArgs, options::OPT_single__module);
373 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
374 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
377 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
378 options::OPT_fno_pie, options::OPT_fno_PIE)) {
379 if (A->getOption().matches(options::OPT_fpie) ||
380 A->getOption().matches(options::OPT_fPIE))
381 CmdArgs.push_back(
"-pie");
383 CmdArgs.push_back(
"-no_pie");
387 if (
C.getDriver().embedBitcodeEnabled()) {
390 CmdArgs.push_back(
"-bitcode_bundle");
392 if (
C.getDriver().embedBitcodeMarkerOnly() &&
393 Version >= VersionTuple(278)) {
394 CmdArgs.push_back(
"-bitcode_process_mode");
395 CmdArgs.push_back(
"marker");
398 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
402 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
403 options::OPT_fno_global_isel)) {
404 if (A->getOption().matches(options::OPT_fglobal_isel)) {
405 CmdArgs.push_back(
"-mllvm");
406 CmdArgs.push_back(
"-global-isel");
408 CmdArgs.push_back(
"-mllvm");
409 CmdArgs.push_back(
"-global-isel-abort=0");
413 if (Args.hasArg(options::OPT_mkernel) ||
414 Args.hasArg(options::OPT_fapple_kext) ||
415 Args.hasArg(options::OPT_ffreestanding)) {
416 CmdArgs.push_back(
"-mllvm");
417 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
420 Args.AddLastArg(CmdArgs, options::OPT_prebind);
421 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
422 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
423 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
424 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
425 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
426 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
427 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
428 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
429 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
430 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
431 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
432 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
433 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
434 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
435 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
441 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
442 CmdArgs.push_back(
"-syslibroot");
443 CmdArgs.push_back(A->getValue());
444 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
445 CmdArgs.push_back(
"-syslibroot");
446 CmdArgs.push_back(A->getValue());
447 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
448 CmdArgs.push_back(
"-syslibroot");
449 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
452 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
453 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
454 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
455 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
456 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
457 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
458 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
459 Args.AddAllArgs(CmdArgs, options::OPT_y);
460 Args.AddLastArg(CmdArgs, options::OPT_w);
461 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
462 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
463 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
464 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
465 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
466 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
467 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
468 Args.AddLastArg(CmdArgs, options::OPT_why_load);
469 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
470 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
471 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
472 Args.AddLastArg(CmdArgs, options::OPT_Mach);
476 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
478 : CSPGOGenerateArg->getValue());
479 llvm::sys::path::append(Path,
"default_%m.profraw");
480 CmdArgs.push_back(
"--cs-profile-generate");
481 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
483 SmallString<128> Path(
484 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
485 if (Path.empty() || llvm::sys::fs::is_directory(Path))
486 llvm::sys::path::append(Path,
"default.profdata");
487 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
490 auto *CodeGenDataGenArg =
491 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
492 if (CodeGenDataGenArg)
494 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
495 CodeGenDataGenArg->getValue()));
502 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
505 return Args.hasArg(options::OPT_fobjc_link_runtime);
509 const llvm::Triple &Triple) {
514 Args.getAllArgValues(options::OPT_arch).size() > 1;
515 bool hasExplicitOutputFile =
516 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
518 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
519 <<
"-foptimization-record-file";
526 const llvm::Triple &Triple,
528 StringRef Format =
"yaml";
529 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
530 Format = A->getValue();
532 CmdArgs.push_back(
"-mllvm");
533 CmdArgs.push_back(
"-lto-pass-remarks-output");
534 CmdArgs.push_back(
"-mllvm");
536 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
538 CmdArgs.push_back(A->getValue());
540 assert(Output.
isFilename() &&
"Unexpected ld output.");
546 CmdArgs.push_back(Args.MakeArgString(F));
550 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
551 CmdArgs.push_back(
"-mllvm");
553 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
554 CmdArgs.push_back(Args.MakeArgString(Passes));
557 if (!Format.empty()) {
558 CmdArgs.push_back(
"-mllvm");
559 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
560 CmdArgs.push_back(Args.MakeArgString(FormatArg));
564 CmdArgs.push_back(
"-mllvm");
565 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
568 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
569 CmdArgs.push_back(
"-mllvm");
571 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
572 CmdArgs.push_back(Args.MakeArgString(Opt));
581 const char *LinkingOutput)
const {
582 assert((Output.
getType() == types::TY_Image ||
583 Output.
getType() == types::TY_Object) &&
584 "Invalid linker output type.");
590 llvm::opt::ArgStringList InputFileList;
595 ArgStringList CmdArgs;
601 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
605 bool UsePlatformVersion = Triple.isXROS() || Triple.isOSFirmware();
609 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
619 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
620 if (A->getOption().matches(options::OPT_moutline)) {
622 CmdArgs.push_back(
"-mllvm");
623 CmdArgs.push_back(
"-enable-machine-outliner");
629 CmdArgs.push_back(
"-mllvm");
630 CmdArgs.push_back(
"-enable-machine-outliner=never");
637 CmdArgs.push_back(
"-mllvm");
638 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
641 auto *CodeGenDataGenArg =
642 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
643 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
647 if (CodeGenDataGenArg && CodeGenDataUseArg)
648 D.
Diag(diag::err_drv_argument_not_allowed_with)
649 << CodeGenDataGenArg->getAsString(Args)
650 << CodeGenDataUseArg->getAsString(Args);
654 if (CodeGenDataGenArg) {
655 CmdArgs.push_back(
"-mllvm");
656 CmdArgs.push_back(
"-codegen-data-generate");
660 if (CodeGenDataUseArg) {
661 CmdArgs.push_back(
"-mllvm");
662 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
663 CodeGenDataUseArg->getValue()));
669 if (!StatsFile.empty()) {
670 CmdArgs.push_back(
"-mllvm");
671 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
675 if (Args.hasArg(options::OPT_fstack_usage)) {
677 llvm::sys::path::replace_extension(StackUsageFile,
"su");
678 CmdArgs.push_back(
"-mllvm");
680 Args.MakeArgString(
"-stack-usage-file=" + StackUsageFile));
685 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
686 options::OPT_Z_Flag, options::OPT_u_Group});
691 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
692 CmdArgs.push_back(
"-ObjC");
694 CmdArgs.push_back(
"-o");
697 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
700 Args.AddAllArgs(CmdArgs, options::OPT_L);
705 for (
const auto &II : Inputs) {
706 if (!II.isFilename()) {
711 if (InputFileList.size() > 0)
717 InputFileList.push_back(II.getFilename());
723 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
724 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
728 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
732 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
736 CmdArgs.push_back(
"-framework");
737 CmdArgs.push_back(
"Foundation");
739 CmdArgs.push_back(
"-lobjc");
743 CmdArgs.push_back(
"-arch_multiple");
744 CmdArgs.push_back(
"-final_output");
745 CmdArgs.push_back(LinkingOutput);
748 if (Args.hasArg(options::OPT_fnested_functions))
749 CmdArgs.push_back(
"-allow_stack_execute");
754 if (!Parallelism.empty()) {
755 CmdArgs.push_back(
"-mllvm");
756 unsigned NumThreads =
757 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
758 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
764 bool NoStdOrDefaultLibs =
765 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
766 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
767 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
772 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
780 Args.ClaimAllArgs(options::OPT_pthread);
781 Args.ClaimAllArgs(options::OPT_pthreads);
785 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
789 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
790 Args.AddAllArgs(CmdArgs, options::OPT_F);
793 for (
const Arg *A : Args.filtered(options::OPT_iframework))
794 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
796 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
797 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
798 if (A->getValue() == StringRef(
"Accelerate")) {
799 CmdArgs.push_back(
"-framework");
800 CmdArgs.push_back(
"Accelerate");
809 bool NonStandardSearchPath =
false;
811 if (Triple.isDriverKit()) {
813 NonStandardSearchPath =
814 Version.getMajor() < 605 ||
815 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
820 if (NonStandardSearchPath) {
821 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
822 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
825 llvm::sys::path::append(P, SearchPath);
827 CmdArgs.push_back(Args.MakeArgString(Flag + P));
830 AddSearchPath(
"-L",
"/usr/lib");
831 AddSearchPath(
"-F",
"/System/Library/Frameworks");
837 if (Version >= VersionTuple(705) || LinkerIsLLD) {
845 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
846 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
847 Cmd->setInputFileList(std::move(InputFileList));
848 C.addCommand(std::move(Cmd));
855 const char *LinkingOutput)
const {
859 Args.ClaimAllArgs(options::OPT_g_Group);
861 Args.ClaimAllArgs(options::OPT_emit_llvm);
864 Args.ClaimAllArgs(options::OPT_w);
866 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
869 ArgStringList CmdArgs;
871 CmdArgs.push_back(
"-static");
872 CmdArgs.push_back(
"-D");
873 CmdArgs.push_back(
"-no_warning_for_no_symbols");
874 CmdArgs.push_back(
"-o");
877 for (
const auto &II : Inputs) {
878 if (II.isFilename()) {
879 CmdArgs.push_back(II.getFilename());
886 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
887 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
888 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
893 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
894 C.addCommand(std::make_unique<Command>(JA, *
this,
896 Exec, CmdArgs, Inputs, Output));
903 const char *LinkingOutput)
const {
904 ArgStringList CmdArgs;
906 CmdArgs.push_back(
"-create");
907 assert(Output.
isFilename() &&
"Unexpected lipo output.");
909 CmdArgs.push_back(
"-output");
912 for (
const auto &II : Inputs) {
913 assert(II.isFilename() &&
"Unexpected lipo input.");
914 CmdArgs.push_back(II.getFilename());
917 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
919 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
921 Exec, CmdArgs, Inputs, Output));
928 const char *LinkingOutput)
const {
929 ArgStringList CmdArgs;
931 CmdArgs.push_back(
"-o");
934 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
936 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
940 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
942 Exec, CmdArgs, Inputs, Output));
949 const char *LinkingOutput)
const {
950 ArgStringList CmdArgs;
951 CmdArgs.push_back(
"--verify");
952 CmdArgs.push_back(
"--debug-info");
953 CmdArgs.push_back(
"--eh-frame");
954 CmdArgs.push_back(
"--quiet");
956 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
958 assert(Input.
isFilename() &&
"Unexpected verify input");
964 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
966 Exec, CmdArgs, Inputs, Output));
988 if (Ty == types::TY_PP_Asm)
989 return types::TY_Asm;
1009 auto T = llvm::Triple(Twine(
"arm64-apple-") +
1010 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1034 ArgStringList &CC1Args)
const {
1039 ArgStringList &CC1Args)
const {
1044 ArgStringList &CC1Args)
const {
1053 return llvm::StringSwitch<const char *>(
Arch)
1054 .Case(
"armv6k",
"armv6")
1055 .Case(
"armv6m",
"armv6m")
1056 .Case(
"armv5tej",
"armv5")
1057 .Case(
"xscale",
"xscale")
1058 .Case(
"armv4t",
"armv4t")
1059 .Case(
"armv7",
"armv7")
1060 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1061 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1062 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1063 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1064 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1065 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1070 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1071 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1073 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1077 if (
Arch.starts_with(
"armv5"))
1080 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1083 else if (
Arch.ends_with(
"v7a"))
1093 case llvm::Triple::aarch64_32:
1096 case llvm::Triple::aarch64: {
1102 case llvm::Triple::thumb:
1103 case llvm::Triple::arm:
1104 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1108 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1117 if (LinkerVersion) {
1119 VersionTuple NewLinkerVersion;
1120 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1121 (void)NewLinkerVersion.tryParse(A->getValue());
1122 assert(NewLinkerVersion == LinkerVersion);
1124 return *LinkerVersion;
1127 VersionTuple NewLinkerVersion;
1128 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1131 if (NewLinkerVersion.tryParse(A->getValue()) ||
1132 NewLinkerVersion.getSubbuild())
1134 << A->getAsString(Args);
1137 LinkerVersion = NewLinkerVersion;
1138 return *LinkerVersion;
1147void Darwin::VerifyTripleForSDK(
const llvm::opt::ArgList &Args,
1148 const llvm::Triple Triple)
const {
1150 if (!
SDKInfo->supportsTriple(Triple))
1152 <<
SDKInfo->getDisplayName() << Triple.getTriple();
1153 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
1156 const char *isysroot = A->getValue();
1158 if (!SDKName.empty()) {
1159 bool supported =
true;
1160 if (Triple.isWatchOS())
1161 supported = SDKName.starts_with(
"Watch");
1162 else if (Triple.isTvOS())
1163 supported = SDKName.starts_with(
"AppleTV");
1164 else if (Triple.isDriverKit())
1165 supported = SDKName.starts_with(
"DriverKit");
1166 else if (Triple.isiOS())
1167 supported = SDKName.starts_with(
"iPhone");
1168 else if (Triple.isMacOSX())
1169 supported = SDKName.starts_with(
"MacOSX");
1175 << SDKName << Triple.getTriple();
1187 return Triple.getTriple();
1199 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1201 Str += llvm::Triple::getOSTypeName(llvm::Triple::Firmware);
1205 Triple.setOSName(Str);
1207 VerifyTripleForSDK(Args, Triple);
1209 return Triple.getTriple();
1221 return Dsymutil.get();
1225 return VerifyDebug.get();
1242 const ArgList &Args)
1243 :
Darwin(D, Triple, Args) {}
1247 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1248 CC1Args.push_back(
"-Werror=undef-prefix");
1254 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1255 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1260 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1265 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1275 static constexpr llvm::StringLiteral XcodeAppSuffix(
1276 ".app/Contents/Developer");
1277 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1278 if (Index == StringRef::npos)
1280 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1284 ArgStringList &CmdArgs)
const {
1303 llvm::sys::path::remove_filename(P);
1304 llvm::sys::path::remove_filename(P);
1305 llvm::sys::path::append(P,
"lib",
"arc");
1311 if (!
getVFS().exists(P)) {
1312 auto updatePath = [&](
const Arg *A) {
1316 if (XcodePathForSDK.empty())
1319 P = XcodePathForSDK;
1320 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1322 return getVFS().exists(P);
1325 bool updated =
false;
1326 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1327 updated = updatePath(A);
1330 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1335 CmdArgs.push_back(
"-force_load");
1336 llvm::sys::path::append(P,
"libarclite_");
1339 P +=
"watchsimulator";
1343 P +=
"appletvsimulator";
1347 P +=
"iphonesimulator";
1355 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1357 CmdArgs.push_back(Args.MakeArgString(P));
1394 bool IsShared)
const {
1402 const char *LibArg = Args.MakeArgString(P);
1403 CmdArgs.push_back(LibArg);
1411 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1415 CmdArgs.push_back(
"-rpath");
1416 CmdArgs.push_back(
"@executable_path");
1420 CmdArgs.push_back(
"-rpath");
1421 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1428 "it doesn't make sense to ask for the compiler-rt library name as an "
1432 if (Component !=
"builtins") {
1433 MachOLibName +=
'.';
1434 MachOLibName += Component;
1439 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1441 return std::string(FullPath);
1451 "it doesn't make sense to ask for the compiler-rt library name as an "
1455 if (Component !=
"builtins") {
1456 DarwinLibName += Component;
1457 DarwinLibName +=
'_';
1463 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1464 return std::string(FullPath);
1469 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1470 auto EndSDK = llvm::sys::path::rend(isysroot);
1471 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1472 StringRef SDK = *IT;
1473 if (SDK.consume_back(
".sdk"))
1503 llvm_unreachable(
"Unsupported platform");
1508 for (Arg *A : Args) {
1509 if (A->getOption().matches(options::OPT_exported__symbols__list))
1511 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1512 !A->getOption().matches(options::OPT_Xlinker))
1514 if (A->containsValue(
"-exported_symbols_list") ||
1515 A->containsValue(
"-exported_symbol"))
1523 CmdArgs.push_back(
"-exported_symbol");
1524 CmdArgs.push_back(Symbol);
1534 StringRef Segment, StringRef Section) {
1535 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1536 Args.MakeArgString(Section),
"0x4000"})
1537 CmdArgs.push_back(A);
1541 ArgStringList &CmdArgs)
const {
1570 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1572 Args, CmdArgs,
"__DATA",
1573 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1579void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1580 ArgStringList &CmdArgs,
1581 StringRef Sanitizer,
1582 bool Shared)
const {
1588 const ArgList &Args)
const {
1589 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1590 StringRef
Value = A->getValue();
1591 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1592 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1593 <<
Value <<
"darwin";
1600 ArgStringList &CmdArgs,
1601 bool ForceLinkBuiltinRT)
const {
1611 if (Args.hasArg(options::OPT_static) ||
1612 Args.hasArg(options::OPT_fapple_kext) ||
1613 Args.hasArg(options::OPT_mkernel)) {
1614 if (ForceLinkBuiltinRT)
1622 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1623 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1630 const char *sanitizer =
nullptr;
1632 sanitizer =
"UndefinedBehaviorSanitizer";
1634 sanitizer =
"RealtimeSanitizer";
1636 sanitizer =
"AddressSanitizer";
1638 sanitizer =
"ThreadSanitizer";
1641 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1650 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1653 "Static sanitizer runtimes not supported");
1654 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1659 "Static sanitizer runtimes not supported");
1660 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1663 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1666 "Static sanitizer runtimes not supported");
1667 AddLinkSanitizerLibArgs(
1673 "Static sanitizer runtimes not supported");
1674 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1677 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1678 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1679 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1691 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1699 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1709 CmdArgs.push_back(
"-framework");
1710 CmdArgs.push_back(
"DriverKit");
1716 CmdArgs.push_back(
"-lSystem");
1728 CmdArgs.push_back(
"-lgcc_s.1");
1737 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1738 if (!SystemTriple.isMacOSX())
1739 return std::string(MacOSSDKVersion);
1740 VersionTuple SystemVersion;
1741 SystemTriple.getMacOSXVersion(SystemVersion);
1743 unsigned Major, Minor, Micro;
1747 return std::string(MacOSSDKVersion);
1748 VersionTuple SDKVersion(Major, Minor, Micro);
1750 if (SDKVersion > SystemVersion)
1751 return SystemVersion.getAsString();
1752 return std::string(MacOSSDKVersion);
1759struct DarwinPlatform {
1768 DeploymentTargetEnv,
1778 DarwinPlatformKind getPlatform()
const {
return Platform; }
1780 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1782 void setEnvironment(DarwinEnvironmentKind Kind) {
1784 InferSimulatorFromArch =
false;
1787 const VersionTuple getOSVersion()
const {
1788 return UnderlyingOSVersion.value_or(VersionTuple());
1791 VersionTuple takeOSVersion() {
1792 assert(UnderlyingOSVersion.has_value() &&
1793 "attempting to get an unset OS version");
1794 VersionTuple
Result = *UnderlyingOSVersion;
1795 UnderlyingOSVersion.reset();
1798 bool isValidOSVersion()
const {
1799 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1803 VersionTuple getCanonicalOSVersion()
const {
1804 return llvm::Triple::getCanonicalVersionForOS(
1805 getOSFromPlatform(Platform), getOSVersion(),
true);
1808 void setOSVersion(
const VersionTuple &Version) {
1809 UnderlyingOSVersion = Version;
1812 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1814 VersionTuple getZipperedOSVersion()
const {
1815 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1816 "zippered target version is specified only for Mac Catalyst");
1817 return ZipperedOSVersion;
1821 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1824 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1826 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1827 return TargetVariantTriple;
1831 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1835 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1839 case DarwinPlatformKind::MacOS:
1840 Opt = options::OPT_mmacos_version_min_EQ;
1842 case DarwinPlatformKind::IPhoneOS:
1843 Opt = options::OPT_mios_version_min_EQ;
1845 case DarwinPlatformKind::TvOS:
1846 Opt = options::OPT_mtvos_version_min_EQ;
1848 case DarwinPlatformKind::WatchOS:
1849 Opt = options::OPT_mwatchos_version_min_EQ;
1855 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1861 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1867 assert(Arg &&
"OS version argument not yet inferred");
1868 return Arg->getAsString(Args);
1869 case DeploymentTargetEnv:
1870 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1871 case InferredFromSDK:
1872 case InferredFromArch:
1873 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1875 llvm_unreachable(
"Unsupported Darwin Source Kind");
1879 std::string getInferredSource() {
1880 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1881 return InferredSource.str();
1884 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1885 const VersionTuple &OSVersion,
1886 const std::optional<DarwinSDKInfo> &SDKInfo) {
1888 case llvm::Triple::Simulator:
1889 Environment = DarwinEnvironmentKind::Simulator;
1891 case llvm::Triple::MacABI: {
1892 Environment = DarwinEnvironmentKind::MacCatalyst;
1894 ZipperedOSVersion = VersionTuple(10, 15);
1895 if (hasOSVersion() && SDKInfo) {
1896 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1898 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1899 OSVersion, ZipperedOSVersion, std::nullopt)) {
1900 ZipperedOSVersion = *MacOSVersion;
1907 if (TargetVariantTriple) {
1908 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
1909 if (TargetVariantVersion.getMajor()) {
1910 if (TargetVariantVersion < ZipperedOSVersion)
1911 ZipperedOSVersion = std::move(TargetVariantVersion);
1921 static DarwinPlatform
1922 createFromTarget(
const llvm::Triple &TT, Arg *A,
1923 std::optional<llvm::Triple> TargetVariantTriple,
1924 const std::optional<DarwinSDKInfo> &SDKInfo) {
1925 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
1926 TT.getOSVersion(), A);
1927 VersionTuple OsVersion = TT.getOSVersion();
1928 Result.TargetVariantTriple = std::move(TargetVariantTriple);
1929 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
1932 static DarwinPlatform
1933 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
1934 llvm::Triple::EnvironmentType Environment, Arg *A,
1935 const std::optional<DarwinSDKInfo> &SDKInfo) {
1936 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
1937 Result.InferSimulatorFromArch =
false;
1938 Result.setEnvironment(Environment, OSVersion, SDKInfo);
1941 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
1943 DarwinPlatform
Result{OSVersionArg, Platform,
1944 getVersionFromString(A->getValue()), A};
1946 Result.Environment = DarwinEnvironmentKind::Simulator;
1949 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
1950 StringRef EnvVarName,
1951 StringRef OSVersion) {
1952 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
1953 getVersionFromString(OSVersion));
1954 Result.EnvVarName = EnvVarName;
1957 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
1958 const DarwinSDKInfo &SDKInfo) {
1959 const DarwinSDKInfo::SDKPlatformInfo PlatformInfo =
1961 const llvm::Triple::OSType
OS = PlatformInfo.
getOS();
1963 if (OS == llvm::Triple::MacOSX)
1964 Version = getVersionFromString(
1966 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
1968 Result.InferSimulatorFromArch =
false;
1969 Result.InferredSource = SDKRoot;
1972 static DarwinPlatform createFromSDK(StringRef SDKRoot,
1973 DarwinPlatformKind Platform,
1975 bool IsSimulator =
false) {
1976 DarwinPlatform
Result(InferredFromSDK, Platform,
1977 getVersionFromString(
Value));
1979 Result.Environment = DarwinEnvironmentKind::Simulator;
1980 Result.InferSimulatorFromArch =
false;
1981 Result.InferredSource = SDKRoot;
1984 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
1985 VersionTuple Version) {
1987 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
1995 DarwinSDKInfo inferSDKInfo() {
1996 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
1997 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
1998 llvm::Triple::EnvironmentType EnvironmentType =
1999 getEnvTypeFromEnvKind(Environment);
2000 StringRef PlatformPrefix =
2001 (Platform == DarwinPlatformKind::DriverKit) ?
"/System/DriverKit" :
"";
2002 return DarwinSDKInfo(
"", OS, EnvironmentType, getOSVersion(),
2003 getDisplayName(Platform, Environment, getOSVersion()),
2005 VersionTuple(getOSVersion().getMajor(), 0, 99),
2006 {DarwinSDKInfo::SDKPlatformInfo(
2007 llvm::Triple::Apple, OS, EnvironmentType,
2008 llvm::Triple::MachO, PlatformPrefix)});
2012 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2014 Arguments({Argument, VersionTuple().getAsString()}) {}
2015 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2016 VersionTuple
Value, Arg *Argument =
nullptr)
2020 UnderlyingOSVersion =
Value;
2023 static VersionTuple getVersionFromString(
const StringRef Input) {
2024 llvm::VersionTuple Version;
2025 bool IsValid = !Version.tryParse(Input);
2026 assert(IsValid &&
"unable to convert input version to version tuple");
2031 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2033 case llvm::Triple::Darwin:
2034 case llvm::Triple::MacOSX:
2035 return DarwinPlatformKind::MacOS;
2036 case llvm::Triple::IOS:
2037 return DarwinPlatformKind::IPhoneOS;
2038 case llvm::Triple::TvOS:
2039 return DarwinPlatformKind::TvOS;
2040 case llvm::Triple::WatchOS:
2041 return DarwinPlatformKind::WatchOS;
2042 case llvm::Triple::XROS:
2043 return DarwinPlatformKind::XROS;
2044 case llvm::Triple::DriverKit:
2045 return DarwinPlatformKind::DriverKit;
2046 case llvm::Triple::Firmware:
2047 return DarwinPlatformKind::Firmware;
2049 llvm_unreachable(
"Unable to infer Darwin variant");
2053 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2055 case DarwinPlatformKind::MacOS:
2056 return llvm::Triple::MacOSX;
2057 case DarwinPlatformKind::IPhoneOS:
2058 return llvm::Triple::IOS;
2059 case DarwinPlatformKind::TvOS:
2060 return llvm::Triple::TvOS;
2061 case DarwinPlatformKind::WatchOS:
2062 return llvm::Triple::WatchOS;
2063 case DarwinPlatformKind::DriverKit:
2064 return llvm::Triple::DriverKit;
2065 case DarwinPlatformKind::XROS:
2066 return llvm::Triple::XROS;
2067 case DarwinPlatformKind::Firmware:
2068 return llvm::Triple::Firmware;
2070 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2073 static DarwinEnvironmentKind
2074 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2075 switch (EnvironmentType) {
2076 case llvm::Triple::UnknownEnvironment:
2077 return DarwinEnvironmentKind::NativeEnvironment;
2078 case llvm::Triple::Simulator:
2079 return DarwinEnvironmentKind::Simulator;
2080 case llvm::Triple::MacABI:
2081 return DarwinEnvironmentKind::MacCatalyst;
2083 llvm_unreachable(
"Unable to infer Darwin environment");
2087 static llvm::Triple::EnvironmentType
2088 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2089 switch (EnvironmentKind) {
2090 case DarwinEnvironmentKind::NativeEnvironment:
2091 return llvm::Triple::UnknownEnvironment;
2092 case DarwinEnvironmentKind::Simulator:
2093 return llvm::Triple::Simulator;
2094 case DarwinEnvironmentKind::MacCatalyst:
2095 return llvm::Triple::MacABI;
2097 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2100 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2101 DarwinEnvironmentKind TargetEnvironment,
2102 VersionTuple Version) {
2103 SmallVector<std::string, 3> Components;
2104 switch (TargetPlatform) {
2105 case DarwinPlatformKind::MacOS:
2106 Components.push_back(
"macOS");
2108 case DarwinPlatformKind::IPhoneOS:
2109 Components.push_back(
"iOS");
2111 case DarwinPlatformKind::TvOS:
2112 Components.push_back(
"tvOS");
2114 case DarwinPlatformKind::WatchOS:
2115 Components.push_back(
"watchOS");
2117 case DarwinPlatformKind::DriverKit:
2118 Components.push_back(
"DriverKit");
2121 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2122 std::to_string(TargetPlatform) +
2123 "' is unsupported when inferring SDK Info.");
2125 switch (TargetEnvironment) {
2126 case DarwinEnvironmentKind::NativeEnvironment:
2128 case DarwinEnvironmentKind::Simulator:
2129 Components.push_back(
"Simulator");
2132 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2133 std::to_string(TargetEnvironment) +
2134 "' is unsupported when inferring SDK Info.");
2136 Components.push_back(Version.getAsString());
2137 return join(Components,
" ");
2141 DarwinPlatformKind Platform;
2142 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2146 VersionTuple ZipperedOSVersion;
2151 std::optional<VersionTuple> UnderlyingOSVersion;
2152 bool InferSimulatorFromArch =
true;
2153 std::pair<Arg *, std::string>
Arguments;
2154 StringRef EnvVarName;
2157 StringRef InferredSource;
2160 std::optional<llvm::Triple> TargetVariantTriple;
2165std::optional<DarwinPlatform>
2166getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2167 const Driver &TheDriver) {
2168 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2169 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2170 options::OPT_mios_simulator_version_min_EQ);
2172 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2173 options::OPT_mtvos_simulator_version_min_EQ);
2174 Arg *WatchOSVersion =
2175 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2176 options::OPT_mwatchos_simulator_version_min_EQ);
2178 auto GetDarwinPlatform =
2179 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2180 bool IsSimulator) -> std::optional<DarwinPlatform> {
2181 if (StringRef(VersionArg->getValue()).empty()) {
2182 TheDriver.
Diag(diag::err_drv_missing_version_number)
2183 << VersionArg->getAsString(Args);
2184 return std::nullopt;
2186 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2191 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2192 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2193 << macOSVersion->getAsString(Args)
2194 << (iOSVersion ? iOSVersion
2195 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2201 }
else if (iOSVersion) {
2202 if (TvOSVersion || WatchOSVersion) {
2203 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2204 << iOSVersion->getAsString(Args)
2205 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2208 iOSVersion->getOption().getID() ==
2209 options::OPT_mios_simulator_version_min_EQ);
2210 }
else if (TvOSVersion) {
2211 if (WatchOSVersion) {
2212 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2213 << TvOSVersion->getAsString(Args)
2214 << WatchOSVersion->getAsString(Args);
2217 TvOSVersion->getOption().getID() ==
2218 options::OPT_mtvos_simulator_version_min_EQ);
2219 }
else if (WatchOSVersion)
2220 return GetDarwinPlatform(
2222 WatchOSVersion->getOption().getID() ==
2223 options::OPT_mwatchos_simulator_version_min_EQ);
2224 return std::nullopt;
2229std::optional<DarwinPlatform>
2230getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2231 const llvm::Triple &Triple) {
2232 const char *EnvVars[] = {
2233 "MACOSX_DEPLOYMENT_TARGET",
2234 "IPHONEOS_DEPLOYMENT_TARGET",
2235 "TVOS_DEPLOYMENT_TARGET",
2236 "WATCHOS_DEPLOYMENT_TARGET",
2237 "DRIVERKIT_DEPLOYMENT_TARGET",
2238 "XROS_DEPLOYMENT_TARGET"
2240 std::string Targets[std::size(EnvVars)];
2241 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2242 if (
char *Env = ::getenv(I.value()))
2243 Targets[I.index()] = Env;
2252 if (Triple.getArch() == llvm::Triple::arm ||
2253 Triple.getArch() == llvm::Triple::aarch64 ||
2254 Triple.getArch() == llvm::Triple::thumb)
2261 unsigned FirstTarget = std::size(Targets);
2262 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2263 if (Targets[I].empty())
2265 if (FirstTarget == std::size(Targets))
2268 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2269 << Targets[FirstTarget] << Targets[I];
2273 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2274 if (!
Target.value().empty())
2275 return DarwinPlatform::createDeploymentTargetEnv(
2279 return std::nullopt;
2285std::optional<DarwinPlatform>
2286inferDeploymentTargetFromSDK(DerivedArgList &Args,
2287 const std::optional<DarwinSDKInfo> &SDKInfo) {
2288 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2290 return std::nullopt;
2291 StringRef isysroot = A->getValue();
2293 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2297 return std::nullopt;
2299 std::string Version;
2302 size_t StartVer = SDK.find_first_of(
"0123456789");
2303 size_t EndVer = SDK.find_last_of(
"0123456789");
2304 if (StartVer != StringRef::npos && EndVer > StartVer)
2305 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2306 if (Version.empty())
2307 return std::nullopt;
2309 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2310 return DarwinPlatform::createFromSDK(
2312 SDK.starts_with(
"iPhoneSimulator"));
2313 else if (SDK.starts_with(
"MacOSX"))
2314 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2316 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2317 return DarwinPlatform::createFromSDK(
2319 SDK.starts_with(
"WatchSimulator"));
2320 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2321 return DarwinPlatform::createFromSDK(
2323 SDK.starts_with(
"AppleTVSimulator"));
2324 else if (SDK.starts_with(
"DriverKit"))
2326 return std::nullopt;
2330VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2331 const llvm::Triple &Triple,
2332 const Driver &TheDriver) {
2333 VersionTuple OsVersion;
2334 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2336 case llvm::Triple::Darwin:
2337 case llvm::Triple::MacOSX:
2340 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2341 !Triple.getOSMajorVersion())
2342 SystemTriple.getMacOSXVersion(OsVersion);
2343 else if (!Triple.getMacOSXVersion(OsVersion))
2344 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2345 << Triple.getOSName();
2347 case llvm::Triple::IOS:
2348 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2349 OsVersion = VersionTuple(13, 1);
2351 OsVersion = Triple.getiOSVersion();
2353 case llvm::Triple::TvOS:
2354 OsVersion = Triple.getOSVersion();
2356 case llvm::Triple::WatchOS:
2357 OsVersion = Triple.getWatchOSVersion();
2359 case llvm::Triple::DriverKit:
2360 OsVersion = Triple.getDriverKitVersion();
2363 OsVersion = Triple.getOSVersion();
2364 if (!OsVersion.getMajor())
2365 OsVersion = OsVersion.withMajorReplaced(1);
2372std::optional<DarwinPlatform>
2373inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2374 const llvm::Triple &Triple,
2375 const Driver &TheDriver) {
2376 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2379 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2380 OSTy = llvm::Triple::MacOSX;
2381 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2382 MachOArchName ==
"armv6")
2383 OSTy = llvm::Triple::IOS;
2384 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2385 OSTy = llvm::Triple::WatchOS;
2386 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2387 MachOArchName !=
"armv7em")
2388 OSTy = llvm::Triple::MacOSX;
2389 if (OSTy == llvm::Triple::UnknownOS)
2390 return std::nullopt;
2391 return DarwinPlatform::createFromArch(
2392 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2396std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2397 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2398 const std::optional<DarwinSDKInfo> &SDKInfo) {
2399 if (!Args.hasArg(options::OPT_target))
2400 return std::nullopt;
2401 if (Triple.getOS() == llvm::Triple::Darwin ||
2402 Triple.getOS() == llvm::Triple::UnknownOS)
2403 return std::nullopt;
2404 std::optional<llvm::Triple> TargetVariantTriple;
2405 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2406 llvm::Triple TVT(A->getValue());
2408 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2409 TVT.getArchName() == Triple.getArchName()) &&
2410 TVT.getArch() == Triple.getArch() &&
2411 TVT.getSubArch() == Triple.getSubArch() &&
2412 TVT.getVendor() == Triple.getVendor()) {
2413 if (TargetVariantTriple)
2418 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2419 TVT.isMacCatalystEnvironment()) ||
2420 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2421 Triple.isMacCatalystEnvironment())) {
2422 TargetVariantTriple = TVT;
2425 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2426 << A->getSpelling() << A->getValue();
2429 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2430 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2433 return PlatformAndVersion;
2437std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2438 DerivedArgList &Args,
const Driver &TheDriver,
2439 const std::optional<DarwinSDKInfo> &SDKInfo) {
2440 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2442 return std::nullopt;
2443 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2444 switch (TT.getOS()) {
2445 case llvm::Triple::MacOSX:
2446 case llvm::Triple::IOS:
2447 case llvm::Triple::TvOS:
2448 case llvm::Triple::WatchOS:
2449 case llvm::Triple::XROS:
2452 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2453 << TT.getOSName() << A->getAsString(Args);
2454 return std::nullopt;
2457 VersionTuple Version = TT.getOSVersion();
2458 if (!Version.getMajor()) {
2459 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2460 << A->getAsString(Args);
2461 return std::nullopt;
2463 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2464 TT.getEnvironment(), A, SDKInfo);
2467std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2468 const ArgList &Args,
2469 const Driver &TheDriver) {
2470 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2472 return std::nullopt;
2473 StringRef isysroot = A->getValue();
2475 if (!SDKInfoOrErr) {
2476 llvm::consumeError(SDKInfoOrErr.takeError());
2477 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2478 return std::nullopt;
2480 return *SDKInfoOrErr;
2485void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2491 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2493 if (!
getVFS().exists(A->getValue()))
2494 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2495 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2498 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2499 StringRef(env) !=
"/") {
2500 Args.append(Args.MakeSeparateArg(
2501 nullptr, Opts.getOption(options::OPT_isysroot), env));
2504#ifdef CLANG_USE_XCSELECT
2509 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2510 Args.append(Args.MakeSeparateArg(
2511 nullptr, Opts.getOption(options::OPT_isysroot), p));
2524 std::optional<DarwinPlatform> PlatformAndVersion =
2526 if (PlatformAndVersion) {
2528 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2529 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2530 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2532 << TargetArgStr << MTargetOSArgStr;
2535 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2536 if (!TripleProvidedOSVersion)
2537 PlatformAndVersion->setOSVersion(
2540 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2541 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2542 if (PlatformAndVersionFromOSVersionArg) {
2543 unsigned TargetMajor, TargetMinor, TargetMicro;
2545 unsigned ArgMajor, ArgMinor, ArgMicro;
2547 if (PlatformAndVersion->getPlatform() !=
2548 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2550 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2551 TargetMinor, TargetMicro, TargetExtra) &&
2553 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2554 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2555 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2556 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2557 TargetExtra != ArgExtra))) {
2560 if (PlatformAndVersion->getPlatform() ==
2561 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2562 !TripleProvidedOSVersion) {
2563 PlatformAndVersion->setOSVersion(
2564 PlatformAndVersionFromOSVersionArg->getOSVersion());
2568 std::string OSVersionArg =
2569 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2570 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2572 << OSVersionArg << TargetArg;
2576 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2580 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2581 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2582 if (PlatformAndVersionFromOSVersionArg) {
2583 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2584 std::string OSVersionArgStr =
2585 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2587 << MTargetOSArgStr << OSVersionArgStr;
2591 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2594 if (!PlatformAndVersion) {
2595 PlatformAndVersion =
2597 if (PlatformAndVersion) {
2599 std::optional<DarwinPlatform> SDKTarget =
2600 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2602 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2608 if (!PlatformAndVersion) {
2609 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2612 if (PlatformAndVersion && !
SDKInfo)
2613 SDKInfo = PlatformAndVersion->inferSDKInfo();
2617 if (!PlatformAndVersion)
2618 PlatformAndVersion =
2622 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2623 if (!PlatformAndVersion->isValidOSVersion()) {
2624 if (PlatformAndVersion->isExplicitlySpecified())
2626 << PlatformAndVersion->getAsString(Args, Opts);
2628 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2629 << PlatformAndVersion->getOSVersion().getAsString()
2630 << PlatformAndVersion->getInferredSource();
2635 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2636 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2637 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2638 << PlatformAndVersion->getOSVersion().getAsString()
2639 << CanonicalVersion.getAsString();
2640 PlatformAndVersion->setOSVersion(CanonicalVersion);
2643 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2646 unsigned Major, Minor, Micro;
2649 const unsigned MajorVersionLimit = 1000;
2650 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2651 const std::string OSVersionStr = OSVersion.getAsString();
2653 if (Platform ==
MacOS) {
2656 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2659 << PlatformAndVersion->getAsString(Args, Opts);
2663 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2665 << PlatformAndVersion->getAsString(Args, Opts);
2667 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2668 (Major < 13 || (Major == 13 && Minor < 1))) {
2670 << PlatformAndVersion->getAsString(Args, Opts);
2677 if (
getTriple().isArch32Bit() && Major >= 11) {
2679 if (PlatformAndVersion->isExplicitlySpecified()) {
2680 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2681 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2684 << PlatformAndVersion->getAsString(Args, Opts);
2692 }
else if (Platform ==
TvOS) {
2695 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2697 << PlatformAndVersion->getAsString(Args, Opts);
2698 }
else if (Platform ==
WatchOS) {
2701 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2703 << PlatformAndVersion->getAsString(Args, Opts);
2707 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2710 << PlatformAndVersion->getAsString(Args, Opts);
2714 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2717 << PlatformAndVersion->getAsString(Args, Opts);
2724 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2727 VersionTuple ZipperedOSVersion;
2729 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2730 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2742 return !
SDKInfo->getPlatformPrefix(T).empty();
2751 const llvm::Triple &T)
const {
2753 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(T);
2754 if (!PlatformPrefix.empty())
2755 llvm::sys::path::append(Path, PlatformPrefix);
2756 }
else if (T.isDriverKit()) {
2759 llvm::sys::path::append(Path,
"System",
"DriverKit");
2768 if (DriverArgs.hasArg(options::OPT_isysroot))
2769 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2780 const llvm::opt::ArgList &DriverArgs,
2781 llvm::opt::ArgStringList &CC1Args)
const {
2786 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2787 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2788 bool NoBuiltinInc = DriverArgs.hasFlag(
2789 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2790 bool ForceBuiltinInc = DriverArgs.hasFlag(
2791 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2794 if (!NoStdInc && !NoStdlibInc) {
2796 llvm::sys::path::append(P,
"usr",
"local",
"include");
2801 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2803 llvm::sys::path::append(P,
"include");
2807 if (NoStdInc || NoStdlibInc)
2811 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2812 if (!CIncludeDirs.empty()) {
2814 CIncludeDirs.split(dirs,
":");
2815 for (llvm::StringRef dir : dirs) {
2816 llvm::StringRef Prefix =
2817 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2823 llvm::sys::path::append(P,
"usr",
"include");
2829 const llvm::opt::ArgList &DriverArgs,
2830 llvm::opt::ArgStringList &CC1Args)
const {
2833 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2842 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2843 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2844 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2848bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2849 llvm::opt::ArgStringList &CC1Args,
2851 llvm::StringRef Version,
2852 llvm::StringRef ArchDir,
2853 llvm::StringRef BitDir)
const {
2854 llvm::sys::path::append(
Base, Version);
2862 if (!ArchDir.empty())
2863 llvm::sys::path::append(P, ArchDir);
2864 if (!BitDir.empty())
2865 llvm::sys::path::append(P, BitDir);
2872 llvm::sys::path::append(P,
"backward");
2880 const llvm::opt::ArgList &DriverArgs,
2881 llvm::opt::ArgStringList &CC1Args)
const {
2889 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2890 options::OPT_nostdincxx))
2911 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
2912 if (
getVFS().exists(InstallBin)) {
2915 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2916 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
2922 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
2923 if (
getVFS().exists(SysrootUsr)) {
2926 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2927 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
2936 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
2941void AppleMachO::AddGnuCPlusPlusIncludePaths(
2942 const llvm::opt::ArgList &DriverArgs,
2943 llvm::opt::ArgStringList &CC1Args)
const {}
2945void DarwinClang::AddGnuCPlusPlusIncludePaths(
2946 const llvm::opt::ArgList &DriverArgs,
2947 llvm::opt::ArgStringList &CC1Args)
const {
2949 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
2951 llvm::Triple::ArchType arch =
getTriple().getArch();
2952 bool IsBaseFound =
true;
2957 case llvm::Triple::x86:
2958 case llvm::Triple::x86_64:
2959 IsBaseFound = AddGnuCPlusPlusIncludePaths(
2960 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
2961 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
2962 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
2963 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
2966 case llvm::Triple::arm:
2967 case llvm::Triple::thumb:
2969 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2970 "arm-apple-darwin10",
"v7");
2972 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2973 "arm-apple-darwin10",
"v6");
2976 case llvm::Triple::aarch64:
2978 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2979 "arm64-apple-darwin10",
"");
2989 ArgStringList &CmdArgs)
const {
2994 CmdArgs.push_back(
"-lc++");
2995 if (Args.hasArg(options::OPT_fexperimental_library))
2996 CmdArgs.push_back(
"-lc++experimental");
3006 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3008 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3010 if (!
getVFS().exists(P)) {
3011 llvm::sys::path::remove_filename(P);
3012 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3013 if (
getVFS().exists(P)) {
3014 CmdArgs.push_back(Args.MakeArgString(P));
3023 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3024 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3025 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3030 CmdArgs.push_back(
"-lstdc++");
3036 ArgStringList &CmdArgs)
const {
3042 llvm::sys::path::append(P,
"lib",
"darwin");
3046 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3048 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3050 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3054 llvm::sys::path::append(
3055 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3056 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3058 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3064 CmdArgs.push_back(Args.MakeArgString(P));
3068 StringRef BoundArch,
3070 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3080 for (Arg *A : Args) {
3089 case options::OPT_mkernel:
3090 case options::OPT_fapple_kext:
3092 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3095 case options::OPT_dependency_file:
3096 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3099 case options::OPT_gfull:
3100 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3102 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3105 case options::OPT_gused:
3106 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3108 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3111 case options::OPT_shared:
3112 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3115 case options::OPT_fconstant_cfstrings:
3116 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3119 case options::OPT_fno_constant_cfstrings:
3120 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3123 case options::OPT_Wnonportable_cfstrings:
3125 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3128 case options::OPT_Wno_nonportable_cfstrings:
3130 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3137 if (!BoundArch.empty()) {
3138 StringRef Name = BoundArch;
3139 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3140 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3146 else if (Name ==
"ppc601")
3147 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3148 else if (Name ==
"ppc603")
3149 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3150 else if (Name ==
"ppc604")
3151 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3152 else if (Name ==
"ppc604e")
3153 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3154 else if (Name ==
"ppc750")
3155 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3156 else if (Name ==
"ppc7400")
3157 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3158 else if (Name ==
"ppc7450")
3159 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3160 else if (Name ==
"ppc970")
3161 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3163 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3164 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3166 else if (Name ==
"i386")
3168 else if (Name ==
"i486")
3169 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3170 else if (Name ==
"i586")
3171 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3172 else if (Name ==
"i686")
3173 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3174 else if (Name ==
"pentium")
3175 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3176 else if (Name ==
"pentium2")
3177 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3178 else if (Name ==
"pentpro")
3179 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3180 else if (Name ==
"pentIIm3")
3181 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3183 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3184 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3186 else if (Name ==
"arm")
3187 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3188 else if (Name ==
"armv4t")
3189 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3190 else if (Name ==
"armv5")
3191 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3192 else if (Name ==
"xscale")
3193 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3194 else if (Name ==
"armv6")
3195 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3196 else if (Name ==
"armv6m")
3197 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3198 else if (Name ==
"armv7")
3199 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3200 else if (Name ==
"armv7em")
3201 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3202 else if (Name ==
"armv7k")
3203 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3204 else if (Name ==
"armv7m")
3205 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3206 else if (Name ==
"armv7s")
3207 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3214 ArgStringList &CmdArgs,
3215 bool ForceLinkBuiltinRT)
const {
3224 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3230 llvm::Triple::OSType OS;
3236 OS = llvm::Triple::MacOSX;
3239 OS = llvm::Triple::IOS;
3242 OS = llvm::Triple::TvOS;
3245 OS = llvm::Triple::WatchOS;
3261 switch (SDKInfo->getEnvironment()) {
3262 case llvm::Triple::UnknownEnvironment:
3263 case llvm::Triple::Simulator:
3264 case llvm::Triple::MacABI:
3273 VersionTuple SDKVersion = SDKInfo->getVersion();
3274 switch (SDKInfo->getOS()) {
3277 case llvm::Triple::MacOSX:
3278 return SDKVersion >= VersionTuple(15U);
3279 case llvm::Triple::IOS:
3280 return SDKVersion >= VersionTuple(18U);
3281 case llvm::Triple::TvOS:
3282 return SDKVersion >= VersionTuple(18U);
3283 case llvm::Triple::WatchOS:
3284 return SDKVersion >= VersionTuple(11U);
3285 case llvm::Triple::XROS:
3286 return SDKVersion >= VersionTuple(2U);
3294static inline llvm::VersionTuple
3299 case llvm::Triple::Darwin:
3300 case llvm::Triple::MacOSX:
3301 return llvm::VersionTuple(10U, 12U);
3302 case llvm::Triple::IOS:
3303 case llvm::Triple::TvOS:
3304 return llvm::VersionTuple(10U);
3305 case llvm::Triple::WatchOS:
3306 return llvm::VersionTuple(3U);
3309 llvm_unreachable(
"Unexpected OS");
3313 llvm::Triple::OSType OS;
3319 OS = llvm::Triple::MacOSX;
3322 OS = llvm::Triple::IOS;
3325 OS = llvm::Triple::TvOS;
3328 OS = llvm::Triple::WatchOS;
3339 llvm::opt::ArgStringList &CC1Args,
3348 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3349 options::OPT_fno_ptrauth_calls))
3350 CC1Args.push_back(
"-fptrauth-calls");
3351 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3352 options::OPT_fno_ptrauth_returns))
3353 CC1Args.push_back(
"-fptrauth-returns");
3354 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3355 options::OPT_fno_ptrauth_intrinsics))
3356 CC1Args.push_back(
"-fptrauth-intrinsics");
3357 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3358 options::OPT_fno_ptrauth_indirect_gotos))
3359 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3360 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3361 options::OPT_fno_ptrauth_auth_traps))
3362 CC1Args.push_back(
"-fptrauth-auth-traps");
3365 if (!DriverArgs.hasArg(
3366 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3367 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3368 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3369 if (!DriverArgs.hasArg(
3370 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3371 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3372 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3375 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3376 options::OPT_fno_ptrauth_objc_isa))
3377 CC1Args.push_back(
"-fptrauth-objc-isa");
3378 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3379 options::OPT_fno_ptrauth_objc_class_ro))
3380 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3381 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3382 options::OPT_fno_ptrauth_objc_interface_sel))
3383 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3388 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3395 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3396 options::OPT_fno_aligned_allocation) &&
3398 CC1Args.push_back(
"-faligned-alloc-unavailable");
3402 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3403 options::OPT_fno_objc_msgsend_selector_stubs) &&
3406 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3410 if (!DriverArgs.hasArgNoClaim(
3411 options::OPT_fobjc_msgsend_class_selector_stubs,
3412 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3415 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3419 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3420 options::OPT_fno_sized_deallocation) &&
3422 CC1Args.push_back(
"-fno-sized-deallocation");
3429 if (!
SDKInfo->getFilePath().empty()) {
3431 ExtraDepOpt +=
SDKInfo->getFilePath();
3432 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3438 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3442 if (!DriverArgs.getLastArgNoClaim(
3443 options::OPT_fvisibility_inlines_hidden_static_local_var,
3444 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3445 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3459 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3461 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3462 options::OPT_fno_define_target_os_macros))
3463 CC1Args.push_back(
"-fdefine-target-os-macros");
3467 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3468 options::OPT_fno_modulemap_allow_subdirectory_search,
3470 bool RequiresSubdirectorySearch;
3471 VersionTuple SDKVersion =
SDKInfo->getVersion();
3474 RequiresSubdirectorySearch =
true;
3477 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3481 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3484 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3487 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3490 if (!RequiresSubdirectorySearch)
3491 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3496 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3498 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3505 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3507 llvm::raw_string_ostream OS(Arg);
3508 OS <<
"-target-sdk-version=" <<
V;
3509 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3513 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3515 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3518 EmitTargetSDKVersionArg(
3522 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3530 llvm::raw_string_ostream OS(Arg);
3531 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3532 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3533 }
else if (
const auto *MacOStoMacCatalystMapping =
3536 if (std::optional<VersionTuple> SDKVersion =
3537 MacOStoMacCatalystMapping->map(
3541 llvm::raw_string_ostream OS(Arg);
3542 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3543 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3554 DerivedArgList *DAL =
3558 if (BoundArch.empty())
3564 AddDeploymentTarget(*DAL);
3572 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3575 if (A->getOption().getID() != options::OPT_mkernel &&
3576 A->getOption().getID() != options::OPT_fapple_kext)
3578 assert(it != ie &&
"unexpected argument translation");
3580 assert(A->getOption().getID() == options::OPT_static &&
3581 "missing expected -static argument");
3588 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3589 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3590 options::OPT_fno_omit_frame_pointer,
false))
3591 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3592 <<
"-fomit-frame-pointer" << BoundArch;
3601 if (
getArch() == llvm::Triple::x86_64 ||
3603 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3605 return (
getArch() == llvm::Triple::aarch64 ||
3606 getArch() == llvm::Triple::aarch64_32)
3614 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3615 return S[0] !=
'\0';
3620 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3629 return llvm::ExceptionHandling::None;
3633 if (Triple.isWatchABI())
3634 return llvm::ExceptionHandling::DwarfCFI;
3636 return llvm::ExceptionHandling::SjLj;
3651 return (
getArch() == llvm::Triple::x86_64 ||
3652 getArch() == llvm::Triple::aarch64);
3661 ArgStringList &CmdArgs)
const {
3664 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3667 CmdArgs.push_back(
"-watchos_version_min");
3669 CmdArgs.push_back(
"-watchos_simulator_version_min");
3671 CmdArgs.push_back(
"-tvos_version_min");
3673 CmdArgs.push_back(
"-tvos_simulator_version_min");
3675 CmdArgs.push_back(
"-driverkit_version_min");
3677 CmdArgs.push_back(
"-ios_simulator_version_min");
3679 CmdArgs.push_back(
"-iphoneos_version_min");
3681 CmdArgs.push_back(
"-maccatalyst_version_min");
3684 CmdArgs.push_back(
"-macosx_version_min");
3690 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3693 VersionTuple VariantTargetVersion;
3695 CmdArgs.push_back(
"-macosx_version_min");
3700 "unexpected target variant triple");
3701 CmdArgs.push_back(
"-maccatalyst_version_min");
3704 VersionTuple MinTgtVers =
3706 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3707 VariantTargetVersion = MinTgtVers;
3708 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3719 return "mac catalyst";
3732 llvm_unreachable(
"invalid platform");
3736 llvm::opt::ArgStringList &CmdArgs)
const {
3741 auto EmitPlatformVersionArg =
3744 const llvm::Triple &TT) {
3747 CmdArgs.push_back(
"-platform_version");
3748 std::string PlatformName =
3751 PlatformName +=
"-simulator";
3752 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3761 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3764 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3769 std::optional<VersionTuple> iOSSDKVersion;
3771 if (
const auto *MacOStoMacCatalystMapping =
3774 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3775 SDKInfo->getVersion().withoutBuild(),
3779 CmdArgs.push_back(Args.MakeArgString(
3780 (iOSSDKVersion ? *iOSSDKVersion
3787 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3788 if (!SDKVersion.getMinor())
3789 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3790 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3801 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3810 VersionTuple TargetVariantVersion;
3818 "unexpected target variant triple");
3823 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3829 ArgStringList &CmdArgs) {
3833 CmdArgs.push_back(
"-ldylib1.o");
3840 CmdArgs.push_back(
"-ldylib1.o");
3842 CmdArgs.push_back(
"-ldylib1.10.5.o");
3847 ArgStringList &CmdArgs) {
3848 if (Args.hasArg(options::OPT_static))
3853 CmdArgs.push_back(
"-lbundle1.o");
3858 ArgStringList &CmdArgs) {
3860 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3861 Args.hasArg(options::OPT_preload)) {
3862 CmdArgs.push_back(
"-lgcrt0.o");
3864 CmdArgs.push_back(
"-lgcrt1.o");
3874 CmdArgs.push_back(
"-no_new_main");
3876 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3882 ArgStringList &CmdArgs) {
3885 if (D.
getArch() == llvm::Triple::aarch64)
3888 CmdArgs.push_back(
"-lcrt1.o");
3890 CmdArgs.push_back(
"-lcrt1.3.1.o");
3897 CmdArgs.push_back(
"-lcrt1.o");
3899 CmdArgs.push_back(
"-lcrt1.10.5.o");
3901 CmdArgs.push_back(
"-lcrt1.10.6.o");
3906 ArgStringList &CmdArgs)
const {
3912 if (Args.hasArg(options::OPT_dynamiclib))
3914 else if (Args.hasArg(options::OPT_bundle))
3918 else if (Args.hasArg(options::OPT_static) ||
3919 Args.hasArg(options::OPT_object) ||
3920 Args.hasArg(options::OPT_preload))
3921 CmdArgs.push_back(
"-lcrt0.o");
3925 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
3927 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
3928 CmdArgs.push_back(Str);
3940 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
3941 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
3943 Res |= SanitizerKind::Address;
3944 Res |= SanitizerKind::PointerCompare;
3945 Res |= SanitizerKind::PointerSubtract;
3946 Res |= SanitizerKind::Realtime;
3947 Res |= SanitizerKind::Leak;
3948 Res |= SanitizerKind::Fuzzer;
3949 Res |= SanitizerKind::FuzzerNoLink;
3950 Res |= SanitizerKind::ObjCCast;
3957 Res |= SanitizerKind::Vptr;
3959 if ((IsX86_64 || IsAArch64) &&
3962 Res |= SanitizerKind::Thread;
3966 Res |= SanitizerKind::Type;
3970 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 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.
const SDKPlatformInfo & getCanonicalPlatformInfo() const
const llvm::VersionTuple & getVersion() 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 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)
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
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.
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()