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
13252723Sdim#include "Tools.h"
14252723Sdim#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"
19263509Sdim#include <vector>
20263509Sdim#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:
31235633Sdim  /// \brief Struct to store and manipulate GCC versions.
32235633Sdim  ///
33235633Sdim  /// We rely on assumptions about the form and structure of GCC version
34235633Sdim  /// numbers: they consist of at most three '.'-separated components, and each
35235633Sdim  /// component is a non-negative integer except for the last component. For
36235633Sdim  /// the last component we are very flexible in order to tolerate release
37235633Sdim  /// candidates or 'x' wildcards.
38235633Sdim  ///
39235633Sdim  /// Note that the ordering established among GCCVersions is based on the
40235633Sdim  /// preferred version string to use. For example we prefer versions without
41235633Sdim  /// a hard-coded patch number to those with a hard coded patch number.
42235633Sdim  ///
43235633Sdim  /// Currently this doesn't provide any logic for textual suffixes to patches
44235633Sdim  /// in the way that (for example) Debian's version format does. If that ever
45235633Sdim  /// becomes necessary, it can be added.
46235633Sdim  struct GCCVersion {
47235633Sdim    /// \brief The unparsed text of the version.
48235633Sdim    std::string Text;
49235633Sdim
50235633Sdim    /// \brief The parsed major, minor, and patch numbers.
51235633Sdim    int Major, Minor, Patch;
52235633Sdim
53263509Sdim    /// \brief The text of the parsed major, and major+minor versions.
54263509Sdim    std::string MajorStr, MinorStr;
55263509Sdim
56235633Sdim    /// \brief Any textual suffix on the patch number.
57235633Sdim    std::string PatchSuffix;
58235633Sdim
59235633Sdim    static GCCVersion Parse(StringRef VersionText);
60263509Sdim    bool isOlderThan(int RHSMajor, int RHSMinor, int RHSPatch,
61263509Sdim                     StringRef RHSPatchSuffix = StringRef()) const;
62263509Sdim    bool operator<(const GCCVersion &RHS) const {
63263509Sdim      return isOlderThan(RHS.Major, RHS.Minor, RHS.Patch, RHS.PatchSuffix);
64263509Sdim    }
65235633Sdim    bool operator>(const GCCVersion &RHS) const { return RHS < *this; }
66235633Sdim    bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); }
67235633Sdim    bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); }
68235633Sdim  };
69235633Sdim
70235633Sdim
71235633Sdim  /// \brief This is a class to find a viable GCC installation for Clang to
72235633Sdim  /// use.
73235633Sdim  ///
74235633Sdim  /// This class tries to find a GCC installation on the system, and report
75235633Sdim  /// information about it. It starts from the host information provided to the
76235633Sdim  /// Driver, and has logic for fuzzing that where appropriate.
77235633Sdim  class GCCInstallationDetector {
78235633Sdim    bool IsValid;
79263509Sdim    const Driver &D;
80235633Sdim    llvm::Triple GCCTriple;
81235633Sdim
82235633Sdim    // FIXME: These might be better as path objects.
83235633Sdim    std::string GCCInstallPath;
84263509Sdim    std::string GCCBiarchSuffix;
85235633Sdim    std::string GCCParentLibPath;
86263509Sdim    std::string GCCMIPSABIDirSuffix;
87235633Sdim
88235633Sdim    GCCVersion Version;
89235633Sdim
90263509Sdim    // We retain the list of install paths that were considered and rejected in
91263509Sdim    // order to print out detailed information in verbose mode.
92263509Sdim    std::set<std::string> CandidateGCCInstallPaths;
93263509Sdim
94235633Sdim  public:
95263509Sdim    GCCInstallationDetector(const Driver &D) : IsValid(false), D(D) {}
96263509Sdim    void init(const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args);
97235633Sdim
98235633Sdim    /// \brief Check whether we detected a valid GCC install.
99235633Sdim    bool isValid() const { return IsValid; }
100235633Sdim
101235633Sdim    /// \brief Get the GCC triple for the detected install.
102235633Sdim    const llvm::Triple &getTriple() const { return GCCTriple; }
103235633Sdim
104235633Sdim    /// \brief Get the detected GCC installation path.
105235633Sdim    StringRef getInstallPath() const { return GCCInstallPath; }
106235633Sdim
107263509Sdim    /// \brief Get the detected GCC installation path suffix for the bi-arch
108263509Sdim    /// target variant.
109263509Sdim    StringRef getBiarchSuffix() const { return GCCBiarchSuffix; }
110235633Sdim
111235633Sdim    /// \brief Get the detected GCC parent lib path.
112235633Sdim    StringRef getParentLibPath() const { return GCCParentLibPath; }
113235633Sdim
114263509Sdim    /// \brief Get the detected GCC MIPS ABI directory suffix.
115263509Sdim    ///
116263509Sdim    /// This is used as a suffix both to the install directory of GCC and as
117263509Sdim    /// a suffix to its parent lib path in order to select a MIPS ABI-specific
118263509Sdim    /// subdirectory.
119263509Sdim    ///
120263509Sdim    /// This will always be empty for any non-MIPS target.
121263509Sdim    ///
122263509Sdim    // FIXME: This probably shouldn't exist at all, and should be factored
123263509Sdim    // into the multiarch and/or biarch support. Please don't add more uses of
124263509Sdim    // this interface, it is meant as a legacy crutch for the MIPS driver
125263509Sdim    // logic.
126263509Sdim    StringRef getMIPSABIDirSuffix() const { return GCCMIPSABIDirSuffix; }
127263509Sdim
128235633Sdim    /// \brief Get the detected GCC version string.
129245431Sdim    const GCCVersion &getVersion() const { return Version; }
130235633Sdim
131263509Sdim    /// \brief Print information about the detected GCC installation.
132263509Sdim    void print(raw_ostream &OS) const;
133263509Sdim
134235633Sdim  private:
135263509Sdim    static void
136263509Sdim    CollectLibDirsAndTriples(const llvm::Triple &TargetTriple,
137263509Sdim                             const llvm::Triple &BiarchTriple,
138263509Sdim                             SmallVectorImpl<StringRef> &LibDirs,
139263509Sdim                             SmallVectorImpl<StringRef> &TripleAliases,
140263509Sdim                             SmallVectorImpl<StringRef> &BiarchLibDirs,
141263509Sdim                             SmallVectorImpl<StringRef> &BiarchTripleAliases);
142235633Sdim
143235633Sdim    void ScanLibDirForGCCTriple(llvm::Triple::ArchType TargetArch,
144263509Sdim                                const llvm::opt::ArgList &Args,
145235633Sdim                                const std::string &LibDir,
146235633Sdim                                StringRef CandidateTriple,
147263509Sdim                                bool NeedsBiarchSuffix = false);
148263509Sdim
149263509Sdim    void findMIPSABIDirSuffix(std::string &Suffix,
150263509Sdim                              llvm::Triple::ArchType TargetArch, StringRef Path,
151263509Sdim                              const llvm::opt::ArgList &Args);
152235633Sdim  };
153235633Sdim
154235633Sdim  GCCInstallationDetector GCCInstallation;
155235633Sdim
156193326Sedpublic:
157263509Sdim  Generic_GCC(const Driver &D, const llvm::Triple &Triple,
158263509Sdim              const llvm::opt::ArgList &Args);
159193326Sed  ~Generic_GCC();
160193326Sed
161263509Sdim  virtual void printVerboseInfo(raw_ostream &OS) const;
162263509Sdim
163193326Sed  virtual bool IsUnwindTablesDefault() const;
164245431Sdim  virtual bool isPICDefault() const;
165252723Sdim  virtual bool isPIEDefault() const;
166245431Sdim  virtual bool isPICDefaultForced() const;
167266759Sdim  virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
168266759Sdim                                     llvm::opt::ArgStringList &CC1Args) const;
169235633Sdim
170235633Sdimprotected:
171252723Sdim  virtual Tool *getTool(Action::ActionClass AC) const;
172252723Sdim  virtual Tool *buildAssembler() const;
173252723Sdim  virtual Tool *buildLinker() const;
174252723Sdim
175235633Sdim  /// \name ToolChain Implementation Helper Functions
176235633Sdim  /// @{
177235633Sdim
178235633Sdim  /// \brief Check whether the target triple's architecture is 64-bits.
179235633Sdim  bool isTarget64Bit() const { return getTriple().isArch64Bit(); }
180235633Sdim
181235633Sdim  /// \brief Check whether the target triple's architecture is 32-bits.
182235633Sdim  bool isTarget32Bit() const { return getTriple().isArch32Bit(); }
183235633Sdim
184235633Sdim  /// @}
185193326Sed
186252723Sdimprivate:
187252723Sdim  mutable OwningPtr<tools::gcc::Preprocess> Preprocess;
188252723Sdim  mutable OwningPtr<tools::gcc::Precompile> Precompile;
189252723Sdim  mutable OwningPtr<tools::gcc::Compile> Compile;
190235633Sdim};
191235633Sdim
192235633Sdim  /// Darwin - The base Darwin tool chain.
193208600Srdivackyclass LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain {
194212904Sdimpublic:
195212904Sdim  /// The host version.
196212904Sdim  unsigned DarwinVersion[3];
197212904Sdim
198252723Sdimprotected:
199252723Sdim  virtual Tool *buildAssembler() const;
200252723Sdim  virtual Tool *buildLinker() const;
201252723Sdim  virtual Tool *getTool(Action::ActionClass AC) const;
202252723Sdim
203212904Sdimprivate:
204252723Sdim  mutable OwningPtr<tools::darwin::Lipo> Lipo;
205252723Sdim  mutable OwningPtr<tools::darwin::Dsymutil> Dsymutil;
206252723Sdim  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.
222235633Sdim  mutable VersionTuple TargetVersion;
223203955Srdivacky
224245431Sdimprivate:
225193326Sed  /// The default macosx-version-min of this tool chain; empty until
226193326Sed  /// initialized.
227203955Srdivacky  std::string MacosxVersionMin;
228193326Sed
229245431Sdim  /// The default ios-version-min of this tool chain; empty until
230245431Sdim  /// initialized.
231245431Sdim  std::string iOSVersionMin;
232224145Sdim
233212904Sdimprivate:
234263509Sdim  void AddDeploymentTarget(llvm::opt::DerivedArgList &Args) const;
235212904Sdim
236193326Sedpublic:
237263509Sdim  Darwin(const Driver &D, const llvm::Triple &Triple,
238263509Sdim         const llvm::opt::ArgList &Args);
239198092Srdivacky  ~Darwin();
240193326Sed
241263509Sdim  std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
242226890Sdim                                          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 &&
257235633Sdim        TargetVersion == VersionTuple(Major, Minor, Micro))
258203955Srdivacky      return;
259203955Srdivacky
260203955Srdivacky    assert(!TargetInitialized && "Target already initialized!");
261203955Srdivacky    TargetInitialized = true;
262221345Sdim    TargetIsIPhoneOS = IsIPhoneOS;
263221345Sdim    TargetIsIPhoneOSSimulator = IsIOSSim;
264235633Sdim    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
277235633Sdim  bool isTargetMacOS() const {
278245431Sdim    return !isTargetIOSSimulator() && !isTargetIPhoneOS();
279235633Sdim  }
280235633Sdim
281205408Srdivacky  bool isTargetInitialized() const { return TargetInitialized; }
282205408Srdivacky
283235633Sdim  VersionTuple getTargetVersion() const {
284203955Srdivacky    assert(TargetInitialized && "Target not initialized!");
285235633Sdim    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.
291263509Sdim  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!");
295235633Sdim    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!");
300235633Sdim    return TargetVersion < VersionTuple(V0, V1, V2);
301193326Sed  }
302193326Sed
303224145Sdim  /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library.
304263509Sdim  virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args,
305263509Sdim                              llvm::opt::ArgStringList &CmdArgs) const = 0;
306263509Sdim
307198092Srdivacky  /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler
308198092Srdivacky  /// runtime library.
309263509Sdim  virtual void
310263509Sdim  AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
311263509Sdim                        llvm::opt::ArgStringList &CmdArgs) const = 0;
312263509Sdim
313198092Srdivacky  /// }
314198092Srdivacky  /// @name ToolChain Implementation
315198092Srdivacky  /// {
316198092Srdivacky
317212904Sdim  virtual types::ID LookupTypeForExtension(const char *Ext) const;
318212904Sdim
319218893Sdim  virtual bool HasNativeLLVMSupport() const;
320218893Sdim
321245431Sdim  virtual ObjCRuntime getDefaultObjCRuntime(bool isNonFragile) const;
322226890Sdim  virtual bool hasBlocksRuntime() const;
323224145Sdim
324263509Sdim  virtual llvm::opt::DerivedArgList *
325263509Sdim  TranslateArgs(const llvm::opt::DerivedArgList &Args,
326263509Sdim                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 {
334235633Sdim    // Default integrated assembler to on for Darwin.
335235633Sdim    return true;
336208600Srdivacky  }
337245431Sdim
338245431Sdim  virtual bool IsMathErrnoDefault() const {
339245431Sdim    return false;
340245431Sdim  }
341245431Sdim
342245431Sdim  virtual bool IsEncodeExtendedBlockSignatureDefault() const {
343245431Sdim    return true;
344245431Sdim  }
345245431Sdim
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;
358226890Sdim  virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
359226890Sdim    // Stack protectors default to on for user code on 10.5,
360226890Sdim    // and for everything in 10.6 and beyond
361235633Sdim    return isTargetIPhoneOS() ||
362226890Sdim      (!isMacosxVersionLT(10, 6) ||
363226890Sdim         (!isMacosxVersionLT(10, 5) && !KernelOrKext));
364199482Srdivacky  }
365235633Sdim  virtual RuntimeLibType GetDefaultRuntimeLibType() const {
366235633Sdim    return ToolChain::RLT_CompilerRT;
367235633Sdim  }
368245431Sdim  virtual bool isPICDefault() const;
369252723Sdim  virtual bool isPIEDefault() const;
370245431Sdim  virtual bool isPICDefaultForced() const;
371198092Srdivacky
372221345Sdim  virtual bool SupportsProfiling() const;
373221345Sdim
374207619Srdivacky  virtual bool SupportsObjCGC() const;
375207619Srdivacky
376245431Sdim  virtual void CheckObjCARC() const;
377235633Sdim
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:
388263509Sdim  DarwinClang(const Driver &D, const llvm::Triple &Triple,
389263509Sdim              const llvm::opt::ArgList &Args);
390198092Srdivacky
391198092Srdivacky  /// @name Darwin ToolChain Implementation
392198092Srdivacky  /// {
393198092Srdivacky
394263509Sdim  virtual void AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
395263509Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
396263509Sdim  void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,
397263509Sdim                         llvm::opt::ArgStringList &CmdArgs,
398252723Sdim                         const char *DarwinStaticLib,
399252723Sdim                         bool AlwaysLink = false) const;
400252723Sdim
401263509Sdim  virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
402263509Sdim                                   llvm::opt::ArgStringList &CmdArgs) const;
403218893Sdim
404263509Sdim  virtual void AddCCKextLibArgs(const llvm::opt::ArgList &Args,
405263509Sdim                                llvm::opt::ArgStringList &CmdArgs) const;
406218893Sdim
407263509Sdim  virtual void AddLinkARCArgs(const llvm::opt::ArgList &Args,
408263509Sdim                              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:
415263509Sdim  Darwin_Generic_GCC(const Driver &D, const llvm::Triple &Triple,
416263509Sdim                     const llvm::opt::ArgList &Args)
417263509Sdim      : Generic_GCC(D, Triple, Args) {}
418193326Sed
419263509Sdim  std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
420226890Sdim                                          types::ID InputType) const;
421212904Sdim
422252723Sdim  virtual bool isPICDefault() const { return false; }
423193326Sed};
424193326Sed
425218893Sdimclass LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC {
426235633Sdim  virtual void anchor();
427235633Sdimpublic:
428263509Sdim  Generic_ELF(const Driver &D, const llvm::Triple &Triple,
429263509Sdim              const llvm::opt::ArgList &Args)
430263509Sdim      : Generic_GCC(D, Triple, Args) {}
431218893Sdim
432218893Sdim  virtual bool IsIntegratedAssemblerDefault() const {
433218893Sdim    // Default integrated assembler to on for x86.
434252723Sdim    return (getTriple().getArch() == llvm::Triple::aarch64 ||
435252723Sdim            getTriple().getArch() == llvm::Triple::x86 ||
436218893Sdim            getTriple().getArch() == llvm::Triple::x86_64);
437218893Sdim  }
438218893Sdim};
439218893Sdim
440208600Srdivackyclass LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC {
441198092Srdivackypublic:
442263509Sdim  AuroraUX(const Driver &D, const llvm::Triple &Triple,
443263509Sdim           const llvm::opt::ArgList &Args);
444198092Srdivacky
445252723Sdimprotected:
446252723Sdim  virtual Tool *buildAssembler() const;
447252723Sdim  virtual Tool *buildLinker() const;
448198092Srdivacky};
449198092Srdivacky
450235633Sdimclass LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC {
451235633Sdimpublic:
452263509Sdim  Solaris(const Driver &D, const llvm::Triple &Triple,
453263509Sdim          const llvm::opt::ArgList &Args);
454235633Sdim
455252723Sdim  virtual bool IsIntegratedAssemblerDefault() const { return true; }
456252723Sdimprotected:
457252723Sdim  virtual Tool *buildAssembler() const;
458252723Sdim  virtual Tool *buildLinker() const;
459235633Sdim
460235633Sdim};
461235633Sdim
462235633Sdim
463218893Sdimclass LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF {
464195341Sedpublic:
465263509Sdim  OpenBSD(const Driver &D, const llvm::Triple &Triple,
466263509Sdim          const llvm::opt::ArgList &Args);
467195341Sed
468245431Sdim  virtual bool IsMathErrnoDefault() const { return false; }
469235633Sdim  virtual bool IsObjCNonFragileABIDefault() const { return true; }
470263509Sdim  virtual bool isPIEDefault() const { return true; }
471235633Sdim
472263509Sdim  virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
473263509Sdim    return 1;
474263509Sdim  }
475263509Sdim
476252723Sdimprotected:
477252723Sdim  virtual Tool *buildAssembler() const;
478252723Sdim  virtual Tool *buildLinker() const;
479195341Sed};
480195341Sed
481245431Sdimclass LLVM_LIBRARY_VISIBILITY Bitrig : public Generic_ELF {
482245431Sdimpublic:
483263509Sdim  Bitrig(const Driver &D, const llvm::Triple &Triple,
484263509Sdim         const llvm::opt::ArgList &Args);
485245431Sdim
486245431Sdim  virtual bool IsMathErrnoDefault() const { return false; }
487245431Sdim  virtual bool IsObjCNonFragileABIDefault() const { return true; }
488245431Sdim  virtual bool IsObjCLegacyDispatchDefault() const { return false; }
489245431Sdim
490263509Sdim  virtual void
491263509Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
492263509Sdim                               llvm::opt::ArgStringList &CC1Args) const;
493263509Sdim  virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
494263509Sdim                                   llvm::opt::ArgStringList &CmdArgs) const;
495245431Sdim  virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
496245431Sdim     return 1;
497245431Sdim  }
498252723Sdim
499252723Sdimprotected:
500252723Sdim  virtual Tool *buildAssembler() const;
501252723Sdim  virtual Tool *buildLinker() const;
502245431Sdim};
503245431Sdim
504218893Sdimclass LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF {
505193326Sedpublic:
506263509Sdim  FreeBSD(const Driver &D, const llvm::Triple &Triple,
507263509Sdim          const llvm::opt::ArgList &Args);
508263509Sdim  virtual bool HasNativeLLVMSupport() const;
509193326Sed
510245431Sdim  virtual bool IsMathErrnoDefault() const { return false; }
511235633Sdim  virtual bool IsObjCNonFragileABIDefault() const { return true; }
512235633Sdim
513263509Sdim  virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const;
514263509Sdim  virtual void
515263509Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
516263509Sdim                               llvm::opt::ArgStringList &CC1Args) const;
517263509Sdim  virtual bool IsIntegratedAssemblerDefault() const {
518263509Sdim    if (getTriple().getArch() == llvm::Triple::ppc ||
519263509Sdim        getTriple().getArch() == llvm::Triple::ppc64)
520263509Sdim      return true;
521263509Sdim    return Generic_ELF::IsIntegratedAssemblerDefault();
522263509Sdim  }
523263509Sdim
524245431Sdim  virtual bool UseSjLjExceptions() const;
525252723Sdimprotected:
526252723Sdim  virtual Tool *buildAssembler() const;
527252723Sdim  virtual Tool *buildLinker() const;
528193326Sed};
529193326Sed
530218893Sdimclass LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF {
531218893Sdimpublic:
532263509Sdim  NetBSD(const Driver &D, const llvm::Triple &Triple,
533263509Sdim         const llvm::opt::ArgList &Args);
534218893Sdim
535245431Sdim  virtual bool IsMathErrnoDefault() const { return false; }
536235633Sdim  virtual bool IsObjCNonFragileABIDefault() const { return true; }
537235633Sdim
538263509Sdim  virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const;
539252723Sdim
540263509Sdim  virtual void
541263509Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
542263509Sdim                               llvm::opt::ArgStringList &CC1Args) const;
543263509Sdim  virtual bool IsUnwindTablesDefault() const {
544263509Sdim    return true;
545263509Sdim  }
546263509Sdim  virtual bool IsIntegratedAssemblerDefault() const {
547263509Sdim    if (getTriple().getArch() == llvm::Triple::ppc)
548263509Sdim      return true;
549263509Sdim    return Generic_ELF::IsIntegratedAssemblerDefault();
550263509Sdim  }
551252723Sdim
552252723Sdimprotected:
553252723Sdim  virtual Tool *buildAssembler() const;
554252723Sdim  virtual Tool *buildLinker() const;
555218893Sdim};
556218893Sdim
557235633Sdimclass LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF {
558210299Sedpublic:
559263509Sdim  Minix(const Driver &D, const llvm::Triple &Triple,
560263509Sdim        const llvm::opt::ArgList &Args);
561210299Sed
562252723Sdimprotected:
563252723Sdim  virtual Tool *buildAssembler() const;
564252723Sdim  virtual Tool *buildLinker() const;
565210299Sed};
566210299Sed
567218893Sdimclass LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF {
568193326Sedpublic:
569263509Sdim  DragonFly(const Driver &D, const llvm::Triple &Triple,
570263509Sdim            const llvm::opt::ArgList &Args);
571193326Sed
572245431Sdim  virtual bool IsMathErrnoDefault() const { return false; }
573245431Sdim
574252723Sdimprotected:
575252723Sdim  virtual Tool *buildAssembler() const;
576252723Sdim  virtual Tool *buildLinker() const;
577193326Sed};
578193326Sed
579218893Sdimclass LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
580193326Sedpublic:
581263509Sdim  Linux(const Driver &D, const llvm::Triple &Triple,
582263509Sdim        const llvm::opt::ArgList &Args);
583212904Sdim
584218893Sdim  virtual bool HasNativeLLVMSupport() const;
585218893Sdim
586263509Sdim  virtual void
587263509Sdim  AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
588263509Sdim                            llvm::opt::ArgStringList &CC1Args) const;
589263509Sdim  virtual void
590263509Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
591263509Sdim                               llvm::opt::ArgStringList &CC1Args) const;
592252723Sdim  virtual bool isPIEDefault() const;
593229042Sdim
594218893Sdim  std::string Linker;
595218893Sdim  std::vector<std::string> ExtraOpts;
596235633Sdim
597252723Sdimprotected:
598252723Sdim  virtual Tool *buildAssembler() const;
599252723Sdim  virtual Tool *buildLinker() const;
600252723Sdim
601235633Sdimprivate:
602252723Sdim  static bool addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
603252723Sdim                                       Twine TargetArchDir,
604263509Sdim                                       Twine BiarchSuffix,
605263509Sdim                                       Twine MIPSABIDirSuffix,
606263509Sdim                                       const llvm::opt::ArgList &DriverArgs,
607263509Sdim                                       llvm::opt::ArgStringList &CC1Args);
608235633Sdim  static bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
609263509Sdim                                       const llvm::opt::ArgList &DriverArgs,
610263509Sdim                                       llvm::opt::ArgStringList &CC1Args);
611252723Sdim
612263509Sdim  std::string computeSysRoot() const;
613193326Sed};
614193326Sed
615252723Sdimclass LLVM_LIBRARY_VISIBILITY Hexagon_TC : public Linux {
616252723Sdimprotected:
617252723Sdim  GCCVersion GCCLibAndIncVersion;
618252723Sdim  virtual Tool *buildAssembler() const;
619252723Sdim  virtual Tool *buildLinker() const;
620193326Sed
621252723Sdimpublic:
622252723Sdim  Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
623263509Sdim             const llvm::opt::ArgList &Args);
624252723Sdim  ~Hexagon_TC();
625252723Sdim
626263509Sdim  virtual void
627263509Sdim  AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
628263509Sdim                            llvm::opt::ArgStringList &CC1Args) const;
629263509Sdim  virtual void
630263509Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
631263509Sdim                               llvm::opt::ArgStringList &CC1Args) const;
632263509Sdim  virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const;
633252723Sdim
634252723Sdim  StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; }
635252723Sdim
636252723Sdim  static std::string GetGnuDir(const std::string &InstalledDir);
637252723Sdim
638263509Sdim  static StringRef GetTargetCPU(const llvm::opt::ArgList &Args);
639252723Sdim};
640252723Sdim
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:
645263509Sdim  TCEToolChain(const Driver &D, const llvm::Triple &Triple,
646263509Sdim               const llvm::opt::ArgList &Args);
647204793Srdivacky  ~TCEToolChain();
648204793Srdivacky
649204793Srdivacky  bool IsMathErrnoDefault() const;
650245431Sdim  bool isPICDefault() const;
651252723Sdim  bool isPIEDefault() const;
652245431Sdim  bool isPICDefaultForced() const;
653204793Srdivacky};
654204793Srdivacky
655212904Sdimclass LLVM_LIBRARY_VISIBILITY Windows : public ToolChain {
656212904Sdimpublic:
657263509Sdim  Windows(const Driver &D, const llvm::Triple &Triple,
658263509Sdim          const llvm::opt::ArgList &Args);
659212904Sdim
660212904Sdim  virtual bool IsIntegratedAssemblerDefault() const;
661212904Sdim  virtual bool IsUnwindTablesDefault() const;
662245431Sdim  virtual bool isPICDefault() const;
663252723Sdim  virtual bool isPIEDefault() const;
664245431Sdim  virtual bool isPICDefaultForced() const;
665229042Sdim
666263509Sdim  virtual void
667263509Sdim  AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
668263509Sdim                            llvm::opt::ArgStringList &CC1Args) const;
669263509Sdim  virtual void
670263509Sdim  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
671263509Sdim                               llvm::opt::ArgStringList &CC1Args) const;
672263509Sdim
673252723Sdimprotected:
674252723Sdim  virtual Tool *buildLinker() const;
675252723Sdim  virtual Tool *buildAssembler() const;
676212904Sdim};
677212904Sdim
678263509Sdim
679263509Sdimclass LLVM_LIBRARY_VISIBILITY XCore : public ToolChain {
680263509Sdimpublic:
681263509Sdim  XCore(const Driver &D, const llvm::Triple &Triple,
682263509Sdim          const llvm::opt::ArgList &Args);
683263509Sdimprotected:
684263509Sdim  virtual Tool *buildAssembler() const;
685263509Sdim  virtual Tool *buildLinker() const;
686263509Sdimpublic:
687263509Sdim  virtual bool isPICDefault() const;
688263509Sdim  virtual bool isPIEDefault() const;
689263509Sdim  virtual bool isPICDefaultForced() const;
690263509Sdim  virtual bool SupportsProfiling() const;
691263509Sdim  virtual bool hasBlocksRuntime() const;
692263509Sdim  virtual void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
693263509Sdim                            llvm::opt::ArgStringList &CC1Args) const;
694263509Sdim  virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
695263509Sdim                                     llvm::opt::ArgStringList &CC1Args) const;
696263509Sdim  virtual void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
697263509Sdim                               llvm::opt::ArgStringList &CC1Args) const;
698263509Sdim  virtual void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
699263509Sdim                                   llvm::opt::ArgStringList &CmdArgs) const;
700263509Sdim};
701263509Sdim
702193326Sed} // end namespace toolchains
703193326Sed} // end namespace driver
704193326Sed} // end namespace clang
705193326Sed
706193326Sed#endif
707