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.
2892dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY 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
36ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
37ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
38670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar
393917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual bool IsUnwindTablesDefault() const;
403917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual const char *GetDefaultRelocationModel() const;
413917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual const char *GetForcedPicModel() const;
4283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar};
4383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
441d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Darwin - The base Darwin tool chain.
4592dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Darwin : public ToolChain {
4625b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbarpublic:
4725b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  /// The host version.
4825b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  unsigned DarwinVersion[3];
4925b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar
5025b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbarprivate:
518eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  mutable llvm::DenseMap<unsigned, Tool*> Tools;
528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel 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
60f85e193739c953358c865005855253af4f68a497John McCall  // FIXME: Remove this once there is a proper way to detect an ARC runtime
61f85e193739c953358c865005855253af4f68a497John McCall  // for the simulator.
62f85e193739c953358c865005855253af4f68a497John McCall public:
63f85e193739c953358c865005855253af4f68a497John McCall  mutable enum {
64f85e193739c953358c865005855253af4f68a497John McCall    ARCSimulator_None,
65f85e193739c953358c865005855253af4f68a497John McCall    ARCSimulator_HasARCRuntime,
66f85e193739c953358c865005855253af4f68a497John McCall    ARCSimulator_NoARCRuntime
67f85e193739c953358c865005855253af4f68a497John McCall  } ARCRuntimeForSimulator;
68f85e193739c953358c865005855253af4f68a497John McCall
69163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  mutable enum {
70163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    LibCXXSimulator_None,
71163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    LibCXXSimulator_NotAvailable,
72163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    LibCXXSimulator_Available
73163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  } LibCXXForSimulator;
74163b151809beef8f917fd16c546016e83ae3e361Bob Wilson
75f85e193739c953358c865005855253af4f68a497John McCallprivate:
76fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// Whether we are targeting iPhoneOS target.
772603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  mutable bool TargetIsIPhoneOS;
78eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar
795f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  /// Whether we are targeting the iPhoneOS simulator target.
805f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  mutable bool TargetIsIPhoneOSSimulator;
815f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
82fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner  /// The OS version we are targeting.
832603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  mutable unsigned TargetVersion[3];
842603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
8502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  /// The default macosx-version-min of this tool chain; empty until
8602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  /// initialized.
87816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar  std::string MacosxVersionMin;
8802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
899f084a3166b684573ba49df28fc5792bc37d92e1John McCall  bool hasARCRuntime() const;
909f084a3166b684573ba49df28fc5792bc37d92e1John McCall
91c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbarprivate:
9260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  void AddDeploymentTarget(DerivedArgList &Args) const;
93c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
948eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic:
9525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  Darwin(const HostInfo &Host, const llvm::Triple& Triple);
96f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar  ~Darwin();
978eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
9861ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  std::string ComputeEffectiveClangTriple(const ArgList &Args,
9961ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                          types::ID InputType) const;
10000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
1016b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// @name Darwin Specific Toolchain API
1026b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// {
1036b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
1042603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // FIXME: Eliminate these ...Target functions and derive separate tool chains
1052603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // for these targets and put version in constructor.
1065f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  void setTarget(bool IsIPhoneOS, unsigned Major, unsigned Minor,
1075f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar                 unsigned Micro, bool IsIOSSim) const {
1085f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    assert((!IsIOSSim || IsIPhoneOS) && "Unexpected deployment target!");
1095f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
1102603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    // FIXME: For now, allow reinitialization as long as values don't
1112603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    // change. This will go away when we move away from argument translation.
1125f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    if (TargetInitialized && TargetIsIPhoneOS == IsIPhoneOS &&
1135f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar        TargetIsIPhoneOSSimulator == IsIOSSim &&
1142603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        TargetVersion[0] == Major && TargetVersion[1] == Minor &&
1152603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        TargetVersion[2] == Micro)
1162603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      return;
1172603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
1182603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(!TargetInitialized && "Target already initialized!");
1192603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    TargetInitialized = true;
1205f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    TargetIsIPhoneOS = IsIPhoneOS;
1215f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    TargetIsIPhoneOSSimulator = IsIOSSim;
1222603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    TargetVersion[0] = Major;
1232603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    TargetVersion[1] = Minor;
1242603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    TargetVersion[2] = Micro;
1252603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
1262603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
1272603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool isTargetIPhoneOS() const {
1282603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(TargetInitialized && "Target not initialized!");
1292603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    return TargetIsIPhoneOS;
1302603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
1312603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
1324035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar  bool isTargetIOSSimulator() const {
1335f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    assert(TargetInitialized && "Target not initialized!");
1345f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar    return TargetIsIPhoneOSSimulator;
1354035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar  }
1364035580e3475db9013f335ce2b8a49dd1988a79aDaniel Dunbar
13703d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar  bool isTargetInitialized() const { return TargetInitialized; }
13803d87ee556f9e11ab83f6d2f80c9ee92e3667301Daniel Dunbar
1392603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  void getTargetVersion(unsigned (&Res)[3]) const {
1402603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(TargetInitialized && "Target not initialized!");
1412603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    Res[0] = TargetVersion[0];
1422603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    Res[1] = TargetVersion[1];
1432603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    Res[2] = TargetVersion[2];
1442603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
1452603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
146eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  /// getDarwinArchName - Get the "Darwin" arch name for a particular compiler
147eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  /// invocation. For example, Darwin treats different ARM variations as
148eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  /// distinct architectures.
149686775deca8b8685eb90801495880e3abdd844c2Chris Lattner  StringRef getDarwinArchName(const ArgList &Args) const;
150eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
151ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar  static bool isVersionLT(unsigned (&A)[3], unsigned (&B)[3]) {
152608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar    for (unsigned i=0; i < 3; ++i) {
153608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar      if (A[i] > B[i]) return false;
154608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar      if (A[i] < B[i]) return true;
155608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar    }
156608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar    return false;
157608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar  }
158608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar
159ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar  bool isIPhoneOSVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const {
160ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    assert(isTargetIPhoneOS() && "Unexpected call for OS X target!");
161608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar    unsigned B[3] = { V0, V1, V2 };
162ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    return isVersionLT(TargetVersion, B);
163608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar  }
164608d04cb7bee2db28c8689f6626bf9e0b114c473Daniel Dunbar
165ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar  bool isMacosxVersionLT(unsigned V0, unsigned V1=0, unsigned V2=0) const {
166ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    assert(!isTargetIPhoneOS() && "Unexpected call for iPhoneOS target!");
167cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar    unsigned B[3] = { V0, V1, V2 };
168ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    return isVersionLT(TargetVersion, B);
169cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar  }
170cacb0f007001f7463d44ebd5dde7bfaecf876a71Daniel Dunbar
1716b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// AddLinkSearchPathArgs - Add the linker search paths to \arg CmdArgs.
1726b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  ///
1736b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// \param Args - The input argument list.
1746b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// \param CmdArgs [out] - The command argument list to append the paths
1756b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// (prefixed by -L) to.
1761d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkSearchPathArgs(const ArgList &Args,
1771d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                     ArgStringList &CmdArgs) const = 0;
17802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
179f85e193739c953358c865005855253af4f68a497John McCall  /// AddLinkARCArgs - Add the linker arguments to link the ARC runtime library.
180f85e193739c953358c865005855253af4f68a497John McCall  virtual void AddLinkARCArgs(const ArgList &Args,
181f85e193739c953358c865005855253af4f68a497John McCall                              ArgStringList &CmdArgs) const = 0;
182f85e193739c953358c865005855253af4f68a497John McCall
1836cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  /// AddLinkRuntimeLibArgs - Add the linker arguments to link the compiler
1846cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  /// runtime library.
1851d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
1861d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                     ArgStringList &CmdArgs) const = 0;
1873404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher
1886b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// }
1896b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// @name ToolChain Implementation
1906b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// {
1916b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
1924180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  virtual types::ID LookupTypeForExtension(const char *Ext) const;
1934180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
194b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar  virtual bool HasNativeLLVMSupport() const;
195b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar
1969f084a3166b684573ba49df28fc5792bc37d92e1John McCall  virtual void configureObjCRuntime(ObjCRuntime &runtime) const;
19713db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall  virtual bool hasBlocksRuntime() const;
198f85e193739c953358c865005855253af4f68a497John McCall
199279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  virtual DerivedArgList *TranslateArgs(const DerivedArgList &Args,
2000dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar                                        const char *BoundArch) const;
2018eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
202ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
203ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
2048eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2059e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  virtual bool IsBlocksDefault() const {
206ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar    // Always allow blocks on Darwin; users interested in versioning are
207ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar    // expected to use /usr/include/Blocks.h.
208ef44a5d65c48b92802aac02126d36c03d818e847Daniel Dunbar    return true;
2099e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
210eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  virtual bool IsIntegratedAssemblerDefault() const {
21171a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#ifdef DISABLE_DEFAULT_INTEGRATED_ASSEMBLER
21271a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar    return false;
21371a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#else
214eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar    // Default integrated assembler to on for x86.
215eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar    return (getTriple().getArch() == llvm::Triple::x86 ||
216eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar            getTriple().getArch() == llvm::Triple::x86_64);
21771a6cbc5a101899f54e0a76aece82c01b48ad089Daniel Dunbar#endif
218eb840bd0e473ee11622e084a0d6ff276ee7aa5c6Daniel Dunbar  }
219398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar  virtual bool IsStrictAliasingDefault() const {
220398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#ifdef DISABLE_DEFAULT_STRICT_ALIASING
221398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar    return false;
222398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#else
223398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar    return ToolChain::IsStrictAliasingDefault();
224398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar#endif
225398c610b16728b4398214367dd0effd9d2e61340Daniel Dunbar  }
226c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek
227c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek  virtual bool IsObjCDefaultSynthPropertiesDefault() const {
228e3685fd4c2546cfd450de6484ed4125adc1476c0Fariborz Jahanian    return false;
229c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek  }
230c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek
2319e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  virtual bool IsObjCNonFragileABIDefault() const {
232f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    // Non-fragile ABI is default for everything but i386.
233f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    return getTriple().getArch() != llvm::Triple::x86;
2349e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
235609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar  virtual bool IsObjCLegacyDispatchDefault() const {
236609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar    // This is only used with the non-fragile ABI.
237f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar
238f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    // Legacy dispatch is used everywhere except on x86_64.
239f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    return getTriple().getArch() != llvm::Triple::x86_64;
240609508ce95732e7e7010f79c5207613eced7c9cbDaniel Dunbar  }
241f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar  virtual bool UseObjCMixedDispatch() const {
242f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    // This is only used with the non-fragile ABI and non-legacy dispatch.
243f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar
244f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    // Mixed dispatch is used everywhere except OS X before 10.6.
245f645aaaf274c2f32c9ace457b9e69f041b565c17Daniel Dunbar    return !(!isTargetIPhoneOS() && isMacosxVersionLT(10, 6));
246f643b9b338b797a824447207d7eab5f1187f4f34Daniel Dunbar  }
2478eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual bool IsUnwindTablesDefault() const;
2482fef11164cbe804f7b808c07757c6f900c08d765Nico Weber  virtual unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const {
2492fef11164cbe804f7b808c07757c6f900c08d765Nico Weber    // Stack protectors default to on for user code on 10.5,
2502fef11164cbe804f7b808c07757c6f900c08d765Nico Weber    // and for everything in 10.6 and beyond
2512fef11164cbe804f7b808c07757c6f900c08d765Nico Weber    return !isTargetIPhoneOS() &&
2522fef11164cbe804f7b808c07757c6f900c08d765Nico Weber      (!isMacosxVersionLT(10, 6) ||
2532fef11164cbe804f7b808c07757c6f900c08d765Nico Weber         (!isMacosxVersionLT(10, 5) && !KernelOrKext));
2549e5cc6b703b2d0013f13800c2ffbeb3cf85fcfadDaniel Dunbar  }
2558eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetDefaultRelocationModel() const;
2568eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetForcedPicModel() const;
2576b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
258bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  virtual bool SupportsProfiling() const;
259bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar
26043a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  virtual bool SupportsObjCGC() const;
26143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
262f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  virtual bool UseDwarfDebugFlags() const;
263f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
264b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  virtual bool UseSjLjExceptions() const;
265b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
2666b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  /// }
2678eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar};
2688eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2691d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// DarwinClang - The Darwin toolchain used by Clang.
27092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY DarwinClang : public Darwin {
2718aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilsonprivate:
2728aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson  void AddGCCLibexecPath(unsigned darwinVersion);
2738aa76ea4472349e081d046f7b21dc1e54014f335Bob Wilson
2741d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarpublic:
27525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  DarwinClang(const HostInfo &Host, const llvm::Triple& Triple);
2761d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2771d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// @name Darwin ToolChain Implementation
2781d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// {
2791d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2801d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkSearchPathArgs(const ArgList &Args,
2811d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                    ArgStringList &CmdArgs) const;
2821d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2831d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  virtual void AddLinkRuntimeLibArgs(const ArgList &Args,
2841d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                     ArgStringList &CmdArgs) const;
2853404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  void AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
2863404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher                         const char *DarwinStaticLib) const;
2873404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher
288132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar  virtual void AddCXXStdlibLibArgs(const ArgList &Args,
289132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbar                                   ArgStringList &CmdArgs) const;
290efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
2917433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  virtual void AddCCKextLibArgs(const ArgList &Args,
2927433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                ArgStringList &CmdArgs) const;
2937433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
294f85e193739c953358c865005855253af4f68a497John McCall  virtual void AddLinkARCArgs(const ArgList &Args,
295f85e193739c953358c865005855253af4f68a497John McCall                              ArgStringList &CmdArgs) const;
2961d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  /// }
2971d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar};
2981d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2991d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar/// Darwin_Generic_GCC - Generic Darwin tool chain using gcc.
30092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY Darwin_Generic_GCC : public Generic_GCC {
3018eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic:
3021d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  Darwin_Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
303cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    : Generic_GCC(Host, Triple) {}
3048eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
30561ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  std::string ComputeEffectiveClangTriple(const ArgList &Args,
30661ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                          types::ID InputType) const;
30700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
3088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetDefaultRelocationModel() const { return "pic"; }
3098eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar};
3108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
311e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY Generic_ELF : public Generic_GCC {
312e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola public:
313e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  Generic_ELF(const HostInfo &Host, const llvm::Triple& Triple)
314e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola    : Generic_GCC(Host, Triple) {}
315e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola
316e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  virtual bool IsIntegratedAssemblerDefault() const {
317e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola    // Default integrated assembler to on for x86.
318e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola    return (getTriple().getArch() == llvm::Triple::x86 ||
319e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola            getTriple().getArch() == llvm::Triple::x86_64);
320e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  }
321e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola};
322e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola
32392dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY AuroraUX : public Generic_GCC {
324e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanpublic:
325e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  AuroraUX(const HostInfo &Host, const llvm::Triple& Triple);
326e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
327ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
328ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
329e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan};
330e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
331e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF {
332f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarpublic:
333f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  OpenBSD(const HostInfo &Host, const llvm::Triple& Triple);
334f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
335ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
336ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
337f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar};
338f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
339e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY FreeBSD : public Generic_ELF {
34075358d267256022475371416654b056ad8531cb3Daniel Dunbarpublic:
341214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar  FreeBSD(const HostInfo &Host, const llvm::Triple& Triple);
34275358d267256022475371416654b056ad8531cb3Daniel Dunbar
343ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
344ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
34575358d267256022475371416654b056ad8531cb3Daniel Dunbar};
34675358d267256022475371416654b056ad8531cb3Daniel Dunbar
3478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramerclass LLVM_LIBRARY_VISIBILITY NetBSD : public Generic_ELF {
348182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger  const llvm::Triple ToolTriple;
349182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger
3508e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramerpublic:
351182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger  NetBSD(const HostInfo &Host, const llvm::Triple& Triple,
352182564cd14a2105fff05fd52f5940eff96161d57Joerg Sonnenberger         const llvm::Triple& ToolTriple);
3538e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
354ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
355ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
3568e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer};
3578e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
35838e317d6dce161b249508686cc67eb7176958762Chris Lattnerclass LLVM_LIBRARY_VISIBILITY Minix : public Generic_GCC {
35938e317d6dce161b249508686cc67eb7176958762Chris Lattnerpublic:
36038e317d6dce161b249508686cc67eb7176958762Chris Lattner  Minix(const HostInfo &Host, const llvm::Triple& Triple);
36138e317d6dce161b249508686cc67eb7176958762Chris Lattner
362ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
363ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
36438e317d6dce161b249508686cc67eb7176958762Chris Lattner};
36538e317d6dce161b249508686cc67eb7176958762Chris Lattner
366e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY DragonFly : public Generic_ELF {
36711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarpublic:
368cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  DragonFly(const HostInfo &Host, const llvm::Triple& Triple);
36911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
370ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
371ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
37211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar};
37311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
374e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindolaclass LLVM_LIBRARY_VISIBILITY Linux : public Generic_ELF {
3756b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedmanpublic:
3766b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  Linux(const HostInfo &Host, const llvm::Triple& Triple);
377ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
378c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  virtual bool HasNativeLLVMSupport() const;
379c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
380ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
381ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
382c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
383c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::string Linker;
384c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::vector<std::string> ExtraOpts;
3856b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman};
3866b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
3876b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
3883a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
3893a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
39092dd1915842410005c68d32c43bb3b3cf5a4a702Duncan Sandsclass LLVM_LIBRARY_VISIBILITY TCEToolChain : public ToolChain {
3913a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerpublic:
3923a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple);
3933a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  ~TCEToolChain();
3943a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
395ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
396ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
3973a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  bool IsMathErrnoDefault() const;
3983a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  bool IsUnwindTablesDefault() const;
3993a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  const char* GetDefaultRelocationModel() const;
4003a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  const char* GetForcedPicModel() const;
4013a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
4023a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerprivate:
4033a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  mutable llvm::DenseMap<unsigned, Tool*> Tools;
4043a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
4053a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner};
4063a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
407ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerclass LLVM_LIBRARY_VISIBILITY Windows : public ToolChain {
408ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  mutable llvm::DenseMap<unsigned, Tool*> Tools;
409ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
410ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerpublic:
411ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  Windows(const HostInfo &Host, const llvm::Triple& Triple);
412ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
413ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA,
414ac0659ae4124156915eddf70e78065df224d34c8Daniel Dunbar                           const ActionList &Inputs) const;
415ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
416ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  virtual bool IsIntegratedAssemblerDefault() const;
417ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  virtual bool IsUnwindTablesDefault() const;
418ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  virtual const char *GetDefaultRelocationModel() const;
419ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  virtual const char *GetForcedPicModel() const;
420ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer};
421ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
42283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace toolchains
42383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace driver
42483b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace clang
42583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
42683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#endif
427