ToolChains.cpp revision 0a84aee0a3ada448fb4ae5fd4964791d42a501b3
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"
2134916dbb1018dc7a7f42a339923f5b73762e9872Douglas Gregor#include "clang/Basic/Version.h"
22c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
2300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "llvm/ADT/SmallString.h"
24c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h"
2584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
26c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola#include "llvm/Support/MemoryBuffer.h"
27ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar#include "llvm/Support/raw_ostream.h"
28c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/System/Path.h"
29c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
30f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv
31f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar
323917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver;
333917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains;
343917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
35f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbar/// Darwin - Darwin tool chain for i386 and x86_64.
368eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
3725b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel DunbarDarwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple)
38cc8e1894109b7c02258b7f4be5624d3d8d1523ceDaniel Dunbar  : ToolChain(Host, Triple), TargetInitialized(false)
391d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
4025b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  // Compute the initial Darwin version based on the host.
4125b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  bool HadExtra;
4225b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  std::string OSName = Triple.getOSName();
4325b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  if (!Driver::GetReleaseVersion(&OSName[6],
4425b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar                                 DarwinVersion[0], DarwinVersion[1],
4525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar                                 DarwinVersion[2], HadExtra))
4625b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar    getDriver().Diag(clang::diag::err_drv_invalid_darwin_version) << OSName;
4725b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar
4802633b541b04ad5ffc1c70f4c2feeeb13e607057Daniel Dunbar  llvm::raw_string_ostream(MacosxVersionMin)
4925b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar    << "10." << std::max(0, (int)DarwinVersion[0] - 4) << '.'
5025b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar    << DarwinVersion[1];
511d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
521d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
534180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbartypes::ID Darwin::LookupTypeForExtension(const char *Ext) const {
544180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  types::ID Ty = types::lookupTypeForExtension(Ext);
554180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
564180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  // Darwin always preprocesses assembly files (unless -x is used explicitly).
574180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  if (Ty == types::TY_PP_Asm)
584180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar    return types::TY_Asm;
594180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
604180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  return Ty;
614180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar}
624180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
63b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbarbool Darwin::HasNativeLLVMSupport() const {
64b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar  return true;
65b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar}
66b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar
67eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this?
68eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMArch(llvm::StringRef Value) {
69eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv6k")
70eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv6";
71eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
72eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv5tej")
73eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv5";
74eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
75eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "xscale")
76eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "xscale";
77eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
78eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv4t")
79eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv4t";
80eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
81eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" ||
82eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" ||
83eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "armv7m")
84eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv7";
85eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
86eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  return 0;
87eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
88eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
89eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar// FIXME: Can we tablegen this?
90eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarstatic const char *GetArmArchForMCpu(llvm::StringRef Value) {
91eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" ||
92eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm946e-s" || Value == "arm966e-s" ||
93eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm968e-s" || Value == "arm10e" ||
94eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" ||
95eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm1026ej-s")
96eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv5";
97eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
98eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "xscale")
99eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "xscale";
100eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
101eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "arm1136j-s" || Value == "arm1136jf-s" ||
102eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      Value == "arm1176jz-s" || Value == "arm1176jzf-s")
103eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv6";
104eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
105eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3")
106eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "armv7";
107eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
108eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  return 0;
109eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
110eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
111eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbarllvm::StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
112eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  switch (getTriple().getArch()) {
113eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  default:
114eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return getArchName();
115eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
116eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  case llvm::Triple::arm: {
117eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
118eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
119eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
120eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
121eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
122eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar      if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
123eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
124eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
125eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "arm";
126eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
127eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
128eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
129eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
13025b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel DunbarDarwinGCC::DarwinGCC(const HostInfo &Host, const llvm::Triple& Triple)
13125b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  : Darwin(Host, Triple)
1321d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
133c2bda62f0ccbfc22651d9d986282c497afc9be1dDaniel Dunbar  // We can only work with 4.2.1 currently.
134c2bda62f0ccbfc22651d9d986282c497afc9be1dDaniel Dunbar  GCCVersion[0] = 4;
135c2bda62f0ccbfc22651d9d986282c497afc9be1dDaniel Dunbar  GCCVersion[1] = 2;
136c2bda62f0ccbfc22651d9d986282c497afc9be1dDaniel Dunbar  GCCVersion[2] = 1;
1371d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
1381d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Set up the tool chain paths to match gcc.
139c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir = "i686-apple-darwin";
14055bac5339154cedc7541b5648f9c3486e547b45cTed Kremenek  ToolChainDir += llvm::utostr(DarwinVersion[0]);
141c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += "/";
142c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[0]);
143c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += '.';
144c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[1]);
145c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += '.';
146c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  ToolChainDir += llvm::utostr(GCCVersion[2]);
147c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
14874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar  // Try the next major version if that tool chain dir is invalid.
149080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar  std::string Tmp = "/usr/lib/gcc/" + ToolChainDir;
150080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar  if (!llvm::sys::Path(Tmp).exists()) {
15174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    std::string Next = "i686-apple-darwin";
15274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(DarwinVersion[0] + 1);
15374782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += "/";
15474782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[0]);
15574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += '.';
15674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[1]);
15774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += '.';
15874782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    Next += llvm::utostr(GCCVersion[2]);
15974782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar
16074782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    // Use that if it exists, otherwise hope the user isn't linking.
16174782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    //
16274782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar    // FIXME: Drop dependency on gcc's tool chain.
163080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar    Tmp = "/usr/lib/gcc/" + Next;
164080fb19301b1d0ce4149d99b8961e77f7ed4bb2eDaniel Dunbar    if (llvm::sys::Path(Tmp).exists())
16574782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar      ToolChainDir = Next;
16674782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar  }
16774782b066ecfb0ee05b34ef3a29e24d39c59c1bdDaniel Dunbar
168c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  std::string Path;
169c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  if (getArchName() == "x86_64") {
170ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    Path = getDriver().Dir;
171c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/../lib/gcc/";
1726b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    Path += ToolChainDir;
173c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/x86_64";
174c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    getFilePaths().push_back(Path);
175c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
176c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path = "/usr/lib/gcc/";
1776b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    Path += ToolChainDir;
178c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    Path += "/x86_64";
179c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar    getFilePaths().push_back(Path);
180c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  }
1811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
182ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  Path = getDriver().Dir;
183c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path += "/../lib/gcc/";
1846b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
185c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getFilePaths().push_back(Path);
186c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
187c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path = "/usr/lib/gcc/";
1886b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
189c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getFilePaths().push_back(Path);
190c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
191ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  Path = getDriver().Dir;
192c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path += "/../libexec/gcc/";
1936b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
194c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getProgramPaths().push_back(Path);
195c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
196c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  Path = "/usr/libexec/gcc/";
1976b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  Path += ToolChainDir;
198c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar  getProgramPaths().push_back(Path);
199c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
200edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
201edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir)
202edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
203c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
204c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
205f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() {
2068eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // Free tool implementations.
2078eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
2088eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
2098eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    delete it->second;
2108eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
2118eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
21200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstd::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args) const {
21300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  llvm::Triple Triple(ComputeLLVMTriple(Args));
21400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
21500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // If the target isn't initialized (e.g., an unknown Darwin platform, return
21600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // the default triple).
21700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  if (!isTargetInitialized())
21800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return Triple.getTriple();
21900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
22000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  unsigned Version[3];
22100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  getTargetVersion(Version);
22200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
22300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // Mangle the target version into the OS triple component.  For historical
22400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // reasons that make little sense, the version passed here is the "darwin"
22500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // version, which drops the 10 and offsets by 4. See inverse code when
22600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // setting the OS version preprocessor define.
22700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  if (!isTargetIPhoneOS()) {
22800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    Version[0] = Version[1] + 4;
22900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    Version[1] = Version[2];
23000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    Version[2] = 0;
23100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  } else {
23200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    // Use the environment to communicate that we are targetting iPhoneOS.
23300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    Triple.setEnvironmentName("iphoneos");
23400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  }
23500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
23600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  llvm::SmallString<16> Str;
23700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  llvm::raw_svector_ostream(Str) << "darwin" << Version[0]
23800577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar                                 << "." << Version[1] << "." << Version[2];
23900577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  Triple.setOSName(Str.str());
24000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
24100577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  return Triple.getTriple();
24200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
24300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
244f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarTool &Darwin::SelectTool(const Compilation &C, const JobAction &JA) const {
2458eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Action::ActionClass Key;
246ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
2478eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    Key = Action::AnalyzeJobClass;
2488eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  else
2498eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    Key = JA.getKind();
2508eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2510f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  // FIXME: This doesn't belong here, but ideally we will support static soon
2520f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  // anyway.
2530f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) ||
2540f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar                    C.getArgs().hasArg(options::OPT_static) ||
2550f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar                    C.getArgs().hasArg(options::OPT_fapple_kext));
2560f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic;
2570f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
2580f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar                                             options::OPT_no_integrated_as,
2590f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar                                             IsIADefault);
2600f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar
2618eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  Tool *&T = Tools[Key];
2628eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (!T) {
2638eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    switch (Key) {
2648eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
2658eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
2668eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      assert(0 && "Invalid tool kind.");
2678eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::PreprocessJobClass:
2689120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar      T = new tools::darwin::Preprocess(*this); break;
2698eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::AnalyzeJobClass:
2708eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::Clang(*this); break;
2719120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar    case Action::PrecompileJobClass:
2728eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::CompileJobClass:
2739120f179fd2e354f067e4ef2c76dcf3fc4db8a16Daniel Dunbar      T = new tools::darwin::Compile(*this); break;
2740f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar    case Action::AssembleJobClass: {
2750f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      if (UseIntegratedAs)
2760f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar        T = new tools::ClangAs(*this);
2770f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      else
2780f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar        T = new tools::darwin::Assemble(*this);
2790f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar      break;
2800f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar    }
2818eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LinkJobClass:
2828f28962de22867d372e5e454c33dcaaede860482Daniel Dunbar      T = new tools::darwin::Link(*this); break;
2838eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
2848eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
2856e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    case Action::DsymutilJobClass:
2866e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar      T = new tools::darwin::Dsymutil(*this); break;
2878eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    }
2888eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  }
2898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return *T;
2918eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
2928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
2931d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkSearchPathArgs(const ArgList &Args,
2941d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                      ArgStringList &CmdArgs) const {
295e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  std::string Tmp;
296e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar
2976b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  // FIXME: Derive these correctly.
2986b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  if (getArchName() == "x86_64") {
2996b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
3006b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                         "/x86_64"));
3016b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    // Intentionally duplicated for (temporary) gcc bug compatibility.
3026b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
3036b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                         "/x86_64"));
3046b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  }
305eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar
3066b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/" + ToolChainDir));
307e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar
308e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib/gcc/" + ToolChainDir;
309e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
310e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
311e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib/gcc";
312e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
313e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
3146b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir));
3156b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  // Intentionally duplicated for (temporary) gcc bug compatibility.
3166b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir));
317e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib/" + ToolChainDir;
318e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
319e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
320e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  Tmp = getDriver().Dir + "/../lib";
321e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar  if (llvm::sys::Path(Tmp).exists())
322e3c153a88a21e620446955705a7fc8215b4cc2f2Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + Tmp));
3236b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
3246b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                       "/../../../" + ToolChainDir));
3256b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar  CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc/" + ToolChainDir +
3266b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar                                       "/../../.."));
3276b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar}
3286b200b2b698b6ac9e310f2225c69c85d28ae4fb0Daniel Dunbar
3291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinGCC::AddLinkRuntimeLibArgs(const ArgList &Args,
3301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                      ArgStringList &CmdArgs) const {
331ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar  // Note that this routine is only used for targetting OS X.
3326cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
3336cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  // Derived from libgcc and lib specs but refactored.
3346cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  if (Args.hasArg(options::OPT_static)) {
3356cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    CmdArgs.push_back("-lgcc_static");
3366cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  } else {
3376cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    if (Args.hasArg(options::OPT_static_libgcc)) {
3386cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc_eh");
3396cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else if (Args.hasArg(options::OPT_miphoneos_version_min_EQ)) {
3406cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      // Derived from darwin_iphoneos_libgcc spec.
341251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar      if (isTargetIPhoneOS()) {
3426cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.1");
3436cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      } else {
3446cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
3456cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      }
3466cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else if (Args.hasArg(options::OPT_shared_libgcc) ||
3478a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar               Args.hasFlag(options::OPT_fexceptions,
3488a0d94d2ef8cbc93f9d6ecae2816c7a8db102f53Daniel Dunbar                            options::OPT_fno_exceptions) ||
3496cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar               Args.hasArg(options::OPT_fgnu_runtime)) {
3506cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      // FIXME: This is probably broken on 10.3?
351ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      if (isMacosxVersionLT(10, 5))
3526cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
353ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      else if (isMacosxVersionLT(10, 6))
3546cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
3556cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else {
356ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      if (isMacosxVersionLT(10, 3, 9))
3576cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        ; // Do nothing.
358ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      else if (isMacosxVersionLT(10, 5))
3596cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.4");
360ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar      else if (isMacosxVersionLT(10, 6))
3616cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar        CmdArgs.push_back("-lgcc_s.10.5");
3626cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    }
3636cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
364ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isTargetIPhoneOS() || isMacosxVersionLT(10, 6)) {
3656cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc");
3666cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lSystem");
3676cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    } else {
3686cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lSystem");
3696cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar      CmdArgs.push_back("-lgcc");
3706cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar    }
3716cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar  }
3726cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar}
3736cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
37425b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel DunbarDarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple)
37525b58eb7998ed947bc1c07e70de0b5d8f6aff857Daniel Dunbar  : Darwin(Host, Triple)
3761d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar{
3770e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
3780e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir)
3790e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
3800e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar
3811d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
382edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
383edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir)
384edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
3850e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar
3860e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  // For fallback, we need to know how to find the GCC cc1 executables, so we
3870e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  // also add the GCC libexec paths. This is legiy code that can be removed once
3880e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  // fallback is no longer useful.
3890e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  std::string ToolChainDir = "i686-apple-darwin";
3900e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  ToolChainDir += llvm::utostr(DarwinVersion[0]);
3910e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  ToolChainDir += "/4.2.1";
3920e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar
3930e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  std::string Path = getDriver().Dir;
3940e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  Path += "/../libexec/gcc/";
3950e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  Path += ToolChainDir;
3960e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  getProgramPaths().push_back(Path);
3970e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar
3980e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  Path = "/usr/libexec/gcc/";
3990e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  Path += ToolChainDir;
4000e50ee4b94929ff172099bbd0c1029721ac79bc2Daniel Dunbar  getProgramPaths().push_back(Path);
4011d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
4021d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
4031d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
4041d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                       ArgStringList &CmdArgs) const {
4051d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // The Clang toolchain uses explicit paths for internal libraries.
406424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar
407424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  // Unfortunately, we still might depend on a few of the libraries that are
408424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  // only available in the gcc library directory (in particular
409424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  // libstdc++.dylib). For now, hardcode the path to the known install location.
410424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  llvm::sys::Path P(getDriver().Dir);
411424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  P.eraseComponent(); // .../usr/bin -> ../usr
412424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  P.appendComponent("lib");
413424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  P.appendComponent("gcc");
414424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  switch (getTriple().getArch()) {
415424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  default:
416424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    assert(0 && "Invalid Darwin arch!");
417424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::x86:
418424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::x86_64:
419424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    P.appendComponent("i686-apple-darwin10");
420424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    break;
421424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::arm:
422424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::thumb:
423424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    P.appendComponent("arm-apple-darwin10");
424424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    break;
425424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::ppc:
426424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  case llvm::Triple::ppc64:
427424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    P.appendComponent("powerpc-apple-darwin10");
428424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    break;
429424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  }
430424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  P.appendComponent("4.2.1");
431eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar
432eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  // Determine the arch specific GCC subdirectory.
433eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  const char *ArchSpecificDir = 0;
434eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  switch (getTriple().getArch()) {
435eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  default:
436eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    break;
437eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  case llvm::Triple::arm:
4383a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar  case llvm::Triple::thumb: {
4393a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar    std::string Triple = ComputeLLVMTriple(Args);
4403a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar    llvm::StringRef TripleStr = Triple;
4413a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar    if (TripleStr.startswith("armv5") || TripleStr.startswith("thumbv5"))
4423a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar      ArchSpecificDir = "v5";
4433a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar    else if (TripleStr.startswith("armv6") || TripleStr.startswith("thumbv6"))
4443a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar      ArchSpecificDir = "v6";
4453a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar    else if (TripleStr.startswith("armv7") || TripleStr.startswith("thumbv7"))
4463a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar      ArchSpecificDir = "v7";
447eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    break;
4483a0e3926b8824076cf5c2f9c96883e72fd84c9cbDaniel Dunbar  }
449eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  case llvm::Triple::ppc64:
450eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    ArchSpecificDir = "ppc64";
451eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    break;
452eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  case llvm::Triple::x86_64:
453eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    ArchSpecificDir = "x86_64";
454eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    break;
455eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  }
456eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar
457eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  if (ArchSpecificDir) {
458eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    P.appendComponent(ArchSpecificDir);
459eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    if (P.exists())
460eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
461eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar    P.eraseComponent();
462eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar  }
463eab3bc4f0b51b6558c85eb6a8079f327573790baDaniel Dunbar
464424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar  if (P.exists())
465424b6613a9e5631d61c4c8ed2f1601457b64bfd4Daniel Dunbar    CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
4661d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
4671d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
4681d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
4691d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                        ArgStringList &CmdArgs) const {
470eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Darwin doesn't support real static executables, don't link any runtime
471eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // libraries with -static.
472eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  if (Args.hasArg(options::OPT_static))
4731d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
4741d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
4751d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Reject -static-libgcc for now, we can deal with this when and if someone
4761d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // cares. This is useful in situations where someone wants to statically link
4771d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // something like libstdc++, and needs its runtime support routines.
4781d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
479ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getDriver().Diag(clang::diag::err_drv_unsupported_opt)
4801d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar      << A->getAsString(Args);
4811d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
4821d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  }
4831d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
484eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Otherwise link libSystem, then the dynamic runtime library, and finally any
485eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // target specific static runtime library.
4861d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  CmdArgs.push_back("-lSystem");
487eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
488eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Select the dynamic runtime library and the target specific static library.
489eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  const char *DarwinStaticLib = 0;
490251ca6c9fb2bb398d9bf9fe7399c27bed7074b5cDaniel Dunbar  if (isTargetIPhoneOS()) {
491eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    CmdArgs.push_back("-lgcc_s.1");
492eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
493eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // We may need some static functions for armv6/thumb which are required to
494eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // be in the same linkage unit as their caller.
495eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    if (getDarwinArchName(Args) == "armv6")
496eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      DarwinStaticLib = "libclang_rt.armv6.a";
497eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  } else {
498eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // The dynamic runtime library was merged with libSystem for 10.6 and
499eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // beyond; only 10.4 and 10.5 need an additional runtime library.
500ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isMacosxVersionLT(10, 5))
501eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.4");
502ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    else if (isMacosxVersionLT(10, 6))
503eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.5");
504eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
505885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // For OS X, we thought we would only need a static runtime library when
506885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // targetting 10.4, to provide versions of the static functions which were
507885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // omitted from 10.4.dylib.
508885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    //
509885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // Unfortunately, that turned out to not be true, because Darwin system
510885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // headers can still use eprintf on i386, and it is not exported from
511885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // libSystem. Therefore, we still must provide a runtime library just for
512885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // the tiny tiny handful of projects that *might* use that symbol.
513885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    if (isMacosxVersionLT(10, 5)) {
514eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      DarwinStaticLib = "libclang_rt.10.4.a";
515885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    } else {
516885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::x86)
517885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar        DarwinStaticLib = "libclang_rt.eprintf.a";
518885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    }
519eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  }
520eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
521eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  /// Add the target specific static library, if needed.
522eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  if (DarwinStaticLib) {
523eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    llvm::sys::Path P(getDriver().ResourceDir);
524eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    P.appendComponent("lib");
525eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    P.appendComponent("darwin");
526eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    P.appendComponent(DarwinStaticLib);
527eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
528eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // For now, allow missing resource libraries to support developers who may
529eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // not have compiler-rt checked out or integrated into their build.
530362ed7052071245c6c1b15d59c1973f8c80b0b2aDaniel Dunbar    if (P.exists())
531eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back(Args.MakeArgString(P.str()));
532eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  }
5331d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
5341d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
53560baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbarvoid Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
536ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const OptTable &Opts = getDriver().getOpts();
537ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
5382603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
5392603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *iPhoneVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
540ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  if (OSXVersion && iPhoneVersion) {
541ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getDriver().Diag(clang::diag::err_drv_argument_not_allowed_with)
542ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar          << OSXVersion->getAsString(Args)
5431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump          << iPhoneVersion->getAsString(Args);
5442603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    iPhoneVersion = 0;
545ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar  } else if (!OSXVersion && !iPhoneVersion) {
546816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // If neither OS X nor iPhoneOS targets were specified, check for
547816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // environment defines.
548816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET");
549816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    const char *iPhoneOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET");
550816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
551816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // Ignore empty strings.
552816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    if (OSXTarget && OSXTarget[0] == '\0')
553816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar      OSXTarget = 0;
554816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    if (iPhoneOSTarget && iPhoneOSTarget[0] == '\0')
555816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar      iPhoneOSTarget = 0;
556816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
55739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // Diagnose conflicting deployment targets, and choose default platform
55839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // based on the tool chain.
55939053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    //
56039053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // FIXME: Don't hardcode default here.
56139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    if (OSXTarget && iPhoneOSTarget) {
56239053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      // FIXME: We should see if we can get away with warning or erroring on
56339053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      // this. Perhaps put under -pedantic?
56439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::arm ||
56539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar          getTriple().getArch() == llvm::Triple::thumb)
56684d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar        OSXTarget = 0;
56739053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      else
56884d1e6e443b90275539a4e5b2dd94ae63c5ff19aDaniel Dunbar        iPhoneOSTarget = 0;
56939053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    }
5701a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar
57139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    if (OSXTarget) {
57230392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
57360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
57460baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
575816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    } else if (iPhoneOSTarget) {
57630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar      const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
57760baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      iPhoneVersion = Args.MakeJoinedArg(0, O, iPhoneOSTarget);
57860baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(iPhoneVersion);
579816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    } else {
5802bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar      // Otherwise, assume we are targeting OS X.
5812bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar      const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
58260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
58360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
58430392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    }
585ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  }
5861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
5872603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // Set the tool chain target information.
5882603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  unsigned Major, Minor, Micro;
5892603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool HadExtra;
5902603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  if (OSXVersion) {
5912603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(!iPhoneVersion && "Unknown target platform!");
5922603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
5932603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
5942603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        Major != 10 || Minor >= 10 || Micro >= 10)
5952603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      getDriver().Diag(clang::diag::err_drv_invalid_version_number)
5962603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << OSXVersion->getAsString(Args);
5972603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  } else {
5982603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    assert(iPhoneVersion && "Unknown target platform!");
5992603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar    if (!Driver::GetReleaseVersion(iPhoneVersion->getValue(Args), Major, Minor,
6002603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
6012603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        Major >= 10 || Minor >= 100 || Micro >= 100)
6022603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar      getDriver().Diag(clang::diag::err_drv_invalid_version_number)
6032603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << iPhoneVersion->getAsString(Args);
6042603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  }
6052603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  setTarget(iPhoneVersion, Major, Minor, Micro);
606c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar}
607c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
608132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
609efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar                                      ArgStringList &CmdArgs) const {
610efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  CXXStdlibType Type = GetCXXStdlibType(Args);
611efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
612efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  switch (Type) {
613efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libcxx:
614efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lc++");
615efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
616efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
617efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libstdcxx: {
618efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
619efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // it was previously found in the gcc lib dir. However, for all the Darwin
620efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // platforms we care about it was -lstdc++.6, so we search for that
621efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // explicitly if we can't see an obvious -lstdc++ candidate.
622efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
623efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Check in the sysroot first.
624efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
625efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      llvm::sys::Path P(A->getValue(Args));
626efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("usr");
627efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("lib");
628efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      P.appendComponent("libstdc++.dylib");
629efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
630efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      if (!P.exists()) {
631efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        P.eraseComponent();
632efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        P.appendComponent("libstdc++.6.dylib");
633efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        if (P.exists()) {
634efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          CmdArgs.push_back(Args.MakeArgString(P.str()));
635efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          return;
636efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        }
637efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      }
638efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
639efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
640efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, look in the root.
641efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    if (!llvm::sys::Path("/usr/lib/libstdc++.dylib").exists() &&
642efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        llvm::sys::Path("/usr/lib/libstdc++.6.dylib").exists()) {
643efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
644efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      return;
645efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
646efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
647efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, let the linker search.
648efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lstdc++");
649efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
650efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
651efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
652efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar}
653efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
6547433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid DarwinClang::AddCCKextLibArgs(const ArgList &Args,
6557433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                   ArgStringList &CmdArgs) const {
6567433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
6577433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For Darwin platforms, use the compiler-rt-based support library
6587433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // instead of the gcc-provided one (which is also incidentally
6597433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // only present in the gcc lib dir, which makes it hard to find).
6607433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
6617433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  llvm::sys::Path P(getDriver().ResourceDir);
6627433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("lib");
6637433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("darwin");
6647433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  P.appendComponent("libclang_rt.cc_kext.a");
6657433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
6667433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For now, allow missing resource libraries to support developers who may
6677433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // not have compiler-rt checked out or integrated into their build.
668362ed7052071245c6c1b15d59c1973f8c80b0b2aDaniel Dunbar  if (P.exists())
6697433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    CmdArgs.push_back(Args.MakeArgString(P.str()));
6707433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen}
6717433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
672c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel DunbarDerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
673c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar                                      const char *BoundArch) const {
674c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
675c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  const OptTable &Opts = getDriver().getOpts();
676c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
677c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // FIXME: We really want to get out of the tool chain level argument
678c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // translation business, as it makes the driver functionality much
679c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // more opaque. For now, we follow gcc closely solely for the
680c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // purpose of easily achieving feature parity & testability. Once we
681c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // have something that works, we should reevaluate each translation
682c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // and try to push it down into tool specific logic.
6832603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
684279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar  for (ArgList::const_iterator it = Args.begin(),
685279c1dbebf37cd128f3c73c70741a6b8c35ad025Daniel Dunbar         ie = Args.end(); it != ie; ++it) {
6864e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    Arg *A = *it;
6874e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
6884e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    if (A->getOption().matches(options::OPT_Xarch__)) {
6894e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // FIXME: Canonicalize name.
6904e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      if (getArchName() != A->getValue(Args, 0))
6914e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
6924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
6930e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1));
6940e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      unsigned Prev = Index;
695ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      Arg *XarchArg = Opts.ParseOneArg(Args, Index);
6961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6974e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // If the argument parsing failed or more than one argument was
6984e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // consumed, the -Xarch_ argument's parameter tried to consume
6994e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // extra arguments. Emit an error and ignore.
7004e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      //
7014e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // We also want to disallow any options which would alter the
7024e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // driver behavior; that isn't going to work in our model. We
7034e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // use isDriverOption() as an approximation, although things
7044e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // like -O4 are going to slip through.
7051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      if (!XarchArg || Index > Prev + 1 ||
7064e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          XarchArg->getOption().isDriverOption()) {
707ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar       getDriver().Diag(clang::diag::err_drv_invalid_Xarch_argument)
7084e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          << A->getAsString(Args);
7094e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
7104e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      }
7114e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
712478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      XarchArg->setBaseArg(A);
7134e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      A = XarchArg;
7140e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar
7150e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      DAL->AddSynthesizedArg(A);
7161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
7174e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
718ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // Sob. These is strictly gcc compatible for the time being. Apple
719ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // gcc translates options twice, which means that self-expanding
720ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // options add duplicates.
7219e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    switch ((options::ID) A->getOption().getID()) {
722ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    default:
723ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
724ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
725ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
726ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_mkernel:
727ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fapple_kext:
728ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
7299d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
7309d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
731ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
7321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
733ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_dependency_file:
7349d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
7359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                          A->getValue(Args));
736ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
737ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
738ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gfull:
7399d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
7409d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7419d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar               Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
742ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
743ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
744ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gused:
7459d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
7469d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7479d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar             Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
748ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
749ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
750ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fterminated_vtables:
751ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_findirect_virtual_calls:
7529d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_fapple_kext));
7539d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
754ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
755ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
756ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_shared:
7579d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
758ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
759ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
760ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fconstant_cfstrings:
7619d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
762ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
763ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
764ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_constant_cfstrings:
7659d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
766ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
767ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
768ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wnonportable_cfstrings:
7699d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7709d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
771ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
772ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
773ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wno_nonportable_cfstrings:
7749d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7759d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                   Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
776ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
777ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
778ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fpascal_strings:
7799d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
780ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
781ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
782ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_pascal_strings:
7839d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
784ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
785ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    }
7864e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  }
7874e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
78884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (getTriple().getArch() == llvm::Triple::x86 ||
78984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      getTriple().getArch() == llvm::Triple::x86_64)
790e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
7919d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
79284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
79384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // Add the arch options based on the particular spelling of -arch, to match
79484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // how the driver driver works.
79584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (BoundArch) {
79684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    llvm::StringRef Name = BoundArch;
79784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
79884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    const Option *MArch = Opts.getOption(options::OPT_march_EQ);
79984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
80084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
80184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // which defines the list of which architectures we accept.
80284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    if (Name == "ppc")
80384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
80484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc601")
8059d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "601");
80684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc603")
8079d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "603");
80884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604")
8099d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604");
81084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604e")
8119d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "604e");
81284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc750")
8139d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "750");
81484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7400")
8159d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7400");
81684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7450")
8179d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "7450");
81884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc970")
8199d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MCpu, "970");
82084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
82184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc64")
8229d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
82384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
82484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i386")
82584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
82684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i486")
8279d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i486");
82884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i586")
8299d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i586");
83084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i686")
8319d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "i686");
83284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium")
8339d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium");
83484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium2")
8359d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
83684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentpro")
8379d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentiumpro");
83884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentIIm3")
8399d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "pentium2");
84084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
84184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "x86_64")
8429d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
843ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
84484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "arm")
8459d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
84684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv4t")
8479d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv4t");
84884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv5")
8499d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv5tej");
85084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "xscale")
8519d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "xscale");
85284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv6")
8539d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv6k");
85484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv7")
8559d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddJoinedArg(0, MArch, "armv7a");
85684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
85784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else
8589f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin      llvm_unreachable("invalid Darwin arch");
85984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  }
860ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
86160baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // Add an explicit version min argument for the deployment target. We do this
86260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // after argument translation because -Xarch_ arguments may add a version min
86360baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // argument.
86460baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  AddDeploymentTarget(*DAL);
86560baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar
8664e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  return DAL;
8671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
8688eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
869f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarbool Darwin::IsUnwindTablesDefault() const {
8708eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // FIXME: Gross; we should probably have some separate target
8718eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // definition, possibly even reusing the one in clang.
8728eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return getArchName() == "x86_64";
8738eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8748eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
875f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbarbool Darwin::UseDwarfDebugFlags() const {
876f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
877f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    return S[0] != '\0';
878f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  return false;
879f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar}
880f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
881b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const {
882b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  // Darwin uses SjLj exceptions on ARM.
883b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  return (getTriple().getArch() == llvm::Triple::arm ||
884b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar          getTriple().getArch() == llvm::Triple::thumb);
885b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar}
886b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
887f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetDefaultRelocationModel() const {
8888eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return "pic";
8898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8908eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
891f395528158379e7ea9f6ff4bbb791abadca15aabDaniel Dunbarconst char *Darwin::GetForcedPicModel() const {
8928eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  if (getArchName() == "x86_64")
8938eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    return "pic";
8948eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  return 0;
8958eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
8968eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
89743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const {
89843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  // Garbage collection is supported everywhere except on iPhone OS.
89943a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar  return !isTargetIPhoneOS();
90043a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar}
90143a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
90200577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbarstd::string
90300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel DunbarDarwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args) const {
90400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  return ComputeLLVMTriple(Args);
90500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
90600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
9073917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
9083917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of
9093917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options.
9103917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
911cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarGeneric_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
9121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  : ToolChain(Host, Triple) {
913edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
914edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir.c_str())
915edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
916c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
917c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
9183917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() {
9193917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  // Free tool implementations.
9203917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  for (llvm::DenseMap<unsigned, Tool*>::iterator
9213917608370583fa30c466b6c3893448229aea9adDaniel Dunbar         it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
9223917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    delete it->second;
9233917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
9243917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
9251eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTool &Generic_GCC::SelectTool(const Compilation &C,
9263917608370583fa30c466b6c3893448229aea9adDaniel Dunbar                              const JobAction &JA) const {
9273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Action::ActionClass Key;
928ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
9293917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    Key = Action::AnalyzeJobClass;
9303917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  else
9313917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    Key = JA.getKind();
9323917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
9333917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  Tool *&T = Tools[Key];
9343917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  if (!T) {
9353917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    switch (Key) {
9368eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::InputClass:
9378eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::BindArchClass:
9383917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      assert(0 && "Invalid tool kind.");
9393917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PreprocessJobClass:
9403917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Preprocess(*this); break;
9413917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::PrecompileJobClass:
9423917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Precompile(*this); break;
9433917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AnalyzeJobClass:
9443917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::Clang(*this); break;
9453917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::CompileJobClass:
9463917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Compile(*this); break;
9473917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::AssembleJobClass:
9483917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Assemble(*this); break;
9493917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    case Action::LinkJobClass:
9503917608370583fa30c466b6c3893448229aea9adDaniel Dunbar      T = new tools::gcc::Link(*this); break;
9511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
9528eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // This is a bit ungeneric, but the only platform using a driver
9538eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      // driver is Darwin.
9548eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar    case Action::LipoJobClass:
9558eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar      T = new tools::darwin::Lipo(*this); break;
9566e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar    case Action::DsymutilJobClass:
9576e0f25483b1a801cd1155ea89c2b725feab16332Daniel Dunbar      T = new tools::darwin::Dsymutil(*this); break;
9583917608370583fa30c466b6c3893448229aea9adDaniel Dunbar    }
9593917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  }
9603917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
9613917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return *T;
9623917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
9633917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
9643917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const {
9658eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // FIXME: Gross; we should probably have some separate target
9668eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  // definition, possibly even reusing the one in clang.
9673917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return getArchName() == "x86_64";
9683917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
9693917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
9703917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetDefaultRelocationModel() const {
9713917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return "static";
9723917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
9733917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
9743917608370583fa30c466b6c3893448229aea9adDaniel Dunbarconst char *Generic_GCC::GetForcedPicModel() const {
9753917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  return 0;
9763917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
977f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
9783a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
9793a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
9803a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation.
9813a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
9823a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple)
9833a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  : ToolChain(Host, Triple) {
9843a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  // Path mangling to find libexec
9853a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  std::string Path(getDriver().Dir);
9863a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
9873a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Path += "/../libexec";
9883a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  getProgramPaths().push_back(Path);
9893a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
9903a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
9913a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() {
9923a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  for (llvm::DenseMap<unsigned, Tool*>::iterator
9933a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner           it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
9943a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      delete it->second;
9953a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
9963a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
9973a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsMathErrnoDefault() const {
9983a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return true;
9993a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
10003a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
10013a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerbool TCEToolChain::IsUnwindTablesDefault() const {
10023a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return false;
10033a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
10043a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
10053a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetDefaultRelocationModel() const {
10063a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return "static";
10073a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
10083a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
10093a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattnerconst char *TCEToolChain::GetForcedPicModel() const {
10103a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return 0;
10113a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
10123a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
10133a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTool &TCEToolChain::SelectTool(const Compilation &C,
10143a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner                            const JobAction &JA) const {
10153a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Action::ActionClass Key;
10163a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Key = Action::AnalyzeJobClass;
10173a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
10183a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Tool *&T = Tools[Key];
10193a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  if (!T) {
10203a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    switch (Key) {
10213a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::PreprocessJobClass:
10223a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::gcc::Preprocess(*this); break;
10233a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    case Action::AnalyzeJobClass:
10243a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner      T = new tools::Clang(*this); break;
10253a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    default:
10263a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner     assert(false && "Unsupported action for TCE target.");
10273a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner    }
10283a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  }
10293a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  return *T;
10303a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
10313a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
1032f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1033f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1034f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarOpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple)
1035e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  : Generic_ELF(Host, Triple) {
1036ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
1037f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  getFilePaths().push_back("/usr/lib");
1038f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
1039f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1040f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel DunbarTool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA) const {
1041f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Action::ActionClass Key;
1042ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1043f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Key = Action::AnalyzeJobClass;
1044f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  else
1045f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    Key = JA.getKind();
1046f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1047dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1048dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             options::OPT_no_integrated_as,
1049dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             IsIntegratedAssemblerDefault());
1050dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola
1051f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  Tool *&T = Tools[Key];
1052f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  if (!T) {
1053f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    switch (Key) {
1054dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola    case Action::AssembleJobClass: {
1055dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      if (UseIntegratedAs)
1056dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::ClangAs(*this);
1057dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      else
1058dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::openbsd::Assemble(*this);
1059dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      break;
1060dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola    }
1061f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    case Action::LinkJobClass:
1062f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = new tools::openbsd::Link(*this); break;
1063f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    default:
1064f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
1065f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar    }
1066f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  }
1067f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
1068f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  return *T;
1069f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
1070f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
107175358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
107275358d267256022475371416654b056ad8531cb3Daniel Dunbar
1073214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel DunbarFreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple)
1074e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  : Generic_ELF(Host, Triple) {
1075214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar
1076214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar  // Determine if we are compiling 32-bit code on an x86_64 platform.
1077214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar  bool Lib32 = false;
1078214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar  if (Triple.getArch() == llvm::Triple::x86 &&
1079214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar      llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
1080214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar        llvm::Triple::x86_64)
1081214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar    Lib32 = true;
1082214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar
10837fb2c25ab0b6fa1543bce410dbdb2ee5d2513a86Daniel Dunbar  getProgramPaths().push_back(getDriver().Dir + "/../libexec");
10847fb2c25ab0b6fa1543bce410dbdb2ee5d2513a86Daniel Dunbar  getProgramPaths().push_back("/usr/libexec");
1085bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  if (Lib32) {
1086ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getFilePaths().push_back(getDriver().Dir + "/../lib32");
1087bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar    getFilePaths().push_back("/usr/lib32");
1088bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  } else {
1089ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar    getFilePaths().push_back(getDriver().Dir + "/../lib");
1090bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar    getFilePaths().push_back("/usr/lib");
1091bc534664d008bc98d5ce76c053921bf5ee21fc65Daniel Dunbar  }
109275358d267256022475371416654b056ad8531cb3Daniel Dunbar}
109375358d267256022475371416654b056ad8531cb3Daniel Dunbar
109475358d267256022475371416654b056ad8531cb3Daniel DunbarTool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA) const {
109575358d267256022475371416654b056ad8531cb3Daniel Dunbar  Action::ActionClass Key;
1096ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
109775358d267256022475371416654b056ad8531cb3Daniel Dunbar    Key = Action::AnalyzeJobClass;
109875358d267256022475371416654b056ad8531cb3Daniel Dunbar  else
109975358d267256022475371416654b056ad8531cb3Daniel Dunbar    Key = JA.getKind();
110075358d267256022475371416654b056ad8531cb3Daniel Dunbar
110167dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
110267dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky                                             options::OPT_no_integrated_as,
110367dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky                                             IsIntegratedAssemblerDefault());
110467dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky
110575358d267256022475371416654b056ad8531cb3Daniel Dunbar  Tool *&T = Tools[Key];
110675358d267256022475371416654b056ad8531cb3Daniel Dunbar  if (!T) {
110775358d267256022475371416654b056ad8531cb3Daniel Dunbar    switch (Key) {
110868a31d406c6dc4382c700d1199b062de2aa7e1daDaniel Dunbar    case Action::AssembleJobClass:
110967dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky      if (UseIntegratedAs)
111067dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky        T = new tools::ClangAs(*this);
111167dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky      else
111267dece7e8b38138dd07e3d461d675dd8c8b4e025Roman Divacky        T = new tools::freebsd::Assemble(*this);
1113fe3a7ea7f2132ec5cd0510cc21d2677614a6ab3aRoman Divacky      break;
1114008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar    case Action::LinkJobClass:
1115008f54a54299eaafdaa940e2bdeaf55935ecd95aDaniel Dunbar      T = new tools::freebsd::Link(*this); break;
111675358d267256022475371416654b056ad8531cb3Daniel Dunbar    default:
111775358d267256022475371416654b056ad8531cb3Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
111875358d267256022475371416654b056ad8531cb3Daniel Dunbar    }
111975358d267256022475371416654b056ad8531cb3Daniel Dunbar  }
112075358d267256022475371416654b056ad8531cb3Daniel Dunbar
112175358d267256022475371416654b056ad8531cb3Daniel Dunbar  return *T;
112275358d267256022475371416654b056ad8531cb3Daniel Dunbar}
112311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
112438e317d6dce161b249508686cc67eb7176958762Chris Lattner/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
112538e317d6dce161b249508686cc67eb7176958762Chris Lattner
112638e317d6dce161b249508686cc67eb7176958762Chris LattnerMinix::Minix(const HostInfo &Host, const llvm::Triple& Triple)
112738e317d6dce161b249508686cc67eb7176958762Chris Lattner  : Generic_GCC(Host, Triple) {
112838e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back(getDriver().Dir + "/../lib");
112938e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back("/usr/lib");
113038e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back("/usr/gnu/lib");
113138e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3");
113238e317d6dce161b249508686cc67eb7176958762Chris Lattner}
113338e317d6dce161b249508686cc67eb7176958762Chris Lattner
113438e317d6dce161b249508686cc67eb7176958762Chris LattnerTool &Minix::SelectTool(const Compilation &C, const JobAction &JA) const {
113538e317d6dce161b249508686cc67eb7176958762Chris Lattner  Action::ActionClass Key;
113638e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
113738e317d6dce161b249508686cc67eb7176958762Chris Lattner    Key = Action::AnalyzeJobClass;
113838e317d6dce161b249508686cc67eb7176958762Chris Lattner  else
113938e317d6dce161b249508686cc67eb7176958762Chris Lattner    Key = JA.getKind();
114038e317d6dce161b249508686cc67eb7176958762Chris Lattner
114138e317d6dce161b249508686cc67eb7176958762Chris Lattner  Tool *&T = Tools[Key];
114238e317d6dce161b249508686cc67eb7176958762Chris Lattner  if (!T) {
114338e317d6dce161b249508686cc67eb7176958762Chris Lattner    switch (Key) {
114438e317d6dce161b249508686cc67eb7176958762Chris Lattner    case Action::AssembleJobClass:
114538e317d6dce161b249508686cc67eb7176958762Chris Lattner      T = new tools::minix::Assemble(*this); break;
114638e317d6dce161b249508686cc67eb7176958762Chris Lattner    case Action::LinkJobClass:
114738e317d6dce161b249508686cc67eb7176958762Chris Lattner      T = new tools::minix::Link(*this); break;
114838e317d6dce161b249508686cc67eb7176958762Chris Lattner    default:
114938e317d6dce161b249508686cc67eb7176958762Chris Lattner      T = &Generic_GCC::SelectTool(C, JA);
115038e317d6dce161b249508686cc67eb7176958762Chris Lattner    }
115138e317d6dce161b249508686cc67eb7176958762Chris Lattner  }
115238e317d6dce161b249508686cc67eb7176958762Chris Lattner
115338e317d6dce161b249508686cc67eb7176958762Chris Lattner  return *T;
115438e317d6dce161b249508686cc67eb7176958762Chris Lattner}
115538e317d6dce161b249508686cc67eb7176958762Chris Lattner
1156e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1157e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1158e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanAuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)
1159e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  : Generic_GCC(Host, Triple) {
1160e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1161edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
1162edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir.c_str())
1163edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
1164e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1165ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
1166e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/lib");
1167e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/sfw/lib");
1168e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib");
11697adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
1170e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1171e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
1172e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1173e7925a075f110ab21afeae084670a155dea568e3Edward O'CallaghanTool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA) const {
1174e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Action::ActionClass Key;
1175ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1176e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Key = Action::AnalyzeJobClass;
1177e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  else
1178e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    Key = JA.getKind();
1179e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1180e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  Tool *&T = Tools[Key];
1181e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  if (!T) {
1182e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    switch (Key) {
1183e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::AssembleJobClass:
1184e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Assemble(*this); break;
1185e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    case Action::LinkJobClass:
1186e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = new tools::auroraux::Link(*this); break;
1187e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    default:
1188e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan      T = &Generic_GCC::SelectTool(C, JA);
1189e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan    }
1190e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  }
1191e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1192e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  return *T;
1193e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
1194e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
1195e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
11966b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman/// Linux toolchain (very bare-bones at the moment).
11976b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
1198c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolaenum LinuxDistro {
1199c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianLenny,
1200c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianSqueeze,
12010a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola  Exherbo,
1202c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Fedora13,
1203c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Fedora14,
1204c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  OpenSuse11_3,
1205021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola  UbuntuJaunty,
1206c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuLucid,
1207c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuMaverick,
1208c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UnknownDistro
1209c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola};
1210c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1211c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsFedora(enum LinuxDistro Distro) {
1212c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return Distro == Fedora13 || Distro == Fedora14;
1213c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1214c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1215c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsOpenSuse(enum LinuxDistro Distro) {
1216c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return Distro == OpenSuse11_3;
1217c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1218c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1219c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsDebian(enum LinuxDistro Distro) {
1220c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return Distro == DebianLenny || Distro == DebianSqueeze;
1221c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1222c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1223c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsUbuntu(enum LinuxDistro Distro) {
1224021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola  return Distro == UbuntuLucid || Distro == UbuntuMaverick || Distro == UbuntuJaunty;
1225c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1226c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1227c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool IsDebianBased(enum LinuxDistro Distro) {
1228c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return IsDebian(Distro) || IsUbuntu(Distro);
1229c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1230c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1231c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic bool HasMultilib(llvm::Triple::ArchType Arch, enum LinuxDistro Distro) {
12320a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola  if (Arch == llvm::Triple::x86_64) {
12330a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola    if (Distro == Exherbo && !llvm::sys::Path("/usr/lib32/libc.so").exists())
12340a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola      return false;
12350a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola
1236c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return true;
12370a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola  }
1238c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Arch == llvm::Triple::x86 && IsDebianBased(Distro))
1239c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return true;
1240c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return false;
1241c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1242c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1243c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolastatic LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
1244c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  llvm::OwningPtr<const llvm::MemoryBuffer>
1245c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    LsbRelease(llvm::MemoryBuffer::getFile("/etc/lsb-release"));
1246c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (LsbRelease) {
1247c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    llvm::StringRef Data = LsbRelease.get()->getBuffer();
1248c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    llvm::SmallVector<llvm::StringRef, 8> Lines;
1249c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Data.split(Lines, "\n");
1250c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    for (unsigned int i = 0, s = Lines.size(); i < s; ++ i) {
1251c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      if (Lines[i] == "DISTRIB_CODENAME=maverick")
1252c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola        return UbuntuMaverick;
1253c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      else if (Lines[i] == "DISTRIB_CODENAME=lucid")
1254c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola        return UbuntuLucid;
1255021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola      else if (Lines[i] == "DISTRIB_CODENAME=jaunty")
1256021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola	return UbuntuJaunty;
1257c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    }
1258c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
1259c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1260c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1261c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  llvm::OwningPtr<const llvm::MemoryBuffer>
1262c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    RHRelease(llvm::MemoryBuffer::getFile("/etc/redhat-release"));
1263c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (RHRelease) {
1264c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    llvm::StringRef Data = RHRelease.get()->getBuffer();
1265c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (Data.startswith("Fedora release 14 (Laughlin)"))
1266c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return Fedora14;
1267c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else if (Data.startswith("Fedora release 13 (Goddard)"))
1268c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return Fedora13;
1269c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
1270c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1271c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1272c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  llvm::OwningPtr<const llvm::MemoryBuffer>
1273c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    DebianVersion(llvm::MemoryBuffer::getFile("/etc/debian_version"));
1274c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (DebianVersion) {
1275c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    llvm::StringRef Data = DebianVersion.get()->getBuffer();
1276c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (Data[0] == '5')
1277c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianLenny;
1278c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else if (Data.startswith("squeeze/sid"))
1279c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianSqueeze;
1280c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
1281c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1282c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1283c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  llvm::OwningPtr<const llvm::MemoryBuffer>
1284c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    SuseRelease(llvm::MemoryBuffer::getFile("/etc/SuSE-release"));
1285c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (SuseRelease) {
1286c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    llvm::StringRef Data = SuseRelease.get()->getBuffer();
1287c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (Data.startswith("openSUSE 11.3"))
1288c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return OpenSuse11_3;
1289c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
1290c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1291c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
12920a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola  if (llvm::sys::Path("/etc/exherbo-release").exists())
12930a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola    return Exherbo;
12940a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola
1295c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return UnknownDistro;
1296c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1297c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
12986b3454a219cee5ef36c4668961f93a5c32deab61Eli FriedmanLinux::Linux(const HostInfo &Host, const llvm::Triple& Triple)
1299e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  : Generic_ELF(Host, Triple) {
1300c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  llvm::Triple::ArchType Arch =
1301c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    llvm::Triple(getDriver().DefaultHostTriple).getArch();
1302c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1303c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::string Suffix32  = "";
1304c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Arch == llvm::Triple::x86_64)
1305c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Suffix32 = "/32";
1306c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1307c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::string Suffix64  = "";
1308c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Arch == llvm::Triple::x86)
1309c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Suffix64 = "/64";
1310c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1311c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::string Lib32 = "lib";
1312c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1313c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (  llvm::sys::Path("/lib32").exists())
1314c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Lib32 = "lib32";
1315c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1316c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::string Lib64 = "lib";
1317c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  llvm::sys::Path Lib64Path("/lib64");
1318c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Lib64Path.exists() && !Lib64Path.isSymLink())
1319c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Lib64 = "lib64";
1320c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1321c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::string GccTriple = "";
1322c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Arch == llvm::Triple::arm) {
1323c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (llvm::sys::Path("/usr/lib/gcc/arm-linux-gnueabi").exists())
1324c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      GccTriple = "arm-linux-gnueabi";
1325c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  } else if (Arch == llvm::Triple::x86_64) {
1326c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (llvm::sys::Path("/usr/lib/gcc/x86_64-linux-gnu").exists())
1327c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      GccTriple = "x86_64-linux-gnu";
13280a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola    else if (llvm::sys::Path("/usr/lib/gcc/x86_64-pc-linux-gnu").exists())
13290a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola      GccTriple = "x86_64-pc-linux-gnu";
1330c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else if (llvm::sys::Path("/usr/lib/gcc/x86_64-redhat-linux").exists())
1331c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      GccTriple = "x86_64-redhat-linux";
1332c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else if (llvm::sys::Path("/usr/lib64/gcc/x86_64-suse-linux").exists())
1333c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      GccTriple = "x86_64-suse-linux";
1334c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  } else if (Arch == llvm::Triple::x86) {
1335c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (llvm::sys::Path("/usr/lib/gcc/i686-linux-gnu").exists())
1336c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      GccTriple = "i686-linux-gnu";
1337c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else if (llvm::sys::Path("/usr/lib/gcc/i486-linux-gnu").exists())
1338c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      GccTriple = "i486-linux-gnu";
1339c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else if (llvm::sys::Path("/usr/lib/gcc/i686-redhat-linux").exists())
1340c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      GccTriple = "i686-redhat-linux";
1341c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    else if (llvm::sys::Path("/usr/lib/gcc/i586-suse-linux").exists())
1342c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      GccTriple = "i586-suse-linux";
1343c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1344c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1345c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  const char* GccVersions[] = {"4.5.1", "4.5", "4.4.5", "4.4.4", "4.4.3",
1346021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola                               "4.3.3", "4.3.2"};
1347c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::string Base = "";
1348c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  for (unsigned i = 0; i < sizeof(GccVersions)/sizeof(char*); ++i) {
1349c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    std::string Suffix = GccTriple + "/" + GccVersions[i];
1350c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    std::string t1 = "/usr/lib/gcc/" + Suffix;
1351c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (llvm::sys::Path(t1 + "/crtbegin.o").exists()) {
1352c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      Base = t1;
1353c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      break;
1354c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    }
1355c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    std::string t2 = "/usr/lib64/gcc/" + Suffix;
1356c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (llvm::sys::Path(t2 + "/crtbegin.o").exists()) {
1357c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      Base = t2;
1358c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      break;
1359c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    }
1360c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1361c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1362c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  path_list &Paths = getFilePaths();
1363c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  bool Is32Bits = getArch() == llvm::Triple::x86;
1364c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1365c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::string Suffix;
1366c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  std::string Lib;
1367c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1368c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Is32Bits) {
1369c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Suffix = Suffix32;
1370c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Lib = Lib32;
1371c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  } else {
1372c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Suffix = Suffix64;
1373c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Lib = Lib64;
1374c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1375c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1376c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  llvm::sys::Path LinkerPath(Base + "/../../../../" + GccTriple + "/bin/ld");
1377c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (LinkerPath.exists())
1378c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Linker = LinkerPath.str();
1379c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  else
1380c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Linker = GetProgramPath("ld");
1381c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1382c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  LinuxDistro Distro = DetectLinuxDistro(Arch);
1383c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
138494c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola  if (IsUbuntu(Distro)) {
138594c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("-z");
138694c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("relro");
138794c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola  }
1388c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1389c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Arch == llvm::Triple::arm)
1390c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("-X");
1391c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1392c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (IsFedora(Distro) || Distro == UbuntuMaverick)
1393c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--hash-style=gnu");
1394c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1395021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola  if (IsDebian(Distro) || Distro == UbuntuLucid || Distro == UbuntuJaunty)
1396c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--hash-style=both");
1397c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1398c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (IsFedora(Distro))
1399c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--no-add-needed");
1400c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1401021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola  if (Distro == DebianSqueeze || IsOpenSuse(Distro) ||
1402021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola      IsFedora(Distro) || Distro == UbuntuLucid || Distro == UbuntuMaverick)
1403c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--build-id");
1404c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1405c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Paths.push_back(Base + Suffix);
1406c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (HasMultilib(Arch, Distro)) {
1407c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (IsOpenSuse(Distro) && Is32Bits)
1408c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      Paths.push_back(Base + "/../../../../" + GccTriple + "/lib/../lib");
1409c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Paths.push_back(Base + "/../../../../" + Lib);
1410c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Paths.push_back("/lib/../" + Lib);
1411c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Paths.push_back("/usr/lib/../" + Lib);
1412c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
1413c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (!Suffix.empty())
1414c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Paths.push_back(Base);
1415c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (IsOpenSuse(Distro))
1416c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Paths.push_back(Base + "/../../../../" + GccTriple + "/lib");
1417c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  Paths.push_back(Base + "/../../..");
1418c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  if (Arch == getArch() && IsUbuntu(Distro))
1419c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Paths.push_back("/usr/lib/" + GccTriple);
1420c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
1421c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
1422c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolabool Linux::HasNativeLLVMSupport() const {
1423c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return true;
14246b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}
14256b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
1426ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael EspindolaTool &Linux::SelectTool(const Compilation &C, const JobAction &JA) const {
1427ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  Action::ActionClass Key;
1428ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1429ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    Key = Action::AnalyzeJobClass;
1430ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  else
1431ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    Key = JA.getKind();
1432ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
1433dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola  bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1434dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             options::OPT_no_integrated_as,
1435dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola                                             IsIntegratedAssemblerDefault());
1436dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola
1437ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  Tool *&T = Tools[Key];
1438ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  if (!T) {
1439ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    switch (Key) {
1440ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    case Action::AssembleJobClass:
1441dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      if (UseIntegratedAs)
1442dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::ClangAs(*this);
1443dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      else
1444dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola        T = new tools::linuxtools::Assemble(*this);
1445dda5b92c770b024a2b551bb22331d079821f67a0Rafael Espindola      break;
1446c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    case Action::LinkJobClass:
1447c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      T = new tools::linuxtools::Link(*this); break;
1448ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    default:
1449ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola      T = &Generic_GCC::SelectTool(C, JA);
1450ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola    }
1451ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  }
1452ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
1453ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola  return *T;
1454ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
1455ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
145611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
145711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
1458cb8ab23f7c800b041aeb6fc38c341d1aa0da86bfDaniel DunbarDragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
1459e43cfa1fdbf5b404a76e31f31b1505c7852a1967Rafael Espindola  : Generic_ELF(Host, Triple) {
146011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
146111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // Path mangling to find libexec
1462edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
1463edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  if (getDriver().getInstalledDir() != getDriver().Dir.c_str())
1464edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
146511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
1466ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
146711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib");
146811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib/gcc41");
146911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
147011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
147111e1b40d759a643086f590f6ffbd9d68360bad46Daniel DunbarTool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA) const {
147211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Action::ActionClass Key;
1473ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
147411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Key = Action::AnalyzeJobClass;
147511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  else
147611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    Key = JA.getKind();
147711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
147811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  Tool *&T = Tools[Key];
147911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  if (!T) {
148011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    switch (Key) {
148111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::AssembleJobClass:
148211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Assemble(*this); break;
148311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    case Action::LinkJobClass:
148411e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = new tools::dragonfly::Link(*this); break;
148511e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    default:
148611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar      T = &Generic_GCC::SelectTool(C, JA);
148711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar    }
148811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  }
148911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
149011e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  return *T;
149111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
1492ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
1493ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. SpencerWindows::Windows(const HostInfo &Host, const llvm::Triple& Triple)
1494ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  : ToolChain(Host, Triple) {
1495ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
1496ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
1497ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. SpencerTool &Windows::SelectTool(const Compilation &C, const JobAction &JA) const {
1498ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  Action::ActionClass Key;
1499ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1500ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    Key = Action::AnalyzeJobClass;
1501ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  else
1502ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    Key = JA.getKind();
1503ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
1504ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  Tool *&T = Tools[Key];
1505ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (!T) {
1506ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    switch (Key) {
1507ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::InputClass:
1508ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::BindArchClass:
1509e97673f10fbb557be2d95f6ca0fcdb6f6dc82b3bChandler Carruth    case Action::LipoJobClass:
1510e97673f10fbb557be2d95f6ca0fcdb6f6dc82b3bChandler Carruth    case Action::DsymutilJobClass:
1511ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer      assert(0 && "Invalid tool kind.");
1512ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::PreprocessJobClass:
1513ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::PrecompileJobClass:
1514ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::AnalyzeJobClass:
1515ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::CompileJobClass:
1516ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer      T = new tools::Clang(*this); break;
1517ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::AssembleJobClass:
1518ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer      T = new tools::ClangAs(*this); break;
1519ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    case Action::LinkJobClass:
1520ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer      T = new tools::visualstudio::Link(*this); break;
1521ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    }
1522ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  }
1523ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
1524ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  return *T;
1525ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
1526ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
1527ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerbool Windows::IsIntegratedAssemblerDefault() const {
1528ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  return true;
1529ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
1530ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
1531ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerbool Windows::IsUnwindTablesDefault() const {
1532ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  // FIXME: Gross; we should probably have some separate target
1533ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  // definition, possibly even reusing the one in clang.
1534ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  return getArchName() == "x86_64";
1535ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
1536ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
1537ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerconst char *Windows::GetDefaultRelocationModel() const {
1538ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  return "static";
1539ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
1540ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer
1541ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencerconst char *Windows::GetForcedPicModel() const {
1542ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  if (getArchName() == "x86_64")
1543ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer    return "pic";
1544ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer  return 0;
1545ff58e3610f4e12094def69eb2d6dcb4330378d8fMichael J. Spencer}
1546