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 bool TryXcselect =
false;
2497 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2499 if (!
getVFS().exists(A->getValue()))
2500 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2501 }
else if (
const char *env = ::getenv(
"SDKROOT")) {
2504 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2505 StringRef(env) !=
"/") {
2506 Args.append(Args.MakeSeparateArg(
2507 nullptr, Opts.getOption(options::OPT_isysroot), env));
2510 TryXcselect = !Args.hasArg(options::OPT__sysroot_EQ) &&
2511 !Args.hasArg(options::OPT_no_xcselect);
2521 std::optional<DarwinPlatform> PlatformAndVersion =
2523 if (PlatformAndVersion) {
2525 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2526 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2527 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2529 << TargetArgStr << MTargetOSArgStr;
2532 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2533 if (!TripleProvidedOSVersion)
2534 PlatformAndVersion->setOSVersion(
2537 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2538 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2539 if (PlatformAndVersionFromOSVersionArg) {
2540 unsigned TargetMajor, TargetMinor, TargetMicro;
2542 unsigned ArgMajor, ArgMinor, ArgMicro;
2544 if (PlatformAndVersion->getPlatform() !=
2545 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2547 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2548 TargetMinor, TargetMicro, TargetExtra) &&
2550 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2551 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2552 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2553 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2554 TargetExtra != ArgExtra))) {
2557 if (PlatformAndVersion->getPlatform() ==
2558 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2559 !TripleProvidedOSVersion) {
2560 PlatformAndVersion->setOSVersion(
2561 PlatformAndVersionFromOSVersionArg->getOSVersion());
2565 std::string OSVersionArg =
2566 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2567 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2569 << OSVersionArg << TargetArg;
2573 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2577 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2578 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2579 if (PlatformAndVersionFromOSVersionArg) {
2580 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2581 std::string OSVersionArgStr =
2582 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2584 << MTargetOSArgStr << OSVersionArgStr;
2588 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2591 if (!PlatformAndVersion) {
2592 PlatformAndVersion =
2594 if (PlatformAndVersion) {
2596 std::optional<DarwinPlatform> SDKTarget =
2597 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2599 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2605 if (!PlatformAndVersion) {
2606 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2609 if (PlatformAndVersion && !
SDKInfo)
2610 SDKInfo = PlatformAndVersion->inferSDKInfo();
2614 if (!PlatformAndVersion)
2615 PlatformAndVersion =
2619 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2620 if (!PlatformAndVersion->isValidOSVersion()) {
2621 if (PlatformAndVersion->isExplicitlySpecified())
2623 << PlatformAndVersion->getAsString(Args, Opts);
2625 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2626 << PlatformAndVersion->getOSVersion().getAsString()
2627 << PlatformAndVersion->getInferredSource();
2632 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2633 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2634 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2635 << PlatformAndVersion->getOSVersion().getAsString()
2636 << CanonicalVersion.getAsString();
2637 PlatformAndVersion->setOSVersion(CanonicalVersion);
2640 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2643 unsigned Major, Minor, Micro;
2646 const unsigned MajorVersionLimit = 1000;
2647 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2648 const std::string OSVersionStr = OSVersion.getAsString();
2650 if (Platform ==
MacOS) {
2651#ifdef CLANG_USE_XCSELECT
2654 if (!::xcselect_host_sdk_path(CLANG_XCSELECT_HOST_SDK_POLICY, &p)) {
2655 Args.append(Args.MakeSeparateArg(
2656 nullptr, Opts.getOption(options::OPT_isysroot), p));
2665 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2668 << PlatformAndVersion->getAsString(Args, Opts);
2672 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2674 << PlatformAndVersion->getAsString(Args, Opts);
2676 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2677 (Major < 13 || (Major == 13 && Minor < 1))) {
2679 << PlatformAndVersion->getAsString(Args, Opts);
2686 if (
getTriple().isArch32Bit() && Major >= 11) {
2688 if (PlatformAndVersion->isExplicitlySpecified()) {
2689 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2690 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2693 << PlatformAndVersion->getAsString(Args, Opts);
2701 }
else if (Platform ==
TvOS) {
2704 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2706 << PlatformAndVersion->getAsString(Args, Opts);
2707 }
else if (Platform ==
WatchOS) {
2710 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2712 << PlatformAndVersion->getAsString(Args, Opts);
2716 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2719 << PlatformAndVersion->getAsString(Args, Opts);
2723 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2726 << PlatformAndVersion->getAsString(Args, Opts);
2733 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2736 VersionTuple ZipperedOSVersion;
2738 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2739 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2751 return !
SDKInfo->getPlatformPrefix(T).empty();
2760 const llvm::Triple &T)
const {
2762 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(T);
2763 if (!PlatformPrefix.empty())
2764 llvm::sys::path::append(Path, PlatformPrefix);
2765 }
else if (T.isDriverKit()) {
2768 llvm::sys::path::append(Path,
"System",
"DriverKit");
2777 if (DriverArgs.hasArg(options::OPT_isysroot))
2778 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2789 const llvm::opt::ArgList &DriverArgs,
2790 llvm::opt::ArgStringList &CC1Args)
const {
2795 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2796 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2797 bool NoBuiltinInc = DriverArgs.hasFlag(
2798 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2799 bool ForceBuiltinInc = DriverArgs.hasFlag(
2800 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2803 if (!NoStdInc && !NoStdlibInc) {
2805 llvm::sys::path::append(P,
"usr",
"local",
"include");
2810 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2812 llvm::sys::path::append(P,
"include");
2816 if (NoStdInc || NoStdlibInc)
2820 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2821 if (!CIncludeDirs.empty()) {
2823 CIncludeDirs.split(dirs,
":");
2824 for (llvm::StringRef dir : dirs) {
2825 llvm::StringRef Prefix =
2826 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2832 llvm::sys::path::append(P,
"usr",
"include");
2838 const llvm::opt::ArgList &DriverArgs,
2839 llvm::opt::ArgStringList &CC1Args)
const {
2842 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2851 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2852 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2853 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2857bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2858 llvm::opt::ArgStringList &CC1Args,
2860 llvm::StringRef Version,
2861 llvm::StringRef ArchDir,
2862 llvm::StringRef BitDir)
const {
2863 llvm::sys::path::append(
Base, Version);
2871 if (!ArchDir.empty())
2872 llvm::sys::path::append(P, ArchDir);
2873 if (!BitDir.empty())
2874 llvm::sys::path::append(P, BitDir);
2881 llvm::sys::path::append(P,
"backward");
2889 const llvm::opt::ArgList &DriverArgs,
2890 llvm::opt::ArgStringList &CC1Args)
const {
2898 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2899 options::OPT_nostdincxx))
2920 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
2921 if (
getVFS().exists(InstallBin)) {
2924 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2925 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
2931 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
2932 if (
getVFS().exists(SysrootUsr)) {
2935 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2936 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
2945 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
2950void AppleMachO::AddGnuCPlusPlusIncludePaths(
2951 const llvm::opt::ArgList &DriverArgs,
2952 llvm::opt::ArgStringList &CC1Args)
const {}
2954void DarwinClang::AddGnuCPlusPlusIncludePaths(
2955 const llvm::opt::ArgList &DriverArgs,
2956 llvm::opt::ArgStringList &CC1Args)
const {
2958 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
2960 llvm::Triple::ArchType arch =
getTriple().getArch();
2961 bool IsBaseFound =
true;
2966 case llvm::Triple::x86:
2967 case llvm::Triple::x86_64:
2968 IsBaseFound = AddGnuCPlusPlusIncludePaths(
2969 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
2970 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
2971 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
2972 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
2975 case llvm::Triple::arm:
2976 case llvm::Triple::thumb:
2978 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2979 "arm-apple-darwin10",
"v7");
2981 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2982 "arm-apple-darwin10",
"v6");
2985 case llvm::Triple::aarch64:
2987 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2988 "arm64-apple-darwin10",
"");
2998 ArgStringList &CmdArgs)
const {
3003 CmdArgs.push_back(
"-lc++");
3004 if (Args.hasArg(options::OPT_fexperimental_library))
3005 CmdArgs.push_back(
"-lc++experimental");
3015 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
3017 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
3019 if (!
getVFS().exists(P)) {
3020 llvm::sys::path::remove_filename(P);
3021 llvm::sys::path::append(P,
"libstdc++.6.dylib");
3022 if (
getVFS().exists(P)) {
3023 CmdArgs.push_back(Args.MakeArgString(P));
3032 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3033 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3034 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3039 CmdArgs.push_back(
"-lstdc++");
3045 ArgStringList &CmdArgs)
const {
3051 llvm::sys::path::append(P,
"lib",
"darwin");
3055 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3057 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3059 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3063 llvm::sys::path::append(
3064 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3065 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3067 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3073 CmdArgs.push_back(Args.MakeArgString(P));
3077 StringRef BoundArch,
3079 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3089 for (Arg *A : Args) {
3098 case options::OPT_mkernel:
3099 case options::OPT_fapple_kext:
3101 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3104 case options::OPT_dependency_file:
3105 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3108 case options::OPT_gfull:
3109 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3111 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3114 case options::OPT_gused:
3115 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3117 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3120 case options::OPT_shared:
3121 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3124 case options::OPT_fconstant_cfstrings:
3125 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3128 case options::OPT_fno_constant_cfstrings:
3129 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3132 case options::OPT_Wnonportable_cfstrings:
3134 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3137 case options::OPT_Wno_nonportable_cfstrings:
3139 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3146 if (!BoundArch.empty()) {
3147 StringRef Name = BoundArch;
3148 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3149 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3155 else if (Name ==
"ppc601")
3156 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3157 else if (Name ==
"ppc603")
3158 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3159 else if (Name ==
"ppc604")
3160 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3161 else if (Name ==
"ppc604e")
3162 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3163 else if (Name ==
"ppc750")
3164 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3165 else if (Name ==
"ppc7400")
3166 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3167 else if (Name ==
"ppc7450")
3168 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3169 else if (Name ==
"ppc970")
3170 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3172 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3173 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3175 else if (Name ==
"i386")
3177 else if (Name ==
"i486")
3178 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3179 else if (Name ==
"i586")
3180 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3181 else if (Name ==
"i686")
3182 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3183 else if (Name ==
"pentium")
3184 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3185 else if (Name ==
"pentium2")
3186 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3187 else if (Name ==
"pentpro")
3188 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3189 else if (Name ==
"pentIIm3")
3190 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3192 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3193 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3195 else if (Name ==
"arm")
3196 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3197 else if (Name ==
"armv4t")
3198 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3199 else if (Name ==
"armv5")
3200 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3201 else if (Name ==
"xscale")
3202 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3203 else if (Name ==
"armv6")
3204 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3205 else if (Name ==
"armv6m")
3206 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3207 else if (Name ==
"armv7")
3208 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3209 else if (Name ==
"armv7em")
3210 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3211 else if (Name ==
"armv7k")
3212 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3213 else if (Name ==
"armv7m")
3214 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3215 else if (Name ==
"armv7s")
3216 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3223 ArgStringList &CmdArgs,
3224 bool ForceLinkBuiltinRT)
const {
3233 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3239 llvm::Triple::OSType OS;
3245 OS = llvm::Triple::MacOSX;
3248 OS = llvm::Triple::IOS;
3251 OS = llvm::Triple::TvOS;
3254 OS = llvm::Triple::WatchOS;
3270 switch (SDKInfo->getEnvironment()) {
3271 case llvm::Triple::UnknownEnvironment:
3272 case llvm::Triple::Simulator:
3273 case llvm::Triple::MacABI:
3282 VersionTuple SDKVersion = SDKInfo->getVersion();
3283 switch (SDKInfo->getOS()) {
3286 case llvm::Triple::MacOSX:
3287 return SDKVersion >= VersionTuple(15U);
3288 case llvm::Triple::IOS:
3289 return SDKVersion >= VersionTuple(18U);
3290 case llvm::Triple::TvOS:
3291 return SDKVersion >= VersionTuple(18U);
3292 case llvm::Triple::WatchOS:
3293 return SDKVersion >= VersionTuple(11U);
3294 case llvm::Triple::XROS:
3295 return SDKVersion >= VersionTuple(2U);
3303static inline llvm::VersionTuple
3308 case llvm::Triple::Darwin:
3309 case llvm::Triple::MacOSX:
3310 return llvm::VersionTuple(10U, 12U);
3311 case llvm::Triple::IOS:
3312 case llvm::Triple::TvOS:
3313 return llvm::VersionTuple(10U);
3314 case llvm::Triple::WatchOS:
3315 return llvm::VersionTuple(3U);
3318 llvm_unreachable(
"Unexpected OS");
3322 llvm::Triple::OSType OS;
3328 OS = llvm::Triple::MacOSX;
3331 OS = llvm::Triple::IOS;
3334 OS = llvm::Triple::TvOS;
3337 OS = llvm::Triple::WatchOS;
3348 llvm::opt::ArgStringList &CC1Args,
3357 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3358 options::OPT_fno_ptrauth_calls))
3359 CC1Args.push_back(
"-fptrauth-calls");
3360 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3361 options::OPT_fno_ptrauth_returns))
3362 CC1Args.push_back(
"-fptrauth-returns");
3363 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3364 options::OPT_fno_ptrauth_intrinsics))
3365 CC1Args.push_back(
"-fptrauth-intrinsics");
3366 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3367 options::OPT_fno_ptrauth_indirect_gotos))
3368 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3369 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3370 options::OPT_fno_ptrauth_auth_traps))
3371 CC1Args.push_back(
"-fptrauth-auth-traps");
3374 if (!DriverArgs.hasArg(
3375 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3376 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3377 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3378 if (!DriverArgs.hasArg(
3379 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3380 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3381 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3384 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3385 options::OPT_fno_ptrauth_objc_isa))
3386 CC1Args.push_back(
"-fptrauth-objc-isa");
3387 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3388 options::OPT_fno_ptrauth_objc_class_ro))
3389 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3390 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3391 options::OPT_fno_ptrauth_objc_interface_sel))
3392 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3397 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3404 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3405 options::OPT_fno_aligned_allocation) &&
3407 CC1Args.push_back(
"-faligned-alloc-unavailable");
3411 if (!DriverArgs.hasArgNoClaim(options::OPT_fobjc_msgsend_selector_stubs,
3412 options::OPT_fno_objc_msgsend_selector_stubs) &&
3415 CC1Args.push_back(
"-fobjc-msgsend-selector-stubs");
3419 if (!DriverArgs.hasArgNoClaim(
3420 options::OPT_fobjc_msgsend_class_selector_stubs,
3421 options::OPT_fno_objc_msgsend_class_selector_stubs) &&
3424 CC1Args.push_back(
"-fobjc-msgsend-class-selector-stubs");
3428 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3429 options::OPT_fno_sized_deallocation) &&
3431 CC1Args.push_back(
"-fno-sized-deallocation");
3438 if (!
SDKInfo->getFilePath().empty()) {
3440 ExtraDepOpt +=
SDKInfo->getFilePath();
3441 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3447 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3451 if (!DriverArgs.getLastArgNoClaim(
3452 options::OPT_fvisibility_inlines_hidden_static_local_var,
3453 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3454 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3468 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3470 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3471 options::OPT_fno_define_target_os_macros))
3472 CC1Args.push_back(
"-fdefine-target-os-macros");
3476 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3477 options::OPT_fno_modulemap_allow_subdirectory_search,
3479 bool RequiresSubdirectorySearch;
3480 VersionTuple SDKVersion =
SDKInfo->getVersion();
3483 RequiresSubdirectorySearch =
true;
3486 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3490 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3493 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3496 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3499 if (!RequiresSubdirectorySearch)
3500 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3505 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3507 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3514 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3516 llvm::raw_string_ostream OS(Arg);
3517 OS <<
"-target-sdk-version=" <<
V;
3518 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3522 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3524 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3527 EmitTargetSDKVersionArg(
3531 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3539 llvm::raw_string_ostream OS(Arg);
3540 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3541 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3542 }
else if (
const auto *MacOStoMacCatalystMapping =
3545 if (std::optional<VersionTuple> SDKVersion =
3546 MacOStoMacCatalystMapping->map(
3550 llvm::raw_string_ostream OS(Arg);
3551 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3552 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3563 DerivedArgList *DAL =
3567 if (BoundArch.empty())
3573 AddDeploymentTarget(*DAL);
3581 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3584 if (A->getOption().getID() != options::OPT_mkernel &&
3585 A->getOption().getID() != options::OPT_fapple_kext)
3587 assert(it != ie &&
"unexpected argument translation");
3589 assert(A->getOption().getID() == options::OPT_static &&
3590 "missing expected -static argument");
3597 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3598 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3599 options::OPT_fno_omit_frame_pointer,
false))
3600 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3601 <<
"-fomit-frame-pointer" << BoundArch;
3610 if (
getArch() == llvm::Triple::x86_64 ||
3612 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3614 return (
getArch() == llvm::Triple::aarch64 ||
3615 getArch() == llvm::Triple::aarch64_32)
3623 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3624 return S[0] !=
'\0';
3629 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3638 return llvm::ExceptionHandling::None;
3642 if (Triple.isWatchABI())
3643 return llvm::ExceptionHandling::DwarfCFI;
3645 return llvm::ExceptionHandling::SjLj;
3660 return (
getArch() == llvm::Triple::x86_64 ||
3661 getArch() == llvm::Triple::aarch64);
3670 ArgStringList &CmdArgs)
const {
3673 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3676 CmdArgs.push_back(
"-watchos_version_min");
3678 CmdArgs.push_back(
"-watchos_simulator_version_min");
3680 CmdArgs.push_back(
"-tvos_version_min");
3682 CmdArgs.push_back(
"-tvos_simulator_version_min");
3684 CmdArgs.push_back(
"-driverkit_version_min");
3686 CmdArgs.push_back(
"-ios_simulator_version_min");
3688 CmdArgs.push_back(
"-iphoneos_version_min");
3690 CmdArgs.push_back(
"-maccatalyst_version_min");
3693 CmdArgs.push_back(
"-macosx_version_min");
3699 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3702 VersionTuple VariantTargetVersion;
3704 CmdArgs.push_back(
"-macosx_version_min");
3709 "unexpected target variant triple");
3710 CmdArgs.push_back(
"-maccatalyst_version_min");
3713 VersionTuple MinTgtVers =
3715 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3716 VariantTargetVersion = MinTgtVers;
3717 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3728 return "mac catalyst";
3741 llvm_unreachable(
"invalid platform");
3745 llvm::opt::ArgStringList &CmdArgs)
const {
3750 auto EmitPlatformVersionArg =
3753 const llvm::Triple &TT) {
3756 CmdArgs.push_back(
"-platform_version");
3757 std::string PlatformName =
3760 PlatformName +=
"-simulator";
3761 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3770 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3773 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3778 std::optional<VersionTuple> iOSSDKVersion;
3780 if (
const auto *MacOStoMacCatalystMapping =
3783 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3784 SDKInfo->getVersion().withoutBuild(),
3788 CmdArgs.push_back(Args.MakeArgString(
3789 (iOSSDKVersion ? *iOSSDKVersion
3796 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3797 if (!SDKVersion.getMinor())
3798 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3799 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3810 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3819 VersionTuple TargetVariantVersion;
3827 "unexpected target variant triple");
3832 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3838 ArgStringList &CmdArgs) {
3842 CmdArgs.push_back(
"-ldylib1.o");
3849 CmdArgs.push_back(
"-ldylib1.o");
3851 CmdArgs.push_back(
"-ldylib1.10.5.o");
3856 ArgStringList &CmdArgs) {
3857 if (Args.hasArg(options::OPT_static))
3862 CmdArgs.push_back(
"-lbundle1.o");
3867 ArgStringList &CmdArgs) {
3869 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3870 Args.hasArg(options::OPT_preload)) {
3871 CmdArgs.push_back(
"-lgcrt0.o");
3873 CmdArgs.push_back(
"-lgcrt1.o");
3883 CmdArgs.push_back(
"-no_new_main");
3885 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3891 ArgStringList &CmdArgs) {
3894 if (D.
getArch() == llvm::Triple::aarch64)
3897 CmdArgs.push_back(
"-lcrt1.o");
3899 CmdArgs.push_back(
"-lcrt1.3.1.o");
3906 CmdArgs.push_back(
"-lcrt1.o");
3908 CmdArgs.push_back(
"-lcrt1.10.5.o");
3910 CmdArgs.push_back(
"-lcrt1.10.6.o");
3915 ArgStringList &CmdArgs)
const {
3921 if (Args.hasArg(options::OPT_dynamiclib))
3923 else if (Args.hasArg(options::OPT_bundle))
3927 else if (Args.hasArg(options::OPT_static) ||
3928 Args.hasArg(options::OPT_object) ||
3929 Args.hasArg(options::OPT_preload))
3930 CmdArgs.push_back(
"-lcrt0.o");
3934 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
3936 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
3937 CmdArgs.push_back(Str);
3949 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
3950 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
3952 Res |= SanitizerKind::Address;
3953 Res |= SanitizerKind::PointerCompare;
3954 Res |= SanitizerKind::PointerSubtract;
3955 Res |= SanitizerKind::Realtime;
3956 Res |= SanitizerKind::Leak;
3957 Res |= SanitizerKind::Fuzzer;
3958 Res |= SanitizerKind::FuzzerNoLink;
3959 Res |= SanitizerKind::ObjCCast;
3966 Res |= SanitizerKind::Vptr;
3968 if ((IsX86_64 || IsAArch64) &&
3971 Res |= SanitizerKind::Thread;
3975 Res |= SanitizerKind::Type;
3979 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()