9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
34 const llvm::opt::ArgList &Args);
37 virtual void anchor();
40 void AddMachOArch(
const llvm::opt::ArgList &Args,
41 llvm::opt::ArgStringList &CmdArgs)
const;
55 :
MachOTool(
"darwin::Assembler",
"assembler", TC) {}
61 const llvm::opt::ArgList &TCArgs,
62 const char *LinkingOutput)
const override;
67 void AddLinkArgs(
Compilation &C,
const llvm::opt::ArgList &Args,
68 llvm::opt::ArgStringList &CmdArgs,
70 bool LinkerIsLLD,
bool UsePlatformVersion)
const;
80 const llvm::opt::ArgList &TCArgs,
81 const char *LinkingOutput)
const override;
87 :
MachOTool(
"darwin::StaticLibTool",
"static-lib-linker", TC) {}
94 const llvm::opt::ArgList &TCArgs,
95 const char *LinkingOutput)
const override;
106 const llvm::opt::ArgList &TCArgs,
107 const char *LinkingOutput)
const override;
113 :
MachOTool(
"darwin::Dsymutil",
"dsymutil", TC) {}
120 const llvm::opt::ArgList &TCArgs,
121 const char *LinkingOutput)
const override;
127 :
MachOTool(
"darwin::VerifyDebug",
"dwarfdump", TC) {}
133 const llvm::opt::ArgList &TCArgs,
134 const char *LinkingOutput)
const override;
139namespace toolchains {
143 Tool *buildAssembler()
const override;
144 Tool *buildLinker()
const override;
145 Tool *buildStaticLibTool()
const override;
149 addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
150 llvm::opt::ArgStringList &CC1Args,
154 mutable std::unique_ptr<tools::darwin::Lipo> Lipo;
155 mutable std::unique_ptr<tools::darwin::Dsymutil> Dsymutil;
156 mutable std::unique_ptr<tools::darwin::VerifyDebug> VerifyDebug;
159 mutable std::optional<VersionTuple> LinkerVersion;
163 const llvm::opt::ArgList &Args);
171 StringRef getMachOArchName(
const llvm::opt::ArgList &Args)
const;
175 VersionTuple getLinkerVersion(
const llvm::opt::ArgList &Args)
const;
179 llvm::opt::ArgStringList &CmdArgs)
const {}
185 virtual void AddLinkRuntimeLibArgs(
const llvm::opt::ArgList &Args,
186 llvm::opt::ArgStringList &CmdArgs,
187 bool ForceLinkBuiltinRT =
false)
const;
190 llvm::opt::ArgStringList &CmdArgs)
const {
194 llvm::opt::ArgStringList &CmdArgs)
const {}
197 llvm::opt::ArgStringList &CmdArgs)
const {
210 RLO_AlwaysLink = 1 << 0,
213 RLO_IsEmbedded = 1 << 1,
216 RLO_AddRPath = 1 << 2,
220 void AddLinkRuntimeLib(
const llvm::opt::ArgList &Args,
221 llvm::opt::ArgStringList &CmdArgs, StringRef Component,
222 RuntimeLinkOptions Opts = RuntimeLinkOptions(),
223 bool IsShared =
false)
const;
228 llvm::opt::ArgStringList &CmdArgs)
const override {
235 std::string getCompilerRT(
const llvm::opt::ArgList &Args, StringRef Component,
237 bool IsFortran =
false)
const override;
243 types::ID LookupTypeForExtension(StringRef Ext)
const override;
245 bool HasNativeLLVMSupport()
const override;
247 llvm::opt::DerivedArgList *
248 TranslateArgs(
const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
263 return getTriple().getArch() != llvm::Triple::x86;
269 getDefaultUnwindTableLevel(
const llvm::opt::ArgList &Args)
const override;
272 return ToolChain::RLT_CompilerRT;
275 bool isPICDefault()
const override;
276 bool isPIEDefault(
const llvm::opt::ArgList &Args)
const override;
277 bool isPICDefaultForced()
const override;
279 bool SupportsProfiling()
const override;
281 bool UseDwarfDebugFlags()
const override;
282 std::string GetGlobalDebugPathRemapping()
const override;
284 llvm::ExceptionHandling
286 return llvm::ExceptionHandling::None;
303 const llvm::opt::ArgList &Args);
310 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
311 llvm::opt::ArgStringList &CC1Args)
const override;
313 void AddCudaIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
314 llvm::opt::ArgStringList &CC1Args)
const override;
315 void AddHIPIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
316 llvm::opt::ArgStringList &CC1Args)
const override;
317 void addSYCLIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
318 llvm::opt::ArgStringList &CC1Args)
const override;
320 void AddClangCXXStdlibIncludeArgs(
321 const llvm::opt::ArgList &DriverArgs,
322 llvm::opt::ArgStringList &CC1Args)
const override;
323 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
324 llvm::opt::ArgStringList &CmdArgs)
const override;
326 void printVerboseInfo(raw_ostream &OS)
const override;
335 GetEffectiveSysroot(
const llvm::opt::ArgList &DriverArgs)
const;
339 AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
340 llvm::opt::ArgStringList &CC1Args)
const;
360 LastDarwinPlatform = XROS
383 void AddDeploymentTarget(llvm::opt::DerivedArgList &Args)
const;
387 const llvm::opt::ArgList &Args);
390 std::string ComputeEffectiveClangTriple(
const llvm::opt::ArgList &Args,
396 void addMinVersionArgs(
const llvm::opt::ArgList &Args,
397 llvm::opt::ArgStringList &CmdArgs)
const override;
399 void addPlatformVersionArgs(
const llvm::opt::ArgList &Args,
400 llvm::opt::ArgStringList &CmdArgs)
const override;
402 void addStartObjectFileArgs(
const llvm::opt::ArgList &Args,
403 llvm::opt::ArgStringList &CmdArgs)
const override;
406 return (!(isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) &&
407 !isTargetWatchOS() && !isTargetDriverKit());
410 void addProfileRTLibs(
const llvm::opt::ArgList &Args,
411 llvm::opt::ArgStringList &CmdArgs)
const override;
415 std::string getCompilerRT(
const llvm::opt::ArgList &Args, StringRef Component,
417 bool IsFortran =
false)
const override;
427 unsigned Major,
unsigned Minor,
unsigned Micro,
428 VersionTuple NativeTargetVersion)
const {
431 if (TargetInitialized && TargetPlatform == Platform &&
432 TargetEnvironment == Environment &&
433 (Environment == MacCatalyst ? OSTargetVersion : TargetVersion) ==
434 VersionTuple(Major, Minor, Micro))
437 assert(!TargetInitialized &&
"Target already initialized!");
438 TargetInitialized =
true;
439 TargetPlatform = Platform;
440 TargetEnvironment = Environment;
441 TargetVersion = VersionTuple(Major, Minor, Micro);
442 if (Environment == Simulator)
443 const_cast<Darwin *
>(
this)->setTripleEnvironment(llvm::Triple::Simulator);
444 else if (Environment == MacCatalyst) {
445 const_cast<Darwin *
>(
this)->setTripleEnvironment(llvm::Triple::MacABI);
446 TargetVersion = NativeTargetVersion;
447 OSTargetVersion = VersionTuple(Major, Minor, Micro);
453 assert(TargetInitialized &&
"Target not initialized!");
454 return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&
455 TargetEnvironment == NativeEnvironment;
459 assert(TargetInitialized &&
"Target not initialized!");
460 return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&
461 TargetEnvironment == Simulator;
465 assert(TargetInitialized &&
"Target not initialized!");
466 return isTargetIPhoneOS() || isTargetIOSSimulator();
470 return TargetPlatform == XROS && TargetEnvironment == NativeEnvironment;
474 return TargetPlatform == XROS && TargetEnvironment == Simulator;
480 assert(TargetInitialized &&
"Target not initialized!");
481 return TargetPlatform == TvOS && TargetEnvironment == NativeEnvironment;
485 assert(TargetInitialized &&
"Target not initialized!");
486 return TargetPlatform == TvOS && TargetEnvironment == Simulator;
490 assert(TargetInitialized &&
"Target not initialized!");
491 return TargetPlatform == TvOS;
495 assert(TargetInitialized &&
"Target not initialized!");
496 return TargetPlatform == WatchOS && TargetEnvironment == NativeEnvironment;
500 assert(TargetInitialized &&
"Target not initialized!");
501 return TargetPlatform == WatchOS && TargetEnvironment == Simulator;
505 assert(TargetInitialized &&
"Target not initialized!");
506 return TargetPlatform == WatchOS;
510 assert(TargetInitialized &&
"Target not initialized!");
511 return TargetPlatform == DriverKit;
515 return TargetPlatform == IPhoneOS && TargetEnvironment == MacCatalyst;
519 assert(TargetInitialized &&
"Target not initialized!");
520 return TargetPlatform == MacOS;
524 assert(TargetInitialized &&
"Target not initialized!");
525 return TargetPlatform == MacOS || isTargetMacCatalyst();
529 assert(TargetInitialized &&
"Target not initialized!");
530 return isTargetMacOSBased() && getArch() == llvm::Triple::aarch64;
540 assert(TargetInitialized &&
"Target not initialized!");
541 return isTargetMacCatalyst() ? OSTargetVersion : TargetVersion;
545 unsigned V2 = 0)
const {
546 assert(isTargetIOSBased() &&
"Unexpected call for non iOS target!");
547 return TargetVersion < VersionTuple(V0, V1, V2);
555 assert(isTargetMacOSBased() &&
556 (getTriple().isMacOSX() || getTriple().isMacCatalystEnvironment()) &&
557 "Unexpected call for non OS X target!");
560 VersionTuple MinVers =
561 llvm::Triple(getTriple().getArchName(),
"apple",
"macos")
562 .getMinimumSupportedOSVersion();
563 return (!MinVers.empty() && MinVers > TargetVersion
565 : TargetVersion) < VersionTuple(V0, V1, V2);
572 bool isAlignedAllocationUnavailable()
const;
576 bool isSizedDeallocationUnavailable()
const;
578 void addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
579 llvm::opt::ArgStringList &CC1Args,
582 void addClangCC1ASTargetOptions(
583 const llvm::opt::ArgList &Args,
584 llvm::opt::ArgStringList &CC1ASArgs)
const override;
586 StringRef getPlatformFamily()
const;
587 StringRef getOSLibraryNameSuffix(
bool IgnoreSim =
false)
const override;
590 static StringRef getSDKName(StringRef isysroot);
601 llvm::opt::DerivedArgList *
602 TranslateArgs(
const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
605 CXXStdlibType GetDefaultCXXStdlibType()
const override;
606 ObjCRuntime getDefaultObjCRuntime(
bool isNonFragile)
const override;
607 bool hasBlocksRuntime()
const override;
613 return !(isTargetMacOSBased() && isMacosxVersionLT(10, 6));
620 if (isTargetIOSBased() || isTargetWatchOSBased() || isTargetDriverKit() ||
622 return LangOptions::SSPOn;
623 else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 6))
624 return LangOptions::SSPOn;
625 else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 5) && !KernelOrKext)
626 return LangOptions::SSPOn;
628 return LangOptions::SSPOff;
631 void CheckObjCARC()
const override;
633 llvm::ExceptionHandling GetExceptionModel(
634 const llvm::opt::ArgList &Args)
const override;
636 bool SupportsEmbeddedBitcode()
const override;
645 const llvm::opt::ArgList &Args);
651 AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
652 llvm::opt::ArgStringList &CC1Args)
const override;
654 RuntimeLibType GetRuntimeLibType(
const llvm::opt::ArgList &Args)
const override;
656 void AddLinkRuntimeLibArgs(
const llvm::opt::ArgList &Args,
657 llvm::opt::ArgStringList &CmdArgs,
658 bool ForceLinkBuiltinRT =
false)
const override;
660 void AddCCKextLibArgs(
const llvm::opt::ArgList &Args,
661 llvm::opt::ArgStringList &CmdArgs)
const override;
663 void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args)
const override;
666 addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
667 llvm::opt::ArgStringList &CC1Args,
670 void AddLinkARCArgs(
const llvm::opt::ArgList &Args,
671 llvm::opt::ArgStringList &CmdArgs)
const override;
673 unsigned GetDefaultDwarfVersion()
const override;
678 return llvm::DebuggerKind::LLDB;
684 void AddLinkSanitizerLibArgs(
const llvm::opt::ArgList &Args,
685 llvm::opt::ArgStringList &CmdArgs,
687 bool shared =
true)
const;
690 AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
691 llvm::opt::ArgStringList &CC1Args)
const override;
693 bool AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
694 llvm::opt::ArgStringList &CC1Args,
696 llvm::StringRef Version,
697 llvm::StringRef ArchDir,
698 llvm::StringRef BitDir)
const;
Defines the clang::LangOptions interface.
llvm::MachO::FileType FileType
Simple wrapper for toolchain detector with costly initialization.
The basic abstraction for the target Objective-C runtime.
The base class of the type hierarchy.
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...
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T