13#include "clang/Config/config.h"
19#include "llvm/ADT/StringSwitch.h"
20#include "llvm/Option/ArgList.h"
21#include "llvm/ProfileData/InstrProf.h"
22#include "llvm/ProfileData/MemProf.h"
23#include "llvm/Support/Path.h"
24#include "llvm/Support/Threading.h"
25#include "llvm/Support/VirtualFileSystem.h"
26#include "llvm/TargetParser/TargetParser.h"
27#include "llvm/TargetParser/Triple.h"
37 return VersionTuple(13, 1);
53 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
54 .Cases(
"i386",
"i486",
"i486SX",
"i586",
"i686", llvm::Triple::x86)
55 .Cases(
"pentium",
"pentpro",
"pentIIm3",
"pentIIm5",
"pentium4",
57 .Cases(
"x86_64",
"x86_64h", llvm::Triple::x86_64)
59 .Cases(
"arm",
"armv4t",
"armv5",
"armv6",
"armv6m", llvm::Triple::arm)
60 .Cases(
"armv7",
"armv7em",
"armv7k",
"armv7m", llvm::Triple::arm)
61 .Cases(
"armv7s",
"xscale", llvm::Triple::arm)
62 .Cases(
"arm64",
"arm64e", llvm::Triple::aarch64)
63 .Case(
"arm64_32", llvm::Triple::aarch64_32)
64 .Case(
"r600", llvm::Triple::r600)
65 .Case(
"amdgcn", llvm::Triple::amdgcn)
66 .Case(
"nvptx", llvm::Triple::nvptx)
67 .Case(
"nvptx64", llvm::Triple::nvptx64)
68 .Case(
"amdil", llvm::Triple::amdil)
69 .Case(
"spir", llvm::Triple::spir)
70 .Default(llvm::Triple::UnknownArch);
74 const ArgList &Args) {
75 const llvm::Triple::ArchType
Arch = getArchTypeForMachOArchName(Str);
76 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
78 if (
Arch != llvm::Triple::UnknownArch)
81 if (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
82 ArchKind == llvm::ARM::ArchKind::ARMV7M ||
83 ArchKind == llvm::ARM::ArchKind::ARMV7EM) {
85 if (
T.getOS() == llvm::Triple::IOS)
86 for (Arg *A : Args.filtered(options::OPT_mios_version_min_EQ))
87 A->ignoreTargetSpecific();
88 if (
T.getOS() == llvm::Triple::WatchOS)
89 for (Arg *A : Args.filtered(options::OPT_mwatchos_version_min_EQ))
90 A->ignoreTargetSpecific();
91 if (
T.getOS() == llvm::Triple::TvOS)
92 for (Arg *A : Args.filtered(options::OPT_mtvos_version_min_EQ))
93 A->ignoreTargetSpecific();
95 T.setOS(llvm::Triple::UnknownOS);
96 T.setObjectFormat(llvm::Triple::MachO);
104 const char *LinkingOutput)
const {
107 ArgStringList CmdArgs;
109 assert(Inputs.size() == 1 &&
"Unexpected number of inputs.");
113 const Action *SourceAction = &JA;
115 assert(!SourceAction->
getInputs().empty() &&
"unexpected root action!");
116 SourceAction = SourceAction->
getInputs()[0];
124 if (Args.hasArg(options::OPT_fno_integrated_as)) {
125 if (!(
T.isMacOSX() &&
T.isMacOSXVersionLT(10, 7)))
126 CmdArgs.push_back(
"-Q");
130 if (SourceAction->
getType() == types::TY_Asm ||
131 SourceAction->
getType() == types::TY_PP_Asm) {
132 if (Args.hasArg(options::OPT_gstabs))
133 CmdArgs.push_back(
"--gstabs");
134 else if (Args.hasArg(options::OPT_g_Group))
135 CmdArgs.push_back(
"-g");
142 if (
T.isX86() || Args.hasArg(options::OPT_force__cpusubtype__ALL))
143 CmdArgs.push_back(
"-force_cpusubtype_ALL");
146 (((Args.hasArg(options::OPT_mkernel) ||
147 Args.hasArg(options::OPT_fapple_kext)) &&
149 Args.hasArg(options::OPT_static)))
150 CmdArgs.push_back(
"-static");
152 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
154 assert(Output.
isFilename() &&
"Unexpected lipo output.");
155 CmdArgs.push_back(
"-o");
158 assert(Input.
isFilename() &&
"Invalid input.");
163 const char *Exec = Args.MakeArgString(
getToolChain().GetProgramPath(
"as"));
165 Exec, CmdArgs, Inputs, Output));
168void darwin::MachOTool::anchor() {}
171 ArgStringList &CmdArgs)
const {
172 StringRef
ArchName = getMachOToolChain().getMachOArchName(Args);
175 CmdArgs.push_back(
"-arch");
176 CmdArgs.push_back(Args.MakeArgString(
ArchName));
180 CmdArgs.push_back(
"-force_cpusubtype_ALL");
183bool darwin::Linker::NeedsTempPath(
const InputInfoList &Inputs)
const {
187 for (
const auto &Input : Inputs)
188 if (Input.getType() != types::TY_Object)
202 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
203 if (A->getOption().matches(options::OPT_O0))
205 if (A->getOption().matches(options::OPT_O))
206 return llvm::StringSwitch<bool>(A->getValue())
212 if (!IsLinkerOnlyAction)
217void darwin::Linker::AddLinkArgs(
Compilation &
C,
const ArgList &Args,
218 ArgStringList &CmdArgs,
220 VersionTuple Version,
bool LinkerIsLLD,
221 bool UsePlatformVersion)
const {
222 const Driver &
D = getToolChain().getDriver();
227 if ((Version >= VersionTuple(100) || LinkerIsLLD) &&
228 !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
229 CmdArgs.push_back(
"-demangle");
231 if (Args.hasArg(options::OPT_rdynamic) &&
232 (Version >= VersionTuple(137) || LinkerIsLLD))
233 CmdArgs.push_back(
"-export_dynamic");
237 if (Args.hasFlag(options::OPT_fapplication_extension,
238 options::OPT_fno_application_extension,
false))
239 CmdArgs.push_back(
"-application_extension");
241 if (
D.isUsingLTO() && (Version >= VersionTuple(116) || LinkerIsLLD) &&
242 NeedsTempPath(Inputs)) {
243 std::string TmpPathName;
252 TmpPathName =
D.GetTemporaryDirectory(
"thinlto");
254 if (!TmpPathName.empty()) {
255 auto *TmpPath =
C.getArgs().MakeArgString(TmpPathName);
256 C.addTempFile(TmpPath);
257 CmdArgs.push_back(
"-object_path_lto");
258 CmdArgs.push_back(TmpPath);
271 if (Version >= VersionTuple(133) && !LinkerIsLLD) {
273 StringRef
P = llvm::sys::path::parent_path(
D.Dir);
275 llvm::sys::path::append(LibLTOPath,
"lib");
276 llvm::sys::path::append(LibLTOPath,
"libLTO.dylib");
277 CmdArgs.push_back(
"-lto_library");
278 CmdArgs.push_back(
C.getArgs().MakeArgString(LibLTOPath));
284 if (Version >= VersionTuple(262) &&
286 CmdArgs.push_back(
"-no_deduplicate");
289 Args.AddAllArgs(CmdArgs, options::OPT_static);
290 if (!Args.hasArg(options::OPT_static))
291 CmdArgs.push_back(
"-dynamic");
292 if (Args.hasArg(options::OPT_fgnu_runtime)) {
297 if (!Args.hasArg(options::OPT_dynamiclib)) {
298 AddMachOArch(Args, CmdArgs);
300 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
302 Args.AddLastArg(CmdArgs, options::OPT_bundle);
303 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
304 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
307 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
308 (A = Args.getLastArg(options::OPT_current__version)) ||
309 (A = Args.getLastArg(options::OPT_install__name)))
310 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
313 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
314 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
315 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
317 CmdArgs.push_back(
"-dylib");
320 if ((A = Args.getLastArg(options::OPT_bundle)) ||
321 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
322 (A = Args.getLastArg(options::OPT_client__name)) ||
323 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
324 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
325 (A = Args.getLastArg(options::OPT_private__bundle)))
326 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
329 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
330 "-dylib_compatibility_version");
331 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
332 "-dylib_current_version");
334 AddMachOArch(Args, CmdArgs);
336 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
337 "-dylib_install_name");
340 Args.AddLastArg(CmdArgs, options::OPT_all__load);
341 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
342 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
344 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
345 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
346 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
347 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
348 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
349 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
350 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
351 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
352 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
353 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
354 Args.AddAllArgs(CmdArgs, options::OPT_init);
357 if (Version >= VersionTuple(520) || LinkerIsLLD || UsePlatformVersion)
362 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
363 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
364 Args.AddLastArg(CmdArgs, options::OPT_single__module);
365 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
366 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
369 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
370 options::OPT_fno_pie, options::OPT_fno_PIE)) {
371 if (A->getOption().matches(options::OPT_fpie) ||
372 A->getOption().matches(options::OPT_fPIE))
373 CmdArgs.push_back(
"-pie");
375 CmdArgs.push_back(
"-no_pie");
379 if (
C.getDriver().embedBitcodeEnabled()) {
382 CmdArgs.push_back(
"-bitcode_bundle");
384 if (
C.getDriver().embedBitcodeMarkerOnly() &&
385 Version >= VersionTuple(278)) {
386 CmdArgs.push_back(
"-bitcode_process_mode");
387 CmdArgs.push_back(
"marker");
390 D.Diag(diag::err_drv_bitcode_unsupported_on_toolchain);
394 if (Arg *A = Args.getLastArg(options::OPT_fglobal_isel,
395 options::OPT_fno_global_isel)) {
396 if (A->getOption().matches(options::OPT_fglobal_isel)) {
397 CmdArgs.push_back(
"-mllvm");
398 CmdArgs.push_back(
"-global-isel");
400 CmdArgs.push_back(
"-mllvm");
401 CmdArgs.push_back(
"-global-isel-abort=0");
405 if (Args.hasArg(options::OPT_mkernel) ||
406 Args.hasArg(options::OPT_fapple_kext) ||
407 Args.hasArg(options::OPT_ffreestanding)) {
408 CmdArgs.push_back(
"-mllvm");
409 CmdArgs.push_back(
"-disable-atexit-based-global-dtor-lowering");
412 Args.AddLastArg(CmdArgs, options::OPT_prebind);
413 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
414 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
415 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
416 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
417 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
418 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
419 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
420 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
421 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
422 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
423 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
424 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
425 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
426 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
427 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
433 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ)) {
434 CmdArgs.push_back(
"-syslibroot");
435 CmdArgs.push_back(A->getValue());
436 }
else if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
437 CmdArgs.push_back(
"-syslibroot");
438 CmdArgs.push_back(A->getValue());
439 }
else if (StringRef sysroot =
C.getSysRoot(); sysroot !=
"") {
440 CmdArgs.push_back(
"-syslibroot");
441 CmdArgs.push_back(
C.getArgs().MakeArgString(sysroot));
444 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
445 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
446 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
447 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
448 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
449 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
450 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
451 Args.AddAllArgs(CmdArgs, options::OPT_y);
452 Args.AddLastArg(CmdArgs, options::OPT_w);
453 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
454 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
455 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
456 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
457 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
458 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
459 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
460 Args.AddLastArg(CmdArgs, options::OPT_why_load);
461 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
462 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
463 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
464 Args.AddLastArg(CmdArgs, options::OPT_Mach);
470 : CSPGOGenerateArg->getValue());
471 llvm::sys::path::append(
Path,
"default_%m.profraw");
472 CmdArgs.push_back(
"--cs-profile-generate");
473 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") +
Path));
476 ProfileUseArg->getNumValues() == 0 ?
"" : ProfileUseArg->getValue());
477 if (
Path.empty() || llvm::sys::fs::is_directory(
Path))
478 llvm::sys::path::append(
Path,
"default.profdata");
479 CmdArgs.push_back(Args.MakeArgString(Twine(
"--cs-profile-path=") +
Path));
482 auto *CodeGenDataGenArg =
483 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
484 if (CodeGenDataGenArg)
486 Args.MakeArgString(Twine(
"--codegen-data-generate-path=") +
487 CodeGenDataGenArg->getValue()));
494 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
497 return Args.hasArg(options::OPT_fobjc_link_runtime);
501 const llvm::Triple &Triple) {
506 Args.getAllArgValues(options::OPT_arch).size() > 1;
507 bool hasExplicitOutputFile =
508 Args.getLastArg(options::OPT_foptimization_record_file_EQ);
510 D.Diag(diag::err_drv_invalid_output_with_multiple_archs)
511 <<
"-foptimization-record-file";
518 const llvm::Triple &Triple,
520 StringRef Format =
"yaml";
521 if (
const Arg *A = Args.getLastArg(options::OPT_fsave_optimization_record_EQ))
522 Format = A->getValue();
524 CmdArgs.push_back(
"-mllvm");
525 CmdArgs.push_back(
"-lto-pass-remarks-output");
526 CmdArgs.push_back(
"-mllvm");
528 const Arg *A = Args.getLastArg(options::OPT_foptimization_record_file_EQ);
530 CmdArgs.push_back(A->getValue());
532 assert(Output.
isFilename() &&
"Unexpected ld output.");
538 CmdArgs.push_back(Args.MakeArgString(F));
542 Args.getLastArg(options::OPT_foptimization_record_passes_EQ)) {
543 CmdArgs.push_back(
"-mllvm");
545 std::string(
"-lto-pass-remarks-filter=") + A->getValue();
546 CmdArgs.push_back(Args.MakeArgString(Passes));
549 if (!Format.empty()) {
550 CmdArgs.push_back(
"-mllvm");
551 Twine FormatArg = Twine(
"-lto-pass-remarks-format=") + Format;
552 CmdArgs.push_back(Args.MakeArgString(FormatArg));
556 CmdArgs.push_back(
"-mllvm");
557 CmdArgs.push_back(
"-lto-pass-remarks-with-hotness");
560 Args.getLastArg(options::OPT_fdiagnostics_hotness_threshold_EQ)) {
561 CmdArgs.push_back(
"-mllvm");
563 std::string(
"-lto-pass-remarks-hotness-threshold=") + A->getValue();
564 CmdArgs.push_back(Args.MakeArgString(Opt));
575 const char *LinkingOutput)
const {
576 assert(Output.
getType() == types::TY_Image &&
"Invalid linker output type.");
582 llvm::opt::ArgStringList InputFileList;
587 ArgStringList CmdArgs;
589 VersionTuple Version = getMachOToolChain().getLinkerVersion(Args);
593 Args.MakeArgString(getToolChain().GetLinkerPath(&LinkerIsLLD));
596 bool UsePlatformVersion = getToolChain().getTriple().isXROS();
600 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
605 getToolChain().getTriple()))
610 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
611 if (A->getOption().matches(options::OPT_moutline)) {
612 if (getMachOToolChain().getMachOArchName(Args) ==
"arm64") {
613 CmdArgs.push_back(
"-mllvm");
614 CmdArgs.push_back(
"-enable-machine-outliner");
620 CmdArgs.push_back(
"-mllvm");
621 CmdArgs.push_back(
"-enable-machine-outliner=never");
628 CmdArgs.push_back(
"-mllvm");
629 CmdArgs.push_back(
"-enable-linkonceodr-outlining");
632 auto *CodeGenDataGenArg =
633 Args.getLastArg(options::OPT_fcodegen_data_generate_EQ);
634 auto *CodeGenDataUseArg = Args.getLastArg(options::OPT_fcodegen_data_use_EQ);
637 const Driver &
D = getToolChain().getDriver();
638 if (CodeGenDataGenArg && CodeGenDataUseArg)
639 D.Diag(diag::err_drv_argument_not_allowed_with)
640 << CodeGenDataGenArg->getAsString(Args)
641 << CodeGenDataUseArg->getAsString(Args);
645 if (CodeGenDataGenArg) {
646 CmdArgs.push_back(
"-mllvm");
647 CmdArgs.push_back(
"-codegen-data-generate");
651 if (CodeGenDataUseArg) {
652 CmdArgs.push_back(
"-mllvm");
653 CmdArgs.push_back(Args.MakeArgString(Twine(
"-codegen-data-use-path=") +
654 CodeGenDataUseArg->getValue()));
660 if (!StatsFile.empty()) {
661 CmdArgs.push_back(
"-mllvm");
662 CmdArgs.push_back(Args.MakeArgString(
"-lto-stats-file=" + StatsFile.str()));
667 Args.addAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
668 options::OPT_Z_Flag, options::OPT_u_Group});
673 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
674 CmdArgs.push_back(
"-ObjC");
676 CmdArgs.push_back(
"-o");
679 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
680 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
682 Args.AddAllArgs(CmdArgs, options::OPT_L);
687 for (
const auto &II : Inputs) {
688 if (!II.isFilename()) {
693 if (InputFileList.size() > 0)
699 InputFileList.push_back(II.getFilename());
704 if (getToolChain().getDriver().IsFlangMode() &&
705 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
706 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
707 getToolChain().addFortranRuntimeLibs(Args, CmdArgs);
710 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
714 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
716 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
718 CmdArgs.push_back(
"-framework");
719 CmdArgs.push_back(
"Foundation");
721 CmdArgs.push_back(
"-lobjc");
725 CmdArgs.push_back(
"-arch_multiple");
726 CmdArgs.push_back(
"-final_output");
727 CmdArgs.push_back(LinkingOutput);
730 if (Args.hasArg(options::OPT_fnested_functions))
731 CmdArgs.push_back(
"-allow_stack_execute");
733 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
736 if (!Parallelism.empty()) {
737 CmdArgs.push_back(
"-mllvm");
738 unsigned NumThreads =
739 llvm::get_threadpool_strategy(Parallelism)->compute_thread_count();
740 CmdArgs.push_back(Args.MakeArgString(
"-threads=" + Twine(NumThreads)));
743 if (getToolChain().ShouldLinkCXXStdlib(Args))
744 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
746 bool NoStdOrDefaultLibs =
747 Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
748 bool ForceLinkBuiltins = Args.hasArg(options::OPT_fapple_link_rtlib);
749 if (!NoStdOrDefaultLibs || ForceLinkBuiltins) {
754 if (NoStdOrDefaultLibs && ForceLinkBuiltins) {
755 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
"builtins");
758 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs,
762 Args.ClaimAllArgs(options::OPT_pthread);
763 Args.ClaimAllArgs(options::OPT_pthreads);
767 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
771 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
772 Args.AddAllArgs(CmdArgs, options::OPT_F);
775 for (
const Arg *A : Args.filtered(options::OPT_iframework))
776 CmdArgs.push_back(Args.MakeArgString(std::string(
"-F") + A->getValue()));
778 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
779 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
780 if (A->getValue() == StringRef(
"Accelerate")) {
781 CmdArgs.push_back(
"-framework");
782 CmdArgs.push_back(
"Accelerate");
791 bool NonStandardSearchPath =
false;
792 const auto &Triple = getToolChain().getTriple();
793 if (Triple.isDriverKit()) {
795 NonStandardSearchPath =
796 Version.getMajor() < 605 ||
797 (Version.getMajor() == 605 && Version.getMinor().value_or(0) < 1);
800 if (NonStandardSearchPath) {
801 if (
auto *Sysroot = Args.getLastArg(options::OPT_isysroot)) {
802 auto AddSearchPath = [&](StringRef Flag, StringRef SearchPath) {
805 llvm::sys::path::append(
P, SearchPath);
806 if (getToolChain().getVFS().exists(
P)) {
807 CmdArgs.push_back(Args.MakeArgString(Flag +
P));
810 AddSearchPath(
"-L",
"/usr/lib");
811 AddSearchPath(
"-F",
"/System/Library/Frameworks");
817 if (Version >= VersionTuple(705) || LinkerIsLLD) {
825 std::unique_ptr<Command>
Cmd = std::make_unique<Command>(
826 JA, *
this, ResponseSupport, Exec, CmdArgs, Inputs, Output);
827 Cmd->setInputFileList(std::move(InputFileList));
828 C.addCommand(std::move(
Cmd));
835 const char *LinkingOutput)
const {
836 const Driver &
D = getToolChain().getDriver();
839 Args.ClaimAllArgs(options::OPT_g_Group);
841 Args.ClaimAllArgs(options::OPT_emit_llvm);
844 Args.ClaimAllArgs(options::OPT_w);
846 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
849 ArgStringList CmdArgs;
851 CmdArgs.push_back(
"-static");
852 CmdArgs.push_back(
"-D");
853 CmdArgs.push_back(
"-no_warning_for_no_symbols");
854 CmdArgs.push_back(
"-o");
857 for (
const auto &II : Inputs) {
858 if (II.isFilename()) {
859 CmdArgs.push_back(II.getFilename());
866 if (Output.
isFilename() && llvm::sys::fs::exists(OutputFileName)) {
867 if (std::error_code EC = llvm::sys::fs::remove(OutputFileName)) {
868 D.Diag(diag::err_drv_unable_to_remove_file) << EC.message();
873 const char *Exec = Args.MakeArgString(getToolChain().GetStaticLibToolPath());
874 C.addCommand(std::make_unique<Command>(JA, *
this,
876 Exec, CmdArgs, Inputs, Output));
883 const char *LinkingOutput)
const {
884 ArgStringList CmdArgs;
886 CmdArgs.push_back(
"-create");
887 assert(Output.
isFilename() &&
"Unexpected lipo output.");
889 CmdArgs.push_back(
"-output");
892 for (
const auto &II : Inputs) {
893 assert(II.isFilename() &&
"Unexpected lipo input.");
894 CmdArgs.push_back(II.getFilename());
897 StringRef LipoName = Args.getLastArgValue(options::OPT_fuse_lipo_EQ,
"lipo");
899 Args.MakeArgString(getToolChain().GetProgramPath(LipoName.data()));
901 Exec, CmdArgs, Inputs, Output));
908 const char *LinkingOutput)
const {
909 ArgStringList CmdArgs;
911 CmdArgs.push_back(
"-o");
914 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
916 assert(Input.
isFilename() &&
"Unexpected dsymutil input.");
920 Args.MakeArgString(getToolChain().GetProgramPath(
"dsymutil"));
922 Exec, CmdArgs, Inputs, Output));
929 const char *LinkingOutput)
const {
930 ArgStringList CmdArgs;
931 CmdArgs.push_back(
"--verify");
932 CmdArgs.push_back(
"--debug-info");
933 CmdArgs.push_back(
"--eh-frame");
934 CmdArgs.push_back(
"--quiet");
936 assert(Inputs.size() == 1 &&
"Unable to handle multiple inputs.");
938 assert(Input.
isFilename() &&
"Unexpected verify input");
944 Args.MakeArgString(getToolChain().GetProgramPath(
"dwarfdump"));
946 Exec, CmdArgs, Inputs, Output));
957 :
MachO(
D, Triple, Args), CudaInstallation(
D, Triple, Args),
958 RocmInstallation(
D, Triple, Args), SYCLInstallation(
D, Triple, Args) {}
968 if (Ty == types::TY_PP_Asm)
969 return types::TY_Asm;
989 auto T = llvm::Triple(Twine(
"arm64-apple-") +
990 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
1012 ArgStringList &CC1Args)
const {
1017 ArgStringList &CC1Args)
const {
1022 ArgStringList &CC1Args)
const {
1031 return llvm::StringSwitch<const char *>(
Arch)
1032 .Case(
"armv6k",
"armv6")
1033 .Case(
"armv6m",
"armv6m")
1034 .Case(
"armv5tej",
"armv5")
1035 .Case(
"xscale",
"xscale")
1036 .Case(
"armv4t",
"armv4t")
1037 .Case(
"armv7",
"armv7")
1038 .Cases(
"armv7a",
"armv7-a",
"armv7")
1039 .Cases(
"armv7r",
"armv7-r",
"armv7")
1040 .Cases(
"armv7em",
"armv7e-m",
"armv7em")
1041 .Cases(
"armv7k",
"armv7-k",
"armv7k")
1042 .Cases(
"armv7m",
"armv7-m",
"armv7m")
1043 .Cases(
"armv7s",
"armv7-s",
"armv7s")
1048 llvm::ARM::ArchKind ArchKind = llvm::ARM::parseCPUArch(CPU);
1049 if (ArchKind == llvm::ARM::ArchKind::INVALID)
1051 StringRef
Arch = llvm::ARM::getArchName(ArchKind);
1055 if (
Arch.starts_with(
"armv5"))
1058 else if (
Arch.starts_with(
"armv6") && !
Arch.ends_with(
"6m"))
1061 else if (
Arch.ends_with(
"v7a"))
1071 case llvm::Triple::aarch64_32:
1074 case llvm::Triple::aarch64: {
1080 case llvm::Triple::thumb:
1081 case llvm::Triple::arm:
1082 if (
const Arg *A = Args.getLastArg(clang::driver::options::OPT_march_EQ))
1086 if (
const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1095 if (LinkerVersion) {
1097 VersionTuple NewLinkerVersion;
1098 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1099 (void)NewLinkerVersion.tryParse(A->getValue());
1100 assert(NewLinkerVersion == LinkerVersion);
1102 return *LinkerVersion;
1105 VersionTuple NewLinkerVersion;
1106 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ))
1107 if (NewLinkerVersion.tryParse(A->getValue()))
1109 << A->getAsString(Args);
1111 LinkerVersion = NewLinkerVersion;
1112 return *LinkerVersion;
1128 return Triple.getTriple();
1140 Str += llvm::Triple::getOSTypeName(llvm::Triple::XROS);
1144 Triple.setOSName(Str);
1146 return Triple.getTriple();
1158 return Dsymutil.get();
1162 return VerifyDebug.get();
1179 const ArgList &Args)
1184 CC1Args.push_back(
"-Wundef-prefix=TARGET_OS_");
1185 CC1Args.push_back(
"-Werror=undef-prefix");
1191 CC1Args.push_back(
"-Wdeprecated-objc-isa-usage");
1192 CC1Args.push_back(
"-Werror=deprecated-objc-isa-usage");
1197 CC1Args.push_back(
"-Werror=implicit-function-declaration");
1202 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
1212 static constexpr llvm::StringLiteral XcodeAppSuffix(
1213 ".app/Contents/Developer");
1214 size_t Index = PathIntoXcode.find(XcodeAppSuffix);
1215 if (Index == StringRef::npos)
1217 return PathIntoXcode.take_front(Index + XcodeAppSuffix.size());
1221 ArgStringList &CmdArgs)
const {
1240 llvm::sys::path::remove_filename(
P);
1241 llvm::sys::path::remove_filename(
P);
1242 llvm::sys::path::append(
P,
"lib",
"arc");
1249 auto updatePath = [&](
const Arg *A) {
1253 if (XcodePathForSDK.empty())
1256 P = XcodePathForSDK;
1257 llvm::sys::path::append(
P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1262 bool updated =
false;
1263 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot))
1264 updated = updatePath(A);
1267 if (
const Arg *A = Args.getLastArg(options::OPT__sysroot_EQ))
1272 CmdArgs.push_back(
"-force_load");
1273 llvm::sys::path::append(
P,
"libarclite_");
1276 P +=
"watchsimulator";
1280 P +=
"appletvsimulator";
1284 P +=
"iphonesimulator";
1292 getDriver().
Diag(clang::diag::err_drv_darwin_sdk_missing_arclite) <<
P;
1294 CmdArgs.push_back(Args.MakeArgString(
P));
1316 bool IsShared)
const {
1324 const char *LibArg = Args.MakeArgString(
P);
1325 CmdArgs.push_back(LibArg);
1333 assert(StringRef(
P).ends_with(
".dylib") &&
"must be a dynamic library");
1337 CmdArgs.push_back(
"-rpath");
1338 CmdArgs.push_back(
"@executable_path");
1342 CmdArgs.push_back(
"-rpath");
1343 CmdArgs.push_back(Args.MakeArgString(llvm::sys::path::parent_path(
P)));
1350 "it doesn't make sense to ask for the compiler-rt library name as an "
1354 if (Component !=
"builtins") {
1355 MachOLibName +=
'.';
1356 MachOLibName += Component;
1361 llvm::sys::path::append(FullPath,
"lib",
"darwin",
"macho_embedded",
1363 return std::string(FullPath);
1369 "it doesn't make sense to ask for the compiler-rt library name as an "
1373 if (Component !=
"builtins") {
1374 DarwinLibName += Component;
1375 DarwinLibName +=
'_';
1381 llvm::sys::path::append(FullPath,
"lib",
"darwin", DarwinLibName);
1382 return std::string(FullPath);
1402 llvm_unreachable(
"Unsupported platform");
1407 auto BeginSDK = llvm::sys::path::rbegin(isysroot);
1408 auto EndSDK = llvm::sys::path::rend(isysroot);
1409 for (
auto IT = BeginSDK; IT != EndSDK; ++IT) {
1410 StringRef SDK = *IT;
1411 if (SDK.consume_back(
".sdk"))
1438 llvm_unreachable(
"Unsupported platform");
1443 for (Arg *A : Args) {
1444 if (A->getOption().matches(options::OPT_exported__symbols__list))
1446 if (!A->getOption().matches(options::OPT_Wl_COMMA) &&
1447 !A->getOption().matches(options::OPT_Xlinker))
1449 if (A->containsValue(
"-exported_symbols_list") ||
1450 A->containsValue(
"-exported_symbol"))
1458 CmdArgs.push_back(
"-exported_symbol");
1459 CmdArgs.push_back(Symbol);
1469 StringRef Segment, StringRef Section) {
1470 for (
const char *A : {
"-sectalign", Args.MakeArgString(Segment),
1471 Args.MakeArgString(Section),
"0x4000"})
1472 CmdArgs.push_back(A);
1476 ArgStringList &CmdArgs)
const {
1505 for (
auto IPSK : {llvm::IPSK_cnts, llvm::IPSK_bitmap, llvm::IPSK_data}) {
1507 Args, CmdArgs,
"__DATA",
1508 llvm::getInstrProfSectionName(IPSK, llvm::Triple::MachO,
1514void DarwinClang::AddLinkSanitizerLibArgs(
const ArgList &Args,
1515 ArgStringList &CmdArgs,
1516 StringRef Sanitizer,
1517 bool Shared)
const {
1523 const ArgList &Args)
const {
1524 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
1525 StringRef
Value = A->getValue();
1526 if (
Value !=
"compiler-rt" &&
Value !=
"platform")
1527 getDriver().
Diag(clang::diag::err_drv_unsupported_rtlib_for_platform)
1528 <<
Value <<
"darwin";
1535 ArgStringList &CmdArgs,
1536 bool ForceLinkBuiltinRT)
const {
1542 if (Args.hasArg(options::OPT_static) ||
1543 Args.hasArg(options::OPT_fapple_kext) ||
1544 Args.hasArg(options::OPT_mkernel)) {
1545 if (ForceLinkBuiltinRT)
1553 if (
const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
1554 getDriver().
Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
1561 const char *sanitizer =
nullptr;
1563 sanitizer =
"UndefinedBehaviorSanitizer";
1565 sanitizer =
"RealtimeSanitizer";
1567 sanitizer =
"AddressSanitizer";
1569 sanitizer =
"ThreadSanitizer";
1572 getDriver().
Diag(diag::err_drv_unsupported_static_sanitizer_darwin)
1581 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan_abi",
false);
1584 "Static sanitizer runtimes not supported");
1585 AddLinkSanitizerLibArgs(Args, CmdArgs,
"asan");
1590 "Static sanitizer runtimes not supported");
1591 AddLinkSanitizerLibArgs(Args, CmdArgs,
"rtsan");
1594 AddLinkSanitizerLibArgs(Args, CmdArgs,
"lsan");
1597 "Static sanitizer runtimes not supported");
1598 AddLinkSanitizerLibArgs(
1604 "Static sanitizer runtimes not supported");
1605 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tsan");
1608 AddLinkSanitizerLibArgs(Args, CmdArgs,
"tysan");
1609 if (Sanitize.
needsFuzzer() && !Args.hasArg(options::OPT_dynamiclib)) {
1610 AddLinkSanitizerLibArgs(Args, CmdArgs,
"fuzzer",
false);
1617 AddLinkSanitizerLibArgs(Args, CmdArgs,
"stats");
1625 llvm::memprof::getMemprofOptionsSymbolDarwinLinkageName().data());
1635 CmdArgs.push_back(
"-framework");
1636 CmdArgs.push_back(
"DriverKit");
1642 CmdArgs.push_back(
"-lSystem");
1654 CmdArgs.push_back(
"-lgcc_s.1");
1663 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
1664 if (!SystemTriple.isMacOSX())
1665 return std::string(MacOSSDKVersion);
1666 VersionTuple SystemVersion;
1667 SystemTriple.getMacOSXVersion(SystemVersion);
1669 unsigned Major, Minor, Micro;
1673 return std::string(MacOSSDKVersion);
1674 VersionTuple SDKVersion(Major, Minor, Micro);
1676 if (SDKVersion > SystemVersion)
1677 return SystemVersion.getAsString();
1678 return std::string(MacOSSDKVersion);
1685struct DarwinPlatform {
1694 DeploymentTargetEnv,
1704 DarwinPlatformKind getPlatform()
const {
return Platform; }
1706 DarwinEnvironmentKind getEnvironment()
const {
return Environment; }
1708 void setEnvironment(DarwinEnvironmentKind
Kind) {
1710 InferSimulatorFromArch =
false;
1713 const VersionTuple getOSVersion()
const {
1714 return UnderlyingOSVersion.value_or(VersionTuple());
1717 VersionTuple takeOSVersion() {
1718 assert(UnderlyingOSVersion.has_value() &&
1719 "attempting to get an unset OS version");
1720 VersionTuple Result = *UnderlyingOSVersion;
1721 UnderlyingOSVersion.reset();
1724 bool isValidOSVersion()
const {
1725 return llvm::Triple::isValidVersionForOS(getOSFromPlatform(Platform),
1729 VersionTuple getCanonicalOSVersion()
const {
1730 return llvm::Triple::getCanonicalVersionForOS(
1731 getOSFromPlatform(Platform), getOSVersion(),
true);
1734 void setOSVersion(
const VersionTuple &Version) {
1735 UnderlyingOSVersion = Version;
1738 bool hasOSVersion()
const {
return UnderlyingOSVersion.has_value(); }
1740 VersionTuple getZipperedOSVersion()
const {
1741 assert(Environment == DarwinEnvironmentKind::MacCatalyst &&
1742 "zippered target version is specified only for Mac Catalyst");
1743 return ZipperedOSVersion;
1747 bool isExplicitlySpecified()
const {
return Kind <= DeploymentTargetEnv; }
1750 bool canInferSimulatorFromArch()
const {
return InferSimulatorFromArch; }
1752 const std::optional<llvm::Triple> &getTargetVariantTriple()
const {
1753 return TargetVariantTriple;
1757 void addOSVersionMinArgument(DerivedArgList &Args,
const OptTable &Opts) {
1761 assert(
Kind != TargetArg &&
Kind != MTargetOSArg &&
Kind != OSVersionArg &&
1765 case DarwinPlatformKind::MacOS:
1766 Opt = options::OPT_mmacos_version_min_EQ;
1768 case DarwinPlatformKind::IPhoneOS:
1769 Opt = options::OPT_mios_version_min_EQ;
1771 case DarwinPlatformKind::TvOS:
1772 Opt = options::OPT_mtvos_version_min_EQ;
1774 case DarwinPlatformKind::WatchOS:
1775 Opt = options::OPT_mwatchos_version_min_EQ;
1777 case DarwinPlatformKind::XROS:
1780 case DarwinPlatformKind::DriverKit:
1784 Arg = Args.MakeJoinedArg(
nullptr, Opts.getOption(Opt), OSVersionStr);
1790 std::string
getAsString(DerivedArgList &Args,
const OptTable &Opts) {
1796 assert(Arg &&
"OS version argument not yet inferred");
1797 return Arg->getAsString(Args);
1798 case DeploymentTargetEnv:
1799 return (llvm::Twine(EnvVarName) +
"=" + OSVersionStr).str();
1800 case InferredFromSDK:
1801 case InferredFromArch:
1802 llvm_unreachable(
"Cannot print arguments for inferred OS version");
1804 llvm_unreachable(
"Unsupported Darwin Source Kind");
1808 std::string getInferredSource() {
1809 assert(!isExplicitlySpecified() &&
"OS version was not inferred");
1810 return InferredSource.str();
1813 void setEnvironment(llvm::Triple::EnvironmentType EnvType,
1814 const VersionTuple &OSVersion,
1815 const std::optional<DarwinSDKInfo> &SDKInfo) {
1817 case llvm::Triple::Simulator:
1818 Environment = DarwinEnvironmentKind::Simulator;
1820 case llvm::Triple::MacABI: {
1821 Environment = DarwinEnvironmentKind::MacCatalyst;
1823 ZipperedOSVersion = VersionTuple(10, 15);
1824 if (hasOSVersion() && SDKInfo) {
1825 if (
const auto *MacCatalystToMacOSMapping = SDKInfo->getVersionMapping(
1827 if (
auto MacOSVersion = MacCatalystToMacOSMapping->map(
1828 OSVersion, ZipperedOSVersion, std::nullopt)) {
1829 ZipperedOSVersion = *MacOSVersion;
1836 if (TargetVariantTriple) {
1837 auto TargetVariantVersion = TargetVariantTriple->getOSVersion();
1838 if (TargetVariantVersion.getMajor()) {
1839 if (TargetVariantVersion < ZipperedOSVersion)
1840 ZipperedOSVersion = TargetVariantVersion;
1850 static DarwinPlatform
1851 createFromTarget(
const llvm::Triple &TT, Arg *A,
1852 std::optional<llvm::Triple> TargetVariantTriple,
1853 const std::optional<DarwinSDKInfo> &SDKInfo) {
1854 DarwinPlatform Result(TargetArg, getPlatformFromOS(TT.getOS()),
1855 TT.getOSVersion(), A);
1856 VersionTuple OsVersion = TT.getOSVersion();
1857 Result.TargetVariantTriple = TargetVariantTriple;
1858 Result.setEnvironment(TT.getEnvironment(), OsVersion, SDKInfo);
1861 static DarwinPlatform
1862 createFromMTargetOS(llvm::Triple::OSType OS, VersionTuple OSVersion,
1863 llvm::Triple::EnvironmentType Environment, Arg *A,
1864 const std::optional<DarwinSDKInfo> &SDKInfo) {
1865 DarwinPlatform Result(MTargetOSArg, getPlatformFromOS(OS), OSVersion, A);
1866 Result.InferSimulatorFromArch =
false;
1867 Result.setEnvironment(Environment, OSVersion, SDKInfo);
1870 static DarwinPlatform createOSVersionArg(DarwinPlatformKind Platform, Arg *A,
1872 DarwinPlatform Result{OSVersionArg, Platform,
1873 getVersionFromString(A->getValue()), A};
1875 Result.Environment = DarwinEnvironmentKind::Simulator;
1878 static DarwinPlatform createDeploymentTargetEnv(DarwinPlatformKind Platform,
1879 StringRef EnvVarName,
1880 StringRef OSVersion) {
1881 DarwinPlatform Result(DeploymentTargetEnv, Platform,
1882 getVersionFromString(OSVersion));
1883 Result.EnvVarName = EnvVarName;
1886 static DarwinPlatform createFromSDK(StringRef SDKRoot,
1887 DarwinPlatformKind Platform,
1889 bool IsSimulator =
false) {
1890 DarwinPlatform Result(InferredFromSDK, Platform,
1891 getVersionFromString(
Value));
1893 Result.Environment = DarwinEnvironmentKind::Simulator;
1894 Result.InferSimulatorFromArch =
false;
1895 Result.InferredSource = SDKRoot;
1898 static DarwinPlatform createFromArch(StringRef
Arch, llvm::Triple::OSType OS,
1899 VersionTuple Version) {
1901 DarwinPlatform(InferredFromArch, getPlatformFromOS(OS), Version);
1902 Result.InferredSource =
Arch;
1910 assert(
Kind == InferredFromSDK &&
"can infer SDK info only");
1913 VersionTuple(getOSVersion().getMajor(), 0, 99),
1914 getOSFromPlatform(Platform));
1918 DarwinPlatform(SourceKind
Kind, DarwinPlatformKind Platform, Arg *Argument)
1920 Arguments({Argument, VersionTuple().getAsString()}) {}
1921 DarwinPlatform(SourceKind
Kind, DarwinPlatformKind Platform,
1922 VersionTuple
Value, Arg *Argument =
nullptr)
1926 UnderlyingOSVersion =
Value;
1929 static VersionTuple getVersionFromString(
const StringRef Input) {
1930 llvm::VersionTuple Version;
1931 bool IsValid = !Version.tryParse(Input);
1932 assert(IsValid &&
"unable to convert input version to version tuple");
1937 static DarwinPlatformKind getPlatformFromOS(llvm::Triple::OSType OS) {
1939 case llvm::Triple::Darwin:
1940 case llvm::Triple::MacOSX:
1941 return DarwinPlatformKind::MacOS;
1942 case llvm::Triple::IOS:
1943 return DarwinPlatformKind::IPhoneOS;
1944 case llvm::Triple::TvOS:
1945 return DarwinPlatformKind::TvOS;
1946 case llvm::Triple::WatchOS:
1947 return DarwinPlatformKind::WatchOS;
1948 case llvm::Triple::XROS:
1949 return DarwinPlatformKind::XROS;
1950 case llvm::Triple::DriverKit:
1951 return DarwinPlatformKind::DriverKit;
1953 llvm_unreachable(
"Unable to infer Darwin variant");
1957 static llvm::Triple::OSType getOSFromPlatform(DarwinPlatformKind Platform) {
1959 case DarwinPlatformKind::MacOS:
1960 return llvm::Triple::MacOSX;
1961 case DarwinPlatformKind::IPhoneOS:
1962 return llvm::Triple::IOS;
1963 case DarwinPlatformKind::TvOS:
1964 return llvm::Triple::TvOS;
1965 case DarwinPlatformKind::WatchOS:
1966 return llvm::Triple::WatchOS;
1967 case DarwinPlatformKind::DriverKit:
1968 return llvm::Triple::DriverKit;
1969 case DarwinPlatformKind::XROS:
1970 return llvm::Triple::XROS;
1972 llvm_unreachable(
"Unknown DarwinPlatformKind enum");
1976 DarwinPlatformKind Platform;
1977 DarwinEnvironmentKind Environment = DarwinEnvironmentKind::NativeEnvironment;
1981 VersionTuple ZipperedOSVersion;
1986 std::optional<VersionTuple> UnderlyingOSVersion;
1987 bool InferSimulatorFromArch =
true;
1988 std::pair<Arg *, std::string>
Arguments;
1989 StringRef EnvVarName;
1992 StringRef InferredSource;
1995 std::optional<llvm::Triple> TargetVariantTriple;
2000std::optional<DarwinPlatform>
2001getDeploymentTargetFromOSVersionArg(DerivedArgList &Args,
2002 const Driver &TheDriver) {
2003 Arg *macOSVersion = Args.getLastArg(options::OPT_mmacos_version_min_EQ);
2004 Arg *iOSVersion = Args.getLastArg(options::OPT_mios_version_min_EQ,
2005 options::OPT_mios_simulator_version_min_EQ);
2007 Args.getLastArg(options::OPT_mtvos_version_min_EQ,
2008 options::OPT_mtvos_simulator_version_min_EQ);
2009 Arg *WatchOSVersion =
2010 Args.getLastArg(options::OPT_mwatchos_version_min_EQ,
2011 options::OPT_mwatchos_simulator_version_min_EQ);
2013 auto GetDarwinPlatform =
2015 bool IsSimulator) -> std::optional<DarwinPlatform> {
2016 if (StringRef(VersionArg->getValue()).empty()) {
2017 TheDriver.
Diag(diag::err_drv_missing_version_number)
2018 << VersionArg->getAsString(Args);
2019 return std::nullopt;
2021 return DarwinPlatform::createOSVersionArg(Platform, VersionArg,
2026 if (iOSVersion || TvOSVersion || WatchOSVersion) {
2027 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2028 << macOSVersion->getAsString(Args)
2029 << (iOSVersion ? iOSVersion
2030 : TvOSVersion ? TvOSVersion : WatchOSVersion)
2036 }
else if (iOSVersion) {
2037 if (TvOSVersion || WatchOSVersion) {
2038 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2039 << iOSVersion->getAsString(Args)
2040 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->
getAsString(Args);
2043 iOSVersion->getOption().getID() ==
2044 options::OPT_mios_simulator_version_min_EQ);
2045 }
else if (TvOSVersion) {
2046 if (WatchOSVersion) {
2047 TheDriver.
Diag(diag::err_drv_argument_not_allowed_with)
2048 << TvOSVersion->getAsString(Args)
2049 << WatchOSVersion->getAsString(Args);
2052 TvOSVersion->getOption().getID() ==
2053 options::OPT_mtvos_simulator_version_min_EQ);
2054 }
else if (WatchOSVersion)
2055 return GetDarwinPlatform(
2057 WatchOSVersion->getOption().getID() ==
2058 options::OPT_mwatchos_simulator_version_min_EQ);
2059 return std::nullopt;
2064std::optional<DarwinPlatform>
2065getDeploymentTargetFromEnvironmentVariables(
const Driver &TheDriver,
2066 const llvm::Triple &Triple) {
2068 const char *EnvVars[] = {
2069 "MACOSX_DEPLOYMENT_TARGET",
2070 "IPHONEOS_DEPLOYMENT_TARGET",
2071 "TVOS_DEPLOYMENT_TARGET",
2072 "WATCHOS_DEPLOYMENT_TARGET",
2073 "DRIVERKIT_DEPLOYMENT_TARGET",
2074 "XROS_DEPLOYMENT_TARGET"
2077 "Missing platform");
2079 if (
char *
Env = ::getenv(I.value()))
2080 Targets[I.index()] =
Env;
2089 if (Triple.getArch() == llvm::Triple::arm ||
2090 Triple.getArch() == llvm::Triple::aarch64 ||
2091 Triple.getArch() == llvm::Triple::thumb)
2098 unsigned FirstTarget = std::size(Targets);
2099 for (
unsigned I = 0; I != std::size(Targets); ++I) {
2100 if (Targets[I].empty())
2102 if (FirstTarget == std::size(Targets))
2105 TheDriver.
Diag(diag::err_drv_conflicting_deployment_targets)
2106 << Targets[FirstTarget] << Targets[I];
2111 if (!
Target.value().empty())
2112 return DarwinPlatform::createDeploymentTargetEnv(
2116 return std::nullopt;
2121static StringRef dropSDKNamePrefix(StringRef SDKName) {
2122 size_t PrefixPos = SDKName.find(
'.');
2123 if (PrefixPos == StringRef::npos)
2125 return SDKName.substr(PrefixPos + 1);
2131std::optional<DarwinPlatform>
2132inferDeploymentTargetFromSDK(DerivedArgList &Args,
2133 const std::optional<DarwinSDKInfo> &SDKInfo) {
2134 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2136 return std::nullopt;
2137 StringRef isysroot = A->getValue();
2140 return std::nullopt;
2142 std::string Version;
2145 Version = SDKInfo->getVersion().getAsString();
2149 size_t StartVer = SDK.find_first_of(
"0123456789");
2150 size_t EndVer = SDK.find_last_of(
"0123456789");
2151 if (StartVer != StringRef::npos && EndVer > StartVer)
2152 Version = std::string(SDK.slice(StartVer, EndVer + 1));
2154 if (Version.empty())
2155 return std::nullopt;
2157 auto CreatePlatformFromSDKName =
2158 [&](StringRef SDK) -> std::optional<DarwinPlatform> {
2159 if (SDK.starts_with(
"iPhoneOS") || SDK.starts_with(
"iPhoneSimulator"))
2160 return DarwinPlatform::createFromSDK(
2162 SDK.starts_with(
"iPhoneSimulator"));
2163 else if (SDK.starts_with(
"MacOSX"))
2164 return DarwinPlatform::createFromSDK(isysroot,
Darwin::MacOS,
2166 else if (SDK.starts_with(
"WatchOS") || SDK.starts_with(
"WatchSimulator"))
2167 return DarwinPlatform::createFromSDK(
2169 SDK.starts_with(
"WatchSimulator"));
2170 else if (SDK.starts_with(
"AppleTVOS") ||
2171 SDK.starts_with(
"AppleTVSimulator"))
2172 return DarwinPlatform::createFromSDK(
2174 SDK.starts_with(
"AppleTVSimulator"));
2175 else if (SDK.starts_with(
"XR"))
2176 return DarwinPlatform::createFromSDK(
2178 SDK.contains(
"Simulator"));
2179 else if (SDK.starts_with(
"DriverKit"))
2182 return std::nullopt;
2184 if (
auto Result = CreatePlatformFromSDKName(SDK))
2187 return CreatePlatformFromSDKName(dropSDKNamePrefix(SDK));
2190VersionTuple getInferredOSVersion(llvm::Triple::OSType OS,
2191 const llvm::Triple &Triple,
2192 const Driver &TheDriver) {
2193 VersionTuple OsVersion;
2194 llvm::Triple SystemTriple(llvm::sys::getProcessTriple());
2196 case llvm::Triple::Darwin:
2197 case llvm::Triple::MacOSX:
2200 if (Triple.isMacOSX() && SystemTriple.isMacOSX() &&
2201 !Triple.getOSMajorVersion())
2202 SystemTriple.getMacOSXVersion(OsVersion);
2203 else if (!Triple.getMacOSXVersion(OsVersion))
2204 TheDriver.
Diag(diag::err_drv_invalid_darwin_version)
2205 << Triple.getOSName();
2207 case llvm::Triple::IOS:
2208 if (Triple.isMacCatalystEnvironment() && !Triple.getOSMajorVersion()) {
2209 OsVersion = VersionTuple(13, 1);
2211 OsVersion = Triple.getiOSVersion();
2213 case llvm::Triple::TvOS:
2214 OsVersion = Triple.getOSVersion();
2216 case llvm::Triple::WatchOS:
2217 OsVersion = Triple.getWatchOSVersion();
2219 case llvm::Triple::XROS:
2220 OsVersion = Triple.getOSVersion();
2221 if (!OsVersion.getMajor())
2222 OsVersion = OsVersion.withMajorReplaced(1);
2224 case llvm::Triple::DriverKit:
2225 OsVersion = Triple.getDriverKitVersion();
2228 llvm_unreachable(
"Unexpected OS type");
2235std::optional<DarwinPlatform>
2236inferDeploymentTargetFromArch(DerivedArgList &Args,
const Darwin &Toolchain,
2237 const llvm::Triple &Triple,
2238 const Driver &TheDriver) {
2239 llvm::Triple::OSType OSTy = llvm::Triple::UnknownOS;
2242 if (MachOArchName ==
"arm64" || MachOArchName ==
"arm64e")
2243 OSTy = llvm::Triple::MacOSX;
2244 else if (MachOArchName ==
"armv7" || MachOArchName ==
"armv7s" ||
2245 MachOArchName ==
"armv6")
2246 OSTy = llvm::Triple::IOS;
2247 else if (MachOArchName ==
"armv7k" || MachOArchName ==
"arm64_32")
2248 OSTy = llvm::Triple::WatchOS;
2249 else if (MachOArchName !=
"armv6m" && MachOArchName !=
"armv7m" &&
2250 MachOArchName !=
"armv7em")
2251 OSTy = llvm::Triple::MacOSX;
2252 if (OSTy == llvm::Triple::UnknownOS)
2253 return std::nullopt;
2254 return DarwinPlatform::createFromArch(
2255 MachOArchName, OSTy, getInferredOSVersion(OSTy, Triple, TheDriver));
2259std::optional<DarwinPlatform> getDeploymentTargetFromTargetArg(
2260 DerivedArgList &Args,
const llvm::Triple &Triple,
const Driver &TheDriver,
2261 const std::optional<DarwinSDKInfo> &SDKInfo) {
2262 if (!Args.hasArg(options::OPT_target))
2263 return std::nullopt;
2264 if (Triple.getOS() == llvm::Triple::Darwin ||
2265 Triple.getOS() == llvm::Triple::UnknownOS)
2266 return std::nullopt;
2267 std::optional<llvm::Triple> TargetVariantTriple;
2268 for (
const Arg *A : Args.filtered(options::OPT_darwin_target_variant)) {
2269 llvm::Triple TVT(A->getValue());
2271 if ((Triple.getArch() == llvm::Triple::aarch64 ||
2272 TVT.getArchName() == Triple.getArchName()) &&
2273 TVT.getArch() == Triple.getArch() &&
2274 TVT.getSubArch() == Triple.getSubArch() &&
2275 TVT.getVendor() == Triple.getVendor()) {
2276 if (TargetVariantTriple)
2281 if ((Triple.isMacOSX() && TVT.getOS() == llvm::Triple::IOS &&
2282 TVT.isMacCatalystEnvironment()) ||
2283 (TVT.isMacOSX() && Triple.getOS() == llvm::Triple::IOS &&
2284 Triple.isMacCatalystEnvironment())) {
2285 TargetVariantTriple = TVT;
2288 TheDriver.
Diag(diag::err_drv_target_variant_invalid)
2289 << A->getSpelling() << A->getValue();
2292 DarwinPlatform PlatformAndVersion = DarwinPlatform::createFromTarget(
2293 Triple, Args.getLastArg(options::OPT_target), TargetVariantTriple,
2296 return PlatformAndVersion;
2300std::optional<DarwinPlatform> getDeploymentTargetFromMTargetOSArg(
2301 DerivedArgList &Args,
const Driver &TheDriver,
2302 const std::optional<DarwinSDKInfo> &SDKInfo) {
2303 auto *A = Args.getLastArg(options::OPT_mtargetos_EQ);
2305 return std::nullopt;
2306 llvm::Triple TT(llvm::Twine(
"unknown-apple-") + A->getValue());
2307 switch (TT.getOS()) {
2308 case llvm::Triple::MacOSX:
2309 case llvm::Triple::IOS:
2310 case llvm::Triple::TvOS:
2311 case llvm::Triple::WatchOS:
2312 case llvm::Triple::XROS:
2315 TheDriver.
Diag(diag::err_drv_invalid_os_in_arg)
2316 << TT.getOSName() << A->getAsString(Args);
2317 return std::nullopt;
2320 VersionTuple Version = TT.getOSVersion();
2321 if (!Version.getMajor()) {
2322 TheDriver.
Diag(diag::err_drv_invalid_version_number)
2323 << A->getAsString(Args);
2324 return std::nullopt;
2326 return DarwinPlatform::createFromMTargetOS(TT.getOS(), Version,
2327 TT.getEnvironment(), A, SDKInfo);
2330std::optional<DarwinSDKInfo> parseSDKSettings(llvm::vfs::FileSystem &VFS,
2331 const ArgList &Args,
2332 const Driver &TheDriver) {
2333 const Arg *A = Args.getLastArg(options::OPT_isysroot);
2335 return std::nullopt;
2336 StringRef isysroot = A->getValue();
2338 if (!SDKInfoOrErr) {
2339 llvm::consumeError(SDKInfoOrErr.takeError());
2340 TheDriver.
Diag(diag::warn_drv_darwin_sdk_invalid_settings);
2341 return std::nullopt;
2343 return *SDKInfoOrErr;
2348void Darwin::AddDeploymentTarget(DerivedArgList &Args)
const {
2354 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2356 if (!
getVFS().exists(A->getValue()))
2357 getDriver().
Diag(clang::diag::warn_missing_sysroot) << A->getValue();
2359 if (
char *env = ::getenv(
"SDKROOT")) {
2362 if (llvm::sys::path::is_absolute(env) &&
getVFS().exists(env) &&
2363 StringRef(env) !=
"/") {
2364 Args.append(Args.MakeSeparateArg(
2365 nullptr, Opts.getOption(options::OPT_isysroot), env));
2375 std::optional<DarwinPlatform> PlatformAndVersion =
2377 if (PlatformAndVersion) {
2379 if (
const auto *MTargetOSArg = Args.getLastArg(options::OPT_mtargetos_EQ)) {
2380 std::string TargetArgStr = PlatformAndVersion->getAsString(Args, Opts);
2381 std::string MTargetOSArgStr = MTargetOSArg->getAsString(Args);
2383 << TargetArgStr << MTargetOSArgStr;
2386 bool TripleProvidedOSVersion = PlatformAndVersion->hasOSVersion();
2387 if (!TripleProvidedOSVersion)
2388 PlatformAndVersion->setOSVersion(
2391 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2392 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2393 if (PlatformAndVersionFromOSVersionArg) {
2394 unsigned TargetMajor, TargetMinor, TargetMicro;
2396 unsigned ArgMajor, ArgMinor, ArgMicro;
2398 if (PlatformAndVersion->getPlatform() !=
2399 PlatformAndVersionFromOSVersionArg->getPlatform() ||
2401 PlatformAndVersion->getOSVersion().getAsString(), TargetMajor,
2402 TargetMinor, TargetMicro, TargetExtra) &&
2404 PlatformAndVersionFromOSVersionArg->getOSVersion().getAsString(),
2405 ArgMajor, ArgMinor, ArgMicro, ArgExtra) &&
2406 (VersionTuple(TargetMajor, TargetMinor, TargetMicro) !=
2407 VersionTuple(ArgMajor, ArgMinor, ArgMicro) ||
2408 TargetExtra != ArgExtra))) {
2411 if (PlatformAndVersion->getPlatform() ==
2412 PlatformAndVersionFromOSVersionArg->getPlatform() &&
2413 !TripleProvidedOSVersion) {
2414 PlatformAndVersion->setOSVersion(
2415 PlatformAndVersionFromOSVersionArg->getOSVersion());
2419 std::string OSVersionArg =
2420 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2421 std::string TargetArg = PlatformAndVersion->getAsString(Args, Opts);
2423 << OSVersionArg << TargetArg;
2427 }
else if ((PlatformAndVersion = getDeploymentTargetFromMTargetOSArg(
2431 std::optional<DarwinPlatform> PlatformAndVersionFromOSVersionArg =
2432 getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2433 if (PlatformAndVersionFromOSVersionArg) {
2434 std::string MTargetOSArgStr = PlatformAndVersion->getAsString(Args, Opts);
2435 std::string OSVersionArgStr =
2436 PlatformAndVersionFromOSVersionArg->getAsString(Args, Opts);
2438 << MTargetOSArgStr << OSVersionArgStr;
2442 PlatformAndVersion = getDeploymentTargetFromOSVersionArg(Args,
getDriver());
2445 if (!PlatformAndVersion) {
2446 PlatformAndVersion =
2448 if (PlatformAndVersion) {
2450 std::optional<DarwinPlatform> SDKTarget =
2451 inferDeploymentTargetFromSDK(Args,
SDKInfo);
2453 PlatformAndVersion->setEnvironment(SDKTarget->getEnvironment());
2459 if (!PlatformAndVersion) {
2460 PlatformAndVersion = inferDeploymentTargetFromSDK(Args,
SDKInfo);
2463 if (PlatformAndVersion && !
SDKInfo)
2464 SDKInfo = PlatformAndVersion->inferSDKInfo();
2468 if (!PlatformAndVersion)
2469 PlatformAndVersion =
2473 assert(PlatformAndVersion &&
"Unable to infer Darwin variant");
2474 if (!PlatformAndVersion->isValidOSVersion()) {
2475 if (PlatformAndVersion->isExplicitlySpecified())
2477 << PlatformAndVersion->getAsString(Args, Opts);
2479 getDriver().
Diag(diag::err_drv_invalid_version_number_inferred)
2480 << PlatformAndVersion->getOSVersion().getAsString()
2481 << PlatformAndVersion->getInferredSource();
2486 VersionTuple CanonicalVersion = PlatformAndVersion->getCanonicalOSVersion();
2487 if (CanonicalVersion != PlatformAndVersion->getOSVersion()) {
2488 getDriver().
Diag(diag::warn_drv_overriding_deployment_version)
2489 << PlatformAndVersion->getOSVersion().getAsString()
2490 << CanonicalVersion.getAsString();
2491 PlatformAndVersion->setOSVersion(CanonicalVersion);
2494 PlatformAndVersion->addOSVersionMinArgument(Args, Opts);
2497 unsigned Major, Minor, Micro;
2500 const unsigned MajorVersionLimit = 1000;
2501 const VersionTuple OSVersion = PlatformAndVersion->takeOSVersion();
2502 const std::string OSVersionStr = OSVersion.getAsString();
2504 if (Platform ==
MacOS) {
2507 HadExtra || Major < 10 || Major >= MajorVersionLimit || Minor >= 100 ||
2510 << PlatformAndVersion->getAsString(Args, Opts);
2514 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2516 << PlatformAndVersion->getAsString(Args, Opts);
2518 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst &&
2519 (Major < 13 || (Major == 13 && Minor < 1))) {
2521 << PlatformAndVersion->getAsString(Args, Opts);
2528 if (
getTriple().isArch32Bit() && Major >= 11) {
2530 if (PlatformAndVersion->isExplicitlySpecified()) {
2531 if (PlatformAndVersion->getEnvironment() ==
MacCatalyst)
2532 getDriver().
Diag(diag::err_invalid_macos_32bit_deployment_target);
2535 << PlatformAndVersion->getAsString(Args, Opts);
2543 }
else if (Platform ==
TvOS) {
2546 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2548 << PlatformAndVersion->getAsString(Args, Opts);
2549 }
else if (Platform ==
WatchOS) {
2552 HadExtra || Major >= MajorVersionLimit || Minor >= 100 || Micro >= 100)
2554 << PlatformAndVersion->getAsString(Args, Opts);
2558 HadExtra || Major < 19 || Major >= MajorVersionLimit || Minor >= 100 ||
2561 << PlatformAndVersion->getAsString(Args, Opts);
2562 }
else if (Platform ==
XROS) {
2565 HadExtra || Major < 1 || Major >= MajorVersionLimit || Minor >= 100 ||
2568 << PlatformAndVersion->getAsString(Args, Opts);
2570 llvm_unreachable(
"unknown kind of Darwin platform");
2576 PlatformAndVersion->canInferSimulatorFromArch() &&
getTriple().isX86())
2579 VersionTuple ZipperedOSVersion;
2581 ZipperedOSVersion = PlatformAndVersion->getZipperedOSVersion();
2582 setTarget(Platform, Environment, Major, Minor, Micro, ZipperedOSVersion);
2591 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2593 if (SDK.size() > 0) {
2594 size_t StartVer = SDK.find_first_of(
"0123456789");
2595 StringRef SDKName = SDK.slice(0, StartVer);
2608 const llvm::Triple &
T) {
2609 if (
T.isDriverKit()) {
2610 llvm::sys::path::append(
Path,
"System",
"DriverKit");
2619 if (DriverArgs.hasArg(options::OPT_isysroot))
2620 Path = DriverArgs.getLastArgValue(options::OPT_isysroot);
2631 const llvm::opt::ArgList &DriverArgs,
2632 llvm::opt::ArgStringList &CC1Args)
const {
2637 bool NoStdInc = DriverArgs.hasArg(options::OPT_nostdinc);
2638 bool NoStdlibInc = DriverArgs.hasArg(options::OPT_nostdlibinc);
2639 bool NoBuiltinInc = DriverArgs.hasFlag(
2640 options::OPT_nobuiltininc, options::OPT_ibuiltininc,
false);
2641 bool ForceBuiltinInc = DriverArgs.hasFlag(
2642 options::OPT_ibuiltininc, options::OPT_nobuiltininc,
false);
2645 if (!NoStdInc && !NoStdlibInc) {
2647 llvm::sys::path::append(
P,
"usr",
"local",
"include");
2652 if (!(NoStdInc && !ForceBuiltinInc) && !NoBuiltinInc) {
2654 llvm::sys::path::append(
P,
"include");
2658 if (NoStdInc || NoStdlibInc)
2662 llvm::StringRef CIncludeDirs(C_INCLUDE_DIRS);
2663 if (!CIncludeDirs.empty()) {
2665 CIncludeDirs.split(dirs,
":");
2666 for (llvm::StringRef dir : dirs) {
2667 llvm::StringRef Prefix =
2668 llvm::sys::path::is_absolute(dir) ?
"" : llvm::StringRef(Sysroot);
2674 llvm::sys::path::append(
P,
"usr",
"include");
2680 const llvm::opt::ArgList &DriverArgs,
2681 llvm::opt::ArgStringList &CC1Args)
const {
2684 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc))
2693 llvm::sys::path::append(P1,
"System",
"Library",
"Frameworks");
2694 llvm::sys::path::append(P2,
"System",
"Library",
"SubFrameworks");
2695 llvm::sys::path::append(P3,
"Library",
"Frameworks");
2699bool DarwinClang::AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
2700 llvm::opt::ArgStringList &CC1Args,
2702 llvm::StringRef Version,
2703 llvm::StringRef ArchDir,
2704 llvm::StringRef BitDir)
const {
2705 llvm::sys::path::append(
Base, Version);
2713 if (!ArchDir.empty())
2714 llvm::sys::path::append(
P, ArchDir);
2715 if (!BitDir.empty())
2716 llvm::sys::path::append(
P, BitDir);
2723 llvm::sys::path::append(
P,
"backward");
2731 const llvm::opt::ArgList &DriverArgs,
2732 llvm::opt::ArgStringList &CC1Args)
const {
2740 if (DriverArgs.hasArg(options::OPT_nostdinc, options::OPT_nostdlibinc,
2741 options::OPT_nostdincxx))
2762 llvm::sys::path::append(InstallBin,
"..",
"include",
"c++",
"v1");
2763 if (
getVFS().exists(InstallBin)) {
2766 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2767 llvm::errs() <<
"ignoring nonexistent directory \"" << InstallBin
2773 llvm::sys::path::append(SysrootUsr,
"usr",
"include",
"c++",
"v1");
2774 if (
getVFS().exists(SysrootUsr)) {
2777 }
else if (DriverArgs.hasArg(options::OPT_v)) {
2778 llvm::errs() <<
"ignoring nonexistent directory \"" << SysrootUsr
2787 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args);
2792void AppleMachO::AddGnuCPlusPlusIncludePaths(
2793 const llvm::opt::ArgList &DriverArgs,
2794 llvm::opt::ArgStringList &CC1Args)
const {}
2796void DarwinClang::AddGnuCPlusPlusIncludePaths(
2797 const llvm::opt::ArgList &DriverArgs,
2798 llvm::opt::ArgStringList &CC1Args)
const {
2800 llvm::sys::path::append(UsrIncludeCxx,
"usr",
"include",
"c++");
2802 llvm::Triple::ArchType arch =
getTriple().getArch();
2803 bool IsBaseFound =
true;
2808 case llvm::Triple::x86:
2809 case llvm::Triple::x86_64:
2810 IsBaseFound = AddGnuCPlusPlusIncludePaths(
2811 DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
"i686-apple-darwin10",
2812 arch == llvm::Triple::x86_64 ?
"x86_64" :
"");
2813 IsBaseFound |= AddGnuCPlusPlusIncludePaths(
2814 DriverArgs, CC1Args, UsrIncludeCxx,
"4.0.0",
"i686-apple-darwin8",
"");
2817 case llvm::Triple::arm:
2818 case llvm::Triple::thumb:
2820 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2821 "arm-apple-darwin10",
"v7");
2823 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2824 "arm-apple-darwin10",
"v6");
2827 case llvm::Triple::aarch64:
2829 AddGnuCPlusPlusIncludePaths(DriverArgs, CC1Args, UsrIncludeCxx,
"4.2.1",
2830 "arm64-apple-darwin10",
"");
2840 ArgStringList &CmdArgs)
const {
2845 CmdArgs.push_back(
"-lc++");
2846 if (Args.hasArg(options::OPT_fexperimental_library))
2847 CmdArgs.push_back(
"-lc++experimental");
2857 if (
const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
2859 llvm::sys::path::append(
P,
"usr",
"lib",
"libstdc++.dylib");
2862 llvm::sys::path::remove_filename(
P);
2863 llvm::sys::path::append(
P,
"libstdc++.6.dylib");
2865 CmdArgs.push_back(Args.MakeArgString(
P));
2874 if (!
getVFS().exists(
"/usr/lib/libstdc++.dylib") &&
2875 getVFS().exists(
"/usr/lib/libstdc++.6.dylib")) {
2876 CmdArgs.push_back(
"/usr/lib/libstdc++.6.dylib");
2881 CmdArgs.push_back(
"-lstdc++");
2887 ArgStringList &CmdArgs)
const {
2893 llvm::sys::path::append(
P,
"lib",
"darwin");
2897 llvm::sys::path::append(
P,
"libclang_rt.cc_kext_watchos.a");
2899 llvm::sys::path::append(
P,
"libclang_rt.cc_kext_tvos.a");
2901 llvm::sys::path::append(
P,
"libclang_rt.cc_kext_ios.a");
2905 llvm::sys::path::append(
2906 P, llvm::Twine(
"libclang_rt.cc_kext_") +
2907 llvm::Triple::getOSTypeName(llvm::Triple::XROS) +
".a");
2909 llvm::sys::path::append(
P,
"libclang_rt.cc_kext.a");
2915 CmdArgs.push_back(Args.MakeArgString(
P));
2919 StringRef BoundArch,
2921 DerivedArgList *DAL =
new DerivedArgList(Args.getBaseArgs());
2931 for (Arg *A : Args) {
2940 case options::OPT_mkernel:
2941 case options::OPT_fapple_kext:
2943 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
2946 case options::OPT_dependency_file:
2947 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
2950 case options::OPT_gfull:
2951 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
2953 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
2956 case options::OPT_gused:
2957 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
2959 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
2962 case options::OPT_shared:
2963 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
2966 case options::OPT_fconstant_cfstrings:
2967 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
2970 case options::OPT_fno_constant_cfstrings:
2971 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
2974 case options::OPT_Wnonportable_cfstrings:
2976 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
2979 case options::OPT_Wno_nonportable_cfstrings:
2981 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
2988 if (!BoundArch.empty()) {
2989 StringRef Name = BoundArch;
2990 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
2991 const Option MArch = Opts.getOption(clang::driver::options::OPT_march_EQ);
2997 else if (Name ==
"ppc601")
2998 DAL->AddJoinedArg(
nullptr, MCpu,
"601");
2999 else if (Name ==
"ppc603")
3000 DAL->AddJoinedArg(
nullptr, MCpu,
"603");
3001 else if (Name ==
"ppc604")
3002 DAL->AddJoinedArg(
nullptr, MCpu,
"604");
3003 else if (Name ==
"ppc604e")
3004 DAL->AddJoinedArg(
nullptr, MCpu,
"604e");
3005 else if (Name ==
"ppc750")
3006 DAL->AddJoinedArg(
nullptr, MCpu,
"750");
3007 else if (Name ==
"ppc7400")
3008 DAL->AddJoinedArg(
nullptr, MCpu,
"7400");
3009 else if (Name ==
"ppc7450")
3010 DAL->AddJoinedArg(
nullptr, MCpu,
"7450");
3011 else if (Name ==
"ppc970")
3012 DAL->AddJoinedArg(
nullptr, MCpu,
"970");
3014 else if (Name ==
"ppc64" || Name ==
"ppc64le")
3015 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3017 else if (Name ==
"i386")
3019 else if (Name ==
"i486")
3020 DAL->AddJoinedArg(
nullptr, MArch,
"i486");
3021 else if (Name ==
"i586")
3022 DAL->AddJoinedArg(
nullptr, MArch,
"i586");
3023 else if (Name ==
"i686")
3024 DAL->AddJoinedArg(
nullptr, MArch,
"i686");
3025 else if (Name ==
"pentium")
3026 DAL->AddJoinedArg(
nullptr, MArch,
"pentium");
3027 else if (Name ==
"pentium2")
3028 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3029 else if (Name ==
"pentpro")
3030 DAL->AddJoinedArg(
nullptr, MArch,
"pentiumpro");
3031 else if (Name ==
"pentIIm3")
3032 DAL->AddJoinedArg(
nullptr, MArch,
"pentium2");
3034 else if (Name ==
"x86_64" || Name ==
"x86_64h")
3035 DAL->AddFlagArg(
nullptr, Opts.getOption(options::OPT_m64));
3037 else if (Name ==
"arm")
3038 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3039 else if (Name ==
"armv4t")
3040 DAL->AddJoinedArg(
nullptr, MArch,
"armv4t");
3041 else if (Name ==
"armv5")
3042 DAL->AddJoinedArg(
nullptr, MArch,
"armv5tej");
3043 else if (Name ==
"xscale")
3044 DAL->AddJoinedArg(
nullptr, MArch,
"xscale");
3045 else if (Name ==
"armv6")
3046 DAL->AddJoinedArg(
nullptr, MArch,
"armv6k");
3047 else if (Name ==
"armv6m")
3048 DAL->AddJoinedArg(
nullptr, MArch,
"armv6m");
3049 else if (Name ==
"armv7")
3050 DAL->AddJoinedArg(
nullptr, MArch,
"armv7a");
3051 else if (Name ==
"armv7em")
3052 DAL->AddJoinedArg(
nullptr, MArch,
"armv7em");
3053 else if (Name ==
"armv7k")
3054 DAL->AddJoinedArg(
nullptr, MArch,
"armv7k");
3055 else if (Name ==
"armv7m")
3056 DAL->AddJoinedArg(
nullptr, MArch,
"armv7m");
3057 else if (Name ==
"armv7s")
3058 DAL->AddJoinedArg(
nullptr, MArch,
"armv7s");
3065 ArgStringList &CmdArgs,
3066 bool ForceLinkBuiltinRT)
const {
3075 CompilerRT += Args.hasArg(options::OPT_fPIC) ?
"_pic" :
"_static";
3081 llvm::Triple::OSType OS;
3087 OS = llvm::Triple::MacOSX;
3090 OS = llvm::Triple::IOS;
3093 OS = llvm::Triple::TvOS;
3096 OS = llvm::Triple::WatchOS;
3118 VersionTuple SDKVersion = SDKInfo->getVersion();
3119 switch (SDKInfo->getOS()) {
3122 case llvm::Triple::MacOSX:
3123 return SDKVersion >= VersionTuple(15U);
3124 case llvm::Triple::IOS:
3125 return SDKVersion >= VersionTuple(18U);
3126 case llvm::Triple::TvOS:
3127 return SDKVersion >= VersionTuple(18U);
3128 case llvm::Triple::WatchOS:
3129 return SDKVersion >= VersionTuple(11U);
3130 case llvm::Triple::XROS:
3131 return SDKVersion >= VersionTuple(2U);
3139static inline llvm::VersionTuple
3144 case llvm::Triple::Darwin:
3145 case llvm::Triple::MacOSX:
3146 return llvm::VersionTuple(10U, 12U);
3147 case llvm::Triple::IOS:
3148 case llvm::Triple::TvOS:
3149 return llvm::VersionTuple(10U);
3150 case llvm::Triple::WatchOS:
3151 return llvm::VersionTuple(3U);
3154 llvm_unreachable(
"Unexpected OS");
3158 llvm::Triple::OSType OS;
3164 OS = llvm::Triple::MacOSX;
3167 OS = llvm::Triple::IOS;
3170 OS = llvm::Triple::TvOS;
3173 OS = llvm::Triple::WatchOS;
3185 llvm::opt::ArgStringList &CC1Args,
3194 if (!DriverArgs.hasArg(options::OPT_fptrauth_calls,
3195 options::OPT_fno_ptrauth_calls))
3196 CC1Args.push_back(
"-fptrauth-calls");
3197 if (!DriverArgs.hasArg(options::OPT_fptrauth_returns,
3198 options::OPT_fno_ptrauth_returns))
3199 CC1Args.push_back(
"-fptrauth-returns");
3200 if (!DriverArgs.hasArg(options::OPT_fptrauth_intrinsics,
3201 options::OPT_fno_ptrauth_intrinsics))
3202 CC1Args.push_back(
"-fptrauth-intrinsics");
3203 if (!DriverArgs.hasArg(options::OPT_fptrauth_indirect_gotos,
3204 options::OPT_fno_ptrauth_indirect_gotos))
3205 CC1Args.push_back(
"-fptrauth-indirect-gotos");
3206 if (!DriverArgs.hasArg(options::OPT_fptrauth_auth_traps,
3207 options::OPT_fno_ptrauth_auth_traps))
3208 CC1Args.push_back(
"-fptrauth-auth-traps");
3211 if (!DriverArgs.hasArg(
3212 options::OPT_fptrauth_vtable_pointer_address_discrimination,
3213 options::OPT_fno_ptrauth_vtable_pointer_address_discrimination))
3214 CC1Args.push_back(
"-fptrauth-vtable-pointer-address-discrimination");
3215 if (!DriverArgs.hasArg(
3216 options::OPT_fptrauth_vtable_pointer_type_discrimination,
3217 options::OPT_fno_ptrauth_vtable_pointer_type_discrimination))
3218 CC1Args.push_back(
"-fptrauth-vtable-pointer-type-discrimination");
3221 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_isa,
3222 options::OPT_fno_ptrauth_objc_isa))
3223 CC1Args.push_back(
"-fptrauth-objc-isa");
3224 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_class_ro,
3225 options::OPT_fno_ptrauth_objc_class_ro))
3226 CC1Args.push_back(
"-fptrauth-objc-class-ro");
3227 if (!DriverArgs.hasArg(options::OPT_fptrauth_objc_interface_sel,
3228 options::OPT_fno_ptrauth_objc_interface_sel))
3229 CC1Args.push_back(
"-fptrauth-objc-interface-sel");
3234 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
3241 if (!DriverArgs.hasArgNoClaim(options::OPT_faligned_allocation,
3242 options::OPT_fno_aligned_allocation) &&
3244 CC1Args.push_back(
"-faligned-alloc-unavailable");
3248 if (!DriverArgs.hasArgNoClaim(options::OPT_fsized_deallocation,
3249 options::OPT_fno_sized_deallocation) &&
3251 CC1Args.push_back(
"-fno-sized-deallocation");
3257 CC1Args.push_back(
"-fcompatibility-qualified-id-block-type-checking");
3261 if (!DriverArgs.getLastArgNoClaim(
3262 options::OPT_fvisibility_inlines_hidden_static_local_var,
3263 options::OPT_fno_visibility_inlines_hidden_static_local_var))
3264 CC1Args.push_back(
"-fvisibility-inlines-hidden-static-local-var");
3278 CC1Args.push_back(
"-fbuiltin-headers-in-system-modules");
3280 if (!DriverArgs.hasArgNoClaim(options::OPT_fdefine_target_os_macros,
3281 options::OPT_fno_define_target_os_macros))
3282 CC1Args.push_back(
"-fdefine-target-os-macros");
3286 !DriverArgs.hasFlag(options::OPT_fmodulemap_allow_subdirectory_search,
3287 options::OPT_fno_modulemap_allow_subdirectory_search,
3289 bool RequiresSubdirectorySearch;
3290 VersionTuple SDKVersion =
SDKInfo->getVersion();
3293 RequiresSubdirectorySearch =
true;
3296 RequiresSubdirectorySearch = SDKVersion < VersionTuple(15, 0);
3300 RequiresSubdirectorySearch = SDKVersion < VersionTuple(18, 0);
3303 RequiresSubdirectorySearch = SDKVersion < VersionTuple(11, 0);
3306 RequiresSubdirectorySearch = SDKVersion < VersionTuple(2, 0);
3309 if (!RequiresSubdirectorySearch)
3310 CC1Args.push_back(
"-fno-modulemap-allow-subdirectory-search");
3315 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1ASArgs)
const {
3317 CC1ASArgs.push_back(
"-darwin-target-variant-triple");
3324 auto EmitTargetSDKVersionArg = [&](
const VersionTuple &
V) {
3326 llvm::raw_string_ostream OS(Arg);
3327 OS <<
"-target-sdk-version=" <<
V;
3328 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3332 if (
const auto *MacOStoMacCatalystMapping =
SDKInfo->getVersionMapping(
3334 std::optional<VersionTuple> SDKVersion = MacOStoMacCatalystMapping->map(
3337 EmitTargetSDKVersionArg(
3341 EmitTargetSDKVersionArg(
SDKInfo->getVersion());
3349 llvm::raw_string_ostream OS(Arg);
3350 OS <<
"-darwin-target-variant-sdk-version=" <<
SDKInfo->getVersion();
3351 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3352 }
else if (
const auto *MacOStoMacCatalystMapping =
3355 if (std::optional<VersionTuple> SDKVersion =
3356 MacOStoMacCatalystMapping->map(
3360 llvm::raw_string_ostream OS(Arg);
3361 OS <<
"-darwin-target-variant-sdk-version=" << *SDKVersion;
3362 CC1ASArgs.push_back(Args.MakeArgString(Arg));
3373 DerivedArgList *DAL =
3377 if (BoundArch.empty())
3383 AddDeploymentTarget(*DAL);
3391 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
3394 if (A->getOption().getID() != options::OPT_mkernel &&
3395 A->getOption().getID() != options::OPT_fapple_kext)
3397 assert(it != ie &&
"unexpected argument translation");
3399 assert(A->getOption().getID() == options::OPT_static &&
3400 "missing expected -static argument");
3407 if ((
Arch == llvm::Triple::arm ||
Arch == llvm::Triple::thumb)) {
3408 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
3409 options::OPT_fno_omit_frame_pointer,
false))
3410 getDriver().
Diag(clang::diag::warn_drv_unsupported_opt_for_target)
3411 <<
"-fomit-frame-pointer" << BoundArch;
3420 if (
getArch() == llvm::Triple::x86_64 ||
3422 Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
3424 return (
getArch() == llvm::Triple::aarch64 ||
3425 getArch() == llvm::Triple::aarch64_32)
3433 if (
const char *S = ::getenv(
"RC_DEBUG_OPTIONS"))
3434 return S[0] !=
'\0';
3439 if (
const char *S = ::getenv(
"RC_DEBUG_PREFIX_MAP"))
3448 return llvm::ExceptionHandling::None;
3452 if (Triple.isWatchABI())
3453 return llvm::ExceptionHandling::DwarfCFI;
3455 return llvm::ExceptionHandling::SjLj;
3470 return (
getArch() == llvm::Triple::x86_64 ||
3471 getArch() == llvm::Triple::aarch64);
3480 ArgStringList &CmdArgs)
const {
3483 assert(!
isTargetXROS() &&
"xrOS always uses -platform-version");
3486 CmdArgs.push_back(
"-watchos_version_min");
3488 CmdArgs.push_back(
"-watchos_simulator_version_min");
3490 CmdArgs.push_back(
"-tvos_version_min");
3492 CmdArgs.push_back(
"-tvos_simulator_version_min");
3494 CmdArgs.push_back(
"-driverkit_version_min");
3496 CmdArgs.push_back(
"-ios_simulator_version_min");
3498 CmdArgs.push_back(
"-iphoneos_version_min");
3500 CmdArgs.push_back(
"-maccatalyst_version_min");
3503 CmdArgs.push_back(
"-macosx_version_min");
3509 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3512 VersionTuple VariantTargetVersion;
3514 CmdArgs.push_back(
"-macosx_version_min");
3519 "unexpected target variant triple");
3520 CmdArgs.push_back(
"-maccatalyst_version_min");
3523 VersionTuple MinTgtVers =
3525 if (MinTgtVers.getMajor() && MinTgtVers > VariantTargetVersion)
3526 VariantTargetVersion = MinTgtVers;
3527 CmdArgs.push_back(Args.MakeArgString(VariantTargetVersion.getAsString()));
3538 return "mac catalyst";
3549 llvm_unreachable(
"invalid platform");
3553 llvm::opt::ArgStringList &CmdArgs)
const {
3554 auto EmitPlatformVersionArg =
3557 const llvm::Triple &TT) {
3560 CmdArgs.push_back(
"-platform_version");
3561 std::string PlatformName =
3564 PlatformName +=
"-simulator";
3565 CmdArgs.push_back(Args.MakeArgString(PlatformName));
3574 VersionTuple MinTgtVers = TT.getMinimumSupportedOSVersion();
3577 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3582 std::optional<VersionTuple> iOSSDKVersion;
3584 if (
const auto *MacOStoMacCatalystMapping =
3587 iOSSDKVersion = MacOStoMacCatalystMapping->map(
3588 SDKInfo->getVersion().withoutBuild(),
3592 CmdArgs.push_back(Args.MakeArgString(
3593 (iOSSDKVersion ? *iOSSDKVersion
3600 VersionTuple SDKVersion =
SDKInfo->getVersion().withoutBuild();
3601 if (!SDKVersion.getMinor())
3602 SDKVersion = VersionTuple(SDKVersion.getMajor(), 0);
3603 CmdArgs.push_back(Args.MakeArgString(SDKVersion.getAsString()));
3614 CmdArgs.push_back(Args.MakeArgString(
TargetVersion.getAsString()));
3623 VersionTuple TargetVariantVersion;
3631 "unexpected target variant triple");
3636 EmitPlatformVersionArg(TargetVariantVersion, Platform, Environment,
3642 ArgStringList &CmdArgs) {
3644 if (
D.isTargetIPhoneOS()) {
3645 if (
D.isIPhoneOSVersionLT(3, 1))
3646 CmdArgs.push_back(
"-ldylib1.o");
3650 if (!
D.isTargetMacOS())
3652 if (
D.isMacosxVersionLT(10, 5))
3653 CmdArgs.push_back(
"-ldylib1.o");
3654 else if (
D.isMacosxVersionLT(10, 6))
3655 CmdArgs.push_back(
"-ldylib1.10.5.o");
3660 ArgStringList &CmdArgs) {
3661 if (Args.hasArg(options::OPT_static))
3664 if ((
D.isTargetIPhoneOS() &&
D.isIPhoneOSVersionLT(3, 1)) ||
3665 (
D.isTargetMacOS() &&
D.isMacosxVersionLT(10, 6)))
3666 CmdArgs.push_back(
"-lbundle1.o");
3671 ArgStringList &CmdArgs) {
3672 if (
D.isTargetMacOS() &&
D.isMacosxVersionLT(10, 9)) {
3673 if (Args.hasArg(options::OPT_static) || Args.hasArg(options::OPT_object) ||
3674 Args.hasArg(options::OPT_preload)) {
3675 CmdArgs.push_back(
"-lgcrt0.o");
3677 CmdArgs.push_back(
"-lgcrt1.o");
3686 if (!
D.isMacosxVersionLT(10, 8))
3687 CmdArgs.push_back(
"-no_new_main");
3689 D.getDriver().Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3690 <<
D.isTargetMacOSBased();
3695 ArgStringList &CmdArgs) {
3697 if (
D.isTargetIPhoneOS()) {
3698 if (
D.getArch() == llvm::Triple::aarch64)
3700 else if (
D.isIPhoneOSVersionLT(3, 1))
3701 CmdArgs.push_back(
"-lcrt1.o");
3702 else if (
D.isIPhoneOSVersionLT(6, 0))
3703 CmdArgs.push_back(
"-lcrt1.3.1.o");
3707 if (!
D.isTargetMacOS())
3709 if (
D.isMacosxVersionLT(10, 5))
3710 CmdArgs.push_back(
"-lcrt1.o");
3711 else if (
D.isMacosxVersionLT(10, 6))
3712 CmdArgs.push_back(
"-lcrt1.10.5.o");
3713 else if (
D.isMacosxVersionLT(10, 8))
3714 CmdArgs.push_back(
"-lcrt1.10.6.o");
3719 ArgStringList &CmdArgs)
const {
3721 if (Args.hasArg(options::OPT_dynamiclib))
3723 else if (Args.hasArg(options::OPT_bundle))
3727 else if (Args.hasArg(options::OPT_static) ||
3728 Args.hasArg(options::OPT_object) ||
3729 Args.hasArg(options::OPT_preload))
3730 CmdArgs.push_back(
"-lcrt0.o");
3734 if (
isTargetMacOS() && Args.hasArg(options::OPT_shared_libgcc) &&
3736 const char *Str = Args.MakeArgString(
GetFilePath(
"crt3.o"));
3737 CmdArgs.push_back(Str);
3749 const bool IsX86_64 =
getTriple().getArch() == llvm::Triple::x86_64;
3750 const bool IsAArch64 =
getTriple().getArch() == llvm::Triple::aarch64;
3752 Res |= SanitizerKind::Address;
3753 Res |= SanitizerKind::PointerCompare;
3754 Res |= SanitizerKind::PointerSubtract;
3755 Res |= SanitizerKind::Realtime;
3756 Res |= SanitizerKind::Leak;
3757 Res |= SanitizerKind::Fuzzer;
3758 Res |= SanitizerKind::FuzzerNoLink;
3759 Res |= SanitizerKind::ObjCCast;
3766 Res |= SanitizerKind::Vptr;
3768 if ((IsX86_64 || IsAArch64) &&
3771 Res |= SanitizerKind::Thread;
3775 Res |= SanitizerKind::Type;
3779 Res |= SanitizerKind::NumericalStability;
Defines a function that returns the minimum OS versions supporting C++17's aligned allocation functio...
enum clang::sema::@1840::IndirectLocalPathEntry::EntryKind Kind
static bool hasMultipleInvocations(const llvm::Triple &Triple, const ArgList &Args)
static bool checkRemarksOptions(const Driver &D, const ArgList &Args, const llvm::Triple &Triple)
static void renderRemarksOptions(const ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple, const InputInfo &Input, const InputInfo &Output, const JobAction &JA)
static bool sdkSupportsBuiltinModules(const std::optional< DarwinSDKInfo > &SDKInfo)
static void addPgProfilingLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static const char * ArmMachOArchName(StringRef Arch)
static bool shouldLinkerNotDedup(bool IsLinkerOnlyAction, const ArgList &Args)
Pass -no_deduplicate to ld64 under certain conditions:
static bool hasExportSymbolDirective(const ArgList &Args)
Check if the link command contains a symbol export directive.
static void addDefaultCRTLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static void addBundleLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static llvm::VersionTuple sizedDeallocMinVersion(llvm::Triple::OSType OS)
static VersionTuple minimumMacCatalystDeploymentTarget()
static std::string getSystemOrSDKMacOSVersion(StringRef MacOSSDKVersion)
Returns the most appropriate macOS target version for the current process.
static void addDynamicLibLinkArgs(const Darwin &D, const ArgList &Args, ArgStringList &CmdArgs)
static void AppendPlatformPrefix(SmallString< 128 > &Path, const llvm::Triple &T)
static bool isObjCRuntimeLinked(const ArgList &Args)
Determine whether we are linking the ObjC runtime.
static const char * getPlatformName(Darwin::DarwinPlatformKind Platform, Darwin::DarwinEnvironmentKind Environment)
static const char * ArmMachOArchNameCPU(StringRef CPU)
static void addExportedSymbol(ArgStringList &CmdArgs, const char *Symbol)
Add an export directive for Symbol to the link command.
static StringRef getXcodeDeveloperPath(StringRef PathIntoXcode)
Take a path that speculatively points into Xcode and return the XCODE/Contents/Developer path if it i...
static void addSectalignToPage(const ArgList &Args, ArgStringList &CmdArgs, StringRef Segment, StringRef Section)
Add a sectalign directive for Segment and Section to the maximum expected page size for Darwin.
llvm::MachO::Target Target
Defines types useful for describing an Objective-C runtime.
The information about the darwin SDK that was used during this compilation.
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
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
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,...
bool willEmitRemarks(const llvm::opt::ArgList &Args)
The JSON file list parser is used to communicate input to InstallAPI.
Expected< std::optional< DarwinSDKInfo > > parseDarwinSDKInfo(llvm::vfs::FileSystem &VFS, StringRef SDKRootPath)
Parse the SDK information from the SDKSettings.json file.
@ Result
The result type of a method or function.
llvm::VersionTuple alignedAllocMinVersion(llvm::Triple::OSType OS)
const FunctionProtoType * T
llvm::StringRef getAsString(SyncScope S)
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()