9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
34 virtual void anchor();
37 void AddMachOArch(
const llvm::opt::ArgList &Args,
38 llvm::opt::ArgStringList &CmdArgs)
const;
46 :
Tool(Name, ShortName, TC) {}
52 :
MachOTool(
"darwin::Assembler",
"assembler", TC) {}
58 const llvm::opt::ArgList &TCArgs,
59 const char *LinkingOutput)
const override;
64 void AddLinkArgs(
Compilation &C,
const llvm::opt::ArgList &Args,
65 llvm::opt::ArgStringList &CmdArgs,
67 bool LinkerIsLLD)
const;
77 const llvm::opt::ArgList &TCArgs,
78 const char *LinkingOutput)
const override;
84 :
MachOTool(
"darwin::StaticLibTool",
"static-lib-linker", TC) {}
91 const llvm::opt::ArgList &TCArgs,
92 const char *LinkingOutput)
const override;
103 const llvm::opt::ArgList &TCArgs,
104 const char *LinkingOutput)
const override;
110 :
MachOTool(
"darwin::Dsymutil",
"dsymutil", TC) {}
117 const llvm::opt::ArgList &TCArgs,
118 const char *LinkingOutput)
const override;
124 :
MachOTool(
"darwin::VerifyDebug",
"dwarfdump", TC) {}
130 const llvm::opt::ArgList &TCArgs,
131 const char *LinkingOutput)
const override;
136namespace toolchains {
140 Tool *buildAssembler()
const override;
141 Tool *buildLinker()
const override;
142 Tool *buildStaticLibTool()
const override;
146 mutable std::unique_ptr<tools::darwin::Lipo> Lipo;
147 mutable std::unique_ptr<tools::darwin::Dsymutil> Dsymutil;
148 mutable std::unique_ptr<tools::darwin::VerifyDebug> VerifyDebug;
151 mutable std::optional<VersionTuple> LinkerVersion;
155 const llvm::opt::ArgList &Args);
163 StringRef getMachOArchName(
const llvm::opt::ArgList &Args)
const;
167 VersionTuple getLinkerVersion(
const llvm::opt::ArgList &Args)
const;
171 llvm::opt::ArgStringList &CmdArgs)
const {}
177 virtual void AddLinkRuntimeLibArgs(
const llvm::opt::ArgList &Args,
178 llvm::opt::ArgStringList &CmdArgs,
179 bool ForceLinkBuiltinRT =
false)
const;
182 llvm::opt::ArgStringList &CmdArgs)
const {
186 llvm::opt::ArgStringList &CmdArgs)
const {}
189 llvm::opt::ArgStringList &CmdArgs)
const {
202 RLO_AlwaysLink = 1 << 0,
205 RLO_IsEmbedded = 1 << 1,
208 RLO_AddRPath = 1 << 2,
212 void AddLinkRuntimeLib(
const llvm::opt::ArgList &Args,
213 llvm::opt::ArgStringList &CmdArgs, StringRef Component,
214 RuntimeLinkOptions Opts = RuntimeLinkOptions(),
215 bool IsShared =
false)
const;
220 llvm::opt::ArgStringList &CmdArgs)
const override {
228 types::ID LookupTypeForExtension(StringRef Ext)
const override;
230 bool HasNativeLLVMSupport()
const override;
232 llvm::opt::DerivedArgList *
233 TranslateArgs(
const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
252 return getTriple().getArch() != llvm::Triple::x86;
258 getDefaultUnwindTableLevel(
const llvm::opt::ArgList &Args)
const override;
261 return ToolChain::RLT_CompilerRT;
264 bool isPICDefault()
const override;
265 bool isPIEDefault(
const llvm::opt::ArgList &Args)
const override;
266 bool isPICDefaultForced()
const override;
268 bool SupportsProfiling()
const override;
270 bool UseDwarfDebugFlags()
const override;
271 std::string GetGlobalDebugPathRemapping()
const override;
273 llvm::ExceptionHandling
275 return llvm::ExceptionHandling::None;
304 LastDarwinPlatform = DriverKit
330 void AddDeploymentTarget(llvm::opt::DerivedArgList &Args)
const;
334 const llvm::opt::ArgList &Args);
337 std::string ComputeEffectiveClangTriple(
const llvm::opt::ArgList &Args,
343 void addMinVersionArgs(
const llvm::opt::ArgList &Args,
344 llvm::opt::ArgStringList &CmdArgs)
const override;
346 void addPlatformVersionArgs(
const llvm::opt::ArgList &Args,
347 llvm::opt::ArgStringList &CmdArgs)
const override;
349 void addStartObjectFileArgs(
const llvm::opt::ArgList &Args,
350 llvm::opt::ArgStringList &CmdArgs)
const override;
353 return (!(isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) &&
354 !isTargetWatchOS() && !isTargetDriverKit());
357 void addProfileRTLibs(
const llvm::opt::ArgList &Args,
358 llvm::opt::ArgStringList &CmdArgs)
const override;
368 unsigned Major,
unsigned Minor,
unsigned Micro,
369 VersionTuple NativeTargetVersion)
const {
372 if (TargetInitialized && TargetPlatform == Platform &&
373 TargetEnvironment == Environment &&
374 (Environment == MacCatalyst ? OSTargetVersion :
TargetVersion) ==
375 VersionTuple(Major, Minor, Micro))
378 assert(!TargetInitialized &&
"Target already initialized!");
379 TargetInitialized =
true;
380 TargetPlatform = Platform;
381 TargetEnvironment = Environment;
383 if (Environment == Simulator)
384 const_cast<Darwin *
>(
this)->setTripleEnvironment(llvm::Triple::Simulator);
385 else if (Environment == MacCatalyst) {
386 const_cast<Darwin *
>(
this)->setTripleEnvironment(llvm::Triple::MacABI);
388 OSTargetVersion = VersionTuple(Major, Minor, Micro);
394 assert(TargetInitialized &&
"Target not initialized!");
395 return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&
396 TargetEnvironment == NativeEnvironment;
400 assert(TargetInitialized &&
"Target not initialized!");
401 return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&
402 TargetEnvironment == Simulator;
406 assert(TargetInitialized &&
"Target not initialized!");
407 return isTargetIPhoneOS() || isTargetIOSSimulator();
411 assert(TargetInitialized &&
"Target not initialized!");
412 return TargetPlatform == TvOS && TargetEnvironment == NativeEnvironment;
416 assert(TargetInitialized &&
"Target not initialized!");
417 return TargetPlatform == TvOS && TargetEnvironment == Simulator;
421 assert(TargetInitialized &&
"Target not initialized!");
422 return TargetPlatform == TvOS;
426 assert(TargetInitialized &&
"Target not initialized!");
427 return TargetPlatform == WatchOS && TargetEnvironment == NativeEnvironment;
431 assert(TargetInitialized &&
"Target not initialized!");
432 return TargetPlatform == WatchOS && TargetEnvironment == Simulator;
436 assert(TargetInitialized &&
"Target not initialized!");
437 return TargetPlatform == WatchOS;
441 assert(TargetInitialized &&
"Target not initialized!");
442 return TargetPlatform == DriverKit;
446 return TargetPlatform == IPhoneOS && TargetEnvironment == MacCatalyst;
450 assert(TargetInitialized &&
"Target not initialized!");
451 return TargetPlatform == MacOS;
455 assert(TargetInitialized &&
"Target not initialized!");
456 return TargetPlatform == MacOS || isTargetMacCatalyst();
460 assert(TargetInitialized &&
"Target not initialized!");
461 return isTargetMacOSBased() && getArch() == llvm::Triple::aarch64;
471 assert(TargetInitialized &&
"Target not initialized!");
472 return isTargetMacCatalyst() ? OSTargetVersion :
TargetVersion;
476 unsigned V2 = 0)
const {
477 assert(isTargetIOSBased() &&
"Unexpected call for non iOS target!");
486 assert(isTargetMacOSBased() &&
487 (getTriple().isMacOSX() || getTriple().isMacCatalystEnvironment()) &&
488 "Unexpected call for non OS X target!");
491 VersionTuple MinVers =
492 llvm::Triple(getTriple().getArchName(),
"apple",
"macos")
493 .getMinimumSupportedOSVersion();
503 bool isAlignedAllocationUnavailable()
const;
505 void addClangTargetOptions(
const llvm::opt::ArgList &DriverArgs,
506 llvm::opt::ArgStringList &CC1Args,
509 void addClangCC1ASTargetOptions(
510 const llvm::opt::ArgList &Args,
511 llvm::opt::ArgStringList &CC1ASArgs)
const override;
513 StringRef getPlatformFamily()
const;
514 StringRef getOSLibraryNameSuffix(
bool IgnoreSim =
false)
const override;
517 static StringRef getSDKName(StringRef isysroot);
528 llvm::opt::DerivedArgList *
529 TranslateArgs(
const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
532 CXXStdlibType GetDefaultCXXStdlibType()
const override;
533 ObjCRuntime getDefaultObjCRuntime(
bool isNonFragile)
const override;
534 bool hasBlocksRuntime()
const override;
536 void AddCudaIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
537 llvm::opt::ArgStringList &CC1Args)
const override;
538 void AddHIPIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
539 llvm::opt::ArgStringList &CC1Args)
const override;
545 return !(isTargetMacOSBased() && isMacosxVersionLT(10, 6));
552 if (isTargetIOSBased() || isTargetWatchOSBased() || isTargetDriverKit())
553 return LangOptions::SSPOn;
554 else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 6))
555 return LangOptions::SSPOn;
556 else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 5) && !KernelOrKext)
557 return LangOptions::SSPOn;
559 return LangOptions::SSPOff;
562 void CheckObjCARC()
const override;
564 llvm::ExceptionHandling GetExceptionModel(
565 const llvm::opt::ArgList &Args)
const override;
567 bool SupportsEmbeddedBitcode()
const override;
571 void printVerboseInfo(raw_ostream &OS)
const override;
578 const llvm::opt::ArgList &Args);
583 RuntimeLibType GetRuntimeLibType(
const llvm::opt::ArgList &Args)
const override;
585 void AddLinkRuntimeLibArgs(
const llvm::opt::ArgList &Args,
586 llvm::opt::ArgStringList &CmdArgs,
587 bool ForceLinkBuiltinRT =
false)
const override;
589 void AddClangCXXStdlibIncludeArgs(
590 const llvm::opt::ArgList &DriverArgs,
591 llvm::opt::ArgStringList &CC1Args)
const override;
593 void AddClangSystemIncludeArgs(
const llvm::opt::ArgList &DriverArgs,
594 llvm::opt::ArgStringList &CC1Args)
const override;
596 void AddCXXStdlibLibArgs(
const llvm::opt::ArgList &Args,
597 llvm::opt::ArgStringList &CmdArgs)
const override;
599 void AddCCKextLibArgs(
const llvm::opt::ArgList &Args,
600 llvm::opt::ArgStringList &CmdArgs)
const override;
602 void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args)
const override;
604 void AddLinkARCArgs(
const llvm::opt::ArgList &Args,
605 llvm::opt::ArgStringList &CmdArgs)
const override;
607 unsigned GetDefaultDwarfVersion()
const override;
612 return llvm::DebuggerKind::LLDB;
618 void AddLinkSanitizerLibArgs(
const llvm::opt::ArgList &Args,
619 llvm::opt::ArgStringList &CmdArgs,
621 bool shared =
true)
const;
623 bool AddGnuCPlusPlusIncludePaths(
const llvm::opt::ArgList &DriverArgs,
624 llvm::opt::ArgStringList &CC1Args,
626 llvm::StringRef Version,
627 llvm::StringRef ArchDir,
628 llvm::StringRef BitDir)
const;
631 GetEffectiveSysroot(
const llvm::opt::ArgList &DriverArgs)
const;
Defines the clang::LangOptions interface.
The basic abstraction for the target Objective-C runtime.
Compilation - A set of tasks to perform for a single driver invocation.
A class to find a viable CUDA installation.
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
A class to find a viable ROCM installation TODO: Generalize to handle libclc.