13#include "clang/Config/config.h"
19#include "llvm/ADT/StringSwitch.h"
20#include "llvm/Option/ArgList.h"
21#include "llvm/ProfileData/InstrProf.h"
22#include "llvm/ProfileData/MemProf.h"
23#include "llvm/Support/Path.h"
24#include "llvm/Support/Threading.h"
25#include "llvm/Support/VirtualFileSystem.h"
26#include "llvm/TargetParser/TargetParser.h"
27#include "llvm/TargetParser/Triple.h"
37 return VersionTuple(13, 1);
53 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
54 .Cases({
"i386",
"i486",
"i486SX",
"i586",
"i686"}, llvm::Triple::x86)
55 .Cases({
"pentium",
"pentpro",
"pentIIm3",
"pentIIm5",
"pentium4"},
57 .Cases({
"x86_64",
"x86_64h"}, llvm::Triple::x86_64)
59 .Cases({
"arm",
"armv4t",
"armv5",
"armv6",
"armv6m"}, llvm::Triple::arm)
60 .Cases({
"armv7",
"armv7em",
"armv7k",
"armv7m"}, llvm::Triple::arm)
61 .Cases({
"armv7s",
"xscale"}, llvm::Triple::arm)
62 .Cases({
"arm64",
"arm64e"}, llvm::Triple::aarch64)
63 .Case(
"arm64_32", llvm::Triple::aarch64_32)
64 .Case(
"r600", llvm::Triple::r600)
65 .Case(
"amdgcn", llvm::Triple::amdgcn)
66 .Case(
"nvptx", llvm::Triple::nvptx)
67 .Case(
"nvptx64", llvm::Triple::nvptx64)
68 .Case(
"amdil", llvm::Triple::amdil)
69 .Case(
"spir", llvm::Triple::spir)
70 .Default(llvm::Triple::UnknownArch);
74 const ArgList &Args) {
75 const llvm::Triple::ArchType
Arch = getArchTypeForMachOArchName(Str);
76 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
78 if (
Arch != llvm::Triple::UnknownArch)
84 if ((T.getOS() != llvm::Triple::Firmware) &&
85 (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
86 ArchKind == llvm::ARM::ArchKind::ARMV7M ||
87 ArchKind == llvm::ARM::ArchKind::ARMV7EM)) {
89 if (T.getOS() == llvm::Triple::IOS)
90 for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
91 A->ignoreTargetSpecific();
92 if (T.getOS() == llvm::Triple::WatchOS)
93 for (Arg *A : Args.filtered(options::OPT_mwatchos_version_min_EQ))
94 A->ignoreTargetSpecific();
95 if (T.getOS() == llvm::Triple::TvOS)
96 for (Arg *A : Args.filtered(options::OPT_mtvos_version_min_EQ))
97 A->ignoreTargetSpecific();
99 T.setOS(llvm::Triple::UnknownOS);
100 T.setObjectFormat(llvm::Triple::MachO);
108 const char *LinkingOutput)
const {
111 ArgStringList CmdArgs;
113 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
117 const Action *SourceAction = &JA;
119 assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
120 SourceAction = SourceAction->
getInputs()[0];
128 if (Args.hasArg(options::OPT_fno_integrated_as)) {
129 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
130 CmdArgs.push_back(
"-Q");
134 if (SourceAction->
getType() == types::TY_Asm ||
135 SourceAction->
getType() == types::TY_PP_Asm) {
136 if (Args.hasArg(options::OPT_gstabs))
137 CmdArgs.push_back(
"--gstabs");
138 else if (Args.hasArg(options::OPT_g_Group))
139 CmdArgs.push_back(
"-g");
146 if (T.isX86() || Args.hasArg(options::OPT_force__cpusubtype__ALL))
147 CmdArgs.push_back(
"-force_cpusubtype_ALL");
150 (((Args.hasArg(options::OPT_mkernel) ||
151 Args.hasArg(options::OPT_fapple_kext)) &&
153 Args.hasArg(options::OPT_static)))
154 CmdArgs.push_back(
"-static");
156 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
158 assert(Output.
isFilename() &&
"Unexpected lipo output.");
159 CmdArgs.push_back(
"-o");
162 assert(Input.
isFilename() &&
"Invalid input.");
167 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
169 Exec, CmdArgs, Inputs, Output));
172void darwin::MachOTool::anchor() {}
175 ArgStringList &CmdArgs)
const {
179 CmdArgs.push_back(
"-arch");
180 CmdArgs.push_back(Args.MakeArgString(ArchName));
183 if (ArchName ==
"arm")
184 CmdArgs.push_back(
"-force_cpusubtype_ALL");
187bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
191 for (
const auto &Input : Inputs)
192 if (Input.getType() != types::TY_Object)
206 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
207 if (A->getOption().matches(options::OPT_O0))
209 if (A->getOption().matches(options::OPT_O))
210 return llvm::StringSwitch<bool>(A->getValue())
216 if (!IsLinkerOnlyAction)
221void darwin::Linker::AddLinkArgs(Compilation &
C,
const ArgList &Args,
222 ArgStringList &CmdArgs,
224 VersionTuple Version,
bool LinkerIsLLD,
225 bool UsePlatformVersion)
const {
226 const Driver &D = getToolChain().getDriver();
227 const toolchains::MachO &MachOTC = getMachOToolChain();
231 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
232 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
233 CmdArgs.push_back(
"-demangle");
235 if (Args.hasArg(options::OPT_rdynamic) &&
236 (Version >= VersionTuple(137) || LinkerIsLLD))
237 CmdArgs.push_back(
"-export_dynamic");
241 if (Args.hasFlag(options::OPT_fapplication_extension,
242 options::OPT_fno_application_extension,
false))
243 CmdArgs.push_back(
"-application_extension");
245 if (D.
isUsingLTO() && (Version >= VersionTuple(116) || LinkerIsLLD) &&
246 NeedsTempPath(Inputs)) {
247 std::string TmpPathName;
258 if (!TmpPathName.empty()) {
259 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
260 C.addTempFile(TmpPath);
261 CmdArgs.push_back(
"-object_path_lto");
262 CmdArgs.push_back(TmpPath);
275 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
277 StringRef P = llvm::sys::path::parent_path(D.
Dir);
278 SmallString<128> LibLTOPath(P);
279 llvm::sys::path::append(LibLTOPath,
"lib");
280 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
281 CmdArgs.push_back(
"-lto_library");
282 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
288 if (Version >= VersionTuple(262) &&
290 CmdArgs.push_back(
"-no_deduplicate");
293 Args.AddAllArgs(CmdArgs, options::OPT_static);
294 if (!Args.hasArg(options::OPT_static))
295 CmdArgs.push_back(
"-dynamic");
296 if (Args.hasArg(options::OPT_fgnu_runtime)) {
301 if (!Args.hasArg(options::OPT_dynamiclib)) {
302 AddMachOArch(Args, CmdArgs);
304 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
306 Args.AddLastArg(CmdArgs, options::OPT_bundle);
307 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
308 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
311 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
312 (A = Args.getLastArg(options::OPT_current__version)) ||
313 (A = Args.getLastArg(options::OPT_install__name)))
314 D.
Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
317 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
318 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
319 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
321 CmdArgs.push_back(
"-dylib");
324 if ((A = Args.getLastArg(options::OPT_bundle)) ||
325 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
326 (A = Args.getLastArg(options::OPT_client__name)) ||
327 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
328 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
329 (A = Args.getLastArg(options::OPT_private__bundle)))
330 D.
Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
333 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
334 "-dylib_compatibility_version");
335 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
336 "-dylib_current_version");
338 AddMachOArch(Args, CmdArgs);
340 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
341 "-dylib_install_name");
344 Args.AddLastArg(CmdArgs, options::OPT_all__load);
345 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
346 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
348 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
349 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
350 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
351 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
352 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
353 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
354 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
355 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
356 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
357 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
358 Args.AddAllArgs(CmdArgs, options::OPT_init);
361 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
366 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
367 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
368 Args.AddLastArg(CmdArgs, options::OPT_single__module);
369 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
370 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
373 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
374 options::OPT_fno_pie, options::OPT_fno_PIE)) {
375 if (A->getOption().matches(options::OPT_fpie) ||
376 A->getOption().matches(options::OPT_fPIE))
377 CmdArgs.push_back(
"-pie");
379 CmdArgs.push_back(
"-no_pie");
383 if (
C.getDriver().embedBitcodeEnabled()) {
386 CmdArgs.push_back(
"-bitcode_bundle");
388 if (
C.getDriver().embedBitcodeMarkerOnly() &&
389 Version >= VersionTuple(278)) {
390 CmdArgs.push_back(
"-bitcode_process_mode");
391 CmdArgs.push_back(
"marker");
394 D.
Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
398 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
399 options::OPT_fno_global_isel)) {
400 if (A->getOption().matches(options::OPT_fglobal_isel)) {
401 CmdArgs.push_back(
"-mllvm");
402 CmdArgs.push_back(
"-global-isel");
404 CmdArgs.push_back(
"-mllvm");
405 CmdArgs.push_back(
"-global-isel-abort=0");
409 if (Args.hasArg(options::OPT_mkernel) ||
410 Args.hasArg(options::OPT_fapple_kext) ||
411 Args.hasArg(options::OPT_ffreestanding)) {
412 CmdArgs.push_back(
"-mllvm");
413 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
416 Args.AddLastArg(CmdArgs, options::OPT_prebind);
417 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
418 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
419 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
420 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
421 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
422 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
423 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
424 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
425 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
426 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
427 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
428 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
429 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
430 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
431 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
437 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
438 CmdArgs.push_back(
"-syslibroot");
439 CmdArgs.push_back(A->getValue());
440 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
441 CmdArgs.push_back(
"-syslibroot");
442 CmdArgs.push_back(A->getValue());
443 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
444 CmdArgs.push_back(
"-syslibroot");
445 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
448 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
449 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
450 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
451 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
452 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
453 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
454 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
455 Args.AddAllArgs(CmdArgs, options::OPT_y);
456 Args.AddLastArg(CmdArgs, options::OPT_w);
457 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
458 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
459 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
460 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
461 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
462 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
463 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
464 Args.AddLastArg(CmdArgs, options::OPT_why_load);
465 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
466 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
467 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
468 Args.AddLastArg(CmdArgs, options::OPT_Mach);
472 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
474 : CSPGOGenerateArg->getValue());
475 llvm::sys::path::append(Path,
"default_%m.profraw");
476 CmdArgs.push_back(
"--cs-profile-generate");
477 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
479 SmallString<128> Path(
480 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
481 if (Path.empty() || llvm::sys::fs::is_directory(Path))
482 llvm::sys::path::append(Path,
"default.profdata");
483 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") + Path));
486 auto *CodeGenDataGenArg =
487 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
488 if (CodeGenDataGenArg)
490 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
491 CodeGenDataGenArg->getValue()));
498 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
501 return Args.hasArg(options::OPT_fobjc_link_runtime);
505 const llvm::Triple &Triple) {
510 Args.getAllArgValues(options::OPT_arch).size() > 1;
511 bool hasExplicitOutputFile =
512 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
514 D.
Diag(diag::err_drv_invalid_output_with_multiple_archs)
515 <<
"-foptimization-record-file";
522 const llvm::Triple &Triple,
524 StringRef Format =
"yaml";
525 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
526 Format = A->getValue();
528 CmdArgs.push_back(
"-mllvm");
529 CmdArgs.push_back(
"-lto-pass-remarks-output");
530 CmdArgs.push_back(
"-mllvm");
532 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
534 CmdArgs.push_back(A->getValue());
536 assert(Output.
isFilename() &&
"Unexpected ld output.");
542 CmdArgs.push_back(Args.MakeArgString(F));
546 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
547 CmdArgs.push_back(
"-mllvm");
549 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
550 CmdArgs.push_back(Args.MakeArgString(Passes));
553 if (!Format.empty()) {
554 CmdArgs.push_back(
"-mllvm");
555 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
556 CmdArgs.push_back(Args.MakeArgString(FormatArg));
560 CmdArgs.push_back(
"-mllvm");
561 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
564 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
565 CmdArgs.push_back(
"-mllvm");
567 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
568 CmdArgs.push_back(Args.MakeArgString(Opt));
577 const char *LinkingOutput)
const {
578 assert((Output.
getType() == types::TY_Image ||
579 Output.
getType() == types::TY_Object) &&
580 "Invalid linker output type.");
586 llvm::opt::ArgStringList InputFileList;
591 ArgStringList CmdArgs;
597 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
601 bool UsePlatformVersion = Triple.isXROS() || Triple.isOSFirmware();
605 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
615 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
616 if (A->getOption().matches(options::OPT_moutline)) {
618 CmdArgs.push_back(
"-mllvm");
619 CmdArgs.push_back(
"-enable-machine-outliner");
625 CmdArgs.push_back(
"-mllvm");
626 CmdArgs.push_back(
"-enable-machine-outliner=never");
633 CmdArgs.push_back(
"-mllvm");
634 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
637 auto *CodeGenDataGenArg =
638 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
639 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
643 if (CodeGenDataGenArg && CodeGenDataUseArg)
644 D.
Diag(diag::err_drv_argument_not_allowed_with)
645 << CodeGenDataGenArg->getAsString(Args)
646 << CodeGenDataUseArg->getAsString(Args);
650 if (CodeGenDataGenArg) {
651 CmdArgs.push_back(
"-mllvm");
652 CmdArgs.push_back(
"-codegen-data-generate");
656 if (CodeGenDataUseArg) {
657 CmdArgs.push_back(
"-mllvm");
658 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
659 CodeGenDataUseArg->getValue()));
665 if (!StatsFile.empty()) {
666 CmdArgs.push_back(
"-mllvm");
667 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
671 if (Args.hasArg(options::OPT_fstack_usage)) {
673 llvm::sys::path::replace_extension(StackUsageFile,
"su");
674 CmdArgs.push_back(
"-mllvm");
676 Args.MakeArgString(
"-stack-usage-file=" + StackUsageFile));
681 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
682 options::OPT_Z_Flag, options::OPT_u_Group});
687 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
688 CmdArgs.push_back(
"-ObjC");
690 CmdArgs.push_back(
"-o");
693 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
696 Args.AddAllArgs(CmdArgs, options::OPT_L);
701 for (
const auto &II : Inputs) {
702 if (!II.isFilename()) {
707 if (InputFileList.size() > 0)
713 InputFileList.push_back(II.getFilename());
719 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
720 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
724 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
728 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
732 CmdArgs.push_back(
"-framework");
733 CmdArgs.push_back(
"Foundation");
735 CmdArgs.push_back(
"-lobjc");
739 CmdArgs.push_back(
"-arch_multiple");
740 CmdArgs.push_back(
"-final_output");
741 CmdArgs.push_back(LinkingOutput);
744 if (Args.hasArg(options::OPT_fnested_functions))
745 CmdArgs.push_back(
"-allow_stack_execute");
750 if (!Parallelism.empty()) {
751 CmdArgs.push_back(
"-mllvm");
752 unsigned NumThreads =
753 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
754 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
760 bool NoStdOrDefaultLibs =
761 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
762 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
763 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
768 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
776 Args.ClaimAllArgs(options::OPT_pthread);
777 Args.ClaimAllArgs(options::OPT_pthreads);
781 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
785 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
786 Args.AddAllArgs(CmdArgs, options::OPT_F);
789 for (
const Arg *A : Args.filtered(options::OPT_iframework))
790 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
792 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
793 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
794 if (A->getValue() == StringRef(
"Accelerate")) {
795 CmdArgs.push_back(
"-framework");
796 CmdArgs.push_back(
"Accelerate");
805 bool NonStandardSearchPath =
false;
807 if (Triple.isDriverKit()) {
809 NonStandardSearchPath =
810 Version.getMajor() < 605 ||
811 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
816 if (NonStandardSearchPath) {
817 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
818 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
821 llvm::sys::path::append(P, SearchPath);
823 CmdArgs.push_back(Args.MakeArgString(Flag + P));
826 AddSearchPath(
"-L",
"/usr/lib");
827 AddSearchPath(
"-F",
"/System/Library/Frameworks");
833 if (Version >= VersionTuple(705) || LinkerIsLLD) {
841 std::unique_ptr<Command> Cmd = std::make_unique<Command>(
842 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
843 Cmd->setInputFileList(std::move(InputFileList));
844 C.addCommand(std::move(Cmd));
851 const char *LinkingOutput)
const {
855 Args.ClaimAllArgs(options::OPT_g_Group);
857 Args.ClaimAllArgs(options::OPT_emit_llvm);
860 Args.ClaimAllArgs(options::OPT_w);
862 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
865 ArgStringList CmdArgs;
867 CmdArgs.push_back(
"-static");
868 CmdArgs.push_back(
"-D");
869 CmdArgs.push_back(
"-no_warning_for_no_symbols");
870 CmdArgs.push_back(
"-o");
873 for (
const auto &II : Inputs) {
874 if (II.isFilename()) {
875 CmdArgs.push_back(II.getFilename());
882 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
883 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
884 D.
Diag(diag::err_drv_unable_to_remove_file) << EC.message();
889 const char *Exec = Args.MakeArgString(
getToolChain().GetStaticLibToolPath());
890 C.addCommand(std::make_unique<Command>(JA, *
this,
892 Exec, CmdArgs, Inputs, Output));
899 const char *LinkingOutput)
const {
900 ArgStringList CmdArgs;
902 CmdArgs.push_back(
"-create");
903 assert(Output.
isFilename() &&
"Unexpected lipo output.");
905 CmdArgs.push_back(
"-output");
908 for (
const auto &II : Inputs) {
909 assert(II.isFilename() &&
"Unexpected lipo input.");
910 CmdArgs.push_back(II.getFilename());
913 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
915 Args.MakeArgString(
getToolChain().GetProgramPath(LipoName.data()));
917 Exec, CmdArgs, Inputs, Output));
924 const char *LinkingOutput)
const {
925 ArgStringList CmdArgs;
927 CmdArgs.push_back(
"-o");
930 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
932 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
936 Args.MakeArgString(
getToolChain().GetProgramPath(
"dsymutil"));
938 Exec, CmdArgs, Inputs, Output));
945 const char *LinkingOutput)
const {
946 ArgStringList CmdArgs;
947 CmdArgs.push_back(
"--verify");
948 CmdArgs.push_back(
"--debug-info");
949 CmdArgs.push_back(
"--eh-frame");
950 CmdArgs.push_back(
"--quiet");
952 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
954 assert(Input.
isFilename() &&
"Unexpected verify input");
960 Args.MakeArgString(
getToolChain().GetProgramPath(
"dwarfdump"));
962 Exec, CmdArgs, Inputs, Output));
984 if (Ty == types::TY_PP_Asm)
985 return types::TY_Asm;
1005 auto T = llvm::Triple(Twine(
"arm64-apple-") +
1006 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1030 ArgStringList &CC1Args)
const {
1035 ArgStringList &CC1Args)
const {
1040 ArgStringList &CC1Args)
const {
1049 return llvm::StringSwitch<const char *>(
Arch)
1050 .Case(
"armv6k",
"armv6")
1051 .Case(
"armv6m",
"armv6m")
1052 .Case(
"armv5tej",
"armv5")
1053 .Case(
"xscale",
"xscale")
1054 .Case(
"armv4t",
"armv4t")
1055 .Case(
"armv7",
"armv7")
1056 .Cases({
"armv7a",
"armv7-a"},
"armv7")
1057 .Cases({
"armv7r",
"armv7-r"},
"armv7")
1058 .Cases({
"armv7em",
"armv7e-m"},
"armv7em")
1059 .Cases({
"armv7k",
"armv7-k"},
"armv7k")
1060 .Cases({
"armv7m",
"armv7-m"},
"armv7m")
1061 .Cases({
"armv7s",
"armv7-s"},
"armv7s")
1066 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1067 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1069 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1073 if (
Arch.starts_with(
"armv5"))
1076 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1079 else if (
Arch.ends_with(
"v7a"))
1089 case llvm::Triple::aarch64_32:
1092 case llvm::Triple::aarch64: {
1098 case llvm::Triple::thumb:
1099 case llvm::Triple::arm:
1100 if (
const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1104 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1113 if (LinkerVersion) {
1115 VersionTuple NewLinkerVersion;
1116 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1117 (void)NewLinkerVersion.tryParse(A->getValue());
1118 assert(NewLinkerVersion == LinkerVersion);
1120 return *LinkerVersion;
1123 VersionTuple NewLinkerVersion;
1124 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
1127 if (NewLinkerVersion.tryParse(A->getValue()) ||
1128 NewLinkerVersion.getSubbuild())
1130 << A->getAsString(Args);
1133 LinkerVersion = NewLinkerVersion;
1134 return *LinkerVersion;
1143void Darwin::VerifyTripleForSDK(
const llvm::opt::ArgList &Args,
1144 const llvm::Triple Triple)
const {
1146 if (!
SDKInfo->supportsTriple(Triple))
1148 <<
SDKInfo->getDisplayName() << Triple.getTriple();
1149 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
1152 const char *isysroot = A->getValue();
1154 if (!SDKName.empty()) {
1155 bool supported =
true;
1156 if (Triple.isWatchOS())
1157 supported = SDKName.starts_with(
"Watch");
1158 else if (Triple.isTvOS())
1159 supported = SDKName.starts_with(
"AppleTV");
1160 else if (Triple.isDriverKit())
1161 supported = SDKName.starts_with(
"DriverKit");
1162 else if (Triple.isiOS())
1163 supported = SDKName.starts_with(
"iPhone");
1164 else if (Triple.isMacOSX())
1165 supported = SDKName.starts_with(
"MacOSX");
1171 << SDKName << Triple.getTriple();
1183 return Triple.getTriple();
1195 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1197 Str += llvm::Triple::getOSTypeName(llvm::Triple::Firmware);
1201 Triple.setOSName(Str);
1203 VerifyTripleForSDK(Args, Triple);
1205 return Triple.getTriple();
1217 return Dsymutil.get();
1221 return VerifyDebug.get();
1238 const ArgList &Args)
1239 :
Darwin(D, Triple, Args) {}
1243 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1244 CC1Args.push_back(
"-Werror=undef-prefix");
1250 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1251 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1256 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1261 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1271 static constexpr llvm::StringLiteral XcodeAppSuffix(
1272 ".app/Contents/Developer");
1273 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1274 if (Index == StringRef::npos)
1276 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1280 ArgStringList &CmdArgs)
const {
1299 llvm::sys::path::remove_filename(P);
1300 llvm::sys::path::remove_filename(P);
1301 llvm::sys::path::append(P,
"lib",
"arc");
1307 if (!
getVFS().exists(P)) {
1308 auto updatePath = [&](
const Arg *A) {
1312 if (XcodePathForSDK.empty())
1315 P = XcodePathForSDK;
1316 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1318 return getVFS().exists(P);
1321 bool updated =
false;
1322 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1323 updated = updatePath(A);
1326 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1331 CmdArgs.push_back(
"-force_load");
1332 llvm::sys::path::append(P,
"libarclite_");
1335 P +=
"watchsimulator";
1339 P +=
"appletvsimulator";
1343 P +=
"iphonesimulator";
1351 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) << P;
1353 CmdArgs.push_back(Args.MakeArgString(P));
1390 bool IsShared)
const {
1398 const char *LibArg = Args.MakeArgString(P);
1399 CmdArgs.push_back(LibArg);
1407 assert(StringRef(P).ends_with(
".dylib") &&
"must be a dynamic library");
1411 CmdArgs.push_back(
"-rpath");
1412 CmdArgs.push_back(
"@executable_path");
1416 CmdArgs.push_back(
"-rpath");
1417 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(P)));
1424 "it doesn't make sense to ask for the compiler-rt library name as an "
1428 if (Component !=
"builtins") {
1429 MachOLibName +=
'.';
1430 MachOLibName += Component;
1435 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1437 return std::string(FullPath);
1447 "it doesn't make sense to ask for the compiler-rt library name as an "
1451 if (Component !=
"builtins") {
1452 DarwinLibName += Component;
1453 DarwinLibName +=
'_';
1459 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1460 return std::string(FullPath);
1465 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1466 auto EndSDK = llvm::sys::path::rend(isysroot);
1467 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1468 StringRef SDK = *IT;
1469 if (SDK.consume_back(
".sdk"))
1499 llvm_unreachable(
"Unsupported platform");
1504 for (Arg *A : Args) {
1505 if (A->getOption().matches(options::OPT_exported__symbols__list))
1507 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1508 !A->getOption().matches(options::OPT_Xlinker))
1510 if (A->containsValue(
"-exported_symbols_list") ||
1511 A->containsValue(
"-exported_symbol"))
1519 CmdArgs.push_back(
"-exported_symbol");
1520 CmdArgs.push_back(Symbol);
1530 StringRef Segment, StringRef Section) {
1531 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1532 Args.MakeArgString(Section),
"0x4000"})
1533 CmdArgs.push_back(A);
1537 ArgStringList &CmdArgs)
const {
1566 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1568 Args, CmdArgs,
"__DATA",
1569 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1575void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1576 ArgStringList &CmdArgs,
1577 StringRef Sanitizer,
1578 bool Shared)
const {
1584 const ArgList &Args)
const {
1585 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1586 StringRef
Value = A->getValue();
1587 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1588 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1589 <<
Value <<
"darwin";
1596 ArgStringList &CmdArgs,
1597 bool ForceLinkBuiltinRT)
const {
1607 if (Args.hasArg(options::OPT_static) ||
1608 Args.hasArg(options::OPT_fapple_kext) ||
1609 Args.hasArg(options::OPT_mkernel)) {
1610 if (ForceLinkBuiltinRT)
1618 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1619 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1626 const char *sanitizer =
nullptr;
1628 sanitizer =
"UndefinedBehaviorSanitizer";
1630 sanitizer =
"RealtimeSanitizer";
1632 sanitizer =
"AddressSanitizer";
1634 sanitizer =
"ThreadSanitizer";
1637 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1646 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1649 "Static sanitizer runtimes not supported");
1650 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1655 "Static sanitizer runtimes not supported");
1656 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1659 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1662 "Static sanitizer runtimes not supported");
1663 AddLinkSanitizerLibArgs(
1669 "Static sanitizer runtimes not supported");
1670 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1673 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1674 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1675 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1687 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1695 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1705 CmdArgs.push_back(
"-framework");
1706 CmdArgs.push_back(
"DriverKit");
1712 CmdArgs.push_back(
"-lSystem");
1724 CmdArgs.push_back(
"-lgcc_s.1");
1733 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1734 if (!SystemTriple.isMacOSX())
1735 return std::string(MacOSSDKVersion);
1736 VersionTuple SystemVersion;
1737 SystemTriple.getMacOSXVersion(SystemVersion);
1739 unsigned Major, Minor, Micro;
1743 return std::string(MacOSSDKVersion);
1744 VersionTuple SDKVersion(Major, Minor, Micro);
1746 if (SDKVersion > SystemVersion)
1747 return SystemVersion.getAsString();
1748 return std::string(MacOSSDKVersion);
1755struct DarwinPlatform {
1764 DeploymentTargetEnv,
1774 DarwinPlatformKind getPlatform()
const {
return Platform; }
1776 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1778 void setEnvironment(DarwinEnvironmentKind Kind) {
1780 InferSimulatorFromArch =
false;
1783 const VersionTuple getOSVersion()
const {
1784 return UnderlyingOSVersion.value_or(VersionTuple());
1787 VersionTuple takeOSVersion() {
1788 assert(UnderlyingOSVersion.has_value() &&
1789 "attempting to get an unset OS version");
1790 VersionTuple
Result = *UnderlyingOSVersion;
1791 UnderlyingOSVersion.reset();
1794 bool isValidOSVersion()
const {
1795 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1799 VersionTuple getCanonicalOSVersion()
const {
1800 return llvm::Triple::getCanonicalVersionForOS(
1801 getOSFromPlatform(Platform), getOSVersion(),
true);
1804 void setOSVersion(
const VersionTuple &Version) {
1805 UnderlyingOSVersion = Version;
1808 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1810 VersionTuple getZipperedOSVersion()
const {
1811 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1812 "zippered target version is specified only for Mac Catalyst");
1813 return ZipperedOSVersion;
1817 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1820 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1822 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1823 return TargetVariantTriple;
1827 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1831 assert(Kind != TargetArg && Kind != MTargetOSArg && Kind != OSVersionArg &&
1835 case DarwinPlatformKind::MacOS:
1836 Opt = options::OPT_mmacos_version_min_EQ;
1838 case DarwinPlatformKind::IPhoneOS:
1839 Opt = options::OPT_mios_version_min_EQ;
1841 case DarwinPlatformKind::TvOS:
1842 Opt = options::OPT_mtvos_version_min_EQ;
1844 case DarwinPlatformKind::WatchOS:
1845 Opt = options::OPT_mwatchos_version_min_EQ;
1851 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1857 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1863 assert(Arg &&
"OS version argument not yet inferred");
1864 return Arg->getAsString(Args);
1865 case DeploymentTargetEnv:
1866 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1867 case InferredFromSDK:
1868 case InferredFromArch:
1869 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1871 llvm_unreachable(
"Unsupported Darwin Source Kind");
1875 std::string getInferredSource() {
1876 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1877 return InferredSource.str();
1880 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1881 const VersionTuple &OSVersion,
1882 const std::optional<DarwinSDKInfo> &SDKInfo) {
1884 case llvm::Triple::Simulator:
1885 Environment = DarwinEnvironmentKind::Simulator;
1887 case llvm::Triple::MacABI: {
1888 Environment = DarwinEnvironmentKind::MacCatalyst;
1890 ZipperedOSVersion = VersionTuple(10, 15);
1891 if (hasOSVersion() && SDKInfo) {
1892 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1894 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1895 OSVersion, ZipperedOSVersion, std::nullopt)) {
1896 ZipperedOSVersion = *MacOSVersion;
1903 if (TargetVariantTriple) {
1904 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
1905 if (TargetVariantVersion.getMajor()) {
1906 if (TargetVariantVersion < ZipperedOSVersion)
1907 ZipperedOSVersion = std::move(TargetVariantVersion);
1917 static DarwinPlatform
1918 createFromTarget(
const llvm::Triple &TT, Arg *A,
1919 std::optional<llvm::Triple> TargetVariantTriple,
1920 const std::optional<DarwinSDKInfo> &SDKInfo) {
1921 DarwinPlatform
Result(TargetArg, getPlatformFromOS(TT.getOS()),
1922 TT.getOSVersion(), A);
1923 VersionTuple OsVersion = TT.getOSVersion();
1924 Result.TargetVariantTriple = TargetVariantTriple;
1925 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
1928 static DarwinPlatform
1929 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
1930 llvm::Triple::EnvironmentType Environment, Arg *A,
1931 const std::optional<DarwinSDKInfo> &SDKInfo) {
1932 DarwinPlatform
Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
1933 Result.InferSimulatorFromArch =
false;
1934 Result.setEnvironment(Environment, OSVersion, SDKInfo);
1937 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
1939 DarwinPlatform
Result{OSVersionArg, Platform,
1940 getVersionFromString(A->getValue()), A};
1942 Result.Environment = DarwinEnvironmentKind::Simulator;
1945 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
1946 StringRef EnvVarName,
1947 StringRef OSVersion) {
1948 DarwinPlatform
Result(DeploymentTargetEnv, Platform,
1949 getVersionFromString(OSVersion));
1950 Result.EnvVarName = EnvVarName;
1953 static DarwinPlatform createFromSDKInfo(StringRef SDKRoot,
1954 const DarwinSDKInfo &SDKInfo) {
1955 const DarwinSDKInfo::SDKPlatformInfo PlatformInfo =
1957 const llvm::Triple::OSType
OS = PlatformInfo.
getOS();
1959 if (OS == llvm::Triple::MacOSX)
1960 Version = getVersionFromString(
1962 DarwinPlatform
Result(InferredFromSDK, getPlatformFromOS(OS), Version);
1964 Result.InferSimulatorFromArch =
false;
1965 Result.InferredSource = SDKRoot;
1968 static DarwinPlatform createFromSDK(StringRef SDKRoot,
1969 DarwinPlatformKind Platform,
1971 bool IsSimulator =
false) {
1972 DarwinPlatform
Result(InferredFromSDK, Platform,
1973 getVersionFromString(
Value));
1975 Result.Environment = DarwinEnvironmentKind::Simulator;
1976 Result.InferSimulatorFromArch =
false;
1977 Result.InferredSource = SDKRoot;
1980 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
1981 VersionTuple Version) {
1983 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
1991 DarwinSDKInfo inferSDKInfo() {
1992 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
1993 llvm::Triple::OSType
OS = getOSFromPlatform(Platform);
1994 llvm::Triple::EnvironmentType EnvironmentType =
1995 getEnvTypeFromEnvKind(Environment);
1996 StringRef PlatformPrefix =
1997 (Platform == DarwinPlatformKind::DriverKit) ?
"/System/DriverKit" :
"";
1998 return DarwinSDKInfo(
"", OS, EnvironmentType, getOSVersion(),
1999 getDisplayName(Platform, Environment, getOSVersion()),
2001 VersionTuple(getOSVersion().getMajor(), 0, 99),
2002 {DarwinSDKInfo::SDKPlatformInfo(
2003 llvm::Triple::Apple, OS, EnvironmentType,
2004 llvm::Triple::MachO, PlatformPrefix)});
2008 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform, Arg *Argument)
2010 Arguments({Argument, VersionTuple().getAsString()}) {}
2011 DarwinPlatform(SourceKind Kind, DarwinPlatformKind Platform,
2012 VersionTuple
Value, Arg *Argument =
nullptr)
2016 UnderlyingOSVersion =
Value;
2019 static VersionTuple getVersionFromString(
const StringRef Input) {
2020 llvm::VersionTuple Version;
2021 bool IsValid = !Version.tryParse(Input);
2022 assert(IsValid &&
"unable to convert input version to version tuple");
2027 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
2029 case llvm::Triple::Darwin:
2030 case llvm::Triple::MacOSX:
2031 return DarwinPlatformKind::MacOS;
2032 case llvm::Triple::IOS:
2033 return DarwinPlatformKind::IPhoneOS;
2034 case llvm::Triple::TvOS:
2035 return DarwinPlatformKind::TvOS;
2036 case llvm::Triple::WatchOS:
2037 return DarwinPlatformKind::WatchOS;
2038 case llvm::Triple::XROS:
2039 return DarwinPlatformKind::XROS;
2040 case llvm::Triple::DriverKit:
2041 return DarwinPlatformKind::DriverKit;
2042 case llvm::Triple::Firmware:
2043 return DarwinPlatformKind::Firmware;
2045 llvm_unreachable(
"Unable to infer Darwin variant");
2049 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
2051 case DarwinPlatformKind::MacOS:
2052 return llvm::Triple::MacOSX;
2053 case DarwinPlatformKind::IPhoneOS:
2054 return llvm::Triple::IOS;
2055 case DarwinPlatformKind::TvOS:
2056 return llvm::Triple::TvOS;
2057 case DarwinPlatformKind::WatchOS:
2058 return llvm::Triple::WatchOS;
2059 case DarwinPlatformKind::DriverKit:
2060 return llvm::Triple::DriverKit;
2061 case DarwinPlatformKind::XROS:
2062 return llvm::Triple::XROS;
2063 case DarwinPlatformKind::Firmware:
2064 return llvm::Triple::Firmware;
2066 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
2069 static DarwinEnvironmentKind
2070 getEnvKindFromEnvType(llvm::Triple::EnvironmentType EnvironmentType) {
2071 switch (EnvironmentType) {
2072 case llvm::Triple::UnknownEnvironment:
2073 return DarwinEnvironmentKind::NativeEnvironment;
2074 case llvm::Triple::Simulator:
2075 return DarwinEnvironmentKind::Simulator;
2076 case llvm::Triple::MacABI:
2077 return DarwinEnvironmentKind::MacCatalyst;
2079 llvm_unreachable(
"Unable to infer Darwin environment");
2083 static llvm::Triple::EnvironmentType
2084 getEnvTypeFromEnvKind(DarwinEnvironmentKind EnvironmentKind) {
2085 switch (EnvironmentKind) {
2086 case DarwinEnvironmentKind::NativeEnvironment:
2087 return llvm::Triple::UnknownEnvironment;
2088 case DarwinEnvironmentKind::Simulator:
2089 return llvm::Triple::Simulator;
2090 case DarwinEnvironmentKind::MacCatalyst:
2091 return llvm::Triple::MacABI;
2093 llvm_unreachable(
"Unknown DarwinEnvironmentKind enum");
2096 static std::string getDisplayName(DarwinPlatformKind TargetPlatform,
2097 DarwinEnvironmentKind TargetEnvironment,
2098 VersionTuple Version) {
2099 SmallVector<std::string, 3> Components;
2100 switch (TargetPlatform) {
2101 case DarwinPlatformKind::MacOS:
2102 Components.push_back(
"macOS");
2104 case DarwinPlatformKind::IPhoneOS:
2105 Components.push_back(
"iOS");
2107 case DarwinPlatformKind::TvOS:
2108 Components.push_back(
"tvOS");
2110 case DarwinPlatformKind::WatchOS:
2111 Components.push_back(
"watchOS");
2113 case DarwinPlatformKind::DriverKit:
2114 Components.push_back(
"DriverKit");
2117 llvm::reportFatalUsageError(Twine(
"Platform: '") +
2118 std::to_string(TargetPlatform) +
2119 "' is unsupported when inferring SDK Info.");
2121 switch (TargetEnvironment) {
2122 case DarwinEnvironmentKind::NativeEnvironment:
2124 case DarwinEnvironmentKind::Simulator:
2125 Components.push_back(
"Simulator");
2128 llvm::reportFatalUsageError(Twine(
"Environment: '") +
2129 std::to_string(TargetEnvironment) +
2130 "' is unsupported when inferring SDK Info.");
2132 Components.push_back(Version.getAsString());
2133 return join(Components,
" ");
2137 DarwinPlatformKind Platform;
2138 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
2142 VersionTuple ZipperedOSVersion;
2147 std::optional<VersionTuple> UnderlyingOSVersion;
2148 bool InferSimulatorFromArch =
true;
2149 std::pair<Arg *, std::string>
Arguments;
2150 StringRef EnvVarName;
2153 StringRef InferredSource;
2156 std::optional<llvm::Triple> TargetVariantTriple;
2161std::optional<DarwinPlatform>
2162getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2163 const Driver &TheDriver) {
2164 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2165 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2166 options::OPT_mios_simulator_version_min_EQ);
2168 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2169 options::OPT_mtvos_simulator_version_min_EQ);
2170 Arg *WatchOSVersion =
2171 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2172 options::OPT_mwatchos_simulator_version_min_EQ);
2174 auto GetDarwinPlatform =
2175 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
2176 bool IsSimulator) -> std::optional<DarwinPlatform> {
2177 if (StringRef(VersionArg->getValue()).empty()) {
2178 TheDriver.
Diag(diag::err_drv_missing_version_number)
2179 << VersionArg->getAsString(Args);
2180 return std::nullopt;
2182 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2187 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2188 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2189 << macOSVersion->getAsString(Args)
2190 << (iOSVersion ? iOSVersion
2191 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2197 }
else if (iOSVersion) {
2198 if (TvOSVersion || WatchOSVersion) {
2199 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2200 << iOSVersion->getAsString(Args)
2201 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2204 iOSVersion->getOption().getID() ==
2205 options::OPT_mios_simulator_version_min_EQ);
2206 }
else if (TvOSVersion) {
2207 if (WatchOSVersion) {
2208 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2209 << TvOSVersion->getAsString(Args)
2210 << WatchOSVersion->getAsString(Args);
2213 TvOSVersion->getOption().getID() ==
2214 options::OPT_mtvos_simulator_version_min_EQ);
2215 }
else if (WatchOSVersion)
2216 return GetDarwinPlatform(
2218 WatchOSVersion->getOption().getID() ==
2219 options::OPT_mwatchos_simulator_version_min_EQ);
2220 return std::nullopt;
2225std::optional<DarwinPlatform>
2226getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2227 const llvm::Triple &Triple) {
2228 const char *EnvVars[] = {
2229 "MACOSX_DEPLOYMENT_TARGET",
2230 "IPHONEOS_DEPLOYMENT_TARGET",
2231 "TVOS_DEPLOYMENT_TARGET",
2232 "WATCHOS_DEPLOYMENT_TARGET",
2233 "DRIVERKIT_DEPLOYMENT_TARGET",
2234 "XROS_DEPLOYMENT_TARGET"
2236 std::string Targets[std::size(EnvVars)];
2237 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
2238 if (
char *Env = ::getenv(I.value()))
2239 Targets[I.index()] = Env;
2248 if (Triple.getArch() == llvm::Triple::arm ||
2249 Triple.getArch() == llvm::Triple::aarch64 ||
2250 Triple.getArch() == llvm::Triple::thumb)
2257 unsigned FirstTarget = std::size(Targets);
2258 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2259 if (Targets[I].empty())
2261 if (FirstTarget == std::size(Targets))
2264 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2265 << Targets[FirstTarget] << Targets[I];
2269 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
2270 if (!
Target.value().empty())
2271 return DarwinPlatform::createDeploymentTargetEnv(
2275 return std::nullopt;
2281std::optional<DarwinPlatform>
2282inferDeploymentTargetFromSDK(DerivedArgList &Args,
2283 const std::optional<DarwinSDKInfo> &SDKInfo) {
2284 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2286 return std::nullopt;
2287 StringRef isysroot = A->getValue();
2289 return DarwinPlatform::createFromSDKInfo(isysroot, *SDKInfo);
2293 return std::nullopt;
2295 std::string Version;
2298 size_t StartVer = SDK.find_first_of(
"0123456789");
2299 size_t EndVer = SDK.find_last_of(
"0123456789");
2300 if (StartVer != StringRef::npos && EndVer > StartVer)
2301 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2302 if (Version.empty())
2303 return std::nullopt;
2305 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2306 return DarwinPlatform::createFromSDK(
2308 SDK.starts_with(
"iPhoneSimulator"));
2309 else if (SDK.starts_with(
"MacOSX"))
2310 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2312 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2313 return DarwinPlatform::createFromSDK(
2315 SDK.starts_with(
"WatchSimulator"));
2316 else if (SDK.starts_with(
"AppleTVOS") || SDK.starts_with(
"AppleTVSimulator"))
2317 return DarwinPlatform::createFromSDK(
2319 SDK.starts_with(
"AppleTVSimulator"));
2320 else if (SDK.starts_with(
"DriverKit"))
2322 return std::nullopt;
2326VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2327 const llvm::Triple &Triple,
2328 const Driver &TheDriver) {
2329 VersionTuple OsVersion;
2330 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2332 case llvm::Triple::Darwin:
2333 case llvm::Triple::MacOSX:
2336 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2337 !Triple.getOSMajorVersion())
2338 SystemTriple.getMacOSXVersion(OsVersion);
2339 else if (!Triple.getMacOSXVersion(OsVersion))
2340 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2341 << Triple.getOSName();
2343 case llvm::Triple::IOS:
2344 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2345 OsVersion = VersionTuple(13, 1);
2347 OsVersion = Triple.getiOSVersion();
2349 case llvm::Triple::TvOS:
2350 OsVersion = Triple.getOSVersion();
2352 case llvm::Triple::WatchOS:
2353 OsVersion = Triple.getWatchOSVersion();
2355 case llvm::Triple::DriverKit:
2356 OsVersion = Triple.getDriverKitVersion();
2359 OsVersion = Triple.getOSVersion();
2360 if (!OsVersion.getMajor())
2361 OsVersion = OsVersion.withMajorReplaced(1);
2368std::optional<DarwinPlatform>
2369inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2370 const llvm::Triple &Triple,
2371 const Driver &TheDriver) {
2372 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2375 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2376 OSTy = llvm::Triple::MacOSX;
2377 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2378 MachOArchName ==
"armv6")
2379 OSTy = llvm::Triple::IOS;
2380 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2381 OSTy = llvm::Triple::WatchOS;
2382 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2383 MachOArchName !=
"armv7em")
2384 OSTy = llvm::Triple::MacOSX;
2385 if (OSTy == llvm::Triple::UnknownOS)
2386 return std::nullopt;
2387 return DarwinPlatform::createFromArch(
2388 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2392std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2393 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2394 const std::optional<DarwinSDKInfo> &SDKInfo) {
2395 if (!Args.hasArg(options::OPT_target))
2396 return std::nullopt;
2397 if (Triple.getOS() == llvm::Triple::Darwin ||
2398 Triple.getOS() == llvm::Triple::UnknownOS)
2399 return std::nullopt;
2400 std::optional<llvm::Triple> TargetVariantTriple;
2401 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2402 llvm::Triple TVT(A->getValue());
2404 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2405 TVT.getArchName() == Triple.getArchName()) &&
2406 TVT.getArch() == Triple.getArch() &&
2407 TVT.getSubArch() == Triple.getSubArch() &&
2408 TVT.getVendor() == Triple.getVendor()) {
2409 if (TargetVariantTriple)
2414 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2415 TVT.isMacCatalystEnvironment()) ||
2416 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2417 Triple.isMacCatalystEnvironment())) {
2418 TargetVariantTriple = TVT;
2421 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2422 << A->getSpelling() << A->getValue();
2425 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2426 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2429 return PlatformAndVersion;
2433std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2434 DerivedArgList &Args,
const Driver &TheDriver,
2435 const std::optional<DarwinSDKInfo> &SDKInfo) {
2436 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2438 return std::nullopt;
2439 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2440 switch (TT.getOS()) {
2441 case llvm::Triple::MacOSX:
2442 case llvm::Triple::IOS:
2443 case llvm::Triple::TvOS:
2444 case llvm::Triple::WatchOS:
2445 case llvm::Triple::XROS:
2448 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2449 << TT.getOSName() << A->getAsString(Args);
2450 return std::nullopt;
2453 VersionTuple Version = TT.getOSVersion();
2454 if (!Version.getMajor()) {
2455 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2456 << A->getAsString(Args);
2457 return std::nullopt;
2459 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2460 TT.getEnvironment(), A, SDKInfo);
2463std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2464 const ArgList &Args,
2465 const Driver &TheDriver) {
2466 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2468 return std::nullopt;
2469 StringRef isysroot = A->getValue();
2471 if (!SDKInfoOrErr) {
2472 llvm::consumeError(SDKInfoOrErr.takeError());
2473 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2474 return std::nullopt;
2476 return *SDKInfoOrErr;
2481void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2487 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2489 if (!
getVFS().exists(A->getValue()))
2490 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2492 if (
char *env = ::getenv(
"SDKROOT")) {
2495 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2496 StringRef(env) !=
"/") {
2497 Args.append(Args.MakeSeparateArg(
2498 nullptr, Opts.getOption(options::OPT_isysroot), env));
2510 std::optional<DarwinPlatform> PlatformAndVersion =
2512 if (PlatformAndVersion) {
2514 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2515 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2516 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2518 << TargetArgStr << MTargetOSArgStr;
2521 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2522 if (!TripleProvidedOSVersion)
2523 PlatformAndVersion->setOSVersion(
2526 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2527 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2528 if (PlatformAndVersionFromOSVersionArg) {
2529 unsigned TargetMajor, TargetMinor, TargetMicro;
2531 unsigned ArgMajor, ArgMinor, ArgMicro;
2533 if (PlatformAndVersion->getPlatform() !=
2534 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2536 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2537 TargetMinor, TargetMicro, TargetExtra) &&
2539 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2540 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2541 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2542 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2543 TargetExtra != ArgExtra))) {
2546 if (PlatformAndVersion->getPlatform() ==
2547 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2548 !TripleProvidedOSVersion) {
2549 PlatformAndVersion->setOSVersion(
2550 PlatformAndVersionFromOSVersionArg->getOSVersion());
2554 std::string OSVersionArg =
2555 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2556 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2558 << OSVersionArg << TargetArg;
2562 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2566 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2567 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2568 if (PlatformAndVersionFromOSVersionArg) {
2569 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2570 std::string OSVersionArgStr =
2571 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2573 << MTargetOSArgStr << OSVersionArgStr;
2577 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2580 if (!PlatformAndVersion) {
2581 PlatformAndVersion =
2583 if (PlatformAndVersion) {
2585 std::optional<DarwinPlatform> SDKTarget =
2586 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2588 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2594 if (!PlatformAndVersion) {
2595 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2598 if (PlatformAndVersion && !
SDKInfo)
2599 SDKInfo = PlatformAndVersion->inferSDKInfo();
2603 if (!PlatformAndVersion)
2604 PlatformAndVersion =
2608 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2609 if (!PlatformAndVersion->isValidOSVersion()) {
2610 if (PlatformAndVersion->isExplicitlySpecified())
2612 << PlatformAndVersion->getAsString(Args, Opts);
2614 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2615 << PlatformAndVersion->getOSVersion().getAsString()
2616 << PlatformAndVersion->getInferredSource();
2621 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2622 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2623 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2624 << PlatformAndVersion->getOSVersion().getAsString()
2625 << CanonicalVersion.getAsString();
2626 PlatformAndVersion->setOSVersion(CanonicalVersion);
2629 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2632 unsigned Major, Minor, Micro;
2635 const unsigned MajorVersionLimit = 1000;
2636 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2637 const std::string OSVersionStr = OSVersion.getAsString();
2639 if (Platform ==
MacOS) {
2642 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2645 << PlatformAndVersion->getAsString(Args, Opts);
2649 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2651 << PlatformAndVersion->getAsString(Args, Opts);
2653 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2654 (Major < 13 || (Major == 13 && Minor < 1))) {
2656 << PlatformAndVersion->getAsString(Args, Opts);
2663 if (
getTriple().isArch32Bit() && Major >= 11) {
2665 if (PlatformAndVersion->isExplicitlySpecified()) {
2666 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2667 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2670 << PlatformAndVersion->getAsString(Args, Opts);
2678 }
else if (Platform ==
TvOS) {
2681 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2683 << PlatformAndVersion->getAsString(Args, Opts);
2684 }
else if (Platform ==
WatchOS) {
2687 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2689 << PlatformAndVersion->getAsString(Args, Opts);
2693 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2696 << PlatformAndVersion->getAsString(Args, Opts);
2700 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2703 << PlatformAndVersion->getAsString(Args, Opts);
2710 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2713 VersionTuple ZipperedOSVersion;
2715 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2716 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2728 return !
SDKInfo->getPlatformPrefix(T).empty();
2737 const llvm::Triple &T)
const {
2739 const StringRef PlatformPrefix =
SDKInfo->getPlatformPrefix(T);
2740 if (!PlatformPrefix.empty())
2741 llvm::sys::path::append(Path, PlatformPrefix);
2742 }
else if (T.isDriverKit()) {
2745 llvm::sys::path::append(Path,
"System",
"DriverKit");
2754 if (DriverArgs.hasArg(options::OPT_isysroot))
2755 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2766 const llvm::opt::ArgList &DriverArgs,
2767 llvm::opt::ArgStringList &CC1Args)
const {
2772 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2773 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2774 bool NoBuiltinInc = DriverArgs.hasFlag(
2775 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2776 bool ForceBuiltinInc = DriverArgs.hasFlag(
2777 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2780 if (!NoStdInc && !NoStdlibInc) {
2782 llvm::sys::path::append(P,
"usr",
"local",
"include");
2787 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2789 llvm::sys::path::append(P,
"include");
2793 if (NoStdInc || NoStdlibInc)
2797 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2798 if (!CIncludeDirs.empty()) {
2800 CIncludeDirs.split(dirs,
":");
2801 for (llvm::StringRef dir : dirs) {
2802 llvm::StringRef Prefix =
2803 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2809 llvm::sys::path::append(P,
"usr",
"include");
2815 const llvm::opt::ArgList &DriverArgs,
2816 llvm::opt::ArgStringList &CC1Args)
const {
2819 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2828 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2829 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2830 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2834bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2835 llvm::opt::ArgStringList &CC1Args,
2837 llvm::StringRef Version,
2838 llvm::StringRef ArchDir,
2839 llvm::StringRef BitDir)
const {
2840 llvm::sys::path::append(
Base, Version);
2848 if (!ArchDir.empty())
2849 llvm::sys::path::append(P, ArchDir);
2850 if (!BitDir.empty())
2851 llvm::sys::path::append(P, BitDir);
2858 llvm::sys::path::append(P,
"backward");
2866 const llvm::opt::ArgList &DriverArgs,
2867 llvm::opt::ArgStringList &CC1Args)
const {
2875 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2876 options::OPT_nostdincxx))
2897 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
2898 if (
getVFS().exists(InstallBin)) {
2901 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2902 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
2908 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
2909 if (
getVFS().exists(SysrootUsr)) {
2912 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2913 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
2922 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
2927void AppleMachO::AddGnuCPlusPlusIncludePaths(
2928 const llvm::opt::ArgList &DriverArgs,
2929 llvm::opt::ArgStringList &CC1Args)
const {}
2931void DarwinClang::AddGnuCPlusPlusIncludePaths(
2932 const llvm::opt::ArgList &DriverArgs,
2933 llvm::opt::ArgStringList &CC1Args)
const {
2935 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
2937 llvm::Triple::ArchType arch =
getTriple().getArch();
2938 bool IsBaseFound =
true;
2943 case llvm::Triple::x86:
2944 case llvm::Triple::x86_64:
2945 IsBaseFound = AddGnuCPlusPlusIncludePaths(
2946 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
2947 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
2948 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
2949 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
2952 case llvm::Triple::arm:
2953 case llvm::Triple::thumb:
2955 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2956 "arm-apple-darwin10",
"v7");
2958 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2959 "arm-apple-darwin10",
"v6");
2962 case llvm::Triple::aarch64:
2964 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2965 "arm64-apple-darwin10",
"");
2975 ArgStringList &CmdArgs)
const {
2980 CmdArgs.push_back(
"-lc++");
2981 if (Args.hasArg(options::OPT_fexperimental_library))
2982 CmdArgs.push_back(
"-lc++experimental");
2992 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2994 llvm::sys::path::append(P,
"usr",
"lib",
"libstdc++.dylib");
2996 if (!
getVFS().exists(P)) {
2997 llvm::sys::path::remove_filename(P);
2998 llvm::sys::path::append(P,
"libstdc++.6.dylib");
2999 if (
getVFS().exists(P)) {
3000 CmdArgs.push_back(Args.MakeArgString(P));
3009 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
3010 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
3011 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
3016 CmdArgs.push_back(
"-lstdc++");
3022 ArgStringList &CmdArgs)
const {
3028 llvm::sys::path::append(P,
"lib",
"darwin");
3032 llvm::sys::path::append(P,
"libclang_rt.cc_kext_watchos.a");
3034 llvm::sys::path::append(P,
"libclang_rt.cc_kext_tvos.a");
3036 llvm::sys::path::append(P,
"libclang_rt.cc_kext_ios.a");
3040 llvm::sys::path::append(
3041 P, llvm::Twine(
"libclang_rt.cc_kext_") +
3042 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
3044 llvm::sys::path::append(P,
"libclang_rt.cc_kext.a");
3050 CmdArgs.push_back(Args.MakeArgString(P));
3054 StringRef BoundArch,
3056 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
3066 for (Arg *A : Args) {
3075 case options::OPT_mkernel:
3076 case options::OPT_fapple_kext:
3078 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
3081 case options::OPT_dependency_file:
3082 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
3085 case options::OPT_gfull:
3086 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3088 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
3091 case options::OPT_gused:
3092 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
3094 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
3097 case options::OPT_shared:
3098 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
3101 case options::OPT_fconstant_cfstrings:
3102 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
3105 case options::OPT_fno_constant_cfstrings:
3106 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
3109 case options::OPT_Wnonportable_cfstrings:
3111 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
3114 case options::OPT_Wno_nonportable_cfstrings:
3116 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
3123 if (!BoundArch.empty()) {
3124 StringRef Name = BoundArch;
3125 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
3126 const Option MArch = Opts.getOption(options::OPT_march_EQ);
3132 else if (Name ==
"ppc601")
3133 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
3134 else if (Name ==
"ppc603")
3135 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3136 else if (Name ==
"ppc604")
3137 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3138 else if (Name ==
"ppc604e")
3139 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3140 else if (Name ==
"ppc750")
3141 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3142 else if (Name ==
"ppc7400")
3143 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3144 else if (Name ==
"ppc7450")
3145 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3146 else if (Name ==
"ppc970")
3147 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3149 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3150 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3152 else if (Name ==
"i386")
3154 else if (Name ==
"i486")
3155 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3156 else if (Name ==
"i586")
3157 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3158 else if (Name ==
"i686")
3159 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3160 else if (Name ==
"pentium")
3161 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3162 else if (Name ==
"pentium2")
3163 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3164 else if (Name ==
"pentpro")
3165 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3166 else if (Name ==
"pentIIm3")
3167 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3169 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3170 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3172 else if (Name ==
"arm")
3173 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3174 else if (Name ==
"armv4t")
3175 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3176 else if (Name ==
"armv5")
3177 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3178 else if (Name ==
"xscale")
3179 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3180 else if (Name ==
"armv6")
3181 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3182 else if (Name ==
"armv6m")
3183 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3184 else if (Name ==
"armv7")
3185 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3186 else if (Name ==
"armv7em")
3187 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3188 else if (Name ==
"armv7k")
3189 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3190 else if (Name ==
"armv7m")
3191 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3192 else if (Name ==
"armv7s")
3193 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3200 ArgStringList &CmdArgs,
3201 bool ForceLinkBuiltinRT)
const {
3210 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3216 llvm::Triple::OSType OS;
3222 OS = llvm::Triple::MacOSX;
3225 OS = llvm::Triple::IOS;
3228 OS = llvm::Triple::TvOS;
3231 OS = llvm::Triple::WatchOS;
3247 switch (SDKInfo->getEnvironment()) {
3248 case llvm::Triple::UnknownEnvironment:
3249 case llvm::Triple::Simulator:
3250 case llvm::Triple::MacABI:
3259 VersionTuple SDKVersion = SDKInfo->getVersion();
3260 switch (SDKInfo->getOS()) {
3263 case llvm::Triple::MacOSX:
3264 return SDKVersion >= VersionTuple(15U);
3265 case llvm::Triple::IOS:
3266 return SDKVersion >= VersionTuple(18U);
3267 case llvm::Triple::TvOS:
3268 return SDKVersion >= VersionTuple(18U);
3269 case llvm::Triple::WatchOS:
3270 return SDKVersion >= VersionTuple(11U);
3271 case llvm::Triple::XROS:
3272 return SDKVersion >= VersionTuple(2U);
3280static inline llvm::VersionTuple
3285 case llvm::Triple::Darwin:
3286 case llvm::Triple::MacOSX:
3287 return llvm::VersionTuple(10U, 12U);
3288 case llvm::Triple::IOS:
3289 case llvm::Triple::TvOS:
3290 return llvm::VersionTuple(10U);
3291 case llvm::Triple::WatchOS:
3292 return llvm::VersionTuple(3U);
3295 llvm_unreachable(
"Unexpected OS");
3299 llvm::Triple::OSType OS;
3305 OS = llvm::Triple::MacOSX;
3308 OS = llvm::Triple::IOS;
3311 OS = llvm::Triple::TvOS;
3314 OS = llvm::Triple::WatchOS;
3325 llvm::opt::ArgStringList &CC1Args,
3334 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3335 options::OPT_fno_ptrauth_calls))
3336 CC1Args.push_back(
"-fptrauth-calls");
3337 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3338 options::OPT_fno_ptrauth_returns))
3339 CC1Args.push_back(
"-fptrauth-returns");
3340 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3341 options::OPT_fno_ptrauth_intrinsics))
3342 CC1Args.push_back(
"-fptrauth-intrinsics");
3343 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3344 options::OPT_fno_ptrauth_indirect_gotos))
3345 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3346 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3347 options::OPT_fno_ptrauth_auth_traps))
3348 CC1Args.push_back(
"-fptrauth-auth-traps");
3351 if (!DriverArgs.hasArg(
3352 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3353 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3354 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3355 if (!DriverArgs.hasArg(
3356 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3357 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3358 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3361 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3362 options::OPT_fno_ptrauth_objc_isa))
3363 CC1Args.push_back(
"-fptrauth-objc-isa");
3364 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3365 options::OPT_fno_ptrauth_objc_class_ro))
3366 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3367 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3368 options::OPT_fno_ptrauth_objc_interface_sel))
3369 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3374 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3381 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3382 options::OPT_fno_aligned_allocation) &&
3384 CC1Args.push_back(
"-faligned-alloc-unavailable");
3388 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3389 options::OPT_fno_sized_deallocation) &&
3391 CC1Args.push_back(
"-fno-sized-deallocation");
3398 if (!
SDKInfo->getFilePath().empty()) {
3400 ExtraDepOpt +=
SDKInfo->getFilePath();
3401 CC1Args.push_back(DriverArgs.MakeArgString(ExtraDepOpt));
3407 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3411 if (!DriverArgs.getLastArgNoClaim(
3412 options::OPT_fvisibility_inlines_hidden_static_local_var,
3413 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3414 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3428 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3430 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3431 options::OPT_fno_define_target_os_macros))
3432 CC1Args.push_back(
"-fdefine-target-os-macros");
3436 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3437 options::OPT_fno_modulemap_allow_subdirectory_search,
3439 bool RequiresSubdirectorySearch;
3440 VersionTuple SDKVersion =
SDKInfo->getVersion();
3443 RequiresSubdirectorySearch =
true;
3446 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3450 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3453 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3456 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3459 if (!RequiresSubdirectorySearch)
3460 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3465 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3467 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3474 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3476 llvm::raw_string_ostream OS(Arg);
3477 OS <<
"-target-sdk-version=" <<
V;
3478 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3482 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3484 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3487 EmitTargetSDKVersionArg(
3491 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3499 llvm::raw_string_ostream OS(Arg);
3500 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3501 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3502 }
else if (
const auto *MacOStoMacCatalystMapping =
3505 if (std::optional<VersionTuple> SDKVersion =
3506 MacOStoMacCatalystMapping->map(
3510 llvm::raw_string_ostream OS(Arg);
3511 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3512 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3523 DerivedArgList *DAL =
3527 if (BoundArch.empty())
3533 AddDeploymentTarget(*DAL);
3541 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3544 if (A->getOption().getID() != options::OPT_mkernel &&
3545 A->getOption().getID() != options::OPT_fapple_kext)
3547 assert(it != ie &&
"unexpected argument translation");
3549 assert(A->getOption().getID() == options::OPT_static &&
3550 "missing expected -static argument");
3557 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3558 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3559 options::OPT_fno_omit_frame_pointer,
false))
3560 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3561 <<
"-fomit-frame-pointer" << BoundArch;
3570 if (
getArch() == llvm::Triple::x86_64 ||
3572 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3574 return (
getArch() == llvm::Triple::aarch64 ||
3575 getArch() == llvm::Triple::aarch64_32)
3583 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3584 return S[0] !=
'\0';
3589 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3598 return llvm::ExceptionHandling::None;
3602 if (Triple.isWatchABI())
3603 return llvm::ExceptionHandling::DwarfCFI;
3605 return llvm::ExceptionHandling::SjLj;
3620 return (
getArch() == llvm::Triple::x86_64 ||
3621 getArch() == llvm::Triple::aarch64);
3630 ArgStringList &CmdArgs)
const {
3633 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3636 CmdArgs.push_back(
"-watchos_version_min");
3638 CmdArgs.push_back(
"-watchos_simulator_version_min");
3640 CmdArgs.push_back(
"-tvos_version_min");
3642 CmdArgs.push_back(
"-tvos_simulator_version_min");
3644 CmdArgs.push_back(
"-driverkit_version_min");
3646 CmdArgs.push_back(
"-ios_simulator_version_min");
3648 CmdArgs.push_back(
"-iphoneos_version_min");
3650 CmdArgs.push_back(
"-maccatalyst_version_min");
3653 CmdArgs.push_back(
"-macosx_version_min");
3659 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3662 VersionTuple VariantTargetVersion;
3664 CmdArgs.push_back(
"-macosx_version_min");
3669 "unexpected target variant triple");
3670 CmdArgs.push_back(
"-maccatalyst_version_min");
3673 VersionTuple MinTgtVers =
3675 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3676 VariantTargetVersion = MinTgtVers;
3677 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3688 return "mac catalyst";
3701 llvm_unreachable(
"invalid platform");
3705 llvm::opt::ArgStringList &CmdArgs)
const {
3710 auto EmitPlatformVersionArg =
3713 const llvm::Triple &TT) {
3716 CmdArgs.push_back(
"-platform_version");
3717 std::string PlatformName =
3720 PlatformName +=
"-simulator";
3721 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3730 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3733 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3738 std::optional<VersionTuple> iOSSDKVersion;
3740 if (
const auto *MacOStoMacCatalystMapping =
3743 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3744 SDKInfo->getVersion().withoutBuild(),
3748 CmdArgs.push_back(Args.MakeArgString(
3749 (iOSSDKVersion ? *iOSSDKVersion
3756 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3757 if (!SDKVersion.getMinor())
3758 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3759 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3770 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3779 VersionTuple TargetVariantVersion;
3787 "unexpected target variant triple");
3792 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3798 ArgStringList &CmdArgs) {
3802 CmdArgs.push_back(
"-ldylib1.o");
3809 CmdArgs.push_back(
"-ldylib1.o");
3811 CmdArgs.push_back(
"-ldylib1.10.5.o");
3816 ArgStringList &CmdArgs) {
3817 if (Args.hasArg(options::OPT_static))
3822 CmdArgs.push_back(
"-lbundle1.o");
3827 ArgStringList &CmdArgs) {
3829 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3830 Args.hasArg(options::OPT_preload)) {
3831 CmdArgs.push_back(
"-lgcrt0.o");
3833 CmdArgs.push_back(
"-lgcrt1.o");
3843 CmdArgs.push_back(
"-no_new_main");
3845 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3851 ArgStringList &CmdArgs) {
3854 if (D.
getArch() == llvm::Triple::aarch64)
3857 CmdArgs.push_back(
"-lcrt1.o");
3859 CmdArgs.push_back(
"-lcrt1.3.1.o");
3866 CmdArgs.push_back(
"-lcrt1.o");
3868 CmdArgs.push_back(
"-lcrt1.10.5.o");
3870 CmdArgs.push_back(
"-lcrt1.10.6.o");
3875 ArgStringList &CmdArgs)
const {
3881 if (Args.hasArg(options::OPT_dynamiclib))
3883 else if (Args.hasArg(options::OPT_bundle))
3887 else if (Args.hasArg(options::OPT_static) ||
3888 Args.hasArg(options::OPT_object) ||
3889 Args.hasArg(options::OPT_preload))
3890 CmdArgs.push_back(
"-lcrt0.o");
3894 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
3896 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
3897 CmdArgs.push_back(Str);
3909 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
3910 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
3912 Res |= SanitizerKind::Address;
3913 Res |= SanitizerKind::PointerCompare;
3914 Res |= SanitizerKind::PointerSubtract;
3915 Res |= SanitizerKind::Realtime;
3916 Res |= SanitizerKind::Leak;
3917 Res |= SanitizerKind::Fuzzer;
3918 Res |= SanitizerKind::FuzzerNoLink;
3919 Res |= SanitizerKind::ObjCCast;
3926 Res |= SanitizerKind::Vptr;
3928 if ((IsX86_64 || IsAArch64) &&
3931 Res |= SanitizerKind::Thread;
3935 Res |= SanitizerKind::Type;
3939 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()