ToolChains.cpp revision 74782b066ecfb0ee05b34ef3a29e24d39c59c1bd
13917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//===--- ToolChains.cpp - ToolChain Implementations ---------------------*-===//
23917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//
33917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//                     The LLVM Compiler Infrastructure
43917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//
53917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// This file is distributed under the University of Illinois Open Source
63917608370583fa30c466b6c3893448229aea9adDaniel Dunbar// License. See LICENSE.TXT for details.
73917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//
83917608370583fa30c466b6c3893448229aea9adDaniel Dunbar//===----------------------------------------------------------------------===//
93917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar#include "ToolChains.h"
113917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
12f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar#include "clang/Driver/Arg.h"
13f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar#include "clang/Driver/ArgList.h"
14c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/Driver.h"
154e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
16c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/HostInfo.h"
174e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/Option.h"
18c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
19c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h"
2084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
21ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar#include "llvm/Support/raw_ostream.h"
22c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/System/Path.h"
23c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
24f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv
25f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar
263917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver;
273917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains;
283917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
29f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain for i386 and x86_64.
308eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
31f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple,
321d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar               const unsigned (&_DarwinVersion)[3], bool _IsIPhoneOS)
331d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  : ToolChain(Host, Triple),
341d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    IsIPhoneOS(_IsIPhoneOS)
351d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
36c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  DarwinVersion[0] = _DarwinVersion[0];
37c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  DarwinVersion[1] = _DarwinVersion[1];
38c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  DarwinVersion[2] = _DarwinVersion[2];
39c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
4002633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  llvm::raw_string_ostream(MacosxVersionMin)
4102633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar    << "10." << DarwinVersion[0] - 4 << '.' << DarwinVersion[1];
4202633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar
4330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  // FIXME: Lift default up.
4430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar  IPhoneOSVersionMin = "3.0";
451d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
461d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
471d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple,
481d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                     const unsigned (&DarwinVersion)[3],
4955bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek                     const unsigned (&_GCCVersion)[3], bool IsIPhoneOS)
501d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  : Darwin(Host, Triple, DarwinVersion, IsIPhoneOS)
511d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
521d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  GCCVersion[0] = _GCCVersion[0];
531d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  GCCVersion[1] = _GCCVersion[1];
541d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  GCCVersion[2] = _GCCVersion[2];
551d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
561d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Set up the tool chain paths to match gcc.
57c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir = "i686-apple-darwin";
5855bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek  ToolChainDir += llvm::utostr(DarwinVersion[0]);
59c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += "/";
60c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[0]);
61c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += '.';
62c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[1]);
63c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += '.';
64c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[2]);
65c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
6674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar  // Try the next major version if that tool chain dir is invalid.
6774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar  if (!llvm::sys::Path(ToolChainDir).exists()) {
6874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    std::string Next = "i686-apple-darwin";
6974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(DarwinVersion[0] + 1);
7074782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += "/";
7174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[0]);
7274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += '.';
7374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[1]);
7474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += '.';
7574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[2]);
7674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar
7774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    // Use that if it exists, otherwise hope the user isn't linking.
7874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    //
7974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    // FIXME: Drop dependency on gcc's tool chain.
8074782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    if (llvm::sys::Path(Next).exists())
8174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar      ToolChainDir = Next;
8274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar  }
8374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar
84c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  std::string Path;
85c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  if (getArchName() == "x86_64") {
86c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path = getHost().getDriver().Dir;
87c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/../lib/gcc/";
886b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    Path += ToolChainDir;
89c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/x86_64";
90c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    getFilePaths().push_back(Path);
91c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
92c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path = "/usr/lib/gcc/";
936b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    Path += ToolChainDir;
94c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/x86_64";
95c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    getFilePaths().push_back(Path);
96c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  }
971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
98c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path = getHost().getDriver().Dir;
99c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path += "/../lib/gcc/";
1006b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
101c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getFilePaths().push_back(Path);
102c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
103c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path = "/usr/lib/gcc/";
1046b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
105c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getFilePaths().push_back(Path);
106c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
107c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path = getHost().getDriver().Dir;
108c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path += "/../libexec/gcc/";
1096b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
110c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getProgramPaths().push_back(Path);
111c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
112c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path = "/usr/libexec/gcc/";
1136b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
114c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getProgramPaths().push_back(Path);
115c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
11682fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar  Path = getHost().getDriver().Dir;
11782fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar  Path += "/../libexec";
11882fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar  getProgramPaths().push_back(Path);
11982fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar
120c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getProgramPaths().push_back(getHost().getDriver().Dir);
121c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
122c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
123f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() {
1248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // Free tool implementations.
1258eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
1268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1278eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    delete it->second;
1288eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
1298eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
130f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarTool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const {
1318eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Action::ActionClass Key;
132a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar  if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    Key = Action::AnalyzeJobClass;
1348eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  else
1358eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    Key = JA.getKind();
1368eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1378eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Tool *&T = Tools[Key];
1388eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (!T) {
1398eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    switch (Key) {
1408eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
1418eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
1428eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      assert(0 && "Invalid tool kind.");
1438eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::PreprocessJobClass:
1449120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar      T = new tools::darwin::Preprocess(*this); break;
1458eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::AnalyzeJobClass:
1468eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::Clang(*this); break;
1479120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    case Action::PrecompileJobClass:
1488eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::CompileJobClass:
1499120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar      T = new tools::darwin::Compile(*this); break;
1508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::AssembleJobClass:
1518cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      T = new tools::darwin::Assemble(*this); break;
1528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LinkJobClass:
1538f28962de22867d372e5e454c33dcaaede860482Daniel Dunbar      T = new tools::darwin::Link(*this); break;
1548eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
1558eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
1568eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    }
1578eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  }
1588eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1598eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return *T;
1608eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
1618eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1621d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args,
1631d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                      ArgStringList &CmdArgs) const {
1646b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  // FIXME: Derive these correctly.
1656b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  if (getArchName() == "x86_64") {
1666b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
1676b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                         "/x86_64"));
1686b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    // Intentionally duplicated for (temporary) gcc bug compatibility.
1696b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
1706b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                         "/x86_64"));
1716b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  }
1726b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir));
1736b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir));
1746b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  // Intentionally duplicated for (temporary) gcc bug compatibility.
1756b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir));
1766b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
1776b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                       "/../../../" + ToolChainDir));
1786b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
1796b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                       "/../../.."));
1806b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar}
1816b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
1821d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args,
1831d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                      ArgStringList &CmdArgs) const {
1846cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  unsigned MacosxVersionMin[3];
1856cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  getMacosxVersionMin(Args, MacosxVersionMin);
1866cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
1876cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  // Derived from libgcc and lib specs but refactored.
1886cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
1896cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    CmdArgs.push_back("-lgcc_static");
1906cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  } else {
1916cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    if (Args.hasArg(options::OPT_static_libgcc)) {
1926cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc_eh");
1936cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
1946cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      // Derived from darwin_iphoneos_libgcc spec.
1951d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar      if (isIPhoneOS()) {
1966cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.1");
1976cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      } else {
1986cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
1996cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      }
2006cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else if (Args.hasArg(options::OPT_shared_libgcc) ||
2016cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar               // FIXME: -fexceptions -fno-exceptions means no exceptions
2026cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar               Args.hasArg(options::OPT_fexceptions) ||
2036cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar               Args.hasArg(options::OPT_fgnu_runtime)) {
2046cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      // FIXME: This is probably broken on 10.3?
2056cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      if (isMacosxVersionLT(MacosxVersionMin, 10, 5))
2066cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
2076cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      else if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
2086cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
2096cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else {
2106cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      if (isMacosxVersionLT(MacosxVersionMin, 10, 3, 9))
2116cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        ; // Do nothing.
2126cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      else if (isMacosxVersionLT(MacosxVersionMin, 10, 5))
2136cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
2146cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      else if (isMacosxVersionLT(MacosxVersionMin, 10, 6))
2156cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
2166cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    }
2176cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
2181d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    if (isIPhoneOS() || isMacosxVersionLT(MacosxVersionMin, 10, 6)) {
2196cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc");
2206cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lSystem");
2216cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else {
2226cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lSystem");
2236cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc");
2246cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    }
2256cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  }
2266cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar}
2276cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
2281d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple,
2291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                         const unsigned (&DarwinVersion)[3],
2301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                         bool IsIPhoneOS)
2311d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  : Darwin(Host, Triple, DarwinVersion, IsIPhoneOS)
2321d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
233a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar  // Add the relative libexec dir (for clang-cc).
234a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar  //
235a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar  // FIXME: We should sink clang-cc into libexec/clang/<version>/.
236a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar  std::string Path = getHost().getDriver().Dir;
237a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar  Path += "/../libexec";
238a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar  getProgramPaths().push_back(Path);
239a92ba278fd0cc1679a9e3b6ca9aaf0713cd8fe6eDaniel Dunbar
2401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
2411d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  getProgramPaths().push_back(getHost().getDriver().Dir);
2421d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
2431d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2441d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
2451d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                       ArgStringList &CmdArgs) const {
2461d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // The Clang toolchain uses explicit paths for internal libraries.
2471d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
2481d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2491d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
2501d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                        ArgStringList &CmdArgs) const {
2511d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Check for static linking.
2521d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2531d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    // FIXME: We need to have compiler-rt available (perhaps as
2541d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    // libclang_static.a) to link against.
2551d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
2561d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  }
2571d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2581d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Reject -static-libgcc for now, we can deal with this when and if someone
2591d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // cares. This is useful in situations where someone wants to statically link
2601d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // something like libstdc++, and needs its runtime support routines.
2611d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
2621d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    getHost().getDriver().Diag(clang::diag::err_drv_unsupported_opt)
2631d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar      << A->getAsString(Args);
2641d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
2651d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  }
2661d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
2671d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Otherwise link libSystem, which should have the support routines.
2681d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  //
2691d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // FIXME: This is only true for 10.6 and beyond. Legacy support isn't
2701d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // critical, but it should work... we should just link in the static
2711d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // compiler-rt library.
2721d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  CmdArgs.push_back("-lSystem");
2731d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
2741d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
27548d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbarvoid Darwin::getMacosxVersionMin(const ArgList &Args,
27648d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar                                 unsigned (&Res)[3]) const {
27748d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar  if (Arg *A = Args.getLastArg(options::OPT_mmacosx_version_min_EQ)) {
27848d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar    bool HadExtra;
27948d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar    if (!Driver::GetReleaseVersion(A->getValue(Args), Res[0], Res[1], Res[2],
28048d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar                                   HadExtra) ||
28148d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar        HadExtra) {
28248d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar      const Driver &D = getHost().getDriver();
28348d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar      D.Diag(clang::diag::err_drv_invalid_version_number)
28448d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar        << A->getAsString(Args);
28548d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar    }
28648d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar  } else
28748d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar    return getMacosxVersion(Res);
28848d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar}
28948d5aae4387f07aef99dbe03f4047d709e9f4d35Daniel Dunbar
2900dcb9a3705743ec972af37f48ead81a0939e3958Daniel DunbarDerivedArgList *Darwin::TranslateArgs(InputArgList &Args,
2910dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar                                      const char *BoundArch) const {
2924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args, false);
293ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  const OptTable &Opts = getHost().getDriver().getOpts();
294ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
295ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // FIXME: We really want to get out of the tool chain level argument
296ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // translation business, as it makes the driver functionality much
297ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // more opaque. For now, we follow gcc closely solely for the
298ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // purpose of easily achieving feature parity & testability. Once we
299ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // have something that works, we should reevaluate each translation
3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // and try to push it down into tool specific logic.
301ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
3021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  Arg *OSXVersion =
303ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar    Args.getLastArg(options::OPT_mmacosx_version_min_EQ, false);
304ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  Arg *iPhoneVersion =
3051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    Args.getLastArg(options::OPT_miphoneos_version_min_EQ, false);
306ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  if (OSXVersion && iPhoneVersion) {
307ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar    getHost().getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with)
308ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar          << OSXVersion->getAsString(Args)
3091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          << iPhoneVersion->getAsString(Args);
310ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  } else if (!OSXVersion && !iPhoneVersion) {
311ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar    // Chose the default version based on the arch.
312ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar    //
31330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    // FIXME: Are there iPhone overrides for this?
31430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar
3151d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    if (!isIPhoneOS()) {
31630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      // Look for MACOSX_DEPLOYMENT_TARGET, otherwise use the version
31730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      // from the host.
31830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const char *Version = ::getenv("MACOSX_DEPLOYMENT_TARGET");
31930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      if (!Version)
32030392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar        Version = MacosxVersionMin.c_str();
32130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
32230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, O, Version));
32330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    } else {
32430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const char *Version = IPhoneOSVersionMin.c_str();
32530392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
32630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, O, Version));
32730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    }
328ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  }
3291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3304e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  for (ArgList::iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) {
3314e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    Arg *A = *it;
3324e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
3334e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    if (A->getOption().matches(options::OPT_Xarch__)) {
3344e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // FIXME: Canonicalize name.
3354e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      if (getArchName() != A->getValue(Args, 0))
3364e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
3374e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
3384e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // FIXME: The arg is leaked here, and we should have a nicer
3394e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // interface for this.
3404e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      unsigned Prev, Index = Prev = A->getIndex() + 1;
341ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      Arg *XarchArg = Opts.ParseOneArg(Args, Index);
3421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3434e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // If the argument parsing failed or more than one argument was
3444e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // consumed, the -Xarch_ argument's parameter tried to consume
3454e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // extra arguments. Emit an error and ignore.
3464e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      //
3474e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // We also want to disallow any options which would alter the
3484e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // driver behavior; that isn't going to work in our model. We
3494e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // use isDriverOption() as an approximation, although things
3504e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // like -O4 are going to slip through.
3511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (!XarchArg || Index > Prev + 1 ||
3524e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          XarchArg->getOption().isDriverOption()) {
353ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar       getHost().getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument)
3544e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          << A->getAsString(Args);
3554e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
3564e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      }
3574e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
358478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      XarchArg->setBaseArg(A);
3594e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      A = XarchArg;
3601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
3614e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
362ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // Sob. These is strictly gcc compatible for the time being. Apple
363ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // gcc translates options twice, which means that self-expanding
364ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // options add duplicates.
365ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    options::ID id = A->getOption().getId();
366ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    switch (id) {
367ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    default:
368ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
369ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
370ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
371ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_mkernel:
372ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fapple_kext:
373ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
374478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static)));
375478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static)));
376ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
3771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
378ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_dependency_file:
379478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeSeparateArg(A, Opts.getOption(options::OPT_MF),
380ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                                       A->getValue(Args)));
381ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
382ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
383ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gfull:
384478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag)));
385478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
386ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar             Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)));
387ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
388ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
389ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gused:
390478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag)));
391478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
392ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar             Opts.getOption(options::OPT_feliminate_unused_debug_symbols)));
393ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
394ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
395ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fterminated_vtables:
396ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_findirect_virtual_calls:
397478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
398478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar                                   Opts.getOption(options::OPT_fapple_kext)));
399478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static)));
400ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
401ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
402ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_shared:
403478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_dynamiclib)));
404ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
405ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
406ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fconstant_cfstrings:
407478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
408ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                             Opts.getOption(options::OPT_mconstant_cfstrings)));
409ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
410ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
411ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_constant_cfstrings:
412478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
413ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                          Opts.getOption(options::OPT_mno_constant_cfstrings)));
414ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
415ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
416ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wnonportable_cfstrings:
417478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
418ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                     Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)));
419ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
420ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
421ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wno_nonportable_cfstrings:
422478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
423ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                  Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)));
424ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
425ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
426ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fpascal_strings:
427478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
428ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                                 Opts.getOption(options::OPT_mpascal_strings)));
429ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
430ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
431ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_pascal_strings:
432478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
433ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                              Opts.getOption(options::OPT_mno_pascal_strings)));
434ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
435ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    }
4364e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  }
4374e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
43884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (getTriple().getArch() == llvm::Triple::x86 ||
43984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      getTriple().getArch() == llvm::Triple::x86_64)
44084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    if (!Args.hasArg(options::OPT_mtune_EQ, false))
44184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ),
44284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar                                     "core2"));
44384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
44484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // Add the arch options based on the particular spelling of -arch, to match
44584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // how the driver driver works.
44684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (BoundArch) {
44784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    llvm::StringRef Name = BoundArch;
44884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
44984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    const Option *MArch = Opts.getOption(options::OPT_march_EQ);
45084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
45184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
45284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // which defines the list of which architectures we accept.
45384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    if (Name == "ppc")
45484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
45584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc601")
45684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "601"));
45784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc603")
45884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "603"));
45984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604")
46084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "604"));
46184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604e")
46284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "604e"));
46384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc750")
46484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "750"));
46584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7400")
46684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "7400"));
46784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7450")
46884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "7450"));
46984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc970")
47084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "970"));
47184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
47284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc64")
47384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64)));
47484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
47584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i386")
47684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
47784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i486")
47884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "i486"));
47984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i586")
48084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "i586"));
48184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i686")
48284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "i686"));
48384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium")
48484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium"));
48584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium2")
48684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium2"));
48784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentpro")
48884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentiumpro"));
48984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentIIm3")
49084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium2"));
49184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
49284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "x86_64")
493478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64)));
494ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
49584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "arm")
49684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv4t"));
49784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv4t")
49884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv4t"));
49984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv5")
50084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv5tej"));
50184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "xscale")
50284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "xscale"));
50384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv6")
50484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv6k"));
50584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv7")
50684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv7a"));
50784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
50884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else
50984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      llvm::llvm_unreachable("invalid Darwin arch");
51084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  }
511ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
5124e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  return DAL;
5131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
5148eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
515f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsMathErrnoDefault() const {
5161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return false;
5178eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
5188eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
519f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const {
5208eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // FIXME: Gross; we should probably have some separate target
5218eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // definition, possibly even reusing the one in clang.
5228eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return getArchName() == "x86_64";
5238eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
5248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
525f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetDefaultRelocationModel() const {
5268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return "pic";
5278eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
5288eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
529f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetForcedPicModel() const {
5308eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (getArchName() == "x86_64")
5318eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    return "pic";
5328eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return 0;
5338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
5348eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
5353917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
5363917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of
5373917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options.
5383917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
539cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarGeneric_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
5401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : ToolChain(Host, Triple) {
54182fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar  std::string Path(getHost().getDriver().Dir);
54282fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar  Path += "/../libexec";
54382fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar  getProgramPaths().push_back(Path);
54482fa7c5b9dc5024893a6e63a2550896f74962376Daniel Dunbar
5451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  getProgramPaths().push_back(getHost().getDriver().Dir);
546c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
547c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
5483917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() {
5493917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  // Free tool implementations.
5503917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
5513917608370583fa30c466b6c3893448229aea9adDaniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
5523917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    delete it->second;
5533917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
5543917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
5551eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C,
5563917608370583fa30c466b6c3893448229aea9adDaniel Dunbar                              const JobAction &JA) const {
5573917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Action::ActionClass Key;
558a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar  if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
5593917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    Key = Action::AnalyzeJobClass;
5603917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  else
5613917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    Key = JA.getKind();
5623917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
5633917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Tool *&T = Tools[Key];
5643917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  if (!T) {
5653917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    switch (Key) {
5668eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
5678eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
5683917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      assert(0 && "Invalid tool kind.");
5693917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PreprocessJobClass:
5703917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Preprocess(*this); break;
5713917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PrecompileJobClass:
5723917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Precompile(*this); break;
5733917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AnalyzeJobClass:
5743917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::Clang(*this); break;
5753917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::CompileJobClass:
5763917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Compile(*this); break;
5773917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AssembleJobClass:
5783917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Assemble(*this); break;
5793917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::LinkJobClass:
5803917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Link(*this); break;
5811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5828eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // This is a bit ungeneric, but the only platform using a driver
5838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // driver is Darwin.
5848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
5858eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
5863917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    }
5873917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  }
5883917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
5893917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return *T;
5903917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
5913917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
592f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Generic_GCC::IsMathErrnoDefault() const {
5931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return true;
5943917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
5953917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
5963917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const {
5978eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // FIXME: Gross; we should probably have some separate target
5988eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // definition, possibly even reusing the one in clang.
5993917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return getArchName() == "x86_64";
6003917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
6013917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
6023917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetDefaultRelocationModel() const {
6033917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return "static";
6043917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
6053917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
6063917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetForcedPicModel() const {
6073917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return 0;
6083917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
609f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
6100dcb9a3705743ec972af37f48ead81a0939e3958Daniel DunbarDerivedArgList *Generic_GCC::TranslateArgs(InputArgList &Args,
6110dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar                                           const char *BoundArch) const {
612f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return new DerivedArgList(Args, true);
613f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
61475358d267256022475371416654b056ad8531cb3Daniel Dunbar
615f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
616f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
617f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarOpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple)
618f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  : Generic_GCC(Host, Triple) {
619f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  getFilePaths().push_back(getHost().getDriver().Dir + "/../lib");
620f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  getFilePaths().push_back("/usr/lib");
621f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
622f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
623f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const {
624f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Action::ActionClass Key;
625a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar  if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
626f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Key = Action::AnalyzeJobClass;
627f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  else
628f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Key = JA.getKind();
629f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
630f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Tool *&T = Tools[Key];
631f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!T) {
632f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    switch (Key) {
633f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    case Action::AssembleJobClass:
634f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = new tools::openbsd::Assemble(*this); break;
635f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    case Action::LinkJobClass:
636f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = new tools::openbsd::Link(*this); break;
637f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    default:
638f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
639f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
640f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
641f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
642f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  return *T;
643f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
644f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
64575358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
64675358d267256022475371416654b056ad8531cb3Daniel Dunbar
647cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarFreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32)
648cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  : Generic_GCC(Host, Triple) {
649bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  if (Lib32) {
65075358d267256022475371416654b056ad8531cb3Daniel Dunbar    getFilePaths().push_back(getHost().getDriver().Dir + "/../lib32");
651bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar    getFilePaths().push_back("/usr/lib32");
652bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  } else {
65375358d267256022475371416654b056ad8531cb3Daniel Dunbar    getFilePaths().push_back(getHost().getDriver().Dir + "/../lib");
654bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar    getFilePaths().push_back("/usr/lib");
655bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  }
65675358d267256022475371416654b056ad8531cb3Daniel Dunbar}
65775358d267256022475371416654b056ad8531cb3Daniel Dunbar
65875358d267256022475371416654b056ad8531cb3Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const {
65975358d267256022475371416654b056ad8531cb3Daniel Dunbar  Action::ActionClass Key;
660a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar  if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
66175358d267256022475371416654b056ad8531cb3Daniel Dunbar    Key = Action::AnalyzeJobClass;
66275358d267256022475371416654b056ad8531cb3Daniel Dunbar  else
66375358d267256022475371416654b056ad8531cb3Daniel Dunbar    Key = JA.getKind();
66475358d267256022475371416654b056ad8531cb3Daniel Dunbar
66575358d267256022475371416654b056ad8531cb3Daniel Dunbar  Tool *&T = Tools[Key];
66675358d267256022475371416654b056ad8531cb3Daniel Dunbar  if (!T) {
66775358d267256022475371416654b056ad8531cb3Daniel Dunbar    switch (Key) {
66868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    case Action::AssembleJobClass:
66968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      T = new tools::freebsd::Assemble(*this); break;
670008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    case Action::LinkJobClass:
671008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      T = new tools::freebsd::Link(*this); break;
67275358d267256022475371416654b056ad8531cb3Daniel Dunbar    default:
67375358d267256022475371416654b056ad8531cb3Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
67475358d267256022475371416654b056ad8531cb3Daniel Dunbar    }
67575358d267256022475371416654b056ad8531cb3Daniel Dunbar  }
67675358d267256022475371416654b056ad8531cb3Daniel Dunbar
67775358d267256022475371416654b056ad8531cb3Daniel Dunbar  return *T;
67875358d267256022475371416654b056ad8531cb3Daniel Dunbar}
67911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
680e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
681e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
682e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanAuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)
683e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  : Generic_GCC(Host, Triple) {
684e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
685e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  // Path mangling to find libexec
686e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  std::string Path(getHost().getDriver().Dir);
687e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
688e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Path += "/../libexec";
689e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getProgramPaths().push_back(Path);
6901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  getProgramPaths().push_back(getHost().getDriver().Dir);
691e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
692e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back(getHost().getDriver().Dir + "/../lib");
693e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/lib");
694e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/sfw/lib");
695e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib");
6967adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
697e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
698e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
699e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
700e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const {
701e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Action::ActionClass Key;
702a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar  if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
703e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Key = Action::AnalyzeJobClass;
704e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  else
705e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Key = JA.getKind();
706e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
707e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Tool *&T = Tools[Key];
708e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!T) {
709e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    switch (Key) {
710e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::AssembleJobClass:
711e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Assemble(*this); break;
712e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::LinkJobClass:
713e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Link(*this); break;
714e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    default:
715e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = &Generic_GCC::SelectTool(C, JA);
716e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
717e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
718e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
719e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  return *T;
720e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
721e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
722e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
7236b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment).
7246b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
7256b3454a219cee5ef36c4668961f93a5c32deab61Eli FriedmanLinux::Linux(const HostInfo &Host, const llvm::Triple& Triple)
7266b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  : Generic_GCC(Host, Triple) {
7276b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  getFilePaths().push_back(getHost().getDriver().Dir + "/../lib/clang/1.0/");
7286b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  getFilePaths().push_back("/lib/");
7296b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  getFilePaths().push_back("/usr/lib/");
730a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar
731a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  // Depending on the Linux distribution, any combination of lib{,32,64} is
732a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  // possible. E.g. Debian uses lib and lib32 for mixed i386/x86-64 systems,
733a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  // openSUSE uses lib and lib64 for the same purpose.
734a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/lib32/");
735a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/usr/lib32/");
736a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/lib64/");
737a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/usr/lib64/");
738a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar
7396b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // FIXME: Figure out some way to get gcc's libdir
7406b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // (e.g. /usr/lib/gcc/i486-linux-gnu/4.3/ for Ubuntu 32-bit); we need
7416b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // crtbegin.o/crtend.o/etc., and want static versions of various
7426b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // libraries. If we had our own crtbegin.o/crtend.o/etc, we could probably
7436b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // get away with using shared versions in /usr/lib, though.
7446b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // We could fall back to the approach we used for includes (a massive
7456b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // list), but that's messy at best.
7466b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}
7476b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
74811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
74911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
750cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarDragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
751cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  : Generic_GCC(Host, Triple) {
75211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
75311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // Path mangling to find libexec
75411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  std::string Path(getHost().getDriver().Dir);
75511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
75611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Path += "/../libexec";
75711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getProgramPaths().push_back(Path);
7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  getProgramPaths().push_back(getHost().getDriver().Dir);
75911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
76011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back(getHost().getDriver().Dir + "/../lib");
76111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib");
76211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib/gcc41");
76311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
76411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
76511e1b40d759a643086f590f6ffbd9d68360bad46Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const {
76611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Action::ActionClass Key;
767a6046bec7fc835186dde134fb81aa1b7d45cd9f0Daniel Dunbar  if (getHost().getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
76811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Key = Action::AnalyzeJobClass;
76911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  else
77011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Key = JA.getKind();
77111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
77211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Tool *&T = Tools[Key];
77311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!T) {
77411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    switch (Key) {
77511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::AssembleJobClass:
77611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Assemble(*this); break;
77711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::LinkJobClass:
77811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Link(*this); break;
77911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    default:
78011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
78111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
78211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
78311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
78411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  return *T;
78511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
786