1193326Sed//===--- ToolChains.h - ToolChain Implementations ---------------*- C++ -*-===//
2193326Sed//
3193326Sed//                     The LLVM Compiler Infrastructure
4193326Sed//
5193326Sed// This file is distributed under the University of Illinois Open Source
6193326Sed// License. See LICENSE.TXT for details.
7193326Sed//
8193326Sed//===----------------------------------------------------------------------===//
9193326Sed
10193326Sed#ifndef CLANG_LIB_DRIVER_TOOLCHAINS_H_
11193326Sed#define CLANG_LIB_DRIVER_TOOLCHAINS_H_
12193326Sed
13249423Sdim#include "Tools.h"
14249423Sdim#include "clang/Basic/VersionTuple.h"
15193326Sed#include "clang/Driver/Action.h"
16193326Sed#include "clang/Driver/ToolChain.h"
17193326Sed#include "llvm/ADT/DenseMap.h"
18193326Sed#include "llvm/Support/Compiler.h"
19263508Sdim#include <vector>
20263508Sdim#include <set>
21193326Sed
22193326Sednamespace clang {
23193326Sednamespace driver {
24193326Sednamespace toolchains {
25193326Sed
26198092Srdivacky/// Generic_GCC - A tool chain using the 'gcc' command to perform
27198092Srdivacky/// all subcommands; this relies on gcc translating the majority of
28198092Srdivacky/// command line options.
29208600Srdivackyclass LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain {
30193326Sedprotected:
31234353Sdim  /// \brief Struct to store and manipulate GCC versions.
32234353Sdim  ///
33234353Sdim  /// We rely on assumptions about the form and structure of GCC version
34234353Sdim  /// numbers: they consist of at most three '.'-separated components, and each
35234353Sdim  /// component is a non-negative integer except for the last component. For
36234353Sdim  /// the last component we are very flexible in order to tolerate release
37234353Sdim  /// candidates or 'x' wildcards.
38234353Sdim  ///
39234353Sdim  /// Note that the ordering established among GCCVersions is based on the
40234353Sdim  /// preferred version string to use. For example we prefer versions without
41234353Sdim  /// a hard-coded patch number to those with a hard coded patch number.
42234353Sdim  ///
43234353Sdim  /// Currently this doesn't provide any logic for textual suffixes to patches
44234353Sdim  /// in the way that (for example) Debian's version format does. If that ever
45234353Sdim  /// becomes necessary, it can be added.
46234353Sdim  struct GCCVersion {
47234353Sdim    /// \brief The unparsed text of the version.
48234353Sdim    std::string Text;
49234353Sdim
50234353Sdim    /// \brief The parsed major, minor, and patch numbers.
51234353Sdim    int Major, Minor, Patch;
52234353Sdim
53263508Sdim    /// \brief The text of the parsed major, and major+minor versions.
54263508Sdim    std::string MajorStr, MinorStr;
55263508Sdim
56234353Sdim    /// \brief Any textual suffix on the patch number.
57234353Sdim    std::string PatchSuffix;
58234353Sdim
59234353Sdim    static GCCVersion Parse(StringRef VersionText);
60263508Sdim    bool isOlderThan(int RHSMajor, int RHSMinor, int RHSPatch,
61263508Sdim                     StringRef RHSPatchSuffix = StringRef()) const;
62263508Sdim    bool operator<(const GCCVersion &RHS) const {
63263508Sdim      return isOlderThan(RHS.Major, RHS.Minor, RHS.Patch, RHS.PatchSuffix);
64263508Sdim    }
65234353Sdim    bool operator>(const GCCVersion &RHS) const { return RHS < *this; }
66234353Sdim    bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); }
67234353Sdim    bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); }
68234353Sdim  };
69234353Sdim
70234353Sdim
71234353Sdim  /// \brief This is a class to find a viable GCC installation for Clang to
72234353Sdim  /// use.
73234353Sdim  ///
74234353Sdim  /// This class tries to find a GCC installation on the system, and report
75234353Sdim  /// information about it. It starts from the host information provided to the
76234353Sdim  /// Driver, and has logic for fuzzing that where appropriate.
77234353Sdim  class GCCInstallationDetector {
78234353Sdim    bool IsValid;
79263508Sdim    const Driver &D;
80234353Sdim    llvm::Triple GCCTriple;
81234353Sdim
82234353Sdim    // FIXME: These might be better as path objects.
83234353Sdim    std::string GCCInstallPath;
84263508Sdim    std::string GCCBiarchSuffix;
85234353Sdim    std::string GCCParentLibPath;
86263508Sdim    std::string GCCMIPSABIDirSuffix;
87234353Sdim
88234353Sdim    GCCVersion Version;
89234353Sdim
90263508Sdim    // We retain the list of install paths that were considered and rejected in
91263508Sdim    // order to print out detailed information in verbose mode.
92263508Sdim    std::set<std::string> CandidateGCCInstallPaths;
93263508Sdim
94234353Sdim  public:
95263508Sdim    GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {}
96263508Sdim    void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args);
97234353Sdim
98234353Sdim    /// \brief Check whether we detected a valid GCC install.
99234353Sdim    bool isValid() const { return IsValid; }
100234353Sdim
101234353Sdim    /// \brief Get the GCC triple for the detected install.
102234353Sdim    const llvm::Triple &getTriple() const { return GCCTriple; }
103234353Sdim
104234353Sdim    /// \brief Get the detected GCC installation path.
105234353Sdim    StringRef getInstallPath() const { return GCCInstallPath; }
106234353Sdim
107263508Sdim    /// \brief Get the detected GCC installation path suffix for the bi-arch
108263508Sdim    /// target variant.
109263508Sdim    StringRef getBiarchSuffix() const { return GCCBiarchSuffix; }
110234353Sdim
111234353Sdim    /// \brief Get the detected GCC parent lib path.
112234353Sdim    StringRef getParentLibPath() const { return GCCParentLibPath; }
113234353Sdim
114263508Sdim    /// \brief Get the detected GCC MIPS ABI directory suffix.
115263508Sdim    ///
116263508Sdim    /// This is used as a suffix both to the install directory of GCC and as
117263508Sdim    /// a suffix to its parent lib path in order to select a MIPS ABI-specific
118263508Sdim    /// subdirectory.
119263508Sdim    ///
120263508Sdim    /// This will always be empty for any non-MIPS target.
121263508Sdim    ///
122263508Sdim    // FIXME: This probably shouldn't exist at all, and should be factored
123263508Sdim    // into the multiarch and/or biarch support. Please don't add more uses of
124263508Sdim    // this interface, it is meant as a legacy crutch for the MIPS driver
125263508Sdim    // logic.
126263508Sdim    StringRef getMIPSABIDirSuffix() const { return GCCMIPSABIDirSuffix; }
127263508Sdim
128234353Sdim    /// \brief Get the detected GCC version string.
129239462Sdim    const GCCVersion &getVersion() const { return Version; }
130234353Sdim
131263508Sdim    /// \brief Print information about the detected GCC installation.
132263508Sdim    void print(raw_ostream &OS) const;
133263508Sdim
134234353Sdim  private:
135263508Sdim    static void
136263508Sdim    CollectLibDirsAndTriples(const llvm::Triple &TargetTriple,
137263508Sdim                             const llvm::Triple &BiarchTriple,
138263508Sdim                             SmallVectorImpl<StringRef> &LibDirs,
139263508Sdim                             SmallVectorImpl<StringRef> &TripleAliases,
140263508Sdim                             SmallVectorImpl<StringRef> &BiarchLibDirs,
141263508Sdim                             SmallVectorImpl<StringRef> &BiarchTripleAliases);
142234353Sdim
143234353Sdim    void ScanLibDirForGCCTriple(llvm::Triple::ArchType TargetArch,
144263508Sdim                                const llvm::opt::ArgList &Args,
145234353Sdim                                const std::string &LibDir,
146234353Sdim                                StringRef CandidateTriple,
147263508Sdim                                bool NeedsBiarchSuffix = false);
148263508Sdim
149263508Sdim    void findMIPSABIDirSuffix(std::string &Suffix,
150263508Sdim                              llvm::Triple::ArchType TargetArch, StringRef Path,
151263508Sdim                              const llvm::opt::ArgList &Args);
152234353Sdim  };
153234353Sdim
154234353Sdim  GCCInstallationDetector GCCInstallation;
155234353Sdim
156193326Sedpublic:
157263508Sdim  Generic_GCC(const Driver &D, const llvm::Triple &Triple,
158263508Sdim              const llvm::opt::ArgList &Args);
159193326Sed  ~Generic_GCC();
160193326Sed
161263508Sdim  virtual void printVerboseInfo(raw_ostream &OS) const;
162263508Sdim
163193326Sed  virtual bool IsUnwindTablesDefault() const;
164243830Sdim  virtual bool isPICDefault() const;
165251662Sdim  virtual bool isPIEDefault() const;
166243830Sdim  virtual bool isPICDefaultForced() const;
167266715Sdim  virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
168266715Sdim                                     llvm::opt::ArgStringList &CC1Args) const;
169234353Sdim
170234353Sdimprotected:
171249423Sdim  virtual Tool *getTool(Action::ActionClass AC) const;
172249423Sdim  virtual Tool *buildAssembler() const;
173249423Sdim  virtual Tool *buildLinker() const;
174249423Sdim
175234353Sdim  /// \name ToolChain Implementation Helper Functions
176234353Sdim  /// @{
177234353Sdim
178234353Sdim  /// \brief Check whether the target triple's architecture is 64-bits.
179234353Sdim  bool isTarget64Bit() const { return getTriple().isArch64Bit(); }
180234353Sdim
181234353Sdim  /// \brief Check whether the target triple's architecture is 32-bits.
182234353Sdim  bool isTarget32Bit() const { return getTriple().isArch32Bit(); }
183234353Sdim
184234353Sdim  /// @}
185193326Sed
186249423Sdimprivate:
187249423Sdim  mutable OwningPtr<tools::gcc::Preprocess> Preprocess;
188249423Sdim  mutable OwningPtr<tools::gcc::Precompile> Precompile;
189249423Sdim  mutable OwningPtr<tools::gcc::Compile> Compile;
190234353Sdim};
191234353Sdim
192234353Sdim  /// Darwin - The base Darwin tool chain.
193208600Srdivackyclass LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain {
194212904Sdimpublic:
195212904Sdim  /// The host version.
196212904Sdim  unsigned DarwinVersion[3];
197212904Sdim
198249423Sdimprotected:
199249423Sdim  virtual Tool *buildAssembler() const;
200249423Sdim  virtual Tool *buildLinker() const;
201249423Sdim  virtual Tool *getTool(Action::ActionClass AC) const;
202249423Sdim
203212904Sdimprivate:
204249423Sdim  mutable OwningPtr<tools::darwin::Lipo> Lipo;
205249423Sdim  mutable OwningPtr<tools::darwin::Dsymutil> Dsymutil;
206249423Sdim  mutable OwningPtr<tools::darwin::VerifyDebug> VerifyDebug;
207193326Sed
208203955Srdivacky  /// Whether the information on the target has been initialized.
209198092Srdivacky  //
210203955Srdivacky  // FIXME: This should be eliminated. What we want to do is make this part of
211203955Srdivacky  // the "default target for arguments" selection process, once we get out of
212203955Srdivacky  // the argument translation business.
213203955Srdivacky  mutable bool TargetInitialized;
214193326Sed
215221345Sdim  /// Whether we are targeting iPhoneOS target.
216203955Srdivacky  mutable bool TargetIsIPhoneOS;
217208600Srdivacky
218221345Sdim  /// Whether we are targeting the iPhoneOS simulator target.
219221345Sdim  mutable bool TargetIsIPhoneOSSimulator;
220221345Sdim
221221345Sdim  /// The OS version we are targeting.
222234353Sdim  mutable VersionTuple TargetVersion;
223203955Srdivacky
224239462Sdimprivate:
225193326Sed  /// The default macosx-version-min of this tool chain; empty until
226193326Sed  /// initialized.
227203955Srdivacky  std::string MacosxVersionMin;
228193326Sed
229239462Sdim  /// The default ios-version-min of this tool chain; empty until
230239462Sdim  /// initialized.
231239462Sdim  std::string iOSVersionMin;
232224145Sdim
233212904Sdimprivate:
234263508Sdim  void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const;
235212904Sdim
236193326Sedpublic:
237263508Sdim  Darwin(const Driver &D, const llvm::Triple &Triple,
238263508Sdim         const llvm::opt::ArgList &Args);
239198092Srdivacky  ~Darwin();
240193326Sed
241263508Sdim  std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
242226633Sdim                                          types::ID InputType) const;
243212904Sdim
244198092Srdivacky  /// @name Darwin Specific Toolchain API
245198092Srdivacky  /// {
246198092Srdivacky
247203955Srdivacky  // FIXME: Eliminate these ...Target functions and derive separate tool chains
248203955Srdivacky  // for these targets and put version in constructor.
249221345Sdim  void setTarget(bool IsIPhoneOS, unsigned Major, unsigned Minor,
250221345Sdim                 unsigned Micro, bool IsIOSSim) const {
251221345Sdim    assert((!IsIOSSim || IsIPhoneOS) && "Unexpected deployment target!");
252221345Sdim
253203955Srdivacky    // FIXME: For now, allow reinitialization as long as values don't
254203955Srdivacky    // change. This will go away when we move away from argument translation.
255221345Sdim    if (TargetInitialized && TargetIsIPhoneOS == IsIPhoneOS &&
256221345Sdim        TargetIsIPhoneOSSimulator == IsIOSSim &&
257234353Sdim        TargetVersion == VersionTuple(Major, Minor, Micro))
258203955Srdivacky      return;
259203955Srdivacky
260203955Srdivacky    assert(!TargetInitialized && "Target already initialized!");
261203955Srdivacky    TargetInitialized = true;
262221345Sdim    TargetIsIPhoneOS = IsIPhoneOS;
263221345Sdim    TargetIsIPhoneOSSimulator = IsIOSSim;
264234353Sdim    TargetVersion = VersionTuple(Major, Minor, Micro);
265193326Sed  }
266193326Sed
267203955Srdivacky  bool isTargetIPhoneOS() const {
268203955Srdivacky    assert(TargetInitialized && "Target not initialized!");
269203955Srdivacky    return TargetIsIPhoneOS;
270193326Sed  }
271193326Sed
272221345Sdim  bool isTargetIOSSimulator() const {
273221345Sdim    assert(TargetInitialized && "Target not initialized!");
274221345Sdim    return TargetIsIPhoneOSSimulator;
275221345Sdim  }
276221345Sdim
277234353Sdim  bool isTargetMacOS() const {
278243830Sdim    return !isTargetIOSSimulator() && !isTargetIPhoneOS();
279234353Sdim  }
280234353Sdim
281205408Srdivacky  bool isTargetInitialized() const { return TargetInitialized; }
282205408Srdivacky
283234353Sdim  VersionTuple getTargetVersion() const {
284203955Srdivacky    assert(TargetInitialized && "Target not initialized!");
285234353Sdim    return TargetVersion;
286203955Srdivacky  }
287203955Srdivacky
288202879Srdivacky  /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler
289202879Srdivacky  /// invocation. For example, Darwin treats different ARM variations as
290202879Srdivacky  /// distinct architectures.
291263508Sdim  StringRef getDarwinArchName(const llvm::opt::ArgList &Args) const;
292202879Srdivacky
293203955Srdivacky  bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const {
294203955Srdivacky    assert(isTargetIPhoneOS() && "Unexpected call for OS X target!");
295234353Sdim    return TargetVersion < VersionTuple(V0, V1, V2);
296198092Srdivacky  }
297198092Srdivacky
298203955Srdivacky  bool isMacosxVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const {
299203955Srdivacky    assert(!isTargetIPhoneOS() && "Unexpected call for iPhoneOS target!");
300234353Sdim    return TargetVersion < VersionTuple(V0, V1, V2);
301193326Sed  }
302193326Sed
303224145Sdim  /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library.
304263508Sdim  virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args,
305263508Sdim                              llvm::opt::ArgStringList &CmdArgs) const = 0;
306263508Sdim
307198092Srdivacky  /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler
308198092Srdivacky  /// runtime library.
309263508Sdim  virtual void
310263508Sdim  AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
311263508Sdim                        llvm::opt::ArgStringList &CmdArgs) const = 0;
312263508Sdim
313198092Srdivacky  /// }
314198092Srdivacky  /// @name ToolChain Implementation
315198092Srdivacky  /// {
316198092Srdivacky
317212904Sdim  virtual types::ID LookupTypeForExtension(const char *Ext) const;
318212904Sdim
319218893Sdim  virtual bool HasNativeLLVMSupport() const;
320218893Sdim
321239462Sdim  virtual ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const;
322226633Sdim  virtual bool hasBlocksRuntime() const;
323224145Sdim
324263508Sdim  virtual llvm::opt::DerivedArgList *
325263508Sdim  TranslateArgs(const llvm::opt::DerivedArgList &Args,
326263508Sdim                const char *BoundArch) const;
327198092Srdivacky
328199482Srdivacky  virtual bool IsBlocksDefault() const {
329212904Sdim    // Always allow blocks on Darwin; users interested in versioning are
330212904Sdim    // expected to use /usr/include/Blocks.h.
331212904Sdim    return true;
332199482Srdivacky  }
333208600Srdivacky  virtual bool IsIntegratedAssemblerDefault() const {
334234353Sdim    // Default integrated assembler to on for Darwin.
335234353Sdim    return true;
336208600Srdivacky  }
337239462Sdim
338239462Sdim  virtual bool IsMathErrnoDefault() const {
339239462Sdim    return false;
340239462Sdim  }
341239462Sdim
342243830Sdim  virtual bool IsEncodeExtendedBlockSignatureDefault() const {
343243830Sdim    return true;
344243830Sdim  }
345243830Sdim
346199482Srdivacky  virtual bool IsObjCNonFragileABIDefault() const {
347207619Srdivacky    // Non-fragile ABI is default for everything but i386.
348207619Srdivacky    return getTriple().getArch() != llvm::Triple::x86;
349199482Srdivacky  }
350207619Srdivacky
351207619Srdivacky  virtual bool UseObjCMixedDispatch() const {
352207619Srdivacky    // This is only used with the non-fragile ABI and non-legacy dispatch.
353207619Srdivacky
354207619Srdivacky    // Mixed dispatch is used everywhere except OS X before 10.6.
355207619Srdivacky    return !(!isTargetIPhoneOS() && isMacosxVersionLT(10, 6));
356207619Srdivacky  }
357193326Sed  virtual bool IsUnwindTablesDefault() const;
358226633Sdim  virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
359226633Sdim    // Stack protectors default to on for user code on 10.5,
360226633Sdim    // and for everything in 10.6 and beyond
361234353Sdim    return isTargetIPhoneOS() ||
362226633Sdim      (!isMacosxVersionLT(10, 6) ||
363226633Sdim         (!isMacosxVersionLT(10, 5) && !KernelOrKext));
364199482Srdivacky  }
365234353Sdim  virtual RuntimeLibType GetDefaultRuntimeLibType() const {
366234353Sdim    return ToolChain::RLT_CompilerRT;
367234353Sdim  }
368243830Sdim  virtual bool isPICDefault() const;
369251662Sdim  virtual bool isPIEDefault() const;
370243830Sdim  virtual bool isPICDefaultForced() const;
371198092Srdivacky
372221345Sdim  virtual bool SupportsProfiling() const;
373221345Sdim
374207619Srdivacky  virtual bool SupportsObjCGC() const;
375207619Srdivacky
376243830Sdim  virtual void CheckObjCARC() const;
377234353Sdim
378201361Srdivacky  virtual bool UseDwarfDebugFlags() const;
379201361Srdivacky
380203955Srdivacky  virtual bool UseSjLjExceptions() const;
381203955Srdivacky
382198092Srdivacky  /// }
383193326Sed};
384193326Sed
385198092Srdivacky/// DarwinClang - The Darwin toolchain used by Clang.
386208600Srdivackyclass LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin {
387193326Sedpublic:
388263508Sdim  DarwinClang(const Driver &D, const llvm::Triple &Triple,
389263508Sdim              const llvm::opt::ArgList &Args);
390198092Srdivacky
391198092Srdivacky  /// @name Darwin ToolChain Implementation
392198092Srdivacky  /// {
393198092Srdivacky
394263508Sdim  virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
395263508Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
396263508Sdim  void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,
397263508Sdim                         llvm::opt::ArgStringList &CmdArgs,
398249423Sdim                         const char *DarwinStaticLib,
399249423Sdim                         bool AlwaysLink = false) const;
400249423Sdim
401263508Sdim  virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
402263508Sdim                                   llvm::opt::ArgStringList &CmdArgs) const;
403218893Sdim
404263508Sdim  virtual void AddCCKextLibArgs(const llvm::opt::ArgList &Args,
405263508Sdim                                llvm::opt::ArgStringList &CmdArgs) const;
406218893Sdim
407263508Sdim  virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args,
408263508Sdim                              llvm::opt::ArgStringList &CmdArgs) const;
409198092Srdivacky  /// }
410198092Srdivacky};
411198092Srdivacky
412198092Srdivacky/// Darwin_Generic_GCC - Generic Darwin tool chain using gcc.
413208600Srdivackyclass LLVM_LIBRARY_VISIBILITY Darwin_Generic_GCC : public Generic_GCC {
414198092Srdivackypublic:
415263508Sdim  Darwin_Generic_GCC(const Driver &D, const llvm::Triple &Triple,
416263508Sdim                     const llvm::opt::ArgList &Args)
417263508Sdim      : Generic_GCC(D, Triple, Args) {}
418193326Sed
419263508Sdim  std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
420226633Sdim                                          types::ID InputType) const;
421212904Sdim
422249423Sdim  virtual bool isPICDefault() const { return false; }
423193326Sed};
424193326Sed
425218893Sdimclass LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC {
426234353Sdim  virtual void anchor();
427234353Sdimpublic:
428263508Sdim  Generic_ELF(const Driver &D, const llvm::Triple &Triple,
429263508Sdim              const llvm::opt::ArgList &Args)
430263508Sdim      : Generic_GCC(D, Triple, Args) {}
431218893Sdim
432218893Sdim  virtual bool IsIntegratedAssemblerDefault() const {
433218893Sdim    // Default integrated assembler to on for x86.
434249423Sdim    return (getTriple().getArch() == llvm::Triple::aarch64 ||
435249423Sdim            getTriple().getArch() == llvm::Triple::x86 ||
436218893Sdim            getTriple().getArch() == llvm::Triple::x86_64);
437218893Sdim  }
438218893Sdim};
439218893Sdim
440208600Srdivackyclass LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC {
441198092Srdivackypublic:
442263508Sdim  AuroraUX(const Driver &D, const llvm::Triple &Triple,
443263508Sdim           const llvm::opt::ArgList &Args);
444198092Srdivacky
445249423Sdimprotected:
446249423Sdim  virtual Tool *buildAssembler() const;
447249423Sdim  virtual Tool *buildLinker() const;
448198092Srdivacky};
449198092Srdivacky
450234353Sdimclass LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC {
451234353Sdimpublic:
452263508Sdim  Solaris(const Driver &D, const llvm::Triple &Triple,
453263508Sdim          const llvm::opt::ArgList &Args);
454234353Sdim
455249423Sdim  virtual bool IsIntegratedAssemblerDefault() const { return true; }
456249423Sdimprotected:
457249423Sdim  virtual Tool *buildAssembler() const;
458249423Sdim  virtual Tool *buildLinker() const;
459234353Sdim
460234353Sdim};
461234353Sdim
462234353Sdim
463218893Sdimclass LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF {
464195341Sedpublic:
465263508Sdim  OpenBSD(const Driver &D, const llvm::Triple &Triple,
466263508Sdim          const llvm::opt::ArgList &Args);
467195341Sed
468239462Sdim  virtual bool IsMathErrnoDefault() const { return false; }
469234353Sdim  virtual bool IsObjCNonFragileABIDefault() const { return true; }
470263508Sdim  virtual bool isPIEDefault() const { return true; }
471234353Sdim
472263508Sdim  virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
473263508Sdim    return 1;
474263508Sdim  }
475263508Sdim
476249423Sdimprotected:
477249423Sdim  virtual Tool *buildAssembler() const;
478249423Sdim  virtual Tool *buildLinker() const;
479195341Sed};
480195341Sed
481239462Sdimclass LLVM_LIBRARY_VISIBILITY Bitrig : public Generic_ELF {
482239462Sdimpublic:
483263508Sdim  Bitrig(const Driver &D, const llvm::Triple &Triple,
484263508Sdim         const llvm::opt::ArgList &Args);
485239462Sdim
486239462Sdim  virtual bool IsMathErrnoDefault() const { return false; }
487239462Sdim  virtual bool IsObjCNonFragileABIDefault() const { return true; }
488239462Sdim  virtual bool IsObjCLegacyDispatchDefault() const { return false; }
489239462Sdim
490263508Sdim  virtual void
491263508Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
492263508Sdim                               llvm::opt::ArgStringList &CC1Args) const;
493263508Sdim  virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
494263508Sdim                                   llvm::opt::ArgStringList &CmdArgs) const;
495239462Sdim  virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
496239462Sdim     return 1;
497239462Sdim  }
498249423Sdim
499249423Sdimprotected:
500249423Sdim  virtual Tool *buildAssembler() const;
501249423Sdim  virtual Tool *buildLinker() const;
502239462Sdim};
503239462Sdim
504218893Sdimclass LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF {
505193326Sedpublic:
506263508Sdim  FreeBSD(const Driver &D, const llvm::Triple &Triple,
507263508Sdim          const llvm::opt::ArgList &Args);
508263508Sdim  virtual bool HasNativeLLVMSupport() const;
509193326Sed
510239462Sdim  virtual bool IsMathErrnoDefault() const { return false; }
511234353Sdim  virtual bool IsObjCNonFragileABIDefault() const { return true; }
512234353Sdim
513263508Sdim  virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const;
514263508Sdim  virtual void
515263508Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
516263508Sdim                               llvm::opt::ArgStringList &CC1Args) const;
517263508Sdim  virtual bool IsIntegratedAssemblerDefault() const {
518263508Sdim    if (getTriple().getArch() == llvm::Triple::ppc ||
519263508Sdim        getTriple().getArch() == llvm::Triple::ppc64)
520263508Sdim      return true;
521263508Sdim    return Generic_ELF::IsIntegratedAssemblerDefault();
522263508Sdim  }
523255321Stheraven
524244640Sandrew  virtual bool UseSjLjExceptions() const;
525249423Sdimprotected:
526249423Sdim  virtual Tool *buildAssembler() const;
527249423Sdim  virtual Tool *buildLinker() const;
528193326Sed};
529193326Sed
530218893Sdimclass LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF {
531218893Sdimpublic:
532263508Sdim  NetBSD(const Driver &D, const llvm::Triple &Triple,
533263508Sdim         const llvm::opt::ArgList &Args);
534218893Sdim
535239462Sdim  virtual bool IsMathErrnoDefault() const { return false; }
536234353Sdim  virtual bool IsObjCNonFragileABIDefault() const { return true; }
537234353Sdim
538263508Sdim  virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const;
539251662Sdim
540263508Sdim  virtual void
541263508Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
542263508Sdim                               llvm::opt::ArgStringList &CC1Args) const;
543263508Sdim  virtual bool IsUnwindTablesDefault() const {
544263508Sdim    return true;
545263508Sdim  }
546263508Sdim  virtual bool IsIntegratedAssemblerDefault() const {
547263508Sdim    if (getTriple().getArch() == llvm::Triple::ppc)
548263508Sdim      return true;
549263508Sdim    return Generic_ELF::IsIntegratedAssemblerDefault();
550263508Sdim  }
551251662Sdim
552249423Sdimprotected:
553249423Sdim  virtual Tool *buildAssembler() const;
554249423Sdim  virtual Tool *buildLinker() const;
555218893Sdim};
556218893Sdim
557234353Sdimclass LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF {
558210299Sedpublic:
559263508Sdim  Minix(const Driver &D, const llvm::Triple &Triple,
560263508Sdim        const llvm::opt::ArgList &Args);
561210299Sed
562249423Sdimprotected:
563249423Sdim  virtual Tool *buildAssembler() const;
564249423Sdim  virtual Tool *buildLinker() const;
565210299Sed};
566210299Sed
567218893Sdimclass LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF {
568193326Sedpublic:
569263508Sdim  DragonFly(const Driver &D, const llvm::Triple &Triple,
570263508Sdim            const llvm::opt::ArgList &Args);
571193326Sed
572239462Sdim  virtual bool IsMathErrnoDefault() const { return false; }
573239462Sdim
574249423Sdimprotected:
575249423Sdim  virtual Tool *buildAssembler() const;
576249423Sdim  virtual Tool *buildLinker() const;
577193326Sed};
578193326Sed
579218893Sdimclass LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
580193326Sedpublic:
581263508Sdim  Linux(const Driver &D, const llvm::Triple &Triple,
582263508Sdim        const llvm::opt::ArgList &Args);
583212904Sdim
584218893Sdim  virtual bool HasNativeLLVMSupport() const;
585218893Sdim
586263508Sdim  virtual void
587263508Sdim  AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
588263508Sdim                            llvm::opt::ArgStringList &CC1Args) const;
589263508Sdim  virtual void
590263508Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
591263508Sdim                               llvm::opt::ArgStringList &CC1Args) const;
592251662Sdim  virtual bool isPIEDefault() const;
593228379Sdim
594218893Sdim  std::string Linker;
595218893Sdim  std::vector<std::string> ExtraOpts;
596234353Sdim
597249423Sdimprotected:
598249423Sdim  virtual Tool *buildAssembler() const;
599249423Sdim  virtual Tool *buildLinker() const;
600249423Sdim
601234353Sdimprivate:
602249423Sdim  static bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
603249423Sdim                                       Twine TargetArchDir,
604263508Sdim                                       Twine BiarchSuffix,
605263508Sdim                                       Twine MIPSABIDirSuffix,
606263508Sdim                                       const llvm::opt::ArgList &DriverArgs,
607263508Sdim                                       llvm::opt::ArgStringList &CC1Args);
608234353Sdim  static bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
609263508Sdim                                       const llvm::opt::ArgList &DriverArgs,
610263508Sdim                                       llvm::opt::ArgStringList &CC1Args);
611251662Sdim
612263508Sdim  std::string computeSysRoot() const;
613193326Sed};
614193326Sed
615249423Sdimclass LLVM_LIBRARY_VISIBILITY Hexagon_TC : public Linux {
616249423Sdimprotected:
617249423Sdim  GCCVersion GCCLibAndIncVersion;
618249423Sdim  virtual Tool *buildAssembler() const;
619249423Sdim  virtual Tool *buildLinker() const;
620193326Sed
621249423Sdimpublic:
622249423Sdim  Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
623263508Sdim             const llvm::opt::ArgList &Args);
624249423Sdim  ~Hexagon_TC();
625249423Sdim
626263508Sdim  virtual void
627263508Sdim  AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
628263508Sdim                            llvm::opt::ArgStringList &CC1Args) const;
629263508Sdim  virtual void
630263508Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
631263508Sdim                               llvm::opt::ArgStringList &CC1Args) const;
632263508Sdim  virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const;
633249423Sdim
634249423Sdim  StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; }
635249423Sdim
636249423Sdim  static std::string GetGnuDir(const std::string &InstalledDir);
637249423Sdim
638263508Sdim  static StringRef GetTargetCPU(const llvm::opt::ArgList &Args);
639249423Sdim};
640249423Sdim
641204793Srdivacky/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
642204793Srdivacky/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
643208600Srdivackyclass LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain {
644204793Srdivackypublic:
645263508Sdim  TCEToolChain(const Driver &D, const llvm::Triple &Triple,
646263508Sdim               const llvm::opt::ArgList &Args);
647204793Srdivacky  ~TCEToolChain();
648204793Srdivacky
649204793Srdivacky  bool IsMathErrnoDefault() const;
650243830Sdim  bool isPICDefault() const;
651251662Sdim  bool isPIEDefault() const;
652243830Sdim  bool isPICDefaultForced() const;
653204793Srdivacky};
654204793Srdivacky
655212904Sdimclass LLVM_LIBRARY_VISIBILITY Windows : public ToolChain {
656212904Sdimpublic:
657263508Sdim  Windows(const Driver &D, const llvm::Triple &Triple,
658263508Sdim          const llvm::opt::ArgList &Args);
659212904Sdim
660212904Sdim  virtual bool IsIntegratedAssemblerDefault() const;
661212904Sdim  virtual bool IsUnwindTablesDefault() const;
662243830Sdim  virtual bool isPICDefault() const;
663251662Sdim  virtual bool isPIEDefault() const;
664243830Sdim  virtual bool isPICDefaultForced() const;
665228379Sdim
666263508Sdim  virtual void
667263508Sdim  AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
668263508Sdim                            llvm::opt::ArgStringList &CC1Args) const;
669263508Sdim  virtual void
670263508Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
671263508Sdim                               llvm::opt::ArgStringList &CC1Args) const;
672263508Sdim
673249423Sdimprotected:
674249423Sdim  virtual Tool *buildLinker() const;
675249423Sdim  virtual Tool *buildAssembler() const;
676212904Sdim};
677212904Sdim
678263508Sdim
679263508Sdimclass LLVM_LIBRARY_VISIBILITY XCore : public ToolChain {
680263508Sdimpublic:
681263508Sdim  XCore(const Driver &D, const llvm::Triple &Triple,
682263508Sdim          const llvm::opt::ArgList &Args);
683263508Sdimprotected:
684263508Sdim  virtual Tool *buildAssembler() const;
685263508Sdim  virtual Tool *buildLinker() const;
686263508Sdimpublic:
687263508Sdim  virtual bool isPICDefault() const;
688263508Sdim  virtual bool isPIEDefault() const;
689263508Sdim  virtual bool isPICDefaultForced() const;
690263508Sdim  virtual bool SupportsProfiling() const;
691263508Sdim  virtual bool hasBlocksRuntime() const;
692263508Sdim  virtual void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
693263508Sdim                            llvm::opt::ArgStringList &CC1Args) const;
694263508Sdim  virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
695263508Sdim                                     llvm::opt::ArgStringList &CC1Args) const;
696263508Sdim  virtual void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
697263508Sdim                               llvm::opt::ArgStringList &CC1Args) const;
698263508Sdim  virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
699263508Sdim                                   llvm::opt::ArgStringList &CmdArgs) const;
700263508Sdim};
701263508Sdim
702193326Sed} // end namespace toolchains
703193326Sed} // end namespace driver
704193326Sed} // end namespace clang
705193326Sed
706193326Sed#endif
707