ToolChains.cpp revision e3c153a88a21e620446955705a7fc8215b4cc2f2
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"
1727e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar#include "clang/Driver/OptTable.h"
184e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/Option.h"
19265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h"
20c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
21c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h"
2284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
23ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar#include "llvm/Support/raw_ostream.h"
24c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/System/Path.h"
25c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
26f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv
27f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar
283917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver;
293917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains;
303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
31f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain for i386 and x86_64.
328eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
33f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple,
34cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar               const unsigned (&_DarwinVersion)[3])
35cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar  : ToolChain(Host, Triple), TargetInitialized(false)
361d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
3702633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  llvm::raw_string_ostream(MacosxVersionMin)
385435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar    << "10." << std::max(0, (int)_DarwinVersion[0] - 4) << '.'
395435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar    << _DarwinVersion[1];
401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
411d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
42eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this?
43eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) {
44eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv6k")
45eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv6";
46eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
47eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv5tej")
48eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv5";
49eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
50eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "xscale")
51eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "xscale";
52eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
53eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv4t")
54eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv4t";
55eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
56eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" ||
57eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" ||
58eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "armv7m")
59eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv7";
60eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
61eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  return 0;
62eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
63eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
64eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this?
65eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) {
66eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" ||
67eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm946e-s" || Value == "arm966e-s" ||
68eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm968e-s" || Value == "arm10e" ||
69eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" ||
70eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm1026ej-s")
71eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv5";
72eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
73eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "xscale")
74eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "xscale";
75eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
76eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "arm1136j-s" || Value == "arm1136jf-s" ||
77eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm1176jz-s" || Value == "arm1176jzf-s")
78eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv6";
79eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
80eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3")
81eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv7";
82eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
83eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  return 0;
84eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
85eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
86eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarllvm::StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
87eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  switch (getTriple().getArch()) {
88eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  default:
89eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return getArchName();
90eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
91eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  case llvm::Triple::arm: {
92eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
93eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
94eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
95eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
96eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
97eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
98eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
99eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
100eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "arm";
101eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
102eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
103eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
104eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
1051d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple,
1061d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                     const unsigned (&DarwinVersion)[3],
107cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar                     const unsigned (&_GCCVersion)[3])
108cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar  : Darwin(Host, Triple, DarwinVersion)
1091d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
1101d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  GCCVersion[0] = _GCCVersion[0];
1111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  GCCVersion[1] = _GCCVersion[1];
1121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  GCCVersion[2] = _GCCVersion[2];
1131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
1141d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Set up the tool chain paths to match gcc.
115c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir = "i686-apple-darwin";
11655bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek  ToolChainDir += llvm::utostr(DarwinVersion[0]);
117c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += "/";
118c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[0]);
119c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += '.';
120c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[1]);
121c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += '.';
122c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[2]);
123c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
12474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar  // Try the next major version if that tool chain dir is invalid.
125080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar  std::string Tmp = "/usr/lib/gcc/" + ToolChainDir;
126080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar  if (!llvm::sys::Path(Tmp).exists()) {
12774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    std::string Next = "i686-apple-darwin";
12874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(DarwinVersion[0] + 1);
12974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += "/";
13074782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[0]);
13174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += '.';
13274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[1]);
13374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += '.';
13474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[2]);
13574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar
13674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    // Use that if it exists, otherwise hope the user isn't linking.
13774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    //
13874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    // FIXME: Drop dependency on gcc's tool chain.
139080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar    Tmp = "/usr/lib/gcc/" + Next;
140080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar    if (llvm::sys::Path(Tmp).exists())
14174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar      ToolChainDir = Next;
14274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar  }
14374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar
144c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  std::string Path;
145c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  if (getArchName() == "x86_64") {
146ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    Path = getDriver().Dir;
147c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/../lib/gcc/";
1486b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    Path += ToolChainDir;
149c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/x86_64";
150c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    getFilePaths().push_back(Path);
151c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
152c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path = "/usr/lib/gcc/";
1536b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    Path += ToolChainDir;
154c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/x86_64";
155c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    getFilePaths().push_back(Path);
156c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  }
1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
158ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  Path = getDriver().Dir;
159c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path += "/../lib/gcc/";
1606b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
161c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getFilePaths().push_back(Path);
162c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
163c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path = "/usr/lib/gcc/";
1646b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
165c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getFilePaths().push_back(Path);
166c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
167ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  Path = getDriver().Dir;
168c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path += "/../libexec/gcc/";
1696b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
170c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getProgramPaths().push_back(Path);
171c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
172c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path = "/usr/libexec/gcc/";
1736b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
174c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getProgramPaths().push_back(Path);
175c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
176ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getProgramPaths().push_back(getDriver().Dir);
177c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
178c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
179f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() {
1808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // Free tool implementations.
1818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
1828eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    delete it->second;
1848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
1858eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
186f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarTool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const {
1878eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Action::ActionClass Key;
188ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    Key = Action::AnalyzeJobClass;
1908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  else
1918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    Key = JA.getKind();
1928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1938eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Tool *&T = Tools[Key];
1948eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (!T) {
1958eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    switch (Key) {
1968eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
1978eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
1988eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      assert(0 && "Invalid tool kind.");
1998eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::PreprocessJobClass:
2009120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar      T = new tools::darwin::Preprocess(*this); break;
2018eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::AnalyzeJobClass:
2028eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::Clang(*this); break;
2039120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    case Action::PrecompileJobClass:
2048eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::CompileJobClass:
2059120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar      T = new tools::darwin::Compile(*this); break;
2068eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::AssembleJobClass:
2078cac5f7e1ce63dd77ee0fb4ef68f9fa804f41ea6Daniel Dunbar      T = new tools::darwin::Assemble(*this); break;
2088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LinkJobClass:
2098f28962de22867d372e5e454c33dcaaede860482Daniel Dunbar      T = new tools::darwin::Link(*this); break;
2108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
2118eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
2128eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    }
2138eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  }
2148eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2158eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return *T;
2168eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
2178eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2181d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args,
2191d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                      ArgStringList &CmdArgs) const {
220e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  std::string Tmp;
221e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar
2226b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  // FIXME: Derive these correctly.
2236b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  if (getArchName() == "x86_64") {
2246b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
2256b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                         "/x86_64"));
2266b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    // Intentionally duplicated for (temporary) gcc bug compatibility.
2276b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
2286b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                         "/x86_64"));
2296b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  }
2308bc9c550128c0662a04234dc262628c54c76b1eaDaniel Dunbar
2316b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir));
232e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar
233e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib/gcc/" + ToolChainDir;
234e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
235e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
236e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib/gcc";
237e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
238e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
2396b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir));
2406b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  // Intentionally duplicated for (temporary) gcc bug compatibility.
2416b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir));
242e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib/" + ToolChainDir;
243e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
244e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
245e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib";
246e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
247e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
2486b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
2496b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                       "/../../../" + ToolChainDir));
2506b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
2516b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                       "/../../.."));
2526b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar}
2536b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
2541d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args,
2551d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                      ArgStringList &CmdArgs) const {
256ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar  // Note that this routine is only used for targetting OS X.
2576cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
2586cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  // Derived from libgcc and lib specs but refactored.
2596cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2606cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    CmdArgs.push_back("-lgcc_static");
2616cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  } else {
2626cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    if (Args.hasArg(options::OPT_static_libgcc)) {
2636cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc_eh");
2646cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
2656cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      // Derived from darwin_iphoneos_libgcc spec.
266251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar      if (isTargetIPhoneOS()) {
2676cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.1");
2686cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      } else {
2696cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
2706cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      }
2716cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else if (Args.hasArg(options::OPT_shared_libgcc) ||
2728a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar               Args.hasFlag(options::OPT_fexceptions,
2738a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar                            options::OPT_fno_exceptions) ||
2746cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar               Args.hasArg(options::OPT_fgnu_runtime)) {
2756cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      // FIXME: This is probably broken on 10.3?
276ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      if (isMacosxVersionLT(10, 5))
2776cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
278ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      else if (isMacosxVersionLT(10, 6))
2796cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
2806cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else {
281ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      if (isMacosxVersionLT(10, 3, 9))
2826cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        ; // Do nothing.
283ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      else if (isMacosxVersionLT(10, 5))
2846cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
285ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      else if (isMacosxVersionLT(10, 6))
2866cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
2876cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    }
2886cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
289ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isTargetIPhoneOS() || isMacosxVersionLT(10, 6)) {
2906cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc");
2916cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lSystem");
2926cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else {
2936cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lSystem");
2946cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc");
2956cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    }
2966cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  }
2976cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar}
2986cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
2991d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple,
300cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar                         const unsigned (&DarwinVersion)[3])
301cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar  : Darwin(Host, Triple, DarwinVersion)
3021d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
3031d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
304ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getProgramPaths().push_back(getDriver().Dir);
3051d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
3061d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3071d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
3081d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                       ArgStringList &CmdArgs) const {
3091d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // The Clang toolchain uses explicit paths for internal libraries.
3101d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
3111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
3131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                        ArgStringList &CmdArgs) const {
314eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Darwin doesn't support real static executables, don't link any runtime
315eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // libraries with -static.
316eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  if (Args.hasArg(options::OPT_static))
3171d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
3181d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3191d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Reject -static-libgcc for now, we can deal with this when and if someone
3201d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // cares. This is useful in situations where someone wants to statically link
3211d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // something like libstdc++, and needs its runtime support routines.
3221d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
323ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getDriver().Diag(clang::diag::err_drv_unsupported_opt)
3241d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar      << A->getAsString(Args);
3251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
3261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  }
3271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
328eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Otherwise link libSystem, then the dynamic runtime library, and finally any
329eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // target specific static runtime library.
3301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  CmdArgs.push_back("-lSystem");
331eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
332eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Select the dynamic runtime library and the target specific static library.
333eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  const char *DarwinStaticLib = 0;
334251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (isTargetIPhoneOS()) {
335eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    CmdArgs.push_back("-lgcc_s.1");
336eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
337eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // We may need some static functions for armv6/thumb which are required to
338eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // be in the same linkage unit as their caller.
339eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    if (getDarwinArchName(Args) == "armv6")
340eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      DarwinStaticLib = "libclang_rt.armv6.a";
341eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  } else {
342eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // The dynamic runtime library was merged with libSystem for 10.6 and
343eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // beyond; only 10.4 and 10.5 need an additional runtime library.
344ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isMacosxVersionLT(10, 5))
345eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.4");
346ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    else if (isMacosxVersionLT(10, 6))
347eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.5");
348eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
349eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // For OS X, we only need a static runtime library when targetting 10.4, to
350eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // provide versions of the static functions which were omitted from
351eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // 10.4.dylib.
352ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isMacosxVersionLT(10, 5))
353eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      DarwinStaticLib = "libclang_rt.10.4.a";
354eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  }
355eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
356eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  /// Add the target specific static library, if needed.
357eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  if (DarwinStaticLib) {
358eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    llvm::sys::Path P(getDriver().ResourceDir);
359eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    P.appendComponent("lib");
360eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    P.appendComponent("darwin");
361eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    P.appendComponent(DarwinStaticLib);
362eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
363eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // For now, allow missing resource libraries to support developers who may
364eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // not have compiler-rt checked out or integrated into their build.
365eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    if (!P.exists())
366eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      getDriver().Diag(clang::diag::warn_drv_missing_resource_library)
367eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar        << P.str();
368eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    else
369eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString(P.str()));
370eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  }
3711d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
3721d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3730dcb9a3705743ec972af37f48ead81a0939e3958Daniel DunbarDerivedArgList *Darwin::TranslateArgs(InputArgList &Args,
3740dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar                                      const char *BoundArch) const {
3754e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args, false);
376ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const OptTable &Opts = getDriver().getOpts();
377ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
378ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // FIXME: We really want to get out of the tool chain level argument
379ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // translation business, as it makes the driver functionality much
380ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // more opaque. For now, we follow gcc closely solely for the
381ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // purpose of easily achieving feature parity & testability. Once we
382ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // have something that works, we should reevaluate each translation
3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // and try to push it down into tool specific logic.
384ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
3852603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
3862603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *iPhoneVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
387ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  if (OSXVersion && iPhoneVersion) {
388ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with)
389ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar          << OSXVersion->getAsString(Args)
3901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          << iPhoneVersion->getAsString(Args);
3912603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    iPhoneVersion = 0;
392ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  } else if (!OSXVersion && !iPhoneVersion) {
393816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // If neither OS X nor iPhoneOS targets were specified, check for
394816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // environment defines.
395816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET");
396816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    const char *iPhoneOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET");
397816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
398816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // Ignore empty strings.
399816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    if (OSXTarget && OSXTarget[0] == '\0')
400816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar      OSXTarget = 0;
401816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    if (iPhoneOSTarget && iPhoneOSTarget[0] == '\0')
402816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar      iPhoneOSTarget = 0;
403816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
40439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // Diagnose conflicting deployment targets, and choose default platform
40539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // based on the tool chain.
40639053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    //
40739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // FIXME: Don't hardcode default here.
40839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    if (OSXTarget && iPhoneOSTarget) {
40939053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      // FIXME: We should see if we can get away with warning or erroring on
41039053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      // this. Perhaps put under -pedantic?
41139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::arm ||
41239053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar          getTriple().getArch() == llvm::Triple::thumb)
41384d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar        OSXTarget = 0;
41439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      else
41584d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar        iPhoneOSTarget = 0;
41639053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    }
4171a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar
41839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    if (OSXTarget) {
41930392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
4202603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      OSXVersion = DAL->MakeJoinedArg(0, O, OSXTarget);
4212603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      DAL->append(OSXVersion);
422816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    } else if (iPhoneOSTarget) {
42330392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
4242603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      iPhoneVersion = DAL->MakeJoinedArg(0, O, iPhoneOSTarget);
4252603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      DAL->append(iPhoneVersion);
426816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    } else {
427cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar      // Otherwise, choose a default platform based on the tool chain.
428cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar      //
429cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar      // FIXME: Don't hardcode default here.
430cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::arm ||
431cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar          getTriple().getArch() == llvm::Triple::thumb) {
432816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar        const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
433cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar        iPhoneVersion = DAL->MakeJoinedArg(0, O, "3.0");
4342603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        DAL->append(iPhoneVersion);
435816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar      } else {
436816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar        const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
4372603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        OSXVersion = DAL->MakeJoinedArg(0, O, MacosxVersionMin);
4382603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        DAL->append(OSXVersion);
439816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar      }
44030392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    }
441ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  }
4421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4432603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // Set the tool chain target information.
4442603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  unsigned Major, Minor, Micro;
4452603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool HadExtra;
4462603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  if (OSXVersion) {
4472603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(!iPhoneVersion && "Unknown target platform!");
4482603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
4492603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
4502603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        Major != 10 || Minor >= 10 || Micro >= 10)
4512603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      getDriver().Diag(clang::diag::err_drv_invalid_version_number)
4522603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << OSXVersion->getAsString(Args);
4532603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  } else {
4542603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(iPhoneVersion && "Unknown target platform!");
4552603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    if (!Driver::GetReleaseVersion(iPhoneVersion->getValue(Args), Major, Minor,
4562603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
4572603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        Major >= 10 || Minor >= 100 || Micro >= 100)
4582603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      getDriver().Diag(clang::diag::err_drv_invalid_version_number)
4592603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << iPhoneVersion->getAsString(Args);
4602603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
4612603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  setTarget(iPhoneVersion, Major, Minor, Micro);
4622603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
4634e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  for (ArgList::iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) {
4644e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    Arg *A = *it;
4654e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
4664e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    if (A->getOption().matches(options::OPT_Xarch__)) {
4674e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // FIXME: Canonicalize name.
4684e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      if (getArchName() != A->getValue(Args, 0))
4694e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
4704e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
4714e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // FIXME: The arg is leaked here, and we should have a nicer
4724e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // interface for this.
4734e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      unsigned Prev, Index = Prev = A->getIndex() + 1;
474ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      Arg *XarchArg = Opts.ParseOneArg(Args, Index);
4751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4764e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // If the argument parsing failed or more than one argument was
4774e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // consumed, the -Xarch_ argument's parameter tried to consume
4784e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // extra arguments. Emit an error and ignore.
4794e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      //
4804e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // We also want to disallow any options which would alter the
4814e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // driver behavior; that isn't going to work in our model. We
4824e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // use isDriverOption() as an approximation, although things
4834e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // like -O4 are going to slip through.
4841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (!XarchArg || Index > Prev + 1 ||
4854e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          XarchArg->getOption().isDriverOption()) {
486ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar       getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument)
4874e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          << A->getAsString(Args);
4884e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
4894e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      }
4904e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
491478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      XarchArg->setBaseArg(A);
4924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      A = XarchArg;
4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
4944e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
495ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // Sob. These is strictly gcc compatible for the time being. Apple
496ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // gcc translates options twice, which means that self-expanding
497ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // options add duplicates.
4989e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    switch ((options::ID) A->getOption().getID()) {
499ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    default:
500ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
501ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
502ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
503ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_mkernel:
504ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fapple_kext:
505ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
506478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static)));
507478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static)));
508ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
5091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
510ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_dependency_file:
511478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeSeparateArg(A, Opts.getOption(options::OPT_MF),
512ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                                       A->getValue(Args)));
513ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
514ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
515ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gfull:
516478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag)));
517478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
518ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar             Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)));
519ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
520ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
521ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gused:
522478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag)));
523478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
524ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar             Opts.getOption(options::OPT_feliminate_unused_debug_symbols)));
525ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
526ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
527ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fterminated_vtables:
528ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_findirect_virtual_calls:
529478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
530478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar                                   Opts.getOption(options::OPT_fapple_kext)));
531478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static)));
532ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
533ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
534ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_shared:
535478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_dynamiclib)));
536ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
537ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
538ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fconstant_cfstrings:
539478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
540ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                             Opts.getOption(options::OPT_mconstant_cfstrings)));
541ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
542ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
543ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_constant_cfstrings:
544478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
545ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                          Opts.getOption(options::OPT_mno_constant_cfstrings)));
546ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
547ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
548ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wnonportable_cfstrings:
549478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
550ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                     Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)));
551ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
552ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
553ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wno_nonportable_cfstrings:
554478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
555ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                  Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)));
556ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
557ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
558ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fpascal_strings:
559478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
560ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                                 Opts.getOption(options::OPT_mpascal_strings)));
561ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
562ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
563ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_pascal_strings:
564478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(A,
565ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar                              Opts.getOption(options::OPT_mno_pascal_strings)));
566ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
567ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    }
5684e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  }
5694e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
57084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (getTriple().getArch() == llvm::Triple::x86 ||
57184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      getTriple().getArch() == llvm::Triple::x86_64)
572e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
57384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ),
57484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar                                     "core2"));
57584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
57684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // Add the arch options based on the particular spelling of -arch, to match
57784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // how the driver driver works.
57884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (BoundArch) {
57984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    llvm::StringRef Name = BoundArch;
58084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
58184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    const Option *MArch = Opts.getOption(options::OPT_march_EQ);
58284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
58384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
58484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // which defines the list of which architectures we accept.
58584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    if (Name == "ppc")
58684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
58784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc601")
58884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "601"));
58984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc603")
59084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "603"));
59184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604")
59284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "604"));
59384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604e")
59484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "604e"));
59584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc750")
59684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "750"));
59784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7400")
59884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "7400"));
59984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7450")
60084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "7450"));
60184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc970")
60284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MCpu, "970"));
60384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
60484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc64")
60584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64)));
60684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
60784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i386")
60884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
60984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i486")
61084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "i486"));
61184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i586")
61284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "i586"));
61384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i686")
61484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "i686"));
61584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium")
61684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium"));
61784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium2")
61884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium2"));
61984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentpro")
62084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentiumpro"));
62184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentIIm3")
62284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "pentium2"));
62384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
62484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "x86_64")
625478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64)));
626ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
62784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "arm")
62884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv4t"));
62984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv4t")
63084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv4t"));
63184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv5")
63284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv5tej"));
63384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "xscale")
63484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "xscale"));
63584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv6")
63684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv6k"));
63784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv7")
63884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      DAL->append(DAL->MakeJoinedArg(0, MArch, "armv7a"));
63984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
64084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else
6419f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin      llvm_unreachable("invalid Darwin arch");
64284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  }
643ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
6444e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  return DAL;
6451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
6468eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
647f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const {
6488eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // FIXME: Gross; we should probably have some separate target
6498eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // definition, possibly even reusing the one in clang.
6508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return getArchName() == "x86_64";
6518eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
6528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
653f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbarbool Darwin::UseDwarfDebugFlags() const {
654f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
655f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    return S[0] != '\0';
656f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  return false;
657f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar}
658f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
659b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const {
660b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  // Darwin uses SjLj exceptions on ARM.
661b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  return (getTriple().getArch() == llvm::Triple::arm ||
662b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar          getTriple().getArch() == llvm::Triple::thumb);
663b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar}
664b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
665f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetDefaultRelocationModel() const {
6668eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return "pic";
6678eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
6688eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
669f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetForcedPicModel() const {
6708eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (getArchName() == "x86_64")
6718eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    return "pic";
6728eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return 0;
6738eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
6748eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
67543a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const {
67643a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  // Garbage collection is supported everywhere except on iPhone OS.
67743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  return !isTargetIPhoneOS();
67843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar}
67943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
6803917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
6813917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of
6823917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options.
6833917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
684cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarGeneric_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
6851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : ToolChain(Host, Triple) {
686ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getProgramPaths().push_back(getDriver().Dir);
687c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
688c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
6893917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() {
6903917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  // Free tool implementations.
6913917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
6923917608370583fa30c466b6c3893448229aea9adDaniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
6933917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    delete it->second;
6943917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
6953917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
6961eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C,
6973917608370583fa30c466b6c3893448229aea9adDaniel Dunbar                              const JobAction &JA) const {
6983917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Action::ActionClass Key;
699ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
7003917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    Key = Action::AnalyzeJobClass;
7013917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  else
7023917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    Key = JA.getKind();
7033917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7043917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Tool *&T = Tools[Key];
7053917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  if (!T) {
7063917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    switch (Key) {
7078eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
7088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
7093917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      assert(0 && "Invalid tool kind.");
7103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PreprocessJobClass:
7113917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Preprocess(*this); break;
7123917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PrecompileJobClass:
7133917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Precompile(*this); break;
7143917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AnalyzeJobClass:
7153917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::Clang(*this); break;
7163917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::CompileJobClass:
7173917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Compile(*this); break;
7183917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AssembleJobClass:
7193917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Assemble(*this); break;
7203917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::LinkJobClass:
7213917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Link(*this); break;
7221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7238eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // This is a bit ungeneric, but the only platform using a driver
7248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // driver is Darwin.
7258eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
7268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
7273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    }
7283917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  }
7293917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return *T;
7313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
7323917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7333917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const {
7348eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // FIXME: Gross; we should probably have some separate target
7358eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // definition, possibly even reusing the one in clang.
7363917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return getArchName() == "x86_64";
7373917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
7383917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7393917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetDefaultRelocationModel() const {
7403917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return "static";
7413917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
7423917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7433917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetForcedPicModel() const {
7443917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return 0;
7453917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
746f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
7470dcb9a3705743ec972af37f48ead81a0939e3958Daniel DunbarDerivedArgList *Generic_GCC::TranslateArgs(InputArgList &Args,
7480dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar                                           const char *BoundArch) const {
749f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar  return new DerivedArgList(Args, true);
750f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar}
75175358d267256022475371416654b056ad8531cb3Daniel Dunbar
7523a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7533a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
7543a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
7553a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation.
7563a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7573a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple)
7583a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  : ToolChain(Host, Triple) {
7593a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  // Path mangling to find libexec
7603a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  std::string Path(getDriver().Dir);
7613a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7623a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Path += "/../libexec";
7633a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  getProgramPaths().push_back(Path);
7643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7653a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7663a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() {
7673a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  for (llvm::DenseMap<unsigned, Tool*>::iterator
7683a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner           it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
7693a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      delete it->second;
7703a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7713a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7723a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsMathErrnoDefault() const {
7733a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return true;
7743a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7753a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7763a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsUnwindTablesDefault() const {
7773a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return false;
7783a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7793a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7803a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetDefaultRelocationModel() const {
7813a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return "static";
7823a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7833a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7843a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetForcedPicModel() const {
7853a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return 0;
7863a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7873a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7883a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTool &TCEToolChain::SelectTool(const Compilation &C,
7893a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner                            const JobAction &JA) const {
7903a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Action::ActionClass Key;
7913a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Key = Action::AnalyzeJobClass;
7923a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7933a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Tool *&T = Tools[Key];
7943a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  if (!T) {
7953a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    switch (Key) {
7963a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::PreprocessJobClass:
7973a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::gcc::Preprocess(*this); break;
7983a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::AnalyzeJobClass:
7993a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::Clang(*this); break;
8003a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    default:
8013a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner     assert(false && "Unsupported action for TCE target.");
8023a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    }
8033a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  }
8043a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return *T;
8053a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
8063a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
8073a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerDerivedArgList *TCEToolChain::TranslateArgs(InputArgList &Args,
8083a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner                                            const char *BoundArch) const {
8093a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return new DerivedArgList(Args, true);
8103a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
8113a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
812f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
813f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
814f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarOpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple)
815f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  : Generic_GCC(Host, Triple) {
816ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
817f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  getFilePaths().push_back("/usr/lib");
818f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
819f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
820f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const {
821f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Action::ActionClass Key;
822ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
823f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Key = Action::AnalyzeJobClass;
824f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  else
825f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Key = JA.getKind();
826f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
827f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Tool *&T = Tools[Key];
828f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!T) {
829f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    switch (Key) {
830f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    case Action::AssembleJobClass:
831f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = new tools::openbsd::Assemble(*this); break;
832f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    case Action::LinkJobClass:
833f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = new tools::openbsd::Link(*this); break;
834f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    default:
835f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
836f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
837f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
838f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
839f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  return *T;
840f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
841f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
84275358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
84375358d267256022475371416654b056ad8531cb3Daniel Dunbar
844cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarFreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32)
845cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  : Generic_GCC(Host, Triple) {
846bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  if (Lib32) {
847ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getFilePaths().push_back(getDriver().Dir + "/../lib32");
848bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar    getFilePaths().push_back("/usr/lib32");
849bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  } else {
850ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getFilePaths().push_back(getDriver().Dir + "/../lib");
851bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar    getFilePaths().push_back("/usr/lib");
852bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  }
85375358d267256022475371416654b056ad8531cb3Daniel Dunbar}
85475358d267256022475371416654b056ad8531cb3Daniel Dunbar
85575358d267256022475371416654b056ad8531cb3Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const {
85675358d267256022475371416654b056ad8531cb3Daniel Dunbar  Action::ActionClass Key;
857ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
85875358d267256022475371416654b056ad8531cb3Daniel Dunbar    Key = Action::AnalyzeJobClass;
85975358d267256022475371416654b056ad8531cb3Daniel Dunbar  else
86075358d267256022475371416654b056ad8531cb3Daniel Dunbar    Key = JA.getKind();
86175358d267256022475371416654b056ad8531cb3Daniel Dunbar
86275358d267256022475371416654b056ad8531cb3Daniel Dunbar  Tool *&T = Tools[Key];
86375358d267256022475371416654b056ad8531cb3Daniel Dunbar  if (!T) {
86475358d267256022475371416654b056ad8531cb3Daniel Dunbar    switch (Key) {
86568a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    case Action::AssembleJobClass:
86668a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      T = new tools::freebsd::Assemble(*this); break;
867008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    case Action::LinkJobClass:
868008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      T = new tools::freebsd::Link(*this); break;
86975358d267256022475371416654b056ad8531cb3Daniel Dunbar    default:
87075358d267256022475371416654b056ad8531cb3Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
87175358d267256022475371416654b056ad8531cb3Daniel Dunbar    }
87275358d267256022475371416654b056ad8531cb3Daniel Dunbar  }
87375358d267256022475371416654b056ad8531cb3Daniel Dunbar
87475358d267256022475371416654b056ad8531cb3Daniel Dunbar  return *T;
87575358d267256022475371416654b056ad8531cb3Daniel Dunbar}
87611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
877e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
878e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
879e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanAuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)
880e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  : Generic_GCC(Host, Triple) {
881e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
882ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getProgramPaths().push_back(getDriver().Dir);
883e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
884ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
885e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/lib");
886e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/sfw/lib");
887e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib");
8887adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
889e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
890e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
891e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
892e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const {
893e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Action::ActionClass Key;
894ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
895e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Key = Action::AnalyzeJobClass;
896e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  else
897e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Key = JA.getKind();
898e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
899e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Tool *&T = Tools[Key];
900e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!T) {
901e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    switch (Key) {
902e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::AssembleJobClass:
903e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Assemble(*this); break;
904e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::LinkJobClass:
905e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Link(*this); break;
906e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    default:
907e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = &Generic_GCC::SelectTool(C, JA);
908e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
909e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
910e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
911e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  return *T;
912e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
913e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
914e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
9156b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment).
9166b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
9176b3454a219cee5ef36c4668961f93a5c32deab61Eli FriedmanLinux::Linux(const HostInfo &Host, const llvm::Triple& Triple)
9186b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  : Generic_GCC(Host, Triple) {
919ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib/clang/1.0/");
9206b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  getFilePaths().push_back("/lib/");
9216b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  getFilePaths().push_back("/usr/lib/");
922a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar
923a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  // Depending on the Linux distribution, any combination of lib{,32,64} is
924a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  // possible. E.g. Debian uses lib and lib32 for mixed i386/x86-64 systems,
925a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  // openSUSE uses lib and lib64 for the same purpose.
926a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/lib32/");
927a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/usr/lib32/");
928a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/lib64/");
929a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/usr/lib64/");
930a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar
9316b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // FIXME: Figure out some way to get gcc's libdir
9326b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // (e.g. /usr/lib/gcc/i486-linux-gnu/4.3/ for Ubuntu 32-bit); we need
9336b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // crtbegin.o/crtend.o/etc., and want static versions of various
9346b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // libraries. If we had our own crtbegin.o/crtend.o/etc, we could probably
9356b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // get away with using shared versions in /usr/lib, though.
9366b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // We could fall back to the approach we used for includes (a massive
9376b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // list), but that's messy at best.
9386b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}
9396b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
94011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
94111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
942cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarDragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
943cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  : Generic_GCC(Host, Triple) {
94411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
94511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // Path mangling to find libexec
946ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getProgramPaths().push_back(getDriver().Dir);
94711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
948ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
94911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib");
95011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib/gcc41");
95111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
95211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
95311e1b40d759a643086f590f6ffbd9d68360bad46Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const {
95411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Action::ActionClass Key;
955ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
95611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Key = Action::AnalyzeJobClass;
95711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  else
95811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Key = JA.getKind();
95911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
96011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Tool *&T = Tools[Key];
96111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!T) {
96211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    switch (Key) {
96311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::AssembleJobClass:
96411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Assemble(*this); break;
96511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::LinkJobClass:
96611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Link(*this); break;
96711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    default:
96811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
96911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
97011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
97111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
97211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  return *T;
97311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
974