13fdcc6fb12d7cf38d2a3111736f80f0dd55447b4Nick Lewycky//===--- 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"
1155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/ObjCRuntime.h"
1255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/Version.h"
13ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
140f602ded589d381c6c3862eae87620d19fd10f47Daniel Dunbar#include "clang/Driver/Compilation.h"
15c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "clang/Driver/Driver.h"
164e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar#include "clang/Driver/DriverDiagnostic.h"
17265e9ef9f3ef30a97790e6e7bbc3c17d97981ca7Daniel Dunbar#include "clang/Driver/Options.h"
181b8f12d46c10169bb949372ec5fc4c58afc2ced1Alexey Samsonov#include "clang/Driver/SanitizerArgs.h"
1955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/STLExtras.h"
2000577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar#include "llvm/ADT/SmallString.h"
21c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar#include "llvm/ADT/StringExtras.h"
22a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson#include "llvm/ADT/StringSwitch.h"
23b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Arg.h"
24b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/ArgList.h"
25b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/OptTable.h"
26b1e25a1bc03292dc538d336573e0be1490223171Reid Kleckner#include "llvm/Option/Option.h"
2784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar#include "llvm/Support/ErrorHandling.h"
2832bef4edba854303800b3b01cb49a282e5da4f69Michael J. Spencer#include "llvm/Support/FileSystem.h"
29c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola#include "llvm/Support/MemoryBuffer.h"
3003013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer#include "llvm/Support/Path.h"
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/Support/Program.h"
3255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/Support/raw_ostream.h"
33f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar#include <cstdlib> // ::getenv
34ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#include <system_error>
35f36a06a9584cf351e1bb7c5ebf2f707ed416dabaDaniel Dunbar
363917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver;
373917608370583fa30c466b6c3893448229aea9adDaniel Dunbarusing namespace clang::driver::toolchains;
385f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerusing namespace clang;
39b1e25a1bc03292dc538d336573e0be1490223171Reid Klecknerusing namespace llvm::opt;
403917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
41651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesMachO::MachO(const Driver &D, const llvm::Triple &Triple,
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                       const ArgList &Args)
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  : ToolChain(D, Triple, Args) {
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  getProgramPaths().push_back(getDriver().getInstalledDir());
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (getDriver().getInstalledDir() != getDriver().Dir)
466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    getProgramPaths().push_back(getDriver().Dir);
476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // We expect 'as', 'ld', etc. to be adjacent to our install dir.
496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  getProgramPaths().push_back(getDriver().getInstalledDir());
506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (getDriver().getInstalledDir() != getDriver().Dir)
516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    getProgramPaths().push_back(getDriver().Dir);
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
538eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// Darwin - Darwin tool chain for i386 and x86_64.
55651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesDarwin::Darwin(const Driver & D, const llvm::Triple & Triple,
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               const ArgList & Args)
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  : MachO(D, Triple, Args), TargetInitialized(false) {
581085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  // Compute the initial Darwin version from the triple
591085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  unsigned Major, Minor, Micro;
604c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson  if (!Triple.getMacOSXVersion(Major, Minor, Micro))
614c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson    getDriver().Diag(diag::err_drv_invalid_darwin_version) <<
624c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson      Triple.getOSName();
634c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson  llvm::raw_string_ostream(MacosxVersionMin)
644c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson    << Major << '.' << Minor << '.' << Micro;
654c5ffb32e89da30479da49b87abf560c81e4c210Bob Wilson
661085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  // FIXME: DarwinVersion is only used to find GCC's libexec directory.
671085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  // It should be removed when we stop supporting that.
681085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  DarwinVersion[0] = Minor + 4;
691085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  DarwinVersion[1] = Micro;
701085377d9b137e92fa0f9f9dfb674f6463719909Bob Wilson  DarwinVersion[2] = 0;
71c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier
72c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier  // Compute the initial iOS version from the triple
738c990274ae17cf7c56048ee453b0566515633b7fChad Rosier  Triple.getiOSVersion(Major, Minor, Micro);
74c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier  llvm::raw_string_ostream(iOSVersionMin)
75c793ea42d7afd567c3cdd900cfa72398b2b38cd5Chad Rosier    << Major << '.' << Minor << '.' << Micro;
761d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
771d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestypes::ID MachO::LookupTypeForExtension(const char *Ext) const {
794180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  types::ID Ty = types::lookupTypeForExtension(Ext);
804180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
814180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  // Darwin always preprocesses assembly files (unless -x is used explicitly).
824180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  if (Ty == types::TY_PP_Asm)
834180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar    return types::TY_Asm;
844180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
854180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar  return Ty;
864180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar}
874180011fb8cef06adec04d30486b1bf3b99aa8b8Daniel Dunbar
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::HasNativeLLVMSupport() const {
89b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar  return true;
90b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar}
91b993f5d93b994b9b0aac6aebae669621744bbed7Daniel Dunbar
929f084a3166b684573ba49df28fc5792bc37d92e1John McCall/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
93260611a32535c851237926bfcf78869b13c07d5bJohn McCallObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isTargetIOSBased())
95260611a32535c851237926bfcf78869b13c07d5bJohn McCall    return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
96377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson  if (isNonFragile)
97377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson    return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
98377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson  return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
999f084a3166b684573ba49df28fc5792bc37d92e1John McCall}
1009f084a3166b684573ba49df28fc5792bc37d92e1John McCall
10113db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
10213db5cfc4e5f03eb70efe0d227b53b8280f16161John McCallbool Darwin::hasBlocksRuntime() const {
103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isTargetIOSBased())
10413db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall    return !isIPhoneOSVersionLT(3, 2);
105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else {
106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(isTargetMacOS() && "unexpected darwin target");
10713db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall    return !isMacosxVersionLT(10, 6);
108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
10913db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall}
11013db5cfc4e5f03eb70efe0d227b53b8280f16161John McCall
1115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *GetArmArchForMArch(StringRef Value) {
112a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson  return llvm::StringSwitch<const char*>(Value)
113a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv6k", "armv6")
1142503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("armv6m", "armv6m")
115a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv5tej", "armv5")
116a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("xscale", "xscale")
117a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv4t", "armv4t")
118a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("armv7", "armv7")
119a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("armv7a", "armv7-a", "armv7")
120a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("armv7r", "armv7-r", "armv7")
1212503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("armv7em", "armv7e-m", "armv7em")
122336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7k", "armv7-k", "armv7k")
1232503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("armv7m", "armv7-m", "armv7m")
124336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Cases("armv7s", "armv7-s", "armv7s")
1256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    .Default(nullptr);
126eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
127eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
1285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic const char *GetArmArchForMCpu(StringRef Value) {
129a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson  return llvm::StringSwitch<const char *>(Value)
130a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
131a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm10e", "arm10tdmi", "armv5")
132a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
133a59956b473b76af6a9d999ab1780ef74cfed4667Bob Wilson    .Case("xscale", "xscale")
1342503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "arm1176jzf-s", "armv6")
1352503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("cortex-m0", "armv6m")
136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "armv7")
137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "armv7")
138b029c5038b73fd093291f40059614b5421a45ec8Renato Golin    .Cases("cortex-r4", "cortex-r5", "armv7r")
1392503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("cortex-m3", "armv7m")
1402503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    .Case("cortex-m4", "armv7em")
141336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    .Case("swift", "armv7s")
1426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    .Default(nullptr);
143eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
144eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isSoftFloatABI(const ArgList &Args) {
146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           options::OPT_mfloat_abi_EQ);
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!A)
149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return false;
150651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return A->getOption().matches(options::OPT_msoft_float) ||
152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          A->getValue() == StringRef("soft"));
154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
156651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesStringRef MachO::getMachOArchName(const ArgList &Args) const {
157eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  switch (getTriple().getArch()) {
158eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  default:
159eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return getArchName();
160304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
161f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor  case llvm::Triple::thumb:
162eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  case llvm::Triple::arm: {
163eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1641d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      if (const char *Arch = GetArmArchForMArch(A->getValue()))
165eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
166eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
167eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1681d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      if (const char *Arch = GetArmArchForMCpu(A->getValue()))
169eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar        return Arch;
170eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
171eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar    return "arm";
172eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
173eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar  }
174eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar}
175eeff406730f50afd973f005a8d501a19af4785e5Daniel Dunbar
176f395528158379e7ea9f6ff4bbb791abadca15aabDaniel DunbarDarwin::~Darwin() {
1778eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
1788eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
179651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesMachO::~MachO() {
180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstd::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                    types::ID InputType) const {
185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Triple.getTriple();
188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
19061ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosierstd::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
19161ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier                                                types::ID InputType) const {
19261ab80a8b35e6fe9363e8ef1b3d27209b0e89349Chad Rosier  llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
19300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
19400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // If the target isn't initialized (e.g., an unknown Darwin platform, return
19500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  // the default triple).
19600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  if (!isTargetInitialized())
19700577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar    return Triple.getTriple();
198304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  SmallString<16> Str;
200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Str += isTargetIOSBased() ? "ios" : "macosx";
201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Str += getTargetVersion().getAsString();
202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Triple.setOSName(Str);
20300577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
20400577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar  return Triple.getTriple();
20500577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar}
20600577ada44c889fbe311d61c51a8da89e65c7c9aDaniel Dunbar
20799ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikievoid Generic_ELF::anchor() {}
20899ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie
209651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTool *MachO::getTool(Action::ActionClass AC) const {
2105b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
211f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::LipoJobClass:
212f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    if (!Lipo)
213f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola      Lipo.reset(new tools::darwin::Lipo(*this));
214f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return Lipo.get();
215f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::DsymutilJobClass:
216f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    if (!Dsymutil)
217f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola      Dsymutil.reset(new tools::darwin::Dsymutil(*this));
218f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return Dsymutil.get();
219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case Action::VerifyDebugInfoJobClass:
220f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    if (!VerifyDebug)
221f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola      VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
222f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return VerifyDebug.get();
223c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  default:
224f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return ToolChain::getTool(AC);
2258eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar  }
2268eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
2278eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
228651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTool *MachO::buildLinker() const {
229f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::darwin::Link(*this);
230f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
231f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
232651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesTool *MachO::buildAssembler() const {
233f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::darwin::Assemble(*this);
234f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2356cd4154b9088fa18ae05d11c0f3140fafd76c734Daniel Dunbar
236af370e6e051e505016637e23418354db625dc796Rafael EspindolaDarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple,
237af370e6e051e505016637e23418354db625dc796Rafael Espindola                         const ArgList &Args)
238651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  : Darwin(D, Triple, Args) {
2391d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
2401d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
242651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // For iOS, 64-bit, promote certain warnings to errors.
243651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!isTargetMacOS() && getTriple().isArch64Bit()) {
244651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Always enable -Wdeprecated-objc-isa-usage and promote it
245651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // to an error.
246651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CC1Args.push_back("-Wdeprecated-objc-isa-usage");
247651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
248651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
249651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Also error about implicit function declarations, as that
250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // can impact calling conventions.
251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CC1Args.push_back("-Werror=implicit-function-declaration");
252651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
253651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
255651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief Determine whether Objective-C automated reference counting is
256651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// enabled.
257651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isObjCAutoRefCount(const ArgList &Args) {
258651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
259651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
260651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
261f85e193739c953358c865005855253af4f68a497John McCallvoid DarwinClang::AddLinkARCArgs(const ArgList &Args,
262f85e193739c953358c865005855253af4f68a497John McCall                                 ArgStringList &CmdArgs) const {
263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Avoid linking compatibility stubs on i386 mac.
264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isTargetMacOS() && getArch() == llvm::Triple::x86)
265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      runtime.hasSubscripting())
271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return;
272f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
273f857186fd1995b34185d063a29b11ad4f948519fEric Christopher  CmdArgs.push_back("-force_load");
2747b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola  SmallString<128> P(getDriver().ClangExecutable);
2757b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola  llvm::sys::path::remove_filename(P); // 'clang'
2767b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola  llvm::sys::path::remove_filename(P); // 'bin'
277ceb6dc8e5afbd8e4dad7aaa1948994965fd8ff2eBenjamin Kramer  llvm::sys::path::append(P, "lib", "arc", "libarclite_");
278f85e193739c953358c865005855253af4f68a497John McCall  // Mash in the platform.
279c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis  if (isTargetIOSSimulator())
2807b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola    P += "iphonesimulator";
281c19981c2711c9b0564bc1a9cbad4b2d0cca608d5Argyrios Kyrtzidis  else if (isTargetIPhoneOS())
2827b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola    P += "iphoneos";
283f85e193739c953358c865005855253af4f68a497John McCall  else
2847b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola    P += "macosx";
2857b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola  P += ".a";
286f85e193739c953358c865005855253af4f68a497John McCall
2877b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola  CmdArgs.push_back(Args.MakeArgString(P));
288f85e193739c953358c865005855253af4f68a497John McCall}
289f85e193739c953358c865005855253af4f68a497John McCall
290651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
291651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                              StringRef DarwinStaticLib, bool AlwaysLink,
292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                              bool IsEmbedded) const {
2937b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola  SmallString<128> P(getDriver().ResourceDir);
294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::sys::path::append(P, "lib", IsEmbedded ? "macho_embedded" : "darwin",
295651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                          DarwinStaticLib);
296f857186fd1995b34185d063a29b11ad4f948519fEric Christopher
2973404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher  // For now, allow missing resource libraries to support developers who may
29869b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov  // not have compiler-rt checked out or integrated into their build (unless
29969b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov  // we explicitly force linking with this library).
30040e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola  if (AlwaysLink || llvm::sys::fs::exists(P.str()))
3013404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher    CmdArgs.push_back(Args.MakeArgString(P.str()));
3023404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher}
3033404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher
3041d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbarvoid DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
3051d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar                                        ArgStringList &CmdArgs) const {
306c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  // Darwin only supports the compiler-rt based runtime libraries.
307c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  switch (GetRuntimeLibType(Args)) {
308c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  case ToolChain::RLT_CompilerRT:
309c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    break;
310c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  default:
311c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
3121d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
313c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar    return;
314c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar  }
315c24767c9dd869ba0e78c2d4c86d86ed24b8e401eDaniel Dunbar
316eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Darwin doesn't support real static executables, don't link any runtime
317eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // libraries with -static.
3187a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  if (Args.hasArg(options::OPT_static) ||
3197a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      Args.hasArg(options::OPT_fapple_kext) ||
3207a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      Args.hasArg(options::OPT_mkernel))
3211d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
3221d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
3231d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // Reject -static-libgcc for now, we can deal with this when and if someone
3241d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // cares. This is useful in situations where someone wants to statically link
3251d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  // something like libstdc++, and needs its runtime support routines.
3261d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
3275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_unsupported_opt)
3281d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar      << A->getAsString(Args);
3291d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar    return;
3301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  }
3311d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
332f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar  // If we are building profile support, link that library in.
333f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar  if (Args.hasArg(options::OPT_fprofile_arcs) ||
334f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      Args.hasArg(options::OPT_fprofile_generate) ||
335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      Args.hasArg(options::OPT_fprofile_instr_generate) ||
336f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      Args.hasArg(options::OPT_fcreate_profile) ||
337f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      Args.hasArg(options::OPT_coverage)) {
338f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar    // Select the appropriate runtime library for the target.
339651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (isTargetIOSBased())
340f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a");
341651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    else
342f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a");
343f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar  }
344f471487ff1e673531543576bc170898c2ab19f41Daniel Dunbar
345c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne  const SanitizerArgs &Sanitize = getSanitizerArgs();
346bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov
34775fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  // Add Ubsan runtime library, if required.
34875fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  if (Sanitize.needsUbsanRt()) {
349c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne    // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds.
350651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (isTargetIOSBased()) {
35175fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
35275fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov        << "-fsanitize=undefined";
35375fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov    } else {
354651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      assert(isTargetMacOS() && "unexpected non OS X target");
35569b77d7fb3265e0e18c91badd50b4cb23dddf3e7Alexey Samsonov      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ubsan_osx.a", true);
35675fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov
35775fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      // The Ubsan runtime library requires C++.
35875fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov      AddCXXStdlibLibArgs(Args, CmdArgs);
35975fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov    }
36075fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov  }
36175fcb193aeeec5c4f10cc39df60a5ce7526b1b28Alexey Samsonov
3627b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  // Add ASAN runtime library, if required. Dynamic libraries and bundles
3637b5f1013c5b7f541dc1fae7fc43189377874eabbKostya Serebryany  // should not be linked with the runtime library.
364bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov  if (Sanitize.needsAsanRt()) {
365c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne    // FIXME: Move this check to SanitizerArgs::filterUnsupportedKinds.
366651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (isTargetIPhoneOS()) {
36794b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar      getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
368bb1071c0568db9bd7934e869a53d671632eb9291Alexey Samsonov        << "-fsanitize=address";
36994b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar    } else {
3704123b92f915fb27855ddaa294b0c7de7aa6c6274Alexander Potapenko      if (!Args.hasArg(options::OPT_dynamiclib) &&
3714123b92f915fb27855ddaa294b0c7de7aa6c6274Alexander Potapenko          !Args.hasArg(options::OPT_bundle)) {
3723656c612efe4889da0174ffa6a621a2d59fc3ecbAlexander Potapenko        // The ASAN runtime library requires C++.
3733656c612efe4889da0174ffa6a621a2d59fc3ecbAlexander Potapenko        AddCXXStdlibLibArgs(Args, CmdArgs);
3743656c612efe4889da0174ffa6a621a2d59fc3ecbAlexander Potapenko      }
375cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko      if (isTargetMacOS()) {
376cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko        AddLinkRuntimeLib(Args, CmdArgs,
377cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko                          "libclang_rt.asan_osx_dynamic.dylib",
378cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko                          true);
379cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko      } else {
380cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko        if (isTargetIOSSimulator()) {
381cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko          AddLinkRuntimeLib(Args, CmdArgs,
382cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko                            "libclang_rt.asan_iossim_dynamic.dylib",
383cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko                            true);
384cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko        }
385cc82b98811a0df6a41e8a92bd9f7361f4815e3dfAlexander Potapenko      }
38694b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar    }
38794b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar  }
38894b54ea787e439496fde16b3d2882d6d1b22d4f0Daniel Dunbar
389eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Otherwise link libSystem, then the dynamic runtime library, and finally any
390eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // target specific static runtime library.
3911d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar  CmdArgs.push_back("-lSystem");
392eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
393eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  // Select the dynamic runtime library and the target specific static library.
394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isTargetIOSBased()) {
39587e945f0f1fb5778c4c6b9e61356c7f1571b9cb4Daniel Dunbar    // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
39687e945f0f1fb5778c4c6b9e61356c7f1571b9cb4Daniel Dunbar    // it never went into the SDK.
397163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    // Linking against libgcc_s.1 isn't needed for iOS 5.0+
398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
3996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        (getTriple().getArch() != llvm::Triple::arm64 &&
4006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         getTriple().getArch() != llvm::Triple::aarch64))
401163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      CmdArgs.push_back("-lgcc_s.1");
402eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
4033cceec5e05d974f3993bd0a745325f76fb8e4efcDaniel Dunbar    // We currently always need a static runtime library for iOS.
4043404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher    AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
405eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  } else {
406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(isTargetMacOS() && "unexpected non MacOS platform");
407eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // The dynamic runtime library was merged with libSystem for 10.6 and
408eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar    // beyond; only 10.4 and 10.5 need an additional runtime library.
409ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    if (isMacosxVersionLT(10, 5))
410eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.4");
411ce3fdf233353b10f20d74dceda3d77a82285de17Daniel Dunbar    else if (isMacosxVersionLT(10, 6))
412eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar      CmdArgs.push_back("-lgcc_s.10.5");
413eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar
414885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // For OS X, we thought we would only need a static runtime library when
415fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner    // targeting 10.4, to provide versions of the static functions which were
416885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // omitted from 10.4.dylib.
417885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    //
418885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // Unfortunately, that turned out to not be true, because Darwin system
419885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // headers can still use eprintf on i386, and it is not exported from
420885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // libSystem. Therefore, we still must provide a runtime library just for
421885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    // the tiny tiny handful of projects that *might* use that symbol.
422885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    if (isMacosxVersionLT(10, 5)) {
4233404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
424885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    } else {
425885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::x86)
4263404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher        AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
4273404fe7105ecc3baa58b7ea725773de4112259d6Eric Christopher      AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
428885b1dbc6e48db318f7a6b72c1592e8fb46b081aDaniel Dunbar    }
429eec99100f0caa1d71bcc911ce38b9a58a8a43fdcDaniel Dunbar  }
4301d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar}
4311d4612b829500cbe04a2eafca74afac703e34934Daniel Dunbar
43260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbarvoid Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
433ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  const OptTable &Opts = getDriver().getOpts();
434ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
4359101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  // Support allowing the SDKROOT environment variable used by xcrun and other
4369101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  // Xcode tools to define the default sysroot, by making it the default for
4379101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  // isysroot.
438d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier  if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
439d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier    // Warn if the path does not exist.
44040e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola    if (!llvm::sys::fs::exists(A->getValue()))
441d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier      getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
442d7dfd98f07f6af9416b342825217022f2e970a66Chad Rosier  } else {
4439101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar    if (char *env = ::getenv("SDKROOT")) {
444321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar      // We only use this value as the default if it is an absolute path,
445321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar      // exists, and it is not the root path.
446321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar      if (llvm::sys::path::is_absolute(env) && llvm::sys::fs::exists(env) &&
447321425445f4ce31ccf477bea3240d05e0b1625b2Daniel Dunbar          StringRef(env) != "/") {
4489101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar        Args.append(Args.MakeSeparateArg(
4496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                      nullptr, Opts.getOption(options::OPT_isysroot), env));
4509101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar      }
4519101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar    }
4529101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar  }
4539101bc5f4d6defe71e8a368c5275f447da7769fdDaniel Dunbar
4542603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
4559d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
4569d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  Arg *iOSSimVersion = Args.getLastArg(
4579d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    options::OPT_mios_simulator_version_min_EQ);
458983d835bead0134170a6646a8844926077c968d6Eli Friedman
4599d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  if (OSXVersion && (iOSVersion || iOSSimVersion)) {
4605f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
461ff8857a9e6f533765f63b2934902645baa7ddd09Daniel Dunbar          << OSXVersion->getAsString(Args)
4629d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
4636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    iOSVersion = iOSSimVersion = nullptr;
4649d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  } else if (iOSVersion && iOSSimVersion) {
4655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_argument_not_allowed_with)
4669d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << iOSVersion->getAsString(Args)
4679d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar          << iOSSimVersion->getAsString(Args);
4686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    iOSSimVersion = nullptr;
4699d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar  } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
470a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // If no deployment target was specified on the command line, check for
471816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar    // environment defines.
472a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef OSXTarget;
473a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef iOSTarget;
474a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    StringRef iOSSimTarget;
475a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
476a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      OSXTarget = env;
477a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
478a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      iOSTarget = env;
479a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET"))
480a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      iOSSimTarget = env;
481a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier
482a789ca9b967abe47b84df83bcf4afb150856a8d9NAKAMURA Takumi    // If no '-miphoneos-version-min' specified on the command line and
483a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
484241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif    // based on -isysroot.
485a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (iOSTarget.empty()) {
486a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
487a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        StringRef first, second;
4881d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith        StringRef isysroot = A->getValue();
489651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        std::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
490a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        if (second != "")
491a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier          iOSTarget = second.substr(0,3);
492a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier      }
493a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    }
494816bc31ed45002de2547d6679b44f31eb85ec491Daniel Dunbar
4954f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    // If no OSX or iOS target has been specified and we're compiling for armv7,
4964f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier    // go ahead as assume we're targeting iOS.
497651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    StringRef MachOArchName = getMachOArchName(Args);
49849033207b75216a956f3dbf7d018fb3343a54ec1Chad Rosier    if (OSXTarget.empty() && iOSTarget.empty() &&
499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
500651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         MachOArchName == "arm64"))
50187ca5580302561c839b2cd12207902b9bf4ed117Chad Rosier        iOSTarget = iOSVersionMin;
5024f8de278b73f438f1911128ae9c8ce27c2b53546Chad Rosier
5039d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Handle conflicting deployment targets
50439053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    //
50539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    // FIXME: Don't hardcode default here.
5069d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
5079d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Do not allow conflicts with the iOS simulator target.
508a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) {
5095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
5109d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
511a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" :
5129d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar            "IPHONEOS_DEPLOYMENT_TARGET");
5139d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    }
5149d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar
5159d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // Allow conflicts among OSX and iOS for historical reasons, but choose the
5169d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    // default platform.
517a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!OSXTarget.empty() && !iOSTarget.empty()) {
51839053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      if (getTriple().getArch() == llvm::Triple::arm ||
519651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          getTriple().getArch() == llvm::Triple::arm64 ||
5206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          getTriple().getArch() == llvm::Triple::aarch64 ||
52139053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar          getTriple().getArch() == llvm::Triple::thumb)
522a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        OSXTarget = "";
52339053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar      else
524a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier        iOSTarget = "";
52539053672d459bff1d3ab1f72a7901f24e3fa542eDaniel Dunbar    }
5261a3c1d9dcfdb199353b68b071b6319724b8e3c31Daniel Dunbar
527a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    if (!OSXTarget.empty()) {
528e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
5296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
53060baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
531a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    } else if (!iOSTarget.empty()) {
532e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
5336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
5349d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      Args.append(iOSVersion);
535a488497c7c273ba54ce0fc4caf0f4d24adb2be89Chad Rosier    } else if (!iOSSimTarget.empty()) {
536e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(
5379d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar        options::OPT_mios_simulator_version_min_EQ);
5386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      iOSSimVersion = Args.MakeJoinedArg(nullptr, O, iOSSimTarget);
5399d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar      Args.append(iOSSimVersion);
540651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
541651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines               MachOArchName != "armv7em") {
5422bb38d0d93e56617f93091a92b2e6396c0cd0dcdDaniel Dunbar      // Otherwise, assume we are targeting OS X.
543e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer      const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
5446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      OSXVersion = Args.MakeJoinedArg(nullptr, O, MacosxVersionMin);
54560baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar      Args.append(OSXVersion);
54630392de4681602f1aabc61b0184b1de53bc172f0Daniel Dunbar    }
547ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar  }
5481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
549651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  DarwinPlatformKind Platform;
550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (OSXVersion)
551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Platform = MacOS;
552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else if (iOSVersion)
553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Platform = IPhoneOS;
554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else if (iOSSimVersion)
555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Platform = IPhoneOSSimulator;
556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else
557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    llvm_unreachable("Unable to infer Darwin variant");
558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
5593fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  // Reject invalid architecture combinations.
5603fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
5613fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar                        getTriple().getArch() != llvm::Triple::x86_64)) {
5625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
5633fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar      << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
5643fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar  }
5653fd823b0625eba87153fe592a0fd12e088db3b36Daniel Dunbar
5662603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  // Set the tool chain target information.
5672603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  unsigned Major, Minor, Micro;
5682603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar  bool HadExtra;
569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Platform == MacOS) {
5709d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
5711d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor,
5722603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar                                   Micro, HadExtra) || HadExtra ||
5738a3a7f36aea62a91d12a4aafd16cc32081ad11cfDaniel Dunbar        Major != 10 || Minor >= 100 || Micro >= 100)
5745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner      getDriver().Diag(diag::err_drv_invalid_version_number)
5752603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar        << OSXVersion->getAsString(Args);
576651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else if (Platform == IPhoneOS || Platform == IPhoneOSSimulator) {
5779d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
5789d609f2b0dd604879f8b284ded1f14ba300e8070Daniel Dunbar    assert(Version && "Unknown target platform!");
5791d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    if (!Driver::GetReleaseVersion(Version->getValue(), Major, Minor,
580983d835bead0134170a6646a8844926077c968d6Eli Friedman                                   Micro, HadExtra) || HadExtra ||
581983d835bead0134170a6646a8844926077c968d6Eli Friedman        Major >= 10 || Minor >= 100 || Micro >= 100)
582983d835bead0134170a6646a8844926077c968d6Eli Friedman      getDriver().Diag(diag::err_drv_invalid_version_number)
583983d835bead0134170a6646a8844926077c968d6Eli Friedman        << Version->getAsString(Args);
584651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else
585651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    llvm_unreachable("unknown kind of Darwin platform");
5865f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
5875f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // In GCC, the simulator historically was treated as being OS X in some
5885f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // contexts, like determining the link logic, despite generally being called
5895f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // with an iOS deployment target. For compatibility, we detect the
5905f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  // simulator as iOS + x86, and treat it differently in a few contexts.
5915f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar  if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
5925f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar                     getTriple().getArch() == llvm::Triple::x86_64))
593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Platform = IPhoneOSSimulator;
5945f5c37b1234e6ebb6c17e084bc4e2cce92e31585Daniel Dunbar
595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  setTarget(Platform, Major, Minor, Micro);
596c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar}
597c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
598132e35d2f87895d20e7ea146c8c00404b80221a1Daniel Dunbarvoid DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
599efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar                                      ArgStringList &CmdArgs) const {
600efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  CXXStdlibType Type = GetCXXStdlibType(Args);
601efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
602efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  switch (Type) {
603efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libcxx:
604efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lc++");
605efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
606efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
607efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  case ToolChain::CST_Libstdcxx: {
608efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
609efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // it was previously found in the gcc lib dir. However, for all the Darwin
610efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // platforms we care about it was -lstdc++.6, so we search for that
611efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // explicitly if we can't see an obvious -lstdc++ candidate.
612efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
613efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Check in the sysroot first.
614efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6157b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola      SmallString<128> P(A->getValue());
616ceb6dc8e5afbd8e4dad7aaa1948994965fd8ff2eBenjamin Kramer      llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
617efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
61840e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola      if (!llvm::sys::fs::exists(P.str())) {
6197b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola        llvm::sys::path::remove_filename(P);
6207b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola        llvm::sys::path::append(P, "libstdc++.6.dylib");
62140e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola        if (llvm::sys::fs::exists(P.str())) {
622efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          CmdArgs.push_back(Args.MakeArgString(P.str()));
623efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar          return;
624efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar        }
625efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      }
626efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
627efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
628efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, look in the root.
6295a5dcdc9314204f103b879b5033a736af0e3462bBob Wilson    // FIXME: This should be removed someday when we don't have to care about
6305a5dcdc9314204f103b879b5033a736af0e3462bBob Wilson    // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
63140e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola    if (!llvm::sys::fs::exists("/usr/lib/libstdc++.dylib") &&
63240e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola        llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib")) {
633efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
634efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar      return;
635efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    }
636efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
637efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    // Otherwise, let the linker search.
638efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    CmdArgs.push_back("-lstdc++");
639efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar    break;
640efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
641efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar  }
642efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar}
643efe91ea6bb6f45aaf663a43a1960998bc1eb9378Daniel Dunbar
6447433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Senvoid DarwinClang::AddCCKextLibArgs(const ArgList &Args,
6457433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen                                   ArgStringList &CmdArgs) const {
6467433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
6477433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For Darwin platforms, use the compiler-rt-based support library
6487433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // instead of the gcc-provided one (which is also incidentally
6497433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // only present in the gcc lib dir, which makes it hard to find).
6507433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
6517b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola  SmallString<128> P(getDriver().ResourceDir);
652ceb6dc8e5afbd8e4dad7aaa1948994965fd8ff2eBenjamin Kramer  llvm::sys::path::append(P, "lib", "darwin");
6537a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar
6547a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // Use the newer cc_kext for iOS ARM after 6.0.
6557a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  if (!isTargetIPhoneOS() || isTargetIOSSimulator() ||
656651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      getTriple().getArch() == llvm::Triple::arm64 ||
6576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      getTriple().getArch() == llvm::Triple::aarch64 ||
6587a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      !isIPhoneOSVersionLT(6, 0)) {
6597b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola    llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
6607a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  } else {
6617b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola    llvm::sys::path::append(P, "libclang_rt.cc_kext_ios5.a");
6627a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  }
663304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
6647433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // For now, allow missing resource libraries to support developers who may
6657433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen  // not have compiler-rt checked out or integrated into their build.
66640e6b30884d54c480f37c38beaa43390de7feb9eRafael Espindola  if (llvm::sys::fs::exists(P.str()))
6677433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen    CmdArgs.push_back(Args.MakeArgString(P.str()));
6687433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen}
6697433fedce98a58341d0f30c2e12e8d53f3bba575Shantonu Sen
670651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesDerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                     const char *BoundArch) const {
672c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
673c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  const OptTable &Opts = getDriver().getOpts();
674c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar
675c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // FIXME: We really want to get out of the tool chain level argument
676c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // translation business, as it makes the driver functionality much
677c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // more opaque. For now, we follow gcc closely solely for the
678c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // purpose of easily achieving feature parity & testability. Once we
679c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // have something that works, we should reevaluate each translation
680c0e665eb705762f95cd4f722ad7ecbdcde3f4527Daniel Dunbar  // and try to push it down into tool specific logic.
6812603137cb91e1d143b36fb71a72189884fbde5b5Daniel Dunbar
6826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (Arg *A : Args) {
6834e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar    if (A->getOption().matches(options::OPT_Xarch__)) {
6842a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      // Skip this argument unless the architecture matches either the toolchain
6852a45fa7cf67bf88a4edf56d637f6ec7326e44ef8Daniel Dunbar      // triple arch, or the arch being bound.
68664f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola      llvm::Triple::ArchType XarchArch =
687651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
68864f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola      if (!(XarchArch == getArch()  ||
68964f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola            (BoundArch && XarchArch ==
690651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             tools::darwin::getArchTypeForMachOArchName(BoundArch))))
6914e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
6924e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
6938ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      Arg *OriginalArg = A;
6941d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith      unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
6950e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      unsigned Prev = Index;
6966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
6971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
6984e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // If the argument parsing failed or more than one argument was
6994e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // consumed, the -Xarch_ argument's parameter tried to consume
7004e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // extra arguments. Emit an error and ignore.
7014e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      //
7024e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // We also want to disallow any options which would alter the
7034e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // driver behavior; that isn't going to work in our model. We
7044e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // use isDriverOption() as an approximation, although things
7054e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      // like -O4 are going to slip through.
7060e02f6ef48a098cc27a250e644415038c2fa52a5Daniel Dunbar      if (!XarchArg || Index > Prev + 1) {
7075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
7087e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar          << A->getAsString(Args);
7097e9293b8be1716149f2150f96e76876719f14e45Daniel Dunbar        continue;
71091e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer      } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
7115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner        getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
7124e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar          << A->getAsString(Args);
7134e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar        continue;
7144e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar      }
7154e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
716478edc295efc560627053e2320bedd2f696ae028Daniel Dunbar      XarchArg->setBaseArg(A);
7170e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar
7186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      A = XarchArg.release();
7190e10031ba5d0f9b3e5bc5570f39382d288779ab8Daniel Dunbar      DAL->AddSynthesizedArg(A);
7208ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar
7218ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // Linker input arguments require custom handling. The problem is that we
7228ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // have already constructed the phase actions, so we can not treat them as
7238ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      // "input arguments".
72491e06dab9335ed6b4474a74353549c708cf3d936Michael J. Spencer      if (A->getOption().hasFlag(options::LinkerInput)) {
7258ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        // Convert the argument into individual Zlinker_input_args.
7268ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
7278ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar          DAL->AddSeparateArg(OriginalArg,
7288ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar                              Opts.getOption(options::OPT_Zlinker_input),
7291d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith                              A->getValue(i));
730304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi
7318ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        }
7328ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar        continue;
7338ac38d7b5d88d12f454a7cda1275bf429813151dDaniel Dunbar      }
7341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
7354e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
736ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // Sob. These is strictly gcc compatible for the time being. Apple
737ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // gcc translates options twice, which means that self-expanding
738ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    // options add duplicates.
7399e1f98260a1842df4bb8e6de0b592a1622dcfdc0Daniel Dunbar    switch ((options::ID) A->getOption().getID()) {
740ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    default:
741ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
742ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
743ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
744ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_mkernel:
745ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fapple_kext:
746ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      DAL->append(A);
7479d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
748ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
7491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
750ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_dependency_file:
7519d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
7521d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith                          A->getValue());
753ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
754ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
755ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gfull:
7569d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
7579d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7589d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar               Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
759ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
760ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
761ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_gused:
7629d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
7639d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7649d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar             Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
765ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
766ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
767ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_shared:
7689d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
769ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
770ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
771ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fconstant_cfstrings:
7729d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
773ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
774ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
775ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_constant_cfstrings:
7769d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
777ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
778ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
779ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wnonportable_cfstrings:
7809d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7819d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                      Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
782ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
783ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
784ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_Wno_nonportable_cfstrings:
7859d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A,
7869d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar                   Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
787ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
788ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
789ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fpascal_strings:
7909d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
791ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
792ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
793ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    case options::OPT_fno_pascal_strings:
7949d0863b22faef1678eb191bbab7268809be60a96Daniel Dunbar      DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
795ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar      break;
796ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar    }
7974e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  }
7984e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar
79984ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (getTriple().getArch() == llvm::Triple::x86 ||
80084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      getTriple().getArch() == llvm::Triple::x86_64)
801e4bdae78c69d2a09ee96619cc5ccf81441674412Daniel Dunbar    if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
8026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
8036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                        "core2");
80484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
80584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  // Add the arch options based on the particular spelling of -arch, to match
806c97e96a61fca41e84d5af3027b91cc1db32f1654Chad Rosier  // how the driver driver works.
80784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  if (BoundArch) {
8085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Name = BoundArch;
809e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer    const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
810e4151c5d1b48efac740b89cc16e5054850cbdecbMichael J. Spencer    const Option MArch = Opts.getOption(options::OPT_march_EQ);
81184ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
81284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
81384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    // which defines the list of which architectures we accept.
81484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    if (Name == "ppc")
81584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
81684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc601")
8176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MCpu, "601");
81884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc603")
8196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MCpu, "603");
82084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604")
8216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MCpu, "604");
82284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc604e")
8236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MCpu, "604e");
82484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc750")
8256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MCpu, "750");
82684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7400")
8276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MCpu, "7400");
82884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc7450")
8296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MCpu, "7450");
83084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "ppc970")
8316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MCpu, "970");
83284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
833ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt    else if (Name == "ppc64" || Name == "ppc64le")
8346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
83584ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
83684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i386")
83784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar      ;
83884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i486")
8396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "i486");
84084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i586")
8416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "i586");
84284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "i686")
8436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "i686");
84484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium")
8456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "pentium");
84684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentium2")
8476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "pentium2");
84884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentpro")
8496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
85084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "pentIIm3")
8516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "pentium2");
85284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
85384ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "x86_64")
8546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
85532ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach    else if (Name == "x86_64h") {
8566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
8576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
85832ca73e33fcc7c75ea1c297755a300be3e9e5371Jim Grosbach    }
859ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
86084ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "arm")
8616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "armv4t");
86284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv4t")
8636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "armv4t");
86484ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv5")
8656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
86684ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "xscale")
8676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "xscale");
86884ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv6")
8696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "armv6k");
8702503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    else if (Name == "armv6m")
8716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "armv6m");
87284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar    else if (Name == "armv7")
8736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "armv7a");
8742503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    else if (Name == "armv7em")
8756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "armv7em");
876336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7k")
8776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "armv7k");
8782503ebd2cf9b4d28319551debaacff8b38765698Bob Wilson    else if (Name == "armv7m")
8796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "armv7m");
880336bfa3fb496228a8ab4070def5b4297e5f88358Bob Wilson    else if (Name == "armv7s")
8816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "armv7s");
88284ec96c8a810df59de4052368beab29f13456707Daniel Dunbar
883651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    else if (Name == "arm64")
8846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "arm64");
885651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    else if (Name == "armv8")
8866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DAL->AddJoinedArg(nullptr, MArch, "arm64");
88784ec96c8a810df59de4052368beab29f13456707Daniel Dunbar  }
888ec069ed8a6647d84cc3a58d46d5b2a3c9f000704Daniel Dunbar
889651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return DAL;
890651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
891651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
892651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid MachO::AddLinkRuntimeLibArgs(const llvm::opt::ArgList &Args,
893651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                  llvm::opt::ArgStringList &CmdArgs) const {
894651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Embedded targets are simple at the moment, not supporting sanitizers and
895651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // with different libraries for each member of the product { static, PIC } x
896651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // { hard-float, soft-float }
897651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
898651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CompilerRT +=
899651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      tools::arm::getARMFloatABI(getDriver(), Args, getTriple()) == "hard"
900651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          ? "hard"
901651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          : "soft";
902651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
903651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
904651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
905651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
906651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
907651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
908651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesDerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
909651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                      const char *BoundArch) const {
910651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // First get the generic Apple args, before moving onto Darwin-specific ones.
911651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
912651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const OptTable &Opts = getDriver().getOpts();
913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
914651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // If no architecture is bound, none of the translations here are relevant.
915651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!BoundArch)
916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return DAL;
917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
91860baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // Add an explicit version min argument for the deployment target. We do this
91960baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // after argument translation because -Xarch_ arguments may add a version min
92060baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar  // argument.
921651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  AddDeploymentTarget(*DAL);
92260baf0f6d54376805168d49fa68628f801f95ef9Daniel Dunbar
9237a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
9247a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // FIXME: It would be far better to avoid inserting those -static arguments,
9257a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // but we can't check the deployment target in the translation code until
9267a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  // it is set here.
927651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0) &&
9286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      getTriple().getArch() != llvm::Triple::arm64 &&
9296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      getTriple().getArch() != llvm::Triple::aarch64) {
9307a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
9317a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      Arg *A = *it;
9327a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      ++it;
9337a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      if (A->getOption().getID() != options::OPT_mkernel &&
9347a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar          A->getOption().getID() != options::OPT_fapple_kext)
9357a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar        continue;
9367a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      assert(it != ie && "unexpected argument translation");
9377a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      A = *it;
9387a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      assert(A->getOption().getID() == options::OPT_static &&
9397a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar             "missing expected -static argument");
9407a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar      it = DAL->getArgs().erase(it);
9417a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar    }
9427a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar  }
9437a0c064770355a4918df69f95de8dea6338a59a2Daniel Dunbar
94466dbb3f95e1666089acd3431792d02c623e459fcBob Wilson  // Default to use libc++ on OS X 10.9+ and iOS 7+.
94566dbb3f95e1666089acd3431792d02c623e459fcBob Wilson  if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
946651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0))) &&
94766dbb3f95e1666089acd3431792d02c623e459fcBob Wilson      !Args.getLastArg(options::OPT_stdlib_EQ))
9486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
9496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                      "libc++");
95066dbb3f95e1666089acd3431792d02c623e459fcBob Wilson
951163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  // Validate the C++ standard library choice.
952163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  CXXStdlibType Type = GetCXXStdlibType(*DAL);
953163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  if (Type == ToolChain::CST_Libcxx) {
954260611a32535c851237926bfcf78869b13c07d5bJohn McCall    // Check whether the target provides libc++.
955260611a32535c851237926bfcf78869b13c07d5bJohn McCall    StringRef where;
956260611a32535c851237926bfcf78869b13c07d5bJohn McCall
957651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Complain about targeting iOS < 5.0 in any way.
958651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
959377e5c108bd299930ca8e8cb6ebce1d22dfe35f9Bob Wilson      where = "iOS 5.0";
960260611a32535c851237926bfcf78869b13c07d5bJohn McCall
961260611a32535c851237926bfcf78869b13c07d5bJohn McCall    if (where != StringRef()) {
962163b151809beef8f917fd16c546016e83ae3e361Bob Wilson      getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
963260611a32535c851237926bfcf78869b13c07d5bJohn McCall        << where;
964163b151809beef8f917fd16c546016e83ae3e361Bob Wilson    }
965163b151809beef8f917fd16c546016e83ae3e361Bob Wilson  }
966163b151809beef8f917fd16c546016e83ae3e361Bob Wilson
9674e7e9cff2e3b1bf15da06a4284a936da15e19578Daniel Dunbar  return DAL;
9681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
9698eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::IsUnwindTablesDefault() const {
971a4a809e23ef17bef21afc50e70412a77567807aeRafael Espindola  return getArch() == llvm::Triple::x86_64;
9728eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
9738eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
974651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::UseDwarfDebugFlags() const {
975f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
976f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar    return S[0] != '\0';
977f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar  return false;
978f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar}
979f2d8b9f967a1ab53ee9fdbcc3ac0a4ee0a83a26eDaniel Dunbar
980b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbarbool Darwin::UseSjLjExceptions() const {
981b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  // Darwin uses SjLj exceptions on ARM.
982b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar  return (getTriple().getArch() == llvm::Triple::arm ||
983b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar          getTriple().getArch() == llvm::Triple::thumb);
984b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar}
985b2987d159a88ab0ee2e40c884eb4d77b42ab89b6Daniel Dunbar
986651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::isPICDefault() const {
9877ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return true;
9888eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
9898eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
990651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::isPIEDefault() const {
99152ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne  return false;
99252ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne}
99352ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne
994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::isPICDefaultForced() const {
995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return (getArch() == llvm::Triple::x86_64 ||
9966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          getArch() == llvm::Triple::arm64 ||
9976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines          getArch() == llvm::Triple::aarch64);
9988eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar}
9998eddb3fb6ff3dd20e3920380e1ce56df105b8a98Daniel Dunbar
1000651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool MachO::SupportsProfiling() const {
1001bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar  // Profiling instrumentation is only supported on x86.
100264f7ad9328e877779ec63638f39de4e10d2ff276Rafael Espindola  return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
1003bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar}
1004bbe8e3eff56ac1d79f3668d706536e3cebe28c18Daniel Dunbar
1005651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid Darwin::addMinVersionArgs(const llvm::opt::ArgList &Args,
1006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               llvm::opt::ArgStringList &CmdArgs) const {
1007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  VersionTuple TargetVersion = getTargetVersion();
1008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1009651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // If we had an explicit -mios-simulator-version-min argument, honor that,
1010651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // otherwise use the traditional deployment targets. We can't just check the
1011651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // is-sim attribute because existing code follows this path, and the linker
1012651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // may not handle the argument.
1013651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  //
1014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: We may be able to remove this, once we can verify no one depends on
1015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // it.
1016651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Args.hasArg(options::OPT_mios_simulator_version_min_EQ))
1017651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CmdArgs.push_back("-ios_simulator_version_min");
1018651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else if (isTargetIOSBased())
1019651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CmdArgs.push_back("-iphoneos_version_min");
1020651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else {
1021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    assert(isTargetMacOS() && "unexpected target");
1022651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CmdArgs.push_back("-macosx_version_min");
1023651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1024651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1025651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1026651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1027651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1028651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid Darwin::addStartObjectFileArgs(const llvm::opt::ArgList &Args,
1029651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                    llvm::opt::ArgStringList &CmdArgs) const {
1030651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Derived from startfile spec.
1031651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Args.hasArg(options::OPT_dynamiclib)) {
1032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Derived from darwin_dylib1 spec.
1033651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (isTargetIOSSimulator()) {
1034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      ; // iOS simulator does not need dylib1.o.
1035651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else if (isTargetIPhoneOS()) {
1036651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (isIPhoneOSVersionLT(3, 1))
1037651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        CmdArgs.push_back("-ldylib1.o");
1038651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else {
1039651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (isMacosxVersionLT(10, 5))
1040651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        CmdArgs.push_back("-ldylib1.o");
1041651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      else if (isMacosxVersionLT(10, 6))
1042651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        CmdArgs.push_back("-ldylib1.10.5.o");
1043651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else {
1045651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (Args.hasArg(options::OPT_bundle)) {
1046651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (!Args.hasArg(options::OPT_static)) {
1047651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // Derived from darwin_bundle1 spec.
1048651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        if (isTargetIOSSimulator()) {
1049651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          ; // iOS simulator does not need bundle1.o.
1050651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        } else if (isTargetIPhoneOS()) {
1051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          if (isIPhoneOSVersionLT(3, 1))
1052651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            CmdArgs.push_back("-lbundle1.o");
1053651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        } else {
1054651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          if (isMacosxVersionLT(10, 6))
1055651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            CmdArgs.push_back("-lbundle1.o");
1056651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        }
1057651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
1058651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else {
1059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1060651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        if (Args.hasArg(options::OPT_static) ||
1061651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            Args.hasArg(options::OPT_object) ||
1062651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            Args.hasArg(options::OPT_preload)) {
1063651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          CmdArgs.push_back("-lgcrt0.o");
1064651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        } else {
1065651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          CmdArgs.push_back("-lgcrt1.o");
1066651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1067651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          // darwin_crt2 spec is empty.
1068651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        }
1069651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // By default on OS X 10.8 and later, we don't link with a crt1.o
1070651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // file and the linker knows to use _main as the entry point.  But,
1071651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // when compiling with -pg, we need to link with the gcrt1.o file,
1072651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // so pass the -no_new_main option to tell the linker to use the
1073651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        // "start" symbol as the entry point.
1074651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1075651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          CmdArgs.push_back("-no_new_main");
1076651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      } else {
1077651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        if (Args.hasArg(options::OPT_static) ||
1078651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            Args.hasArg(options::OPT_object) ||
1079651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            Args.hasArg(options::OPT_preload)) {
1080651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          CmdArgs.push_back("-lcrt0.o");
1081651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        } else {
1082651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          // Derived from darwin_crt1 spec.
1083651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          if (isTargetIOSSimulator()) {
1084651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            ; // iOS simulator does not need crt1.o.
1085651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          } else if (isTargetIPhoneOS()) {
10866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines            if (getArch() == llvm::Triple::arm64 ||
10876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                getArch() == llvm::Triple::aarch64)
1088651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              ; // iOS does not need any crt1 files for arm64
1089651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            else if (isIPhoneOSVersionLT(3, 1))
1090651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              CmdArgs.push_back("-lcrt1.o");
1091651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            else if (isIPhoneOSVersionLT(6, 0))
1092651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              CmdArgs.push_back("-lcrt1.3.1.o");
1093651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          } else {
1094651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            if (isMacosxVersionLT(10, 5))
1095651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              CmdArgs.push_back("-lcrt1.o");
1096651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            else if (isMacosxVersionLT(10, 6))
1097651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              CmdArgs.push_back("-lcrt1.10.5.o");
1098651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            else if (isMacosxVersionLT(10, 8))
1099651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              CmdArgs.push_back("-lcrt1.10.6.o");
1100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines            // darwin_crt2 spec is empty.
1102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          }
1103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        }
1104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
1105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
1109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      isMacosxVersionLT(10, 5)) {
1110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CmdArgs.push_back(Str);
1112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
111543a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbarbool Darwin::SupportsObjCGC() const {
1116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return isTargetMacOS();
111743a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar}
111843a9b3263cb0bcb050cc75c15b3e6a8951e6b97aDaniel Dunbar
11190a7dd788dbef975f35f273c7ab913f480f7edd60John McCallvoid Darwin::CheckObjCARC() const {
1120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (isTargetIOSBased()|| (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
11210a7dd788dbef975f35f273c7ab913f480f7edd60John McCall    return;
112280fd37a57176433d05854dff27b9c5fa869fadd2John McCall  getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
11235840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis}
11245840dd9a09c458ef894e7d47caab1d90dc4c1112Argyrios Kyrtzidis
11253917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// Generic_GCC - A tool chain using the 'gcc' command to perform
11263917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// all subcommands; this relies on gcc translating the majority of
11273917608370583fa30c466b6c3893448229aea9adDaniel Dunbar/// command line options.
11283917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
112919347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Parse a GCCVersion object out of a string of text.
113019347edf7809866350750a1997ec4db009832fa4Chandler Carruth///
113119347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This is the primary means of forming GCCVersion objects.
113219347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/
113319347edf7809866350750a1997ec4db009832fa4Chandler CarruthGeneric_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
11340affc67389171834adf113e3a0422a32218a6192Chandler Carruth  const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "", "", "" };
113519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  std::pair<StringRef, StringRef> First = VersionText.split('.');
113619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  std::pair<StringRef, StringRef> Second = First.second.split('.');
113719347edf7809866350750a1997ec4db009832fa4Chandler Carruth
11380affc67389171834adf113e3a0422a32218a6192Chandler Carruth  GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "", "", "" };
113919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (First.first.getAsInteger(10, GoodVersion.Major) ||
114019347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.Major < 0)
114119347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return BadVersion;
11420affc67389171834adf113e3a0422a32218a6192Chandler Carruth  GoodVersion.MajorStr = First.first.str();
114319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
114419347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GoodVersion.Minor < 0)
114519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    return BadVersion;
11460affc67389171834adf113e3a0422a32218a6192Chandler Carruth  GoodVersion.MinorStr = Second.first.str();
114719347edf7809866350750a1997ec4db009832fa4Chandler Carruth
114819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // First look for a number prefix and parse that if present. Otherwise just
114919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // stash the entire patch string in the suffix, and leave the number
115019347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // unspecified. This covers versions strings such as:
115119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4
115219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.0
115319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.x
115419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.2-rc4
115519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  //   4.4.x-patched
115619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // And retains any patch number it finds.
115719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
115819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  if (!PatchText.empty()) {
1159ca1ad5018da214b9ff584f57288258424eb76089Will Dietz    if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
116019347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // Try to parse the number and any suffix.
116119347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
116219347edf7809866350750a1997ec4db009832fa4Chandler Carruth          GoodVersion.Patch < 0)
116319347edf7809866350750a1997ec4db009832fa4Chandler Carruth        return BadVersion;
11640affc67389171834adf113e3a0422a32218a6192Chandler Carruth      GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
116519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
116619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
116719347edf7809866350750a1997ec4db009832fa4Chandler Carruth
116819347edf7809866350750a1997ec4db009832fa4Chandler Carruth  return GoodVersion;
116919347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
117019347edf7809866350750a1997ec4db009832fa4Chandler Carruth
117119347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
1172ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramerbool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1173ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer                                          int RHSPatch,
1174ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer                                          StringRef RHSPatchSuffix) const {
1175ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer  if (Major != RHSMajor)
1176ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer    return Major < RHSMajor;
1177ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer  if (Minor != RHSMinor)
1178ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer    return Minor < RHSMinor;
1179ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer  if (Patch != RHSPatch) {
1180f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Note that versions without a specified patch sort higher than those with
1181f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // a patch.
1182ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer    if (RHSPatch == -1)
1183f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth      return true;
1184f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    if (Patch == -1)
1185f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth      return false;
1186f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth
1187f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Otherwise just sort on the patch itself.
1188ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer    return Patch < RHSPatch;
1189f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  }
1190ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer  if (PatchSuffix != RHSPatchSuffix) {
1191f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Sort empty suffixes higher.
1192ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer    if (RHSPatchSuffix.empty())
1193f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth      return true;
1194f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    if (PatchSuffix.empty())
11955ba0c8e4077902f53e5f3e8271e470a1d8c1c074Chandler Carruth      return false;
1196f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth
1197f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth    // Provide a lexicographic sort to make this a total ordering.
1198ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer    return PatchSuffix < RHSPatchSuffix;
1199f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  }
1200f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth
1201f1757659dd59a0e07e8607fca8d3f052e04d0aecChandler Carruth  // The versions are equal.
120219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  return false;
120319347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
120419347edf7809866350750a1997ec4db009832fa4Chandler Carruth
1205651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
12060e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
12070e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  if (A)
12081d489cf4a04ad0ad8ac2696e4eed0995f3a67288Richard Smith    return A->getValue();
12090e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  return GCC_INSTALL_PREFIX;
12100e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola}
12110e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola
1212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines/// \brief Initialize a GCCInstallationDetector from the driver.
121319347edf7809866350750a1997ec4db009832fa4Chandler Carruth///
121419347edf7809866350750a1997ec4db009832fa4Chandler Carruth/// This performs all of the autodetection and sets up the various paths.
12150407a04049016bdd6fe4fda462aa199d82c750d4Gabor Greif/// Once constructed, a GCCInstallationDetector is essentially immutable.
12161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth///
12171c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
12181c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// should instead pull the target out of the driver. This is currently
12191c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// necessary because the driver doesn't store the final version of the target
12201c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth/// triple.
1221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid
1222651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesGeneric_GCC::GCCInstallationDetector::init(
1223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const Driver &D, const llvm::Triple &TargetTriple, const ArgList &Args) {
1224d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  llvm::Triple BiarchVariantTriple =
1225d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth      TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
12269b338a7bca39a68ae9f8c57d9210f19f7e45b665Chandler Carruth                                 : TargetTriple.get32BitArchVariant();
122719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // The library directories which may contain GCC installations.
1228d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
122919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // The compatible GCC triples for this particular architecture.
12301c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  SmallVector<StringRef, 10> CandidateTripleAliases;
1231d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  SmallVector<StringRef, 10> CandidateBiarchTripleAliases;
1232d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1233d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                           CandidateTripleAliases, CandidateBiarchLibDirs,
1234d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                           CandidateBiarchTripleAliases);
123519347edf7809866350750a1997ec4db009832fa4Chandler Carruth
123619347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Compute the set of prefixes for our search.
123719347edf7809866350750a1997ec4db009832fa4Chandler Carruth  SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
123819347edf7809866350750a1997ec4db009832fa4Chandler Carruth                                       D.PrefixDirs.end());
1239353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola
12400e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  StringRef GCCToolchainDir = getGCCToolchainDir(Args);
12410e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  if (GCCToolchainDir != "") {
12420e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    if (GCCToolchainDir.back() == '/')
12430e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola      GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
1244353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola
12450e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola    Prefixes.push_back(GCCToolchainDir);
1246353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola  } else {
124769ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola    // If we have a SysRoot, try that first.
124869ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola    if (!D.SysRoot.empty()) {
124969ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola      Prefixes.push_back(D.SysRoot);
125069ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola      Prefixes.push_back(D.SysRoot + "/usr");
125169ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola    }
125269ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola
125369ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola    // Then look for gcc installed alongside clang.
1254353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola    Prefixes.push_back(D.InstalledDir + "/..");
125569ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola
125669ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola    // And finally in /usr.
125769ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola    if (D.SysRoot.empty())
125869ca5e263feb5d231a81bbd28f96bca6a630bd50Rafael Espindola      Prefixes.push_back("/usr");
1259353300c4af020ce5d8368d1c336cbf7583c33a7dRafael Espindola  }
126019347edf7809866350750a1997ec4db009832fa4Chandler Carruth
126119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Loop over the various components which exist and select the best GCC
126219347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // installation available. GCC installs are ranked by version number.
126319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  Version = GCCVersion::Parse("0.0.0");
126419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
126519347edf7809866350750a1997ec4db009832fa4Chandler Carruth    if (!llvm::sys::fs::exists(Prefixes[i]))
126619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      continue;
126719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
126819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
126919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (!llvm::sys::fs::exists(LibDir))
127019347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
12711c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k)
1272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        ScanLibDirForGCCTriple(TargetTriple, Args, LibDir,
1273f4bd32957c686891cbdb7e2124630f6686343a2aSimon Atanasyan                               CandidateTripleAliases[k]);
12741c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    }
1275d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    for (unsigned j = 0, je = CandidateBiarchLibDirs.size(); j < je; ++j) {
1276d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth      const std::string LibDir = Prefixes[i] + CandidateBiarchLibDirs[j].str();
12771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      if (!llvm::sys::fs::exists(LibDir))
12781c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth        continue;
1279d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth      for (unsigned k = 0, ke = CandidateBiarchTripleAliases.size(); k < ke;
12801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth           ++k)
1281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        ScanLibDirForGCCTriple(TargetTriple, Args, LibDir,
1282d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                               CandidateBiarchTripleAliases[k],
1283d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                               /*NeedsBiarchSuffix=*/ true);
128419347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
128519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
128619347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
128719347edf7809866350750a1997ec4db009832fa4Chandler Carruth
12886365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruthvoid Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
12896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (const auto &InstallPath : CandidateGCCInstallPaths)
12906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    OS << "Found candidate GCC installation: " << InstallPath << "\n";
12916365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth
1292651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (!GCCInstallPath.empty())
1293651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1294651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
12956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (const auto &Multilib : Multilibs)
12966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    OS << "Candidate multilib: " << Multilib << "\n";
1297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1299651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    OS << "Selected multilib: " << SelectedMultilib << "\n";
1300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1303651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (BiarchSibling.hasValue()) {
1304651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    M = BiarchSibling.getValue();
1305651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return true;
1306651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1307651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return false;
13086365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth}
13096365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth
131019347edf7809866350750a1997ec4db009832fa4Chandler Carruth/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
1311d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
13121c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &LibDirs,
13131c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    SmallVectorImpl<StringRef> &TripleAliases,
1314d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    SmallVectorImpl<StringRef> &BiarchLibDirs,
1315d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    SmallVectorImpl<StringRef> &BiarchTripleAliases) {
13161c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Declare a bunch of static data sets that we'll select between below. These
13171c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // are specifically designed to always refer to string literals to avoid any
13181c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // lifetime or initialization issues.
13196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  static const char *const AArch64LibDirs[] = { "/lib64", "/lib" };
1320d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  static const char *const AArch64Triples[] = { "aarch64-none-linux-gnu",
13216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                "aarch64-linux-gnu",
13226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                "aarch64-linux-android",
13236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                "aarch64-redhat-linux" };
1324651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const char *const AArch64beLibDirs[] = { "/lib" };
1325651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const char *const AArch64beTriples[] = { "aarch64_be-none-linux-gnu",
1326651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                  "aarch64_be-linux-gnu" };
1327c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover
13281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const ARMLibDirs[] = { "/lib" };
1329d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  static const char *const ARMTriples[] = { "arm-linux-gnueabi",
1330d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                                            "arm-linux-androideabi" };
1331d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  static const char *const ARMHFTriples[] = { "arm-linux-gnueabihf",
1332d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                                              "armv7hl-redhat-linux-gnueabi" };
1333651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const char *const ARMebLibDirs[] = { "/lib" };
1334651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const char *const ARMebTriples[] = { "armeb-linux-gnueabi",
1335651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                              "armeb-linux-androideabi" };
1336651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const char *const ARMebHFTriples[] = { "armeb-linux-gnueabihf",
1337651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                "armebv7hl-redhat-linux-gnueabi" };
13381c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
13391c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
13401c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86_64Triples[] = {
1341d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", "x86_64-pc-linux-gnu",
1342d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "x86_64-redhat-linux6E", "x86_64-redhat-linux", "x86_64-suse-linux",
1343651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    "x86_64-manbo-linux-gnu", "x86_64-linux-gnu", "x86_64-slackware-linux",
1344ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    "x86_64-linux-android", "x86_64-unknown-linux"
13451c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
1346ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  static const char *const X32LibDirs[] = { "/libx32" };
13471c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86LibDirs[] = { "/lib32", "/lib" };
13481c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const X86Triples[] = {
1349d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu", "i386-linux-gnu",
1350d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "i386-redhat-linux6E", "i686-redhat-linux", "i586-redhat-linux",
1351d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "i386-redhat-linux", "i586-suse-linux", "i486-slackware-linux",
1352651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    "i686-montavista-linux", "i686-linux-android"
13531c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
13541c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
13551c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSLibDirs[] = { "/lib" };
13564e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  static const char *const MIPSTriples[] = { "mips-linux-gnu",
1357ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                             "mips-mti-linux-gnu",
1358ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                             "mips-img-linux-gnu" };
13591c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const MIPSELLibDirs[] = { "/lib" };
1360d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  static const char *const MIPSELTriples[] = { "mipsel-linux-gnu",
1361ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                               "mipsel-linux-android",
1362ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                               "mips-img-linux-gnu" };
13631c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
1364b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" };
13654e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  static const char *const MIPS64Triples[] = { "mips64-linux-gnu",
1366ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                               "mips-mti-linux-gnu",
1367ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                               "mips-img-linux-gnu",
1368ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                               "mips64-linux-gnuabi64" };
1369b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" };
13704e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu",
1371651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                 "mips-mti-linux-gnu",
1372ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                                 "mips-img-linux-gnu",
1373ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                                 "mips64el-linux-android",
1374ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                                 "mips64el-linux-gnuabi64" };
1375b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan
13761c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
13771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPCTriples[] = {
1378d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1379d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "powerpc-suse-linux", "powerpc-montavista-linuxspe"
13801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  };
13811c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
1382d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  static const char *const PPC64Triples[] = { "powerpc64-linux-gnu",
1383d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                                              "powerpc64-unknown-linux-gnu",
1384d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                                              "powerpc64-suse-linux",
1385d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                                              "ppc64-redhat-linux" };
1386ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt  static const char *const PPC64LELibDirs[] = { "/lib64", "/lib" };
1387ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt  static const char *const PPC64LETriples[] = { "powerpc64le-linux-gnu",
1388ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt                                                "powerpc64le-unknown-linux-gnu",
1389ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt                                                "powerpc64le-suse-linux",
1390ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt                                                "ppc64le-redhat-linux" };
13911c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
1392651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const char *const SPARCv8LibDirs[] = { "/lib32", "/lib" };
1393651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const char *const SPARCv8Triples[] = { "sparc-linux-gnu",
1394651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                "sparcv8-linux-gnu" };
1395651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const char *const SPARCv9LibDirs[] = { "/lib64", "/lib" };
1396651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static const char *const SPARCv9Triples[] = { "sparc64-linux-gnu",
1397651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                "sparcv9-linux-gnu" };
1398651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1399b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand  static const char *const SystemZLibDirs[] = { "/lib64", "/lib" };
1400b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand  static const char *const SystemZTriples[] = {
1401d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1402d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "s390x-suse-linux", "s390x-redhat-linux"
1403b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand  };
1404b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand
14051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  switch (TargetTriple.getArch()) {
1406651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::arm64:
1407c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  case llvm::Triple::aarch64:
1408d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    LibDirs.append(AArch64LibDirs,
1409d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                   AArch64LibDirs + llvm::array_lengthof(AArch64LibDirs));
1410d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    TripleAliases.append(AArch64Triples,
1411d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         AArch64Triples + llvm::array_lengthof(AArch64Triples));
1412d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchLibDirs.append(AArch64LibDirs,
1413d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         AArch64LibDirs + llvm::array_lengthof(AArch64LibDirs));
1414d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchTripleAliases.append(
1415d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        AArch64Triples, AArch64Triples + llvm::array_lengthof(AArch64Triples));
1416c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    break;
14176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case llvm::Triple::arm64_be:
1418651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::aarch64_be:
1419651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LibDirs.append(AArch64beLibDirs,
1420651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                   AArch64beLibDirs + llvm::array_lengthof(AArch64beLibDirs));
1421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TripleAliases.append(AArch64beTriples,
1422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         AArch64beTriples + llvm::array_lengthof(AArch64beTriples));
1423651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    BiarchLibDirs.append(AArch64beLibDirs,
1424651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         AArch64beLibDirs + llvm::array_lengthof(AArch64beLibDirs));
1425651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    BiarchTripleAliases.append(
1426651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        AArch64beTriples, AArch64beTriples + llvm::array_lengthof(AArch64beTriples));
1427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    break;
14281c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::arm:
14291c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::thumb:
143019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
1431ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1432d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth      TripleAliases.append(ARMHFTriples,
1433d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                           ARMHFTriples + llvm::array_lengthof(ARMHFTriples));
1434ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    } else {
1435d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth      TripleAliases.append(ARMTriples,
1436d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                           ARMTriples + llvm::array_lengthof(ARMTriples));
1437ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    }
14381c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
1439651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::armeb:
1440651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::thumbeb:
1441651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LibDirs.append(ARMebLibDirs, ARMebLibDirs + llvm::array_lengthof(ARMebLibDirs));
1442651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
1443651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      TripleAliases.append(ARMebHFTriples,
1444651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           ARMebHFTriples + llvm::array_lengthof(ARMebHFTriples));
1445651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else {
1446651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      TripleAliases.append(ARMebTriples,
1447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                           ARMebTriples + llvm::array_lengthof(ARMebTriples));
1448651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
1449651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    break;
14501c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::x86_64:
1451d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    LibDirs.append(X86_64LibDirs,
1452d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                   X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1453d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    TripleAliases.append(X86_64Triples,
1454d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         X86_64Triples + llvm::array_lengthof(X86_64Triples));
1455ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // x32 is always available when x86_64 is available, so adding it as secondary
1456ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // arch with x86_64 triples
1457ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
1458ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      BiarchLibDirs.append(X32LibDirs,
1459ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                           X32LibDirs + llvm::array_lengthof(X32LibDirs));
1460ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      BiarchTripleAliases.append(X86_64Triples,
1461ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                 X86_64Triples + llvm::array_lengthof(X86_64Triples));
1462ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    } else {
1463ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      BiarchLibDirs.append(X86LibDirs,
1464ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                           X86LibDirs + llvm::array_lengthof(X86LibDirs));
1465ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      BiarchTripleAliases.append(X86Triples,
1466ef8225444452a1486bd721f3285301fe84643b00Stephen Hines                                 X86Triples + llvm::array_lengthof(X86Triples));
1467ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
14681c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
14691c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::x86:
147019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
1471d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    TripleAliases.append(X86Triples,
1472d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         X86Triples + llvm::array_lengthof(X86Triples));
1473d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchLibDirs.append(X86_64LibDirs,
1474d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1475d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchTripleAliases.append(
1476d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
14771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
14781c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::mips:
1479d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    LibDirs.append(MIPSLibDirs,
1480d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                   MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1481d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    TripleAliases.append(MIPSTriples,
1482d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         MIPSTriples + llvm::array_lengthof(MIPSTriples));
1483d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchLibDirs.append(MIPS64LibDirs,
1484d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1485d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchTripleAliases.append(
1486d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
14871c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
14881c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::mipsel:
1489d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    LibDirs.append(MIPSELLibDirs,
1490d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                   MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1491d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    TripleAliases.append(MIPSELTriples,
1492d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
14934e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan    TripleAliases.append(MIPSTriples,
14944e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan                         MIPSTriples + llvm::array_lengthof(MIPSTriples));
1495d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchLibDirs.append(
1496d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        MIPS64ELLibDirs,
1497d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1498d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchTripleAliases.append(
1499d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        MIPS64ELTriples,
1500d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1501b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    break;
1502b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  case llvm::Triple::mips64:
1503d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    LibDirs.append(MIPS64LibDirs,
1504d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                   MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1505d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    TripleAliases.append(MIPS64Triples,
1506d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1507d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchLibDirs.append(MIPSLibDirs,
1508d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1509d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchTripleAliases.append(MIPSTriples,
1510d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                               MIPSTriples + llvm::array_lengthof(MIPSTriples));
1511b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    break;
1512b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan  case llvm::Triple::mips64el:
1513d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    LibDirs.append(MIPS64ELLibDirs,
1514d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                   MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1515b8c4381ae046e7dea389567595b1df66e9553b18Simon Atanasyan    TripleAliases.append(
1516d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        MIPS64ELTriples,
1517d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1518d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchLibDirs.append(MIPSELLibDirs,
1519d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1520d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchTripleAliases.append(
1521d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
15224e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan    BiarchTripleAliases.append(
15234e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan        MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
15241c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
15251c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::ppc:
152619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
1527d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    TripleAliases.append(PPCTriples,
1528d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         PPCTriples + llvm::array_lengthof(PPCTriples));
1529d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchLibDirs.append(PPC64LibDirs,
1530d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1531d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchTripleAliases.append(
1532d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
15331c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
15341c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  case llvm::Triple::ppc64:
1535d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    LibDirs.append(PPC64LibDirs,
1536d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                   PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1537d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    TripleAliases.append(PPC64Triples,
1538d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         PPC64Triples + llvm::array_lengthof(PPC64Triples));
1539d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchLibDirs.append(PPCLibDirs,
1540d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
1541d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchTripleAliases.append(PPCTriples,
1542d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                               PPCTriples + llvm::array_lengthof(PPCTriples));
15431c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
1544ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt  case llvm::Triple::ppc64le:
1545ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt    LibDirs.append(PPC64LELibDirs,
1546ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt                   PPC64LELibDirs + llvm::array_lengthof(PPC64LELibDirs));
1547ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt    TripleAliases.append(PPC64LETriples,
1548ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt                         PPC64LETriples + llvm::array_lengthof(PPC64LETriples));
1549ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt    break;
1550651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::sparc:
1551651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LibDirs.append(SPARCv8LibDirs,
1552651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                   SPARCv8LibDirs + llvm::array_lengthof(SPARCv8LibDirs));
1553651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TripleAliases.append(SPARCv8Triples,
1554651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         SPARCv8Triples + llvm::array_lengthof(SPARCv8Triples));
1555651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    BiarchLibDirs.append(SPARCv9LibDirs,
1556651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         SPARCv9LibDirs + llvm::array_lengthof(SPARCv9LibDirs));
1557651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    BiarchTripleAliases.append(
1558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        SPARCv9Triples, SPARCv9Triples + llvm::array_lengthof(SPARCv9Triples));
1559651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    break;
1560651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::sparcv9:
1561651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    LibDirs.append(SPARCv9LibDirs,
1562651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                   SPARCv9LibDirs + llvm::array_lengthof(SPARCv9LibDirs));
1563651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    TripleAliases.append(SPARCv9Triples,
1564651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         SPARCv9Triples + llvm::array_lengthof(SPARCv9Triples));
1565651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    BiarchLibDirs.append(SPARCv8LibDirs,
1566651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         SPARCv8LibDirs + llvm::array_lengthof(SPARCv8LibDirs));
1567651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    BiarchTripleAliases.append(
1568651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        SPARCv8Triples, SPARCv8Triples + llvm::array_lengthof(SPARCv8Triples));
1569651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    break;
1570b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand  case llvm::Triple::systemz:
1571d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    LibDirs.append(SystemZLibDirs,
1572d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                   SystemZLibDirs + llvm::array_lengthof(SystemZLibDirs));
1573d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    TripleAliases.append(SystemZTriples,
1574d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth                         SystemZTriples + llvm::array_lengthof(SystemZTriples));
1575b8409215523e5478b8b0aa9cdcd10038cf7651feUlrich Weigand    break;
15761c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
15771c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  default:
15781c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    // By default, just rely on the standard lib directories and the original
15791c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    // triple.
15801c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    break;
158119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
15821c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
15831c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Always append the drivers target triple to the end, in case it doesn't
15841c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // match any of our aliases.
15851c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  TripleAliases.push_back(TargetTriple.str());
15861c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth
15871c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  // Also include the multiarch variant if it's different.
1588d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  if (TargetTriple.str() != BiarchTriple.str())
1589d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    BiarchTripleAliases.push_back(BiarchTriple.str());
159019347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
159119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
1592651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace {
1593651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Filter to remove Multilibs that don't exist as a suffix to Path
1594651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesclass FilterNonExistent : public MultilibSet::FilterCallback {
1595651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::string Base;
1596651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespublic:
1597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FilterNonExistent(std::string Base) : Base(Base) {}
1598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool operator()(const Multilib &M) const override {
1599651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return !llvm::sys::fs::exists(Base + M.gccSuffix() + "/crtbegin.o");
1600651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1601651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
1602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} // end anonymous namespace
16038e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
1604651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic void addMultilibFlag(bool Enabled, const char *const Flag,
1605651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                            std::vector<std::string> &Flags) {
1606651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Enabled)
1607651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Flags.push_back(std::string("+") + Flag);
1608651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else
1609651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Flags.push_back(std::string("-") + Flag);
16108e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan}
16118e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
16128e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyanstatic bool isMipsArch(llvm::Triple::ArchType Arch) {
1613651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1614651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1615651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1616651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isMips32(llvm::Triple::ArchType Arch) {
1618651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1619651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1620651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1621651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isMips64(llvm::Triple::ArchType Arch) {
1622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1623651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1624651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1625651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isMipsEL(llvm::Triple::ArchType Arch) {
1626651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1627651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1629651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isMipsEB(llvm::Triple::ArchType Arch) {
1630651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return Arch == llvm::Triple::mips || Arch == llvm::Triple::mips64;
16318e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan}
16328e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
16338e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyanstatic bool isMips16(const ArgList &Args) {
16348e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  Arg *A = Args.getLastArg(options::OPT_mips16,
16358e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan                           options::OPT_mno_mips16);
16368e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  return A && A->getOption().matches(options::OPT_mips16);
16378e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan}
16388e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
163987d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyanstatic bool isMips32r2(const ArgList &Args) {
164087d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan  Arg *A = Args.getLastArg(options::OPT_march_EQ,
164187d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan                           options::OPT_mcpu_EQ);
164287d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan
164387d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan  return A && A->getValue() == StringRef("mips32r2");
164487d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan}
164587d52eb5ae91f4b5f1ce8c9ee747217843d4ffcfSimon Atanasyan
16464e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyanstatic bool isMips64r2(const ArgList &Args) {
16474e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  Arg *A = Args.getLastArg(options::OPT_march_EQ,
16484e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan                           options::OPT_mcpu_EQ);
16494e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan
1650ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return A && (A->getValue() == StringRef("mips64r2") ||
1651ef8225444452a1486bd721f3285301fe84643b00Stephen Hines               A->getValue() == StringRef("octeon"));
16524e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan}
16534e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan
16548e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyanstatic bool isMicroMips(const ArgList &Args) {
16558e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  Arg *A = Args.getLastArg(options::OPT_mmicromips,
16568e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan                           options::OPT_mno_micromips);
16578e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  return A && A->getOption().matches(options::OPT_mmicromips);
16588e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan}
16598e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
16606c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sandersstatic bool isMipsFP64(const ArgList &Args) {
16616c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders  Arg *A = Args.getLastArg(options::OPT_mfp64, options::OPT_mfp32);
16626c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders  return A && A->getOption().matches(options::OPT_mfp64);
16636c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders}
16646c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders
16654e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyanstatic bool isMipsNan2008(const ArgList &Args) {
16664e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  Arg *A = Args.getLastArg(options::OPT_mnan_EQ);
16674e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  return A && A->getValue() == StringRef("2008");
16684e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan}
16694e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan
16706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct DetectedMultilibs {
16716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// The set of multilibs that the detected installation supports.
16726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  MultilibSet Multilibs;
16736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
16746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// The primary multilib appropriate for the given flags.
16756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Multilib SelectedMultilib;
16766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
16776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// On Biarch systems, this corresponds to the default multilib when
16786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  /// targeting the non-default multilib. Otherwise, it is empty.
16796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  llvm::Optional<Multilib> BiarchSibling;
16806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
16816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
16826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic bool findMIPSMultilibs(const llvm::Triple &TargetTriple, StringRef Path,
16836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                              const llvm::opt::ArgList &Args,
16846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                              DetectedMultilibs &Result) {
16854e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // Some MIPS toolchains put libraries and object files compiled
16864e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // using different options in to the sub-directoris which names
16874e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // reflects the flags used for compilation. For example sysroot
16884e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // directory might looks like the following examples:
16894e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //
16904e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // /usr
16914e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //   /lib      <= crt*.o files compiled with '-mips32'
16924e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // /mips16
16934e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //   /usr
16944e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //     /lib    <= crt*.o files compiled with '-mips16'
16954e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //   /el
16964e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //     /usr
16974e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //       /lib  <= crt*.o files compiled with '-mips16 -EL'
16984e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //
16994e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // or
17004e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //
17014e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // /usr
17024e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //   /lib      <= crt*.o files compiled with '-mips32r2'
17034e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // /mips16
17044e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //   /usr
17054e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //     /lib    <= crt*.o files compiled with '-mips32r2 -mips16'
17064e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // /mips32
17074e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //     /usr
17084e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  //       /lib  <= crt*.o files compiled with '-mips32'
17094e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan
1710651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FilterNonExistent NonExistent(Path);
1711651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1712651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Check for FSF toolchain multilibs
1713651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  MultilibSet FSFMipsMultilibs;
1714651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  {
1715651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MArchMips32 = Multilib()
1716651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/mips32")
1717651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/mips32")
1718651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/mips32")
1719651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+m32").flag("-m64").flag("-mmicromips").flag("-march=mips32r2");
1720651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MArchMicroMips = Multilib()
1722651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/micromips")
1723651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/micromips")
1724651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/micromips")
1725651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+m32").flag("-m64").flag("+mmicromips");
1726651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1727651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MArchMips64r2 = Multilib()
1728651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/mips64r2")
1729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/mips64r2")
1730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/mips64r2")
1731651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("-m32").flag("+m64").flag("+march=mips64r2");
1732651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1733651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MArchMips64 = Multilib()
1734651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/mips64")
1735651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/mips64")
1736651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/mips64")
1737651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("-m32").flag("+m64").flag("-march=mips64r2");
1738651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1739651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MArchDefault = Multilib()
1740651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+m32").flag("-m64").flag("+march=mips32r2");
1741651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1742651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib Mips16 = Multilib()
1743651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/mips16")
1744651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/mips16")
1745651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/mips16")
1746651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+mips16");
1747651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1748651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MAbi64 = Multilib()
1749651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/64")
1750651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/64")
1751651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/64")
1752651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+mabi=64").flag("-mabi=n32").flag("-m32");
1753651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1754651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib BigEndian = Multilib()
1755651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+EB").flag("-EL");
1756651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1757651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib LittleEndian = Multilib()
1758651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/el")
1759651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/el")
1760651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/el")
1761651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+EL").flag("-EB");
1762651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1763651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib SoftFloat = Multilib()
1764651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/sof")
1765651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/sof")
1766651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/sof")
1767651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+msoft-float");
1768651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1769651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib FP64 = Multilib()
1770651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/fp64")
1771651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/fp64")
1772651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/fp64")
1773651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+mfp64");
1774651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1775651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib Nan2008 = Multilib()
1776651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/nan2008")
1777651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/nan2008")
1778651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/nan2008")
1779651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+mnan=2008");
1780651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1781651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    FSFMipsMultilibs = MultilibSet()
1782651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Either(MArchMips32, MArchMicroMips,
1783651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines              MArchMips64r2, MArchMips64, MArchDefault)
1784651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Maybe(Mips16)
1785651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("/mips64/mips16")
1786651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("/mips64r2/mips16")
1787651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("/micromips/mips16")
1788651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Maybe(MAbi64)
1789651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("/micromips/64")
1790651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("/mips32/64")
1791651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("^/64")
1792651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("/mips16/64")
1793651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Either(BigEndian, LittleEndian)
1794651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Maybe(SoftFloat)
1795651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Maybe(FP64)
1796651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Maybe(Nan2008)
1797651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut(".*sof/nan2008")
1798651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut(".*sof/fp64")
1799651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut(NonExistent);
1800651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1801651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1802651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Check for Code Sourcery toolchain multilibs
1803651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  MultilibSet CSMipsMultilibs;
1804651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  {
1805651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MArchMips16 = Multilib()
1806651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/mips16")
1807651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/mips16")
1808651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/mips16")
1809651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+m32").flag("+mips16");
1810651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1811651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MArchMicroMips = Multilib()
1812651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/micromips")
1813651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/micromips")
1814651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/micromips")
1815651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+m32").flag("+mmicromips");
1816651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1817651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MArchDefault = Multilib()
1818651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("-mips16").flag("-mmicromips");
1819651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1820651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib SoftFloat = Multilib()
1821651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/soft-float")
1822651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/soft-float")
1823651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/soft-float")
1824651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+msoft-float");
1825651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1826651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib Nan2008 = Multilib()
1827651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/nan2008")
1828651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/nan2008")
1829651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/nan2008")
1830651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+mnan=2008");
1831651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1832651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib DefaultFloat = Multilib()
1833651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("-msoft-float").flag("-mnan=2008");
1834651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1835651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib BigEndian = Multilib()
1836651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+EB").flag("-EL");
1837651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1838651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib LittleEndian = Multilib()
1839651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/el")
1840651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .osSuffix("/el")
1841651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/el")
1842651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+EL").flag("-EB");
1843651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1844651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Note that this one's osSuffix is ""
1845651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MAbi64 = Multilib()
1846651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/64")
1847651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/64")
1848651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+mabi=64").flag("-mabi=n32").flag("-m32");
1849651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CSMipsMultilibs = MultilibSet()
1851651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Either(MArchMips16, MArchMicroMips, MArchDefault)
1852651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Either(SoftFloat, Nan2008, DefaultFloat)
1853651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("/micromips/nan2008")
1854651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("/mips16/nan2008")
1855651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Either(BigEndian, LittleEndian)
1856651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Maybe(MAbi64)
1857651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("/mips16.*/64")
1858651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut("/micromips.*/64")
1859651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut(NonExistent);
1860651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
1861651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1862651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  MultilibSet AndroidMipsMultilibs = MultilibSet()
1863651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1864651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    .FilterOut(NonExistent);
1865651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1866651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  MultilibSet DebianMipsMultilibs;
1867651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  {
1868651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib MAbiN32 = Multilib()
1869651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/n32")
1870651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/n32")
1871651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+mabi=n32");
1872651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1873651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib M64 = Multilib()
1874651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .gccSuffix("/64")
1875651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .includeSuffix("/64")
1876651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("+m64").flag("-m32").flag("-mabi=n32");
1877651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1878651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib M32 = Multilib()
1879651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .flag("-m64").flag("+m32").flag("-mabi=n32");
1880651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1881651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    DebianMipsMultilibs = MultilibSet()
1882651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .Either(M32, M64, MAbiN32)
1883651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      .FilterOut(NonExistent);
1884651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
18858e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
1886ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  MultilibSet ImgMultilibs;
1887ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  {
1888ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Multilib Mips64r6 = Multilib()
1889ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .gccSuffix("/mips64r6")
1890ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .osSuffix("/mips64r6")
1891ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .includeSuffix("/mips64r6")
1892ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .flag("+m64").flag("-m32");
1893ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
1894ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Multilib LittleEndian = Multilib()
1895ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .gccSuffix("/el")
1896ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .osSuffix("/el")
1897ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .includeSuffix("/el")
1898ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .flag("+EL").flag("-EB");
1899ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
1900ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Multilib MAbi64 = Multilib()
1901ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .gccSuffix("/64")
1902ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .osSuffix("/64")
1903ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .includeSuffix("/64")
1904ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .flag("+mabi=64").flag("-mabi=n32").flag("-m32");
1905ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
1906ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    ImgMultilibs = MultilibSet()
1907ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .Maybe(Mips64r6)
1908ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .Maybe(MAbi64)
1909ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .Maybe(LittleEndian)
1910ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      .FilterOut(NonExistent);
1911ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
1912ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
1913651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
19148e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
1915651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Multilib::flags_list Flags;
1916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1917651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1918651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isMips16(Args), "mips16", Flags);
1919651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isMips32r2(Args), "march=mips32r2", Flags);
1920651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isMips64r2(Args), "march=mips64r2", Flags);
1921651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
1922651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isMipsFP64(Args), "mfp64", Flags);
1923651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(!isMipsFP64(Args), "mfp32", Flags);
1924651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isMipsNan2008(Args), "mnan=2008", Flags);
1925651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(tools::mips::hasMipsAbiArg(Args, "n32"), "mabi=n32", Flags);
1926651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Default is to assume mabi=64
1927651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool IsMABI64 =
1928651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      tools::mips::hasMipsAbiArg(Args, "64") ||
1929651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      (!tools::mips::hasMipsAbiArg(Args, "n32") && isMips64(TargetArch));
1930651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(IsMABI64, "mabi=64", Flags);
1931651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
1932651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isSoftFloatABI(Args), "mfloat-abi=soft", Flags);
1933651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
1934651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(!isSoftFloatABI(Args), "mfloat-abi=hard", Flags);
1935651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
1936651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(isMipsEB(TargetArch), "EB", Flags);
1937651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1938651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (TargetTriple.getEnvironment() == llvm::Triple::Android) {
1939651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Select Android toolchain. It's the only choice in that case.
19406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
19416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Result.Multilibs = AndroidMipsMultilibs;
19426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return true;
19436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
19446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    return false;
1945651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
19466c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders
1947ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1948ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      TargetTriple.getOS() == llvm::Triple::Linux &&
1949ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1950ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // Select mips-img-linux-gnu toolchain.
1951ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1952ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Result.Multilibs = ImgMultilibs;
1953ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      return true;
1954ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
1955ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return false;
1956ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
1957ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
1958651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Sort candidates. Toolchain that best meets the directories goes first.
1959651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Then select the first toolchains matches command line flags.
1960651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  MultilibSet *candidates[] = { &DebianMipsMultilibs, &FSFMipsMultilibs,
1961651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                &CSMipsMultilibs };
1962651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  std::sort(
1963651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      std::begin(candidates), std::end(candidates),
1964651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
1965651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  for (const auto &candidate : candidates) {
19666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (candidate->select(Flags, Result.SelectedMultilib)) {
1967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (candidate == &DebianMipsMultilibs)
19686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Result.BiarchSibling = Multilib();
19696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Result.Multilibs = *candidate;
1970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return true;
19716c5c3adab3ff343c2fc6d9a34808aa9b65d6baaaDaniel Sanders    }
19724e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  }
19738e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
1974ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  {
1975ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // Fallback to the regular toolchain-tree structure.
1976ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Multilib Default;
1977ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Result.Multilibs.push_back(Default);
1978ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Result.Multilibs.FilterOut(NonExistent);
1979ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
1980ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1981ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Result.BiarchSibling = Multilib();
1982ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      return true;
1983ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    }
1984ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  }
1985ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
1986651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return false;
1987651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
1988651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
19896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic bool findBiarchMultilibs(const llvm::Triple &TargetTriple,
19906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                StringRef Path, const ArgList &Args,
19916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                bool NeedsBiarchSuffix,
19926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                DetectedMultilibs &Result) {
1993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
1994651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1995651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // in what would normally be GCCInstallPath and put the 64-bit
1996651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // libs in a subdirectory named 64. The simple logic we follow is that
1997651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // *if* there is a subdirectory of the right name with crtbegin.o in it,
1998651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // we use that. If not, and if not a biarch triple alias, we look for
1999651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // crtbegin.o without the subdirectory.
2000651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2001651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Multilib Default;
2002651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Multilib Alt64 = Multilib()
2003651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    .gccSuffix("/64")
2004651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    .includeSuffix("/64")
2005ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    .flag("-m32").flag("+m64").flag("-mx32");
2006651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Multilib Alt32 = Multilib()
2007651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    .gccSuffix("/32")
2008651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    .includeSuffix("/32")
2009ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    .flag("+m32").flag("-m64").flag("-mx32");
2010ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Multilib Altx32 = Multilib()
2011ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    .gccSuffix("/x32")
2012ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    .includeSuffix("/x32")
2013ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    .flag("-m32").flag("-m64").flag("+mx32");
2014651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2015651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  FilterNonExistent NonExistent(Path);
2016651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2017ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // Determine default multilib from: 32, 64, x32
2018ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // Also handle cases such as 64 on 32, 32 on 64, etc.
2019ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
2020ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const bool IsX32 {TargetTriple.getEnvironment() == llvm::Triple::GNUX32};
2021651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
2022ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Want = WANT64;
2023ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
2024ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Want = WANT64;
2025ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
2026ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Want = WANT32;
2027651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else {
2028ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (TargetTriple.isArch32Bit())
2029ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Want = NeedsBiarchSuffix ? WANT64 : WANT32;
2030ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    else if (IsX32)
2031ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
2032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    else
2033ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Want = NeedsBiarchSuffix ? WANT32 : WANT64;
2034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
2035651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2036ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Want == WANT32)
2037ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Default.flag("+m32").flag("-m64").flag("-mx32");
2038ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  else if (Want == WANT64)
2039ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Default.flag("-m32").flag("+m64").flag("-mx32");
2040ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  else if (Want == WANTX32)
2041ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    Default.flag("-m32").flag("-m64").flag("+mx32");
2042651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  else
2043ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return false;
2044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
20456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Result.Multilibs.push_back(Default);
20466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Result.Multilibs.push_back(Alt64);
20476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Result.Multilibs.push_back(Alt32);
2048ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Result.Multilibs.push_back(Altx32);
2049651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
20506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  Result.Multilibs.FilterOut(NonExistent);
2051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2052651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Multilib::flags_list Flags;
2053ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
2054651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
2055ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
2056651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
20576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
2058651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return false;
2059651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2060ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Result.SelectedMultilib == Alt64 ||
2061ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Result.SelectedMultilib == Alt32 ||
2062ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Result.SelectedMultilib == Altx32)
20636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Result.BiarchSibling = Default;
2064651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2065651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
20668e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan}
20678e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
206819347edf7809866350750a1997ec4db009832fa4Chandler Carruthvoid Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
2069651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const llvm::Triple &TargetTriple, const ArgList &Args,
2070d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    const std::string &LibDir, StringRef CandidateTriple,
2071d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    bool NeedsBiarchSuffix) {
2072651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
207319347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // There are various different suffixes involving the triple we
207419347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // check for. We also record what is necessary to walk from each back
207519347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // up to the lib directory.
20761c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  const std::string LibSuffixes[] = {
207719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/gcc/" + CandidateTriple.str(),
2078003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman    // Debian puts cross-compilers in gcc-cross
2079003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman    "/gcc-cross/" + CandidateTriple.str(),
208019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
208119347edf7809866350750a1997ec4db009832fa4Chandler Carruth
208202014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // The Freescale PPC SDK has the gcc libraries in
208302014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
208402014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    "/" + CandidateTriple.str(),
208502014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel
208619347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // Ubuntu has a strange mis-matched pair of triples that this happens to
208719347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // match.
208819347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // FIXME: It may be worthwhile to generalize this and look for a second
208919347edf7809866350750a1997ec4db009832fa4Chandler Carruth    // triple.
2090d936d9d9abae0e5018fa0233aa51ac8390a6778fChandler Carruth    "/i386-linux-gnu/gcc/" + CandidateTriple.str()
209119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  };
2092003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman  const std::string InstallSuffixes[] = {
2093003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman    "/../../..",    // gcc/
2094003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman    "/../../..",    // gcc-cross/
2095003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman    "/../../../..", // <triple>/gcc/
2096003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman    "/../..",       // <triple>/
2097003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman    "/../../../.."  // i386-linux-gnu/gcc/<triple>/
2098003e1dcafcdb757a893b031431620313ee7ecbbfEli Friedman  };
209919347edf7809866350750a1997ec4db009832fa4Chandler Carruth  // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
2100d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  const unsigned NumLibSuffixes =
2101d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth      (llvm::array_lengthof(LibSuffixes) - (TargetArch != llvm::Triple::x86));
21021c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth  for (unsigned i = 0; i < NumLibSuffixes; ++i) {
21031c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    StringRef LibSuffix = LibSuffixes[i];
2104ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    std::error_code EC;
21051c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth    for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
210619347edf7809866350750a1997ec4db009832fa4Chandler Carruth         !EC && LI != LE; LI = LI.increment(EC)) {
210719347edf7809866350750a1997ec4db009832fa4Chandler Carruth      StringRef VersionText = llvm::sys::path::filename(LI->path());
210819347edf7809866350750a1997ec4db009832fa4Chandler Carruth      GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2109f15b26cf378ac4706a861444fccb177f6116087eBenjamin Kramer      if (CandidateVersion.Major != -1) // Filter obviously bad entries.
2110f15b26cf378ac4706a861444fccb177f6116087eBenjamin Kramer        if (!CandidateGCCInstallPaths.insert(LI->path()).second)
2111f15b26cf378ac4706a861444fccb177f6116087eBenjamin Kramer          continue; // Saw this path before; no need to look at it again.
2112ed5f28fd8bdb0ea39a28f4ade6b3ab57f0c8f780Benjamin Kramer      if (CandidateVersion.isOlderThan(4, 1, 1))
211319347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
211419347edf7809866350750a1997ec4db009832fa4Chandler Carruth      if (CandidateVersion <= Version)
211519347edf7809866350750a1997ec4db009832fa4Chandler Carruth        continue;
21162e55df49929a515b05f3af89b47a13357eccd9d0Hal Finkel
21176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      DetectedMultilibs Detected;
2118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Debian mips multilibs behave more like the rest of the biarch ones,
2120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // so handle them there
2121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (isMipsArch(TargetArch)) {
21226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        if (!findMIPSMultilibs(TargetTriple, LI->path(), Args, Detected))
2123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines          continue;
2124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      } else if (!findBiarchMultilibs(TargetTriple, LI->path(), Args,
21256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                      NeedsBiarchSuffix, Detected)) {
21265c805e92a5f70a913bc3bfcd15c44875974c2111Simon Atanasyan        continue;
21276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      }
212819347edf7809866350750a1997ec4db009832fa4Chandler Carruth
21296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Multilibs = Detected.Multilibs;
21306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      SelectedMultilib = Detected.SelectedMultilib;
21316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      BiarchSibling = Detected.BiarchSibling;
213219347edf7809866350750a1997ec4db009832fa4Chandler Carruth      Version = CandidateVersion;
2133fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth      GCCTriple.setTriple(CandidateTriple);
213419347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // FIXME: We hack together the directory name here instead of
213519347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // using LI to ensure stable path separators across Windows and
213619347edf7809866350750a1997ec4db009832fa4Chandler Carruth      // Linux.
21371c6f04a28d8a8e3eca966385815305b13e0a6a05Chandler Carruth      GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
21385d84bb418405e1256020a66895d163756886b102Chandler Carruth      GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
213919347edf7809866350750a1997ec4db009832fa4Chandler Carruth      IsValid = true;
214019347edf7809866350750a1997ec4db009832fa4Chandler Carruth    }
214119347edf7809866350750a1997ec4db009832fa4Chandler Carruth  }
214219347edf7809866350750a1997ec4db009832fa4Chandler Carruth}
214319347edf7809866350750a1997ec4db009832fa4Chandler Carruth
21440e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaGeneric_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
21450e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                         const ArgList &Args)
2146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  : ToolChain(D, Triple, Args), GCCInstallation() {
2147edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
214886643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
2149edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
2150c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar}
2151c50b00dbd843cd929b5f220d4a8699852249f64cDaniel Dunbar
21523917608370583fa30c466b6c3893448229aea9adDaniel DunbarGeneric_GCC::~Generic_GCC() {
21533917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
21543917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
2155f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Generic_GCC::getTool(Action::ActionClass AC) const {
21565b222059399ec9cccba7a393dc470adfb8a3db0fRafael Espindola  switch (AC) {
2157f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::PreprocessJobClass:
2158f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    if (!Preprocess)
2159f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola      Preprocess.reset(new tools::gcc::Preprocess(*this));
2160f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return Preprocess.get();
2161f3260565f46491a0d99e41d47a13767218242ce5Rafael Espindola  case Action::CompileJobClass:
2162f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    if (!Compile)
2163f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola      Compile.reset(new tools::gcc::Compile(*this));
2164f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return Compile.get();
2165c0a55d12caff98504eace18b553bb111160a8131Rafael Espindola  default:
2166f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola    return ToolChain::getTool(AC);
21673917608370583fa30c466b6c3893448229aea9adDaniel Dunbar  }
21683917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
21693917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
2170f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Generic_GCC::buildAssembler() const {
2171651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return new tools::gnutools::Assemble(*this);
2172f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2173f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
2174f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Generic_GCC::buildLinker() const {
2175f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::gcc::Link(*this);
2176f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2177f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
21786365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruthvoid Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
21796365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth  // Print the information about how we detected the GCC installation.
21806365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth  GCCInstallation.print(OS);
21816365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth}
21826365ab91a0cf2f20c73ea9c39b55c14ab438018eChandler Carruth
21833917608370583fa30c466b6c3893448229aea9adDaniel Dunbarbool Generic_GCC::IsUnwindTablesDefault() const {
21846f009b68b9f7aaf280144b0cd81d6a0b23c733a6Rafael Espindola  return getArch() == llvm::Triple::x86_64;
21853917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
21863917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
21877ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Generic_GCC::isPICDefault() const {
21887ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
21893917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
21903917608370583fa30c466b6c3893448229aea9adDaniel Dunbar
219152ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbournebool Generic_GCC::isPIEDefault() const {
219252ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne  return false;
219352ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne}
219452ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne
21957ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool Generic_GCC::isPICDefaultForced() const {
21967ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
21973917608370583fa30c466b6c3893448229aea9adDaniel Dunbar}
21987ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth
2199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool Generic_GCC::IsIntegratedAssemblerDefault() const {
2200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return getTriple().getArch() == llvm::Triple::x86 ||
2201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         getTriple().getArch() == llvm::Triple::x86_64 ||
2202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         getTriple().getArch() == llvm::Triple::aarch64 ||
2203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         getTriple().getArch() == llvm::Triple::aarch64_be ||
2204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         getTriple().getArch() == llvm::Triple::arm64 ||
22056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines         getTriple().getArch() == llvm::Triple::arm64_be ||
2206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         getTriple().getArch() == llvm::Triple::arm ||
2207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         getTriple().getArch() == llvm::Triple::armeb ||
2208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         getTriple().getArch() == llvm::Triple::thumb ||
2209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines         getTriple().getArch() == llvm::Triple::thumbeb;
2210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                        ArgStringList &CC1Args) const {
2214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
2215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool UseInitArrayDefault =
2216651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      getTriple().getArch() == llvm::Triple::aarch64 ||
2217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      getTriple().getArch() == llvm::Triple::aarch64_be ||
2218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      getTriple().getArch() == llvm::Triple::arm64 ||
22196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      getTriple().getArch() == llvm::Triple::arm64_be ||
2220651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      (getTriple().getOS() == llvm::Triple::Linux &&
2221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines       (!V.isOlderThan(4, 7, 0) ||
2222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        getTriple().getEnvironment() == llvm::Triple::Android));
2223651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2224651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
2225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         options::OPT_fno_use_init_array,
2226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                         UseInitArrayDefault))
2227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    CC1Args.push_back("-fuse-init-array");
2228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
22309631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum/// Hexagon Toolchain
22319631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
2232b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisstd::string Hexagon_TC::GetGnuDir(const std::string &InstalledDir) {
2233b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
2234b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Locate the rest of the toolchain ...
2235b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (strlen(GCC_INSTALL_PREFIX))
2236b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return std::string(GCC_INSTALL_PREFIX);
2237b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
2238b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string InstallRelDir = InstalledDir + "/../../gnu";
2239b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(InstallRelDir))
2240b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return InstallRelDir;
2241b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
2242b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
2243b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(PrefixRelDir))
2244b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return PrefixRelDir;
2245b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
2246b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  return InstallRelDir;
2247b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis}
2248b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
22495fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtisstatic void GetHexagonLibraryPaths(
22505fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const ArgList &Args,
22515fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string Ver,
22525fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchString,
22535fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string &InstalledDir,
22545fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  ToolChain::path_list *LibPaths)
22555fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis{
22565fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  bool buildingLib = Args.hasArg(options::OPT_shared);
22575fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
22585fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
22595fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // -L Args
22605fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
22615fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  for (arg_iterator
22625fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         it = Args.filtered_begin(options::OPT_L),
22635fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis         ie = Args.filtered_end();
22645fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       it != ie;
22655fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis       ++it) {
22665fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    for (unsigned i = 0, e = (*it)->getNumValues(); i != e; ++i)
22675fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      LibPaths->push_back((*it)->getValue(i));
22685fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
22695fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
22705fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
22715fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Other standard paths
22725fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  //----------------------------------------------------------------------------
22735fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchSuffix = "/" + MarchString;
22745fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string G0Suffix = "/G0";
22755fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
22765fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  const std::string RootDir = Hexagon_TC::GetGnuDir(InstalledDir) + "/";
22775fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
22785fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // lib/gcc/hexagon/...
22795fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
22805fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (buildingLib) {
22815fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
22825fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
22835fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
22845fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
22855fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(LibGCCHexagonDir + Ver);
22865fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
22875fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // lib/gcc/...
22885fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(RootDir + "lib/gcc");
22895fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
22905fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // hexagon/lib/...
22915fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  std::string HexagonLibDir = RootDir + "hexagon/lib";
22925fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (buildingLib) {
22935fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
22945fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths->push_back(HexagonLibDir + G0Suffix);
22955fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
22965fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(HexagonLibDir + MarchSuffix);
22975fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->push_back(HexagonLibDir);
22985fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis}
22995fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
2300b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew CurtisHexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple &Triple,
2301b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                       const ArgList &Args)
2302b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  : Linux(D, Triple, Args) {
2303b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string InstalledDir(getDriver().getInstalledDir());
2304b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string GnuDir = Hexagon_TC::GetGnuDir(InstalledDir);
2305b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
2306b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2307b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // program paths
2308b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string BinDir(GnuDir + "/bin");
2309b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (llvm::sys::fs::exists(BinDir))
2310b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    getProgramPaths().push_back(BinDir);
2311b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
2312b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  // Determine version of GCC libraries and headers to use.
2313b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
2314ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  std::error_code ec;
2315b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  GCCVersion MaxVersion= GCCVersion::Parse("0.0.0");
2316b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  for (llvm::sys::fs::directory_iterator di(HexagonDir, ec), de;
2317b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis       !ec && di != de; di = di.increment(ec)) {
2318b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->path()));
2319b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    if (MaxVersion < cv)
2320b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      MaxVersion = cv;
2321b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  }
2322b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  GCCLibAndIncVersion = MaxVersion;
23235fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
23245fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  ToolChain::path_list *LibPaths= &getFilePaths();
23255fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
23265fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
23275fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // 'elf' OS type, so the Linux paths are not appropriate. When we actually
23285fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  // support 'linux' we'll need to fix this up
23295fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  LibPaths->clear();
23305fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
23315fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  GetHexagonLibraryPaths(
23325fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    Args,
23335fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    GetGCCLibAndIncVersion(),
23345fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    GetTargetCPU(Args),
23355fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    InstalledDir,
23365fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    LibPaths);
23379631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
23389631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
23399631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony LinthicumHexagon_TC::~Hexagon_TC() {
23409631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
23419631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
2342f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Hexagon_TC::buildAssembler() const {
2343f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::hexagon::Assemble(*this);
2344f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2345f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
2346f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Hexagon_TC::buildLinker() const {
2347f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::hexagon::Link(*this);
23489631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
23499631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
2350b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisvoid Hexagon_TC::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2351b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                                           ArgStringList &CC1Args) const {
2352b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const Driver &D = getDriver();
2353b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
2354b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2355b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      DriverArgs.hasArg(options::OPT_nostdlibinc))
2356b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return;
2357b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
2358b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string Ver(GetGCCLibAndIncVersion());
2359b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string GnuDir = Hexagon_TC::GetGnuDir(D.InstalledDir);
2360b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2361b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2362b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2363b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
23649631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum}
23659631939f82c0eaa6fb3936a0ce58a41adfbc9011Tony Linthicum
2366b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtisvoid Hexagon_TC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2367b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis                                              ArgStringList &CC1Args) const {
2368b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
2369b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2370b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis      DriverArgs.hasArg(options::OPT_nostdincxx))
2371b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis    return;
2372b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
2373b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  const Driver &D = getDriver();
2374b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  std::string Ver(GetGCCLibAndIncVersion());
23757b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola  SmallString<128> IncludeDir(Hexagon_TC::GetGnuDir(D.InstalledDir));
2376b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis
23777b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola  llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
23787b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola  llvm::sys::path::append(IncludeDir, Ver);
2379b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis  addSystemInclude(DriverArgs, CC1Args, IncludeDir.str());
23807ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth}
23816781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
23825fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew CurtisToolChain::CXXStdlibType
23835fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew CurtisHexagon_TC::GetCXXStdlibType(const ArgList &Args) const {
23845fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
23855fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (!A)
23865fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    return ToolChain::CST_Libstdcxx;
23875fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
23885fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  StringRef Value = A->getValue();
23895fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  if (Value != "libstdc++") {
23905fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
23915fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis      << A->getAsString(Args);
23925fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  }
23935fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
23945fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis  return ToolChain::CST_Libstdcxx;
23955fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis}
23965fdf350e39c6e260602dbbd709101a9bb55e75f1Matthew Curtis
2397f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindolastatic int getHexagonVersion(const ArgList &Args) {
2398f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2399f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  // Select the default CPU (v4) if none was given.
2400f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  if (!A)
2401f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    return 4;
2402f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola
2403f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  // FIXME: produce errors if we cannot parse the version.
2404f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  StringRef WhichHexagon = A->getValue();
2405f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  if (WhichHexagon.startswith("hexagonv")) {
2406f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    int Val;
2407f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2408f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola      return Val;
2409f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  }
2410f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  if (WhichHexagon.startswith("v")) {
2411f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    int Val;
2412f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2413f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola      return Val;
24146781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  }
2415f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola
2416f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  // FIXME: should probably be an error.
2417f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  return 4;
24186781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis}
24196781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis
24206781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew CurtisStringRef Hexagon_TC::GetTargetCPU(const ArgList &Args)
24216781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis{
2422f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  int V = getHexagonVersion(Args);
2423f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  // FIXME: We don't support versions < 4. We should error on them.
2424f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  switch (V) {
2425f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  default:
2426f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    llvm_unreachable("Unexpected version");
2427f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  case 5:
2428f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    return "v5";
2429f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  case 4:
2430f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    return "v4";
2431f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  case 3:
2432f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    return "v3";
2433f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  case 2:
2434f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    return "v2";
2435f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola  case 1:
2436f26d8bc4406be1311a38fd1761d5ddeb2f5a38b6Rafael Espindola    return "v1";
24376781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis  }
24386781415fa6d98aed548e84a70f1cd3ec31bba7d3Matthew Curtis}
2439b3489a0d355128f1cc96fdde2a6b11a8361d6740Matthew Curtis// End Hexagon
2440f3cad36e59a41b5767fe662b5ac8911ee174b801Daniel Dunbar
24413a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
24423a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
24433a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner/// Currently does not support anything else but compilation.
24443a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
2445af370e6e051e505016637e23418354db625dc796Rafael EspindolaTCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple,
2446af370e6e051e505016637e23418354db625dc796Rafael Espindola                           const ArgList &Args)
2447af370e6e051e505016637e23418354db625dc796Rafael Espindola  : ToolChain(D, Triple, Args) {
24483a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  // Path mangling to find libexec
24493a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  std::string Path(getDriver().Dir);
24503a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
24513a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  Path += "/../libexec";
24523a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner  getProgramPaths().push_back(Path);
24533a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
24543a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
24553a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris LattnerTCEToolChain::~TCEToolChain() {
24563a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
24573a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
2458304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumibool TCEToolChain::IsMathErrnoDefault() const {
2459304ed3f81ba96f10a431318e2d30f8fdb8399e60NAKAMURA Takumi  return true;
24603a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
24613a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
24627ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool TCEToolChain::isPICDefault() const {
24637ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
24643a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
24653a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
246652ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbournebool TCEToolChain::isPIEDefault() const {
246752ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne  return false;
246852ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne}
246952ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne
24707ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruthbool TCEToolChain::isPICDefaultForced() const {
24717ce816a77dc79f71950e9e96185e3523ee08994bChandler Carruth  return false;
24723a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner}
24733a47c4e0a3e8d13ee4fb06cc3a98f9cfa9982400Chris Lattner
2474f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2475f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
24760e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaOpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
24770e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
2478ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
2479f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar  getFilePaths().push_back("/usr/lib");
2480f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
2481f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
2482f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *OpenBSD::buildAssembler() const {
2483f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::openbsd::Assemble(*this);
2484f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2485f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
2486f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *OpenBSD::buildLinker() const {
2487f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::openbsd::Link(*this);
2488f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar}
2489f7b8eec37c8c8012fa525c71fb29a58c9f29beefDaniel Dunbar
249042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
249142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
249242f74f21ece01dc8573d5377859d327fbb23b26cEli FriedmanBitrig::Bitrig(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
249342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  : Generic_ELF(D, Triple, Args) {
249442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  getFilePaths().push_back(getDriver().Dir + "/../lib");
249542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  getFilePaths().push_back("/usr/lib");
249642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
249742f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
2498f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Bitrig::buildAssembler() const {
2499f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::bitrig::Assemble(*this);
2500f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2501f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
2502f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Bitrig::buildLinker() const {
2503f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::bitrig::Link(*this);
250442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
250542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
25066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesToolChain::CXXStdlibType
25076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesBitrig::GetCXXStdlibType(const ArgList &Args) const {
25086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
25096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StringRef Value = A->getValue();
25106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Value == "libstdc++")
25116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return ToolChain::CST_Libstdcxx;
25126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Value == "libc++")
25136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      return ToolChain::CST_Libcxx;
25146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
25156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
25166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      << A->getAsString(Args);
25176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
25186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  return ToolChain::CST_Libcxx;
25196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
25206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
252142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
252242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                          ArgStringList &CC1Args) const {
252342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
252442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman      DriverArgs.hasArg(options::OPT_nostdincxx))
252542f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman    return;
252642f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
25278e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  switch (GetCXXStdlibType(DriverArgs)) {
25288e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libcxx:
25298e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
25306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                     getDriver().SysRoot + "/usr/include/c++/v1");
25318e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
25328e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libstdcxx:
25338e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
25348e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/stdc++");
25358e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    addSystemInclude(DriverArgs, CC1Args,
25368e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                     getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
25378e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth
25388e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    StringRef Triple = getTriple().str();
25398e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    if (Triple.startswith("amd64"))
25408e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth      addSystemInclude(DriverArgs, CC1Args,
25418e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
25428e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       Triple.substr(5));
25438e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    else
25448e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth      addSystemInclude(DriverArgs, CC1Args,
25458e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       getDriver().SysRoot + "/usr/include/c++/stdc++/" +
25468e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth                       Triple);
25478e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
25488e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  }
254942f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
255042f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
255142f74f21ece01dc8573d5377859d327fbb23b26cEli Friedmanvoid Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
255242f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman                                 ArgStringList &CmdArgs) const {
25538e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  switch (GetCXXStdlibType(Args)) {
25548e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libcxx:
25558e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lc++");
25566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CmdArgs.push_back("-lc++abi");
25576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    CmdArgs.push_back("-lpthread");
25588e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
25598e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  case ToolChain::CST_Libstdcxx:
25608e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    CmdArgs.push_back("-lstdc++");
25618e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth    break;
25628e6881dfa47ec5bd95f1d6d83f302482c242e073Chandler Carruth  }
256342f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman}
256442f74f21ece01dc8573d5377859d327fbb23b26cEli Friedman
256575358d267256022475371416654b056ad8531cb3Daniel Dunbar/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
256675358d267256022475371416654b056ad8531cb3Daniel Dunbar
25670e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaFreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
25680e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
2569214afe96b4210ca36d99621dd930225e6bf5b9b3Daniel Dunbar
257024248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth  // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
257124248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth  // back to '/usr/lib' if it doesn't exist.
257200646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  if ((Triple.getArch() == llvm::Triple::x86 ||
257300646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth       Triple.getArch() == llvm::Triple::ppc) &&
257424248e3df04f3d687f819f6de3429130c4680a15Chandler Carruth      llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
257500646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
257600646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  else
257700646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth    getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
257875358d267256022475371416654b056ad8531cb3Daniel Dunbar}
257975358d267256022475371416654b056ad8531cb3Daniel Dunbar
25801cc766fb3e62fedc5d99b103bcd0ec4aa3146859David ChisnallToolChain::CXXStdlibType
25811cc766fb3e62fedc5d99b103bcd0ec4aa3146859David ChisnallFreeBSD::GetCXXStdlibType(const ArgList &Args) const {
25821cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall  if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
25831cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    StringRef Value = A->getValue();
25841cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    if (Value == "libstdc++")
25851cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall      return ToolChain::CST_Libstdcxx;
25861cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    if (Value == "libc++")
25871cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall      return ToolChain::CST_Libcxx;
25881cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall
25891cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
25901cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall      << A->getAsString(Args);
25911cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall  }
25921cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall  if (getTriple().getOSMajorVersion() >= 10)
25931cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    return ToolChain::CST_Libcxx;
25941cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall  return ToolChain::CST_Libstdcxx;
25951cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall}
25961cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall
25971cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnallvoid FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
25981cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall                                           ArgStringList &CC1Args) const {
25991cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
26001cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall      DriverArgs.hasArg(options::OPT_nostdincxx))
26011cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    return;
26021cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall
26031cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall  switch (GetCXXStdlibType(DriverArgs)) {
26041cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall  case ToolChain::CST_Libcxx:
26051cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    addSystemInclude(DriverArgs, CC1Args,
26061cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall                     getDriver().SysRoot + "/usr/include/c++/v1");
26071cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    break;
26081cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall  case ToolChain::CST_Libstdcxx:
26091cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    addSystemInclude(DriverArgs, CC1Args,
26101cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall                     getDriver().SysRoot + "/usr/include/c++/4.2");
26111cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    addSystemInclude(DriverArgs, CC1Args,
26121cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall                     getDriver().SysRoot + "/usr/include/c++/4.2/backward");
26131cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall    break;
26141cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall  }
26151cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall}
26161cc766fb3e62fedc5d99b103bcd0ec4aa3146859David Chisnall
2617f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *FreeBSD::buildAssembler() const {
2618f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::freebsd::Assemble(*this);
2619f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2620f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
2621f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *FreeBSD::buildLinker() const {
2622f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::freebsd::Link(*this);
26238e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
26248e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
262527fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindolabool FreeBSD::UseSjLjExceptions() const {
262627fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  // FreeBSD uses SjLj exceptions on ARM oabi.
262727fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  switch (getTriple().getEnvironment()) {
2628651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::GNUEABIHF:
262927fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  case llvm::Triple::GNUEABI:
263027fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  case llvm::Triple::EABI:
263127fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    return false;
263227fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola
263327fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  default:
263427fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola    return (getTriple().getArch() == llvm::Triple::arm ||
263527fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola            getTriple().getArch() == llvm::Triple::thumb);
263627fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola  }
263727fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola}
263827fa2364b05ab26138c2ecf0eac1937b7fc6c037Rafael Espindola
2639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool FreeBSD::HasNativeLLVMSupport() const {
2640651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return true;
2641651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2642651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
2643651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool FreeBSD::isPIEDefault() const {
2644651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return getSanitizerArgs().hasZeroBaseShadow();
2645651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
2646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
26478e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
26488e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
26490e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaNetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
26500e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
26518e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
265205e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger  if (getDriver().UseStdLib) {
265332f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // When targeting a 32-bit platform, try the special directory used on
265432f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // 64-bit hosts, and only fall back to the main library directory if that
265532f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // doesn't work.
265632f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
265732f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    // what all logic is needed to emulate the '=' prefix here.
2658651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    switch (Triple.getArch()) {
2659651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case llvm::Triple::x86:
266005e5930166333e382522b942f00d08abc6c0a28eJoerg Sonnenberger      getFilePaths().push_back("=/usr/lib/i386");
2661651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
2662651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case llvm::Triple::arm:
26636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case llvm::Triple::armeb:
2664651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case llvm::Triple::thumb:
26656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case llvm::Triple::thumbeb:
2666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      switch (Triple.getEnvironment()) {
2667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case llvm::Triple::EABI:
2668651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case llvm::Triple::EABIHF:
2669651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case llvm::Triple::GNUEABI:
2670651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      case llvm::Triple::GNUEABIHF:
2671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        getFilePaths().push_back("=/usr/lib/eabi");
2672651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
2673651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      default:
2674651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        getFilePaths().push_back("=/usr/lib/oabi");
2675651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        break;
2676651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      }
2677651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
2678651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case llvm::Triple::mips64:
2679651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case llvm::Triple::mips64el:
2680651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (tools::mips::hasMipsAbiArg(Args, "o32"))
2681651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        getFilePaths().push_back("=/usr/lib/o32");
2682651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      else if (tools::mips::hasMipsAbiArg(Args, "64"))
2683651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        getFilePaths().push_back("=/usr/lib/64");
2684651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
26856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case llvm::Triple::sparc:
26866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      getFilePaths().push_back("=/usr/lib/sparc");
26876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      break;
2688651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    default:
2689651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
2690651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
269132f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth
269232f88be6e2dbd950861858fb75b0a37b685d6267Chandler Carruth    getFilePaths().push_back("=/usr/lib");
26938e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer  }
26948e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer}
26958e50a96b387dca7525caa8a6add31420dd82a2cdBenjamin Kramer
2696f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *NetBSD::buildAssembler() const {
2697f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::netbsd::Assemble(*this);
2698f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2699f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
2700f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *NetBSD::buildLinker() const {
2701f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::netbsd::Link(*this);
270275358d267256022475371416654b056ad8531cb3Daniel Dunbar}
270311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
2704a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg SonnenbergerToolChain::CXXStdlibType
2705a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg SonnenbergerNetBSD::GetCXXStdlibType(const ArgList &Args) const {
2706a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger  if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2707a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger    StringRef Value = A->getValue();
2708a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger    if (Value == "libstdc++")
2709a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger      return ToolChain::CST_Libstdcxx;
2710a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger    if (Value == "libc++")
2711a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger      return ToolChain::CST_Libcxx;
2712a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger
2713a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger    getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2714a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger      << A->getAsString(Args);
2715a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger  }
2716a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger
2717e69cca48505098f1ca70b10f829b07526d6465bfJoerg Sonnenberger  unsigned Major, Minor, Micro;
2718e69cca48505098f1ca70b10f829b07526d6465bfJoerg Sonnenberger  getTriple().getOSVersion(Major, Minor, Micro);
27196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 40) || Major == 0) {
2720651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    switch (getArch()) {
27216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case llvm::Triple::arm:
27226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case llvm::Triple::armeb:
27236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case llvm::Triple::thumb:
27246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    case llvm::Triple::thumbeb:
2725651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case llvm::Triple::x86:
2726651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case llvm::Triple::x86_64:
2727e69cca48505098f1ca70b10f829b07526d6465bfJoerg Sonnenberger      return ToolChain::CST_Libcxx;
2728651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    default:
2729651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
2730651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
2731e69cca48505098f1ca70b10f829b07526d6465bfJoerg Sonnenberger  }
2732a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger  return ToolChain::CST_Libstdcxx;
2733a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger}
2734a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger
2735a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenbergervoid NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2736a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger                                          ArgStringList &CC1Args) const {
2737a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2738a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger      DriverArgs.hasArg(options::OPT_nostdincxx))
2739a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger    return;
2740a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger
2741a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger  switch (GetCXXStdlibType(DriverArgs)) {
2742a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger  case ToolChain::CST_Libcxx:
2743a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger    addSystemInclude(DriverArgs, CC1Args,
2744a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger                     getDriver().SysRoot + "/usr/include/c++/");
2745a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger    break;
2746a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger  case ToolChain::CST_Libstdcxx:
2747a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger    addSystemInclude(DriverArgs, CC1Args,
2748a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger                     getDriver().SysRoot + "/usr/include/g++");
2749a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger    addSystemInclude(DriverArgs, CC1Args,
2750a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger                     getDriver().SysRoot + "/usr/include/g++/backward");
2751a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger    break;
2752a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger  }
2753a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger}
2754a7efaf99ac662af11890aae74d84da8d31ab2fe0Joerg Sonnenberger
275538e317d6dce161b249508686cc67eb7176958762Chris Lattner/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
275638e317d6dce161b249508686cc67eb7176958762Chris Lattner
27570e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaMinix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
27580e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
275938e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back(getDriver().Dir + "/../lib");
276038e317d6dce161b249508686cc67eb7176958762Chris Lattner  getFilePaths().push_back("/usr/lib");
276138e317d6dce161b249508686cc67eb7176958762Chris Lattner}
276238e317d6dce161b249508686cc67eb7176958762Chris Lattner
2763f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Minix::buildAssembler() const {
2764f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::minix::Assemble(*this);
2765f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2766f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
2767f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Minix::buildLinker() const {
2768f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::minix::Link(*this);
276938e317d6dce161b249508686cc67eb7176958762Chris Lattner}
277038e317d6dce161b249508686cc67eb7176958762Chris Lattner
2771e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
2772e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
27730e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaAuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,
27740e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                   const ArgList &Args)
27750e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_GCC(D, Triple, Args) {
2776e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2777edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
277886643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
2779edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
2780e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2781ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
2782e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/lib");
2783e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/usr/sfw/lib");
2784e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib");
27857adf94906e23eae295a006659c55eab9ffcf8b37Edward O'Callaghan  getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
2786e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2787e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2788e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2789f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *AuroraUX::buildAssembler() const {
2790f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::auroraux::Assemble(*this);
2791f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2792f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
2793f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *AuroraUX::buildLinker() const {
2794f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::auroraux::Link(*this);
2795e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan}
2796e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
279731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
279831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
27990e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaSolaris::Solaris(const Driver &D, const llvm::Triple& Triple,
28000e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola                 const ArgList &Args)
28010e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_GCC(D, Triple, Args) {
280231c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
280331c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getProgramPaths().push_back(getDriver().getInstalledDir());
280431c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  if (getDriver().getInstalledDir() != getDriver().Dir)
280531c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall    getProgramPaths().push_back(getDriver().Dir);
280631c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
280731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getFilePaths().push_back(getDriver().Dir + "/../lib");
280831c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall  getFilePaths().push_back("/usr/lib");
280931c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
281031c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall
2811f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Solaris::buildAssembler() const {
2812f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::solaris::Assemble(*this);
2813f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
2814f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
2815f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Solaris::buildLinker() const {
2816f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::solaris::Link(*this);
281731c4690047f5f362ecf886f1586844b1aef0c4d2David Chisnall}
2818e7925a075f110ab21afeae084670a155dea568e3Edward O'Callaghan
2819d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwinge/// Distribution (very bare-bones at the moment).
28206b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
2821d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwingeenum Distro {
28223fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth  ArchLinux,
2823c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianLenny,
2824c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  DebianSqueeze,
28250b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  DebianWheezy,
2826b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru  DebianJessie,
28270a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola  Exherbo,
2828d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL4,
2829d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL5,
2830d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  RHEL6,
28311a747829093ce59455685cdbe0aeff8d7b129d40Rafael Espindola  Fedora,
2832766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola  OpenSUSE,
2833814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  UbuntuHardy,
2834814638ed5a7bb7fc9df96d9be2c9a5d2a0d96b02Douglas Gregor  UbuntuIntrepid,
2835021aaa4f6b86bc9e2801f3475d1ec3dd7bc008c7Rafael Espindola  UbuntuJaunty,
28365ede807c1194c3a44c0adee83eca24efd626e5bbZhongxing Xu  UbuntuKarmic,
2837c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuLucid,
2838c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UbuntuMaverick,
283943ac2978291bf1471e2c916a88c7f1c1e170dc19Ted Kremenek  UbuntuNatty,
284025a857b8039bc86695614126bfe4f21035d6c76bBenjamin Kramer  UbuntuOneiric,
2841668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer  UbuntuPrecise,
2842de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola  UbuntuQuantal,
2843de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola  UbuntuRaring,
28441b034649379530c8870932449354b876f90e1644Sylvestre Ledru  UbuntuSaucy,
284524d91e6b5f90c4a057c3833915f9decf690780e1Sylvestre Ledru  UbuntuTrusty,
2846c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  UnknownDistro
2847c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola};
2848c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2849d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwingestatic bool IsRedhat(enum Distro Distro) {
28501a747829093ce59455685cdbe0aeff8d7b129d40Rafael Espindola  return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL6);
2851c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2852c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2853766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindolastatic bool IsOpenSUSE(enum Distro Distro) {
2854766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola  return Distro == OpenSUSE;
2855c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2856c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2857d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwingestatic bool IsDebian(enum Distro Distro) {
2858b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru  return Distro >= DebianLenny && Distro <= DebianJessie;
2859c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2860c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2861d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwingestatic bool IsUbuntu(enum Distro Distro) {
286224d91e6b5f90c4a057c3833915f9decf690780e1Sylvestre Ledru  return Distro >= UbuntuHardy && Distro <= UbuntuTrusty;
2863c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2864c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
28659a478245aecf58ca4e68ed629a840a74437e0ec1Rafael Espindolastatic Distro DetectDistro(llvm::Triple::ArchType Arch) {
2866ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
2867ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      llvm::MemoryBuffer::getFile("/etc/lsb-release");
2868ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (File) {
28695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
28705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    SmallVector<StringRef, 8> Lines;
2871c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    Data.split(Lines, "\n");
2872d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwinge    Distro Version = UnknownDistro;
2873668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    for (unsigned i = 0, s = Lines.size(); i != s; ++i)
2874668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer      if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
2875d52b4a9924f45c45a965a569ad179db25bb1af00Thomas Schwinge        Version = llvm::StringSwitch<Distro>(Lines[i].substr(17))
2876668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("hardy", UbuntuHardy)
2877668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("intrepid", UbuntuIntrepid)
2878668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("jaunty", UbuntuJaunty)
2879668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("karmic", UbuntuKarmic)
2880668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("lucid", UbuntuLucid)
2881668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("maverick", UbuntuMaverick)
2882668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("natty", UbuntuNatty)
2883668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("oneiric", UbuntuOneiric)
2884668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Case("precise", UbuntuPrecise)
2885de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola          .Case("quantal", UbuntuQuantal)
2886de39d1752f1559060237f158e47af6527d5e4abeRafael Espindola          .Case("raring", UbuntuRaring)
28871b034649379530c8870932449354b876f90e1644Sylvestre Ledru          .Case("saucy", UbuntuSaucy)
288824d91e6b5f90c4a057c3833915f9decf690780e1Sylvestre Ledru          .Case("trusty", UbuntuTrusty)
2889668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer          .Default(UnknownDistro);
2890668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer    return Version;
2891c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2892c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2893ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
2894ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (File) {
28955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
28961a747829093ce59455685cdbe0aeff8d7b129d40Rafael Espindola    if (Data.startswith("Fedora release"))
28971a747829093ce59455685cdbe0aeff8d7b129d40Rafael Espindola      return Fedora;
28986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (Data.startswith("Red Hat Enterprise Linux") ||
28996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        Data.startswith("CentOS")) {
29006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (Data.find("release 6") != StringRef::npos)
29016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        return RHEL6;
29026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      else if (Data.find("release 5") != StringRef::npos)
29036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        return RHEL5;
29046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      else if (Data.find("release 4") != StringRef::npos)
29056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines        return RHEL4;
29066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
2907c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
2908c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2909c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2910ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  File = llvm::MemoryBuffer::getFile("/etc/debian_version");
2911ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (File) {
29125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    StringRef Data = File.get()->getBuffer();
2913c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    if (Data[0] == '5')
2914c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianLenny;
29150e743b1582d53d3ebb2074da881e00bfb759f250Rafael Espindola    else if (Data.startswith("squeeze/sid") || Data[0] == '6')
2916c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola      return DebianSqueeze;
29170e743b1582d53d3ebb2074da881e00bfb759f250Rafael Espindola    else if (Data.startswith("wheezy/sid")  || Data[0] == '7')
29180b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman      return DebianWheezy;
2919b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru    else if (Data.startswith("jessie/sid")  || Data[0] == '8')
2920b17185204db26c59e329f6f0af96e7265fd084baSylvestre Ledru      return DebianJessie;
2921c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    return UnknownDistro;
2922c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
2923c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
29249a478245aecf58ca4e68ed629a840a74437e0ec1Rafael Espindola  if (llvm::sys::fs::exists("/etc/SuSE-release"))
2925766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola    return OpenSUSE;
2926c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
29279a478245aecf58ca4e68ed629a840a74437e0ec1Rafael Espindola  if (llvm::sys::fs::exists("/etc/exherbo-release"))
29280a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola    return Exherbo;
29290a84aee0a3ada448fb4ae5fd4964791d42a501b3Rafael Espindola
29309a478245aecf58ca4e68ed629a840a74437e0ec1Rafael Espindola  if (llvm::sys::fs::exists("/etc/arch-release"))
29313fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth    return ArchLinux;
29323fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth
2933c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return UnknownDistro;
2934c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
2935c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
2936deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// \brief Get our best guess at the multiarch triple for a target.
2937deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth///
2938deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Debian-based systems are starting to use a multiarch setup where they use
2939deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// a target-triple directory in the library and header search paths.
2940deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// Unfortunately, this triple does not align with the vanilla target triple,
2941deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth/// so we provide a rough mapping here.
2942651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic std::string getMultiarchTriple(const llvm::Triple &TargetTriple,
2943deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth                                      StringRef SysRoot) {
2944deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  // For most architectures, just use whatever we have rather than trying to be
2945deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  // clever.
2946deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  switch (TargetTriple.getArch()) {
2947deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  default:
2948deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
2949deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth
2950deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    // We use the existence of '/lib/<triple>' as a directory to detect some
2951deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    // common linux triples that don't quite match the Clang triple for both
2952236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth    // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
2953236e0b6239c588d631b48d17b8e0174508bdc471Chandler Carruth    // regardless of what the actual target triple is.
29540337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier  case llvm::Triple::arm:
29550337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier  case llvm::Triple::thumb:
2956ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2957ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabihf"))
2958ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        return "arm-linux-gnueabihf";
2959ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    } else {
2960ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      if (llvm::sys::fs::exists(SysRoot + "/lib/arm-linux-gnueabi"))
2961ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu        return "arm-linux-gnueabi";
2962ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    }
29630337efdba2b9477c2655cbb176d59c492a823aa4Chad Rosier    return TargetTriple.str();
2964651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::armeb:
2965651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::thumbeb:
2966651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
2967651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
2968651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        return "armeb-linux-gnueabihf";
2969651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    } else {
2970651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      if (llvm::sys::fs::exists(SysRoot + "/lib/armeb-linux-gnueabi"))
2971651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        return "armeb-linux-gnueabi";
2972651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
2973651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return TargetTriple.str();
2974deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  case llvm::Triple::x86:
2975deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
2976deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth      return "i386-linux-gnu";
2977deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
2978deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  case llvm::Triple::x86_64:
2979ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    // We don't want this for x32, otherwise it will match x86_64 libs
2980ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (TargetTriple.getEnvironment() != llvm::Triple::GNUX32 &&
2981ef8225444452a1486bd721f3285301fe84643b00Stephen Hines        llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
2982deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth      return "x86_64-linux-gnu";
2983deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth    return TargetTriple.str();
2984651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::arm64:
2985c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  case llvm::Triple::aarch64:
2986c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64-linux-gnu"))
2987c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover      return "aarch64-linux-gnu";
2988162579a9441c7c8c308c56ac706799765ccbc4eeTim Northover    return TargetTriple.str();
29896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  case llvm::Triple::arm64_be:
2990651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case llvm::Triple::aarch64_be:
2991651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (llvm::sys::fs::exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
2992651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      return "aarch64_be-linux-gnu";
2993651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return TargetTriple.str();
29945bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  case llvm::Triple::mips:
29955bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
29965bea4f6860543017be326e3fbe702edb2678d898Eli Friedman      return "mips-linux-gnu";
29975bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    return TargetTriple.str();
29985bea4f6860543017be326e3fbe702edb2678d898Eli Friedman  case llvm::Triple::mipsel:
29995bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
30005bea4f6860543017be326e3fbe702edb2678d898Eli Friedman      return "mipsel-linux-gnu";
30015bea4f6860543017be326e3fbe702edb2678d898Eli Friedman    return TargetTriple.str();
3002ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  case llvm::Triple::mips64:
3003ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnu"))
3004ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      return "mips64-linux-gnu";
3005ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (llvm::sys::fs::exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
3006ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      return "mips64-linux-gnuabi64";
3007ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return TargetTriple.str();
3008ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  case llvm::Triple::mips64el:
3009ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnu"))
3010ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      return "mips64el-linux-gnu";
3011ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    if (llvm::sys::fs::exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
3012ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      return "mips64el-linux-gnuabi64";
3013ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return TargetTriple.str();
3014155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth  case llvm::Triple::ppc:
3015b7e86be4412635d34b2bf161e1b8bbf00be055c9Sylvestre Ledru    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
3016b7e86be4412635d34b2bf161e1b8bbf00be055c9Sylvestre Ledru      return "powerpc-linux-gnuspe";
3017155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
3018155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth      return "powerpc-linux-gnu";
3019155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    return TargetTriple.str();
3020155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth  case llvm::Triple::ppc64:
3021155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
3022155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth      return "powerpc64-linux-gnu";
3023ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt  case llvm::Triple::ppc64le:
3024ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt    if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
3025ea7fb0ce25acc04664a2e7c2b24af03cef2c0d1fBill Schmidt      return "powerpc64le-linux-gnu";
3026155c54c011ecc2ffdaf7759ec5dbbafafff40618Chandler Carruth    return TargetTriple.str();
3027deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  }
3028deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth}
3029deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth
303000646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruthstatic void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
303100646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth  if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
303200646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth}
303300646ba867d63beeeb7124984795182cd5cc8b67Chandler Carruth
3034651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
30352a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth  if (isMipsArch(Triple.getArch())) {
30362a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth    // lib32 directory has a special meaning on MIPS targets.
30372a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth    // It contains N32 ABI binaries. Use this folder if produce
30382a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth    // code for N32 ABI only.
3039651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (tools::mips::hasMipsAbiArg(Args, "n32"))
30402a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth      return "lib32";
30412a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth    return Triple.isArch32Bit() ? "lib" : "lib64";
30422a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth  }
30437a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
3044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
30452a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth  // using that variant while targeting other architectures causes problems
30462a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth  // because the libraries are laid out in shared system roots that can't cope
3047651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // with a 'lib32' library search path being considered. So we only enable
30482a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth  // them when we know we may need it.
30492a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth  //
30502a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth  // FIXME: This is a bit of a hack. We should really unify this code for
3051651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // reasoning about oslibdir spellings with the lib dir spellings in the
30522a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth  // GCCInstallationDetector, but that is a more significant refactoring.
30532a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth  if (Triple.getArch() == llvm::Triple::x86 ||
30542a9b75840ed7f18c36e988ea52d1f434bb004d4fChandler Carruth      Triple.getArch() == llvm::Triple::ppc)
30557a9188833a6a09d574144334c9584c417b809007Simon Atanasyan    return "lib32";
30567a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
3057ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  if (Triple.getArch() == llvm::Triple::x86_64 &&
3058ef8225444452a1486bd721f3285301fe84643b00Stephen Hines      Triple.getEnvironment() == llvm::Triple::GNUX32)
3059ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    return "libx32";
3060ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
30617a9188833a6a09d574144334c9584c417b809007Simon Atanasyan  return Triple.isArch32Bit() ? "lib" : "lib64";
30627a9188833a6a09d574144334c9584c417b809007Simon Atanasyan}
30637a9188833a6a09d574144334c9584c417b809007Simon Atanasyan
30640e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaLinux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
30650e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
3066651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  GCCInstallation.init(D, Triple, Args);
3067651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Multilibs = GCCInstallation.getMultilibs();
306889088797876bddb866ce821f050a4395b7514dc2Chandler Carruth  llvm::Triple::ArchType Arch = Triple.getArch();
3069ab5df7503abd0df6b815d11ebf271fa7650d83aeSimon Atanasyan  std::string SysRoot = computeSysRoot();
3070c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3071766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola  // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
3072ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth  // least) put various tools in a triple-prefixed directory off of the parent
3073ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth  // of the GCC installation. We use the GCC triple here to ensure that we end
3074ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth  // up with tools that support the same amount of cross compiling as the
3075ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth  // detected GCC installation. For example, if we find a GCC installation
3076ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth  // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3077ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth  // used to target i386.
3078ef37744ff649b939c2262c12218abb24485977d1Chandler Carruth  // FIXME: This seems unlikely to be Linux-specific.
3079ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola  ToolChain::path_list &PPaths = getProgramPaths();
3080fa13459725b7a8c414ddf3742ffb7eab8314388dChandler Carruth  PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
3081fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth                         GCCInstallation.getTriple().str() + "/bin").str());
3082ab784085b774169cac0850a7e3151be97beb8399Rafael Espindola
3083ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  Linker = GetLinkerPath();
3084c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
30859a478245aecf58ca4e68ed629a840a74437e0ec1Rafael Espindola  Distro Distro = DetectDistro(Arch);
3086c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3087766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola  if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
308894c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("-z");
308994c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola    ExtraOpts.push_back("relro");
309094c8022573b2f7da5124558a8d0597b0e8fbb381Rafael Espindola  }
3091c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3092f0594d8b64cf32c55dde7a49ba849e864446c92bDouglas Gregor  if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
3093c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("-X");
3094c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
309594a7142f74bb4a9daa53c22087b19d4568073109Logan Chien  const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::Android;
30968e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  const bool IsMips = isMipsArch(Arch);
30978e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
30988e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  if (IsMips && !SysRoot.empty())
30998e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan    ExtraOpts.push_back("--sysroot=" + SysRoot);
3100704e7328a119e6024c9f63b21329bc612098c6ddEvgeniy Stepanov
3101d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3102d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // and the MIPS ABI require .dynsym to be sorted in different ways.
3103d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3104d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  // ABI requires a mapping between the GOT and the symbol table.
3105704e7328a119e6024c9f63b21329bc612098c6ddEvgeniy Stepanov  // Android loader does not support .gnu.hash.
31068e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  if (!IsMips && !IsAndroid) {
3107766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola    if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
3108668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer        (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
3109d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth      ExtraOpts.push_back("--hash-style=gnu");
3110d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth
3111766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola    if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
3112d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth        Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3113d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth      ExtraOpts.push_back("--hash-style=both");
3114d4e6e7e4a8c1f64162e14220579abab53e0ca10cChandler Carruth  }
3115c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3116d753b56d777a6ec1e62373dde8c398ae070a556eChris Lattner  if (IsRedhat(Distro))
3117c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--no-add-needed");
3118c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
31190b200f66b45cb34d0af71a5ce18f4a3c2cffcce1Eli Friedman  if (Distro == DebianSqueeze || Distro == DebianWheezy ||
3120766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola      Distro == DebianJessie || IsOpenSUSE(Distro) ||
31215a640efa55631cc38fe36bdd0ab8283b28322503Rafael Espindola      (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
3122668ecd9c8d428bdb2cd3566c8caf83b870609b4aBenjamin Kramer      (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
3123c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola    ExtraOpts.push_back("--build-id");
3124c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3125766633416daaafdf5ad85aa9e1f18e7163cce92cRafael Espindola  if (IsOpenSUSE(Distro))
3126f0b60ecc824af1e99e4288a8dcc11b22e2a6ea5eChandler Carruth    ExtraOpts.push_back("--enable-new-dtags");
312764a891770158a944fd9eca3c8e11cd599211aa81Chris Lattner
3128d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // The selection of paths to try here is designed to match the patterns which
3129d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3130d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // This was determined by running GCC in a fake filesystem, creating all
3131d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // possible permutations of these directories, and seeing which ones it added
3132d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  // to the link paths.
3133d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  path_list &Paths = getFilePaths();
313489088797876bddb866ce821f050a4395b7514dc2Chandler Carruth
3135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const std::string OSLibDir = getOSLibDir(Triple, Args);
3136deb73f8b9334b7b065e3ce776827e69ccb4f52cdChandler Carruth  const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
31373fd345a59db34de5bc8e29a64ebd9f68a1e9eb44Chandler Carruth
3138d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // Add the multilib suffixed paths where they are available.
3139d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  if (GCCInstallation.isValid()) {
3140fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
314189088797876bddb866ce821f050a4395b7514dc2Chandler Carruth    const std::string &LibPath = GCCInstallation.getParentLibPath();
3142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const Multilib &Multilib = GCCInstallation.getMultilib();
3143f8d9bd546811a56ebb0b581ce4cc6043b51659a1Simon Atanasyan
314428803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // Sourcery CodeBench MIPS toolchain holds some libraries under
314576671edc68f1c86369c84c2a6c011dabd39e37e5Chandler Carruth    // a biarch-like suffix of the GCC installation.
3146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    addPathIfExists((GCCInstallation.getInstallPath() +
3147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                     Multilib.gccSuffix()),
3148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                    Paths);
314928803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth
315028803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // GCC cross compiling toolchains will install target libraries which ship
315128803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
315228803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // any part of the GCC installation in
315328803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
315428803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // debatable, but is the reality today. We need to search this tree even
315528803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // when we have a sysroot somewhere else. It is the responsibility of
3156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // whomever is doing the cross build targeting a sysroot using a GCC
315728803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // installation that is *not* within the system root to ensure two things:
315828803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    //
315928803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    //  1) Any DSOs that are linked in from this tree or from the install path
316028803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    //     above must be preasant on the system root and found via an
316128803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    //     appropriate rpath.
316228803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    //  2) There must not be libraries installed into
316328803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    //     <prefix>/<triple>/<libdir> unless they should be preferred over
316428803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    //     those within the system root.
316528803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    //
316628803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // Note that this matches the GCC behavior. See the below comment for where
316728803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // Clang diverges from GCC's behavior.
3168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + OSLibDir +
3169651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                    Multilib.osSuffix(),
317028803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth                    Paths);
317128803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth
31729f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // If the GCC installation we found is inside of the sysroot, we want to
31739f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // prefer libraries installed in the parent prefix of the GCC installation.
31749f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // It is important to *not* use these paths when the GCC installation is
3175241cbe488c6f48e489915e256f532e22273d1ebaGabor Greif    // outside of the system root as that can pick up unintended libraries.
31769f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // This usually happens when there is an external cross compiler on the
31779f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    // host system, and a more minimal sysroot available that is the target of
317828803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // the cross. Note that GCC does include some of these directories in some
317928803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // configurations but this seems somewhere between questionable and simply
318028803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // a bug.
31819f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    if (StringRef(LibPath).startswith(SysRoot)) {
31829f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
3183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      addPathIfExists(LibPath + "/../" + OSLibDir, Paths);
31849f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth    }
3185c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  }
3186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Similar to the logic for GCC above, if we currently running Clang inside
3188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // of the requested system root, add its parent library paths to
3189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // those searched.
3190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: It's not clear whether we should use the driver's installed
3191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // directory ('Dir' below) or the ResourceDir.
3192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (StringRef(D.Dir).startswith(SysRoot)) {
3193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    addPathIfExists(D.Dir + "/../lib/" + MultiarchTriple, Paths);
3194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    addPathIfExists(D.Dir + "/../" + OSLibDir, Paths);
3195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
3196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3197d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
3198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addPathIfExists(SysRoot + "/lib/../" + OSLibDir, Paths);
3199d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  addPathIfExists(SysRoot + "/usr/lib/../" + OSLibDir, Paths);
3201d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth
3202d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth  // Try walking via the GCC triple path in case of biarch or multiarch GCC
3203d1f73060a9a5307fa665c2c17f82e19f959aacb5Chandler Carruth  // installations with strange symlinks.
320479cabd0793a624c1bc64c7c9e11575793c01b1e7Rafael Espindola  if (GCCInstallation.isValid()) {
3205fa5be916273be4d2e0ef8db050c8bdd404b95555Chandler Carruth    addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
3206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                    "/../../" + OSLibDir, Paths);
3207c7409a0005f1d1efd7026ee84871afe588740b49Rafael Espindola
3208651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Add the 'other' biarch variant path
3209651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    Multilib BiarchSibling;
3210651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
32114e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan      addPathIfExists(GCCInstallation.getInstallPath() +
3212651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      BiarchSibling.gccSuffix(), Paths);
3213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
32149f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth
321528803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // See comments above on the multilib variant for details of why this is
321628803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // included even from outside the sysroot.
3217651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const std::string &LibPath = GCCInstallation.getParentLibPath();
3218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const Multilib &Multilib = GCCInstallation.getMultilib();
32204e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan    addPathIfExists(LibPath + "/../" + GCCTriple.str() +
3221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                    "/lib" + Multilib.osSuffix(), Paths);
322228803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth
322328803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // See comments above on the multilib variant for details of why this is
322428803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    // only included from within the sysroot.
322528803ba0cd8a5d13d104af96aadf72dca4160a7fChandler Carruth    if (StringRef(LibPath).startswith(SysRoot))
32269f314374672a9c50d45ab60b96718cfbab06f484Chandler Carruth      addPathIfExists(LibPath, Paths);
3227d2deee17ade564dc9ab672c4ae8d7d4c2002d507Chandler Carruth  }
3228651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3229651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // Similar to the logic for GCC above, if we are currently running Clang
3230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // inside of the requested system root, add its parent library path to those
3231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // searched.
3232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // FIXME: It's not clear whether we should use the driver's installed
3233651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // directory ('Dir' below) or the ResourceDir.
3234651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (StringRef(D.Dir).startswith(SysRoot))
3235651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    addPathIfExists(D.Dir + "/../lib", Paths);
3236651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3237fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  addPathIfExists(SysRoot + "/lib", Paths);
3238fde8d14ea3061ff82e9dfddb23f17648c103eae6Chandler Carruth  addPathIfExists(SysRoot + "/usr/lib", Paths);
3239c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola}
3240c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola
3241c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindolabool Linux::HasNativeLLVMSupport() const {
3242c1da981bba867681004004b2d54ec2fdf3c08913Rafael Espindola  return true;
32436b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman}
32446b3454a219cee5ef36c4668961f93a5c32deab61Eli Friedman
3245f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Linux::buildLinker() const {
3246577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge  return new tools::gnutools::Link(*this);
3247f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
3248f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
3249f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *Linux::buildAssembler() const {
3250577bb0a2335295958b3b0f88bc9cdedf6551c17fThomas Schwinge  return new tools::gnutools::Assemble(*this);
3251ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola}
3252ba30bbe4e36a30a274da809a11a42f9cdc168e92Rafael Espindola
3253ab5df7503abd0df6b815d11ebf271fa7650d83aeSimon Atanasyanstd::string Linux::computeSysRoot() const {
32548e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  if (!getDriver().SysRoot.empty())
32558e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan    return getDriver().SysRoot;
32568e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
32578e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
32588e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan    return std::string();
32598e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
32604e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // Standalone MIPS toolchains use different names for sysroot folder
32614e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // and put it into different places. Here we try to check some known
32624e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  // variants.
32634e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan
32644e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  const StringRef InstallDir = GCCInstallation.getInstallPath();
32654e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  const StringRef TripleStr = GCCInstallation.getTriple().str();
3266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Multilib &Multilib = GCCInstallation.getMultilib();
32674e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan
3268f4ad5adac038bf0ecddd5111485d47e8756e2b15Chandler Carruth  std::string Path = (InstallDir + "/../../../../" + TripleStr + "/libc" +
3269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                      Multilib.osSuffix()).str();
32708e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
32714e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  if (llvm::sys::fs::exists(Path))
32724e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan    return Path;
32734e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan
3274651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
32754e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan
32764e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  if (llvm::sys::fs::exists(Path))
32774e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan    return Path;
32784e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan
32794e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan  return std::string();
32808e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan}
32818e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
32827d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
32837d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                      ArgStringList &CC1Args) const {
32847d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  const Driver &D = getDriver();
3285ab5df7503abd0df6b815d11ebf271fa7650d83aeSimon Atanasyan  std::string SysRoot = computeSysRoot();
32867d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
32877d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdinc))
32887d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
32897d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
32907d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
32918e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan    addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
32927d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
32937d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
32947b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola    SmallString<128> P(D.ResourceDir);
32957b6301f7f5f9c0ead17a448aad7c456b3252bb45Rafael Espindola    llvm::sys::path::append(P, "include");
329607643086c6460095855573902d66aae1b08a6182Chandler Carruth    addSystemInclude(DriverArgs, CC1Args, P.str());
32977d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
32987d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
32997d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc))
33007d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
33017d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
33027d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Check for configure-time C include directories.
33037d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  StringRef CIncludeDirs(C_INCLUDE_DIRS);
33047d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (CIncludeDirs != "") {
33057d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    SmallVector<StringRef, 5> dirs;
33067d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    CIncludeDirs.split(dirs, ":");
33076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    for (StringRef dir : dirs) {
33086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      StringRef Prefix = llvm::sys::path::is_absolute(dir) ? SysRoot : "";
33096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
33107d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    }
33117d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
33127d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
33137d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
33147d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // Lacking those, try to detect the correct set of system includes for the
33157d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  // target triple.
33167d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
33178e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  // Sourcery CodeBench and modern FSF Mips toolchains put extern C
33188e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  // system includes under three additional directories.
33198e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  if (GCCInstallation.isValid() && isMipsArch(getTriple().getArch())) {
3320d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    addExternCSystemIncludeIfExists(
3321d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        DriverArgs, CC1Args, GCCInstallation.getInstallPath() + "/include");
3322d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth
3323d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    addExternCSystemIncludeIfExists(
3324d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        DriverArgs, CC1Args,
3325d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth        GCCInstallation.getInstallPath() + "/../../../../" +
3326d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth            GCCInstallation.getTriple().str() + "/libc/usr/include");
33274e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan
33284e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan    addExternCSystemIncludeIfExists(
33294e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan        DriverArgs, CC1Args,
33304e30cdf93fec46a6ceb326e57ceb46ad7e9c2c6cSimon Atanasyan        GCCInstallation.getInstallPath() + "/../../../../sysroot/usr/include");
33318e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  }
33328e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan
3333a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  // Implement generic Debian multiarch support.
3334a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef X86_64MultiarchIncludeDirs[] = {
3335a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/x86_64-linux-gnu",
3336a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth
3337a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // FIXME: These are older forms of multiarch. It's not clear that they're
3338a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // in use in any released version of Debian, so we should consider
3339a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // removing them.
3340d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"
3341a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
3342a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef X86MultiarchIncludeDirs[] = {
3343a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i386-linux-gnu",
3344a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth
3345a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // FIXME: These are older forms of multiarch. It's not clear that they're
3346a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // in use in any released version of Debian, so we should consider
3347a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    // removing them.
3348d79486a19298af172dfa085d536e178e7b5ff20bChandler Carruth    "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3349a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/i486-linux-gnu"
3350a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
3351c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  const StringRef AArch64MultiarchIncludeDirs[] = {
3352c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    "/usr/include/aarch64-linux-gnu"
3353c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover  };
3354a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  const StringRef ARMMultiarchIncludeDirs[] = {
3355a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    "/usr/include/arm-linux-gnueabi"
3356a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  };
3357ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  const StringRef ARMHFMultiarchIncludeDirs[] = {
3358ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    "/usr/include/arm-linux-gnueabihf"
3359ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu  };
3360d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  const StringRef MIPSMultiarchIncludeDirs[] = {
3361d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    "/usr/include/mips-linux-gnu"
3362d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  };
3363d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  const StringRef MIPSELMultiarchIncludeDirs[] = {
3364d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    "/usr/include/mipsel-linux-gnu"
3365d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  };
3366ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const StringRef MIPS64MultiarchIncludeDirs[] = {
3367ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    "/usr/include/mips64-linux-gnu",
3368ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    "/usr/include/mips64-linux-gnuabi64"
3369ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  };
3370ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const StringRef MIPS64ELMultiarchIncludeDirs[] = {
3371ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    "/usr/include/mips64el-linux-gnu",
3372ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    "/usr/include/mips64el-linux-gnuabi64"
3373ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  };
3374079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  const StringRef PPCMultiarchIncludeDirs[] = {
3375079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    "/usr/include/powerpc-linux-gnu"
3376079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  };
3377079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  const StringRef PPC64MultiarchIncludeDirs[] = {
3378079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    "/usr/include/powerpc64-linux-gnu"
3379079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  };
3380ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  const StringRef PPC64LEMultiarchIncludeDirs[] = {
3381ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    "/usr/include/powerpc64le-linux-gnu"
3382ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  };
3383a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  ArrayRef<StringRef> MultiarchIncludeDirs;
33847d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (getTriple().getArch() == llvm::Triple::x86_64) {
3385a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
33867d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  } else if (getTriple().getArch() == llvm::Triple::x86) {
3387a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    MultiarchIncludeDirs = X86MultiarchIncludeDirs;
3388651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } else if (getTriple().getArch() == llvm::Triple::aarch64 ||
3389651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             getTriple().getArch() == llvm::Triple::aarch64_be ||
33906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             getTriple().getArch() == llvm::Triple::arm64 ||
33916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines             getTriple().getArch() == llvm::Triple::arm64_be) {
3392c264e16a42b3f6c36521857a29ea0949d9781c22Tim Northover    MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
33937d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  } else if (getTriple().getArch() == llvm::Triple::arm) {
3394ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3395ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3396ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu    else
3397ff104a12d61d34af67f12a7a966847c821d7afa8Jiangning Liu      MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
3398d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  } else if (getTriple().getArch() == llvm::Triple::mips) {
3399d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
3400d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman  } else if (getTriple().getArch() == llvm::Triple::mipsel) {
3401d7df785e8ba3284c66c1a05537f9e1c8cc27d252Eli Friedman    MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
3402ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  } else if (getTriple().getArch() == llvm::Triple::mips64) {
3403ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
3404ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  } else if (getTriple().getArch() == llvm::Triple::mips64el) {
3405ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
3406079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  } else if (getTriple().getArch() == llvm::Triple::ppc) {
3407079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
3408079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth  } else if (getTriple().getArch() == llvm::Triple::ppc64) {
3409079d2bbec5c14cfa5901aa579c6934f34484fc97Chandler Carruth    MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
3410ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  } else if (getTriple().getArch() == llvm::Triple::ppc64le) {
3411ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
3412a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth  }
34136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (StringRef Dir : MultiarchIncludeDirs) {
34146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (llvm::sys::fs::exists(SysRoot + Dir)) {
34156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
3416a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth      break;
3417a463089f6eb37069d406f9fb56e40810edaf523aChandler Carruth    }
34187d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  }
34197d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
34207d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (getTriple().getOS() == llvm::Triple::RTEMS)
34217d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
34227d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
3423c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // Add an include of '/include' directly. This isn't provided by default by
3424c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3425c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth  // add even when Clang is acting as-if it were a system compiler.
34268e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
3427c44bc2d32f81d11b4c0e46c932ba42e673b50a49Chandler Carruth
34288e8e95c57c310bbc52cdc8d32df23c95afc77916Simon Atanasyan  addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
34297d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
34307d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
3431f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/// \brief Helper to add the three variant paths for a libstdc++ installation.
343279cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
343379cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                const ArgList &DriverArgs,
343479cbbdc8affe52591f7ee487a789639aa38331ecChandler Carruth                                                ArgStringList &CC1Args) {
3435abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  if (!llvm::sys::fs::exists(Base))
3436abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    return false;
34377d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base);
3438abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
34397d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
3440abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  return true;
34417d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
34427d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
3443f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/// \brief Helper to add an extra variant path for an (Ubuntu) multilib
3444f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/// libstdc++ installation.
3445f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine Suffix,
3446f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                                                Twine TargetArchDir,
3447651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                                Twine IncludeSuffix,
3448f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                                                const ArgList &DriverArgs,
3449f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                                                ArgStringList &CC1Args) {
3450f4ad5adac038bf0ecddd5111485d47e8756e2b15Chandler Carruth  if (!addLibStdCXXIncludePaths(Base + Suffix,
3451651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                TargetArchDir + IncludeSuffix,
3452f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko                                DriverArgs, CC1Args))
3453f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko    return false;
3454f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko
3455f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko  addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir + Suffix
3456651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                   + IncludeSuffix);
3457f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko  return true;
3458f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko}
3459f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko
34607d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruthvoid Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
34617d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth                                         ArgStringList &CC1Args) const {
34627d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth  if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
34637d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth      DriverArgs.hasArg(options::OPT_nostdincxx))
34647d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth    return;
34657d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
3466eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  // Check if libc++ has been enabled and provide its include paths if so.
3467eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
3468651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    const std::string LibCXXIncludePathCandidates[] = {
3469651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // The primary location is within the Clang installation.
3470651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3471651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // newer ABI versions.
3472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      getDriver().Dir + "/../include/c++/v1",
3473651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
3474651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // We also check the system as for a long time this is the only place Clang looked.
3475651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // FIXME: We should really remove this. It doesn't make any sense.
3476651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      getDriver().SysRoot + "/usr/include/c++/v1"
3477651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    };
34786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    for (const auto &IncludePath : LibCXXIncludePathCandidates) {
34796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      if (!llvm::sys::fs::exists(IncludePath))
3480651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        continue;
3481651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      // Add the first candidate that exists.
34826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      addSystemInclude(DriverArgs, CC1Args, IncludePath);
3483651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
3484651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    }
3485eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth    return;
3486eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth  }
3487eb35ffc2174f7c4d622c6e81e3a4915ef077f470Chandler Carruth
3488fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  // We need a detected GCC installation on Linux to provide libstdc++'s
3489fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  // headers. We handled the libc++ case above.
3490fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth  if (!GCCInstallation.isValid())
3491fc52f7526ea0adfcbdbe76a3c4fcdcbb1f1b08b6Chandler Carruth    return;
3492abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth
3493abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // By default, look for the C++ headers in an include directory adjacent to
3494abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // the lib directory of the GCC installation. Note that this is expect to be
3495abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3496abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef LibDir = GCCInstallation.getParentLibPath();
3497abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  StringRef InstallDir = GCCInstallation.getInstallPath();
34981d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  StringRef TripleStr = GCCInstallation.getTriple().str();
3499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const Multilib &Multilib = GCCInstallation.getMultilib();
35000affc67389171834adf113e3a0422a32218a6192Chandler Carruth  const GCCVersion &Version = GCCInstallation.getVersion();
35011d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov
3502f4ad5adac038bf0ecddd5111485d47e8756e2b15Chandler Carruth  if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
3503651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               "/c++/" + Version.Text, TripleStr,
3504651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               Multilib.includeSuffix(), DriverArgs, CC1Args))
3505f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko    return;
3506f2e7c35ade3d28ef1c5ad91f757a7993b0006bbeDmitri Gribenko
3507651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const std::string LibStdCXXIncludePathCandidates[] = {
3508abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth    // Gentoo is weird and places its headers inside the GCC install, so if the
35090affc67389171834adf113e3a0422a32218a6192Chandler Carruth    // first attempt to find the headers fails, try these patterns.
35100affc67389171834adf113e3a0422a32218a6192Chandler Carruth    InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
35110affc67389171834adf113e3a0422a32218a6192Chandler Carruth        Version.MinorStr,
35120affc67389171834adf113e3a0422a32218a6192Chandler Carruth    InstallDir.str() + "/include/g++-v" + Version.MajorStr,
35131d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov    // Android standalone toolchain has C++ headers in yet another place.
35140affc67389171834adf113e3a0422a32218a6192Chandler Carruth    LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
351502014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
351602014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    // without a subdirectory corresponding to the gcc version.
351702014b485394cc93e0a2bd386e94424a5707ea69Hal Finkel    LibDir.str() + "/../include/c++",
35181d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov  };
35191d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov
35206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
35216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (addLibStdCXXIncludePaths(IncludePath,
3522651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                 TripleStr + Multilib.includeSuffix(),
3523f4ad5adac038bf0ecddd5111485d47e8756e2b15Chandler Carruth                                 DriverArgs, CC1Args))
35241d01afe4d5883d7ec538b739aa7922d7de46f192Evgeniy Stepanov      break;
3525abaa1d7caf49d5e4774c3399de9329ab46de03a7Chandler Carruth  }
35267d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth}
35277d7e9f963a4977e36efb90fd9c369f33ced1a95aChandler Carruth
352852ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbournebool Linux::isPIEDefault() const {
3529c6911a2b1fc176e4d6053ed86506c17c3d8b0057Peter Collingbourne  return getSanitizerArgs().hasZeroBaseShadow();
353052ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne}
353152ca70dc304c694923ac804630d88b1d95bfa941Peter Collingbourne
353211e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
353311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
35340e65959196b45d8afc89e9102c4fc4ec0d642066Rafael EspindolaDragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
35350e65959196b45d8afc89e9102c4fc4ec0d642066Rafael Espindola  : Generic_ELF(D, Triple, Args) {
353611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
353711e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  // Path mangling to find libexec
3538edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar  getProgramPaths().push_back(getDriver().getInstalledDir());
353986643b88a11582cfff2091a4815950d166269428Benjamin Kramer  if (getDriver().getInstalledDir() != getDriver().Dir)
3540edf29b00bc1641034b38be92146e15f0625a45d2Daniel Dunbar    getProgramPaths().push_back(getDriver().Dir);
354111e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
3542ee788e70fcd0adf76103b17c78ac658d4ea30c9bDaniel Dunbar  getFilePaths().push_back(getDriver().Dir + "/../lib");
354311e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar  getFilePaths().push_back("/usr/lib");
35448cfb720c857e66b7fb64bf3cb80fd82fcd0c0ac3John McCall  if (llvm::sys::fs::exists("/usr/lib/gcc47"))
35458cfb720c857e66b7fb64bf3cb80fd82fcd0c0ac3John McCall    getFilePaths().push_back("/usr/lib/gcc47");
35468cfb720c857e66b7fb64bf3cb80fd82fcd0c0ac3John McCall  else
35478cfb720c857e66b7fb64bf3cb80fd82fcd0c0ac3John McCall    getFilePaths().push_back("/usr/lib/gcc44");
354811e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
354911e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar
3550f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *DragonFly::buildAssembler() const {
3551f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::dragonfly::Assemble(*this);
3552f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola}
3553f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola
3554f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael EspindolaTool *DragonFly::buildLinker() const {
3555f48b93cb2054e83e43ca4391b8ec70be89fa2e30Rafael Espindola  return new tools::dragonfly::Link(*this);
355611e1b40d759a643086f590f6ffbd9d68360bad46Daniel Dunbar}
35574e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
35584e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
35594e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton/// XCore tool chain
35604e490e271ce3f0d4289b5115e000b55333c1b829Robert LyttonXCore::XCore(const Driver &D, const llvm::Triple &Triple,
35614e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton             const ArgList &Args) : ToolChain(D, Triple, Args) {
35624e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  // ProgramPaths are found via 'PATH' environment variable.
35634e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
35644e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
35654e490e271ce3f0d4289b5115e000b55333c1b829Robert LyttonTool *XCore::buildAssembler() const {
35664e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  return new tools::XCore::Assemble(*this);
35674e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
35684e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
35694e490e271ce3f0d4289b5115e000b55333c1b829Robert LyttonTool *XCore::buildLinker() const {
35704e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  return new tools::XCore::Link(*this);
35714e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
35724e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
35734e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonbool XCore::isPICDefault() const {
35744e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  return false;
35754e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
35764e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
35774e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonbool XCore::isPIEDefault() const {
35784e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  return false;
35794e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
35804e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
35814e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonbool XCore::isPICDefaultForced() const {
35824e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  return false;
35834e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
35844e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
35854e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonbool XCore::SupportsProfiling() const {
35864e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  return false;
35874e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
35884e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
35894e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonbool XCore::hasBlocksRuntime() const {
35904e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  return false;
35914e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
35924e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
35934e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonvoid XCore::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
35944e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                                      ArgStringList &CC1Args) const {
35954e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  if (DriverArgs.hasArg(options::OPT_nostdinc) ||
35964e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton      DriverArgs.hasArg(options::OPT_nostdlibinc))
35974e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    return;
35984e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
35994e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    SmallVector<StringRef, 4> Dirs;
36004e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,'\0'};
36014e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
36024e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    ArrayRef<StringRef> DirVec(Dirs);
36034e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    addSystemIncludes(DriverArgs, CC1Args, DirVec);
36044e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  }
36054e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
36064e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
36074e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonvoid XCore::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
36084e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                                     llvm::opt::ArgStringList &CC1Args) const {
36094e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  CC1Args.push_back("-nostdsysteminc");
36104e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
36114e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
36124e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonvoid XCore::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
36134e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                                         ArgStringList &CC1Args) const {
36144e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  if (DriverArgs.hasArg(options::OPT_nostdinc) ||
36154e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton      DriverArgs.hasArg(options::OPT_nostdlibinc))
36164e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    return;
36174e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
36184e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    SmallVector<StringRef, 4> Dirs;
36194e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator,'\0'};
36204e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
36214e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    ArrayRef<StringRef> DirVec(Dirs);
36224e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton    addSystemIncludes(DriverArgs, CC1Args, DirVec);
36234e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  }
36244e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
36254e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton
36264e490e271ce3f0d4289b5115e000b55333c1b829Robert Lyttonvoid XCore::AddCXXStdlibLibArgs(const ArgList &Args,
36274e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton                                ArgStringList &CmdArgs) const {
36284e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton  // We don't output any lib args. This is handled by xcc.
36294e490e271ce3f0d4289b5115e000b55333c1b829Robert Lytton}
3630