clang 23.0.0git
Darwin.h
Go to the documentation of this file.
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
9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
11
18#include "clang/Driver/Tool.h"
21
22namespace clang {
23namespace driver {
24
25namespace toolchains {
26class MachO;
27} // end namespace toolchains
28
29namespace tools {
30
31namespace darwin {
32llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
33void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str,
34 const llvm::opt::ArgList &Args);
35
36class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
37 virtual void anchor();
38
39protected:
40 void AddMachOArch(const llvm::opt::ArgList &Args,
41 llvm::opt::ArgStringList &CmdArgs) const;
42
44 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
45 }
46
47public:
48 MachOTool(const char *Name, const char *ShortName, const ToolChain &TC)
49 : Tool(Name, ShortName, TC) {}
50};
51
52class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
53public:
55 : MachOTool("darwin::Assembler", "assembler", TC) {}
56
57 bool hasIntegratedCPP() const override { return false; }
58
59 void ConstructJob(Compilation &C, const JobAction &JA,
60 const InputInfo &Output, const InputInfoList &Inputs,
61 const llvm::opt::ArgList &TCArgs,
62 const char *LinkingOutput) const override;
63};
64
65class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
66 bool NeedsTempPath(const InputInfoList &Inputs) const;
67 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
68 llvm::opt::ArgStringList &CmdArgs,
69 const InputInfoList &Inputs, VersionTuple Version,
70 bool LinkerIsLLD, bool UsePlatformVersion) const;
71
72public:
73 Linker(const ToolChain &TC) : MachOTool("darwin::Linker", "linker", TC) {}
74
75 bool hasIntegratedCPP() const override { return false; }
76 bool isLinkJob() const override { return true; }
77
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
84class LLVM_LIBRARY_VISIBILITY StaticLibTool : public MachOTool {
85public:
87 : MachOTool("darwin::StaticLibTool", "static-lib-linker", TC) {}
88
89 bool hasIntegratedCPP() const override { return false; }
90 bool isLinkJob() const override { return true; }
91
92 void ConstructJob(Compilation &C, const JobAction &JA,
93 const InputInfo &Output, const InputInfoList &Inputs,
94 const llvm::opt::ArgList &TCArgs,
95 const char *LinkingOutput) const override;
96};
97
98class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
99public:
100 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
101
102 bool hasIntegratedCPP() const override { return false; }
103
104 void ConstructJob(Compilation &C, const JobAction &JA,
105 const InputInfo &Output, const InputInfoList &Inputs,
106 const llvm::opt::ArgList &TCArgs,
107 const char *LinkingOutput) const override;
108};
109
110class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
111public:
113 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
114
115 bool hasIntegratedCPP() const override { return false; }
116 bool isDsymutilJob() const override { return true; }
117
118 void ConstructJob(Compilation &C, const JobAction &JA,
119 const InputInfo &Output, const InputInfoList &Inputs,
120 const llvm::opt::ArgList &TCArgs,
121 const char *LinkingOutput) const override;
122};
123
124class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
125public:
127 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
128
129 bool hasIntegratedCPP() const override { return false; }
130
131 void ConstructJob(Compilation &C, const JobAction &JA,
132 const InputInfo &Output, const InputInfoList &Inputs,
133 const llvm::opt::ArgList &TCArgs,
134 const char *LinkingOutput) const override;
135};
136} // end namespace darwin
137} // end namespace tools
138
139namespace toolchains {
140
141class LLVM_LIBRARY_VISIBILITY MachO : public ToolChain {
142protected:
143 Tool *buildAssembler() const override;
144 Tool *buildLinker() const override;
145 Tool *buildStaticLibTool() const override;
146 Tool *getTool(Action::ActionClass AC) const override;
147
148 void
149 addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
150 llvm::opt::ArgStringList &CC1Args,
151 llvm::StringRef BoundArch,
152 Action::OffloadKind DeviceOffloadKind) const override;
153
154private:
155 mutable std::unique_ptr<tools::darwin::Lipo> Lipo;
156 mutable std::unique_ptr<tools::darwin::Dsymutil> Dsymutil;
157 mutable std::unique_ptr<tools::darwin::VerifyDebug> VerifyDebug;
158
159 /// The version of the linker known to be available in the tool chain.
160 mutable std::optional<VersionTuple> LinkerVersion;
161
162public:
163 MachO(const Driver &D, const llvm::Triple &Triple,
164 const llvm::opt::ArgList &Args);
165 ~MachO() override;
166
167 /// @name MachO specific toolchain API
168 /// {
169
170 /// Get the "MachO" arch name for a particular compiler invocation. For
171 /// example, Apple treats different ARM variations as distinct architectures.
172 StringRef getMachOArchName(const llvm::opt::ArgList &Args) const;
173
174 /// Get the version of the linker known to be available for a particular
175 /// compiler invocation (via the `-mlinker-version=` arg).
176 VersionTuple getLinkerVersion(const llvm::opt::ArgList &Args) const;
177
178 /// Add the linker arguments to link the ARC runtime library.
179 virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args,
180 llvm::opt::ArgStringList &CmdArgs) const {}
181
182 /// Add the linker arguments to link the compiler runtime library.
183 ///
184 /// FIXME: This API is intended for use with embedded libraries only, and is
185 /// misleadingly named.
186 virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
187 llvm::opt::ArgStringList &CmdArgs,
188 bool ForceLinkBuiltinRT = false) const;
189
190 virtual void addStartObjectFileArgs(const llvm::opt::ArgList &Args,
191 llvm::opt::ArgStringList &CmdArgs) const {
192 }
193
194 virtual void addMinVersionArgs(const llvm::opt::ArgList &Args,
195 llvm::opt::ArgStringList &CmdArgs) const {}
196
197 virtual void addPlatformVersionArgs(const llvm::opt::ArgList &Args,
198 llvm::opt::ArgStringList &CmdArgs) const {
199 }
200
201 virtual bool HasPlatformPrefix(const llvm::Triple &T) const { return false; }
202
204 const llvm::Triple &T) const {}
205
206 /// On some iOS platforms, kernel and kernel modules were built statically. Is
207 /// this such a target?
208 virtual bool isKernelStatic() const { return false; }
209
210 /// Is the target either iOS or an iOS simulator?
211 bool isTargetIOSBased() const { return false; }
212
213 /// Options to control how a runtime library is linked.
214 enum RuntimeLinkOptions : unsigned {
215 /// Link the library in even if it can't be found in the VFS.
217
218 /// Use the embedded runtime from the macho_embedded directory.
220
221 /// Emit rpaths for @executable_path as well as the resource directory.
222 RLO_AddRPath = 1 << 2,
223 };
224
225 /// Add a runtime library to the list of items to link.
226 void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,
227 llvm::opt::ArgStringList &CmdArgs, StringRef Component,
228 RuntimeLinkOptions Opts = RuntimeLinkOptions(),
229 bool IsShared = false) const;
230
231 /// Add any profiling runtime libraries that are needed. This is essentially a
232 /// MachO specific version of addProfileRT in Tools.cpp.
233 void addProfileRTLibs(const llvm::opt::ArgList &Args,
234 llvm::opt::ArgStringList &CmdArgs) const override {
235 // There aren't any profiling libs for embedded targets currently.
236 }
237
238 // Return the full path of the compiler-rt library on a non-Darwin MachO
239 // system. Those are under
240 // <resourcedir>/lib/darwin/macho_embedded/<...>(.dylib|.a).
241 std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
243 bool IsFortran = false) const override;
244
245 /// }
246 /// @name ToolChain Implementation
247 /// {
248
249 types::ID LookupTypeForExtension(StringRef Ext) const override;
250
251 bool HasNativeLLVMSupport() const override;
252
253 llvm::opt::DerivedArgList *
254 TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
255 Action::OffloadKind DeviceOffloadKind) const override;
256
257 bool IsBlocksDefault() const override {
258 // Always allow blocks on Apple; users interested in versioning are
259 // expected to use /usr/include/Block.h.
260 return true;
261 }
262
263 bool IsMathErrnoDefault() const override { return false; }
264
265 bool IsEncodeExtendedBlockSignatureDefault() const override { return true; }
266
267 bool IsObjCNonFragileABIDefault() const override {
268 // Non-fragile ABI is default for everything but i386.
269 return getTriple().getArch() != llvm::Triple::x86;
270 }
271
272 bool UseObjCMixedDispatch() const override { return true; }
273
274 UnwindTableLevel
275 getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override;
276
280
281 bool isPICDefault() const override;
282 bool isPIEDefault(const llvm::opt::ArgList &Args) const override;
283 bool isPICDefaultForced() const override;
284
285 bool SupportsProfiling() const override;
286
287 bool UseDwarfDebugFlags() const override;
288 std::string GetGlobalDebugPathRemapping() const override;
289
290 llvm::ExceptionHandling
291 GetExceptionModel(const llvm::opt::ArgList &Args) const override {
292 return llvm::ExceptionHandling::None;
293 }
294
295 virtual StringRef getOSLibraryNameSuffix(bool IgnoreSim = false) const {
296 return "";
297 }
298
299 // Darwin toolchain uses legacy thin LTO API, which is not
300 // capable of unit splitting.
301 bool canSplitThinLTOUnit() const override { return false; }
302 /// }
303};
304
305/// Apple specific MachO extensions
306class LLVM_LIBRARY_VISIBILITY AppleMachO : public MachO {
307public:
308 AppleMachO(const Driver &D, const llvm::Triple &Triple,
309 const llvm::opt::ArgList &Args);
310 ~AppleMachO() override;
311
312 /// }
313 /// @name Apple Specific ToolChain Implementation
314 /// {
315 void
316 AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
317 llvm::opt::ArgStringList &CC1Args) const override;
318
319 void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,
320 llvm::opt::ArgStringList &CC1Args) const override;
321 void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs,
322 llvm::opt::ArgStringList &CC1Args) const override;
323 void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs,
324 llvm::opt::ArgStringList &CC1Args) const override;
325
327 const llvm::opt::ArgList &DriverArgs,
328 llvm::opt::ArgStringList &CC1Args) const override;
329 void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
330 llvm::opt::ArgStringList &CmdArgs) const override;
331
332 void printVerboseInfo(raw_ostream &OS) const override;
333 /// }
334
338
339protected:
341 GetEffectiveSysroot(const llvm::opt::ArgList &DriverArgs) const;
342
343private:
344 virtual void
345 AddGnuCPlusPlusIncludePaths(const llvm::opt::ArgList &DriverArgs,
346 llvm::opt::ArgStringList &CC1Args) const;
347};
348
349/// Darwin - The base Darwin tool chain.
350class LLVM_LIBRARY_VISIBILITY Darwin : public AppleMachO {
351public:
352 /// Whether the information on the target has been initialized.
353 //
354 // FIXME: This should be eliminated. What we want to do is make this part of
355 // the "default target for arguments" selection process, once we get out of
356 // the argument translation business.
357 mutable bool TargetInitialized;
358
359 // TODO: Are these useful? Can we use Triple::OSType/EnvironmentType instead?
374
377
378 /// The native OS version we are targeting.
379 mutable VersionTuple TargetVersion;
380 /// The OS version we are targeting as specified in the triple.
381 mutable VersionTuple OSTargetVersion;
382
383 /// The information about the darwin SDK that was used.
384 mutable std::optional<DarwinSDKInfo> SDKInfo;
385
386 /// The target variant triple that was specified (if any).
387 mutable std::optional<llvm::Triple> TargetVariantTriple;
388
389private:
390 void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const;
391
392 void VerifyTripleForSDK(const llvm::opt::ArgList &Args,
393 const llvm::Triple Triple) const;
394
395protected:
396 /// Lazily initialize the target platform from the triple when
397 /// AddDeploymentTarget has not run yet (e.g. when Darwin is used as
398 /// a host toolchain for device offloading).
399 void ensureTargetInitialized() const;
400
401public:
402 Darwin(const Driver &D, const llvm::Triple &Triple,
403 const llvm::opt::ArgList &Args);
404 ~Darwin() override;
405
406 std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
407 llvm::StringRef BoundArch,
408 types::ID InputType) const override;
409
410 /// @name Darwin Specific Toolchain Implementation
411 /// {
412
413 void addMinVersionArgs(const llvm::opt::ArgList &Args,
414 llvm::opt::ArgStringList &CmdArgs) const override;
415
416 void addPlatformVersionArgs(const llvm::opt::ArgList &Args,
417 llvm::opt::ArgStringList &CmdArgs) const override;
418
419 void addStartObjectFileArgs(const llvm::opt::ArgList &Args,
420 llvm::opt::ArgStringList &CmdArgs) const override;
421
422 bool isKernelStatic() const override {
423 return (!(isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) &&
425 }
426
427 void addProfileRTLibs(const llvm::opt::ArgList &Args,
428 llvm::opt::ArgStringList &CmdArgs) const override;
429
430 // Return the full path of the compiler-rt library on a Darwin MachO system.
431 // Those are under <resourcedir>/lib/darwin/<...>(.dylib|.a).
432 std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
434 bool IsFortran = false) const override;
435
436protected:
437 /// }
438 /// @name Darwin specific Toolchain functions
439 /// {
440
441 // FIXME: Eliminate these ...Target functions and derive separate tool chains
442 // for these targets and put version in constructor.
444 unsigned Major, unsigned Minor, unsigned Micro,
445 VersionTuple NativeTargetVersion) const {
446 // FIXME: For now, allow reinitialization as long as values don't
447 // change. This will go away when we move away from argument translation.
448 if (TargetInitialized && TargetPlatform == Platform &&
449 TargetEnvironment == Environment &&
450 (Environment == MacCatalyst ? OSTargetVersion : TargetVersion) ==
451 VersionTuple(Major, Minor, Micro))
452 return;
453
454 assert(!TargetInitialized && "Target already initialized!");
455 TargetInitialized = true;
456 TargetPlatform = Platform;
457 TargetEnvironment = Environment;
458 TargetVersion = VersionTuple(Major, Minor, Micro);
459 if (Environment == Simulator)
460 const_cast<Darwin *>(this)->setTripleEnvironment(llvm::Triple::Simulator);
461 else if (Environment == MacCatalyst) {
462 const_cast<Darwin *>(this)->setTripleEnvironment(llvm::Triple::MacABI);
463 TargetVersion = NativeTargetVersion;
464 OSTargetVersion = VersionTuple(Major, Minor, Micro);
465 }
466 }
467
468public:
469 bool isTargetIPhoneOS() const {
470 assert(TargetInitialized && "Target not initialized!");
471 return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&
473 }
474
475 bool isTargetIOSSimulator() const {
476 assert(TargetInitialized && "Target not initialized!");
477 return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&
479 }
480
481 bool isTargetIOSBased() const {
482 assert(TargetInitialized && "Target not initialized!");
484 }
485
489
492 }
493
494 bool isTargetXROS() const { return TargetPlatform == XROS; }
495
496 bool isTargetTvOS() const {
497 assert(TargetInitialized && "Target not initialized!");
499 }
500
502 assert(TargetInitialized && "Target not initialized!");
504 }
505
506 bool isTargetTvOSBased() const {
507 assert(TargetInitialized && "Target not initialized!");
508 return TargetPlatform == TvOS;
509 }
510
511 bool isTargetWatchOS() const {
512 assert(TargetInitialized && "Target not initialized!");
514 }
515
517 assert(TargetInitialized && "Target not initialized!");
519 }
520
521 bool isTargetWatchOSBased() const {
522 assert(TargetInitialized && "Target not initialized!");
523 return TargetPlatform == WatchOS;
524 }
525
526 bool isTargetDriverKit() const {
527 assert(TargetInitialized && "Target not initialized!");
528 return TargetPlatform == DriverKit;
529 }
530
531 bool isTargetFirmware() const { return TargetPlatform == Firmware; }
532
536
537 bool isTargetMacOS() const {
538 assert(TargetInitialized && "Target not initialized!");
539 return TargetPlatform == MacOS;
540 }
541
542 bool isTargetMacOSBased() const {
543 assert(TargetInitialized && "Target not initialized!");
545 }
546
548 assert(TargetInitialized && "Target not initialized!");
549 return isTargetMacOSBased() && getArch() == llvm::Triple::aarch64;
550 }
551
552 bool isTargetInitialized() const { return TargetInitialized; }
553
554 /// The version of the OS that's used by the OS specified in the target
555 /// triple. It might be different from the actual target OS on which the
556 /// program will run, e.g. MacCatalyst code runs on a macOS target, but its
557 /// target triple is iOS.
558 VersionTuple getTripleTargetVersion() const {
559 assert(TargetInitialized && "Target not initialized!");
561 }
562
563 bool isIPhoneOSVersionLT(unsigned V0, unsigned V1 = 0,
564 unsigned V2 = 0) const {
565 assert(isTargetIOSBased() && "Unexpected call for non iOS target!");
566 return TargetVersion < VersionTuple(V0, V1, V2);
567 }
568
569 /// Returns true if the minimum supported macOS version for the slice that's
570 /// being built is less than the specified version. If there's no minimum
571 /// supported macOS version, the deployment target version is compared to the
572 /// specifed version instead.
573 bool isMacosxVersionLT(unsigned V0, unsigned V1 = 0, unsigned V2 = 0) const {
574 assert(isTargetMacOSBased() &&
575 (getTriple().isMacOSX() || getTriple().isMacCatalystEnvironment()) &&
576 "Unexpected call for non OS X target!");
577 // The effective triple might not be initialized yet, so construct a
578 // pseudo-effective triple to get the minimum supported OS version.
579 VersionTuple MinVers =
580 llvm::Triple(getTriple().getArchName(), "apple", "macos")
581 .getMinimumSupportedOSVersion();
582 return (!MinVers.empty() && MinVers > TargetVersion
583 ? MinVers
584 : TargetVersion) < VersionTuple(V0, V1, V2);
585 }
586
587protected:
588 /// Return true if c++17 aligned allocation/deallocation functions are not
589 /// implemented in the c++ standard library of the deployment target we are
590 /// targeting.
591 bool isAlignedAllocationUnavailable() const;
592
593 /// Return true if c++14 sized deallocation functions are not implemented in
594 /// the c++ standard library of the deployment target we are targeting.
595 bool isSizedDeallocationUnavailable() const;
596
597 void
598 addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
599 llvm::opt::ArgStringList &CC1Args,
600 llvm::StringRef BoundArch,
601 Action::OffloadKind DeviceOffloadKind) const override;
602
603 void addClangCC1ASTargetOptions(
604 const llvm::opt::ArgList &Args,
605 llvm::opt::ArgStringList &CC1ASArgs) const override;
606
607 StringRef getOSLibraryNameSuffix(bool IgnoreSim = false) const override;
608
609public:
610 static StringRef getSDKName(StringRef isysroot);
611
612 /// }
613 /// @name ToolChain Implementation
614 /// {
615
616 // Darwin tools support multiple architecture (e.g., i386 and x86_64) and
617 // most development is done against SDKs, so compiling for a different
618 // architecture should not get any special treatment.
619 bool isCrossCompiling() const override { return false; }
620
621 llvm::opt::DerivedArgList *
622 TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
623 Action::OffloadKind DeviceOffloadKind) const override;
624
625 CXXStdlibType GetDefaultCXXStdlibType() const override;
626 ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const override;
627 bool hasBlocksRuntime() const override;
628
629 bool UseObjCMixedDispatch() const override {
630 // This is only used with the non-fragile ABI and non-legacy dispatch.
631
632 // Mixed dispatch is used everywhere except OS X before 10.6.
633 return !(isTargetMacOSBased() && isMacosxVersionLT(10, 6));
634 }
635
637 GetDefaultStackProtectorLevel(bool KernelOrKext) const override {
638 // Stack protectors default to on for user code on 10.5,
639 // and for everything in 10.6 and beyond
641 isTargetXROS())
642 return LangOptions::SSPOn;
643 else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 6))
644 return LangOptions::SSPOn;
645 else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 5) && !KernelOrKext)
646 return LangOptions::SSPOn;
647
648 return LangOptions::SSPOff;
649 }
650
651 void CheckObjCARC() const override;
652
653 llvm::ExceptionHandling GetExceptionModel(
654 const llvm::opt::ArgList &Args) const override;
655
656 bool SupportsEmbeddedBitcode() const override;
657
659 getSupportedSanitizers(StringRef BoundArch,
660 Action::OffloadKind DeviceOffloadKind) const override;
661};
662
663/// DarwinClang - The Darwin toolchain used by Clang.
664class LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin {
665public:
666 DarwinClang(const Driver &D, const llvm::Triple &Triple,
667 const llvm::opt::ArgList &Args);
668
669 /// @name Apple ToolChain Implementation
670 /// {
671
672 void
673 AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
674 llvm::opt::ArgStringList &CC1Args) const override;
675
676 RuntimeLibType GetRuntimeLibType(const llvm::opt::ArgList &Args) const override;
677
678 void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
679 llvm::opt::ArgStringList &CmdArgs,
680 bool ForceLinkBuiltinRT = false) const override;
681
682 void AddCCKextLibArgs(const llvm::opt::ArgList &Args,
683 llvm::opt::ArgStringList &CmdArgs) const override;
684
685 void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;
686
687 void
688 addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
689 llvm::opt::ArgStringList &CC1Args,
690 llvm::StringRef BoundArch,
691 Action::OffloadKind DeviceOffloadKind) const override;
692
693 void AddLinkARCArgs(const llvm::opt::ArgList &Args,
694 llvm::opt::ArgStringList &CmdArgs) const override;
695
696 bool HasPlatformPrefix(const llvm::Triple &T) const override;
697
699 const llvm::Triple &T) const override;
700
701 unsigned GetDefaultDwarfVersion() const override;
702 // Until dtrace (via CTF) and LLDB can deal with distributed debug info,
703 // Darwin defaults to standalone/full debug info.
704 bool GetDefaultStandaloneDebug() const override { return true; }
705 llvm::DebuggerKind getDefaultDebuggerTuning() const override {
706 return llvm::DebuggerKind::LLDB;
707 }
708
709 bool getDefaultDebugSimpleTemplateNames() const override;
710
711 /// }
712
713private:
714 void AddLinkSanitizerLibArgs(const llvm::opt::ArgList &Args,
715 llvm::opt::ArgStringList &CmdArgs,
716 StringRef Sanitizer,
717 bool shared = true) const;
718
719 void
720 AddGnuCPlusPlusIncludePaths(const llvm::opt::ArgList &DriverArgs,
721 llvm::opt::ArgStringList &CC1Args) const override;
722
723 bool AddGnuCPlusPlusIncludePaths(const llvm::opt::ArgList &DriverArgs,
724 llvm::opt::ArgStringList &CC1Args,
726 llvm::StringRef Version,
727 llvm::StringRef ArchDir,
728 llvm::StringRef BitDir) const;
729};
730
731} // end namespace toolchains
732} // end namespace driver
733} // end namespace clang
734
735#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
Defines the clang::LangOptions interface.
llvm::MachO::FileType FileType
Definition MachO.h:46
static StringRef getTriple(const Command &Job)
Simple wrapper for toolchain detector with costly initialization.
The basic abstraction for the target Objective-C runtime.
Definition ObjCRuntime.h:28
The base class of the type hierarchy.
Definition TypeBase.h:1875
Compilation - A set of tasks to perform for a single driver invocation.
Definition Compilation.h:45
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
Definition Driver.h:94
InputInfo - Wrapper for information about an input source.
Definition InputInfo.h:22
ToolChain - Access to tools for a single platform.
Definition ToolChain.h:95
llvm::Triple::ArchType getArch() const
Definition ToolChain.h:301
ToolChain(const Driver &D, const llvm::Triple &T, const llvm::opt::ArgList &Args)
Definition ToolChain.cpp:91
void setTripleEnvironment(llvm::Triple::EnvironmentType Env)
StringRef getArchName() const
Definition ToolChain.h:302
Tool - Information on a specific compilation tool.
Definition Tool.h:32
const ToolChain & getToolChain() const
Definition Tool.h:52
Tool(const char *Name, const char *ShortName, const ToolChain &TC)
Definition Tool.cpp:14
void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override
AddCXXStdlibLibArgs - Add the system specific linker arguments to use for the given C++ standard libr...
Definition Darwin.cpp:3085
void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override
Add arguments to use system-specific CUDA includes.
Definition Darwin.cpp:1062
void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override
Add arguments to use system-specific HIP includes.
Definition Darwin.cpp:1067
void printVerboseInfo(raw_ostream &OS) const override
Dispatch to the specific toolchain for verbose printing.
Definition Darwin.cpp:4096
llvm::SmallString< 128 > GetEffectiveSysroot(const llvm::opt::ArgList &DriverArgs) const
Definition Darwin.cpp:2863
void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override
Add the clang cc1 arguments for system include paths.
Definition Darwin.cpp:2876
LazyDetector< RocmInstallationDetector > RocmInstallation
Definition Darwin.h:336
LazyDetector< SYCLInstallationDetector > SYCLInstallation
Definition Darwin.h:337
void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override
AddClangCXXStdlibIncludeArgs - Add the clang -cc1 level arguments to set the include paths to use for...
Definition Darwin.cpp:2976
LazyDetector< CudaInstallationDetector > CudaInstallation
}
Definition Darwin.h:335
AppleMachO(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args)
Definition Darwin.cpp:1004
void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override
Add arguments to use system-specific SYCL includes.
Definition Darwin.cpp:1072
void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override
Add warning options that need to be passed to cc1 for this target.
Definition Darwin.cpp:1326
void AppendPlatformPrefix(SmallString< 128 > &Path, const llvm::Triple &T) const override
Definition Darwin.cpp:2847
void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override
Add the clang cc1 arguments for system include paths.
Definition Darwin.cpp:2925
void AddCCKextLibArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override
AddCCKextLibArgs - Add the system specific linker arguments to use for kernel extensions (Darwin-spec...
Definition Darwin.cpp:3132
void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs, bool ForceLinkBuiltinRT=false) const override
Add the linker arguments to link the compiler runtime library.
Definition Darwin.cpp:1686
RuntimeLibType GetRuntimeLibType(const llvm::opt::ArgList &Args) const override
Definition Darwin.cpp:1674
DarwinClang(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args)
Definition Darwin.cpp:1322
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, llvm::StringRef BoundArch, Action::OffloadKind DeviceOffloadKind) const override
Add options that need to be passed to cc1 for this target.
Definition Darwin.cpp:1350
llvm::DebuggerKind getDefaultDebuggerTuning() const override
Definition Darwin.h:705
void AddLinkARCArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override
Add the linker arguments to link the ARC runtime library.
Definition Darwin.cpp:1370
bool HasPlatformPrefix(const llvm::Triple &T) const override
Definition Darwin.cpp:2837
unsigned GetDefaultDwarfVersion() const override
Definition Darwin.cpp:1447
bool GetDefaultStandaloneDebug() const override
Definition Darwin.h:704
VersionTuple TargetVersion
The native OS version we are targeting.
Definition Darwin.h:379
void addPlatformVersionArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override
Definition Darwin.cpp:3847
bool isCrossCompiling() const override
Returns true if the toolchain is targeting a non-native architecture.
Definition Darwin.h:619
bool TargetInitialized
Whether the information on the target has been initialized.
Definition Darwin.h:357
bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const
Definition Darwin.h:563
bool isKernelStatic() const override
On some iOS platforms, kernel and kernel modules were built statically.
Definition Darwin.h:422
Darwin(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args)
Darwin - Darwin tool chain for i386 and x86_64.
Definition Darwin.cpp:1010
std::optional< DarwinSDKInfo > SDKInfo
The information about the darwin SDK that was used.
Definition Darwin.h:384
void ensureTargetInitialized() const
Lazily initialize the target platform from the triple when AddDeploymentTarget has not run yet (e....
Definition Darwin.cpp:1175
bool isMacosxVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const
Returns true if the minimum supported macOS version for the slice that's being built is less than the...
Definition Darwin.h:573
bool UseObjCMixedDispatch() const override
UseObjCMixedDispatchDefault - When using non-legacy dispatch, should the mixed dispatch method be use...
Definition Darwin.h:629
bool isTargetAppleSiliconMac() const
Definition Darwin.h:547
LangOptions::StackProtectorMode GetDefaultStackProtectorLevel(bool KernelOrKext) const override
GetDefaultStackProtectorLevel - Get the default stack protector level for this tool chain.
Definition Darwin.h:637
void setTarget(DarwinPlatformKind Platform, DarwinEnvironmentKind Environment, unsigned Major, unsigned Minor, unsigned Micro, VersionTuple NativeTargetVersion) const
Definition Darwin.h:443
std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, llvm::StringRef BoundArch, types::ID InputType) const override
Definition Darwin.cpp:1256
bool isTargetWatchOSSimulator() const
Definition Darwin.h:516
DarwinPlatformKind TargetPlatform
Definition Darwin.h:375
void addMinVersionArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override
Definition Darwin.cpp:3772
void addStartObjectFileArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override
Definition Darwin.cpp:4017
std::optional< llvm::Triple > TargetVariantTriple
The target variant triple that was specified (if any).
Definition Darwin.h:387
VersionTuple getTripleTargetVersion() const
The version of the OS that's used by the OS specified in the target triple.
Definition Darwin.h:558
VersionTuple OSTargetVersion
The OS version we are targeting as specified in the triple.
Definition Darwin.h:381
DarwinEnvironmentKind TargetEnvironment
Definition Darwin.h:376
VersionTuple getLinkerVersion(const llvm::opt::ArgList &Args) const
Get the version of the linker known to be available for a particular compiler invocation (via the -ml...
Definition Darwin.cpp:1148
bool UseObjCMixedDispatch() const override
UseObjCMixedDispatchDefault - When using non-legacy dispatch, should the mixed dispatch method be use...
Definition Darwin.h:272
Tool * buildLinker() const override
Definition Darwin.cpp:1312
Tool * buildStaticLibTool() const override
Definition Darwin.cpp:1314
bool isTargetIOSBased() const
Is the target either iOS or an iOS simulator?
Definition Darwin.h:211
virtual void AppendPlatformPrefix(SmallString< 128 > &Path, const llvm::Triple &T) const
Definition Darwin.h:203
bool IsBlocksDefault() const override
IsBlocksDefault - Does this tool chain enable -fblocks by default.
Definition Darwin.h:257
llvm::ExceptionHandling GetExceptionModel(const llvm::opt::ArgList &Args) const override
GetExceptionModel - Return the tool chain exception model.
Definition Darwin.h:291
bool IsEncodeExtendedBlockSignatureDefault() const override
IsEncodeExtendedBlockSignatureDefault - Does this tool chain enable -fencode-extended-block-signature...
Definition Darwin.h:265
void addProfileRTLibs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const override
Add any profiling runtime libraries that are needed.
Definition Darwin.h:233
Tool * getTool(Action::ActionClass AC) const override
Definition Darwin.cpp:1293
virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
Add the linker arguments to link the ARC runtime library.
Definition Darwin.h:179
virtual void addMinVersionArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
Definition Darwin.h:194
virtual bool isKernelStatic() const
On some iOS platforms, kernel and kernel modules were built statically.
Definition Darwin.h:208
virtual void addPlatformVersionArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
Definition Darwin.h:197
virtual StringRef getOSLibraryNameSuffix(bool IgnoreSim=false) const
Definition Darwin.h:295
virtual void addStartObjectFileArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
Definition Darwin.h:190
RuntimeLibType GetDefaultRuntimeLibType() const override
GetDefaultRuntimeLibType - Get the default runtime library variant to use.
Definition Darwin.h:277
bool IsObjCNonFragileABIDefault() const override
IsObjCNonFragileABIDefault - Does this tool chain set -fobjc-nonfragile-abi by default.
Definition Darwin.h:267
virtual bool HasPlatformPrefix(const llvm::Triple &T) const
Definition Darwin.h:201
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, llvm::StringRef BoundArch, Action::OffloadKind DeviceOffloadKind) const override
Add options that need to be passed to cc1 for this target.
Definition Darwin.cpp:3441
RuntimeLinkOptions
Options to control how a runtime library is linked.
Definition Darwin.h:214
@ RLO_IsEmbedded
Use the embedded runtime from the macho_embedded directory.
Definition Darwin.h:219
@ RLO_AddRPath
Emit rpaths for @executable_path as well as the resource directory.
Definition Darwin.h:222
@ RLO_AlwaysLink
Link the library in even if it can't be found in the VFS.
Definition Darwin.h:216
bool IsMathErrnoDefault() const override
IsMathErrnoDefault - Does this tool chain use -fmath-errno by default.
Definition Darwin.h:263
MachO(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args)
Definition Darwin.cpp:998
StringRef getMachOArchName(const llvm::opt::ArgList &Args) const
Get the "MachO" arch name for a particular compiler invocation.
Definition Darwin.cpp:1120
Tool * buildAssembler() const override
Definition Darwin.cpp:1318
bool canSplitThinLTOUnit() const override
Returns true when it's possible to split LTO unit to use whole program devirtualization and CFI santi...
Definition Darwin.h:301
Assembler(const ToolChain &TC)
Definition Darwin.h:54
bool hasIntegratedCPP() const override
Definition Darwin.h:57
bool isDsymutilJob() const override
Definition Darwin.h:116
bool hasIntegratedCPP() const override
Definition Darwin.h:115
Dsymutil(const ToolChain &TC)
Definition Darwin.h:112
Linker(const ToolChain &TC)
Definition Darwin.h:73
bool isLinkJob() const override
Definition Darwin.h:76
bool hasIntegratedCPP() const override
Definition Darwin.h:75
bool hasIntegratedCPP() const override
Definition Darwin.h:102
Lipo(const ToolChain &TC)
Definition Darwin.h:100
MachOTool(const char *Name, const char *ShortName, const ToolChain &TC)
Definition Darwin.h:48
const toolchains::MachO & getMachOToolChain() const
Definition Darwin.h:43
void AddMachOArch(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CmdArgs) const
Definition Darwin.cpp:182
bool hasIntegratedCPP() const override
Definition Darwin.h:89
bool hasIntegratedCPP() const override
Definition Darwin.h:129
llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str)
Definition Darwin.cpp:44
void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str, const llvm::opt::ArgList &Args)
SmallVector< InputInfo, 4 > InputInfoList
Definition Driver.h:50
The JSON file list parser is used to communicate input to InstallAPI.