ToolChains.h revision 0dcb9a3705743ec972af37f48ead81a0939e3958
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
25670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar  /// Generic_GCC - A tool chain using the 'gcc' command to perform
26670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel Dunbar  /// all subcommands; this relies on gcc translating the majority of
27670b7f4fe6720e91520ec5a993b33c00058ed77aDaniel 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 IsMathErrnoDefault() const;
423917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual bool IsUnwindTablesDefault() const;
433917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual const char *GetDefaultRelocationModel() const;
443917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  virtual const char *GetForcedPicModel() const;
4583b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar};
4683b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
47f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain.
48f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarclass VISIBILITY_HIDDEN Darwin : public ToolChain {
498eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  mutable llvm::DenseMap<unsigned, Tool*> Tools;
508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
51c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  /// Darwin version of tool chain.
52c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  unsigned DarwinVersion[3];
53c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
54c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  /// GCC version to use.
55c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  unsigned GCCVersion[3];
56c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
5730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  /// Whether this is this an iPhone toolchain.
5830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  bool IsIPhone;
5930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar
60c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  /// The directory suffix for this tool chain.
61c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  std::string ToolChainDir;
62c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
6302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  /// The default macosx-version-min of this tool chain; empty until
6402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  /// initialized.
6502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  mutable std::string MacosxVersionMin;
6602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
6730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  /// The default iphoneos-version-min of this tool chain.
6830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  std::string IPhoneOSVersionMin;
6930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar
7002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const char *getMacosxVersionMin() const;
71ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
728eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic:
731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Darwin(const HostInfo &Host, const llvm::Triple& Triple,
7430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar         const unsigned (&DarwinVersion)[3],
7530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar         const unsigned (&GCCVersion)[3],
7630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar         bool IsIPhone);
77f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar  ~Darwin();
788eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
7902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  void getDarwinVersion(unsigned (&Res)[3]) const {
8002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[0] = DarwinVersion[0];
8102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[1] = DarwinVersion[1];
8202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[2] = DarwinVersion[2];
8302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
8402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
8502633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  void getMacosxVersion(unsigned (&Res)[3]) const {
8602633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[0] = 10;
8702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[1] = DarwinVersion[0] - 4;
8802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    Res[2] = DarwinVersion[1];
8902633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
9002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
9102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  const char *getMacosxVersionStr() const {
9202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return MacosxVersionMin.c_str();
9302633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
9402633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
9530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  const char *getIPhoneOSVersionStr() const {
9630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    return IPhoneOSVersionMin.c_str();
9730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  }
9830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar
991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const std::string &getToolChainDir() const {
10002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    return ToolChainDir;
10102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  }
10202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
10330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  bool isIPhone() const { return IsIPhone; }
10430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar
1050dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar  virtual DerivedArgList *TranslateArgs(InputArgList &Args,
1060dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar                                        const char *BoundArch) const;
1078eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
1098eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual bool IsMathErrnoDefault() const;
1118eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual bool IsUnwindTablesDefault() const;
1128eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetDefaultRelocationModel() const;
1138eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetForcedPicModel() const;
1148eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar};
1158eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1168eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  /// Darwin_GCC - Generic Darwin tool chain using gcc.
1178eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarclass VISIBILITY_HIDDEN Darwin_GCC : public Generic_GCC {
1188eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbarpublic:
1191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Darwin_GCC(const HostInfo &Host, const llvm::Triple& Triple)
120cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar    : Generic_GCC(Host, Triple) {}
1218eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1228eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  virtual const char *GetDefaultRelocationModel() const { return "pic"; }
1238eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar};
1248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
125e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanclass VISIBILITY_HIDDEN AuroraUX : public Generic_GCC {
126e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghanpublic:
127e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  AuroraUX(const HostInfo &Host, const llvm::Triple& Triple);
128e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
129e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
130e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan};
131e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
132f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarclass VISIBILITY_HIDDEN OpenBSD : public Generic_GCC {
133f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbarpublic:
134f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  OpenBSD(const HostInfo &Host, const llvm::Triple& Triple);
135f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
136f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
137f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar};
138f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
13975358d267256022475371416654b056ad8531cb3Daniel Dunbarclass VISIBILITY_HIDDEN FreeBSD : public Generic_GCC {
14075358d267256022475371416654b056ad8531cb3Daniel Dunbarpublic:
141cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32);
14275358d267256022475371416654b056ad8531cb3Daniel Dunbar
14375358d267256022475371416654b056ad8531cb3Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
14475358d267256022475371416654b056ad8531cb3Daniel Dunbar};
14575358d267256022475371416654b056ad8531cb3Daniel Dunbar
14611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarclass VISIBILITY_HIDDEN DragonFly : public Generic_GCC {
14711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbarpublic:
148cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  DragonFly(const HostInfo &Host, const llvm::Triple& Triple);
14911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
15011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
15111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar};
15211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
1536b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedmanclass VISIBILITY_HIDDEN Linux : public Generic_GCC {
1546b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedmanpublic:
1556b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  Linux(const HostInfo &Host, const llvm::Triple& Triple);
1566b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman};
1576b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
1586b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
15983b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace toolchains
16083b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace driver
16183b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar} // end namespace clang
16283b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar
16383b08eb6d2a7f71328db51baa79c654bb9dcc55dDaniel Dunbar#endif
164