clang: lib/Driver/ToolChains/Darwin.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_DARWIN_H
11
21
23namespace driver {
24
25namespace toolchains {
26class MachO;
27}
28
29namespace tools {
30
31namespace darwin {
34 const llvm::opt::ArgList &Args);
35
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:
50};
51
53public:
55 : MachOTool("darwin::Assembler", "assembler", TC) {}
56
58
61 const llvm::opt::ArgList &TCArgs,
62 const char *LinkingOutput) const override;
63};
64
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:
74
76 bool isLinkJob() const override { return true; }
77
80 const llvm::opt::ArgList &TCArgs,
81 const char *LinkingOutput) const override;
82};
83
85public:
87 : MachOTool("darwin::StaticLibTool", "static-lib-linker", TC) {}
88
90 bool isLinkJob() const override { return true; }
91
94 const llvm::opt::ArgList &TCArgs,
95 const char *LinkingOutput) const override;
96};
97
99public:
101
103
106 const llvm::opt::ArgList &TCArgs,
107 const char *LinkingOutput) const override;
108};
109
111public:
113 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
114
117
120 const llvm::opt::ArgList &TCArgs,
121 const char *LinkingOutput) const override;
122};
123
125public:
127 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
128
130
133 const llvm::opt::ArgList &TCArgs,
134 const char *LinkingOutput) const override;
135};
136}
137}
138
139namespace toolchains {
140
142protected:
143 Tool *buildAssembler() const override;
144 Tool *buildLinker() const override;
145 Tool *buildStaticLibTool() const override;
147
148private:
149 mutable std::unique_ptrtools::darwin::Lipo Lipo;
150 mutable std::unique_ptrtools::darwin::Dsymutil Dsymutil;
151 mutable std::unique_ptrtools::darwin::VerifyDebug VerifyDebug;
152
153
154 mutable std::optional LinkerVersion;
155
156public:
157 MachO(const Driver &D, const llvm::Triple &Triple,
158 const llvm::opt::ArgList &Args);
160
161
162
163
164
165
166 StringRef getMachOArchName(const llvm::opt::ArgList &Args) const;
167
168
169
170 VersionTuple getLinkerVersion(const llvm::opt::ArgList &Args) const;
171
172
174 llvm::opt::ArgStringList &CmdArgs) const {}
175
176
177
178
179
180 virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
181 llvm::opt::ArgStringList &CmdArgs,
182 bool ForceLinkBuiltinRT = false) const;
183
185 llvm::opt::ArgStringList &CmdArgs) const {
186 }
187
189 llvm::opt::ArgStringList &CmdArgs) const {}
190
192 llvm::opt::ArgStringList &CmdArgs) const {
193 }
194
195
196
198
199
201
202
204
205 RLO_AlwaysLink = 1 << 0,
206
207
208 RLO_IsEmbedded = 1 << 1,
209
210
211 RLO_AddRPath = 1 << 2,
212 };
213
214
215 void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,
216 llvm::opt::ArgStringList &CmdArgs, StringRef Component,
217 RuntimeLinkOptions Opts = RuntimeLinkOptions(),
218 bool IsShared = false) const;
219
220
221
223 llvm::opt::ArgStringList &CmdArgs) const override {
224
225 }
226
227
228
229
230 std::string
231 getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
232 FileType Type = ToolChain::FT_Static) const override;
233
234
235
236
237
238 types::ID LookupTypeForExtension(StringRef Ext) const override;
239
240 bool HasNativeLLVMSupport() const override;
241
242 llvm::opt::DerivedArgList *
243 TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
245
247
248
249 return true;
250 }
251
253
255
257
258 return getTriple().getArch() != llvm::Triple::x86;
259 }
260
262
263 UnwindTableLevel
264 getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override;
265
267 return ToolChain::RLT_CompilerRT;
268 }
269
270 bool isPICDefault() const override;
271 bool isPIEDefault(const llvm::opt::ArgList &Args) const override;
272 bool isPICDefaultForced() const override;
273
274 bool SupportsProfiling() const override;
275
276 bool UseDwarfDebugFlags() const override;
277 std::string GetGlobalDebugPathRemapping() const override;
278
279 llvm::ExceptionHandling
281 return llvm::ExceptionHandling::None;
282 }
283
285 return "";
286 }
287
288
289
291
292};
293
294
296public:
298 const llvm::opt::ArgList &Args);
300
301
302
303
304 void
305 AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
306 llvm::opt::ArgStringList &CC1Args) const override;
307
308 void AddCudaIncludeArgs(const llvm::opt::ArgList &DriverArgs,
309 llvm::opt::ArgStringList &CC1Args) const override;
310 void AddHIPIncludeArgs(const llvm::opt::ArgList &DriverArgs,
311 llvm::opt::ArgStringList &CC1Args) const override;
312 void addSYCLIncludeArgs(const llvm::opt::ArgList &DriverArgs,
313 llvm::opt::ArgStringList &CC1Args) const override;
314
315 void AddClangCXXStdlibIncludeArgs(
316 const llvm::opt::ArgList &DriverArgs,
317 llvm::opt::ArgStringList &CC1Args) const override;
318 void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
319 llvm::opt::ArgStringList &CmdArgs) const override;
320
321 void printVerboseInfo(raw_ostream &OS) const override;
322
323
327
328protected:
330 GetEffectiveSysroot(const llvm::opt::ArgList &DriverArgs) const;
331
332private:
333 virtual void
334 AddGnuCPlusPlusIncludePaths(const llvm::opt::ArgList &DriverArgs,
335 llvm::opt::ArgStringList &CC1Args) const;
336};
337
338
340public:
341
342
343
344
345
347
355 LastDarwinPlatform = XROS
361 };
362
365
366
368
370
371
372 mutable std::optional SDKInfo;
373
374
376
377private:
378 void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const;
379
380public:
381 Darwin(const Driver &D, const llvm::Triple &Triple,
382 const llvm::opt::ArgList &Args);
384
385 std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
386 types::ID InputType) const override;
387
388
389
390
391 void addMinVersionArgs(const llvm::opt::ArgList &Args,
392 llvm::opt::ArgStringList &CmdArgs) const override;
393
394 void addPlatformVersionArgs(const llvm::opt::ArgList &Args,
395 llvm::opt::ArgStringList &CmdArgs) const override;
396
397 void addStartObjectFileArgs(const llvm::opt::ArgList &Args,
398 llvm::opt::ArgStringList &CmdArgs) const override;
399
401 return (!(isTargetIPhoneOS() && !isIPhoneOSVersionLT(6, 0)) &&
402 !isTargetWatchOS() && !isTargetDriverKit());
403 }
404
405 void addProfileRTLibs(const llvm::opt::ArgList &Args,
406 llvm::opt::ArgStringList &CmdArgs) const override;
407
408
409
410 std::string
411 getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
412 FileType Type = ToolChain::FT_Static) const override;
413
414protected:
415
416
417
418
419
420
422 unsigned Major, unsigned Minor, unsigned Micro,
423 VersionTuple NativeTargetVersion) const {
424
425
426 if (TargetInitialized && TargetPlatform == Platform &&
427 TargetEnvironment == Environment &&
428 (Environment == MacCatalyst ? OSTargetVersion : TargetVersion) ==
429 VersionTuple(Major, Minor, Micro))
430 return;
431
432 assert(!TargetInitialized && "Target already initialized!");
433 TargetInitialized = true;
434 TargetPlatform = Platform;
435 TargetEnvironment = Environment;
436 TargetVersion = VersionTuple(Major, Minor, Micro);
437 if (Environment == Simulator)
438 const_cast<Darwin *>(this)->setTripleEnvironment(llvm::Triple::Simulator);
439 else if (Environment == MacCatalyst) {
440 const_cast<Darwin *>(this)->setTripleEnvironment(llvm::Triple::MacABI);
442 OSTargetVersion = VersionTuple(Major, Minor, Micro);
443 }
444 }
445
446public:
448 assert(TargetInitialized && "Target not initialized!");
449 return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&
450 TargetEnvironment == NativeEnvironment;
451 }
452
454 assert(TargetInitialized && "Target not initialized!");
455 return (TargetPlatform == IPhoneOS || TargetPlatform == TvOS) &&
456 TargetEnvironment == Simulator;
457 }
458
460 assert(TargetInitialized && "Target not initialized!");
461 return isTargetIPhoneOS() || isTargetIOSSimulator();
462 }
463
465 return TargetPlatform == XROS && TargetEnvironment == NativeEnvironment;
466 }
467
469 return TargetPlatform == XROS && TargetEnvironment == Simulator;
470 }
471
472 bool isTargetXROS() const { return TargetPlatform == XROS; }
473
475 assert(TargetInitialized && "Target not initialized!");
476 return TargetPlatform == TvOS && TargetEnvironment == NativeEnvironment;
477 }
478
480 assert(TargetInitialized && "Target not initialized!");
481 return TargetPlatform == TvOS && TargetEnvironment == Simulator;
482 }
483
485 assert(TargetInitialized && "Target not initialized!");
486 return TargetPlatform == TvOS;
487 }
488
490 assert(TargetInitialized && "Target not initialized!");
491 return TargetPlatform == WatchOS && TargetEnvironment == NativeEnvironment;
492 }
493
495 assert(TargetInitialized && "Target not initialized!");
496 return TargetPlatform == WatchOS && TargetEnvironment == Simulator;
497 }
498
500 assert(TargetInitialized && "Target not initialized!");
501 return TargetPlatform == WatchOS;
502 }
503
505 assert(TargetInitialized && "Target not initialized!");
506 return TargetPlatform == DriverKit;
507 }
508
510 return TargetPlatform == IPhoneOS && TargetEnvironment == MacCatalyst;
511 }
512
514 assert(TargetInitialized && "Target not initialized!");
515 return TargetPlatform == MacOS;
516 }
517
519 assert(TargetInitialized && "Target not initialized!");
520 return TargetPlatform == MacOS || isTargetMacCatalyst();
521 }
522
524 assert(TargetInitialized && "Target not initialized!");
525 return isTargetMacOSBased() && getArch() == llvm::Triple::aarch64;
526 }
527
529
530
531
532
533
535 assert(TargetInitialized && "Target not initialized!");
536 return isTargetMacCatalyst() ? OSTargetVersion : TargetVersion;
537 }
538
540 unsigned V2 = 0) const {
541 assert(isTargetIOSBased() && "Unexpected call for non iOS target!");
543 }
544
545
546
547
548
549 bool isMacosxVersionLT(unsigned V0, unsigned V1 = 0, unsigned V2 = 0) const {
550 assert(isTargetMacOSBased() &&
551 (getTriple().isMacOSX() || getTriple().isMacCatalystEnvironment()) &&
552 "Unexpected call for non OS X target!");
553
554
555 VersionTuple MinVers =
556 llvm::Triple(getTriple().getArchName(), "apple", "macos")
557 .getMinimumSupportedOSVersion();
558 return (!MinVers.empty() && MinVers > TargetVersion
559 ? MinVers
561 }
562
563protected:
564
565
566
567 bool isAlignedAllocationUnavailable() const;
568
569
570
571 bool isSizedDeallocationUnavailable() const;
572
573 void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
574 llvm::opt::ArgStringList &CC1Args,
576
577 void addClangCC1ASTargetOptions(
578 const llvm::opt::ArgList &Args,
579 llvm::opt::ArgStringList &CC1ASArgs) const override;
580
581 StringRef getPlatformFamily() const;
582 StringRef getOSLibraryNameSuffix(bool IgnoreSim = false) const override;
583
584public:
585 static StringRef getSDKName(StringRef isysroot);
586
587
588
589
590
591
592
593
595
596 llvm::opt::DerivedArgList *
597 TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
599
600 CXXStdlibType GetDefaultCXXStdlibType() const override;
601 ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const override;
602 bool hasBlocksRuntime() const override;
603
605
606
607
608 return !(isTargetMacOSBased() && isMacosxVersionLT(10, 6));
609 }
610
613
614
615 if (isTargetIOSBased() || isTargetWatchOSBased() || isTargetDriverKit() ||
616 isTargetXROS())
617 return LangOptions::SSPOn;
618 else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 6))
619 return LangOptions::SSPOn;
620 else if (isTargetMacOSBased() && !isMacosxVersionLT(10, 5) && !KernelOrKext)
621 return LangOptions::SSPOn;
622
623 return LangOptions::SSPOff;
624 }
625
626 void CheckObjCARC() const override;
627
628 llvm::ExceptionHandling GetExceptionModel(
629 const llvm::opt::ArgList &Args) const override;
630
631 bool SupportsEmbeddedBitcode() const override;
632
633 SanitizerMask getSupportedSanitizers() const override;
634};
635
636
638public:
640 const llvm::opt::ArgList &Args);
641
642
643
644
645 RuntimeLibType GetRuntimeLibType(const llvm::opt::ArgList &Args) const override;
646
647 void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
648 llvm::opt::ArgStringList &CmdArgs,
649 bool ForceLinkBuiltinRT = false) const override;
650
651 void AddCCKextLibArgs(const llvm::opt::ArgList &Args,
652 llvm::opt::ArgStringList &CmdArgs) const override;
653
654 void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;
655
656 void AddLinkARCArgs(const llvm::opt::ArgList &Args,
657 llvm::opt::ArgStringList &CmdArgs) const override;
658
659 unsigned GetDefaultDwarfVersion() const override;
660
661
664 return llvm::DebuggerKind::LLDB;
665 }
666
667
668
669private:
670 void AddLinkSanitizerLibArgs(const llvm::opt::ArgList &Args,
671 llvm::opt::ArgStringList &CmdArgs,
672 StringRef Sanitizer,
673 bool shared = true) const;
674
675 void
676 AddGnuCPlusPlusIncludePaths(const llvm::opt::ArgList &DriverArgs,
677 llvm::opt::ArgStringList &CC1Args) const override;
678
679 bool AddGnuCPlusPlusIncludePaths(const llvm::opt::ArgList &DriverArgs,
680 llvm::opt::ArgStringList &CC1Args,
682 llvm::StringRef Version,
683 llvm::StringRef ArchDir,
684 llvm::StringRef BitDir) const;
685};
686
687}
688}
689}
690
691#endif
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...
InputInfo - Wrapper for information about an input source.
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T