Darwin.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. //===--- Darwin.h - Darwin ToolChain Implementations ------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
  9. #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
  10. #include "Cuda.h"
  11. #include "ROCm.h"
  12. #include "clang/Basic/DarwinSDKInfo.h"
  13. #include "clang/Basic/LangOptions.h"
  14. #include "clang/Driver/Tool.h"
  15. #include "clang/Driver/ToolChain.h"
  16. #include "clang/Driver/XRayArgs.h"
  17. namespace clang {
  18. namespace driver {
  19. namespace toolchains {
  20. class MachO;
  21. } // end namespace toolchains
  22. namespace tools {
  23. namespace darwin {
  24. llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
  25. void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
  26. class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
  27. virtual void anchor();
  28. protected:
  29. void AddMachOArch(const llvm::opt::ArgList &Args,
  30. llvm::opt::ArgStringList &CmdArgs) const;
  31. const toolchains::MachO &getMachOToolChain() const {
  32. return reinterpret_cast<const toolchains::MachO &>(getToolChain());
  33. }
  34. public:
  35. MachOTool(const char *Name, const char *ShortName, const ToolChain &TC)
  36. : Tool(Name, ShortName, TC) {}
  37. };
  38. class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
  39. public:
  40. Assembler(const ToolChain &TC)
  41. : MachOTool("darwin::Assembler", "assembler", TC) {}
  42. bool hasIntegratedCPP() const override { return false; }
  43. void ConstructJob(Compilation &C, const JobAction &JA,
  44. const InputInfo &Output, const InputInfoList &Inputs,
  45. const llvm::opt::ArgList &TCArgs,
  46. const char *LinkingOutput) const override;
  47. };
  48. class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
  49. bool NeedsTempPath(const InputInfoList &Inputs) const;
  50. void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
  51. llvm::opt::ArgStringList &CmdArgs,
  52. const InputInfoList &Inputs, VersionTuple Version,
  53. bool LinkerIsLLD) const;
  54. public:
  55. Linker(const ToolChain &TC) : MachOTool("darwin::Linker", "linker", TC) {}
  56. bool hasIntegratedCPP() const override { return false; }
  57. bool isLinkJob() const override { return true; }
  58. void ConstructJob(Compilation &C, const JobAction &JA,
  59. const InputInfo &Output, const InputInfoList &Inputs,
  60. const llvm::opt::ArgList &TCArgs,
  61. const char *LinkingOutput) const override;
  62. };
  63. class LLVM_LIBRARY_VISIBILITY StaticLibTool : public MachOTool {
  64. public:
  65. StaticLibTool(const ToolChain &TC)
  66. : MachOTool("darwin::StaticLibTool", "static-lib-linker", TC) {}
  67. bool hasIntegratedCPP() const override { return false; }
  68. bool isLinkJob() const override { return true; }
  69. void ConstructJob(Compilation &C, const JobAction &JA,
  70. const InputInfo &Output, const InputInfoList &Inputs,
  71. const llvm::opt::ArgList &TCArgs,
  72. const char *LinkingOutput) const override;
  73. };
  74. class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
  75. public:
  76. Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
  77. bool hasIntegratedCPP() const override { return false; }
  78. void ConstructJob(Compilation &C, const JobAction &JA,
  79. const InputInfo &Output, const InputInfoList &Inputs,
  80. const llvm::opt::ArgList &TCArgs,
  81. const char *LinkingOutput) const override;
  82. };
  83. class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
  84. public:
  85. Dsymutil(const ToolChain &TC)
  86. : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
  87. bool hasIntegratedCPP() const override { return false; }
  88. bool isDsymutilJob() const override { return true; }
  89. void ConstructJob(Compilation &C, const JobAction &JA,
  90. const InputInfo &Output, const InputInfoList &Inputs,
  91. const llvm::opt::ArgList &TCArgs,
  92. const char *LinkingOutput) const override;
  93. };
  94. class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
  95. public:
  96. VerifyDebug(const ToolChain &TC)
  97. : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
  98. bool hasIntegratedCPP() const override { return false; }
  99. void ConstructJob(Compilation &C, const JobAction &JA,
  100. const InputInfo &Output, const InputInfoList &Inputs,
  101. const llvm::opt::ArgList &TCArgs,
  102. const char *LinkingOutput) const override;
  103. };
  104. } // end namespace darwin
  105. } // end namespace tools
  106. namespace toolchains {
  107. class LLVM_LIBRARY_VISIBILITY MachO : public ToolChain {
  108. protected:
  109. Tool *buildAssembler() const override;
  110. Tool *buildLinker() const override;
  111. Tool *buildStaticLibTool() const override;
  112. Tool *getTool(Action::ActionClass AC) const override;
  113. private:
  114. mutable std::unique_ptr<tools::darwin::Lipo> Lipo;
  115. mutable std::unique_ptr<tools::darwin::Dsymutil> Dsymutil;
  116. mutable std::unique_ptr<tools::darwin::VerifyDebug> VerifyDebug;
  117. /// The version of the linker known to be available in the tool chain.
  118. mutable std::optional<VersionTuple> LinkerVersion;
  119. public:
  120. MachO(const Driver &D, const llvm::Triple &Triple,
  121. const llvm::opt::ArgList &Args);
  122. ~MachO() override;
  123. /// @name MachO specific toolchain API
  124. /// {
  125. /// Get the "MachO" arch name for a particular compiler invocation. For
  126. /// example, Apple treats different ARM variations as distinct architectures.
  127. StringRef getMachOArchName(const llvm::opt::ArgList &Args) const;
  128. /// Get the version of the linker known to be available for a particular
  129. /// compiler invocation (via the `-mlinker-version=` arg).
  130. VersionTuple getLinkerVersion(const llvm::opt::ArgList &Args) const;
  131. /// Add the linker arguments to link the ARC runtime library.
  132. virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args,
  133. llvm::opt::ArgStringList &CmdArgs) const {}
  134. /// Add the linker arguments to link the compiler runtime library.
  135. ///
  136. /// FIXME: This API is intended for use with embedded libraries only, and is
  137. /// misleadingly named.
  138. virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
  139. llvm::opt::ArgStringList &CmdArgs,
  140. bool ForceLinkBuiltinRT = false) const;
  141. virtual void addStartObjectFileArgs(const llvm::opt::ArgList &Args,
  142. llvm::opt::ArgStringList &CmdArgs) const {
  143. }
  144. virtual void addMinVersionArgs(const llvm::opt::ArgList &Args,
  145. llvm::opt::ArgStringList &CmdArgs) const {}
  146. virtual void addPlatformVersionArgs(const llvm::opt::ArgList &Args,
  147. llvm::opt::ArgStringList &CmdArgs) const {
  148. }
  149. /// On some iOS platforms, kernel and kernel modules were built statically. Is
  150. /// this such a target?
  151. virtual bool isKernelStatic() const { return false; }
  152. /// Is the target either iOS or an iOS simulator?
  153. bool isTargetIOSBased() const { return false; }
  154. /// Options to control how a runtime library is linked.
  155. enum RuntimeLinkOptions : unsigned {
  156. /// Link the library in even if it can't be found in the VFS.
  157. RLO_AlwaysLink = 1 << 0,
  158. /// Use the embedded runtime from the macho_embedded directory.
  159. RLO_IsEmbedded = 1 << 1,
  160. /// Emit rpaths for @executable_path as well as the resource directory.
  161. RLO_AddRPath = 1 << 2,
  162. };
  163. /// Add a runtime library to the list of items to link.
  164. void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,
  165. llvm::opt::ArgStringList &CmdArgs, StringRef Component,
  166. RuntimeLinkOptions Opts = RuntimeLinkOptions(),
  167. bool IsShared = false) const;
  168. /// Add any profiling runtime libraries that are needed. This is essentially a
  169. /// MachO specific version of addProfileRT in Tools.cpp.
  170. void addProfileRTLibs(const llvm::opt::ArgList &Args,
  171. llvm::opt::ArgStringList &CmdArgs) const override {
  172. // There aren't any profiling libs for embedded targets currently.
  173. }
  174. /// }
  175. /// @name ToolChain Implementation
  176. /// {
  177. types::ID LookupTypeForExtension(StringRef Ext) const override;
  178. bool HasNativeLLVMSupport() const override;
  179. llvm::opt::DerivedArgList *
  180. TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
  181. Action::OffloadKind DeviceOffloadKind) const override;
  182. bool IsBlocksDefault() const override {
  183. // Always allow blocks on Apple; users interested in versioning are
  184. // expected to use /usr/include/Block.h.
  185. return true;
  186. }
  187. bool IsIntegratedAssemblerDefault() const override {
  188. // Default integrated assembler to on for Apple's MachO targets.
  189. return true;
  190. }
  191. bool IsMathErrnoDefault() const override { return false; }
  192. bool IsEncodeExtendedBlockSignatureDefault() const override { return true; }
  193. bool IsObjCNonFragileABIDefault() const override {
  194. // Non-fragile ABI is default for everything but i386.
  195. return getTriple().getArch() != llvm::Triple::x86;
  196. }
  197. bool UseObjCMixedDispatch() const override { return true; }
  198. UnwindTableLevel
  199. getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override;
  200. RuntimeLibType GetDefaultRuntimeLibType() const override {
  201. return ToolChain::RLT_CompilerRT;
  202. }
  203. bool isPICDefault() const override;
  204. bool isPIEDefault(const llvm::opt::ArgList &Args) const override;
  205. bool isPICDefaultForced() const override;
  206. bool SupportsProfiling() const override;
  207. bool UseDwarfDebugFlags() const override;
  208. std::string GetGlobalDebugPathRemapping() const override;
  209. llvm::ExceptionHandling
  210. GetExceptionModel(const llvm::opt::ArgList &Args) const override {
  211. return llvm::ExceptionHandling::None;
  212. }
  213. virtual StringRef getOSLibraryNameSuffix(bool IgnoreSim = false) const {
  214. return "";
  215. }
  216. // Darwin toolchain uses legacy thin LTO API, which is not
  217. // capable of unit splitting.
  218. bool canSplitThinLTOUnit() const override { return false; }
  219. /// }
  220. };
  221. /// Darwin - The base Darwin tool chain.
  222. class LLVM_LIBRARY_VISIBILITY Darwin : public MachO {
  223. public:
  224. /// Whether the information on the target has been initialized.
  225. //
  226. // FIXME: This should be eliminated. What we want to do is make this part of
  227. // the "default target for arguments" selection process, once we get out of
  228. // the argument translation business.
  229. mutable bool TargetInitialized;
  230. enum DarwinPlatformKind {
  231. MacOS,
  232. IPhoneOS,
  233. TvOS,
  234. WatchOS,
  235. DriverKit,
  236. LastDarwinPlatform = DriverKit
  237. };
  238. enum DarwinEnvironmentKind {
  239. NativeEnvironment,
  240. Simulator,
  241. MacCatalyst,
  242. };
  243. mutable DarwinPlatformKind TargetPlatform;
  244. mutable DarwinEnvironmentKind TargetEnvironment;
  245. /// The native OS version we are targeting.
  246. mutable VersionTuple TargetVersion;
  247. /// The OS version we are targeting as specified in the triple.
  248. mutable VersionTuple OSTargetVersion;
  249. /// The information about the darwin SDK that was used.
  250. mutable std::optional<DarwinSDKInfo> SDKInfo;
  251. /// The target variant triple that was specified (if any).
  252. mutable std::optional<llvm::Triple> TargetVariantTriple;
  253. CudaInstallationDetector CudaInstallation;
  254. RocmInstallationDetector RocmInstallation;
  255. private:
  256. void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const;
  257. public:
  258. Darwin(const Driver &D, const llvm::Triple &Triple,
  259. const llvm::opt::ArgList &Args);
  260. ~Darwin() override;
  261. std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
  262. types::ID InputType) const override;
  263. /// @name Apple Specific Toolchain Implementation
  264. /// {
  265. void addMinVersionArgs(const llvm::opt::ArgList &Args,
  266. llvm::opt::ArgStringList &CmdArgs) const override;
  267. void addPlatformVersionArgs(const llvm::opt::ArgList &Args,
  268. llvm::opt::ArgStringList &CmdArgs) const override;
  269. void addStartObjectFileArgs(const llvm::opt::ArgList &Args,
  270. llvm::opt::ArgStringList &CmdArgs) const override;
  271. bool isKernelStatic() const override {
  272. return (!(isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) &&
  273. !isTargetWatchOS() && !isTargetDriverKit());
  274. }
  275. void addProfileRTLibs(const llvm::opt::ArgList &Args,
  276. llvm::opt::ArgStringList &CmdArgs) const override;
  277. protected:
  278. /// }
  279. /// @name Darwin specific Toolchain functions
  280. /// {
  281. // FIXME: Eliminate these ...Target functions and derive separate tool chains
  282. // for these targets and put version in constructor.
  283. void setTarget(DarwinPlatformKind Platform, DarwinEnvironmentKind Environment,
  284. unsigned Major, unsigned Minor, unsigned Micro,
  285. VersionTuple NativeTargetVersion) const {
  286. // FIXME: For now, allow reinitialization as long as values don't
  287. // change. This will go away when we move away from argument translation.
  288. if (TargetInitialized && TargetPlatform == Platform &&
  289. TargetEnvironment == Environment &&
  290. (Environment == MacCatalyst ? OSTargetVersion : TargetVersion) ==
  291. VersionTuple(Major, Minor, Micro))
  292. return;
  293. assert(!TargetInitialized && "Target already initialized!");
  294. TargetInitialized = true;
  295. TargetPlatform = Platform;
  296. TargetEnvironment = Environment;
  297. TargetVersion = VersionTuple(Major, Minor, Micro);
  298. if (Environment == Simulator)
  299. const_cast<Darwin *>(this)->setTripleEnvironment(llvm::Triple::Simulator);
  300. else if (Environment == MacCatalyst) {
  301. const_cast<Darwin *>(this)->setTripleEnvironment(llvm::Triple::MacABI);
  302. TargetVersion = NativeTargetVersion;
  303. OSTargetVersion = VersionTuple(Major, Minor, Micro);
  304. }
  305. }
  306. public:
  307. bool isTargetIPhoneOS() const {
  308. assert(TargetInitialized && "Target not initialized!");
  309. return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&
  310. TargetEnvironment == NativeEnvironment;
  311. }
  312. bool isTargetIOSSimulator() const {
  313. assert(TargetInitialized && "Target not initialized!");
  314. return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&
  315. TargetEnvironment == Simulator;
  316. }
  317. bool isTargetIOSBased() const {
  318. assert(TargetInitialized && "Target not initialized!");
  319. return isTargetIPhoneOS() || isTargetIOSSimulator();
  320. }
  321. bool isTargetTvOS() const {
  322. assert(TargetInitialized && "Target not initialized!");
  323. return TargetPlatform == TvOS && TargetEnvironment == NativeEnvironment;
  324. }
  325. bool isTargetTvOSSimulator() const {
  326. assert(TargetInitialized && "Target not initialized!");
  327. return TargetPlatform == TvOS && TargetEnvironment == Simulator;
  328. }
  329. bool isTargetTvOSBased() const {
  330. assert(TargetInitialized && "Target not initialized!");
  331. return TargetPlatform == TvOS;
  332. }
  333. bool isTargetWatchOS() const {
  334. assert(TargetInitialized && "Target not initialized!");
  335. return TargetPlatform == WatchOS && TargetEnvironment == NativeEnvironment;
  336. }
  337. bool isTargetWatchOSSimulator() const {
  338. assert(TargetInitialized && "Target not initialized!");
  339. return TargetPlatform == WatchOS && TargetEnvironment == Simulator;
  340. }
  341. bool isTargetWatchOSBased() const {
  342. assert(TargetInitialized && "Target not initialized!");
  343. return TargetPlatform == WatchOS;
  344. }
  345. bool isTargetDriverKit() const {
  346. assert(TargetInitialized && "Target not initialized!");
  347. return TargetPlatform == DriverKit;
  348. }
  349. bool isTargetMacCatalyst() const {
  350. return TargetPlatform == IPhoneOS && TargetEnvironment == MacCatalyst;
  351. }
  352. bool isTargetMacOS() const {
  353. assert(TargetInitialized && "Target not initialized!");
  354. return TargetPlatform == MacOS;
  355. }
  356. bool isTargetMacOSBased() const {
  357. assert(TargetInitialized && "Target not initialized!");
  358. return TargetPlatform == MacOS || isTargetMacCatalyst();
  359. }
  360. bool isTargetAppleSiliconMac() const {
  361. assert(TargetInitialized && "Target not initialized!");
  362. return isTargetMacOSBased() && getArch() == llvm::Triple::aarch64;
  363. }
  364. bool isTargetInitialized() const { return TargetInitialized; }
  365. /// The version of the OS that's used by the OS specified in the target
  366. /// triple. It might be different from the actual target OS on which the
  367. /// program will run, e.g. MacCatalyst code runs on a macOS target, but its
  368. /// target triple is iOS.
  369. VersionTuple getTripleTargetVersion() const {
  370. assert(TargetInitialized && "Target not initialized!");
  371. return isTargetMacCatalyst() ? OSTargetVersion : TargetVersion;
  372. }
  373. bool isIPhoneOSVersionLT(unsigned V0, unsigned V1 = 0,
  374. unsigned V2 = 0) const {
  375. assert(isTargetIOSBased() && "Unexpected call for non iOS target!");
  376. return TargetVersion < VersionTuple(V0, V1, V2);
  377. }
  378. /// Returns true if the minimum supported macOS version for the slice that's
  379. /// being built is less than the specified version. If there's no minimum
  380. /// supported macOS version, the deployment target version is compared to the
  381. /// specifed version instead.
  382. bool isMacosxVersionLT(unsigned V0, unsigned V1 = 0, unsigned V2 = 0) const {
  383. assert(isTargetMacOSBased() &&
  384. (getTriple().isMacOSX() || getTriple().isMacCatalystEnvironment()) &&
  385. "Unexpected call for non OS X target!");
  386. // The effective triple might not be initialized yet, so construct a
  387. // pseudo-effective triple to get the minimum supported OS version.
  388. VersionTuple MinVers =
  389. llvm::Triple(getTriple().getArchName(), "apple", "macos")
  390. .getMinimumSupportedOSVersion();
  391. return (!MinVers.empty() && MinVers > TargetVersion
  392. ? MinVers
  393. : TargetVersion) < VersionTuple(V0, V1, V2);
  394. }
  395. protected:
  396. /// Return true if c++17 aligned allocation/deallocation functions are not
  397. /// implemented in the c++ standard library of the deployment target we are
  398. /// targeting.
  399. bool isAlignedAllocationUnavailable() const;
  400. void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
  401. llvm::opt::ArgStringList &CC1Args,
  402. Action::OffloadKind DeviceOffloadKind) const override;
  403. void addClangCC1ASTargetOptions(
  404. const llvm::opt::ArgList &Args,
  405. llvm::opt::ArgStringList &CC1ASArgs) const override;
  406. StringRef getPlatformFamily() const;
  407. StringRef getOSLibraryNameSuffix(bool IgnoreSim = false) const override;
  408. public:
  409. static StringRef getSDKName(StringRef isysroot);
  410. /// }
  411. /// @name ToolChain Implementation
  412. /// {
  413. // Darwin tools support multiple architecture (e.g., i386 and x86_64) and
  414. // most development is done against SDKs, so compiling for a different
  415. // architecture should not get any special treatment.
  416. bool isCrossCompiling() const override { return false; }
  417. llvm::opt::DerivedArgList *
  418. TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
  419. Action::OffloadKind DeviceOffloadKind) const override;
  420. CXXStdlibType GetDefaultCXXStdlibType() const override;
  421. ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const override;
  422. bool hasBlocksRuntime() const override;
  423. void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,
  424. llvm::opt::ArgStringList &CC1Args) const override;
  425. void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs,
  426. llvm::opt::ArgStringList &CC1Args) const override;
  427. bool UseObjCMixedDispatch() const override {
  428. // This is only used with the non-fragile ABI and non-legacy dispatch.
  429. // Mixed dispatch is used everywhere except OS X before 10.6.
  430. return !(isTargetMacOSBased() && isMacosxVersionLT(10, 6));
  431. }
  432. LangOptions::StackProtectorMode
  433. GetDefaultStackProtectorLevel(bool KernelOrKext) const override {
  434. // Stack protectors default to on for user code on 10.5,
  435. // and for everything in 10.6 and beyond
  436. if (isTargetIOSBased() || isTargetWatchOSBased() || isTargetDriverKit())
  437. return LangOptions::SSPOn;
  438. else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 6))
  439. return LangOptions::SSPOn;
  440. else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 5) && !KernelOrKext)
  441. return LangOptions::SSPOn;
  442. return LangOptions::SSPOff;
  443. }
  444. void CheckObjCARC() const override;
  445. llvm::ExceptionHandling GetExceptionModel(
  446. const llvm::opt::ArgList &Args) const override;
  447. bool SupportsEmbeddedBitcode() const override;
  448. SanitizerMask getSupportedSanitizers() const override;
  449. void printVerboseInfo(raw_ostream &OS) const override;
  450. };
  451. /// DarwinClang - The Darwin toolchain used by Clang.
  452. class LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin {
  453. public:
  454. DarwinClang(const Driver &D, const llvm::Triple &Triple,
  455. const llvm::opt::ArgList &Args);
  456. /// @name Apple ToolChain Implementation
  457. /// {
  458. RuntimeLibType GetRuntimeLibType(const llvm::opt::ArgList &Args) const override;
  459. void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
  460. llvm::opt::ArgStringList &CmdArgs,
  461. bool ForceLinkBuiltinRT = false) const override;
  462. void AddClangCXXStdlibIncludeArgs(
  463. const llvm::opt::ArgList &DriverArgs,
  464. llvm::opt::ArgStringList &CC1Args) const override;
  465. void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
  466. llvm::opt::ArgStringList &CC1Args) const override;
  467. void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
  468. llvm::opt::ArgStringList &CmdArgs) const override;
  469. void AddCCKextLibArgs(const llvm::opt::ArgList &Args,
  470. llvm::opt::ArgStringList &CmdArgs) const override;
  471. void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;
  472. void AddLinkARCArgs(const llvm::opt::ArgList &Args,
  473. llvm::opt::ArgStringList &CmdArgs) const override;
  474. unsigned GetDefaultDwarfVersion() const override;
  475. // Until dtrace (via CTF) and LLDB can deal with distributed debug info,
  476. // Darwin defaults to standalone/full debug info.
  477. bool GetDefaultStandaloneDebug() const override { return true; }
  478. llvm::DebuggerKind getDefaultDebuggerTuning() const override {
  479. return llvm::DebuggerKind::LLDB;
  480. }
  481. /// }
  482. private:
  483. void AddLinkSanitizerLibArgs(const llvm::opt::ArgList &Args,
  484. llvm::opt::ArgStringList &CmdArgs,
  485. StringRef Sanitizer,
  486. bool shared = true) const;
  487. bool AddGnuCPlusPlusIncludePaths(const llvm::opt::ArgList &DriverArgs,
  488. llvm::opt::ArgStringList &CC1Args,
  489. llvm::SmallString<128> Base,
  490. llvm::StringRef Version,
  491. llvm::StringRef ArchDir,
  492. llvm::StringRef BitDir) const;
  493. llvm::SmallString<128>
  494. GetEffectiveSysroot(const llvm::opt::ArgList &DriverArgs) const;
  495. };
  496. } // end namespace toolchains
  497. } // end namespace driver
  498. } // end namespace clang
  499. #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H