blob: 6c5cdb275971c0d22edf135a1911376946cc4baa [file] [log] [blame]
Hans Wennborgdcfba332015-10-06 23:40:43 +00001//===--- ToolChains.cpp - ToolChain Implementations -------------*- C++ -*-===//
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ToolChains.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "clang/Basic/ObjCRuntime.h"
12#include "clang/Basic/Version.h"
Benjamin Kramerd45b2052015-10-07 15:48:01 +000013#include "clang/Basic/VirtualFileSystem.h"
Alp Toker1d257e12014-06-04 03:28:55 +000014#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
Daniel Dunbar6232d342010-05-20 21:48:38 +000015#include "clang/Driver/Compilation.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000016#include "clang/Driver/Driver.h"
Daniel Dunbaraabb0b12009-03-25 06:12:34 +000017#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000018#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000019#include "clang/Driver/SanitizerArgs.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000020#include "llvm/ADT/STLExtras.h"
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +000021#include "llvm/ADT/SmallString.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000022#include "llvm/ADT/StringExtras.h"
Bob Wilson997a97f2011-10-07 00:37:57 +000023#include "llvm/ADT/StringSwitch.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000024#include "llvm/Option/Arg.h"
25#include "llvm/Option/ArgList.h"
26#include "llvm/Option/OptTable.h"
27#include "llvm/Option/Option.h"
Xinliang David Li170cd102015-10-27 05:15:35 +000028#include "llvm/ProfileData/InstrProf.h"
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +000029#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000030#include "llvm/Support/FileSystem.h"
Rafael Espindolac8f008f2010-11-07 20:14:31 +000031#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000032#include "llvm/Support/Path.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000033#include "llvm/Support/Program.h"
Renato Golin33e1f822015-05-28 15:49:28 +000034#include "llvm/Support/TargetParser.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000035#include "llvm/Support/raw_ostream.h"
Daniel Dunbarb5023e92009-04-10 21:00:07 +000036#include <cstdlib> // ::getenv
Rafael Espindola8a8e5542014-06-12 17:19:42 +000037#include <system_error>
Daniel Dunbarb5023e92009-04-10 21:00:07 +000038
Daniel Dunbar59e5e882009-03-20 00:20:03 +000039using namespace clang::driver;
40using namespace clang::driver::toolchains;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000042using namespace llvm::opt;
Daniel Dunbar59e5e882009-03-20 00:20:03 +000043
Douglas Katzmana67e50c2015-06-26 15:47:46 +000044MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
45 : ToolChain(D, Triple, Args) {
Tim Northover15ff71d2014-05-22 13:12:14 +000046 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
47 getProgramPaths().push_back(getDriver().getInstalledDir());
48 if (getDriver().getInstalledDir() != getDriver().Dir)
49 getProgramPaths().push_back(getDriver().Dir);
Tim Northover157d9112014-01-16 08:48:16 +000050}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +000051
Tim Northover157d9112014-01-16 08:48:16 +000052/// Darwin - Darwin tool chain for i386 and x86_64.
Alexey Samsonov905c8022015-06-18 21:46:05 +000053Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
54 : MachO(D, Triple, Args), TargetInitialized(false) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +000055
Tim Northover157d9112014-01-16 08:48:16 +000056types::ID MachO::LookupTypeForExtension(const char *Ext) const {
Daniel Dunbarcc7df6c2010-08-02 05:43:56 +000057 types::ID Ty = types::lookupTypeForExtension(Ext);
58
59 // Darwin always preprocesses assembly files (unless -x is used explicitly).
60 if (Ty == types::TY_PP_Asm)
61 return types::TY_Asm;
62
63 return Ty;
64}
65
Douglas Katzmana67e50c2015-06-26 15:47:46 +000066bool MachO::HasNativeLLVMSupport() const { return true; }
Daniel Dunbar62123a12010-09-17 00:24:52 +000067
Jonas Hahnfeldaae83742016-02-12 07:48:37 +000068ToolChain::CXXStdlibType Darwin::GetDefaultCXXStdlibType() const {
69 // Default to use libc++ on OS X 10.9+ and iOS 7+.
70 if ((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
71 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) ||
72 isTargetWatchOSBased())
73 return ToolChain::CST_Libcxx;
74
75 return ToolChain::CST_Libstdcxx;
76}
77
John McCall24fc0de2011-07-06 00:26:06 +000078/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000079ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover6f3ff222015-10-30 16:30:27 +000080 if (isTargetWatchOSBased())
Tim Northover756447a2015-10-30 16:30:36 +000081 return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion);
Tim Northover9c7e0352013-12-12 11:55:52 +000082 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000083 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000084 if (isNonFragile)
85 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
86 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000087}
88
John McCall7959fee2011-09-09 20:41:01 +000089/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
90bool Darwin::hasBlocksRuntime() const {
Tim Northover6f3ff222015-10-30 16:30:27 +000091 if (isTargetWatchOSBased())
92 return true;
93 else if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000094 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000095 else {
Tim Northover157d9112014-01-16 08:48:16 +000096 assert(isTargetMacOS() && "unexpected darwin target");
97 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000098 }
John McCall7959fee2011-09-09 20:41:01 +000099}
100
Renato Golin33e1f822015-05-28 15:49:28 +0000101// This is just a MachO name translation routine and there's no
102// way to join this into ARMTargetParser without breaking all
103// other assumptions. Maybe MachO should consider standardising
104// their nomenclature.
105static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000106 return llvm::StringSwitch<const char *>(Arch)
107 .Case("armv6k", "armv6")
108 .Case("armv6m", "armv6m")
109 .Case("armv5tej", "armv5")
110 .Case("xscale", "xscale")
111 .Case("armv4t", "armv4t")
112 .Case("armv7", "armv7")
113 .Cases("armv7a", "armv7-a", "armv7")
114 .Cases("armv7r", "armv7-r", "armv7")
115 .Cases("armv7em", "armv7e-m", "armv7em")
116 .Cases("armv7k", "armv7-k", "armv7k")
117 .Cases("armv7m", "armv7-m", "armv7m")
118 .Cases("armv7s", "armv7-s", "armv7s")
119 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000120}
121
Renato Golin33e1f822015-05-28 15:49:28 +0000122static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000123 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000124 if (ArchKind == llvm::ARM::AK_INVALID)
125 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000126 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000127
128 // FIXME: Make sure this MachO triple mangling is really necessary.
129 // ARMv5* normalises to ARMv5.
130 if (Arch.startswith("armv5"))
131 Arch = Arch.substr(0, 5);
132 // ARMv6*, except ARMv6M, normalises to ARMv6.
133 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
134 Arch = Arch.substr(0, 5);
135 // ARMv7A normalises to ARMv7.
136 else if (Arch.endswith("v7a"))
137 Arch = Arch.substr(0, 5);
138 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000139}
140
Tim Northover9c7e0352013-12-12 11:55:52 +0000141static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000142 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000143 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000144 if (!A)
145 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000146
Tim Northover9c7e0352013-12-12 11:55:52 +0000147 return A->getOption().matches(options::OPT_msoft_float) ||
148 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
149 A->getValue() == StringRef("soft"));
150}
151
Tim Northover157d9112014-01-16 08:48:16 +0000152StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000153 switch (getTriple().getArch()) {
154 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000155 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000156
Tim Northover40956e62014-07-23 12:32:58 +0000157 case llvm::Triple::aarch64:
158 return "arm64";
159
Douglas Gregord9bb1522011-03-06 19:11:49 +0000160 case llvm::Triple::thumb:
Hans Wennborgdcfba332015-10-06 23:40:43 +0000161 case llvm::Triple::arm:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000162 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000163 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000164 return Arch;
165
166 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000167 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000168 return Arch;
169
170 return "arm";
171 }
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000172}
173
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000174Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000175
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000176MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000177
178std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000179 types::ID InputType) const {
Tim Northover157d9112014-01-16 08:48:16 +0000180 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
181
182 return Triple.getTriple();
183}
184
Chad Rosierd3a0f952011-09-20 20:44:06 +0000185std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
186 types::ID InputType) const {
187 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000188
189 // If the target isn't initialized (e.g., an unknown Darwin platform, return
190 // the default triple).
191 if (!isTargetInitialized())
192 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000193
Tim Northover157d9112014-01-16 08:48:16 +0000194 SmallString<16> Str;
Tim Northover6f3ff222015-10-30 16:30:27 +0000195 if (isTargetWatchOSBased())
196 Str += "watchos";
197 else if (isTargetTvOSBased())
198 Str += "tvos";
199 else if (isTargetIOSBased())
200 Str += "ios";
201 else
202 Str += "macosx";
Tim Northover157d9112014-01-16 08:48:16 +0000203 Str += getTargetVersion().getAsString();
204 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000205
206 return Triple.getTriple();
207}
208
David Blaikie68e081d2011-12-20 02:48:34 +0000209void Generic_ELF::anchor() {}
210
Tim Northover157d9112014-01-16 08:48:16 +0000211Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000212 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000213 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000214 if (!Lipo)
215 Lipo.reset(new tools::darwin::Lipo(*this));
216 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000217 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000218 if (!Dsymutil)
219 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
220 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000221 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000222 if (!VerifyDebug)
223 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
224 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000225 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000226 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000227 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000228}
229
Douglas Katzman95354292015-06-23 20:42:09 +0000230Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000231
Tim Northover157d9112014-01-16 08:48:16 +0000232Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000233 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000234}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000235
Douglas Katzman95354292015-06-23 20:42:09 +0000236DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000237 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000238 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000239
Tim Northover336f1892014-03-29 13:16:12 +0000240void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
Tim Northover6f3ff222015-10-30 16:30:27 +0000241 // For modern targets, promote certain warnings to errors.
242 if (isTargetWatchOSBased() || getTriple().isArch64Bit()) {
Tim Northover336f1892014-03-29 13:16:12 +0000243 // Always enable -Wdeprecated-objc-isa-usage and promote it
244 // to an error.
245 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
246 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
247
Tim Northover6f3ff222015-10-30 16:30:27 +0000248 // For iOS and watchOS, also error about implicit function declarations,
249 // as that can impact calling conventions.
250 if (!isTargetMacOS())
251 CC1Args.push_back("-Werror=implicit-function-declaration");
Tim Northover336f1892014-03-29 13:16:12 +0000252 }
253}
254
Tim Northover157d9112014-01-16 08:48:16 +0000255/// \brief Determine whether Objective-C automated reference counting is
256/// enabled.
257static bool isObjCAutoRefCount(const ArgList &Args) {
258 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
259}
260
John McCall31168b02011-06-15 23:02:42 +0000261void DarwinClang::AddLinkARCArgs(const ArgList &Args,
262 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000263 // Avoid linking compatibility stubs on i386 mac.
264 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
265 return;
266
267 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
268
269 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
270 runtime.hasSubscripting())
271 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000272
273 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000274 SmallString<128> P(getDriver().ClangExecutable);
275 llvm::sys::path::remove_filename(P); // 'clang'
276 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000277 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000278 // Mash in the platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000279 if (isTargetWatchOSSimulator())
280 P += "watchsimulator";
281 else if (isTargetWatchOS())
282 P += "watchos";
283 else if (isTargetTvOSSimulator())
284 P += "appletvsimulator";
285 else if (isTargetTvOS())
286 P += "appletvos";
287 else if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000288 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000289 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000290 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000291 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000292 P += "macosx";
293 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000294
Rafael Espindola358256c2013-06-26 02:13:00 +0000295 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000296}
297
Tim Northover157d9112014-01-16 08:48:16 +0000298void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000299 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000300 bool IsEmbedded, bool AddRPath) const {
301 SmallString<128> Dir(getDriver().ResourceDir);
302 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
303
304 SmallString<128> P(Dir);
305 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000306
Eric Christopherc235d0c62011-06-22 17:41:40 +0000307 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000308 // not have compiler-rt checked out or integrated into their build (unless
309 // we explicitly force linking with this library).
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000310 if (AlwaysLink || getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000311 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000312
313 // Adding the rpaths might negatively interact when other rpaths are involved,
314 // so we should make sure we add the rpaths last, after all user-specified
315 // rpaths. This is currently true from this place, but we need to be
316 // careful if this function is ever called before user's rpaths are emitted.
317 if (AddRPath) {
318 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
319
320 // Add @executable_path to rpath to support having the dylib copied with
321 // the executable.
322 CmdArgs.push_back("-rpath");
323 CmdArgs.push_back("@executable_path");
324
325 // Add the path to the resource dir to rpath to support using the dylib
326 // from the default location without copying.
327 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000328 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000329 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000330}
331
Anna Zakse67b4022016-02-02 02:04:48 +0000332StringRef Darwin::getOSLibraryNameSuffix() const {
333 switch(TargetPlatform) {
334 case DarwinPlatformKind::MacOS:
335 return "osx";
336 case DarwinPlatformKind::IPhoneOS:
337 return "ios";
338 case DarwinPlatformKind::IPhoneOSSimulator:
339 return "iossim";
340 case DarwinPlatformKind::TvOS:
341 return "tvos";
342 case DarwinPlatformKind::TvOSSimulator:
343 return "tvossim";
344 case DarwinPlatformKind::WatchOS:
345 return "watchos";
346 case DarwinPlatformKind::WatchOSSimulator:
347 return "watchossim";
348 }
349 llvm_unreachable("Unsupported platform");
350}
351
Justin Bogner2fd95f62015-05-12 06:30:48 +0000352void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000353 ArgStringList &CmdArgs) const {
Xinliang David Li69306c02015-10-22 06:15:31 +0000354 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000355
Chris Bieneman586d24b2015-11-20 00:19:21 +0000356 // TODO: Clean this up once autoconf is gone
357 SmallString<128> P(getDriver().ResourceDir);
358 llvm::sys::path::append(P, "lib", "darwin");
359 const char *Library = "libclang_rt.profile_osx.a";
360
Justin Bognerc7701242015-05-12 05:44:36 +0000361 // Select the appropriate runtime library for the target.
Chris Bieneman586d24b2015-11-20 00:19:21 +0000362 if (isTargetWatchOS()) {
363 Library = "libclang_rt.profile_watchos.a";
364 } else if (isTargetWatchOSSimulator()) {
365 llvm::sys::path::append(P, "libclang_rt.profile_watchossim.a");
366 Library = getVFS().exists(P) ? "libclang_rt.profile_watchossim.a"
367 : "libclang_rt.profile_watchos.a";
368 } else if (isTargetTvOS()) {
369 Library = "libclang_rt.profile_tvos.a";
370 } else if (isTargetTvOSSimulator()) {
371 llvm::sys::path::append(P, "libclang_rt.profile_tvossim.a");
372 Library = getVFS().exists(P) ? "libclang_rt.profile_tvossim.a"
373 : "libclang_rt.profile_tvos.a";
374 } else if (isTargetIPhoneOS()) {
375 Library = "libclang_rt.profile_ios.a";
376 } else if (isTargetIOSSimulator()) {
377 llvm::sys::path::append(P, "libclang_rt.profile_iossim.a");
378 Library = getVFS().exists(P) ? "libclang_rt.profile_iossim.a"
379 : "libclang_rt.profile_ios.a";
Vedant Kumar0affb932015-11-10 00:20:34 +0000380 } else {
381 assert(isTargetMacOS() && "unexpected non MacOS platform");
Vedant Kumar0affb932015-11-10 00:20:34 +0000382 }
Chris Bieneman586d24b2015-11-20 00:19:21 +0000383 AddLinkRuntimeLib(Args, CmdArgs, Library,
384 /*AlwaysLink*/ true);
Justin Bognerc7701242015-05-12 05:44:36 +0000385}
386
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000387void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
388 ArgStringList &CmdArgs,
389 StringRef Sanitizer) const {
390 if (!Args.hasArg(options::OPT_dynamiclib) &&
391 !Args.hasArg(options::OPT_bundle)) {
392 // Sanitizer runtime libraries requires C++.
393 AddCXXStdlibLibArgs(Args, CmdArgs);
394 }
Anna Zakse67b4022016-02-02 02:04:48 +0000395
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000396 AddLinkRuntimeLib(
397 Args, CmdArgs,
Anna Zakse67b4022016-02-02 02:04:48 +0000398 (Twine("libclang_rt.") + Sanitizer + "_" +
399 getOSLibraryNameSuffix() + "_dynamic.dylib").str(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000400 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
401 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000402
403 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
404 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
405 // all RTTI-related symbols that UBSan uses.
406 CmdArgs.push_back("-lc++abi");
407 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000408}
409
Daniel Dunbar6276f992009-09-18 08:15:13 +0000410void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
411 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000412 // Darwin only supports the compiler-rt based runtime libraries.
413 switch (GetRuntimeLibType(Args)) {
414 case ToolChain::RLT_CompilerRT:
415 break;
416 default:
417 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000418 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000419 return;
420 }
421
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000422 // Darwin doesn't support real static executables, don't link any runtime
423 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000424 if (Args.hasArg(options::OPT_static) ||
425 Args.hasArg(options::OPT_fapple_kext) ||
426 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000427 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000428
429 // Reject -static-libgcc for now, we can deal with this when and if someone
430 // cares. This is useful in situations where someone wants to statically link
431 // something like libstdc++, and needs its runtime support routines.
432 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000433 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000434 return;
435 }
436
Peter Collingbourne32701642013-11-01 18:16:25 +0000437 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000438 if (Sanitize.needsAsanRt())
439 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
440 if (Sanitize.needsUbsanRt())
441 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000442 if (Sanitize.needsTsanRt())
443 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Peter Collingbournedc134532016-01-16 00:31:22 +0000444 if (Sanitize.needsStatsRt()) {
445 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
446 AddLinkRuntimeLib(Args, CmdArgs,
447 (Twine("libclang_rt.stats_client_") + OS + ".a").str(),
448 /*AlwaysLink=*/true);
449 AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");
450 }
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000451
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000452 // Otherwise link libSystem, then the dynamic runtime library, and finally any
453 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000454 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000455
456 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000457 if (isTargetWatchOSBased()) {
458 // We currently always need a static runtime library for watchOS.
459 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
460 } else if (isTargetTvOSBased()) {
461 // We currently always need a static runtime library for tvOS.
462 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
463 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000464 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
465 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000466 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000467 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000468 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000469 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000470
Daniel Dunbard1076382011-04-18 23:48:36 +0000471 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000472 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000473 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000474 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000475 // The dynamic runtime library was merged with libSystem for 10.6 and
476 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000477 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000478 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000479 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000480 CmdArgs.push_back("-lgcc_s.10.5");
481
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000482 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000483 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000484 // omitted from 10.4.dylib.
485 //
486 // Unfortunately, that turned out to not be true, because Darwin system
487 // headers can still use eprintf on i386, and it is not exported from
488 // libSystem. Therefore, we still must provide a runtime library just for
489 // the tiny tiny handful of projects that *might* use that symbol.
490 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000491 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000492 } else {
493 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000494 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
495 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000496 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000497 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000498}
499
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000500void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000501 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000502
Daniel Dunbar455a0492012-08-17 18:43:50 +0000503 // Support allowing the SDKROOT environment variable used by xcrun and other
504 // Xcode tools to define the default sysroot, by making it the default for
505 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000506 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
507 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000508 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000509 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
510 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000511 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000512 // We only use this value as the default if it is an absolute path,
513 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000514 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000515 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000516 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000517 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000518 }
519 }
520 }
521
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000522 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000523 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000524 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
525 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000526
Tim Northover6f3ff222015-10-30 16:30:27 +0000527 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000528 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000529 << OSXVersion->getAsString(Args)
530 << (iOSVersion ? iOSVersion :
531 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
532 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
533 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
534 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
535 << iOSVersion->getAsString(Args)
536 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
537 TvOSVersion = WatchOSVersion = nullptr;
538 } else if (TvOSVersion && WatchOSVersion) {
539 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
540 << TvOSVersion->getAsString(Args)
541 << WatchOSVersion->getAsString(Args);
542 WatchOSVersion = nullptr;
543 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000544 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000545 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000546 std::string OSXTarget;
547 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000548 std::string TvOSTarget;
549 std::string WatchOSTarget;
550
Chad Rosier64707fe2011-08-31 20:56:25 +0000551 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
552 OSXTarget = env;
553 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
554 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000555 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
556 TvOSTarget = env;
557 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
558 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000559
Steven Wu7a1372c2015-06-25 01:59:35 +0000560 // If there is no command-line argument to specify the Target version and
561 // no environment variable defined, see if we can set the default based
562 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000563 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Frederic Riss3ad83bd2016-01-12 23:47:59 +0000564 TvOSTarget.empty() && Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000565 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000566 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000567 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
568 size_t BeginSDK = isysroot.rfind("SDKs/");
569 size_t EndSDK = isysroot.rfind(".sdk");
570 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
571 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
572 // Slice the version number out.
573 // Version number is between the first and the last number.
574 size_t StartVer = SDK.find_first_of("0123456789");
575 size_t EndVer = SDK.find_last_of("0123456789");
576 if (StartVer != StringRef::npos && EndVer > StartVer) {
577 StringRef Version = SDK.slice(StartVer, EndVer + 1);
578 if (SDK.startswith("iPhoneOS") ||
579 SDK.startswith("iPhoneSimulator"))
580 iOSTarget = Version;
581 else if (SDK.startswith("MacOSX"))
582 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000583 else if (SDK.startswith("WatchOS") ||
584 SDK.startswith("WatchSimulator"))
585 WatchOSTarget = Version;
586 else if (SDK.startswith("AppleTVOS") ||
587 SDK.startswith("AppleTVSimulator"))
588 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000589 }
590 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000591 }
592 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000593
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000594 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000595 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000596 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
597 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000598 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000599 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000600 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000601 MachOArchName == "arm64") {
602 getTriple().getiOSVersion(Major, Minor, Micro);
603 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
604 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000605 } else if (MachOArchName == "armv7k") {
606 getTriple().getWatchOSVersion(Major, Minor, Micro);
607 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
608 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000609 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
610 MachOArchName != "armv7em") {
611 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
612 getDriver().Diag(diag::err_drv_invalid_darwin_version)
613 << getTriple().getOSName();
614 }
615 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
616 << Micro;
617 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000618 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000619
Tim Northover6f3ff222015-10-30 16:30:27 +0000620 // Do not allow conflicts with the watchOS target.
621 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
622 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
623 << "WATCHOS_DEPLOYMENT_TARGET"
624 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
625 "TVOS_DEPLOYMENT_TARGET");
626 }
627
628 // Do not allow conflicts with the tvOS target.
629 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
630 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
631 << "TVOS_DEPLOYMENT_TARGET"
632 << "IPHONEOS_DEPLOYMENT_TARGET";
633 }
634
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000635 // Allow conflicts among OSX and iOS for historical reasons, but choose the
636 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000637 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
638 !WatchOSTarget.empty() ||
639 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000640 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000641 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000642 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000643 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000644 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000645 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000646 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000647
Chad Rosier64707fe2011-08-31 20:56:25 +0000648 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000649 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000650 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000651 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000652 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000653 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000654 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000655 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000656 } else if (!TvOSTarget.empty()) {
657 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
658 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
659 Args.append(TvOSVersion);
660 } else if (!WatchOSTarget.empty()) {
661 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
662 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
663 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000664 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000665 }
Mike Stump11289f42009-09-09 15:08:12 +0000666
Tim Northover9c7e0352013-12-12 11:55:52 +0000667 DarwinPlatformKind Platform;
668 if (OSXVersion)
669 Platform = MacOS;
670 else if (iOSVersion)
671 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000672 else if (TvOSVersion)
673 Platform = TvOS;
674 else if (WatchOSVersion)
675 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000676 else
Tim Northover157d9112014-01-16 08:48:16 +0000677 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000678
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000679 // Set the tool chain target information.
680 unsigned Major, Minor, Micro;
681 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000682 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000683 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
684 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000685 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
686 HadExtra) ||
687 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000688 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000689 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000690 } else if (Platform == IPhoneOS) {
691 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000692 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
693 HadExtra) ||
694 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000695 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000696 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000697 } else if (Platform == TvOS) {
698 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
699 Micro, HadExtra) || HadExtra ||
700 Major >= 10 || Minor >= 100 || Micro >= 100)
701 getDriver().Diag(diag::err_drv_invalid_version_number)
702 << TvOSVersion->getAsString(Args);
703 } else if (Platform == WatchOS) {
704 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
705 Micro, HadExtra) || HadExtra ||
706 Major >= 10 || Minor >= 100 || Micro >= 100)
707 getDriver().Diag(diag::err_drv_invalid_version_number)
708 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000709 } else
710 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000711
Bob Wilson7f294b52014-10-10 23:10:10 +0000712 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000713 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
714 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000715 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000716 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
717 getTriple().getArch() == llvm::Triple::x86_64))
718 Platform = TvOSSimulator;
719 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
720 getTriple().getArch() == llvm::Triple::x86_64))
721 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000722
Tim Northover9c7e0352013-12-12 11:55:52 +0000723 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000724}
725
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000726void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000727 ArgStringList &CmdArgs) const {
728 CXXStdlibType Type = GetCXXStdlibType(Args);
729
730 switch (Type) {
731 case ToolChain::CST_Libcxx:
732 CmdArgs.push_back("-lc++");
733 break;
734
Hans Wennborgdcfba332015-10-06 23:40:43 +0000735 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000736 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
737 // it was previously found in the gcc lib dir. However, for all the Darwin
738 // platforms we care about it was -lstdc++.6, so we search for that
739 // explicitly if we can't see an obvious -lstdc++ candidate.
740
741 // Check in the sysroot first.
742 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000743 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000744 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000745
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000746 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000747 llvm::sys::path::remove_filename(P);
748 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000749 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000750 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000751 return;
752 }
753 }
754 }
755
756 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000757 // FIXME: This should be removed someday when we don't have to care about
758 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000759 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
760 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000761 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
762 return;
763 }
764
765 // Otherwise, let the linker search.
766 CmdArgs.push_back("-lstdc++");
767 break;
768 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000769}
770
Shantonu Senafeb03b2010-09-17 18:39:08 +0000771void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
772 ArgStringList &CmdArgs) const {
Shantonu Senafeb03b2010-09-17 18:39:08 +0000773 // For Darwin platforms, use the compiler-rt-based support library
774 // instead of the gcc-provided one (which is also incidentally
775 // only present in the gcc lib dir, which makes it hard to find).
776
Rafael Espindola358256c2013-06-26 02:13:00 +0000777 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000778 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000779
780 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000781 if (isTargetWatchOS()) {
782 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
783 } else if (isTargetTvOS()) {
784 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
785 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000786 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000787 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000788 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000789 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000790
Shantonu Senafeb03b2010-09-17 18:39:08 +0000791 // For now, allow missing resource libraries to support developers who may
792 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000793 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000794 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000795}
796
Tim Northover157d9112014-01-16 08:48:16 +0000797DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
798 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000799 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
800 const OptTable &Opts = getDriver().getOpts();
801
802 // FIXME: We really want to get out of the tool chain level argument
803 // translation business, as it makes the driver functionality much
804 // more opaque. For now, we follow gcc closely solely for the
805 // purpose of easily achieving feature parity & testability. Once we
806 // have something that works, we should reevaluate each translation
807 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000808
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000809 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000810 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000811 // Skip this argument unless the architecture matches either the toolchain
812 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000813 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000814 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
815 if (!(XarchArch == getArch() ||
816 (BoundArch &&
817 XarchArch ==
818 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000819 continue;
820
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000821 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000822 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000823 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000824 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000825
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000826 // If the argument parsing failed or more than one argument was
827 // consumed, the -Xarch_ argument's parameter tried to consume
828 // extra arguments. Emit an error and ignore.
829 //
830 // We also want to disallow any options which would alter the
831 // driver behavior; that isn't going to work in our model. We
832 // use isDriverOption() as an approximation, although things
833 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000834 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000835 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000836 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000837 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000838 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000839 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000840 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000841 continue;
842 }
843
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000844 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000845
Nico Webera04d5f82014-05-11 17:27:13 +0000846 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000847 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000848
849 // Linker input arguments require custom handling. The problem is that we
850 // have already constructed the phase actions, so we can not treat them as
851 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000852 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000853 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000854 for (const char *Value : A->getValues()) {
855 DAL->AddSeparateArg(
856 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000857 }
858 continue;
859 }
Mike Stump11289f42009-09-09 15:08:12 +0000860 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000861
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000862 // Sob. These is strictly gcc compatible for the time being. Apple
863 // gcc translates options twice, which means that self-expanding
864 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000865 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000866 default:
867 DAL->append(A);
868 break;
869
870 case options::OPT_mkernel:
871 case options::OPT_fapple_kext:
872 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000873 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000874 break;
Mike Stump11289f42009-09-09 15:08:12 +0000875
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000876 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000877 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000878 break;
879
880 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000881 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000882 DAL->AddFlagArg(
883 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000884 break;
885
886 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000887 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000888 DAL->AddFlagArg(
889 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000890 break;
891
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000892 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000893 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000894 break;
895
896 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000897 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000898 break;
899
900 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000901 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000902 break;
903
904 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000905 DAL->AddFlagArg(A,
906 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000907 break;
908
909 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000910 DAL->AddFlagArg(
911 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000912 break;
913
914 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000915 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000916 break;
917
918 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000919 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000920 break;
921 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000922 }
923
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000924 if (getTriple().getArch() == llvm::Triple::x86 ||
925 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000926 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000927 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
928 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000929
930 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000931 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000932 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000933 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000934 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
935 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000936
937 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
938 // which defines the list of which architectures we accept.
939 if (Name == "ppc")
940 ;
941 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000942 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000943 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000944 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000945 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000946 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000947 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000948 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000949 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000950 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000951 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000952 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000953 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000954 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000955 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000956 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000957
Bill Schmidt778d3872013-07-26 01:36:11 +0000958 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000959 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000960
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000961 else if (Name == "i386")
962 ;
963 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000964 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000965 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000966 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000967 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000968 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000969 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000970 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000971 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000972 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000973 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000974 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000975 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000976 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000977
978 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000979 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000980 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000981 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
982 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000983 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000984
985 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000986 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000987 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000988 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000989 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000990 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000991 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000992 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000993 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000994 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000995 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000996 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000997 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000998 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000999 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +00001000 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001001 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +00001002 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +00001003 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +00001004 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001005 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +00001006 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001007 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +00001008
Tim Northover157d9112014-01-16 08:48:16 +00001009 return DAL;
1010}
1011
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001012void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
1013 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001014 // Embedded targets are simple at the moment, not supporting sanitizers and
1015 // with different libraries for each member of the product { static, PIC } x
1016 // { hard-float, soft-float }
1017 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001018 CompilerRT +=
1019 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
1020 ? "hard"
1021 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +00001022 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
1023
1024 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
1025}
1026
Tim Northover157d9112014-01-16 08:48:16 +00001027DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
1028 const char *BoundArch) const {
1029 // First get the generic Apple args, before moving onto Darwin-specific ones.
1030 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
Tim Northoverb534ce42016-02-12 22:30:42 +00001031 const OptTable &Opts = getDriver().getOpts();
Tim Northover157d9112014-01-16 08:48:16 +00001032
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001033 // If no architecture is bound, none of the translations here are relevant.
1034 if (!BoundArch)
1035 return DAL;
1036
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001037 // Add an explicit version min argument for the deployment target. We do this
1038 // after argument translation because -Xarch_ arguments may add a version min
1039 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001040 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001041
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001042 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
1043 // FIXME: It would be far better to avoid inserting those -static arguments,
1044 // but we can't check the deployment target in the translation code until
1045 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +00001046 if (isTargetWatchOSBased() ||
1047 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1048 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001049 Arg *A = *it;
1050 ++it;
1051 if (A->getOption().getID() != options::OPT_mkernel &&
1052 A->getOption().getID() != options::OPT_fapple_kext)
1053 continue;
1054 assert(it != ie && "unexpected argument translation");
1055 A = *it;
1056 assert(A->getOption().getID() == options::OPT_static &&
1057 "missing expected -static argument");
1058 it = DAL->getArgs().erase(it);
1059 }
1060 }
1061
Tim Northoverb534ce42016-02-12 22:30:42 +00001062 if (!Args.getLastArg(options::OPT_stdlib_EQ) &&
Tim Northover3a098c12016-02-15 16:38:10 +00001063 GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
Tim Northoverb534ce42016-02-12 22:30:42 +00001064 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1065 "libc++");
1066
Bob Wilson102be442011-10-07 17:54:41 +00001067 // Validate the C++ standard library choice.
1068 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1069 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001070 // Check whether the target provides libc++.
1071 StringRef where;
1072
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001073 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001074 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001075 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001076
1077 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001078 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001079 }
1080 }
1081
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001082 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001083}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001084
Tim Northover157d9112014-01-16 08:48:16 +00001085bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001086 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001087}
1088
Tim Northover157d9112014-01-16 08:48:16 +00001089bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001090 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1091 return S[0] != '\0';
1092 return false;
1093}
1094
Tim Northovere931f9f2015-10-30 16:30:41 +00001095bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001096 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001097 if (getTriple().getArch() != llvm::Triple::arm &&
1098 getTriple().getArch() != llvm::Triple::thumb)
1099 return false;
1100
Tim Northoverc741b042015-11-17 18:27:27 +00001101 // Only watchOS uses the new DWARF/Compact unwinding method.
Tim Northoverd88ecb32016-01-27 19:32:40 +00001102 llvm::Triple Triple(ComputeLLVMTriple(Args));
Tim Northover4c9ac7d2016-01-27 22:14:02 +00001103 return !Triple.isWatchABI();
Daniel Dunbar3241d402010-02-10 18:49:11 +00001104}
1105
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001106bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001107
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001108bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001109
Tim Northover157d9112014-01-16 08:48:16 +00001110bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001111 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001112 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001113}
1114
Tim Northover157d9112014-01-16 08:48:16 +00001115bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001116 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001117 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001118}
1119
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001120void Darwin::addMinVersionArgs(const ArgList &Args,
1121 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001122 VersionTuple TargetVersion = getTargetVersion();
1123
Tim Northover6f3ff222015-10-30 16:30:27 +00001124 if (isTargetWatchOS())
1125 CmdArgs.push_back("-watchos_version_min");
1126 else if (isTargetWatchOSSimulator())
1127 CmdArgs.push_back("-watchos_simulator_version_min");
1128 else if (isTargetTvOS())
1129 CmdArgs.push_back("-tvos_version_min");
1130 else if (isTargetTvOSSimulator())
1131 CmdArgs.push_back("-tvos_simulator_version_min");
1132 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001133 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001134 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001135 CmdArgs.push_back("-iphoneos_version_min");
1136 else {
1137 assert(isTargetMacOS() && "unexpected target");
1138 CmdArgs.push_back("-macosx_version_min");
1139 }
1140
1141 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1142}
1143
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001144void Darwin::addStartObjectFileArgs(const ArgList &Args,
1145 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001146 // Derived from startfile spec.
1147 if (Args.hasArg(options::OPT_dynamiclib)) {
1148 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001149 if (isTargetWatchOSBased()) {
1150 ; // watchOS does not need dylib1.o.
1151 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001152 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001153 } else if (isTargetIPhoneOS()) {
1154 if (isIPhoneOSVersionLT(3, 1))
1155 CmdArgs.push_back("-ldylib1.o");
1156 } else {
1157 if (isMacosxVersionLT(10, 5))
1158 CmdArgs.push_back("-ldylib1.o");
1159 else if (isMacosxVersionLT(10, 6))
1160 CmdArgs.push_back("-ldylib1.10.5.o");
1161 }
1162 } else {
1163 if (Args.hasArg(options::OPT_bundle)) {
1164 if (!Args.hasArg(options::OPT_static)) {
1165 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001166 if (isTargetWatchOSBased()) {
1167 ; // watchOS does not need bundle1.o.
1168 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001169 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001170 } else if (isTargetIPhoneOS()) {
1171 if (isIPhoneOSVersionLT(3, 1))
1172 CmdArgs.push_back("-lbundle1.o");
1173 } else {
1174 if (isMacosxVersionLT(10, 6))
1175 CmdArgs.push_back("-lbundle1.o");
1176 }
1177 }
1178 } else {
1179 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1180 if (Args.hasArg(options::OPT_static) ||
1181 Args.hasArg(options::OPT_object) ||
1182 Args.hasArg(options::OPT_preload)) {
1183 CmdArgs.push_back("-lgcrt0.o");
1184 } else {
1185 CmdArgs.push_back("-lgcrt1.o");
1186
1187 // darwin_crt2 spec is empty.
1188 }
1189 // By default on OS X 10.8 and later, we don't link with a crt1.o
1190 // file and the linker knows to use _main as the entry point. But,
1191 // when compiling with -pg, we need to link with the gcrt1.o file,
1192 // so pass the -no_new_main option to tell the linker to use the
1193 // "start" symbol as the entry point.
1194 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1195 CmdArgs.push_back("-no_new_main");
1196 } else {
1197 if (Args.hasArg(options::OPT_static) ||
1198 Args.hasArg(options::OPT_object) ||
1199 Args.hasArg(options::OPT_preload)) {
1200 CmdArgs.push_back("-lcrt0.o");
1201 } else {
1202 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001203 if (isTargetWatchOSBased()) {
1204 ; // watchOS does not need crt1.o.
1205 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001206 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001207 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001208 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001209 ; // iOS does not need any crt1 files for arm64
1210 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001211 CmdArgs.push_back("-lcrt1.o");
1212 else if (isIPhoneOSVersionLT(6, 0))
1213 CmdArgs.push_back("-lcrt1.3.1.o");
1214 } else {
1215 if (isMacosxVersionLT(10, 5))
1216 CmdArgs.push_back("-lcrt1.o");
1217 else if (isMacosxVersionLT(10, 6))
1218 CmdArgs.push_back("-lcrt1.10.5.o");
1219 else if (isMacosxVersionLT(10, 8))
1220 CmdArgs.push_back("-lcrt1.10.6.o");
1221
1222 // darwin_crt2 spec is empty.
1223 }
1224 }
1225 }
1226 }
1227 }
1228
1229 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001230 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001231 isMacosxVersionLT(10, 5)) {
1232 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1233 CmdArgs.push_back(Str);
1234 }
1235}
1236
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001237bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001238
John McCall3deb1ad2012-08-21 02:47:43 +00001239void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001240 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1241 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001242 return;
John McCall93207072012-08-27 01:56:21 +00001243 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001244}
1245
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001246SanitizerMask Darwin::getSupportedSanitizers() const {
1247 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Anna Zakse67b4022016-02-02 02:04:48 +00001248 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001249 if (isTargetMacOS()) {
1250 if (!isMacosxVersionLT(10, 9))
1251 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001252 Res |= SanitizerKind::SafeStack;
Kuba Brecka85e01c02015-11-06 15:09:20 +00001253 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001254 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001255 return Res;
1256}
1257
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001258/// Generic_GCC - A tool chain using the 'gcc' command to perform
1259/// all subcommands; this relies on gcc translating the majority of
1260/// command line options.
1261
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001262/// \brief Parse a GCCVersion object out of a string of text.
1263///
1264/// This is the primary means of forming GCCVersion objects.
1265/*static*/
1266Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001267 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001268 std::pair<StringRef, StringRef> First = VersionText.split('.');
1269 std::pair<StringRef, StringRef> Second = First.second.split('.');
1270
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001271 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1272 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001273 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001274 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001275 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001276 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001277 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001278
1279 // First look for a number prefix and parse that if present. Otherwise just
1280 // stash the entire patch string in the suffix, and leave the number
1281 // unspecified. This covers versions strings such as:
1282 // 4.4
1283 // 4.4.0
1284 // 4.4.x
1285 // 4.4.2-rc4
1286 // 4.4.x-patched
1287 // And retains any patch number it finds.
1288 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1289 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001290 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001291 // Try to parse the number and any suffix.
1292 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1293 GoodVersion.Patch < 0)
1294 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001295 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001296 }
1297 }
1298
1299 return GoodVersion;
1300}
1301
1302/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001303bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1304 int RHSPatch,
1305 StringRef RHSPatchSuffix) const {
1306 if (Major != RHSMajor)
1307 return Major < RHSMajor;
1308 if (Minor != RHSMinor)
1309 return Minor < RHSMinor;
1310 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001311 // Note that versions without a specified patch sort higher than those with
1312 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001313 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001314 return true;
1315 if (Patch == -1)
1316 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001317
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001318 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001319 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001320 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001321 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001322 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001323 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001324 return true;
1325 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001326 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001327
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001328 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001329 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001330 }
1331
1332 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001333 return false;
1334}
1335
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001336static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001337 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1338 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001339 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001340 return GCC_INSTALL_PREFIX;
1341}
1342
Roman Divacky326d9982013-12-06 18:32:18 +00001343/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001344///
1345/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001346/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001347///
1348/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1349/// should instead pull the target out of the driver. This is currently
1350/// necessary because the driver doesn't store the final version of the target
1351/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001352void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001353 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001354 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001355 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1356 ? TargetTriple.get64BitArchVariant()
1357 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001358 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001359 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001360 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001361 SmallVector<StringRef, 16> CandidateTripleAliases;
1362 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001363 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1364 CandidateTripleAliases, CandidateBiarchLibDirs,
1365 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001366
1367 // Compute the set of prefixes for our search.
1368 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1369 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001370
Rafael Espindola1af7c212012-02-19 01:38:32 +00001371 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1372 if (GCCToolchainDir != "") {
1373 if (GCCToolchainDir.back() == '/')
1374 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001375
Rafael Espindola1af7c212012-02-19 01:38:32 +00001376 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001377 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001378 // If we have a SysRoot, try that first.
1379 if (!D.SysRoot.empty()) {
1380 Prefixes.push_back(D.SysRoot);
1381 Prefixes.push_back(D.SysRoot + "/usr");
1382 }
1383
1384 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001385 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001386
1387 // And finally in /usr.
1388 if (D.SysRoot.empty())
1389 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001390 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001391
1392 // Loop over the various components which exist and select the best GCC
1393 // installation available. GCC installs are ranked by version number.
1394 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001395 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001396 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001397 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001398 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001399 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001400 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001401 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001402 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001403 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001404 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001405 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001406 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001407 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001408 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001409 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001410 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001411 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001412 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001413 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001414 }
1415 }
1416}
1417
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001418void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001419 for (const auto &InstallPath : CandidateGCCInstallPaths)
1420 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001421
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001422 if (!GCCInstallPath.empty())
1423 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1424
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001425 for (const auto &Multilib : Multilibs)
1426 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001427
1428 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1429 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001430}
1431
1432bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1433 if (BiarchSibling.hasValue()) {
1434 M = BiarchSibling.getValue();
1435 return true;
1436 }
1437 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001438}
1439
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001440/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001441 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001442 SmallVectorImpl<StringRef> &LibDirs,
1443 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001444 SmallVectorImpl<StringRef> &BiarchLibDirs,
1445 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001446 // Declare a bunch of static data sets that we'll select between below. These
1447 // are specifically designed to always refer to string literals to avoid any
1448 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001449 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1450 static const char *const AArch64Triples[] = {
1451 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1452 "aarch64-redhat-linux"};
1453 static const char *const AArch64beLibDirs[] = {"/lib"};
1454 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1455 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001456
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001457 static const char *const ARMLibDirs[] = {"/lib"};
1458 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1459 "arm-linux-androideabi"};
1460 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1461 "armv7hl-redhat-linux-gnueabi"};
1462 static const char *const ARMebLibDirs[] = {"/lib"};
1463 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1464 "armeb-linux-androideabi"};
1465 static const char *const ARMebHFTriples[] = {
1466 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001467
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001468 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001469 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001470 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1471 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1472 "x86_64-redhat-linux", "x86_64-suse-linux",
1473 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1474 "x86_64-slackware-linux", "x86_64-linux-android",
1475 "x86_64-unknown-linux"};
1476 static const char *const X32LibDirs[] = {"/libx32"};
1477 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001478 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001479 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1480 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1481 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1482 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1483 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001484
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001485 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001486 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1487 "mips-mti-linux-gnu",
1488 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001489 static const char *const MIPSELLibDirs[] = {"/lib"};
1490 static const char *const MIPSELTriples[] = {
1491 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001492
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001493 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1494 static const char *const MIPS64Triples[] = {
1495 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1496 "mips64-linux-gnuabi64"};
1497 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1498 static const char *const MIPS64ELTriples[] = {
1499 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1500 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001501
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001502 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001503 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001504 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1505 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1506 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1507 static const char *const PPC64Triples[] = {
1508 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1509 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1510 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1511 static const char *const PPC64LETriples[] = {
1512 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1513 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001514
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001515 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1516 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1517 "sparcv8-linux-gnu"};
1518 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1519 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1520 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001521
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001522 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001523 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001524 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1525 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001526
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001527 // Solaris.
1528 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1529 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1530 "i386-pc-solaris2.11"};
1531
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001532 using std::begin;
1533 using std::end;
1534
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001535 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1536 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1537 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001538 return;
1539 }
1540
Chandler Carruth866faab2012-01-25 07:21:38 +00001541 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001542 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001543 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1544 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1545 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1546 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001547 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001548 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001549 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1550 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1551 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1552 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001553 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001554 case llvm::Triple::arm:
1555 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001556 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001557 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001558 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001559 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001560 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001561 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001562 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001563 case llvm::Triple::armeb:
1564 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001565 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001566 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001567 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001568 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001569 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001570 }
1571 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001572 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001573 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1574 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1575 // x32 is always available when x86_64 is available, so adding it as
1576 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001577 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001578 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1579 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001580 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001581 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1582 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001583 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001584 break;
1585 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001586 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1587 TripleAliases.append(begin(X86Triples), end(X86Triples));
1588 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1589 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001590 break;
1591 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001592 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1593 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1594 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1595 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001596 break;
1597 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001598 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1599 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1600 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1601 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1602 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001603 break;
1604 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001605 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1606 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1607 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1608 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001609 break;
1610 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001611 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1612 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1613 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1614 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1615 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001616 break;
1617 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001618 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1619 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1620 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1621 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001622 break;
1623 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001624 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1625 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1626 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1627 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001628 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001629 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001630 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1631 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001632 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001633 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001634 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001635 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1636 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1637 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1638 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001639 break;
1640 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001641 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1642 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1643 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1644 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001645 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001646 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001647 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1648 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001649 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001650 default:
1651 // By default, just rely on the standard lib directories and the original
1652 // triple.
1653 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001654 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001655
1656 // Always append the drivers target triple to the end, in case it doesn't
1657 // match any of our aliases.
1658 TripleAliases.push_back(TargetTriple.str());
1659
1660 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001661 if (TargetTriple.str() != BiarchTriple.str())
1662 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001663}
1664
Artem Belevich98607b62015-09-23 21:49:39 +00001665// \brief -- try common CUDA installation paths looking for files we need for
1666// CUDA compilation.
1667
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001668void Generic_GCC::CudaInstallationDetector::init(
1669 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001670 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001671
1672 if (Args.hasArg(options::OPT_cuda_path_EQ))
1673 CudaPathCandidates.push_back(
1674 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1675 else {
1676 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
Artem Belevich86017332015-11-17 22:28:55 +00001677 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001678 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1679 }
1680
Benjamin Kramere8b76412015-09-24 14:48:37 +00001681 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001682 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001683 continue;
1684
1685 CudaInstallPath = CudaPath;
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001686 CudaBinPath = CudaPath + "/bin";
Artem Belevich98607b62015-09-23 21:49:39 +00001687 CudaIncludePath = CudaInstallPath + "/include";
1688 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1689 CudaLibPath =
1690 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1691
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001692 if (!(D.getVFS().exists(CudaIncludePath) &&
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001693 D.getVFS().exists(CudaBinPath) && D.getVFS().exists(CudaLibPath) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001694 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001695 continue;
1696
Artem Belevich34f481a2015-11-17 22:28:50 +00001697 std::error_code EC;
1698 for (llvm::sys::fs::directory_iterator LI(CudaLibDevicePath, EC), LE;
1699 !EC && LI != LE; LI = LI.increment(EC)) {
1700 StringRef FilePath = LI->path();
1701 StringRef FileName = llvm::sys::path::filename(FilePath);
1702 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1703 const StringRef LibDeviceName = "libdevice.";
1704 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1705 continue;
1706 StringRef GpuArch = FileName.slice(
1707 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
1708 CudaLibDeviceMap[GpuArch] = FilePath.str();
1709 // Insert map entries for specifc devices with this compute capability.
1710 if (GpuArch == "compute_20") {
1711 CudaLibDeviceMap["sm_20"] = FilePath;
1712 CudaLibDeviceMap["sm_21"] = FilePath;
1713 } else if (GpuArch == "compute_30") {
1714 CudaLibDeviceMap["sm_30"] = FilePath;
1715 CudaLibDeviceMap["sm_32"] = FilePath;
1716 } else if (GpuArch == "compute_35") {
1717 CudaLibDeviceMap["sm_35"] = FilePath;
1718 CudaLibDeviceMap["sm_37"] = FilePath;
1719 }
1720 }
1721
Artem Belevich98607b62015-09-23 21:49:39 +00001722 IsValid = true;
1723 break;
1724 }
1725}
1726
1727void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1728 if (isValid())
1729 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1730}
1731
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001732namespace {
1733// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001734class FilterNonExistent {
1735 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001736 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001737
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001738public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001739 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1740 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001741 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001742 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001743 }
1744};
1745} // end anonymous namespace
1746
1747static void addMultilibFlag(bool Enabled, const char *const Flag,
1748 std::vector<std::string> &Flags) {
1749 if (Enabled)
1750 Flags.push_back(std::string("+") + Flag);
1751 else
1752 Flags.push_back(std::string("-") + Flag);
1753}
1754
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001755static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001756 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1757 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1758}
1759
1760static bool isMips32(llvm::Triple::ArchType Arch) {
1761 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1762}
1763
1764static bool isMips64(llvm::Triple::ArchType Arch) {
1765 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1766}
1767
1768static bool isMipsEL(llvm::Triple::ArchType Arch) {
1769 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1770}
1771
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001772static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001773 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001774 return A && A->getOption().matches(options::OPT_mips16);
1775}
1776
1777static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001778 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001779 return A && A->getOption().matches(options::OPT_mmicromips);
1780}
1781
Benjamin Kramere003ca22015-10-28 13:54:16 +00001782namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001783struct DetectedMultilibs {
1784 /// The set of multilibs that the detected installation supports.
1785 MultilibSet Multilibs;
1786
1787 /// The primary multilib appropriate for the given flags.
1788 Multilib SelectedMultilib;
1789
1790 /// On Biarch systems, this corresponds to the default multilib when
1791 /// targeting the non-default multilib. Otherwise, it is empty.
1792 llvm::Optional<Multilib> BiarchSibling;
1793};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001794} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001795
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001796static Multilib makeMultilib(StringRef commonSuffix) {
1797 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1798}
1799
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001800static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1801 StringRef Path, const ArgList &Args,
1802 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001803 // Some MIPS toolchains put libraries and object files compiled
1804 // using different options in to the sub-directoris which names
1805 // reflects the flags used for compilation. For example sysroot
1806 // directory might looks like the following examples:
1807 //
1808 // /usr
1809 // /lib <= crt*.o files compiled with '-mips32'
1810 // /mips16
1811 // /usr
1812 // /lib <= crt*.o files compiled with '-mips16'
1813 // /el
1814 // /usr
1815 // /lib <= crt*.o files compiled with '-mips16 -EL'
1816 //
1817 // or
1818 //
1819 // /usr
1820 // /lib <= crt*.o files compiled with '-mips32r2'
1821 // /mips16
1822 // /usr
1823 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1824 // /mips32
1825 // /usr
1826 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001827
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001828 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001829
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001830 // Check for FSF toolchain multilibs
1831 MultilibSet FSFMipsMultilibs;
1832 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001833 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001834 .flag("+m32")
1835 .flag("-m64")
1836 .flag("-mmicromips")
1837 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001838
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001839 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001840 .flag("+m32")
1841 .flag("-m64")
1842 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001843
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001844 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001845 .flag("-m32")
1846 .flag("+m64")
1847 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001848
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001849 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1850 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001851
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001852 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001853 .flag("+m32")
1854 .flag("-m64")
1855 .flag("-mmicromips")
1856 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001857
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001858 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001859
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001860 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001861
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001862 auto MAbi64 =
1863 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001864
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001865 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001866
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001867 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001868
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001869 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001870
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001871 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001872
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001873 FSFMipsMultilibs =
1874 MultilibSet()
1875 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1876 MArchDefault)
1877 .Maybe(UCLibc)
1878 .Maybe(Mips16)
1879 .FilterOut("/mips64/mips16")
1880 .FilterOut("/mips64r2/mips16")
1881 .FilterOut("/micromips/mips16")
1882 .Maybe(MAbi64)
1883 .FilterOut("/micromips/64")
1884 .FilterOut("/mips32/64")
1885 .FilterOut("^/64")
1886 .FilterOut("/mips16/64")
1887 .Either(BigEndian, LittleEndian)
1888 .Maybe(SoftFloat)
1889 .Maybe(Nan2008)
1890 .FilterOut(".*sof/nan2008")
1891 .FilterOut(NonExistent)
1892 .setIncludeDirsCallback([](StringRef InstallDir,
1893 StringRef TripleStr, const Multilib &M) {
1894 std::vector<std::string> Dirs;
1895 Dirs.push_back((InstallDir + "/include").str());
1896 std::string SysRootInc =
1897 InstallDir.str() + "/../../../../sysroot";
1898 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1899 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1900 else
1901 Dirs.push_back(SysRootInc + "/usr/include");
1902 return Dirs;
1903 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001904 }
1905
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001906 // Check for Musl toolchain multilibs
1907 MultilibSet MuslMipsMultilibs;
1908 {
1909 auto MArchMipsR2 = makeMultilib("")
1910 .osSuffix("/mips-r2-hard-musl")
1911 .flag("+EB")
1912 .flag("-EL")
1913 .flag("+march=mips32r2");
1914
1915 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1916 .flag("-EB")
1917 .flag("+EL")
1918 .flag("+march=mips32r2");
1919
1920 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1921
1922 // Specify the callback that computes the include directories.
1923 MuslMipsMultilibs.setIncludeDirsCallback([](
1924 StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1925 std::vector<std::string> Dirs;
1926 Dirs.push_back(
1927 (InstallDir + "/../sysroot" + M.osSuffix() + "/usr/include").str());
1928 return Dirs;
1929 });
1930 }
1931
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001932 // Check for Code Sourcery toolchain multilibs
1933 MultilibSet CSMipsMultilibs;
1934 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001935 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001936
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001937 auto MArchMicroMips =
1938 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001939
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001940 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001941
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001942 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001943
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001944 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001945
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001946 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001947
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001948 auto DefaultFloat =
1949 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001950
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001951 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001952
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001953 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001954
1955 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001956 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001957 .gccSuffix("/64")
1958 .includeSuffix("/64")
1959 .flag("+mabi=n64")
1960 .flag("-mabi=n32")
1961 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001962
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001963 CSMipsMultilibs =
1964 MultilibSet()
1965 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1966 .Maybe(UCLibc)
1967 .Either(SoftFloat, Nan2008, DefaultFloat)
1968 .FilterOut("/micromips/nan2008")
1969 .FilterOut("/mips16/nan2008")
1970 .Either(BigEndian, LittleEndian)
1971 .Maybe(MAbi64)
1972 .FilterOut("/mips16.*/64")
1973 .FilterOut("/micromips.*/64")
1974 .FilterOut(NonExistent)
1975 .setIncludeDirsCallback([](StringRef InstallDir,
1976 StringRef TripleStr, const Multilib &M) {
1977 std::vector<std::string> Dirs;
1978 Dirs.push_back((InstallDir + "/include").str());
1979 std::string SysRootInc =
1980 InstallDir.str() + "/../../../../" + TripleStr.str();
1981 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1982 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1983 else
1984 Dirs.push_back(SysRootInc + "/libc/usr/include");
1985 return Dirs;
1986 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001987 }
1988
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001989 MultilibSet AndroidMipsMultilibs =
1990 MultilibSet()
1991 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1992 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1993 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001994
1995 MultilibSet DebianMipsMultilibs;
1996 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001997 Multilib MAbiN32 =
1998 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001999
2000 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002001 .gccSuffix("/64")
2002 .includeSuffix("/64")
2003 .flag("+m64")
2004 .flag("-m32")
2005 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002006
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002007 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002008
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002009 DebianMipsMultilibs =
2010 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002011 }
2012
Daniel Sanders2bf13662014-07-10 14:40:57 +00002013 MultilibSet ImgMultilibs;
2014 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002015 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002016
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002017 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002018
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002019 auto MAbi64 =
2020 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002021
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002022 ImgMultilibs =
2023 MultilibSet()
2024 .Maybe(Mips64r6)
2025 .Maybe(MAbi64)
2026 .Maybe(LittleEndian)
2027 .FilterOut(NonExistent)
2028 .setIncludeDirsCallback([](StringRef InstallDir,
2029 StringRef TripleStr, const Multilib &M) {
2030 std::vector<std::string> Dirs;
2031 Dirs.push_back((InstallDir + "/include").str());
2032 Dirs.push_back(
2033 (InstallDir + "/../../../../sysroot/usr/include").str());
2034 return Dirs;
2035 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002036 }
2037
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002038 StringRef CPUName;
2039 StringRef ABIName;
2040 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2041
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002042 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2043
2044 Multilib::flags_list Flags;
2045 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2046 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2047 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002048 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002049 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002050 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002051 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002052 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002053 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002054 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2055 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002056 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002057 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002058 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002059 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2060 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002061 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2062 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002063 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002064 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002065 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002066 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002067
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002068 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002069 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00002070 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2071 Result.Multilibs = AndroidMipsMultilibs;
2072 return true;
2073 }
2074 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002075 }
2076
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002077 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2078 TargetTriple.getOS() == llvm::Triple::Linux &&
2079 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2080 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2081 Result.Multilibs = MuslMipsMultilibs;
2082 return true;
2083 }
2084 return false;
2085 }
2086
Daniel Sanders2bf13662014-07-10 14:40:57 +00002087 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2088 TargetTriple.getOS() == llvm::Triple::Linux &&
2089 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2090 // Select mips-img-linux-gnu toolchain.
2091 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
2092 Result.Multilibs = ImgMultilibs;
2093 return true;
2094 }
2095 return false;
2096 }
2097
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002098 // Sort candidates. Toolchain that best meets the directories goes first.
2099 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002100 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
2101 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002102 std::sort(
2103 std::begin(candidates), std::end(candidates),
2104 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2105 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002106 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002107 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002108 Result.BiarchSibling = Multilib();
2109 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002110 return true;
2111 }
2112 }
2113
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002114 {
2115 // Fallback to the regular toolchain-tree structure.
2116 Multilib Default;
2117 Result.Multilibs.push_back(Default);
2118 Result.Multilibs.FilterOut(NonExistent);
2119
2120 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2121 Result.BiarchSibling = Multilib();
2122 return true;
2123 }
2124 }
2125
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002126 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002127}
2128
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002129static bool findBiarchMultilibs(const Driver &D,
2130 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002131 StringRef Path, const ArgList &Args,
2132 bool NeedsBiarchSuffix,
2133 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002134 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2135 // in what would normally be GCCInstallPath and put the 64-bit
2136 // libs in a subdirectory named 64. The simple logic we follow is that
2137 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2138 // we use that. If not, and if not a biarch triple alias, we look for
2139 // crtbegin.o without the subdirectory.
2140
2141 Multilib Default;
2142 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002143 .gccSuffix("/64")
2144 .includeSuffix("/64")
2145 .flag("-m32")
2146 .flag("+m64")
2147 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002148 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002149 .gccSuffix("/32")
2150 .includeSuffix("/32")
2151 .flag("+m32")
2152 .flag("-m64")
2153 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002154 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002155 .gccSuffix("/x32")
2156 .includeSuffix("/x32")
2157 .flag("-m32")
2158 .flag("-m64")
2159 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002160
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002161 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002162
Zinovy Nis1db95732014-07-10 15:27:19 +00002163 // Determine default multilib from: 32, 64, x32
2164 // Also handle cases such as 64 on 32, 32 on 64, etc.
2165 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002166 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002167 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002168 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002169 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002170 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002171 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002172 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002173 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002174 if (TargetTriple.isArch32Bit())
2175 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002176 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002177 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002178 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002179 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002180 }
2181
Zinovy Nis1db95732014-07-10 15:27:19 +00002182 if (Want == WANT32)
2183 Default.flag("+m32").flag("-m64").flag("-mx32");
2184 else if (Want == WANT64)
2185 Default.flag("-m32").flag("+m64").flag("-mx32");
2186 else if (Want == WANTX32)
2187 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002188 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002189 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002190
Simon Atanasyan60280b42014-05-12 07:37:51 +00002191 Result.Multilibs.push_back(Default);
2192 Result.Multilibs.push_back(Alt64);
2193 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002194 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002195
Simon Atanasyan60280b42014-05-12 07:37:51 +00002196 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002197
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002198 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002199 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002200 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002201 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002202
Simon Atanasyan60280b42014-05-12 07:37:51 +00002203 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002204 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002205
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002206 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002207 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002208 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002209
2210 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002211}
2212
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002213void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2214 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2215 const std::string &LibDir, StringRef CandidateTriple,
2216 bool NeedsBiarchSuffix) {
2217 // Solaris is a special case. The GCC installation is under
2218 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2219 // need to iterate twice.
2220 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002221 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2222 !EC && LI != LE; LI = LI.increment(EC)) {
2223 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002224 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2225
2226 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002227 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002228 continue; // Saw this path before; no need to look at it again.
2229 if (CandidateVersion.isOlderThan(4, 1, 1))
2230 continue;
2231 if (CandidateVersion <= Version)
2232 continue;
2233
2234 GCCInstallPath =
2235 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002236 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002237 continue;
2238
2239 // If we make it here there has to be at least one GCC version, let's just
2240 // use the latest one.
2241 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002242 for (vfs::directory_iterator
2243 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2244 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002245 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2246
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002247 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002248 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2249
2250 if (CandidateSubVersion > Version)
2251 Version = CandidateSubVersion;
2252 }
2253
2254 GCCTriple.setTriple(CandidateTriple);
2255
2256 GCCInstallPath += "/" + Version.Text;
2257 GCCParentLibPath = GCCInstallPath + "/../../../../";
2258
2259 IsValid = true;
2260 }
2261}
2262
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002263void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002264 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002265 const std::string &LibDir, StringRef CandidateTriple,
2266 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002267 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002268 // There are various different suffixes involving the triple we
2269 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002270 // up to the lib directory. Specifically, the number of "up" steps
2271 // in the second half of each row is 1 + the number of path separators
2272 // in the first half.
2273 const std::string LibAndInstallSuffixes[][2] = {
2274 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2275
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002276 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002277 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2278
2279 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2280 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002281
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002282 // The Freescale PPC SDK has the gcc libraries in
2283 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002284 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002285
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002286 // Ubuntu has a strange mis-matched pair of triples that this happens to
2287 // match.
2288 // FIXME: It may be worthwhile to generalize this and look for a second
2289 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002290 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2291
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002292 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2293 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2294 NeedsBiarchSuffix);
2295 return;
2296 }
2297
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002298 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002299 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2300 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002301 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002302 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002303 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002304 for (vfs::directory_iterator
2305 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2306 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002307 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002308 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002309 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002310 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002311 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002312 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002313 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002314 continue;
2315 if (CandidateVersion <= Version)
2316 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002317
Simon Atanasyan60280b42014-05-12 07:37:51 +00002318 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002319
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002320 // Debian mips multilibs behave more like the rest of the biarch ones,
2321 // so handle them there
2322 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002323 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002324 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002325 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002326 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002327 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002328 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002329
Simon Atanasyan60280b42014-05-12 07:37:51 +00002330 Multilibs = Detected.Multilibs;
2331 SelectedMultilib = Detected.SelectedMultilib;
2332 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002333 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002334 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002335 // FIXME: We hack together the directory name here instead of
2336 // using LI to ensure stable path separators across Windows and
2337 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002338 GCCInstallPath =
2339 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2340 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002341 IsValid = true;
2342 }
2343 }
2344}
2345
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002346Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002347 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002348 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002349 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002350 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002351 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002352}
2353
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002354Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002355
Rafael Espindola7cf32212013-03-20 03:05:54 +00002356Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002357 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002358 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002359 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002360 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002361 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002362 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002363 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002364 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002365 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002366 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002367 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002368 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002369}
2370
Rafael Espindola7cf32212013-03-20 03:05:54 +00002371Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002372 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002373}
2374
Douglas Katzman95354292015-06-23 20:42:09 +00002375Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002376
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002377void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2378 // Print the information about how we detected the GCC installation.
2379 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002380 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002381}
2382
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002383bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002384 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002385}
2386
David Majnemer17f448b2015-06-28 04:23:33 +00002387bool Generic_GCC::isPICDefault() const {
2388 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2389}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002390
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002391bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002392
David Majnemer17f448b2015-06-28 04:23:33 +00002393bool Generic_GCC::isPICDefaultForced() const {
2394 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2395}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002396
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002397bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002398 switch (getTriple().getArch()) {
2399 case llvm::Triple::x86:
2400 case llvm::Triple::x86_64:
2401 case llvm::Triple::aarch64:
2402 case llvm::Triple::aarch64_be:
2403 case llvm::Triple::arm:
2404 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002405 case llvm::Triple::bpfel:
2406 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002407 case llvm::Triple::thumb:
2408 case llvm::Triple::thumbeb:
2409 case llvm::Triple::ppc:
2410 case llvm::Triple::ppc64:
2411 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002412 case llvm::Triple::systemz:
2413 return true;
2414 default:
2415 return false;
2416 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002417}
2418
James Y Knighta6c9ee72015-10-16 18:46:26 +00002419/// \brief Helper to add the variant paths of a libstdc++ installation.
2420bool Generic_GCC::addLibStdCXXIncludePaths(
2421 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2422 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2423 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2424 if (!getVFS().exists(Base + Suffix))
2425 return false;
2426
2427 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2428
2429 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2430 // that path exists or we have neither a GCC nor target multiarch triple, use
2431 // this vanilla search path.
2432 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2433 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2434 addSystemInclude(DriverArgs, CC1Args,
2435 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2436 } else {
2437 // Otherwise try to use multiarch naming schemes which have normalized the
2438 // triples and put the triple before the suffix.
2439 //
2440 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2441 // the target triple, so we support that here.
2442 addSystemInclude(DriverArgs, CC1Args,
2443 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2444 addSystemInclude(DriverArgs, CC1Args,
2445 Base + "/" + TargetMultiarchTriple + Suffix);
2446 }
2447
2448 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2449 return true;
2450}
2451
Kristof Beylsfb387292014-01-10 13:44:34 +00002452void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2453 ArgStringList &CC1Args) const {
2454 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002455 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002456 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002457 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002458 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002459 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002460 getTriple().getOS() == llvm::Triple::NaCl ||
2461 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2462 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002463
2464 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002465 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002466 CC1Args.push_back("-fuse-init-array");
2467}
2468
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002469/// Mips Toolchain
2470MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2471 const llvm::Triple &Triple,
2472 const ArgList &Args)
2473 : Linux(D, Triple, Args) {
2474 // Select the correct multilib according to the given arguments.
2475 DetectedMultilibs Result;
2476 findMIPSMultilibs(D, Triple, "", Args, Result);
2477 Multilibs = Result.Multilibs;
2478 SelectedMultilib = Result.SelectedMultilib;
2479
2480 // Find out the library suffix based on the ABI.
2481 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2482 getFilePaths().clear();
2483 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2484
2485 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002486 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002487}
2488
2489void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2490 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2491 if (DriverArgs.hasArg(options::OPT_nostdinc))
2492 return;
2493
2494 const Driver &D = getDriver();
2495
2496 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2497 SmallString<128> P(D.ResourceDir);
2498 llvm::sys::path::append(P, "include");
2499 addSystemInclude(DriverArgs, CC1Args, P);
2500 }
2501
2502 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2503 return;
2504
2505 const auto &Callback = Multilibs.includeDirsCallback();
2506 if (Callback) {
2507 const auto IncludePaths =
2508 Callback(D.getInstalledDir(), getTripleString(), SelectedMultilib);
2509 for (const auto &Path : IncludePaths)
2510 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
2511 }
2512}
2513
2514Tool *MipsLLVMToolChain::buildLinker() const {
2515 return new tools::gnutools::Linker(*this);
2516}
2517
2518std::string MipsLLVMToolChain::computeSysRoot() const {
2519 if (!getDriver().SysRoot.empty())
2520 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2521
2522 const std::string InstalledDir(getDriver().getInstalledDir());
2523 std::string SysRootPath =
2524 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2525 if (llvm::sys::fs::exists(SysRootPath))
2526 return SysRootPath;
2527
2528 return std::string();
2529}
2530
2531ToolChain::CXXStdlibType
2532MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2533 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2534 if (A) {
2535 StringRef Value = A->getValue();
2536 if (Value != "libc++")
2537 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2538 << A->getAsString(Args);
2539 }
2540
2541 return ToolChain::CST_Libcxx;
2542}
2543
2544void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2545 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2546 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2547 DriverArgs.hasArg(options::OPT_nostdincxx))
2548 return;
2549
2550 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2551 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2552
2553 const auto &Callback = Multilibs.includeDirsCallback();
2554 if (Callback) {
2555 const auto IncludePaths = Callback(getDriver().getInstalledDir(),
2556 getTripleString(), SelectedMultilib);
2557 for (const auto &Path : IncludePaths) {
2558 if (llvm::sys::fs::exists(Path + "/c++/v1")) {
2559 addSystemInclude(DriverArgs, CC1Args, Path + "/c++/v1");
2560 break;
2561 }
2562 }
2563 }
2564}
2565
2566void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2567 ArgStringList &CmdArgs) const {
2568 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2569 "Only -lc++ (aka libxx) is suported in this toolchain.");
2570
2571 CmdArgs.push_back("-lc++");
2572 CmdArgs.push_back("-lc++abi");
2573 CmdArgs.push_back("-lunwind");
2574}
2575
2576std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2577 StringRef Component,
2578 bool Shared) const {
2579 SmallString<128> Path(getDriver().ResourceDir);
2580 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2581 getOS());
2582 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002583 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002584 return Path.str();
2585}
2586
Tony Linthicum76329bf2011-12-12 21:14:55 +00002587/// Hexagon Toolchain
2588
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002589std::string HexagonToolChain::getHexagonTargetDir(
2590 const std::string &InstalledDir,
2591 const SmallVectorImpl<std::string> &PrefixDirs) const {
2592 std::string InstallRelDir;
2593 const Driver &D = getDriver();
2594
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002595 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002596 for (auto &I : PrefixDirs)
2597 if (D.getVFS().exists(I))
2598 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00002599
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002600 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002601 return InstallRelDir;
2602
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002603 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/target";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002604 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002605 return PrefixRelDir;
2606
2607 return InstallRelDir;
2608}
2609
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002610Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
2611 const ArgList &Args) {
2612 StringRef Gn = "";
2613 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
2614 options::OPT_msmall_data_threshold_EQ)) {
2615 Gn = A->getValue();
2616 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
2617 options::OPT_fPIC)) {
2618 Gn = "0";
2619 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002620
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002621 unsigned G;
2622 if (!Gn.getAsInteger(10, G))
2623 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002624
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002625 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002626}
2627
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002628void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
2629 ToolChain::path_list &LibPaths) const {
2630 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00002631
2632 //----------------------------------------------------------------------------
2633 // -L Args
2634 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002635 for (Arg *A : Args.filtered(options::OPT_L))
2636 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002637 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002638
2639 //----------------------------------------------------------------------------
2640 // Other standard paths
2641 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002642 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00002643 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
2644 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00002645
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002646 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2647 D.PrefixDirs);
2648 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
2649 RootDirs.push_back(TargetDir);
2650
2651 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
2652 // Assume G0 with -shared.
2653 bool HasG0 = Args.hasArg(options::OPT_shared);
2654 if (auto G = getSmallDataThreshold(Args))
2655 HasG0 = G.getValue() == 0;
2656
2657 const std::string CpuVer = GetTargetCPUVersion(Args).str();
2658 for (auto &Dir : RootDirs) {
2659 std::string LibDir = Dir + "/hexagon/lib";
2660 std::string LibDirCpu = LibDir + '/' + CpuVer;
2661 if (HasG0) {
2662 if (HasPIC)
2663 LibPaths.push_back(LibDirCpu + "/G0/pic");
2664 LibPaths.push_back(LibDirCpu + "/G0");
2665 }
2666 LibPaths.push_back(LibDirCpu);
2667 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00002668 }
Matthew Curtise689b052012-12-06 15:46:07 +00002669}
2670
Douglas Katzman54366072015-07-27 16:53:08 +00002671HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002672 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002673 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002674 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2675 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002676
2677 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2678 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002679 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002680 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002681 getProgramPaths().push_back(BinDir);
2682
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002683 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002684
2685 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2686 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2687 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002688 LibPaths.clear();
2689 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002690}
2691
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002692HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002693
Douglas Katzman54366072015-07-27 16:53:08 +00002694Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002695 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002696}
2697
Douglas Katzman54366072015-07-27 16:53:08 +00002698Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002699 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002700}
2701
Douglas Katzman54366072015-07-27 16:53:08 +00002702void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2703 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002704 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2705 DriverArgs.hasArg(options::OPT_nostdlibinc))
2706 return;
2707
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002708 const Driver &D = getDriver();
2709 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2710 D.PrefixDirs);
2711 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002712}
2713
Douglas Katzman54366072015-07-27 16:53:08 +00002714void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2715 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002716 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2717 DriverArgs.hasArg(options::OPT_nostdincxx))
2718 return;
2719
2720 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002721 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
2722 addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002723}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002724
Matthew Curtise689b052012-12-06 15:46:07 +00002725ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002726HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002727 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2728 if (!A)
2729 return ToolChain::CST_Libstdcxx;
2730
2731 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002732 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002733 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002734
2735 return ToolChain::CST_Libstdcxx;
2736}
2737
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002738//
2739// Returns the default CPU for Hexagon. This is the default compilation target
2740// if no Hexagon processor is selected at the command-line.
2741//
2742const StringRef HexagonToolChain::GetDefaultCPU() {
2743 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002744}
2745
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002746const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
2747 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00002748 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
2749 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002750
2751 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
2752 if (CPU.startswith("hexagon"))
2753 return CPU.substr(sizeof("hexagon") - 1);
2754 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002755}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002756// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002757
Tom Stellard8fa33092015-07-18 01:49:05 +00002758/// AMDGPU Toolchain
2759AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2760 const ArgList &Args)
2761 : Generic_ELF(D, Triple, Args) { }
2762
2763Tool *AMDGPUToolChain::buildLinker() const {
2764 return new tools::amdgpu::Linker(*this);
2765}
2766// End AMDGPU
2767
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002768/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002769NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2770 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002771 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002772
2773 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2774 // default paths, and must instead only use the paths provided
2775 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002776 path_list &file_paths = getFilePaths();
2777 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002778
2779 file_paths.clear();
2780 prog_paths.clear();
2781
2782 // Path for library files (libc.a, ...)
2783 std::string FilePath(getDriver().Dir + "/../");
2784
2785 // Path for tools (clang, ld, etc..)
2786 std::string ProgPath(getDriver().Dir + "/../");
2787
2788 // Path for toolchain libraries (libgcc.a, ...)
2789 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2790
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002791 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002792 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002793 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002794 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002795 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2796 file_paths.push_back(ToolPath + "i686-nacl");
2797 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002798 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002799 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2800 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2801 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2802 file_paths.push_back(ToolPath + "x86_64-nacl");
2803 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002804 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002805 file_paths.push_back(FilePath + "arm-nacl/lib");
2806 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2807 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2808 file_paths.push_back(ToolPath + "arm-nacl");
2809 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002810 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002811 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2812 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2813 prog_paths.push_back(ProgPath + "bin");
2814 file_paths.push_back(ToolPath + "mipsel-nacl");
2815 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002816 default:
2817 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002818 }
2819
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002820 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2821}
2822
Douglas Katzman54366072015-07-27 16:53:08 +00002823void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2824 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002825 const Driver &D = getDriver();
2826 if (DriverArgs.hasArg(options::OPT_nostdinc))
2827 return;
2828
2829 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2830 SmallString<128> P(D.ResourceDir);
2831 llvm::sys::path::append(P, "include");
2832 addSystemInclude(DriverArgs, CC1Args, P.str());
2833 }
2834
2835 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2836 return;
2837
2838 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002839 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002840 case llvm::Triple::x86:
2841 // x86 is special because multilib style uses x86_64-nacl/include for libc
2842 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2843 // have the same substring.
2844 llvm::sys::path::append(P, "i686-nacl/usr/include");
2845 addSystemInclude(DriverArgs, CC1Args, P.str());
2846 llvm::sys::path::remove_filename(P);
2847 llvm::sys::path::remove_filename(P);
2848 llvm::sys::path::remove_filename(P);
2849 llvm::sys::path::append(P, "x86_64-nacl/include");
2850 addSystemInclude(DriverArgs, CC1Args, P.str());
2851 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002852 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002853 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002854 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002855 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002856 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002857 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002858 case llvm::Triple::mipsel:
2859 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2860 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002861 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002862 return;
2863 }
2864
2865 addSystemInclude(DriverArgs, CC1Args, P.str());
2866 llvm::sys::path::remove_filename(P);
2867 llvm::sys::path::remove_filename(P);
2868 llvm::sys::path::append(P, "include");
2869 addSystemInclude(DriverArgs, CC1Args, P.str());
2870}
2871
Douglas Katzman54366072015-07-27 16:53:08 +00002872void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2873 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002874 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2875 // if the value is libc++, and emits an error for other values.
2876 GetCXXStdlibType(Args);
2877 CmdArgs.push_back("-lc++");
2878}
2879
Douglas Katzman54366072015-07-27 16:53:08 +00002880void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2881 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002882 const Driver &D = getDriver();
2883 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2884 DriverArgs.hasArg(options::OPT_nostdincxx))
2885 return;
2886
2887 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2888 // if the value is libc++, and emits an error for other values.
2889 GetCXXStdlibType(DriverArgs);
2890
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002891 SmallString<128> P(D.Dir + "/../");
2892 switch (getTriple().getArch()) {
2893 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002894 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2895 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002896 break;
2897 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002898 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2899 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002900 break;
2901 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002902 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2903 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002904 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002905 case llvm::Triple::mipsel:
2906 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2907 addSystemInclude(DriverArgs, CC1Args, P.str());
2908 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002909 default:
2910 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002911 }
2912}
2913
Douglas Katzman54366072015-07-27 16:53:08 +00002914ToolChain::CXXStdlibType
2915NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002916 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2917 StringRef Value = A->getValue();
2918 if (Value == "libc++")
2919 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002920 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002921 }
2922
2923 return ToolChain::CST_Libcxx;
2924}
2925
Douglas Katzman54366072015-07-27 16:53:08 +00002926std::string
2927NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2928 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002929 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2930 if (TheTriple.getArch() == llvm::Triple::arm &&
2931 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2932 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2933 return TheTriple.getTriple();
2934}
2935
Douglas Katzman54366072015-07-27 16:53:08 +00002936Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002937 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002938}
2939
Douglas Katzman54366072015-07-27 16:53:08 +00002940Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002941 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002942 return new tools::nacltools::AssemblerARM(*this);
2943 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002944}
2945// End NaCl
2946
Chris Lattner09797542010-03-04 21:07:38 +00002947/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2948/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2949/// Currently does not support anything else but compilation.
2950
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002951TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002952 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002953 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002954 // Path mangling to find libexec
2955 std::string Path(getDriver().Dir);
2956
2957 Path += "/../libexec";
2958 getProgramPaths().push_back(Path);
2959}
2960
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002961TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002962
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002963bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002964
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002965bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002966
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002967bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002968
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002969bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002970
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002971// CloudABI - CloudABI tool chain which can call ld(1) directly.
2972
2973CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2974 const ArgList &Args)
2975 : Generic_ELF(D, Triple, Args) {
2976 SmallString<128> P(getDriver().Dir);
2977 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2978 getFilePaths().push_back(P.str());
2979}
2980
2981void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2982 ArgStringList &CC1Args) const {
2983 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2984 DriverArgs.hasArg(options::OPT_nostdincxx))
2985 return;
2986
2987 SmallString<128> P(getDriver().Dir);
2988 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2989 addSystemInclude(DriverArgs, CC1Args, P.str());
2990}
2991
2992void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2993 ArgStringList &CmdArgs) const {
2994 CmdArgs.push_back("-lc++");
2995 CmdArgs.push_back("-lc++abi");
2996 CmdArgs.push_back("-lunwind");
2997}
2998
Douglas Katzman95354292015-06-23 20:42:09 +00002999Tool *CloudABI::buildLinker() const {
3000 return new tools::cloudabi::Linker(*this);
3001}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003002
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003003/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3004
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003005OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3006 const ArgList &Args)
3007 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003008 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003009 getFilePaths().push_back("/usr/lib");
3010}
3011
Rafael Espindola7cf32212013-03-20 03:05:54 +00003012Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003013 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003014}
3015
Douglas Katzman95354292015-06-23 20:42:09 +00003016Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003017
Eli Friedman9fa28852012-08-08 23:57:20 +00003018/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3019
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003020Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3021 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003022 getFilePaths().push_back(getDriver().Dir + "/../lib");
3023 getFilePaths().push_back("/usr/lib");
3024}
3025
Rafael Espindola7cf32212013-03-20 03:05:54 +00003026Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003027 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003028}
3029
Douglas Katzman95354292015-06-23 20:42:09 +00003030Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003031
Jonas Hahnfeldaae83742016-02-12 07:48:37 +00003032ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
Richard Smith51af5192014-05-01 23:24:24 +00003033 return ToolChain::CST_Libcxx;
3034}
3035
Eli Friedman9fa28852012-08-08 23:57:20 +00003036void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3037 ArgStringList &CC1Args) const {
3038 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3039 DriverArgs.hasArg(options::OPT_nostdincxx))
3040 return;
3041
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003042 switch (GetCXXStdlibType(DriverArgs)) {
3043 case ToolChain::CST_Libcxx:
3044 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003045 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003046 break;
3047 case ToolChain::CST_Libstdcxx:
3048 addSystemInclude(DriverArgs, CC1Args,
3049 getDriver().SysRoot + "/usr/include/c++/stdc++");
3050 addSystemInclude(DriverArgs, CC1Args,
3051 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003052
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003053 StringRef Triple = getTriple().str();
3054 if (Triple.startswith("amd64"))
3055 addSystemInclude(DriverArgs, CC1Args,
3056 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003057 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003058 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003059 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3060 "/usr/include/c++/stdc++/" +
3061 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003062 break;
3063 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003064}
3065
3066void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3067 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003068 switch (GetCXXStdlibType(Args)) {
3069 case ToolChain::CST_Libcxx:
3070 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003071 CmdArgs.push_back("-lc++abi");
3072 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003073 break;
3074 case ToolChain::CST_Libstdcxx:
3075 CmdArgs.push_back("-lstdc++");
3076 break;
3077 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003078}
3079
Daniel Dunbare24297c2009-03-30 21:06:03 +00003080/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3081
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003082FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3083 const ArgList &Args)
3084 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003085
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003086 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3087 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003088 if ((Triple.getArch() == llvm::Triple::x86 ||
3089 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003090 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003091 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3092 else
3093 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003094}
3095
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003096ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00003097 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3098 StringRef Value = A->getValue();
3099 if (Value == "libstdc++")
3100 return ToolChain::CST_Libstdcxx;
3101 if (Value == "libc++")
3102 return ToolChain::CST_Libcxx;
3103
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003104 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00003105 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003106 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003107 return ToolChain::CST_Libcxx;
3108 return ToolChain::CST_Libstdcxx;
3109}
3110
3111void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3112 ArgStringList &CC1Args) const {
3113 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3114 DriverArgs.hasArg(options::OPT_nostdincxx))
3115 return;
3116
3117 switch (GetCXXStdlibType(DriverArgs)) {
3118 case ToolChain::CST_Libcxx:
3119 addSystemInclude(DriverArgs, CC1Args,
3120 getDriver().SysRoot + "/usr/include/c++/v1");
3121 break;
3122 case ToolChain::CST_Libstdcxx:
3123 addSystemInclude(DriverArgs, CC1Args,
3124 getDriver().SysRoot + "/usr/include/c++/4.2");
3125 addSystemInclude(DriverArgs, CC1Args,
3126 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3127 break;
3128 }
3129}
3130
Dimitry Andric60907392016-02-14 16:08:20 +00003131void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3132 ArgStringList &CmdArgs) const {
3133 CXXStdlibType Type = GetCXXStdlibType(Args);
3134 bool Profiling = Args.hasArg(options::OPT_pg);
3135
3136 switch (Type) {
3137 case ToolChain::CST_Libcxx:
3138 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3139 break;
3140
3141 case ToolChain::CST_Libstdcxx:
3142 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3143 break;
3144 }
3145}
3146
Rafael Espindola7cf32212013-03-20 03:05:54 +00003147Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003148 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003149}
3150
Douglas Katzman95354292015-06-23 20:42:09 +00003151Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003152
Tim Northovere931f9f2015-10-30 16:30:41 +00003153bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003154 // FreeBSD uses SjLj exceptions on ARM oabi.
3155 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003156 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003157 case llvm::Triple::GNUEABI:
3158 case llvm::Triple::EABI:
3159 return false;
3160
3161 default:
3162 return (getTriple().getArch() == llvm::Triple::arm ||
3163 getTriple().getArch() == llvm::Triple::thumb);
3164 }
3165}
3166
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003167bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003168
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003169bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003170
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003171SanitizerMask FreeBSD::getSupportedSanitizers() const {
3172 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3173 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3174 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3175 getTriple().getArch() == llvm::Triple::mips64el;
3176 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3177 Res |= SanitizerKind::Address;
3178 Res |= SanitizerKind::Vptr;
3179 if (IsX86_64 || IsMIPS64) {
3180 Res |= SanitizerKind::Leak;
3181 Res |= SanitizerKind::Thread;
3182 }
3183 if (IsX86 || IsX86_64) {
3184 Res |= SanitizerKind::SafeStack;
3185 }
3186 return Res;
3187}
3188
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003189/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3190
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003191NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3192 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003193 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003194 // When targeting a 32-bit platform, try the special directory used on
3195 // 64-bit hosts, and only fall back to the main library directory if that
3196 // doesn't work.
3197 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3198 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003199 switch (Triple.getArch()) {
3200 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003201 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003202 break;
3203 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003204 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003205 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003206 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003207 switch (Triple.getEnvironment()) {
3208 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003209 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003210 getFilePaths().push_back("=/usr/lib/eabi");
3211 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003212 case llvm::Triple::EABIHF:
3213 case llvm::Triple::GNUEABIHF:
3214 getFilePaths().push_back("=/usr/lib/eabihf");
3215 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003216 default:
3217 getFilePaths().push_back("=/usr/lib/oabi");
3218 break;
3219 }
3220 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003221 case llvm::Triple::mips64:
3222 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003223 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003224 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003225 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003226 getFilePaths().push_back("=/usr/lib/64");
3227 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003228 case llvm::Triple::ppc:
3229 getFilePaths().push_back("=/usr/lib/powerpc");
3230 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003231 case llvm::Triple::sparc:
3232 getFilePaths().push_back("=/usr/lib/sparc");
3233 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003234 default:
3235 break;
3236 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003237
3238 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003239 }
3240}
3241
Rafael Espindola7cf32212013-03-20 03:05:54 +00003242Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003243 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003244}
3245
Douglas Katzman95354292015-06-23 20:42:09 +00003246Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003247
Douglas Katzman95354292015-06-23 20:42:09 +00003248ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003249 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3250 StringRef Value = A->getValue();
3251 if (Value == "libstdc++")
3252 return ToolChain::CST_Libstdcxx;
3253 if (Value == "libc++")
3254 return ToolChain::CST_Libcxx;
3255
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003256 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003257 }
3258
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003259 unsigned Major, Minor, Micro;
3260 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003261 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003262 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003263 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003264 case llvm::Triple::arm:
3265 case llvm::Triple::armeb:
3266 case llvm::Triple::thumb:
3267 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003268 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003269 case llvm::Triple::ppc64:
3270 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003271 case llvm::Triple::sparc:
3272 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003273 case llvm::Triple::x86:
3274 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003275 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003276 default:
3277 break;
3278 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003279 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003280 return ToolChain::CST_Libstdcxx;
3281}
3282
3283void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3284 ArgStringList &CC1Args) const {
3285 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3286 DriverArgs.hasArg(options::OPT_nostdincxx))
3287 return;
3288
3289 switch (GetCXXStdlibType(DriverArgs)) {
3290 case ToolChain::CST_Libcxx:
3291 addSystemInclude(DriverArgs, CC1Args,
3292 getDriver().SysRoot + "/usr/include/c++/");
3293 break;
3294 case ToolChain::CST_Libstdcxx:
3295 addSystemInclude(DriverArgs, CC1Args,
3296 getDriver().SysRoot + "/usr/include/g++");
3297 addSystemInclude(DriverArgs, CC1Args,
3298 getDriver().SysRoot + "/usr/include/g++/backward");
3299 break;
3300 }
3301}
3302
Chris Lattner3e2ee142010-07-07 16:01:42 +00003303/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3304
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003305Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3306 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003307 getFilePaths().push_back(getDriver().Dir + "/../lib");
3308 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003309}
3310
Rafael Espindola7cf32212013-03-20 03:05:54 +00003311Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003312 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003313}
3314
Douglas Katzman95354292015-06-23 20:42:09 +00003315Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003316
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003317static void addPathIfExists(const Driver &D, const Twine &Path,
3318 ToolChain::path_list &Paths) {
3319 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003320 Paths.push_back(Path.str());
3321}
3322
David Chisnallf571cde2012-02-15 13:39:01 +00003323/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3324
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003325Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003326 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003327 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003328
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003329 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003330
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003331 path_list &Paths = getFilePaths();
3332 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003333 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003334
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003335 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003336 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003337 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003338
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003339 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003340
3341 std::string LibPath = "/usr/lib/";
3342 switch (Triple.getArch()) {
3343 case llvm::Triple::x86:
3344 case llvm::Triple::sparc:
3345 break;
3346 case llvm::Triple::x86_64:
3347 LibPath += "amd64/";
3348 break;
3349 case llvm::Triple::sparcv9:
3350 LibPath += "sparcv9/";
3351 break;
3352 default:
3353 llvm_unreachable("Unsupported architecture");
3354 }
3355
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003356 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003357}
3358
Rafael Espindola7cf32212013-03-20 03:05:54 +00003359Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003360 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003361}
3362
Douglas Katzman95354292015-06-23 20:42:09 +00003363Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003364
Rafael Espindolad5117262015-09-09 13:36:00 +00003365void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3366 ArgStringList &CC1Args) const {
3367 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3368 DriverArgs.hasArg(options::OPT_nostdincxx))
3369 return;
3370
3371 // Include the support directory for things like xlocale and fudged system
3372 // headers.
3373 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3374
3375 if (GCCInstallation.isValid()) {
3376 GCCVersion Version = GCCInstallation.getVersion();
3377 addSystemInclude(DriverArgs, CC1Args,
3378 getDriver().SysRoot + "/usr/gcc/" +
3379 Version.MajorStr + "." +
3380 Version.MinorStr +
3381 "/include/c++/" + Version.Text);
3382 addSystemInclude(DriverArgs, CC1Args,
3383 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3384 "." + Version.MinorStr + "/include/c++/" +
3385 Version.Text + "/" +
3386 GCCInstallation.getTriple().str());
3387 }
3388}
3389
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003390/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003391
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003392enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003393 // NB: Releases of a particular Linux distro should be kept together
3394 // in this enum, because some tests are done by integer comparison against
3395 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003396 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003397 DebianLenny,
3398 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003399 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003400 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003401 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003402 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003403 RHEL4,
3404 RHEL5,
3405 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003406 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003407 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003408 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003409 UbuntuHardy,
3410 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003411 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003412 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003413 UbuntuLucid,
3414 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003415 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003416 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003417 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003418 UbuntuQuantal,
3419 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003420 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003421 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003422 UbuntuUtopic,
3423 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003424 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003425 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003426 UnknownDistro
3427};
3428
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003429static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003430 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003431}
3432
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003433static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003434
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003435static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003436 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003437}
3438
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003439static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003440 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003441}
3442
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003443static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003444 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3445 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3446 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003447 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003448 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003449 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003450 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003451 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003452 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3453 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3454 .Case("hardy", UbuntuHardy)
3455 .Case("intrepid", UbuntuIntrepid)
3456 .Case("jaunty", UbuntuJaunty)
3457 .Case("karmic", UbuntuKarmic)
3458 .Case("lucid", UbuntuLucid)
3459 .Case("maverick", UbuntuMaverick)
3460 .Case("natty", UbuntuNatty)
3461 .Case("oneiric", UbuntuOneiric)
3462 .Case("precise", UbuntuPrecise)
3463 .Case("quantal", UbuntuQuantal)
3464 .Case("raring", UbuntuRaring)
3465 .Case("saucy", UbuntuSaucy)
3466 .Case("trusty", UbuntuTrusty)
3467 .Case("utopic", UbuntuUtopic)
3468 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003469 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003470 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003471 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003472 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003473 }
3474
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003475 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3476 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003477 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003478 if (Data.startswith("Fedora release"))
3479 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003480 if (Data.startswith("Red Hat Enterprise Linux") ||
3481 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003482 if (Data.find("release 7") != StringRef::npos)
3483 return RHEL7;
3484 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003485 return RHEL6;
3486 else if (Data.find("release 5") != StringRef::npos)
3487 return RHEL5;
3488 else if (Data.find("release 4") != StringRef::npos)
3489 return RHEL4;
3490 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003491 return UnknownDistro;
3492 }
3493
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003494 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3495 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003496 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003497 if (Data[0] == '5')
3498 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003499 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003500 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003501 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003502 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003503 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003504 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003505 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3506 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003507 return UnknownDistro;
3508 }
3509
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003510 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003511 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003512
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003513 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003514 return Exherbo;
3515
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003516 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003517 return ArchLinux;
3518
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003519 return UnknownDistro;
3520}
3521
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003522/// \brief Get our best guess at the multiarch triple for a target.
3523///
3524/// Debian-based systems are starting to use a multiarch setup where they use
3525/// a target-triple directory in the library and header search paths.
3526/// Unfortunately, this triple does not align with the vanilla target triple,
3527/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003528static std::string getMultiarchTriple(const Driver &D,
3529 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003530 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003531 llvm::Triple::EnvironmentType TargetEnvironment =
3532 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003533
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003534 // For most architectures, just use whatever we have rather than trying to be
3535 // clever.
3536 switch (TargetTriple.getArch()) {
3537 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003538 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003539
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003540 // We use the existence of '/lib/<triple>' as a directory to detect some
3541 // common linux triples that don't quite match the Clang triple for both
3542 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3543 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003544 case llvm::Triple::arm:
3545 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003546 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003547 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003548 return "arm-linux-gnueabihf";
3549 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003550 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003551 return "arm-linux-gnueabi";
3552 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003553 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003554 case llvm::Triple::armeb:
3555 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003556 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003557 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003558 return "armeb-linux-gnueabihf";
3559 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003560 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003561 return "armeb-linux-gnueabi";
3562 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003563 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003564 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003565 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003566 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003567 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003568 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003569 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003570 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003571 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003572 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003573 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003574 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003575 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003576 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003577 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003578 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003579 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003580 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003581 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003582 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003583 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003584 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003585 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003586 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003587 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003588 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003589 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003590 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003591 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003592 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003593 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003594 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003595 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003596 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003597 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003598 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003599 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003600 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003601 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003602 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003603 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003604 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003605 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003606 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003607 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003608 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003609 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003610 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003611 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003612 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003613 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003614 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003615 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003616 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003617 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003618 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003619 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003620 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003621 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003622 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003623 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003624 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003625 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003626 return "s390x-linux-gnu";
3627 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003628 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003629 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003630}
3631
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003632static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003633 if (isMipsArch(Triple.getArch())) {
3634 // lib32 directory has a special meaning on MIPS targets.
3635 // It contains N32 ABI binaries. Use this folder if produce
3636 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003637 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003638 return "lib32";
3639 return Triple.isArch32Bit() ? "lib" : "lib64";
3640 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003641
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003642 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003643 // using that variant while targeting other architectures causes problems
3644 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003645 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003646 // them when we know we may need it.
3647 //
3648 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003649 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003650 // GCCInstallationDetector, but that is a more significant refactoring.
3651 if (Triple.getArch() == llvm::Triple::x86 ||
3652 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003653 return "lib32";
3654
Zinovy Nis1db95732014-07-10 15:27:19 +00003655 if (Triple.getArch() == llvm::Triple::x86_64 &&
3656 Triple.getEnvironment() == llvm::Triple::GNUX32)
3657 return "libx32";
3658
Simon Atanasyand4413882012-09-14 11:27:24 +00003659 return Triple.isArch32Bit() ? "lib" : "lib64";
3660}
3661
Rafael Espindola1af7c212012-02-19 01:38:32 +00003662Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003663 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003664 GCCInstallation.init(Triple, Args);
3665 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003666 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003667 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003668 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003669
Rafael Espindola10a63c22013-07-03 14:14:00 +00003670 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003671 // least) put various tools in a triple-prefixed directory off of the parent
3672 // of the GCC installation. We use the GCC triple here to ensure that we end
3673 // up with tools that support the same amount of cross compiling as the
3674 // detected GCC installation. For example, if we find a GCC installation
3675 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3676 // used to target i386.
3677 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003678 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003679 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003680 GCCInstallation.getTriple().str() + "/bin")
3681 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003682
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003683 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003684
Rafael Espindola10a63c22013-07-03 14:14:00 +00003685 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003686 ExtraOpts.push_back("-z");
3687 ExtraOpts.push_back("relro");
3688 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003689
Douglas Gregord9bb1522011-03-06 19:11:49 +00003690 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003691 ExtraOpts.push_back("-X");
3692
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003693 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003694 const bool IsMips = isMipsArch(Arch);
3695
3696 if (IsMips && !SysRoot.empty())
3697 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003698
Chandler Carruth0b842912011-12-09 04:45:18 +00003699 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3700 // and the MIPS ABI require .dynsym to be sorted in different ways.
3701 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3702 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003703 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003704 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003705 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003706 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003707 ExtraOpts.push_back("--hash-style=gnu");
3708
Rafael Espindola10a63c22013-07-03 14:14:00 +00003709 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003710 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3711 ExtraOpts.push_back("--hash-style=both");
3712 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003713
Chris Lattner84e38552011-05-22 05:36:06 +00003714 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003715 ExtraOpts.push_back("--no-add-needed");
3716
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003717 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003718 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003719 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003720 ExtraOpts.push_back("--build-id");
3721
Rafael Espindola10a63c22013-07-03 14:14:00 +00003722 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003723 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003724
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003725 // The selection of paths to try here is designed to match the patterns which
3726 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3727 // This was determined by running GCC in a fake filesystem, creating all
3728 // possible permutations of these directories, and seeing which ones it added
3729 // to the link paths.
3730 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003731
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003732 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003733 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003734
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003735 // Add the multilib suffixed paths where they are available.
3736 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003737 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003738 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003739 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003740
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003741 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003742 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003743 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003744 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003745
3746 // GCC cross compiling toolchains will install target libraries which ship
3747 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3748 // any part of the GCC installation in
3749 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3750 // debatable, but is the reality today. We need to search this tree even
3751 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003752 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003753 // installation that is *not* within the system root to ensure two things:
3754 //
3755 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003756 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003757 // appropriate rpath.
3758 // 2) There must not be libraries installed into
3759 // <prefix>/<triple>/<libdir> unless they should be preferred over
3760 // those within the system root.
3761 //
3762 // Note that this matches the GCC behavior. See the below comment for where
3763 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003764 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3765 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003766 Paths);
3767
Chandler Carruth69a125b2012-04-06 16:32:06 +00003768 // If the GCC installation we found is inside of the sysroot, we want to
3769 // prefer libraries installed in the parent prefix of the GCC installation.
3770 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003771 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003772 // This usually happens when there is an external cross compiler on the
3773 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003774 // the cross. Note that GCC does include some of these directories in some
3775 // configurations but this seems somewhere between questionable and simply
3776 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003777 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003778 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3779 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003780 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003781 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003782
3783 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003784 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003785 // those searched.
3786 // FIXME: It's not clear whether we should use the driver's installed
3787 // directory ('Dir' below) or the ResourceDir.
3788 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003789 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3790 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003791 }
3792
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003793 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3794 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3795 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3796 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003797
Chandler Carruthb427c562013-06-22 11:35:51 +00003798 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003799 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003800 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003801 addPathIfExists(D,
3802 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003803 "/../../" + OSLibDir,
3804 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003805
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003806 // Add the 'other' biarch variant path
3807 Multilib BiarchSibling;
3808 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003809 addPathIfExists(D, GCCInstallation.getInstallPath() +
3810 BiarchSibling.gccSuffix(),
3811 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003812 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003813
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003814 // See comments above on the multilib variant for details of why this is
3815 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003816 const std::string &LibPath = GCCInstallation.getParentLibPath();
3817 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3818 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003819 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3820 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003821 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003822
3823 // See comments above on the multilib variant for details of why this is
3824 // only included from within the sysroot.
3825 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003826 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003827 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003828
3829 // Similar to the logic for GCC above, if we are currently running Clang
3830 // inside of the requested system root, add its parent library path to those
3831 // searched.
3832 // FIXME: It's not clear whether we should use the driver's installed
3833 // directory ('Dir' below) or the ResourceDir.
3834 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003835 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003836
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003837 addPathIfExists(D, SysRoot + "/lib", Paths);
3838 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003839}
3840
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003841bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003842
Douglas Katzman95354292015-06-23 20:42:09 +00003843Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003844
3845Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003846 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003847}
3848
Simon Atanasyana0d89572013-10-05 14:37:55 +00003849std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003850 if (!getDriver().SysRoot.empty())
3851 return getDriver().SysRoot;
3852
3853 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3854 return std::string();
3855
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003856 // Standalone MIPS toolchains use different names for sysroot folder
3857 // and put it into different places. Here we try to check some known
3858 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003859
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003860 const StringRef InstallDir = GCCInstallation.getInstallPath();
3861 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003862 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003863
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003864 std::string Path =
3865 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3866 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003867
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003868 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003869 return Path;
3870
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003871 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003872
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003873 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003874 return Path;
3875
3876 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003877}
3878
Chandler Carrutha796f532011-11-05 20:17:13 +00003879void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3880 ArgStringList &CC1Args) const {
3881 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003882 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003883
3884 if (DriverArgs.hasArg(options::OPT_nostdinc))
3885 return;
3886
3887 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003888 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003889
3890 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003891 SmallString<128> P(D.ResourceDir);
3892 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003893 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003894 }
3895
3896 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3897 return;
3898
3899 // Check for configure-time C include directories.
3900 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3901 if (CIncludeDirs != "") {
3902 SmallVector<StringRef, 5> dirs;
3903 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003904 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003905 StringRef Prefix =
3906 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003907 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003908 }
3909 return;
3910 }
3911
3912 // Lacking those, try to detect the correct set of system includes for the
3913 // target triple.
3914
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003915 // Add include directories specific to the selected multilib set and multilib.
3916 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003917 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003918 if (Callback) {
3919 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3920 GCCInstallation.getTriple().str(),
3921 GCCInstallation.getMultilib());
3922 for (const auto &Path : IncludePaths)
3923 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3924 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003925 }
3926
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003927 // Implement generic Debian multiarch support.
3928 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003929 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003930
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003931 // FIXME: These are older forms of multiarch. It's not clear that they're
3932 // in use in any released version of Debian, so we should consider
3933 // removing them.
3934 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003935 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003936 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003937
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003938 // FIXME: These are older forms of multiarch. It's not clear that they're
3939 // in use in any released version of Debian, so we should consider
3940 // removing them.
3941 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3942 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003943 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003944 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003945 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003946 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003947 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003948 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003949 const StringRef ARMEBMultiarchIncludeDirs[] = {
3950 "/usr/include/armeb-linux-gnueabi"};
3951 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
3952 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003953 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003954 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003955 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003956 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003957 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003958 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003959 "/usr/include/mips64el-linux-gnu",
3960 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003961 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003962 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003963 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003964 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003965 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003966 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003967 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003968 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003969 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003970 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003971 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3972 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003973 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003974 switch (getTriple().getArch()) {
3975 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003976 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003977 break;
3978 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003979 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003980 break;
3981 case llvm::Triple::aarch64:
3982 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003983 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003984 break;
3985 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003986 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003987 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3988 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3989 else
3990 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003991 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003992 case llvm::Triple::armeb:
3993 case llvm::Triple::thumbeb:
3994 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3995 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
3996 else
3997 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
3998 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003999 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00004000 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004001 break;
4002 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00004003 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004004 break;
4005 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004006 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004007 break;
4008 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004009 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004010 break;
4011 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004012 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004013 break;
4014 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004015 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004016 break;
4017 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004018 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004019 break;
4020 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004021 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004022 break;
4023 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004024 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004025 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004026 case llvm::Triple::systemz:
4027 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4028 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004029 default:
4030 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004031 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004032 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004033 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004034 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004035 break;
4036 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004037 }
4038
4039 if (getTriple().getOS() == llvm::Triple::RTEMS)
4040 return;
4041
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004042 // Add an include of '/include' directly. This isn't provided by default by
4043 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4044 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004045 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004046
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004047 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004048}
4049
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004050static std::string DetectLibcxxIncludePath(StringRef base) {
4051 std::error_code EC;
4052 int MaxVersion = 0;
4053 std::string MaxVersionString = "";
4054 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4055 LI = LI.increment(EC)) {
4056 StringRef VersionText = llvm::sys::path::filename(LI->path());
4057 int Version;
4058 if (VersionText[0] == 'v' &&
4059 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4060 if (Version > MaxVersion) {
4061 MaxVersion = Version;
4062 MaxVersionString = VersionText;
4063 }
4064 }
4065 }
4066 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4067}
4068
Chandler Carrutha796f532011-11-05 20:17:13 +00004069void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4070 ArgStringList &CC1Args) const {
4071 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4072 DriverArgs.hasArg(options::OPT_nostdincxx))
4073 return;
4074
Chandler Carruthf4701732011-11-07 09:01:17 +00004075 // Check if libc++ has been enabled and provide its include paths if so.
4076 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004077 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004078 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004079
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004080 // We also check the system as for a long time this is the only place
4081 // Clang looked.
4082 // FIXME: We should really remove this. It doesn't make any sense.
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004083 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004084 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004085 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004086 continue;
4087 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004088 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004089 break;
4090 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004091 return;
4092 }
4093
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004094 // We need a detected GCC installation on Linux to provide libstdc++'s
4095 // headers. We handled the libc++ case above.
4096 if (!GCCInstallation.isValid())
4097 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004098
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004099 // By default, look for the C++ headers in an include directory adjacent to
4100 // the lib directory of the GCC installation. Note that this is expect to be
4101 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4102 StringRef LibDir = GCCInstallation.getParentLibPath();
4103 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004104 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004105 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004106 const std::string GCCMultiarchTriple = getMultiarchTriple(
4107 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004108 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004109 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004110 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004111
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004112 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004113 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004114 "/c++/" + Version.Text, TripleStr,
4115 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004116 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004117 return;
4118
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004119 // Otherwise, fall back on a bunch of options which don't use multiarch
4120 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004121 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004122 // Gentoo is weird and places its headers inside the GCC install,
4123 // so if the first attempt to find the headers fails, try these patterns.
4124 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4125 Version.MinorStr,
4126 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4127 // Android standalone toolchain has C++ headers in yet another place.
4128 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4129 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4130 // without a subdirectory corresponding to the gcc version.
4131 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004132 };
4133
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004134 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004135 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4136 /*GCCMultiarchTriple*/ "",
4137 /*TargetMultiarchTriple*/ "",
4138 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004139 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004140 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004141}
4142
Artem Belevichfa11ab52015-11-17 22:28:46 +00004143void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4144 ArgStringList &CC1Args) const {
4145 if (DriverArgs.hasArg(options::OPT_nocudainc))
4146 return;
4147
Artem Belevich86017332015-11-17 22:28:55 +00004148 if (CudaInstallation.isValid()) {
Artem Belevichfa11ab52015-11-17 22:28:46 +00004149 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
Artem Belevich86017332015-11-17 22:28:55 +00004150 CC1Args.push_back("-include");
Artem Belevich7fda3c92015-12-16 18:51:59 +00004151 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevich86017332015-11-17 22:28:55 +00004152 }
Artem Belevichfa11ab52015-11-17 22:28:46 +00004153}
4154
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004155bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004156
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004157SanitizerMask Linux::getSupportedSanitizers() const {
4158 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4159 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4160 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4161 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004162 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4163 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004164 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4165 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004166 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4167 Res |= SanitizerKind::Address;
4168 Res |= SanitizerKind::KernelAddress;
4169 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004170 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004171 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004172 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004173 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004174 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004175 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004176 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004177 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004178 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004179 if (IsX86 || IsX86_64) {
4180 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004181 }
4182 return Res;
4183}
4184
Xinliang David Li170cd102015-10-27 05:15:35 +00004185void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4186 llvm::opt::ArgStringList &CmdArgs) const {
4187 if (!needsProfileRT(Args)) return;
4188
4189 // Add linker option -u__llvm_runtime_variable to cause runtime
4190 // initialization module to be linked in.
4191 if (!Args.hasArg(options::OPT_coverage))
4192 CmdArgs.push_back(Args.MakeArgString(
4193 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4194 ToolChain::addProfileRTLibs(Args, CmdArgs);
4195}
4196
Daniel Dunbarcc912342009-05-02 18:28:39 +00004197/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4198
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004199DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4200 const ArgList &Args)
4201 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004202
4203 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004204 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004205 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004206 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004207
Daniel Dunbar083edf72009-12-21 18:54:17 +00004208 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004209 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004210 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004211}
4212
Rafael Espindola7cf32212013-03-20 03:05:54 +00004213Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004214 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004215}
4216
4217Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004218 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004219}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004220
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004221/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4222/// which isn't properly a linker but nonetheless performs the step of stitching
4223/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004224
4225CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4226 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004227 : Linux(D, Triple, Args) {
4228 if (CudaInstallation.isValid())
4229 getProgramPaths().push_back(CudaInstallation.getBinPath());
4230}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004231
4232void
4233CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4234 llvm::opt::ArgStringList &CC1Args) const {
4235 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4236 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004237
4238 if (DriverArgs.hasArg(options::OPT_nocudalib))
4239 return;
4240
4241 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4242 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4243 if (!LibDeviceFile.empty()) {
4244 CC1Args.push_back("-mlink-cuda-bitcode");
4245 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4246
4247 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4248 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4249 // came with CUDA-7.0.
4250 CC1Args.push_back("-target-feature");
4251 CC1Args.push_back("+ptx42");
4252 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004253}
4254
4255llvm::opt::DerivedArgList *
4256CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4257 const char *BoundArch) const {
4258 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4259 const OptTable &Opts = getDriver().getOpts();
4260
4261 for (Arg *A : Args) {
4262 if (A->getOption().matches(options::OPT_Xarch__)) {
4263 // Skip this argument unless the architecture matches BoundArch
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004264 if (!BoundArch || A->getValue(0) != StringRef(BoundArch))
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004265 continue;
4266
4267 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4268 unsigned Prev = Index;
4269 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4270
4271 // If the argument parsing failed or more than one argument was
4272 // consumed, the -Xarch_ argument's parameter tried to consume
4273 // extra arguments. Emit an error and ignore.
4274 //
4275 // We also want to disallow any options which would alter the
4276 // driver behavior; that isn't going to work in our model. We
4277 // use isDriverOption() as an approximation, although things
4278 // like -O4 are going to slip through.
4279 if (!XarchArg || Index > Prev + 1) {
4280 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4281 << A->getAsString(Args);
4282 continue;
4283 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4284 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4285 << A->getAsString(Args);
4286 continue;
4287 }
4288 XarchArg->setBaseArg(A);
4289 A = XarchArg.release();
4290 DAL->AddSynthesizedArg(A);
4291 }
4292 DAL->append(A);
4293 }
4294
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004295 if (BoundArch)
4296 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004297 return DAL;
4298}
4299
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004300Tool *CudaToolChain::buildAssembler() const {
4301 return new tools::NVPTX::Assembler(*this);
4302}
4303
4304Tool *CudaToolChain::buildLinker() const {
4305 return new tools::NVPTX::Linker(*this);
4306}
4307
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004308/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004309XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4310 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004311 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004312 // ProgramPaths are found via 'PATH' environment variable.
4313}
4314
Douglas Katzman54366072015-07-27 16:53:08 +00004315Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004316 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004317}
4318
Douglas Katzman54366072015-07-27 16:53:08 +00004319Tool *XCoreToolChain::buildLinker() const {
4320 return new tools::XCore::Linker(*this);
4321}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004322
Douglas Katzman54366072015-07-27 16:53:08 +00004323bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004324
Douglas Katzman54366072015-07-27 16:53:08 +00004325bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004326
Douglas Katzman54366072015-07-27 16:53:08 +00004327bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004328
Douglas Katzman54366072015-07-27 16:53:08 +00004329bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004330
Douglas Katzman54366072015-07-27 16:53:08 +00004331bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004332
Douglas Katzman54366072015-07-27 16:53:08 +00004333void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4334 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004335 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4336 DriverArgs.hasArg(options::OPT_nostdlibinc))
4337 return;
4338 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4339 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004340 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004341 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4342 ArrayRef<StringRef> DirVec(Dirs);
4343 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4344 }
4345}
4346
Douglas Katzman54366072015-07-27 16:53:08 +00004347void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4348 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004349 CC1Args.push_back("-nostdsysteminc");
4350}
4351
Douglas Katzman54366072015-07-27 16:53:08 +00004352void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4353 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004354 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004355 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4356 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004357 return;
4358 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4359 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004360 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004361 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4362 ArrayRef<StringRef> DirVec(Dirs);
4363 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4364 }
4365}
4366
Douglas Katzman54366072015-07-27 16:53:08 +00004367void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4368 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004369 // We don't output any lib args. This is handled by xcc.
4370}
Douglas Katzman84a75642015-06-19 14:55:19 +00004371
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004372MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4373 const ArgList &Args)
4374 : Generic_GCC(D, Triple, Args) {
4375 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4376 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4377 // This won't work to find gcc. Instead we give the installation detector an
4378 // extra triple, which is preferable to further hacks of the logic that at
4379 // present is based solely on getArch(). In particular, it would be wrong to
4380 // choose the myriad installation when targeting a non-myriad sparc install.
4381 switch (Triple.getArch()) {
4382 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00004383 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4384 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004385 case llvm::Triple::sparc:
4386 case llvm::Triple::sparcel:
4387 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004388 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004389 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004390
4391 if (GCCInstallation.isValid()) {
4392 // The contents of LibDir are independent of the version of gcc.
4393 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4394 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4395 if (Triple.getArch() == llvm::Triple::sparcel)
4396 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4397 else
4398 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4399 addPathIfExists(D, LibDir, getFilePaths());
4400
4401 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4402 // These files are tied to a particular version of gcc.
4403 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4404 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4405 // but as this toolchain is for LEON sparc, it can assume FPU.
4406 if (Triple.getArch() == llvm::Triple::sparcel)
4407 llvm::sys::path::append(CompilerSupportDir, "le");
4408 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4409 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004410}
4411
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004412MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004413
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004414void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4415 ArgStringList &CC1Args) const {
4416 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4417 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4418}
4419
Eric Christopherefef8ef2015-12-07 22:43:05 +00004420void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4421 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00004422 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4423 DriverArgs.hasArg(options::OPT_nostdincxx))
4424 return;
4425
4426 // Only libstdc++, for now.
4427 StringRef LibDir = GCCInstallation.getParentLibPath();
4428 const GCCVersion &Version = GCCInstallation.getVersion();
4429 StringRef TripleStr = GCCInstallation.getTriple().str();
4430 const Multilib &Multilib = GCCInstallation.getMultilib();
4431
Eric Christopherefef8ef2015-12-07 22:43:05 +00004432 addLibStdCXXIncludePaths(
4433 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4434 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00004435}
4436
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004437// MyriadToolChain handles several triples:
4438// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4439Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4440 // The inherited method works fine if not targeting the SHAVE.
4441 if (!isShaveCompilation(getTriple()))
4442 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004443 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00004444 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00004445 case Action::CompileJobClass:
4446 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004447 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004448 return Compiler.get();
4449 case Action::AssembleJobClass:
4450 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004451 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004452 return Assembler.get();
4453 default:
4454 return ToolChain::getTool(JA.getKind());
4455 }
4456}
4457
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004458Tool *MyriadToolChain::buildLinker() const {
4459 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004460}
Dan Gohmanc2853072015-09-03 22:51:53 +00004461
Dan Gohman52816862015-12-16 23:30:41 +00004462WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
4463 const llvm::opt::ArgList &Args)
4464 : ToolChain(D, Triple, Args) {
4465 // Use LLD by default.
4466 DefaultLinker = "lld";
4467}
4468
Dan Gohmanc2853072015-09-03 22:51:53 +00004469bool WebAssembly::IsMathErrnoDefault() const { return false; }
4470
4471bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4472
4473bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4474
4475bool WebAssembly::isPICDefault() const { return false; }
4476
4477bool WebAssembly::isPIEDefault() const { return false; }
4478
4479bool WebAssembly::isPICDefaultForced() const { return false; }
4480
4481bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4482
4483// TODO: Support Objective C stuff.
4484bool WebAssembly::SupportsObjCGC() const { return false; }
4485
4486bool WebAssembly::hasBlocksRuntime() const { return false; }
4487
4488// TODO: Support profiling.
4489bool WebAssembly::SupportsProfiling() const { return false; }
4490
Dan Gohman52816862015-12-16 23:30:41 +00004491bool WebAssembly::HasNativeLLVMSupport() const { return true; }
4492
Dan Gohmanc2853072015-09-03 22:51:53 +00004493void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4494 ArgStringList &CC1Args) const {
4495 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4496 options::OPT_fno_use_init_array, true))
4497 CC1Args.push_back("-fuse-init-array");
4498}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004499
Dan Gohman6ad8f612016-01-14 16:00:13 +00004500ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
4501 return ToolChain::RLT_CompilerRT;
4502}
4503
4504ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
4505 return ToolChain::CST_Libcxx;
4506}
4507
4508void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4509 ArgStringList &CC1Args) const {
4510 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4511 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4512}
4513
4514void WebAssembly::AddClangCXXStdlibIncludeArgs(
4515 const llvm::opt::ArgList &DriverArgs,
4516 llvm::opt::ArgStringList &CC1Args) const {
4517 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
4518 !DriverArgs.hasArg(options::OPT_nostdincxx))
4519 addSystemInclude(DriverArgs, CC1Args,
4520 getDriver().SysRoot + "/include/c++/v1");
4521}
4522
Dan Gohman52816862015-12-16 23:30:41 +00004523Tool *WebAssembly::buildLinker() const {
4524 return new tools::wasm::Linker(*this);
4525}
4526
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004527PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4528 : Generic_ELF(D, Triple, Args) {
4529 if (Args.hasArg(options::OPT_static))
4530 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4531
4532 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4533 // if it exists; otherwise use the driver's installation path, which
4534 // should be <SDK_DIR>/host_tools/bin.
4535
4536 SmallString<512> PS4SDKDir;
4537 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4538 if (!llvm::sys::fs::exists(EnvValue))
4539 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4540 PS4SDKDir = EnvValue;
4541 } else {
4542 PS4SDKDir = getDriver().Dir;
4543 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00004544 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004545
Eric Christopherefef8ef2015-12-07 22:43:05 +00004546 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004547 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00004548 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004549 // If -isysroot was passed, use that as the SDK base path.
4550 std::string PrefixDir;
4551 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4552 PrefixDir = A->getValue();
4553 if (!llvm::sys::fs::exists(PrefixDir))
4554 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4555 } else
4556 PrefixDir = PS4SDKDir.str();
4557
4558 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4559 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4560 if (!Args.hasArg(options::OPT_nostdinc) &&
4561 !Args.hasArg(options::OPT_nostdlibinc) &&
4562 !Args.hasArg(options::OPT_isysroot) &&
4563 !Args.hasArg(options::OPT__sysroot_EQ) &&
4564 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4565 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4566 << "PS4 system headers" << PS4SDKIncludeDir;
4567 }
4568
4569 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4570 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4571 if (!Args.hasArg(options::OPT_nostdlib) &&
4572 !Args.hasArg(options::OPT_nodefaultlibs) &&
4573 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4574 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4575 !Args.hasArg(options::OPT_emit_ast) &&
4576 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4577 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4578 << "PS4 system libraries" << PS4SDKLibDir;
4579 return;
4580 }
4581 getFilePaths().push_back(PS4SDKLibDir.str());
4582}
4583
4584Tool *PS4CPU::buildAssembler() const {
4585 return new tools::PS4cpu::Assemble(*this);
4586}
4587
4588Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4589
4590bool PS4CPU::isPICDefault() const { return true; }
4591
4592bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4593
4594SanitizerMask PS4CPU::getSupportedSanitizers() const {
4595 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4596 Res |= SanitizerKind::Address;
4597 Res |= SanitizerKind::Vptr;
4598 return Res;
4599}