ToolChains.cpp revision 9d0863b22faef1678eb191bbab7268809be60a96
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"
140f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar#include "clang/Driver/Compilation.h"
15c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/Driver.h"
164e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
17c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/HostInfo.h"
1827e738d0d3f781672a5999d2a9e2827b00a97d0cDaniel Dunbar#include "clang/Driver/OptTable.h"
194e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/Option.h"
20265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h"
21c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
22c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h"
2384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
24ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar#include "llvm/Support/raw_ostream.h"
25c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/System/Path.h"
26c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
27f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv
28f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar
293917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver;
303917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains;
313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
32f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain for i386 and x86_64.
338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
34f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple,
35cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar               const unsigned (&_DarwinVersion)[3])
36cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar  : ToolChain(Host, Triple), TargetInitialized(false)
371d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
3802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  llvm::raw_string_ostream(MacosxVersionMin)
395435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar    << "10." << std::max(0, (int)_DarwinVersion[0] - 4) << '.'
405435fc9739e9ac4baede460cf5e7489886948af5Daniel Dunbar    << _DarwinVersion[1];
411d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
421d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
43eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this?
44eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) {
45eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv6k")
46eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv6";
47eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
48eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv5tej")
49eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv5";
50eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
51eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "xscale")
52eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "xscale";
53eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
54eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv4t")
55eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv4t";
56eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
57eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" ||
58eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" ||
59eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "armv7m")
60eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv7";
61eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
62eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  return 0;
63eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
64eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
65eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this?
66eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) {
67eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" ||
68eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm946e-s" || Value == "arm966e-s" ||
69eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm968e-s" || Value == "arm10e" ||
70eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" ||
71eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm1026ej-s")
72eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv5";
73eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
74eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "xscale")
75eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "xscale";
76eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
77eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "arm1136j-s" || Value == "arm1136jf-s" ||
78eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm1176jz-s" || Value == "arm1176jzf-s")
79eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv6";
80eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
81eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3")
82eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv7";
83eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
84eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  return 0;
85eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
86eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
87eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarllvm::StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
88eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  switch (getTriple().getArch()) {
89eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  default:
90eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return getArchName();
91eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
92eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  case llvm::Triple::arm: {
93eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
94eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
95eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
96eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
97eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
98eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
99eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
100eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
101eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "arm";
102eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
103eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
104eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
105eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
1061d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple,
1071d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                     const unsigned (&DarwinVersion)[3],
108cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar                     const unsigned (&_GCCVersion)[3])
109cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar  : Darwin(Host, Triple, DarwinVersion)
1101d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
1111d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  GCCVersion[0] = _GCCVersion[0];
1121d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  GCCVersion[1] = _GCCVersion[1];
1131d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  GCCVersion[2] = _GCCVersion[2];
1141d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
1151d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Set up the tool chain paths to match gcc.
116c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir = "i686-apple-darwin";
11755bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek  ToolChainDir += llvm::utostr(DarwinVersion[0]);
118c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += "/";
119c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[0]);
120c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += '.';
121c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[1]);
122c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += '.';
123c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[2]);
124c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
12574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar  // Try the next major version if that tool chain dir is invalid.
126080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar  std::string Tmp = "/usr/lib/gcc/" + ToolChainDir;
127080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar  if (!llvm::sys::Path(Tmp).exists()) {
12874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    std::string Next = "i686-apple-darwin";
12974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(DarwinVersion[0] + 1);
13074782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += "/";
13174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[0]);
13274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += '.';
13374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[1]);
13474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += '.';
13574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[2]);
13674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar
13774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    // Use that if it exists, otherwise hope the user isn't linking.
13874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    //
13974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    // FIXME: Drop dependency on gcc's tool chain.
140080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar    Tmp = "/usr/lib/gcc/" + Next;
141080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar    if (llvm::sys::Path(Tmp).exists())
14274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar      ToolChainDir = Next;
14374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar  }
14474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar
145c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  std::string Path;
146c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  if (getArchName() == "x86_64") {
147ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    Path = getDriver().Dir;
148c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/../lib/gcc/";
1496b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    Path += ToolChainDir;
150c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/x86_64";
151c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    getFilePaths().push_back(Path);
152c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
153c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path = "/usr/lib/gcc/";
1546b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    Path += ToolChainDir;
155c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/x86_64";
156c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    getFilePaths().push_back(Path);
157c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  }
1581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
159ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  Path = getDriver().Dir;
160c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path += "/../lib/gcc/";
1616b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
162c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getFilePaths().push_back(Path);
163c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
164c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path = "/usr/lib/gcc/";
1656b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
166c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getFilePaths().push_back(Path);
167c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
168ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  Path = getDriver().Dir;
169c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path += "/../libexec/gcc/";
1706b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
171c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getProgramPaths().push_back(Path);
172c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
173c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path = "/usr/libexec/gcc/";
1746b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
175c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getProgramPaths().push_back(Path);
176c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
177ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getProgramPaths().push_back(getDriver().Dir);
178c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
179c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
180f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() {
1818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // Free tool implementations.
1828eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
1838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    delete it->second;
1858eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
1868eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
187f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarTool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const {
1888eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Action::ActionClass Key;
189ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    Key = Action::AnalyzeJobClass;
1918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  else
1928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    Key = JA.getKind();
1938eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1940f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  // FIXME: This doesn't belong here, but ideally we will support static soon
1950f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  // anyway.
1960f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) ||
1970f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar                    C.getArgs().hasArg(options::OPT_static) ||
1980f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar                    C.getArgs().hasArg(options::OPT_fapple_kext));
1990f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic;
2000f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
2010f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar                                             options::OPT_no_integrated_as,
2020f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar                                             IsIADefault);
2030f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar
2048eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Tool *&T = Tools[Key];
2058eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (!T) {
2068eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    switch (Key) {
2078eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
2088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
2098eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      assert(0 && "Invalid tool kind.");
2108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::PreprocessJobClass:
2119120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar      T = new tools::darwin::Preprocess(*this); break;
2128eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::AnalyzeJobClass:
2138eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::Clang(*this); break;
2149120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    case Action::PrecompileJobClass:
2158eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::CompileJobClass:
2169120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar      T = new tools::darwin::Compile(*this); break;
2170f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar    case Action::AssembleJobClass: {
2180f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      if (UseIntegratedAs)
2190f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar        T = new tools::ClangAs(*this);
2200f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      else
2210f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar        T = new tools::darwin::Assemble(*this);
2220f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      break;
2230f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar    }
2248eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LinkJobClass:
2258f28962de22867d372e5e454c33dcaaede860482Daniel Dunbar      T = new tools::darwin::Link(*this); break;
2268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
2278eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
2286e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    case Action::DsymutilJobClass:
2296e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar      T = new tools::darwin::Dsymutil(*this); break;
2308eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    }
2318eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  }
2328eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2338eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return *T;
2348eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
2358eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2361d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args,
2371d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                      ArgStringList &CmdArgs) const {
238e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  std::string Tmp;
239e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar
2406b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  // FIXME: Derive these correctly.
2416b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  if (getArchName() == "x86_64") {
2426b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
2436b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                         "/x86_64"));
2446b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    // Intentionally duplicated for (temporary) gcc bug compatibility.
2456b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
2466b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                         "/x86_64"));
2476b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  }
2488bc9c550128c0662a04234dc262628c54c76b1eaDaniel Dunbar
2496b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir));
250e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar
251e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib/gcc/" + ToolChainDir;
252e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
253e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
254e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib/gcc";
255e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
256e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
2576b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir));
2586b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  // Intentionally duplicated for (temporary) gcc bug compatibility.
2596b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir));
260e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib/" + ToolChainDir;
261e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
262e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
263e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib";
264e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
265e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
2666b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
2676b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                       "/../../../" + ToolChainDir));
2686b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
2696b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                       "/../../.."));
2706b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar}
2716b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
2721d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args,
2731d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                      ArgStringList &CmdArgs) const {
274ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar  // Note that this routine is only used for targetting OS X.
2756cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
2766cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  // Derived from libgcc and lib specs but refactored.
2776cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
2786cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    CmdArgs.push_back("-lgcc_static");
2796cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  } else {
2806cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    if (Args.hasArg(options::OPT_static_libgcc)) {
2816cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc_eh");
2826cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
2836cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      // Derived from darwin_iphoneos_libgcc spec.
284251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar      if (isTargetIPhoneOS()) {
2856cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.1");
2866cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      } else {
2876cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
2886cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      }
2896cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else if (Args.hasArg(options::OPT_shared_libgcc) ||
2908a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar               Args.hasFlag(options::OPT_fexceptions,
2918a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar                            options::OPT_fno_exceptions) ||
2926cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar               Args.hasArg(options::OPT_fgnu_runtime)) {
2936cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      // FIXME: This is probably broken on 10.3?
294ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      if (isMacosxVersionLT(10, 5))
2956cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
296ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      else if (isMacosxVersionLT(10, 6))
2976cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
2986cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else {
299ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      if (isMacosxVersionLT(10, 3, 9))
3006cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        ; // Do nothing.
301ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      else if (isMacosxVersionLT(10, 5))
3026cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
303ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      else if (isMacosxVersionLT(10, 6))
3046cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
3056cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    }
3066cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
307ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isTargetIPhoneOS() || isMacosxVersionLT(10, 6)) {
3086cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc");
3096cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lSystem");
3106cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else {
3116cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lSystem");
3126cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc");
3136cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    }
3146cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  }
3156cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar}
3166cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
3171d4612b829500cbe04a2eafca74afac703e34934Daniel DunbarDarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple,
318cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar                         const unsigned (&DarwinVersion)[3])
319cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar  : Darwin(Host, Triple, DarwinVersion)
3201d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
3211d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
322ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getProgramPaths().push_back(getDriver().Dir);
3231d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
3241d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
3261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                       ArgStringList &CmdArgs) const {
3271d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // The Clang toolchain uses explicit paths for internal libraries.
3281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
3291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
3311d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                        ArgStringList &CmdArgs) const {
332eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Darwin doesn't support real static executables, don't link any runtime
333eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // libraries with -static.
334eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  if (Args.hasArg(options::OPT_static))
3351d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
3361d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3371d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Reject -static-libgcc for now, we can deal with this when and if someone
3381d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // cares. This is useful in situations where someone wants to statically link
3391d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // something like libstdc++, and needs its runtime support routines.
3401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
341ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getDriver().Diag(clang::diag::err_drv_unsupported_opt)
3421d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar      << A->getAsString(Args);
3431d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
3441d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  }
3451d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
346eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Otherwise link libSystem, then the dynamic runtime library, and finally any
347eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // target specific static runtime library.
3481d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  CmdArgs.push_back("-lSystem");
349eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
350eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Select the dynamic runtime library and the target specific static library.
351eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  const char *DarwinStaticLib = 0;
352251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (isTargetIPhoneOS()) {
353eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    CmdArgs.push_back("-lgcc_s.1");
354eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
355eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // We may need some static functions for armv6/thumb which are required to
356eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // be in the same linkage unit as their caller.
357eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    if (getDarwinArchName(Args) == "armv6")
358eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      DarwinStaticLib = "libclang_rt.armv6.a";
359eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  } else {
360eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // The dynamic runtime library was merged with libSystem for 10.6 and
361eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // beyond; only 10.4 and 10.5 need an additional runtime library.
362ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isMacosxVersionLT(10, 5))
363eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.4");
364ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    else if (isMacosxVersionLT(10, 6))
365eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.5");
366eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
367eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // For OS X, we only need a static runtime library when targetting 10.4, to
368eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // provide versions of the static functions which were omitted from
369eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // 10.4.dylib.
370ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isMacosxVersionLT(10, 5))
371eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      DarwinStaticLib = "libclang_rt.10.4.a";
372eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  }
373eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
374eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  /// Add the target specific static library, if needed.
375eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  if (DarwinStaticLib) {
376eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    llvm::sys::Path P(getDriver().ResourceDir);
377eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    P.appendComponent("lib");
378eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    P.appendComponent("darwin");
379eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    P.appendComponent(DarwinStaticLib);
380eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
381eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // For now, allow missing resource libraries to support developers who may
382eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // not have compiler-rt checked out or integrated into their build.
383eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    if (!P.exists())
384eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      getDriver().Diag(clang::diag::warn_drv_missing_resource_library)
385eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar        << P.str();
386eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    else
387eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString(P.str()));
388eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  }
3891d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
3901d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
391279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel DunbarDerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
3920dcb9a3705743ec972af37f48ead81a0939e3958Daniel Dunbar                                      const char *BoundArch) const {
393279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
394ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const OptTable &Opts = getDriver().getOpts();
395ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
396ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // FIXME: We really want to get out of the tool chain level argument
397ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // translation business, as it makes the driver functionality much
398ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // more opaque. For now, we follow gcc closely solely for the
399ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // purpose of easily achieving feature parity & testability. Once we
400ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  // have something that works, we should reevaluate each translation
4011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // and try to push it down into tool specific logic.
402ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
4032603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
4042603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *iPhoneVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
405ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  if (OSXVersion && iPhoneVersion) {
406ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with)
407ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar          << OSXVersion->getAsString(Args)
4081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          << iPhoneVersion->getAsString(Args);
4092603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    iPhoneVersion = 0;
410ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  } else if (!OSXVersion && !iPhoneVersion) {
411816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // If neither OS X nor iPhoneOS targets were specified, check for
412816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // environment defines.
413816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET");
414816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    const char *iPhoneOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET");
415816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
416816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // Ignore empty strings.
417816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    if (OSXTarget && OSXTarget[0] == '\0')
418816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar      OSXTarget = 0;
419816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    if (iPhoneOSTarget && iPhoneOSTarget[0] == '\0')
420816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar      iPhoneOSTarget = 0;
421816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
42239053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // Diagnose conflicting deployment targets, and choose default platform
42339053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // based on the tool chain.
42439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    //
42539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // FIXME: Don't hardcode default here.
42639053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    if (OSXTarget && iPhoneOSTarget) {
42739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      // FIXME: We should see if we can get away with warning or erroring on
42839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      // this. Perhaps put under -pedantic?
42939053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::arm ||
43039053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar          getTriple().getArch() == llvm::Triple::thumb)
43184d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar        OSXTarget = 0;
43239053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      else
43384d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar        iPhoneOSTarget = 0;
43439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    }
4351a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar
43639053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    if (OSXTarget) {
43730392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
4382603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      OSXVersion = DAL->MakeJoinedArg(0, O, OSXTarget);
4392603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      DAL->append(OSXVersion);
440816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    } else if (iPhoneOSTarget) {
44130392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
4422603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      iPhoneVersion = DAL->MakeJoinedArg(0, O, iPhoneOSTarget);
4432603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      DAL->append(iPhoneVersion);
444816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    } else {
445cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar      // Otherwise, choose a default platform based on the tool chain.
446cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar      //
447cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar      // FIXME: Don't hardcode default here.
448cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::arm ||
449cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar          getTriple().getArch() == llvm::Triple::thumb) {
450816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar        const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
451cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar        iPhoneVersion = DAL->MakeJoinedArg(0, O, "3.0");
4522603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        DAL->append(iPhoneVersion);
453816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar      } else {
454816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar        const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
4552603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        OSXVersion = DAL->MakeJoinedArg(0, O, MacosxVersionMin);
4562603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        DAL->append(OSXVersion);
457816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar      }
45830392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    }
459ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  }
4601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4612603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // Set the tool chain target information.
4622603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  unsigned Major, Minor, Micro;
4632603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool HadExtra;
4642603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  if (OSXVersion) {
4652603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(!iPhoneVersion && "Unknown target platform!");
4662603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
4672603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
4682603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        Major != 10 || Minor >= 10 || Micro >= 10)
4692603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      getDriver().Diag(clang::diag::err_drv_invalid_version_number)
4702603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << OSXVersion->getAsString(Args);
4712603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  } else {
4722603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(iPhoneVersion && "Unknown target platform!");
4732603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    if (!Driver::GetReleaseVersion(iPhoneVersion->getValue(Args), Major, Minor,
4742603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
4752603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        Major >= 10 || Minor >= 100 || Micro >= 100)
4762603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      getDriver().Diag(clang::diag::err_drv_invalid_version_number)
4772603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << iPhoneVersion->getAsString(Args);
4782603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
4792603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  setTarget(iPhoneVersion, Major, Minor, Micro);
4802603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
481279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(),
482279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar         ie = Args.end(); it != ie; ++it) {
4834e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    Arg *A = *it;
4844e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
4854e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    if (A->getOption().matches(options::OPT_Xarch__)) {
4864e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // FIXME: Canonicalize name.
4874e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      if (getArchName() != A->getValue(Args, 0))
4884e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
4894e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
4904e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // FIXME: The arg is leaked here, and we should have a nicer
4914e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // interface for this.
4924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      unsigned Prev, Index = Prev = A->getIndex() + 1;
493ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      Arg *XarchArg = Opts.ParseOneArg(Args, Index);
4941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
4954e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // If the argument parsing failed or more than one argument was
4964e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // consumed, the -Xarch_ argument's parameter tried to consume
4974e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // extra arguments. Emit an error and ignore.
4984e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      //
4994e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // We also want to disallow any options which would alter the
5004e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // driver behavior; that isn't going to work in our model. We
5014e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // use isDriverOption() as an approximation, although things
5024e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // like -O4 are going to slip through.
5031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (!XarchArg || Index > Prev + 1 ||
5044e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          XarchArg->getOption().isDriverOption()) {
505ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar       getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument)
5064e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          << A->getAsString(Args);
5074e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
5084e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      }
5094e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
510478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      XarchArg->setBaseArg(A);
5114e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      A = XarchArg;
5121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
5134e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
514ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // Sob. These is strictly gcc compatible for the time being. Apple
515ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // gcc translates options twice, which means that self-expanding
516ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // options add duplicates.
5179e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    switch ((options::ID) A->getOption().getID()) {
518ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    default:
519ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
520ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
521ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
522ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_mkernel:
523ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fapple_kext:
524ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
5259d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
5269d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
527ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
5281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
529ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_dependency_file:
5309d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
5319d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                          A->getValue(Args));
532ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
533ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
534ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gfull:
5359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
5369d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
5379d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar               Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
538ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
539ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
540ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gused:
5419d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
5429d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
5439d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar             Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
544ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
545ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
546ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fterminated_vtables:
547ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_findirect_virtual_calls:
5489d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_fapple_kext));
5499d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
550ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
551ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
552ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_shared:
5539d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
554ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
555ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
556ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fconstant_cfstrings:
5579d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
558ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
559ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
560ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_constant_cfstrings:
5619d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
562ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
563ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
564ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wnonportable_cfstrings:
5659d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
5669d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
567ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
568ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
569ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wno_nonportable_cfstrings:
5709d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
5719d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                   Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
572ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
573ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
574ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fpascal_strings:
5759d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
576ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
577ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
578ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_pascal_strings:
5799d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
580ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
581ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    }
5824e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  }
5834e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
58484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (getTriple().getArch() == llvm::Triple::x86 ||
58584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      getTriple().getArch() == llvm::Triple::x86_64)
586e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
5879d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
58884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
58984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // Add the arch options based on the particular spelling of -arch, to match
59084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // how the driver driver works.
59184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (BoundArch) {
59284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    llvm::StringRef Name = BoundArch;
59384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
59484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    const Option *MArch = Opts.getOption(options::OPT_march_EQ);
59584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
59684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
59784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // which defines the list of which architectures we accept.
59884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    if (Name == "ppc")
59984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
60084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc601")
6019d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "601");
60284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc603")
6039d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "603");
60484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604")
6059d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604");
60684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604e")
6079d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604e");
60884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc750")
6099d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "750");
61084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7400")
6119d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7400");
61284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7450")
6139d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7450");
61484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc970")
6159d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "970");
61684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
61784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc64")
6189d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
61984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
62084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i386")
62184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
62284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i486")
6239d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i486");
62484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i586")
6259d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i586");
62684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i686")
6279d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i686");
62884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium")
6299d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium");
63084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium2")
6319d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
63284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentpro")
6339d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentiumpro");
63484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentIIm3")
6359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
63684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
63784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "x86_64")
6389d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
639ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
64084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "arm")
6419d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
64284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv4t")
6439d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
64484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv5")
6459d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv5tej");
64684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "xscale")
6479d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "xscale");
64884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv6")
6499d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv6k");
65084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv7")
6519d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv7a");
65284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
65384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else
6549f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin      llvm_unreachable("invalid Darwin arch");
65584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  }
656ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
6574e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  return DAL;
6581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
6598eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
660f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const {
6618eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // FIXME: Gross; we should probably have some separate target
6628eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // definition, possibly even reusing the one in clang.
6638eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return getArchName() == "x86_64";
6648eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
6658eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
666f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbarbool Darwin::UseDwarfDebugFlags() const {
667f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
668f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    return S[0] != '\0';
669f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  return false;
670f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar}
671f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
672b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const {
673b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  // Darwin uses SjLj exceptions on ARM.
674b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  return (getTriple().getArch() == llvm::Triple::arm ||
675b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar          getTriple().getArch() == llvm::Triple::thumb);
676b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar}
677b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
678f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetDefaultRelocationModel() const {
6798eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return "pic";
6808eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
6818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
682f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetForcedPicModel() const {
6838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (getArchName() == "x86_64")
6848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    return "pic";
6858eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return 0;
6868eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
6878eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
68843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const {
68943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  // Garbage collection is supported everywhere except on iPhone OS.
69043a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  return !isTargetIPhoneOS();
69143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar}
69243a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
6933917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
6943917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of
6953917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options.
6963917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
697cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarGeneric_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
6981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : ToolChain(Host, Triple) {
699ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getProgramPaths().push_back(getDriver().Dir);
700c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
701c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
7023917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() {
7033917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  // Free tool implementations.
7043917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
7053917608370583fa30c466b6c3893448229aea9adDaniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
7063917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    delete it->second;
7073917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
7083917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7091eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C,
7103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar                              const JobAction &JA) const {
7113917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Action::ActionClass Key;
712ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
7133917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    Key = Action::AnalyzeJobClass;
7143917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  else
7153917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    Key = JA.getKind();
7163917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7173917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Tool *&T = Tools[Key];
7183917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  if (!T) {
7193917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    switch (Key) {
7208eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
7218eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
7223917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      assert(0 && "Invalid tool kind.");
7233917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PreprocessJobClass:
7243917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Preprocess(*this); break;
7253917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PrecompileJobClass:
7263917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Precompile(*this); break;
7273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AnalyzeJobClass:
7283917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::Clang(*this); break;
7293917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::CompileJobClass:
7303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Compile(*this); break;
7313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AssembleJobClass:
7323917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Assemble(*this); break;
7333917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::LinkJobClass:
7343917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Link(*this); break;
7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7368eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // This is a bit ungeneric, but the only platform using a driver
7378eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // driver is Darwin.
7388eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
7398eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
7406e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    case Action::DsymutilJobClass:
7416e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar      T = new tools::darwin::Dsymutil(*this); break;
7423917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    }
7433917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  }
7443917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7453917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return *T;
7463917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
7473917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7483917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const {
7498eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // FIXME: Gross; we should probably have some separate target
7508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // definition, possibly even reusing the one in clang.
7513917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return getArchName() == "x86_64";
7523917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
7533917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7543917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetDefaultRelocationModel() const {
7553917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return "static";
7563917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
7573917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
7583917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetForcedPicModel() const {
7593917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return 0;
7603917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
761f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
7623a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
7633a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
7643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation.
7653a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7663a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple)
7673a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  : ToolChain(Host, Triple) {
7683a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  // Path mangling to find libexec
7693a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  std::string Path(getDriver().Dir);
7703a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7713a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Path += "/../libexec";
7723a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  getProgramPaths().push_back(Path);
7733a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7743a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7753a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() {
7763a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  for (llvm::DenseMap<unsigned, Tool*>::iterator
7773a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner           it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
7783a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      delete it->second;
7793a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7803a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7813a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsMathErrnoDefault() const {
7823a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return true;
7833a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7843a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7853a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsUnwindTablesDefault() const {
7863a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return false;
7873a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7883a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7893a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetDefaultRelocationModel() const {
7903a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return "static";
7913a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7923a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7933a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetForcedPicModel() const {
7943a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return 0;
7953a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
7963a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
7973a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTool &TCEToolChain::SelectTool(const Compilation &C,
7983a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner                            const JobAction &JA) const {
7993a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Action::ActionClass Key;
8003a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Key = Action::AnalyzeJobClass;
8013a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
8023a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Tool *&T = Tools[Key];
8033a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  if (!T) {
8043a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    switch (Key) {
8053a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::PreprocessJobClass:
8063a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::gcc::Preprocess(*this); break;
8073a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::AnalyzeJobClass:
8083a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::Clang(*this); break;
8093a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    default:
8103a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner     assert(false && "Unsupported action for TCE target.");
8113a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    }
8123a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  }
8133a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return *T;
8143a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
8153a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
816f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
817f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
818f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarOpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple)
819f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  : Generic_GCC(Host, Triple) {
820ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
821f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  getFilePaths().push_back("/usr/lib");
822f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
823f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
824f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const {
825f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Action::ActionClass Key;
826ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
827f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Key = Action::AnalyzeJobClass;
828f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  else
829f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Key = JA.getKind();
830f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
831f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Tool *&T = Tools[Key];
832f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!T) {
833f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    switch (Key) {
834f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    case Action::AssembleJobClass:
835f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = new tools::openbsd::Assemble(*this); break;
836f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    case Action::LinkJobClass:
837f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = new tools::openbsd::Link(*this); break;
838f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    default:
839f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
840f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
841f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
842f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
843f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  return *T;
844f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
845f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
84675358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
84775358d267256022475371416654b056ad8531cb3Daniel Dunbar
848cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarFreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple, bool Lib32)
849cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  : Generic_GCC(Host, Triple) {
850bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  if (Lib32) {
851ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getFilePaths().push_back(getDriver().Dir + "/../lib32");
852bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar    getFilePaths().push_back("/usr/lib32");
853bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  } else {
854ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getFilePaths().push_back(getDriver().Dir + "/../lib");
855bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar    getFilePaths().push_back("/usr/lib");
856bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  }
85775358d267256022475371416654b056ad8531cb3Daniel Dunbar}
85875358d267256022475371416654b056ad8531cb3Daniel Dunbar
85975358d267256022475371416654b056ad8531cb3Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const {
86075358d267256022475371416654b056ad8531cb3Daniel Dunbar  Action::ActionClass Key;
861ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
86275358d267256022475371416654b056ad8531cb3Daniel Dunbar    Key = Action::AnalyzeJobClass;
86375358d267256022475371416654b056ad8531cb3Daniel Dunbar  else
86475358d267256022475371416654b056ad8531cb3Daniel Dunbar    Key = JA.getKind();
86575358d267256022475371416654b056ad8531cb3Daniel Dunbar
86675358d267256022475371416654b056ad8531cb3Daniel Dunbar  Tool *&T = Tools[Key];
86775358d267256022475371416654b056ad8531cb3Daniel Dunbar  if (!T) {
86875358d267256022475371416654b056ad8531cb3Daniel Dunbar    switch (Key) {
86968a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    case Action::AssembleJobClass:
87068a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar      T = new tools::freebsd::Assemble(*this); break;
871008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    case Action::LinkJobClass:
872008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      T = new tools::freebsd::Link(*this); break;
87375358d267256022475371416654b056ad8531cb3Daniel Dunbar    default:
87475358d267256022475371416654b056ad8531cb3Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
87575358d267256022475371416654b056ad8531cb3Daniel Dunbar    }
87675358d267256022475371416654b056ad8531cb3Daniel Dunbar  }
87775358d267256022475371416654b056ad8531cb3Daniel Dunbar
87875358d267256022475371416654b056ad8531cb3Daniel Dunbar  return *T;
87975358d267256022475371416654b056ad8531cb3Daniel Dunbar}
88011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
881e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
882e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
883e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanAuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)
884e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  : Generic_GCC(Host, Triple) {
885e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
886ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getProgramPaths().push_back(getDriver().Dir);
887e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
888ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
889e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/lib");
890e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/sfw/lib");
891e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib");
8927adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
893e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
894e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
895e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
896e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const {
897e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Action::ActionClass Key;
898ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
899e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Key = Action::AnalyzeJobClass;
900e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  else
901e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Key = JA.getKind();
902e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
903e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Tool *&T = Tools[Key];
904e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!T) {
905e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    switch (Key) {
906e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::AssembleJobClass:
907e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Assemble(*this); break;
908e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::LinkJobClass:
909e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Link(*this); break;
910e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    default:
911e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = &Generic_GCC::SelectTool(C, JA);
912e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
913e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
914e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
915e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  return *T;
916e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
917e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
918e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
9196b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment).
9206b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
9216b3454a219cee5ef36c4668961f93a5c32deab61Eli FriedmanLinux::Linux(const HostInfo &Host, const llvm::Triple& Triple)
9226b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  : Generic_GCC(Host, Triple) {
923ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib/clang/1.0/");
9246b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  getFilePaths().push_back("/lib/");
9256b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  getFilePaths().push_back("/usr/lib/");
926a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar
927a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  // Depending on the Linux distribution, any combination of lib{,32,64} is
928a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  // possible. E.g. Debian uses lib and lib32 for mixed i386/x86-64 systems,
929a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  // openSUSE uses lib and lib64 for the same purpose.
930a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/lib32/");
931a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/usr/lib32/");
932a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/lib64/");
933a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar  getFilePaths().push_back("/usr/lib64/");
934a9822de3a446940274584083c883c21873e89a6fDaniel Dunbar
9356b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // FIXME: Figure out some way to get gcc's libdir
9366b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // (e.g. /usr/lib/gcc/i486-linux-gnu/4.3/ for Ubuntu 32-bit); we need
9376b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // crtbegin.o/crtend.o/etc., and want static versions of various
9386b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // libraries. If we had our own crtbegin.o/crtend.o/etc, we could probably
9396b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // get away with using shared versions in /usr/lib, though.
9406b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // We could fall back to the approach we used for includes (a massive
9416b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman  // list), but that's messy at best.
9426b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}
9436b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
94411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
94511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
946cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarDragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
947cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel Dunbar  : Generic_GCC(Host, Triple) {
94811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
94911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // Path mangling to find libexec
950ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getProgramPaths().push_back(getDriver().Dir);
95111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
952ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
95311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib");
95411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib/gcc41");
95511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
95611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
95711e1b40d759a643086f590f6ffbd9d68360bad46Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const {
95811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Action::ActionClass Key;
959ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
96011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Key = Action::AnalyzeJobClass;
96111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  else
96211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Key = JA.getKind();
96311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
96411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Tool *&T = Tools[Key];
96511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!T) {
96611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    switch (Key) {
96711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::AssembleJobClass:
96811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Assemble(*this); break;
96911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::LinkJobClass:
97011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Link(*this); break;
97111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    default:
97211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
97311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
97411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
97511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
97611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  return *T;
97711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
978