ToolChains.h revision 2603137cb91e1d143b36fb71a72189884fbde5b5
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
16670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "llvm/ADT/DenseMap.h"
1783b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#include "llvm/Support/Compiler.h"
1883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
19670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar#include "Tools.h"
20670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
2183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace clang {
2283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarnamespace driver {
23985b825eea7387be10478de0430815ed6a673326Daniel Dunbarnamespace toolchains {
2483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// all subcommands; this relies on gcc translating the majority of
271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// command line options.
28985b825eea7387be10478de0430815ed6a673326Daniel Dunbarclass VISIBILITY_HIDDEN Generic_GCC : public ToolChain {
2975358d267256022475371416654b056ad8531cb3Daniel Dunbarprotected:
30670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar  mutable llvm::DenseMap<unsigned, Tool*> Tools;
31670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
3283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbarpublic:
33cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple);
343917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  ~Generic_GCC();
3583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
360dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar  virtual DerivedArgList *TranslateArgs(InputArgList &Args,
370dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar                                        const char *BoundArch) const;
3883b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
393917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
40670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
413917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual bool IsUnwindTablesDefault() const;
423917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual const char *GetDefaultRelocationModel() const;
433917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual const char *GetForcedPicModel() const;
4483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar};
4583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
461d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Darwin - The base Darwin tool chain.
47f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarclass VISIBILITY_HIDDEN Darwin : public ToolChain {
488eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  mutable llvm::DenseMap<unsigned, Tool*> Tools;
498eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
50c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  /// Darwin version of tool chain.
51c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  unsigned DarwinVersion[3];
52c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
532603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  /// Whether the information on the target has been initialized.
542603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  //
552603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // FIXME: This should be eliminated. What we want to do is make this part of
562603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // the "default target for arguments" selection process, once we get out of
572603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // the argument translation business.
582603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  mutable bool TargetInitialized;
592603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
602603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  /// Whether we are targetting iPhoneOS target.
612603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  mutable bool TargetIsIPhoneOS;
622603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
632603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  /// The OS version we are targetting.
642603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  mutable unsigned TargetVersion[3];
652603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
661d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// Whether this is this an iPhoneOS toolchain.
671d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  //
681d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // FIXME: This should go away, such differences should be completely
691d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // determined by the target triple.
70816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar  //
71816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar  // FIXME: It is also broken, we need to distinguish the "default target" from
72816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar  // the actual target. The -m...-version-min strings and deployment targets can
73816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar  // change this.
741d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  bool IsIPhoneOS;
75c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
7602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  /// The default macosx-version-min of this tool chain; empty until
7702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  /// initialized.
78816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar  std::string MacosxVersionMin;
7902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
8030392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  /// The default iphoneos-version-min of this tool chain.
8130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  std::string IPhoneOSVersionMin;
8230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar
838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic:
841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Darwin(const HostInfo &Host, const llvm::Triple& Triple,
851d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar         const unsigned (&DarwinVersion)[3], bool IsIPhoneOS);
86f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar  ~Darwin();
878eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
886b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// @name Darwin Specific Toolchain API
896b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// {
906b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
912603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // FIXME: Eliminate these ...Target functions and derive separate tool chains
922603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // for these targets and put version in constructor.
932603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  void setTarget(bool isIPhoneOS, unsigned Major, unsigned Minor,
942603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                 unsigned Micro) const {
952603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    // FIXME: For now, allow reinitialization as long as values don't
962603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    // change. This will go away when we move away from argument translation.
972603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    if (TargetInitialized && TargetIsIPhoneOS == isIPhoneOS &&
982603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        TargetVersion[0] == Major && TargetVersion[1] == Minor &&
992603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        TargetVersion[2] == Micro)
1002603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      return;
1012603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
1022603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(!TargetInitialized && "Target already initialized!");
1032603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    TargetInitialized = true;
1042603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    TargetIsIPhoneOS = isIPhoneOS;
1052603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    TargetVersion[0] = Major;
1062603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    TargetVersion[1] = Minor;
1072603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    TargetVersion[2] = Micro;
1082603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
1092603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
1102603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool isTargetIPhoneOS() const {
1112603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(TargetInitialized && "Target not initialized!");
1122603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    return TargetIsIPhoneOS;
1132603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
1142603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
1152603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  void getTargetVersion(unsigned (&Res)[3]) const {
1162603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(TargetInitialized && "Target not initialized!");
1172603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    Res[0] = TargetVersion[0];
1182603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    Res[1] = TargetVersion[1];
1192603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    Res[2] = TargetVersion[2];
1202603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
1212603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
12202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  void getDarwinVersion(unsigned (&Res)[3]) const {
12302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[0] = DarwinVersion[0];
12402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[1] = DarwinVersion[1];
12502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[2] = DarwinVersion[2];
12602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
12702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
12802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  void getMacosxVersion(unsigned (&Res)[3]) const {
12902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[0] = 10;
13002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[1] = DarwinVersion[0] - 4;
13102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[2] = DarwinVersion[1];
13202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
13302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
134eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler
135eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  /// invocation. For example, Darwin treats different ARM variations as
136eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  /// distinct architectures.
137eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  llvm::StringRef getDarwinArchName(const ArgList &Args) const;
138eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
13948d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar  /// getMacosxVersionMin - Get the effective -mmacosx-version-min, which is
14048d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar  /// either the -mmacosx-version-min, or the current version if unspecified.
14148d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar  void getMacosxVersionMin(const ArgList &Args, unsigned (&Res)[3]) const;
14248d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar
143608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar  static bool isMacosxVersionLT(unsigned (&A)[3], unsigned (&B)[3]) {
144608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar    for (unsigned i=0; i < 3; ++i) {
145608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar      if (A[i] > B[i]) return false;
146608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar      if (A[i] < B[i]) return true;
147608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar    }
148608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar    return false;
149608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar  }
150608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar
151608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar  static bool isMacosxVersionLT(unsigned (&A)[3],
152608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar                                unsigned V0, unsigned V1=0, unsigned V2=0) {
153608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar    unsigned B[3] = { V0, V1, V2 };
154608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar    return isMacosxVersionLT(A, B);
155608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar  }
156608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar
1576b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// AddLinkSearchPathArgs - Add the linker search paths to \arg CmdArgs.
1586b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  ///
1596b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// \param Args - The input argument list.
1606b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// \param CmdArgs [out] - The command argument list to append the paths
1616b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// (prefixed by -L) to.
1621d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkSearchPathArgs(const ArgList &Args,
1631d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                     ArgStringList &CmdArgs) const = 0;
16402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
1656cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler
1666cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  /// runtime library.
1671d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
1681d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                     ArgStringList &CmdArgs) const = 0;
1696cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
1701d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  bool isIPhoneOS() const { return IsIPhoneOS; }
17130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar
1726b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// }
1736b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// @name ToolChain Implementation
1746b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// {
1756b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
1760dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar  virtual DerivedArgList *TranslateArgs(InputArgList &Args,
1770dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar                                        const char *BoundArch) const;
1788eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1798eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
1808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1819e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  virtual bool IsBlocksDefault() const {
1829e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    // Blocks default to on for 10.6 (darwin10) and beyond.
1839e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    return (DarwinVersion[0] > 9);
1849e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
1859e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  virtual bool IsObjCNonFragileABIDefault() const {
1869e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    // Non-fragile ABI default to on for 10.5 (darwin9) and beyond on x86-64.
1879e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    return (DarwinVersion[0] >= 9 &&
1889e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar            getTriple().getArch() == llvm::Triple::x86_64);
1899e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
1908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual bool IsUnwindTablesDefault() const;
1919e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  virtual unsigned GetDefaultStackProtectorLevel() const {
1929e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    // Stack protectors default to on for 10.6 (darwin10) and beyond.
1939e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar    return (DarwinVersion[0] > 9) ? 1 : 0;
1949e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
1958eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetDefaultRelocationModel() const;
1968eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetForcedPicModel() const;
1976b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
198f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  virtual bool UseDwarfDebugFlags() const;
199f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
2006b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// }
2018eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar};
2028eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2031d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// DarwinClang - The Darwin toolchain used by Clang.
2041d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarclass VISIBILITY_HIDDEN DarwinClang : public Darwin {
2051d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarpublic:
2061d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  DarwinClang(const HostInfo &Host, const llvm::Triple& Triple,
2071d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar              const unsigned (&DarwinVersion)[3], bool IsIPhoneOS);
2081d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2091d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// @name Darwin ToolChain Implementation
2101d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// {
2111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkSearchPathArgs(const ArgList &Args,
2131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                    ArgStringList &CmdArgs) const;
2141d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2151d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
2161d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                     ArgStringList &CmdArgs) const;
2171d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2181d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// }
2191d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar};
2201d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2211d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// DarwinGCC - The Darwin toolchain used by GCC.
2221d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarclass VISIBILITY_HIDDEN DarwinGCC : public Darwin {
2231d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// GCC version to use.
22455bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek  unsigned GCCVersion[3];
2251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// The directory suffix for this tool chain.
2271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  std::string ToolChainDir;
2281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarpublic:
2301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple,
23155bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek            const unsigned (&DarwinVersion)[3], const unsigned (&GCCVersion)[3],
2321d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar            bool IsIPhoneOS);
2331d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2341d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// @name Darwin ToolChain Implementation
2351d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// {
2361d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2371d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkSearchPathArgs(const ArgList &Args,
2381d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                    ArgStringList &CmdArgs) const;
2391d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
2411d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                     ArgStringList &CmdArgs) const;
2421d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2431d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// }
2441d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar};
2451d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2461d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Darwin_Generic_GCC - Generic Darwin tool chain using gcc.
2471d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarclass VISIBILITY_HIDDEN Darwin_Generic_GCC : public Generic_GCC {
2488eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic:
2491d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  Darwin_Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
250cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    : Generic_GCC(Host, Triple) {}
2518eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetDefaultRelocationModel() const { return "pic"; }
2538eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar};
2548eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
255e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanclass VISIBILITY_HIDDEN AuroraUX : public Generic_GCC {
256e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanpublic:
257e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  AuroraUX(const HostInfo &Host, const llvm::Triple& Triple);
258e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
259e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
260e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan};
261e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
262f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarclass VISIBILITY_HIDDEN OpenBSD : public Generic_GCC {
263f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarpublic:
264f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  OpenBSD(const HostInfo &Host, const llvm::Triple& Triple);
265f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
266f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
267f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar};
268f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
26975358d267256022475371416654b056ad8531cb3Daniel Dunbarclass VISIBILITY_HIDDEN FreeBSD : public Generic_GCC {
27075358d267256022475371416654b056ad8531cb3Daniel Dunbarpublic:
271cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32);
27275358d267256022475371416654b056ad8531cb3Daniel Dunbar
27375358d267256022475371416654b056ad8531cb3Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
27475358d267256022475371416654b056ad8531cb3Daniel Dunbar};
27575358d267256022475371416654b056ad8531cb3Daniel Dunbar
27611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarclass VISIBILITY_HIDDEN DragonFly : public Generic_GCC {
27711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarpublic:
278cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  DragonFly(const HostInfo &Host, const llvm::Triple& Triple);
27911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
28011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
28111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar};
28211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
2836b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedmanclass VISIBILITY_HIDDEN Linux : public Generic_GCC {
2846b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedmanpublic:
2856b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  Linux(const HostInfo &Host, const llvm::Triple& Triple);
2866b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman};
2876b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
2886b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
28983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace toolchains
29083b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace driver
29183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace clang
29283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
29383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#endif
294