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