Clang Project

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