183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//===--- ToolChains.h - ToolChain Implementations ---------------*- C++ -*-===//
283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//
383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//                     The LLVM Compiler Infrastructure
483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//
583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// This file is distributed under the University of Illinois Open Source
683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar// License. See LICENSE.TXT for details.
783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//
883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar//===----------------------------------------------------------------------===//
983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
1083b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#ifndef CLANG_LIB_DRIVER_TOOLCHAINS_H_
1183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#define CLANG_LIB_DRIVER_TOOLCHAINS_H_
1283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
13670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "clang/Driver/Action.h"
1483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "clang/Driver/ToolChain.h"
1583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
1609c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer#include "clang/Basic/VersionTuple.h"
17670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "llvm/ADT/DenseMap.h"
1883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "llvm/Support/Compiler.h"
1983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
20670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "Tools.h"
21670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
2283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace clang {
2383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace driver {
24985b825eea7387be10478de0430815ed6a673326Daniel Dunbarnamespace toolchains {
2583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// all subcommands; this relies on gcc translating the majority of
281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// command line options.
2992dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain {
3075358d267256022475371416654b056ad8531cb3Daniel Dunbarprotected:
3119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// \brief Struct to store and manipulate GCC versions.
3219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  ///
3319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// We rely on assumptions about the form and structure of GCC version
3419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// numbers: they consist of at most three '.'-separated components, and each
3519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// component is a non-negative integer except for the last component. For
3619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// the last component we are very flexible in order to tolerate release
3719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// candidates or 'x' wildcards.
3819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  ///
3919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// Note that the ordering established among GCCVersions is based on the
4019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// preferred version string to use. For example we prefer versions without
4119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// a hard-coded patch number to those with a hard coded patch number.
4219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  ///
4319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// Currently this doesn't provide any logic for textual suffixes to patches
4419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// in the way that (for example) Debian's version format does. If that ever
4519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// becomes necessary, it can be added.
4619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  struct GCCVersion {
4719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    /// \brief The unparsed text of the version.
4819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    std::string Text;
4919347edf7809866350750a1997ec4db009832fa4Chandler Carruth
5019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    /// \brief The parsed major, minor, and patch numbers.
5119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    int Major, Minor, Patch;
5219347edf7809866350750a1997ec4db009832fa4Chandler Carruth
5319347edf7809866350750a1997ec4db009832fa4Chandler Carruth    /// \brief Any textual suffix on the patch number.
5419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    std::string PatchSuffix;
5519347edf7809866350750a1997ec4db009832fa4Chandler Carruth
5619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    static GCCVersion Parse(StringRef VersionText);
5719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    bool operator<(const GCCVersion &RHS) const;
5819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    bool operator>(const GCCVersion &RHS) const { return RHS < *this; }
5919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    bool operator<=(const GCCVersion &RHS) const { return !(*this > RHS); }
6019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    bool operator>=(const GCCVersion &RHS) const { return !(*this < RHS); }
6119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
6219347edf7809866350750a1997ec4db009832fa4Chandler Carruth
6319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
6419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// \brief This is a class to find a viable GCC installation for Clang to
6519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// use.
6619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  ///
6719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// This class tries to find a GCC installation on the system, and report
6819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// information about it. It starts from the host information provided to the
6919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  /// Driver, and has logic for fuzzing that where appropriate.
7019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  class GCCInstallationDetector {
7119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
7219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    bool IsValid;
73fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    llvm::Triple GCCTriple;
7419347edf7809866350750a1997ec4db009832fa4Chandler Carruth
7519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // FIXME: These might be better as path objects.
765d84bb418405e1256020a66895d163756886b102Chandler Carruth    std::string GCCInstallPath;
771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    std::string GCCMultiarchSuffix;
785d84bb418405e1256020a66895d163756886b102Chandler Carruth    std::string GCCParentLibPath;
7919347edf7809866350750a1997ec4db009832fa4Chandler Carruth
8019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    GCCVersion Version;
8119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
8219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  public:
830e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    GCCInstallationDetector(const Driver &D, const llvm::Triple &TargetTriple,
840e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                            const ArgList &Args);
8519347edf7809866350750a1997ec4db009832fa4Chandler Carruth
8619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    /// \brief Check whether we detected a valid GCC install.
8719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    bool isValid() const { return IsValid; }
8819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
8919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    /// \brief Get the GCC triple for the detected install.
90fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    const llvm::Triple &getTriple() const { return GCCTriple; }
9119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
9219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    /// \brief Get the detected GCC installation path.
935d84bb418405e1256020a66895d163756886b102Chandler Carruth    StringRef getInstallPath() const { return GCCInstallPath; }
9419347edf7809866350750a1997ec4db009832fa4Chandler Carruth
951c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    /// \brief Get the detected GCC installation path suffix for multiarch GCCs.
961c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    StringRef getMultiarchSuffix() const { return GCCMultiarchSuffix; }
971c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
9819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    /// \brief Get the detected GCC parent lib path.
995d84bb418405e1256020a66895d163756886b102Chandler Carruth    StringRef getParentLibPath() const { return GCCParentLibPath; }
10019347edf7809866350750a1997ec4db009832fa4Chandler Carruth
10119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    /// \brief Get the detected GCC version string.
10219347edf7809866350750a1997ec4db009832fa4Chandler Carruth    StringRef getVersion() const { return Version.Text; }
10319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
10419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  private:
1051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    static void CollectLibDirsAndTriples(
1061c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      const llvm::Triple &TargetTriple,
1071c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      const llvm::Triple &MultiarchTriple,
1081c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      SmallVectorImpl<StringRef> &LibDirs,
1091c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      SmallVectorImpl<StringRef> &TripleAliases,
1101c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      SmallVectorImpl<StringRef> &MultiarchLibDirs,
1111c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      SmallVectorImpl<StringRef> &MultiarchTripleAliases);
1121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
1131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    void ScanLibDirForGCCTriple(llvm::Triple::ArchType TargetArch,
114d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth                                const std::string &LibDir,
1151c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                                StringRef CandidateTriple,
1161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth                                bool NeedsMultiarchSuffix = false);
11719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
11819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
11919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  GCCInstallationDetector GCCInstallation;
12019347edf7809866350750a1997ec4db009832fa4Chandler Carruth
121670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar  mutable llvm::DenseMap<unsigned, Tool*> Tools;
122670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
12383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarpublic:
1240e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  Generic_GCC(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
1253917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  ~Generic_GCC();
12683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
127ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
128ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
129670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
1303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual bool IsUnwindTablesDefault() const;
1313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual const char *GetDefaultRelocationModel() const;
1323917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual const char *GetForcedPicModel() const;
133b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth
134b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruthprotected:
135b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth  /// \name ToolChain Implementation Helper Functions
136b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth  /// @{
137b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth
138b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth  /// \brief Check whether the target triple's architecture is 64-bits.
139d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth  bool isTarget64Bit() const { return getTriple().isArch64Bit(); }
140d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth
141b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth  /// \brief Check whether the target triple's architecture is 32-bits.
142d747efaad80117799ff7e2ab10608f18ee1348c1Chandler Carruth  bool isTarget32Bit() const { return getTriple().isArch32Bit(); }
143b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth
144b37fe61e661453800f826897706b1d75f98dd7c1Chandler Carruth  /// @}
14583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar};
14683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
1479631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumclass LLVM_LIBRARY_VISIBILITY Hexagon_TC : public ToolChain {
1489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumprotected:
1499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  mutable llvm::DenseMap<unsigned, Tool*> Tools;
1509631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1519631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicumpublic:
1521d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth  Hexagon_TC(const Driver &D, const llvm::Triple& Triple);
1539631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  ~Hexagon_TC();
1549631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1559631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
1569631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum                           const ActionList &Inputs) const;
1579631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1589631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  virtual bool IsUnwindTablesDefault() const;
1599631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  virtual const char *GetDefaultRelocationModel() const;
1609631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  virtual const char *GetForcedPicModel() const;
1619631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum};
1629631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
1639631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum  /// Darwin - The base Darwin tool chain.
16492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain {
16525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbarpublic:
16625b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  /// The host version.
16725b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  unsigned DarwinVersion[3];
16825b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar
16925b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbarprivate:
1708eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  mutable llvm::DenseMap<unsigned, Tool*> Tools;
1718eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1722603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  /// Whether the information on the target has been initialized.
1732603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  //
1742603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // FIXME: This should be eliminated. What we want to do is make this part of
1752603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // the "default target for arguments" selection process, once we get out of
1762603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // the argument translation business.
1772603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  mutable bool TargetInitialized;
1782603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
179f85e193739c953358c865005855253af4f68a497John McCall  // FIXME: Remove this once there is a proper way to detect an ARC runtime
180f85e193739c953358c865005855253af4f68a497John McCall  // for the simulator.
181f85e193739c953358c865005855253af4f68a497John McCall public:
182f85e193739c953358c865005855253af4f68a497John McCall  mutable enum {
183f85e193739c953358c865005855253af4f68a497John McCall    ARCSimulator_None,
184f85e193739c953358c865005855253af4f68a497John McCall    ARCSimulator_HasARCRuntime,
185f85e193739c953358c865005855253af4f68a497John McCall    ARCSimulator_NoARCRuntime
186f85e193739c953358c865005855253af4f68a497John McCall  } ARCRuntimeForSimulator;
187f85e193739c953358c865005855253af4f68a497John McCall
188163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  mutable enum {
189163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    LibCXXSimulator_None,
190163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    LibCXXSimulator_NotAvailable,
191163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    LibCXXSimulator_Available
192163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  } LibCXXForSimulator;
193163b151809beef8f917fd16c546016e83ae3e361Bob Wilson
194f85e193739c953358c865005855253af4f68a497John McCallprivate:
195fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// Whether we are targeting iPhoneOS target.
1962603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  mutable bool TargetIsIPhoneOS;
197eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar
1985f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  /// Whether we are targeting the iPhoneOS simulator target.
1995f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  mutable bool TargetIsIPhoneOSSimulator;
2005f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
201fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// The OS version we are targeting.
20209c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  mutable VersionTuple TargetVersion;
2032603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
20402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  /// The default macosx-version-min of this tool chain; empty until
20502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  /// initialized.
206816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar  std::string MacosxVersionMin;
20702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
2089f084a3166b684573ba49df28fc5792bc37d92e1John McCall  bool hasARCRuntime() const;
209ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  bool hasSubscriptingRuntime() const;
2109f084a3166b684573ba49df28fc5792bc37d92e1John McCall
211c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbarprivate:
21260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  void AddDeploymentTarget(DerivedArgList &Args) const;
213c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
2148eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic:
2151d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth  Darwin(const Driver &D, const llvm::Triple& Triple);
216f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar  ~Darwin();
2178eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
21861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  std::string ComputeEffectiveClangTriple(const ArgList &Args,
21961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                          types::ID InputType) const;
22000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
2216b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// @name Darwin Specific Toolchain API
2226b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// {
2236b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
2242603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // FIXME: Eliminate these ...Target functions and derive separate tool chains
2252603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // for these targets and put version in constructor.
2265f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  void setTarget(bool IsIPhoneOS, unsigned Major, unsigned Minor,
2275f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar                 unsigned Micro, bool IsIOSSim) const {
2285f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    assert((!IsIOSSim || IsIPhoneOS) && "Unexpected deployment target!");
2295f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
2302603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    // FIXME: For now, allow reinitialization as long as values don't
2312603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    // change. This will go away when we move away from argument translation.
2325f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    if (TargetInitialized && TargetIsIPhoneOS == IsIPhoneOS &&
2335f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar        TargetIsIPhoneOSSimulator == IsIOSSim &&
23409c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer        TargetVersion == VersionTuple(Major, Minor, Micro))
2352603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      return;
2362603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
2372603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(!TargetInitialized && "Target already initialized!");
2382603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    TargetInitialized = true;
2395f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    TargetIsIPhoneOS = IsIPhoneOS;
2405f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    TargetIsIPhoneOSSimulator = IsIOSSim;
24109c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer    TargetVersion = VersionTuple(Major, Minor, Micro);
2422603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
2432603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
2442603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool isTargetIPhoneOS() const {
2452603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(TargetInitialized && "Target not initialized!");
2462603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    return TargetIsIPhoneOS;
2472603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
2482603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
2494035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar  bool isTargetIOSSimulator() const {
2505f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    assert(TargetInitialized && "Target not initialized!");
2515f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    return TargetIsIPhoneOSSimulator;
2524035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar  }
2534035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar
254ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  bool isTargetMacOS() const {
255ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek    return !isTargetIOSSimulator() &&
256ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek           !isTargetIPhoneOS() &&
257ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek           ARCRuntimeForSimulator == ARCSimulator_None;
258ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek  }
259ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek
26003d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar  bool isTargetInitialized() const { return TargetInitialized; }
26103d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar
26209c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer  VersionTuple getTargetVersion() const {
2632603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(TargetInitialized && "Target not initialized!");
26409c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer    return TargetVersion;
2652603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
2662603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
267eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler
268eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  /// invocation. For example, Darwin treats different ARM variations as
269eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  /// distinct architectures.
270686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  StringRef getDarwinArchName(const ArgList &Args) const;
271eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
272ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar  bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const {
273ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    assert(isTargetIPhoneOS() && "Unexpected call for OS X target!");
27409c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer    return TargetVersion < VersionTuple(V0, V1, V2);
275608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar  }
276608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar
277ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar  bool isMacosxVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const {
278ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    assert(!isTargetIPhoneOS() && "Unexpected call for iPhoneOS target!");
27909c9a5635f10a7dfa3373ef0941597c16b048362Benjamin Kramer    return TargetVersion < VersionTuple(V0, V1, V2);
280cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar  }
281cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar
2826b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// AddLinkSearchPathArgs - Add the linker search paths to \arg CmdArgs.
2836b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  ///
2846b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// \param Args - The input argument list.
2856b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// \param CmdArgs [out] - The command argument list to append the paths
2866b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// (prefixed by -L) to.
2871d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkSearchPathArgs(const ArgList &Args,
2881d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                     ArgStringList &CmdArgs) const = 0;
28902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
290f85e193739c953358c865005855253af4f68a497John McCall  /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library.
291f85e193739c953358c865005855253af4f68a497John McCall  virtual void AddLinkARCArgs(const ArgList &Args,
292f85e193739c953358c865005855253af4f68a497John McCall                              ArgStringList &CmdArgs) const = 0;
293f85e193739c953358c865005855253af4f68a497John McCall
2946cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler
2956cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  /// runtime library.
2961d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
2971d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                     ArgStringList &CmdArgs) const = 0;
2983404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher
2996b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// }
3006b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// @name ToolChain Implementation
3016b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// {
3026b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
3034180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  virtual types::ID LookupTypeForExtension(const char *Ext) const;
3044180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
305b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar  virtual bool HasNativeLLVMSupport() const;
306b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar
3079f084a3166b684573ba49df28fc5792bc37d92e1John McCall  virtual void configureObjCRuntime(ObjCRuntime &runtime) const;
30813db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall  virtual bool hasBlocksRuntime() const;
309f85e193739c953358c865005855253af4f68a497John McCall
310279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  virtual DerivedArgList *TranslateArgs(const DerivedArgList &Args,
3110dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar                                        const char *BoundArch) const;
3128eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
313ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
314ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
3158eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
3169e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  virtual bool IsBlocksDefault() const {
317ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar    // Always allow blocks on Darwin; users interested in versioning are
318ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar    // expected to use /usr/include/Blocks.h.
319ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar    return true;
3209e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
321eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  virtual bool IsIntegratedAssemblerDefault() const {
32271a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#ifdef DISABLE_DEFAULT_INTEGRATED_ASSEMBLER
32371a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar    return false;
32471a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#else
325033d3007b16d7f6c0f0eafd06c7096cfd22d89f5Jim Grosbach    // Default integrated assembler to on for Darwin.
326033d3007b16d7f6c0f0eafd06c7096cfd22d89f5Jim Grosbach    return true;
32771a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#endif
328eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  }
329398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar  virtual bool IsStrictAliasingDefault() const {
330398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#ifdef DISABLE_DEFAULT_STRICT_ALIASING
331398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar    return false;
332398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#else
333398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar    return ToolChain::IsStrictAliasingDefault();
334398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#endif
335398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar  }
336c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek
337c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek  virtual bool IsObjCDefaultSynthPropertiesDefault() const {
3382a253960f0312c9759965a1defb9326d6b2764a4Ted Kremenek    return true;
339c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek  }
340c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek
3419e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  virtual bool IsObjCNonFragileABIDefault() const {
342f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    // Non-fragile ABI is default for everything but i386.
343f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    return getTriple().getArch() != llvm::Triple::x86;
3449e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
345609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar  virtual bool IsObjCLegacyDispatchDefault() const {
346609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar    // This is only used with the non-fragile ABI.
347f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar
348f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    // Legacy dispatch is used everywhere except on x86_64.
349f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    return getTriple().getArch() != llvm::Triple::x86_64;
350609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar  }
351f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar  virtual bool UseObjCMixedDispatch() const {
352f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    // This is only used with the non-fragile ABI and non-legacy dispatch.
353f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar
354f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    // Mixed dispatch is used everywhere except OS X before 10.6.
355f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    return !(!isTargetIPhoneOS() && isMacosxVersionLT(10, 6));
356f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar  }
3578eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual bool IsUnwindTablesDefault() const;
3582fef11164cbe804f7b808c07757c6f900c08d765Nico Weber  virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
3592fef11164cbe804f7b808c07757c6f900c08d765Nico Weber    // Stack protectors default to on for user code on 10.5,
3602fef11164cbe804f7b808c07757c6f900c08d765Nico Weber    // and for everything in 10.6 and beyond
361dfba0278ce3b9cd86f5a050163ccb998aeb74aa6Bob Wilson    return isTargetIPhoneOS() ||
3622fef11164cbe804f7b808c07757c6f900c08d765Nico Weber      (!isMacosxVersionLT(10, 6) ||
3632fef11164cbe804f7b808c07757c6f900c08d765Nico Weber         (!isMacosxVersionLT(10, 5) && !KernelOrKext));
3649e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
365c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  virtual RuntimeLibType GetDefaultRuntimeLibType() const {
366c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    return ToolChain::RLT_CompilerRT;
367c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  }
3688eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetDefaultRelocationModel() const;
3698eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetForcedPicModel() const;
3706b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
371bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  virtual bool SupportsProfiling() const;
372bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar
37343a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  virtual bool SupportsObjCGC() const;
37443a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
3755840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis  virtual bool SupportsObjCARC() const;
3765840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis
377f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  virtual bool UseDwarfDebugFlags() const;
378f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
379b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  virtual bool UseSjLjExceptions() const;
380b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
3816b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// }
3828eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar};
3838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
3841d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// DarwinClang - The Darwin toolchain used by Clang.
38592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin {
3868aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilsonprivate:
3878aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson  void AddGCCLibexecPath(unsigned darwinVersion);
3888aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson
3891d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarpublic:
3901d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth  DarwinClang(const Driver &D, const llvm::Triple& Triple);
3911d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3921d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// @name Darwin ToolChain Implementation
3931d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// {
3941d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3951d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkSearchPathArgs(const ArgList &Args,
3961d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                    ArgStringList &CmdArgs) const;
3971d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3981d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
3991d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                     ArgStringList &CmdArgs) const;
4003404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  void AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
4013404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher                         const char *DarwinStaticLib) const;
4023404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher
403132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar  virtual void AddCXXStdlibLibArgs(const ArgList &Args,
404132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar                                   ArgStringList &CmdArgs) const;
405efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
4067433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  virtual void AddCCKextLibArgs(const ArgList &Args,
4077433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                ArgStringList &CmdArgs) const;
4087433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
409f85e193739c953358c865005855253af4f68a497John McCall  virtual void AddLinkARCArgs(const ArgList &Args,
410f85e193739c953358c865005855253af4f68a497John McCall                              ArgStringList &CmdArgs) const;
4111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// }
4121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar};
4131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
4141d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Darwin_Generic_GCC - Generic Darwin tool chain using gcc.
41592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Darwin_Generic_GCC : public Generic_GCC {
4168eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic:
4170e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  Darwin_Generic_GCC(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
4180e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    : Generic_GCC(D, Triple, Args) {}
4198eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
42061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  std::string ComputeEffectiveClangTriple(const ArgList &Args,
42161ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                          types::ID InputType) const;
42200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
4238eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetDefaultRelocationModel() const { return "pic"; }
4248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar};
4258eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
426e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC {
42799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie  virtual void anchor();
42899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikiepublic:
4290e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  Generic_ELF(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
4300e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    : Generic_GCC(D, Triple, Args) {}
431e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola
432e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  virtual bool IsIntegratedAssemblerDefault() const {
433e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola    // Default integrated assembler to on for x86.
434e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola    return (getTriple().getArch() == llvm::Triple::x86 ||
435e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola            getTriple().getArch() == llvm::Triple::x86_64);
436e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  }
437e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola};
438e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola
43992dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC {
440e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanpublic:
4410e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  AuroraUX(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
442e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
443ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
444ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
445e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan};
446e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
44731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallclass LLVM_LIBRARY_VISIBILITY Solaris : public Generic_GCC {
44831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnallpublic:
4490e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  Solaris(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
45031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
45131c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
45231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall                           const ActionList &Inputs) const;
45331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
45431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  virtual bool IsIntegratedAssemblerDefault() const { return true; }
45531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall};
45631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
45731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
458e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF {
459f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarpublic:
4600e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
461f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
462c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall  virtual bool IsObjCNonFragileABIDefault() const { return true; }
463c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall  virtual bool IsObjCLegacyDispatchDefault() const {
464c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall    llvm::Triple::ArchType Arch = getTriple().getArch();
465c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall    if (Arch == llvm::Triple::arm ||
466c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall        Arch == llvm::Triple::x86 ||
467c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall        Arch == llvm::Triple::x86_64)
468c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall     return false;
469c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall    return true;
470c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall  }
471c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall
472ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
473ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
474f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar};
475f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
476e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF {
47775358d267256022475371416654b056ad8531cb3Daniel Dunbarpublic:
4780e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
47975358d267256022475371416654b056ad8531cb3Daniel Dunbar
480c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall  virtual bool IsObjCNonFragileABIDefault() const { return true; }
481c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall  virtual bool IsObjCLegacyDispatchDefault() const {
482c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall    llvm::Triple::ArchType Arch = getTriple().getArch();
483c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall    if (Arch == llvm::Triple::arm ||
484c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall        Arch == llvm::Triple::x86 ||
485c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall        Arch == llvm::Triple::x86_64)
486c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall     return false;
487c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall    return true;
488c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall  }
489c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall
490ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
491ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
49275358d267256022475371416654b056ad8531cb3Daniel Dunbar};
49375358d267256022475371416654b056ad8531cb3Daniel Dunbar
4948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramerclass LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF {
4958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramerpublic:
4960e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
4978e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
498c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall  virtual bool IsObjCNonFragileABIDefault() const { return true; }
499c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall  virtual bool IsObjCLegacyDispatchDefault() const {
500c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall    llvm::Triple::ArchType Arch = getTriple().getArch();
501c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall    if (Arch == llvm::Triple::arm ||
502c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall        Arch == llvm::Triple::x86 ||
503c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall        Arch == llvm::Triple::x86_64)
504c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall     return false;
505c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall    return true;
506c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall  }
507c3cb07205a18d51b0cfff5d431579d5930277ee0David Chisnall
508ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
509ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
5108e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer};
5118e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
5126d402dc963aa32194f3604af4463b113858291aeEli Friedmanclass LLVM_LIBRARY_VISIBILITY Minix : public Generic_ELF {
51338e317d6dce161b249508686cc67eb7176958762Chris Lattnerpublic:
5140e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
51538e317d6dce161b249508686cc67eb7176958762Chris Lattner
516ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
517ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
51838e317d6dce161b249508686cc67eb7176958762Chris Lattner};
51938e317d6dce161b249508686cc67eb7176958762Chris Lattner
520e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF {
52111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarpublic:
5220e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
52311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
524ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
525ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
52611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar};
52711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
528e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
5296b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedmanpublic:
5300e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  Linux(const Driver &D, const llvm::Triple& Triple, const ArgList &Args);
531ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
532c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  virtual bool HasNativeLLVMSupport() const;
533c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
534ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
535ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
536c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
5377d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs,
5387d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                         ArgStringList &CC1Args) const;
5397d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
5407d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                            ArgStringList &CC1Args) const;
5417d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
542c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::string Linker;
543c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::vector<std::string> ExtraOpts;
54479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth
54579cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruthprivate:
54679cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth  static bool addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
54779cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                       const ArgList &DriverArgs,
54879cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                       ArgStringList &CC1Args);
5496b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman};
5506b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
5516b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
5523a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
5533a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
55492dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain {
5553a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerpublic:
5561d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth  TCEToolChain(const Driver &D, const llvm::Triple& Triple);
5573a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  ~TCEToolChain();
5583a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
559ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
560ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
5613a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  bool IsMathErrnoDefault() const;
5623a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  bool IsUnwindTablesDefault() const;
5633a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  const char* GetDefaultRelocationModel() const;
5643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  const char* GetForcedPicModel() const;
5653a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
5663a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerprivate:
5673a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  mutable llvm::DenseMap<unsigned, Tool*> Tools;
5683a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
5693a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner};
5703a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
571ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerclass LLVM_LIBRARY_VISIBILITY Windows : public ToolChain {
572ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  mutable llvm::DenseMap<unsigned, Tool*> Tools;
573ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
574ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerpublic:
5751d16f0f805c2a3e2198a87154990347b2759f6bdChandler Carruth  Windows(const Driver &D, const llvm::Triple& Triple);
576ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
577ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
578ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
579ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
580ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  virtual bool IsIntegratedAssemblerDefault() const;
581ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  virtual bool IsUnwindTablesDefault() const;
582ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  virtual const char *GetDefaultRelocationModel() const;
583ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  virtual const char *GetForcedPicModel() const;
584ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
585ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  virtual void AddClangSystemIncludeArgs(const ArgList &DriverArgs,
586ca23419b8214654d185d595956e9ddf24984750aChandler Carruth                                         ArgStringList &CC1Args) const;
587ca23419b8214654d185d595956e9ddf24984750aChandler Carruth  virtual void AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
588ca23419b8214654d185d595956e9ddf24984750aChandler Carruth                                            ArgStringList &CC1Args) const;
589ca23419b8214654d185d595956e9ddf24984750aChandler Carruth
590ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer};
591ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
59283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace toolchains
59383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace driver
59483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace clang
59583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
59683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#endif
597