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 {
175 CmdArgs.push_back(
"-arch");
176 CmdArgs.push_back(Args.MakeArgString(ArchName));
179 if (ArchName ==
"arm")
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();
223 const toolchains::MachO &MachOTC = getMachOToolChain();
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;
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);
274 SmallString<128> LibLTOPath(P);
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);
468 SmallString<128> Path(CSPGOGenerateArg->getNumValues() == 0
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));
475 SmallString<128> 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;
593 Args.MakeArgString(
getToolChain().GetLinkerPath(&LinkerIsLLD));
596 bool UsePlatformVersion =
getToolChain().getTriple().isXROS();
600 AddLinkArgs(
C, Args, CmdArgs, Inputs, Version, LinkerIsLLD,
610 Args.getLastArg(options::OPT_moutline, options::OPT_mno_outline)) {
611 if (A->getOption().matches(options::OPT_moutline)) {
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);
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))
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());
705 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
706 getToolChain().addFortranRuntimeLibraryPath(Args, CmdArgs);
710 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
714 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
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");
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)));
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) {
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;
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);
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 {
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));
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)
1180 :
Darwin(D, Triple, 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");
1248 if (!
getVFS().exists(P)) {
1249 auto updatePath = [&](
const Arg *A) {
1253 if (XcodePathForSDK.empty())
1256 P = XcodePathForSDK;
1257 llvm::sys::path::append(P,
"Toolchains/XcodeDefault.xctoolchain/usr",
1259 return getVFS().exists(P);
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);
1909 DarwinSDKInfo inferSDKInfo() {
1910 assert(Kind == InferredFromSDK &&
"can infer SDK info only");
1911 return DarwinSDKInfo(getOSVersion(),
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 =
2014 [&](DarwinPlatform::DarwinPlatformKind Platform, Arg *VersionArg,
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");
2078 for (
const auto &I : llvm::enumerate(llvm::ArrayRef(EnvVars))) {
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];
2110 for (
const auto &
Target : llvm::enumerate(llvm::ArrayRef(Targets))) {
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");
2616llvm::SmallString<128>
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");
2861 if (!
getVFS().exists(P)) {
2862 llvm::sys::path::remove_filename(P);
2863 llvm::sys::path::append(P,
"libstdc++.6.dylib");
2864 if (
getVFS().exists(P)) {
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) {
3646 CmdArgs.push_back(
"-ldylib1.o");
3653 CmdArgs.push_back(
"-ldylib1.o");
3655 CmdArgs.push_back(
"-ldylib1.10.5.o");
3660 ArgStringList &CmdArgs) {
3661 if (Args.hasArg(options::OPT_static))
3666 CmdArgs.push_back(
"-lbundle1.o");
3671 ArgStringList &CmdArgs) {
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");
3687 CmdArgs.push_back(
"-no_new_main");
3689 D.
getDriver().
Diag(diag::err_drv_clang_unsupported_opt_pg_darwin)
3695 ArgStringList &CmdArgs) {
3698 if (D.
getArch() == llvm::Triple::aarch64)
3701 CmdArgs.push_back(
"-lcrt1.o");
3703 CmdArgs.push_back(
"-lcrt1.3.1.o");
3710 CmdArgs.push_back(
"-lcrt1.o");
3712 CmdArgs.push_back(
"-lcrt1.10.5.o");
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...
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.
Defines types useful for describing an Objective-C runtime.
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)
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.
const FunctionProtoType * T
llvm::VersionTuple alignedAllocMinVersion(llvm::Triple::OSType OS)
llvm::StringRef getAsString(SyncScope S)
bool(*)(llvm::ArrayRef< const char * >, llvm::raw_ostream &, llvm::raw_ostream &, bool, bool) Driver
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()