blob: 936fd8fe89ee310bf5a2c131bfa4773fbc2ea1aa [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
Chris Bienemane60e7c22016-04-29 22:28:34 +0000332StringRef Darwin::getPlatformFamily() const {
333 switch (TargetPlatform) {
334 case DarwinPlatformKind::MacOS:
335 return "MacOSX";
336 case DarwinPlatformKind::IPhoneOS:
337 case DarwinPlatformKind::IPhoneOSSimulator:
338 return "iPhone";
339 case DarwinPlatformKind::TvOS:
340 case DarwinPlatformKind::TvOSSimulator:
341 return "AppleTV";
342 case DarwinPlatformKind::WatchOS:
343 case DarwinPlatformKind::WatchOSSimulator:
344 return "Watch";
345 }
346 llvm_unreachable("Unsupported platform");
347}
348
349StringRef Darwin::getSDKName(StringRef isysroot) {
350 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
351 llvm::sys::path::const_iterator SDKDir;
352 auto BeginSDK = llvm::sys::path::begin(isysroot);
353 auto EndSDK = llvm::sys::path::end(isysroot);
354 for (auto IT = BeginSDK; IT != EndSDK; ++IT) {
355 StringRef SDK = *IT;
356 if (SDK.endswith(".sdk"))
357 return SDK.slice(0, SDK.size() - 4);
358 }
359 return "";
360}
361
Anna Zakse67b4022016-02-02 02:04:48 +0000362StringRef Darwin::getOSLibraryNameSuffix() const {
363 switch(TargetPlatform) {
364 case DarwinPlatformKind::MacOS:
365 return "osx";
366 case DarwinPlatformKind::IPhoneOS:
367 return "ios";
368 case DarwinPlatformKind::IPhoneOSSimulator:
369 return "iossim";
370 case DarwinPlatformKind::TvOS:
371 return "tvos";
372 case DarwinPlatformKind::TvOSSimulator:
373 return "tvossim";
374 case DarwinPlatformKind::WatchOS:
375 return "watchos";
376 case DarwinPlatformKind::WatchOSSimulator:
377 return "watchossim";
378 }
379 llvm_unreachable("Unsupported platform");
380}
381
Justin Bogner2fd95f62015-05-12 06:30:48 +0000382void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000383 ArgStringList &CmdArgs) const {
Xinliang David Li69306c02015-10-22 06:15:31 +0000384 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000385
Chris Bieneman7f2844f2016-03-15 18:08:20 +0000386 AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.profile_") +
387 getOSLibraryNameSuffix() + ".a").str(),
Chris Bieneman586d24b2015-11-20 00:19:21 +0000388 /*AlwaysLink*/ true);
Justin Bognerc7701242015-05-12 05:44:36 +0000389}
390
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000391void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
392 ArgStringList &CmdArgs,
393 StringRef Sanitizer) const {
394 if (!Args.hasArg(options::OPT_dynamiclib) &&
395 !Args.hasArg(options::OPT_bundle)) {
396 // Sanitizer runtime libraries requires C++.
397 AddCXXStdlibLibArgs(Args, CmdArgs);
398 }
Anna Zakse67b4022016-02-02 02:04:48 +0000399
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000400 AddLinkRuntimeLib(
401 Args, CmdArgs,
Anna Zakse67b4022016-02-02 02:04:48 +0000402 (Twine("libclang_rt.") + Sanitizer + "_" +
403 getOSLibraryNameSuffix() + "_dynamic.dylib").str(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000404 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
405 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000406
407 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
408 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
409 // all RTTI-related symbols that UBSan uses.
410 CmdArgs.push_back("-lc++abi");
411 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000412}
413
Daniel Dunbar6276f992009-09-18 08:15:13 +0000414void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
415 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000416 // Darwin only supports the compiler-rt based runtime libraries.
417 switch (GetRuntimeLibType(Args)) {
418 case ToolChain::RLT_CompilerRT:
419 break;
420 default:
421 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000422 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000423 return;
424 }
425
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000426 // Darwin doesn't support real static executables, don't link any runtime
427 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000428 if (Args.hasArg(options::OPT_static) ||
429 Args.hasArg(options::OPT_fapple_kext) ||
430 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000431 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000432
433 // Reject -static-libgcc for now, we can deal with this when and if someone
434 // cares. This is useful in situations where someone wants to statically link
435 // something like libstdc++, and needs its runtime support routines.
436 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000437 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000438 return;
439 }
440
Peter Collingbourne32701642013-11-01 18:16:25 +0000441 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000442 if (Sanitize.needsAsanRt())
443 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
444 if (Sanitize.needsUbsanRt())
445 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000446 if (Sanitize.needsTsanRt())
447 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Peter Collingbournedc134532016-01-16 00:31:22 +0000448 if (Sanitize.needsStatsRt()) {
449 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
450 AddLinkRuntimeLib(Args, CmdArgs,
451 (Twine("libclang_rt.stats_client_") + OS + ".a").str(),
452 /*AlwaysLink=*/true);
453 AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");
454 }
Derek Bruening256c2e12016-04-21 21:32:04 +0000455 if (Sanitize.needsEsanRt())
456 AddLinkSanitizerLibArgs(Args, CmdArgs, "esan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000457
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000458 // Otherwise link libSystem, then the dynamic runtime library, and finally any
459 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000460 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000461
462 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000463 if (isTargetWatchOSBased()) {
464 // We currently always need a static runtime library for watchOS.
465 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
466 } else if (isTargetTvOSBased()) {
467 // We currently always need a static runtime library for tvOS.
468 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
469 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000470 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
471 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000472 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000473 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000474 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000475 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000476
Daniel Dunbard1076382011-04-18 23:48:36 +0000477 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000478 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000479 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000480 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000481 // The dynamic runtime library was merged with libSystem for 10.6 and
482 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000483 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000484 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000485 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000486 CmdArgs.push_back("-lgcc_s.10.5");
487
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000488 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000489 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000490 // omitted from 10.4.dylib.
491 //
492 // Unfortunately, that turned out to not be true, because Darwin system
493 // headers can still use eprintf on i386, and it is not exported from
494 // libSystem. Therefore, we still must provide a runtime library just for
495 // the tiny tiny handful of projects that *might* use that symbol.
496 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000497 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000498 } else {
499 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000500 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
501 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000502 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000503 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000504}
505
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000506void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000507 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000508
Daniel Dunbar455a0492012-08-17 18:43:50 +0000509 // Support allowing the SDKROOT environment variable used by xcrun and other
510 // Xcode tools to define the default sysroot, by making it the default for
511 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000512 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
513 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000514 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000515 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
516 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000517 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000518 // We only use this value as the default if it is an absolute path,
519 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000520 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000521 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000522 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000523 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000524 }
525 }
526 }
527
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000528 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000529 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000530 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
531 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000532
Tim Northover6f3ff222015-10-30 16:30:27 +0000533 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000534 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000535 << OSXVersion->getAsString(Args)
536 << (iOSVersion ? iOSVersion :
537 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
538 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
539 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
540 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
541 << iOSVersion->getAsString(Args)
542 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
543 TvOSVersion = WatchOSVersion = nullptr;
544 } else if (TvOSVersion && WatchOSVersion) {
545 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
546 << TvOSVersion->getAsString(Args)
547 << WatchOSVersion->getAsString(Args);
548 WatchOSVersion = nullptr;
549 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000550 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000551 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000552 std::string OSXTarget;
553 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000554 std::string TvOSTarget;
555 std::string WatchOSTarget;
556
Chad Rosier64707fe2011-08-31 20:56:25 +0000557 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
558 OSXTarget = env;
559 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
560 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000561 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
562 TvOSTarget = env;
563 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
564 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000565
Steven Wu7a1372c2015-06-25 01:59:35 +0000566 // If there is no command-line argument to specify the Target version and
567 // no environment variable defined, see if we can set the default based
568 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000569 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Frederic Riss3ad83bd2016-01-12 23:47:59 +0000570 TvOSTarget.empty() && Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000571 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000572 StringRef isysroot = A->getValue();
Chris Bienemane60e7c22016-04-29 22:28:34 +0000573 StringRef SDK = getSDKName(isysroot);
574 if (SDK.size() > 0) {
Steven Wu7a1372c2015-06-25 01:59:35 +0000575 // Slice the version number out.
576 // Version number is between the first and the last number.
577 size_t StartVer = SDK.find_first_of("0123456789");
578 size_t EndVer = SDK.find_last_of("0123456789");
579 if (StartVer != StringRef::npos && EndVer > StartVer) {
580 StringRef Version = SDK.slice(StartVer, EndVer + 1);
581 if (SDK.startswith("iPhoneOS") ||
582 SDK.startswith("iPhoneSimulator"))
583 iOSTarget = Version;
584 else if (SDK.startswith("MacOSX"))
585 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000586 else if (SDK.startswith("WatchOS") ||
587 SDK.startswith("WatchSimulator"))
588 WatchOSTarget = Version;
589 else if (SDK.startswith("AppleTVOS") ||
590 SDK.startswith("AppleTVSimulator"))
591 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000592 }
593 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000594 }
595 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000596
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000597 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000598 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000599 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
600 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000601 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000602 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000603 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000604 MachOArchName == "arm64") {
605 getTriple().getiOSVersion(Major, Minor, Micro);
606 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
607 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000608 } else if (MachOArchName == "armv7k") {
609 getTriple().getWatchOSVersion(Major, Minor, Micro);
610 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
611 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000612 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
613 MachOArchName != "armv7em") {
614 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
615 getDriver().Diag(diag::err_drv_invalid_darwin_version)
616 << getTriple().getOSName();
617 }
618 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
619 << Micro;
620 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000621 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000622
Tim Northover6f3ff222015-10-30 16:30:27 +0000623 // Do not allow conflicts with the watchOS target.
624 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
625 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
626 << "WATCHOS_DEPLOYMENT_TARGET"
627 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
628 "TVOS_DEPLOYMENT_TARGET");
629 }
630
631 // Do not allow conflicts with the tvOS target.
632 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
633 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
634 << "TVOS_DEPLOYMENT_TARGET"
635 << "IPHONEOS_DEPLOYMENT_TARGET";
636 }
637
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000638 // Allow conflicts among OSX and iOS for historical reasons, but choose the
639 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000640 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
641 !WatchOSTarget.empty() ||
642 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000643 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000644 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000645 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000646 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000647 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000648 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000649 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000650
Chad Rosier64707fe2011-08-31 20:56:25 +0000651 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000652 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000653 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000654 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000655 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000656 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000657 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000658 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000659 } else if (!TvOSTarget.empty()) {
660 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
661 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
662 Args.append(TvOSVersion);
663 } else if (!WatchOSTarget.empty()) {
664 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
665 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
666 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000667 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000668 }
Mike Stump11289f42009-09-09 15:08:12 +0000669
Tim Northover9c7e0352013-12-12 11:55:52 +0000670 DarwinPlatformKind Platform;
671 if (OSXVersion)
672 Platform = MacOS;
673 else if (iOSVersion)
674 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000675 else if (TvOSVersion)
676 Platform = TvOS;
677 else if (WatchOSVersion)
678 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000679 else
Tim Northover157d9112014-01-16 08:48:16 +0000680 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000681
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000682 // Set the tool chain target information.
683 unsigned Major, Minor, Micro;
684 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000685 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000686 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
687 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000688 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
689 HadExtra) ||
690 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000691 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000692 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000693 } else if (Platform == IPhoneOS) {
694 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000695 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
696 HadExtra) ||
697 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000698 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000699 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000700 } else if (Platform == TvOS) {
701 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
702 Micro, HadExtra) || HadExtra ||
703 Major >= 10 || Minor >= 100 || Micro >= 100)
704 getDriver().Diag(diag::err_drv_invalid_version_number)
705 << TvOSVersion->getAsString(Args);
706 } else if (Platform == WatchOS) {
707 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
708 Micro, HadExtra) || HadExtra ||
709 Major >= 10 || Minor >= 100 || Micro >= 100)
710 getDriver().Diag(diag::err_drv_invalid_version_number)
711 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000712 } else
713 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000714
Bob Wilson7f294b52014-10-10 23:10:10 +0000715 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000716 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
717 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000718 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000719 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
720 getTriple().getArch() == llvm::Triple::x86_64))
721 Platform = TvOSSimulator;
722 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
723 getTriple().getArch() == llvm::Triple::x86_64))
724 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000725
Tim Northover9c7e0352013-12-12 11:55:52 +0000726 setTarget(Platform, Major, Minor, Micro);
Chris Bienemane60e7c22016-04-29 22:28:34 +0000727
728 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
729 StringRef SDK = getSDKName(A->getValue());
730 if (SDK.size() > 0) {
731 size_t StartVer = SDK.find_first_of("0123456789");
732 StringRef SDKName = SDK.slice(0, StartVer);
733 if (!SDKName.startswith(getPlatformFamily()))
734 getDriver().Diag(diag::warn_incompatible_sysroot)
735 << SDKName << getPlatformFamily();
736 }
737 }
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000738}
739
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000740void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000741 ArgStringList &CmdArgs) const {
742 CXXStdlibType Type = GetCXXStdlibType(Args);
743
744 switch (Type) {
745 case ToolChain::CST_Libcxx:
746 CmdArgs.push_back("-lc++");
747 break;
748
Hans Wennborgdcfba332015-10-06 23:40:43 +0000749 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000750 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
751 // it was previously found in the gcc lib dir. However, for all the Darwin
752 // platforms we care about it was -lstdc++.6, so we search for that
753 // explicitly if we can't see an obvious -lstdc++ candidate.
754
755 // Check in the sysroot first.
756 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000757 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000758 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000759
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000760 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000761 llvm::sys::path::remove_filename(P);
762 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000763 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000764 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000765 return;
766 }
767 }
768 }
769
770 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000771 // FIXME: This should be removed someday when we don't have to care about
772 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000773 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
774 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000775 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
776 return;
777 }
778
779 // Otherwise, let the linker search.
780 CmdArgs.push_back("-lstdc++");
781 break;
782 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000783}
784
Shantonu Senafeb03b2010-09-17 18:39:08 +0000785void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
786 ArgStringList &CmdArgs) const {
Shantonu Senafeb03b2010-09-17 18:39:08 +0000787 // For Darwin platforms, use the compiler-rt-based support library
788 // instead of the gcc-provided one (which is also incidentally
789 // only present in the gcc lib dir, which makes it hard to find).
790
Rafael Espindola358256c2013-06-26 02:13:00 +0000791 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000792 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000793
794 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000795 if (isTargetWatchOS()) {
796 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
797 } else if (isTargetTvOS()) {
798 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
799 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000800 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000801 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000802 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000803 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000804
Shantonu Senafeb03b2010-09-17 18:39:08 +0000805 // For now, allow missing resource libraries to support developers who may
806 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000807 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000808 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000809}
810
Tim Northover157d9112014-01-16 08:48:16 +0000811DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
812 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000813 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
814 const OptTable &Opts = getDriver().getOpts();
815
816 // FIXME: We really want to get out of the tool chain level argument
817 // translation business, as it makes the driver functionality much
818 // more opaque. For now, we follow gcc closely solely for the
819 // purpose of easily achieving feature parity & testability. Once we
820 // have something that works, we should reevaluate each translation
821 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000822
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000823 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000824 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000825 // Skip this argument unless the architecture matches either the toolchain
826 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000827 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000828 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
829 if (!(XarchArch == getArch() ||
830 (BoundArch &&
831 XarchArch ==
832 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000833 continue;
834
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000835 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000836 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000837 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000838 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000839
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000840 // If the argument parsing failed or more than one argument was
841 // consumed, the -Xarch_ argument's parameter tried to consume
842 // extra arguments. Emit an error and ignore.
843 //
844 // We also want to disallow any options which would alter the
845 // driver behavior; that isn't going to work in our model. We
846 // use isDriverOption() as an approximation, although things
847 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000848 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000849 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000850 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000851 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000852 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000853 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000854 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000855 continue;
856 }
857
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000858 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000859
Nico Webera04d5f82014-05-11 17:27:13 +0000860 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000861 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000862
863 // Linker input arguments require custom handling. The problem is that we
864 // have already constructed the phase actions, so we can not treat them as
865 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000866 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000867 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000868 for (const char *Value : A->getValues()) {
869 DAL->AddSeparateArg(
870 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000871 }
872 continue;
873 }
Mike Stump11289f42009-09-09 15:08:12 +0000874 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000875
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000876 // Sob. These is strictly gcc compatible for the time being. Apple
877 // gcc translates options twice, which means that self-expanding
878 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000879 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000880 default:
881 DAL->append(A);
882 break;
883
884 case options::OPT_mkernel:
885 case options::OPT_fapple_kext:
886 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000887 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000888 break;
Mike Stump11289f42009-09-09 15:08:12 +0000889
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000890 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000891 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000892 break;
893
894 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000895 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000896 DAL->AddFlagArg(
897 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000898 break;
899
900 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000901 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000902 DAL->AddFlagArg(
903 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000904 break;
905
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000906 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000907 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000908 break;
909
910 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000911 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000912 break;
913
914 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000915 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000916 break;
917
918 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000919 DAL->AddFlagArg(A,
920 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000921 break;
922
923 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000924 DAL->AddFlagArg(
925 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000926 break;
927
928 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000929 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000930 break;
931
932 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000933 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000934 break;
935 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000936 }
937
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000938 if (getTriple().getArch() == llvm::Triple::x86 ||
939 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000940 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000941 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
942 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000943
944 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000945 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000946 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000947 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000948 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
949 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000950
951 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
952 // which defines the list of which architectures we accept.
953 if (Name == "ppc")
954 ;
955 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000956 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000957 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000958 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000959 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000960 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000961 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000962 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000963 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000964 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000965 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000966 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000967 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000968 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000969 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000970 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000971
Bill Schmidt778d3872013-07-26 01:36:11 +0000972 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000973 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000974
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000975 else if (Name == "i386")
976 ;
977 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000978 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000979 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000980 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000981 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000982 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000983 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000984 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000985 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000986 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000987 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000988 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000989 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000990 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000991
992 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000993 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000994 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000995 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
996 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000997 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000998
999 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +00001000 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001001 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +00001002 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001003 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +00001004 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001005 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +00001006 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001007 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +00001008 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +00001009 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +00001010 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001011 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +00001012 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +00001013 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +00001014 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001015 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +00001016 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +00001017 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +00001018 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001019 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +00001020 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001021 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +00001022
Tim Northover157d9112014-01-16 08:48:16 +00001023 return DAL;
1024}
1025
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001026void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
1027 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001028 // Embedded targets are simple at the moment, not supporting sanitizers and
1029 // with different libraries for each member of the product { static, PIC } x
1030 // { hard-float, soft-float }
1031 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001032 CompilerRT +=
1033 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
1034 ? "hard"
1035 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +00001036 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
1037
1038 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
1039}
1040
Tim Northover157d9112014-01-16 08:48:16 +00001041DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
1042 const char *BoundArch) const {
1043 // First get the generic Apple args, before moving onto Darwin-specific ones.
1044 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
Tim Northoverb534ce42016-02-12 22:30:42 +00001045 const OptTable &Opts = getDriver().getOpts();
Tim Northover157d9112014-01-16 08:48:16 +00001046
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001047 // If no architecture is bound, none of the translations here are relevant.
1048 if (!BoundArch)
1049 return DAL;
1050
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001051 // Add an explicit version min argument for the deployment target. We do this
1052 // after argument translation because -Xarch_ arguments may add a version min
1053 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001054 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001055
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001056 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
1057 // FIXME: It would be far better to avoid inserting those -static arguments,
1058 // but we can't check the deployment target in the translation code until
1059 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +00001060 if (isTargetWatchOSBased() ||
1061 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1062 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001063 Arg *A = *it;
1064 ++it;
1065 if (A->getOption().getID() != options::OPT_mkernel &&
1066 A->getOption().getID() != options::OPT_fapple_kext)
1067 continue;
1068 assert(it != ie && "unexpected argument translation");
1069 A = *it;
1070 assert(A->getOption().getID() == options::OPT_static &&
1071 "missing expected -static argument");
1072 it = DAL->getArgs().erase(it);
1073 }
1074 }
1075
Tim Northoverb534ce42016-02-12 22:30:42 +00001076 if (!Args.getLastArg(options::OPT_stdlib_EQ) &&
Tim Northover3a098c12016-02-15 16:38:10 +00001077 GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
Tim Northoverb534ce42016-02-12 22:30:42 +00001078 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1079 "libc++");
1080
Bob Wilson102be442011-10-07 17:54:41 +00001081 // Validate the C++ standard library choice.
1082 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1083 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001084 // Check whether the target provides libc++.
1085 StringRef where;
1086
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001087 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001088 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001089 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001090
1091 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001092 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001093 }
1094 }
1095
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001096 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001097}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001098
Tim Northover157d9112014-01-16 08:48:16 +00001099bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001100 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001101}
1102
Tim Northover157d9112014-01-16 08:48:16 +00001103bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001104 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1105 return S[0] != '\0';
1106 return false;
1107}
1108
Tim Northovere931f9f2015-10-30 16:30:41 +00001109bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001110 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001111 if (getTriple().getArch() != llvm::Triple::arm &&
1112 getTriple().getArch() != llvm::Triple::thumb)
1113 return false;
1114
Tim Northoverc741b042015-11-17 18:27:27 +00001115 // Only watchOS uses the new DWARF/Compact unwinding method.
Tim Northoverd88ecb32016-01-27 19:32:40 +00001116 llvm::Triple Triple(ComputeLLVMTriple(Args));
Tim Northover4c9ac7d2016-01-27 22:14:02 +00001117 return !Triple.isWatchABI();
Daniel Dunbar3241d402010-02-10 18:49:11 +00001118}
1119
Steven Wu574b0f22016-03-01 01:07:58 +00001120bool Darwin::SupportsEmbeddedBitcode() const {
1121 assert(TargetInitialized && "Target not initialized!");
1122 if (isTargetIPhoneOS() && isIPhoneOSVersionLT(6, 0))
1123 return false;
1124 return true;
1125}
1126
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001127bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001128
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001129bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001130
Tim Northover157d9112014-01-16 08:48:16 +00001131bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001132 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001133 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001134}
1135
Tim Northover157d9112014-01-16 08:48:16 +00001136bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001137 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001138 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001139}
1140
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001141void Darwin::addMinVersionArgs(const ArgList &Args,
1142 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001143 VersionTuple TargetVersion = getTargetVersion();
1144
Tim Northover6f3ff222015-10-30 16:30:27 +00001145 if (isTargetWatchOS())
1146 CmdArgs.push_back("-watchos_version_min");
1147 else if (isTargetWatchOSSimulator())
1148 CmdArgs.push_back("-watchos_simulator_version_min");
1149 else if (isTargetTvOS())
1150 CmdArgs.push_back("-tvos_version_min");
1151 else if (isTargetTvOSSimulator())
1152 CmdArgs.push_back("-tvos_simulator_version_min");
1153 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001154 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001155 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001156 CmdArgs.push_back("-iphoneos_version_min");
1157 else {
1158 assert(isTargetMacOS() && "unexpected target");
1159 CmdArgs.push_back("-macosx_version_min");
1160 }
1161
1162 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1163}
1164
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001165void Darwin::addStartObjectFileArgs(const ArgList &Args,
1166 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001167 // Derived from startfile spec.
1168 if (Args.hasArg(options::OPT_dynamiclib)) {
1169 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001170 if (isTargetWatchOSBased()) {
1171 ; // watchOS does not need dylib1.o.
1172 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001173 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001174 } else if (isTargetIPhoneOS()) {
1175 if (isIPhoneOSVersionLT(3, 1))
1176 CmdArgs.push_back("-ldylib1.o");
1177 } else {
1178 if (isMacosxVersionLT(10, 5))
1179 CmdArgs.push_back("-ldylib1.o");
1180 else if (isMacosxVersionLT(10, 6))
1181 CmdArgs.push_back("-ldylib1.10.5.o");
1182 }
1183 } else {
1184 if (Args.hasArg(options::OPT_bundle)) {
1185 if (!Args.hasArg(options::OPT_static)) {
1186 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001187 if (isTargetWatchOSBased()) {
1188 ; // watchOS does not need bundle1.o.
1189 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001190 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001191 } else if (isTargetIPhoneOS()) {
1192 if (isIPhoneOSVersionLT(3, 1))
1193 CmdArgs.push_back("-lbundle1.o");
1194 } else {
1195 if (isMacosxVersionLT(10, 6))
1196 CmdArgs.push_back("-lbundle1.o");
1197 }
1198 }
1199 } else {
1200 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1201 if (Args.hasArg(options::OPT_static) ||
1202 Args.hasArg(options::OPT_object) ||
1203 Args.hasArg(options::OPT_preload)) {
1204 CmdArgs.push_back("-lgcrt0.o");
1205 } else {
1206 CmdArgs.push_back("-lgcrt1.o");
1207
1208 // darwin_crt2 spec is empty.
1209 }
1210 // By default on OS X 10.8 and later, we don't link with a crt1.o
1211 // file and the linker knows to use _main as the entry point. But,
1212 // when compiling with -pg, we need to link with the gcrt1.o file,
1213 // so pass the -no_new_main option to tell the linker to use the
1214 // "start" symbol as the entry point.
1215 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1216 CmdArgs.push_back("-no_new_main");
1217 } else {
1218 if (Args.hasArg(options::OPT_static) ||
1219 Args.hasArg(options::OPT_object) ||
1220 Args.hasArg(options::OPT_preload)) {
1221 CmdArgs.push_back("-lcrt0.o");
1222 } else {
1223 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001224 if (isTargetWatchOSBased()) {
1225 ; // watchOS does not need crt1.o.
1226 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001227 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001228 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001229 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001230 ; // iOS does not need any crt1 files for arm64
1231 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001232 CmdArgs.push_back("-lcrt1.o");
1233 else if (isIPhoneOSVersionLT(6, 0))
1234 CmdArgs.push_back("-lcrt1.3.1.o");
1235 } else {
1236 if (isMacosxVersionLT(10, 5))
1237 CmdArgs.push_back("-lcrt1.o");
1238 else if (isMacosxVersionLT(10, 6))
1239 CmdArgs.push_back("-lcrt1.10.5.o");
1240 else if (isMacosxVersionLT(10, 8))
1241 CmdArgs.push_back("-lcrt1.10.6.o");
1242
1243 // darwin_crt2 spec is empty.
1244 }
1245 }
1246 }
1247 }
1248 }
1249
1250 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001251 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001252 isMacosxVersionLT(10, 5)) {
1253 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1254 CmdArgs.push_back(Str);
1255 }
1256}
1257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001258bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001259
John McCall3deb1ad2012-08-21 02:47:43 +00001260void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001261 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1262 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001263 return;
John McCall93207072012-08-27 01:56:21 +00001264 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001265}
1266
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001267SanitizerMask Darwin::getSupportedSanitizers() const {
Devin Coughlinfcfa38c2016-03-20 18:24:33 +00001268 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001269 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Anna Zakse67b4022016-02-02 02:04:48 +00001270 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001271 if (isTargetMacOS()) {
1272 if (!isMacosxVersionLT(10, 9))
1273 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001274 Res |= SanitizerKind::SafeStack;
Devin Coughlinfcfa38c2016-03-20 18:24:33 +00001275 if (IsX86_64)
1276 Res |= SanitizerKind::Thread;
1277 } else if (isTargetIOSSimulator() || isTargetTvOSSimulator()) {
1278 if (IsX86_64)
1279 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001280 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001281 return Res;
1282}
1283
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001284/// Generic_GCC - A tool chain using the 'gcc' command to perform
1285/// all subcommands; this relies on gcc translating the majority of
1286/// command line options.
1287
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001288/// \brief Parse a GCCVersion object out of a string of text.
1289///
1290/// This is the primary means of forming GCCVersion objects.
1291/*static*/
1292Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001293 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001294 std::pair<StringRef, StringRef> First = VersionText.split('.');
1295 std::pair<StringRef, StringRef> Second = First.second.split('.');
1296
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001297 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1298 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001299 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001300 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001301 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001302 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001303 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001304
1305 // First look for a number prefix and parse that if present. Otherwise just
1306 // stash the entire patch string in the suffix, and leave the number
1307 // unspecified. This covers versions strings such as:
1308 // 4.4
1309 // 4.4.0
1310 // 4.4.x
1311 // 4.4.2-rc4
1312 // 4.4.x-patched
1313 // And retains any patch number it finds.
1314 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1315 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001316 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001317 // Try to parse the number and any suffix.
1318 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1319 GoodVersion.Patch < 0)
1320 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001321 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001322 }
1323 }
1324
1325 return GoodVersion;
1326}
1327
1328/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001329bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1330 int RHSPatch,
1331 StringRef RHSPatchSuffix) const {
1332 if (Major != RHSMajor)
1333 return Major < RHSMajor;
1334 if (Minor != RHSMinor)
1335 return Minor < RHSMinor;
1336 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001337 // Note that versions without a specified patch sort higher than those with
1338 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001339 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001340 return true;
1341 if (Patch == -1)
1342 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001343
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001344 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001345 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001346 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001347 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001348 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001349 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001350 return true;
1351 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001352 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001353
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001354 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001355 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001356 }
1357
1358 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001359 return false;
1360}
1361
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001362static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001363 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1364 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001365 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001366 return GCC_INSTALL_PREFIX;
1367}
1368
Roman Divacky326d9982013-12-06 18:32:18 +00001369/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001370///
1371/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001372/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001373///
1374/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1375/// should instead pull the target out of the driver. This is currently
1376/// necessary because the driver doesn't store the final version of the target
1377/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001378void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001379 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001380 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001381 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1382 ? TargetTriple.get64BitArchVariant()
1383 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001384 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001385 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001386 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001387 SmallVector<StringRef, 16> CandidateTripleAliases;
1388 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001389 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1390 CandidateTripleAliases, CandidateBiarchLibDirs,
1391 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001392
1393 // Compute the set of prefixes for our search.
1394 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1395 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001396
Rafael Espindola1af7c212012-02-19 01:38:32 +00001397 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1398 if (GCCToolchainDir != "") {
1399 if (GCCToolchainDir.back() == '/')
1400 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001401
Rafael Espindola1af7c212012-02-19 01:38:32 +00001402 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001403 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001404 // If we have a SysRoot, try that first.
1405 if (!D.SysRoot.empty()) {
1406 Prefixes.push_back(D.SysRoot);
1407 Prefixes.push_back(D.SysRoot + "/usr");
1408 }
1409
1410 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001411 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001412
Rafael Espindola2edca412016-05-09 13:03:10 +00001413 // Then look for distribution supplied gcc installations.
1414 if (D.SysRoot.empty()) {
1415 // Look for RHEL devtoolsets.
1416 Prefixes.push_back("/opt/rh/devtoolset-4/root/usr");
1417 Prefixes.push_back("/opt/rh/devtoolset-3/root/usr");
1418 Prefixes.push_back("/opt/rh/devtoolset-2/root/usr");
1419 Prefixes.push_back("/opt/rh/devtoolset-1.1/root/usr");
1420 Prefixes.push_back("/opt/rh/devtoolset-1.0/root/usr");
1421 // And finally in /usr.
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001422 Prefixes.push_back("/usr");
Rafael Espindola2edca412016-05-09 13:03:10 +00001423 }
Rafael Espindolac29af942012-02-03 01:01:20 +00001424 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001425
1426 // Loop over the various components which exist and select the best GCC
1427 // installation available. GCC installs are ranked by version number.
1428 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001429 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001430 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001431 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001432 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001433 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001434 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001435 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001436 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001437 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001438 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001439 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001440 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001441 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001442 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001443 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001444 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001445 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001446 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001447 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001448 }
1449 }
1450}
1451
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001452void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001453 for (const auto &InstallPath : CandidateGCCInstallPaths)
1454 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001455
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001456 if (!GCCInstallPath.empty())
1457 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1458
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001459 for (const auto &Multilib : Multilibs)
1460 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001461
1462 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1463 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001464}
1465
1466bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1467 if (BiarchSibling.hasValue()) {
1468 M = BiarchSibling.getValue();
1469 return true;
1470 }
1471 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001472}
1473
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001474/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001475 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001476 SmallVectorImpl<StringRef> &LibDirs,
1477 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001478 SmallVectorImpl<StringRef> &BiarchLibDirs,
1479 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001480 // Declare a bunch of static data sets that we'll select between below. These
1481 // are specifically designed to always refer to string literals to avoid any
1482 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001483 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1484 static const char *const AArch64Triples[] = {
1485 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1486 "aarch64-redhat-linux"};
1487 static const char *const AArch64beLibDirs[] = {"/lib"};
1488 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1489 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001490
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001491 static const char *const ARMLibDirs[] = {"/lib"};
1492 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1493 "arm-linux-androideabi"};
1494 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1495 "armv7hl-redhat-linux-gnueabi"};
1496 static const char *const ARMebLibDirs[] = {"/lib"};
1497 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1498 "armeb-linux-androideabi"};
1499 static const char *const ARMebHFTriples[] = {
1500 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001501
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001502 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001503 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001504 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1505 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1506 "x86_64-redhat-linux", "x86_64-suse-linux",
1507 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1508 "x86_64-slackware-linux", "x86_64-linux-android",
1509 "x86_64-unknown-linux"};
1510 static const char *const X32LibDirs[] = {"/libx32"};
1511 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001512 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001513 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1514 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1515 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1516 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1517 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001518
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001519 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001520 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1521 "mips-mti-linux-gnu",
1522 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001523 static const char *const MIPSELLibDirs[] = {"/lib"};
1524 static const char *const MIPSELTriples[] = {
1525 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001526
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001527 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1528 static const char *const MIPS64Triples[] = {
1529 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1530 "mips64-linux-gnuabi64"};
1531 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1532 static const char *const MIPS64ELTriples[] = {
1533 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1534 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001535
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001536 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001537 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001538 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1539 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1540 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1541 static const char *const PPC64Triples[] = {
1542 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1543 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1544 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1545 static const char *const PPC64LETriples[] = {
1546 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1547 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001548
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001549 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1550 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1551 "sparcv8-linux-gnu"};
1552 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1553 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1554 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001555
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001556 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001557 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001558 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1559 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001560
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001561 // Solaris.
1562 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1563 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1564 "i386-pc-solaris2.11"};
1565
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001566 using std::begin;
1567 using std::end;
1568
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001569 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1570 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1571 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001572 return;
1573 }
1574
Chandler Carruth866faab2012-01-25 07:21:38 +00001575 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001576 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001577 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1578 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1579 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1580 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001581 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001582 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001583 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1584 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1585 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1586 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001587 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001588 case llvm::Triple::arm:
1589 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001590 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001591 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001592 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001593 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001594 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001595 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001596 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001597 case llvm::Triple::armeb:
1598 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001599 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001600 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001601 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001602 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001603 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001604 }
1605 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001606 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001607 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1608 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1609 // x32 is always available when x86_64 is available, so adding it as
1610 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001611 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001612 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1613 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001614 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001615 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1616 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001617 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001618 break;
1619 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001620 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001621 // MCU toolchain is 32 bit only and its triple alias is TargetTriple
1622 // itself, which will be appended below.
1623 if (!TargetTriple.isOSIAMCU()) {
1624 TripleAliases.append(begin(X86Triples), end(X86Triples));
1625 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1626 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1627 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001628 break;
1629 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001630 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1631 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1632 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1633 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001634 break;
1635 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001636 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1637 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1638 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1639 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1640 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001641 break;
1642 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001643 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1644 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1645 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1646 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001647 break;
1648 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001649 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1650 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1651 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1652 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1653 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001654 break;
1655 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001656 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1657 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1658 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1659 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001660 break;
1661 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001662 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1663 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1664 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1665 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001666 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001667 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001668 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1669 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001670 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001671 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001672 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001673 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1674 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1675 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1676 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001677 break;
1678 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001679 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1680 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1681 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1682 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001683 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001684 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001685 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1686 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001687 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001688 default:
1689 // By default, just rely on the standard lib directories and the original
1690 // triple.
1691 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001692 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001693
1694 // Always append the drivers target triple to the end, in case it doesn't
1695 // match any of our aliases.
1696 TripleAliases.push_back(TargetTriple.str());
1697
1698 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001699 if (TargetTriple.str() != BiarchTriple.str())
1700 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001701}
1702
Artem Belevich98607b62015-09-23 21:49:39 +00001703// \brief -- try common CUDA installation paths looking for files we need for
1704// CUDA compilation.
1705
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001706void Generic_GCC::CudaInstallationDetector::init(
1707 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001708 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001709
1710 if (Args.hasArg(options::OPT_cuda_path_EQ))
1711 CudaPathCandidates.push_back(
1712 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1713 else {
1714 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
Artem Belevich86017332015-11-17 22:28:55 +00001715 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001716 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1717 }
1718
Benjamin Kramere8b76412015-09-24 14:48:37 +00001719 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001720 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001721 continue;
1722
1723 CudaInstallPath = CudaPath;
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001724 CudaBinPath = CudaPath + "/bin";
Artem Belevich98607b62015-09-23 21:49:39 +00001725 CudaIncludePath = CudaInstallPath + "/include";
1726 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1727 CudaLibPath =
1728 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1729
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001730 if (!(D.getVFS().exists(CudaIncludePath) &&
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001731 D.getVFS().exists(CudaBinPath) && D.getVFS().exists(CudaLibPath) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001732 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001733 continue;
1734
Artem Belevich34f481a2015-11-17 22:28:50 +00001735 std::error_code EC;
1736 for (llvm::sys::fs::directory_iterator LI(CudaLibDevicePath, EC), LE;
1737 !EC && LI != LE; LI = LI.increment(EC)) {
1738 StringRef FilePath = LI->path();
1739 StringRef FileName = llvm::sys::path::filename(FilePath);
1740 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1741 const StringRef LibDeviceName = "libdevice.";
1742 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1743 continue;
1744 StringRef GpuArch = FileName.slice(
1745 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
1746 CudaLibDeviceMap[GpuArch] = FilePath.str();
1747 // Insert map entries for specifc devices with this compute capability.
1748 if (GpuArch == "compute_20") {
1749 CudaLibDeviceMap["sm_20"] = FilePath;
1750 CudaLibDeviceMap["sm_21"] = FilePath;
1751 } else if (GpuArch == "compute_30") {
1752 CudaLibDeviceMap["sm_30"] = FilePath;
1753 CudaLibDeviceMap["sm_32"] = FilePath;
1754 } else if (GpuArch == "compute_35") {
1755 CudaLibDeviceMap["sm_35"] = FilePath;
1756 CudaLibDeviceMap["sm_37"] = FilePath;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001757 } else if (GpuArch == "compute_50") {
1758 CudaLibDeviceMap["sm_50"] = FilePath;
1759 CudaLibDeviceMap["sm_52"] = FilePath;
1760 CudaLibDeviceMap["sm_53"] = FilePath;
Artem Belevich34f481a2015-11-17 22:28:50 +00001761 }
1762 }
1763
Artem Belevich98607b62015-09-23 21:49:39 +00001764 IsValid = true;
1765 break;
1766 }
1767}
1768
1769void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1770 if (isValid())
1771 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1772}
1773
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001774namespace {
1775// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001776class FilterNonExistent {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001777 StringRef Base, File;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001778 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001779
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001780public:
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001781 FilterNonExistent(StringRef Base, StringRef File, vfs::FileSystem &VFS)
1782 : Base(Base), File(File), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001783 bool operator()(const Multilib &M) {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001784 return !VFS.exists(Base + M.gccSuffix() + File);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001785 }
1786};
1787} // end anonymous namespace
1788
1789static void addMultilibFlag(bool Enabled, const char *const Flag,
1790 std::vector<std::string> &Flags) {
1791 if (Enabled)
1792 Flags.push_back(std::string("+") + Flag);
1793 else
1794 Flags.push_back(std::string("-") + Flag);
1795}
1796
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00001797static bool isArmOrThumbArch(llvm::Triple::ArchType Arch) {
1798 return Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb;
1799}
1800
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001801static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001802 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1803 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1804}
1805
1806static bool isMips32(llvm::Triple::ArchType Arch) {
1807 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1808}
1809
1810static bool isMips64(llvm::Triple::ArchType Arch) {
1811 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1812}
1813
1814static bool isMipsEL(llvm::Triple::ArchType Arch) {
1815 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1816}
1817
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001818static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001819 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001820 return A && A->getOption().matches(options::OPT_mips16);
1821}
1822
1823static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001824 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001825 return A && A->getOption().matches(options::OPT_mmicromips);
1826}
1827
Benjamin Kramere003ca22015-10-28 13:54:16 +00001828namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001829struct DetectedMultilibs {
1830 /// The set of multilibs that the detected installation supports.
1831 MultilibSet Multilibs;
1832
1833 /// The primary multilib appropriate for the given flags.
1834 Multilib SelectedMultilib;
1835
1836 /// On Biarch systems, this corresponds to the default multilib when
1837 /// targeting the non-default multilib. Otherwise, it is empty.
1838 llvm::Optional<Multilib> BiarchSibling;
1839};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001840} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001841
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001842static Multilib makeMultilib(StringRef commonSuffix) {
1843 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1844}
1845
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001846static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1847 StringRef Path, const ArgList &Args,
1848 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001849 // Some MIPS toolchains put libraries and object files compiled
1850 // using different options in to the sub-directoris which names
1851 // reflects the flags used for compilation. For example sysroot
1852 // directory might looks like the following examples:
1853 //
1854 // /usr
1855 // /lib <= crt*.o files compiled with '-mips32'
1856 // /mips16
1857 // /usr
1858 // /lib <= crt*.o files compiled with '-mips16'
1859 // /el
1860 // /usr
1861 // /lib <= crt*.o files compiled with '-mips16 -EL'
1862 //
1863 // or
1864 //
1865 // /usr
1866 // /lib <= crt*.o files compiled with '-mips32r2'
1867 // /mips16
1868 // /usr
1869 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1870 // /mips32
1871 // /usr
1872 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001873
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001874 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001875
Simon Atanasyancf7ac672016-05-22 15:27:58 +00001876 // Check for CodeScape MTI toolchain v1.2 and early.
1877 MultilibSet MtiMipsMultilibsV1;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001878 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001879 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001880 .flag("+m32")
1881 .flag("-m64")
1882 .flag("-mmicromips")
1883 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001884
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001885 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001886 .flag("+m32")
1887 .flag("-m64")
1888 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001889
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001890 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001891 .flag("-m32")
1892 .flag("+m64")
1893 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001894
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001895 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1896 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001897
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001898 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001899 .flag("+m32")
1900 .flag("-m64")
1901 .flag("-mmicromips")
1902 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001903
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001904 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001905
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001906 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001907
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001908 auto MAbi64 =
1909 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001910
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001911 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001912
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001913 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001914
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001915 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001916
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001917 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001918
Simon Atanasyancf7ac672016-05-22 15:27:58 +00001919 MtiMipsMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001920 MultilibSet()
1921 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1922 MArchDefault)
1923 .Maybe(UCLibc)
1924 .Maybe(Mips16)
1925 .FilterOut("/mips64/mips16")
1926 .FilterOut("/mips64r2/mips16")
1927 .FilterOut("/micromips/mips16")
1928 .Maybe(MAbi64)
1929 .FilterOut("/micromips/64")
1930 .FilterOut("/mips32/64")
1931 .FilterOut("^/64")
1932 .FilterOut("/mips16/64")
1933 .Either(BigEndian, LittleEndian)
1934 .Maybe(SoftFloat)
1935 .Maybe(Nan2008)
1936 .FilterOut(".*sof/nan2008")
1937 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00001938 .setIncludeDirsCallback([](const Multilib &M) {
1939 std::vector<std::string> Dirs({"/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001940 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
Simon Atanasyana45502d2016-05-19 15:07:21 +00001941 Dirs.push_back("/../../../../sysroot/uclibc/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001942 else
Simon Atanasyana45502d2016-05-19 15:07:21 +00001943 Dirs.push_back("/../../../../sysroot/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001944 return Dirs;
1945 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001946 }
1947
Simon Atanasyan2834a222016-05-22 18:18:07 +00001948 // Check for CodeScape IMG toolchain starting from v1.3.
1949 MultilibSet MtiMipsMultilibsV2;
1950 {
1951 auto BeHard = makeMultilib("/mips-r2-hard")
1952 .flag("+EB")
1953 .flag("-msoft-float")
1954 .flag("-mnan=2008")
1955 .flag("-muclibc");
1956 auto BeSoft = makeMultilib("/mips-r2-soft")
1957 .flag("+EB")
1958 .flag("+msoft-float")
1959 .flag("-mnan=2008");
1960 auto ElHard = makeMultilib("/mipsel-r2-hard")
1961 .flag("+EL")
1962 .flag("-msoft-float")
1963 .flag("-mnan=2008")
1964 .flag("-muclibc");
1965 auto ElSoft = makeMultilib("/mipsel-r2-soft")
1966 .flag("+EL")
1967 .flag("+msoft-float")
1968 .flag("-mnan=2008")
1969 .flag("-mmicromips");
1970 auto BeHardNan = makeMultilib("/mips-r2-hard-nan2008")
1971 .flag("+EB")
1972 .flag("-msoft-float")
1973 .flag("+mnan=2008")
1974 .flag("-muclibc");
1975 auto ElHardNan = makeMultilib("/mipsel-r2-hard-nan2008")
1976 .flag("+EL")
1977 .flag("-msoft-float")
1978 .flag("+mnan=2008")
1979 .flag("-muclibc")
1980 .flag("-mmicromips");
1981 auto BeHardNanUclibc = makeMultilib("/mips-r2-hard-nan2008-uclibc")
1982 .flag("+EB")
1983 .flag("-msoft-float")
1984 .flag("+mnan=2008")
1985 .flag("+muclibc");
1986 auto ElHardNanUclibc = makeMultilib("/mipsel-r2-hard-nan2008-uclibc")
1987 .flag("+EL")
1988 .flag("-msoft-float")
1989 .flag("+mnan=2008")
1990 .flag("+muclibc");
1991 auto BeHardUclibc = makeMultilib("/mips-r2-hard-uclibc")
1992 .flag("+EB")
1993 .flag("-msoft-float")
1994 .flag("-mnan=2008")
1995 .flag("+muclibc");
1996 auto ElHardUclibc = makeMultilib("/mipsel-r2-hard-uclibc")
1997 .flag("+EL")
1998 .flag("-msoft-float")
1999 .flag("-mnan=2008")
2000 .flag("+muclibc");
2001 auto ElMicroHardNan = makeMultilib("/micromipsel-r2-hard-nan2008")
2002 .flag("+EL")
2003 .flag("-msoft-float")
2004 .flag("+mnan=2008")
2005 .flag("+mmicromips");
2006 auto ElMicroSoft = makeMultilib("/micromipsel-r2-soft")
2007 .flag("+EL")
2008 .flag("+msoft-float")
2009 .flag("-mnan=2008")
2010 .flag("+mmicromips");
2011
2012 auto O32 =
2013 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2014 auto N32 =
2015 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2016 auto N64 =
2017 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2018
2019 MtiMipsMultilibsV2 =
2020 MultilibSet()
2021 .Either({BeHard, BeSoft, ElHard, ElSoft, BeHardNan, ElHardNan,
2022 BeHardNanUclibc, ElHardNanUclibc, BeHardUclibc,
2023 ElHardUclibc, ElMicroHardNan, ElMicroSoft})
2024 .Either(O32, N32, N64)
2025 .FilterOut(NonExistent)
2026 .setIncludeDirsCallback([](const Multilib &M) {
2027 return std::vector<std::string>({"/../../../../sysroot" +
2028 M.includeSuffix() +
2029 "/../usr/include"});
2030 })
2031 .setFilePathsCallback([](const Multilib &M) {
2032 return std::vector<std::string>(
2033 {"/../../../../mips-mti-linux-gnu/lib" + M.gccSuffix()});
2034 });
2035 }
2036
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002037 // Check for Musl toolchain multilibs
2038 MultilibSet MuslMipsMultilibs;
2039 {
2040 auto MArchMipsR2 = makeMultilib("")
2041 .osSuffix("/mips-r2-hard-musl")
2042 .flag("+EB")
2043 .flag("-EL")
2044 .flag("+march=mips32r2");
2045
2046 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
2047 .flag("-EB")
2048 .flag("+EL")
2049 .flag("+march=mips32r2");
2050
2051 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
2052
2053 // Specify the callback that computes the include directories.
Simon Atanasyana45502d2016-05-19 15:07:21 +00002054 MuslMipsMultilibs.setIncludeDirsCallback([](const Multilib &M) {
2055 return std::vector<std::string>(
2056 {"/../sysroot" + M.osSuffix() + "/usr/include"});
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002057 });
2058 }
2059
Simon Atanasyan4de8e6d2016-05-28 09:44:04 +00002060 // Check for Code Sourcery toolchain multilibs
2061 MultilibSet CSMipsMultilibs;
2062 {
2063 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
2064
2065 auto MArchMicroMips =
2066 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
2067
2068 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
2069
2070 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
2071
2072 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
2073
2074 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
2075
2076 auto DefaultFloat =
2077 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
2078
2079 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
2080
2081 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
2082
2083 // Note that this one's osSuffix is ""
2084 auto MAbi64 = makeMultilib("")
2085 .gccSuffix("/64")
2086 .includeSuffix("/64")
2087 .flag("+mabi=n64")
2088 .flag("-mabi=n32")
2089 .flag("-m32");
2090
2091 CSMipsMultilibs =
2092 MultilibSet()
2093 .Either(MArchMips16, MArchMicroMips, MArchDefault)
2094 .Maybe(UCLibc)
2095 .Either(SoftFloat, Nan2008, DefaultFloat)
2096 .FilterOut("/micromips/nan2008")
2097 .FilterOut("/mips16/nan2008")
2098 .Either(BigEndian, LittleEndian)
2099 .Maybe(MAbi64)
2100 .FilterOut("/mips16.*/64")
2101 .FilterOut("/micromips.*/64")
2102 .FilterOut(NonExistent)
2103 .setIncludeDirsCallback([](const Multilib &M) {
2104 std::vector<std::string> Dirs({"/include"});
2105 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
2106 Dirs.push_back(
2107 "/../../../../mips-linux-gnu/libc/uclibc/usr/include");
2108 else
2109 Dirs.push_back("/../../../../mips-linux-gnu/libc/usr/include");
2110 return Dirs;
2111 });
2112 }
2113
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002114 MultilibSet AndroidMipsMultilibs =
2115 MultilibSet()
2116 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
2117 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
2118 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002119
2120 MultilibSet DebianMipsMultilibs;
2121 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002122 Multilib MAbiN32 =
2123 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002124
2125 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002126 .gccSuffix("/64")
2127 .includeSuffix("/64")
2128 .flag("+m64")
2129 .flag("-m32")
2130 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002131
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002132 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002133
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002134 DebianMipsMultilibs =
2135 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002136 }
2137
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002138 // Check for CodeScape IMG toolchain v1.2 and early.
2139 MultilibSet ImgMultilibsV1;
Daniel Sanders2bf13662014-07-10 14:40:57 +00002140 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002141 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002142
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002143 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002144
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002145 auto MAbi64 =
2146 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002147
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002148 ImgMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002149 MultilibSet()
2150 .Maybe(Mips64r6)
2151 .Maybe(MAbi64)
2152 .Maybe(LittleEndian)
2153 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002154 .setIncludeDirsCallback([](const Multilib &M) {
2155 return std::vector<std::string>(
2156 {"/include", "/../../../../sysroot/usr/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002157 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002158 }
2159
Simon Atanasyan2834a222016-05-22 18:18:07 +00002160 // Check for CodeScape IMG toolchain starting from v1.3.
2161 MultilibSet ImgMultilibsV2;
2162 {
2163 auto BeHard = makeMultilib("/mips-r6-hard")
2164 .flag("+EB")
2165 .flag("-msoft-float")
2166 .flag("-mmicromips");
2167 auto BeSoft = makeMultilib("/mips-r6-soft")
2168 .flag("+EB")
2169 .flag("+msoft-float")
2170 .flag("-mmicromips");
2171 auto ElHard = makeMultilib("/mipsel-r6-hard")
2172 .flag("+EL")
2173 .flag("-msoft-float")
2174 .flag("-mmicromips");
2175 auto ElSoft = makeMultilib("/mipsel-r6-soft")
2176 .flag("+EL")
2177 .flag("+msoft-float")
2178 .flag("-mmicromips");
2179 auto BeMicroHard = makeMultilib("/micromips-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002180 .flag("+EB")
2181 .flag("-msoft-float")
2182 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002183 auto BeMicroSoft = makeMultilib("/micromips-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002184 .flag("+EB")
2185 .flag("+msoft-float")
2186 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002187 auto ElMicroHard = makeMultilib("/micromipsel-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002188 .flag("+EL")
2189 .flag("-msoft-float")
2190 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002191 auto ElMicroSoft = makeMultilib("/micromipsel-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002192 .flag("+EL")
2193 .flag("+msoft-float")
2194 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002195
2196 auto O32 =
2197 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2198 auto N32 =
2199 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2200 auto N64 =
2201 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2202
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002203 ImgMultilibsV2 =
2204 MultilibSet()
2205 .Either({BeHard, BeSoft, ElHard, ElSoft, BeMicroHard, BeMicroSoft,
2206 ElMicroHard, ElMicroSoft})
2207 .Either(O32, N32, N64)
2208 .FilterOut(NonExistent)
2209 .setIncludeDirsCallback([](const Multilib &M) {
2210 return std::vector<std::string>({"/../../../../sysroot" +
2211 M.includeSuffix() +
2212 "/../usr/include"});
2213 })
2214 .setFilePathsCallback([](const Multilib &M) {
2215 return std::vector<std::string>(
2216 {"/../../../../mips-img-linux-gnu/lib" + M.gccSuffix()});
2217 });
Simon Atanasyan2834a222016-05-22 18:18:07 +00002218 }
2219
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002220 StringRef CPUName;
2221 StringRef ABIName;
2222 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2223
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002224 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2225
2226 Multilib::flags_list Flags;
2227 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2228 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2229 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002230 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002231 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002232 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002233 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002234 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002235 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002236 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2237 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002238 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002239 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002240 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002241 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2242 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002243 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2244 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002245 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002246 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002247 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002248 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002249
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002250 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002251 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00002252 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2253 Result.Multilibs = AndroidMipsMultilibs;
2254 return true;
2255 }
2256 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002257 }
2258
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002259 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2260 TargetTriple.getOS() == llvm::Triple::Linux &&
2261 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2262 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2263 Result.Multilibs = MuslMipsMultilibs;
2264 return true;
2265 }
2266 return false;
2267 }
2268
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002269 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2270 TargetTriple.getOS() == llvm::Triple::Linux &&
2271 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2272 // Select mips-mti-linux-gnu toolchain.
Simon Atanasyan96d06c62016-05-28 09:44:15 +00002273 for (auto Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
2274 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2275 Result.Multilibs = *Candidate;
Simon Atanasyan2834a222016-05-22 18:18:07 +00002276 return true;
2277 }
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002278 }
2279 return false;
2280 }
2281
Daniel Sanders2bf13662014-07-10 14:40:57 +00002282 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2283 TargetTriple.getOS() == llvm::Triple::Linux &&
2284 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2285 // Select mips-img-linux-gnu toolchain.
Simon Atanasyan96d06c62016-05-28 09:44:15 +00002286 for (auto Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
2287 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2288 Result.Multilibs = *Candidate;
Simon Atanasyan2834a222016-05-22 18:18:07 +00002289 return true;
2290 }
Daniel Sanders2bf13662014-07-10 14:40:57 +00002291 }
2292 return false;
2293 }
2294
Simon Atanasyan4de8e6d2016-05-28 09:44:04 +00002295 // Sort candidates. Toolchain that best meets the directories tree goes first.
2296 // Then select the first toolchains matches command line flags.
2297 MultilibSet *Candidates[] = {&CSMipsMultilibs, &DebianMipsMultilibs};
2298 if (CSMipsMultilibs.size() < DebianMipsMultilibs.size())
2299 std::iter_swap(Candidates, Candidates + 1);
2300 for (const MultilibSet *Candidate : Candidates) {
2301 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2302 if (Candidate == &DebianMipsMultilibs)
2303 Result.BiarchSibling = Multilib();
2304 Result.Multilibs = *Candidate;
2305 return true;
2306 }
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002307 }
2308
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002309 {
2310 // Fallback to the regular toolchain-tree structure.
2311 Multilib Default;
2312 Result.Multilibs.push_back(Default);
2313 Result.Multilibs.FilterOut(NonExistent);
2314
2315 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2316 Result.BiarchSibling = Multilib();
2317 return true;
2318 }
2319 }
2320
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002321 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002322}
2323
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002324static void findAndroidArmMultilibs(const Driver &D,
2325 const llvm::Triple &TargetTriple,
2326 StringRef Path, const ArgList &Args,
2327 DetectedMultilibs &Result) {
2328 // Find multilibs with subdirectories like armv7-a, thumb, armv7-a/thumb.
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002329 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002330 Multilib ArmV7Multilib = makeMultilib("/armv7-a")
2331 .flag("+armv7")
2332 .flag("-thumb");
2333 Multilib ThumbMultilib = makeMultilib("/thumb")
2334 .flag("-armv7")
2335 .flag("+thumb");
2336 Multilib ArmV7ThumbMultilib = makeMultilib("/armv7-a/thumb")
2337 .flag("+armv7")
2338 .flag("+thumb");
2339 Multilib DefaultMultilib = makeMultilib("")
2340 .flag("-armv7")
2341 .flag("-thumb");
2342 MultilibSet AndroidArmMultilibs =
2343 MultilibSet()
2344 .Either(ThumbMultilib, ArmV7Multilib,
2345 ArmV7ThumbMultilib, DefaultMultilib)
2346 .FilterOut(NonExistent);
2347
2348 Multilib::flags_list Flags;
2349 llvm::StringRef Arch = Args.getLastArgValue(options::OPT_march_EQ);
2350 bool IsArmArch = TargetTriple.getArch() == llvm::Triple::arm;
2351 bool IsThumbArch = TargetTriple.getArch() == llvm::Triple::thumb;
2352 bool IsV7SubArch = TargetTriple.getSubArch() == llvm::Triple::ARMSubArch_v7;
2353 bool IsThumbMode = IsThumbArch ||
2354 Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, false) ||
2355 (IsArmArch && llvm::ARM::parseArchISA(Arch) == llvm::ARM::IK_THUMB);
2356 bool IsArmV7Mode = (IsArmArch || IsThumbArch) &&
2357 (llvm::ARM::parseArchVersion(Arch) == 7 ||
2358 (IsArmArch && Arch == "" && IsV7SubArch));
2359 addMultilibFlag(IsArmV7Mode, "armv7", Flags);
2360 addMultilibFlag(IsThumbMode, "thumb", Flags);
2361
2362 if (AndroidArmMultilibs.select(Flags, Result.SelectedMultilib))
2363 Result.Multilibs = AndroidArmMultilibs;
2364}
2365
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002366static bool findBiarchMultilibs(const Driver &D,
2367 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002368 StringRef Path, const ArgList &Args,
2369 bool NeedsBiarchSuffix,
2370 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002371 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2372 // in what would normally be GCCInstallPath and put the 64-bit
2373 // libs in a subdirectory named 64. The simple logic we follow is that
2374 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2375 // we use that. If not, and if not a biarch triple alias, we look for
2376 // crtbegin.o without the subdirectory.
2377
2378 Multilib Default;
2379 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002380 .gccSuffix("/64")
2381 .includeSuffix("/64")
2382 .flag("-m32")
2383 .flag("+m64")
2384 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002385 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002386 .gccSuffix("/32")
2387 .includeSuffix("/32")
2388 .flag("+m32")
2389 .flag("-m64")
2390 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002391 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002392 .gccSuffix("/x32")
2393 .includeSuffix("/x32")
2394 .flag("-m32")
2395 .flag("-m64")
2396 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002397
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002398 // GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a.
2399 FilterNonExistent NonExistent(
2400 Path, TargetTriple.isOSIAMCU() ? "/libgcc.a" : "/crtbegin.o", D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002401
Zinovy Nis1db95732014-07-10 15:27:19 +00002402 // Determine default multilib from: 32, 64, x32
2403 // Also handle cases such as 64 on 32, 32 on 64, etc.
2404 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002405 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002406 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002407 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002408 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002409 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002410 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002411 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002412 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002413 if (TargetTriple.isArch32Bit())
2414 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002415 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002416 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002417 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002418 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002419 }
2420
Zinovy Nis1db95732014-07-10 15:27:19 +00002421 if (Want == WANT32)
2422 Default.flag("+m32").flag("-m64").flag("-mx32");
2423 else if (Want == WANT64)
2424 Default.flag("-m32").flag("+m64").flag("-mx32");
2425 else if (Want == WANTX32)
2426 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002427 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002428 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002429
Simon Atanasyan60280b42014-05-12 07:37:51 +00002430 Result.Multilibs.push_back(Default);
2431 Result.Multilibs.push_back(Alt64);
2432 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002433 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002434
Simon Atanasyan60280b42014-05-12 07:37:51 +00002435 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002436
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002437 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002438 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002439 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002440 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002441
Simon Atanasyan60280b42014-05-12 07:37:51 +00002442 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002443 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002444
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002445 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002446 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002447 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002448
2449 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002450}
2451
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002452void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2453 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2454 const std::string &LibDir, StringRef CandidateTriple,
2455 bool NeedsBiarchSuffix) {
2456 // Solaris is a special case. The GCC installation is under
2457 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2458 // need to iterate twice.
2459 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002460 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2461 !EC && LI != LE; LI = LI.increment(EC)) {
2462 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002463 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2464
2465 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002466 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002467 continue; // Saw this path before; no need to look at it again.
2468 if (CandidateVersion.isOlderThan(4, 1, 1))
2469 continue;
2470 if (CandidateVersion <= Version)
2471 continue;
2472
2473 GCCInstallPath =
2474 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002475 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002476 continue;
2477
2478 // If we make it here there has to be at least one GCC version, let's just
2479 // use the latest one.
2480 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002481 for (vfs::directory_iterator
2482 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2483 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002484 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2485
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002486 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002487 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2488
2489 if (CandidateSubVersion > Version)
2490 Version = CandidateSubVersion;
2491 }
2492
2493 GCCTriple.setTriple(CandidateTriple);
2494
2495 GCCInstallPath += "/" + Version.Text;
2496 GCCParentLibPath = GCCInstallPath + "/../../../../";
2497
2498 IsValid = true;
2499 }
2500}
2501
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002502void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002503 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002504 const std::string &LibDir, StringRef CandidateTriple,
2505 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002506 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002507 // There are various different suffixes involving the triple we
2508 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002509 // up to the lib directory. Specifically, the number of "up" steps
2510 // in the second half of each row is 1 + the number of path separators
2511 // in the first half.
2512 const std::string LibAndInstallSuffixes[][2] = {
2513 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2514
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002515 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002516 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2517
2518 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2519 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002520
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002521 // The Freescale PPC SDK has the gcc libraries in
2522 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002523 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002524
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002525 // Ubuntu has a strange mis-matched pair of triples that this happens to
2526 // match.
2527 // FIXME: It may be worthwhile to generalize this and look for a second
2528 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002529 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2530
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002531 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2532 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2533 NeedsBiarchSuffix);
2534 return;
2535 }
2536
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002537 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002538 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2539 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002540 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002541 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002542 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002543 for (vfs::directory_iterator
2544 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2545 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002546 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002547 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002548 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002549 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002550 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002551 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002552 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002553 continue;
2554 if (CandidateVersion <= Version)
2555 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002556
Simon Atanasyan60280b42014-05-12 07:37:51 +00002557 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002558
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002559 // Android standalone toolchain could have multilibs for ARM and Thumb.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002560 // Debian mips multilibs behave more like the rest of the biarch ones,
2561 // so handle them there
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002562 if (isArmOrThumbArch(TargetArch) && TargetTriple.isAndroid()) {
2563 // It should also work without multilibs in a simplified toolchain.
2564 findAndroidArmMultilibs(D, TargetTriple, LI->getName(), Args, Detected);
2565 } else if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002566 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002567 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002568 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002569 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002570 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002571 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002572
Simon Atanasyan60280b42014-05-12 07:37:51 +00002573 Multilibs = Detected.Multilibs;
2574 SelectedMultilib = Detected.SelectedMultilib;
2575 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002576 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002577 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002578 // FIXME: We hack together the directory name here instead of
2579 // using LI to ensure stable path separators across Windows and
2580 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002581 GCCInstallPath =
2582 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2583 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002584 IsValid = true;
2585 }
2586 }
2587}
2588
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002589Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002590 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002591 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002592 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002593 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002594 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002595}
2596
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002597Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002598
Rafael Espindola7cf32212013-03-20 03:05:54 +00002599Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002600 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002601 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002602 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002603 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002604 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002605 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002606 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002607 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002608 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002609 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002610 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002611 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002612}
2613
Rafael Espindola7cf32212013-03-20 03:05:54 +00002614Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002615 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002616}
2617
Douglas Katzman95354292015-06-23 20:42:09 +00002618Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002619
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002620void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2621 // Print the information about how we detected the GCC installation.
2622 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002623 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002624}
2625
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002626bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002627 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002628}
2629
David Majnemer17f448b2015-06-28 04:23:33 +00002630bool Generic_GCC::isPICDefault() const {
2631 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2632}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002633
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002634bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002635
David Majnemer17f448b2015-06-28 04:23:33 +00002636bool Generic_GCC::isPICDefaultForced() const {
2637 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2638}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002639
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002640bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002641 switch (getTriple().getArch()) {
2642 case llvm::Triple::x86:
2643 case llvm::Triple::x86_64:
2644 case llvm::Triple::aarch64:
2645 case llvm::Triple::aarch64_be:
2646 case llvm::Triple::arm:
2647 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002648 case llvm::Triple::bpfel:
2649 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002650 case llvm::Triple::thumb:
2651 case llvm::Triple::thumbeb:
2652 case llvm::Triple::ppc:
2653 case llvm::Triple::ppc64:
2654 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002655 case llvm::Triple::systemz:
Daniel Sanderse160f832016-05-14 12:43:08 +00002656 case llvm::Triple::mips:
2657 case llvm::Triple::mipsel:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002658 return true;
2659 default:
2660 return false;
2661 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002662}
2663
James Y Knighta6c9ee72015-10-16 18:46:26 +00002664/// \brief Helper to add the variant paths of a libstdc++ installation.
2665bool Generic_GCC::addLibStdCXXIncludePaths(
2666 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2667 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2668 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2669 if (!getVFS().exists(Base + Suffix))
2670 return false;
2671
2672 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2673
2674 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2675 // that path exists or we have neither a GCC nor target multiarch triple, use
2676 // this vanilla search path.
2677 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2678 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2679 addSystemInclude(DriverArgs, CC1Args,
2680 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2681 } else {
2682 // Otherwise try to use multiarch naming schemes which have normalized the
2683 // triples and put the triple before the suffix.
2684 //
2685 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2686 // the target triple, so we support that here.
2687 addSystemInclude(DriverArgs, CC1Args,
2688 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2689 addSystemInclude(DriverArgs, CC1Args,
2690 Base + "/" + TargetMultiarchTriple + Suffix);
2691 }
2692
2693 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2694 return true;
2695}
2696
Kristof Beylsfb387292014-01-10 13:44:34 +00002697void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2698 ArgStringList &CC1Args) const {
2699 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002700 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002701 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002702 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002703 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002704 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002705 getTriple().getOS() == llvm::Triple::NaCl ||
2706 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2707 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002708
2709 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002710 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002711 CC1Args.push_back("-fuse-init-array");
2712}
2713
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002714/// Mips Toolchain
2715MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2716 const llvm::Triple &Triple,
2717 const ArgList &Args)
2718 : Linux(D, Triple, Args) {
2719 // Select the correct multilib according to the given arguments.
2720 DetectedMultilibs Result;
2721 findMIPSMultilibs(D, Triple, "", Args, Result);
2722 Multilibs = Result.Multilibs;
2723 SelectedMultilib = Result.SelectedMultilib;
2724
2725 // Find out the library suffix based on the ABI.
2726 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2727 getFilePaths().clear();
2728 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2729
2730 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002731 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002732}
2733
2734void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2735 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2736 if (DriverArgs.hasArg(options::OPT_nostdinc))
2737 return;
2738
2739 const Driver &D = getDriver();
2740
2741 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2742 SmallString<128> P(D.ResourceDir);
2743 llvm::sys::path::append(P, "include");
2744 addSystemInclude(DriverArgs, CC1Args, P);
2745 }
2746
2747 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2748 return;
2749
2750 const auto &Callback = Multilibs.includeDirsCallback();
2751 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002752 for (const auto &Path : Callback(SelectedMultilib))
2753 addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
2754 D.getInstalledDir() + Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002755 }
2756}
2757
2758Tool *MipsLLVMToolChain::buildLinker() const {
2759 return new tools::gnutools::Linker(*this);
2760}
2761
2762std::string MipsLLVMToolChain::computeSysRoot() const {
2763 if (!getDriver().SysRoot.empty())
2764 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2765
2766 const std::string InstalledDir(getDriver().getInstalledDir());
2767 std::string SysRootPath =
2768 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2769 if (llvm::sys::fs::exists(SysRootPath))
2770 return SysRootPath;
2771
2772 return std::string();
2773}
2774
2775ToolChain::CXXStdlibType
2776MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2777 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2778 if (A) {
2779 StringRef Value = A->getValue();
2780 if (Value != "libc++")
2781 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2782 << A->getAsString(Args);
2783 }
2784
2785 return ToolChain::CST_Libcxx;
2786}
2787
2788void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2789 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2790 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2791 DriverArgs.hasArg(options::OPT_nostdincxx))
2792 return;
2793
2794 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2795 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2796
2797 const auto &Callback = Multilibs.includeDirsCallback();
2798 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002799 for (std::string Path : Callback(SelectedMultilib)) {
2800 Path = getDriver().getInstalledDir() + Path + "/c++/v1";
2801 if (llvm::sys::fs::exists(Path)) {
2802 addSystemInclude(DriverArgs, CC1Args, Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002803 break;
2804 }
2805 }
2806 }
2807}
2808
2809void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2810 ArgStringList &CmdArgs) const {
2811 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2812 "Only -lc++ (aka libxx) is suported in this toolchain.");
2813
2814 CmdArgs.push_back("-lc++");
2815 CmdArgs.push_back("-lc++abi");
2816 CmdArgs.push_back("-lunwind");
2817}
2818
2819std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2820 StringRef Component,
2821 bool Shared) const {
2822 SmallString<128> Path(getDriver().ResourceDir);
2823 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2824 getOS());
2825 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002826 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002827 return Path.str();
2828}
2829
Tony Linthicum76329bf2011-12-12 21:14:55 +00002830/// Hexagon Toolchain
2831
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002832std::string HexagonToolChain::getHexagonTargetDir(
2833 const std::string &InstalledDir,
2834 const SmallVectorImpl<std::string> &PrefixDirs) const {
2835 std::string InstallRelDir;
2836 const Driver &D = getDriver();
2837
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002838 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002839 for (auto &I : PrefixDirs)
2840 if (D.getVFS().exists(I))
2841 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00002842
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002843 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002844 return InstallRelDir;
2845
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002846 return InstallRelDir;
2847}
2848
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002849Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
2850 const ArgList &Args) {
2851 StringRef Gn = "";
2852 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
2853 options::OPT_msmall_data_threshold_EQ)) {
2854 Gn = A->getValue();
2855 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
2856 options::OPT_fPIC)) {
2857 Gn = "0";
2858 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002859
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002860 unsigned G;
2861 if (!Gn.getAsInteger(10, G))
2862 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002863
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002864 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002865}
2866
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002867void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
2868 ToolChain::path_list &LibPaths) const {
2869 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00002870
2871 //----------------------------------------------------------------------------
2872 // -L Args
2873 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002874 for (Arg *A : Args.filtered(options::OPT_L))
2875 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002876 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002877
2878 //----------------------------------------------------------------------------
2879 // Other standard paths
2880 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002881 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00002882 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
2883 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00002884
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002885 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2886 D.PrefixDirs);
2887 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
2888 RootDirs.push_back(TargetDir);
2889
2890 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
2891 // Assume G0 with -shared.
2892 bool HasG0 = Args.hasArg(options::OPT_shared);
2893 if (auto G = getSmallDataThreshold(Args))
2894 HasG0 = G.getValue() == 0;
2895
2896 const std::string CpuVer = GetTargetCPUVersion(Args).str();
2897 for (auto &Dir : RootDirs) {
2898 std::string LibDir = Dir + "/hexagon/lib";
2899 std::string LibDirCpu = LibDir + '/' + CpuVer;
2900 if (HasG0) {
2901 if (HasPIC)
2902 LibPaths.push_back(LibDirCpu + "/G0/pic");
2903 LibPaths.push_back(LibDirCpu + "/G0");
2904 }
2905 LibPaths.push_back(LibDirCpu);
2906 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00002907 }
Matthew Curtise689b052012-12-06 15:46:07 +00002908}
2909
Douglas Katzman54366072015-07-27 16:53:08 +00002910HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002911 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002912 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002913 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2914 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002915
2916 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2917 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002918 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002919 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002920 getProgramPaths().push_back(BinDir);
2921
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002922 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002923
2924 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2925 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2926 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002927 LibPaths.clear();
2928 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002929}
2930
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002931HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002932
Douglas Katzman54366072015-07-27 16:53:08 +00002933Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002934 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002935}
2936
Douglas Katzman54366072015-07-27 16:53:08 +00002937Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002938 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002939}
2940
Douglas Katzman54366072015-07-27 16:53:08 +00002941void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2942 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002943 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2944 DriverArgs.hasArg(options::OPT_nostdlibinc))
2945 return;
2946
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002947 const Driver &D = getDriver();
2948 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2949 D.PrefixDirs);
2950 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002951}
2952
Douglas Katzman54366072015-07-27 16:53:08 +00002953void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2954 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002955 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2956 DriverArgs.hasArg(options::OPT_nostdincxx))
2957 return;
2958
2959 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002960 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
2961 addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002962}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002963
Matthew Curtise689b052012-12-06 15:46:07 +00002964ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002965HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002966 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2967 if (!A)
2968 return ToolChain::CST_Libstdcxx;
2969
2970 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002971 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002972 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002973
2974 return ToolChain::CST_Libstdcxx;
2975}
2976
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002977//
2978// Returns the default CPU for Hexagon. This is the default compilation target
2979// if no Hexagon processor is selected at the command-line.
2980//
2981const StringRef HexagonToolChain::GetDefaultCPU() {
2982 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002983}
2984
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002985const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
2986 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00002987 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
2988 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002989
2990 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
2991 if (CPU.startswith("hexagon"))
2992 return CPU.substr(sizeof("hexagon") - 1);
2993 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002994}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002995// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002996
Tom Stellard8fa33092015-07-18 01:49:05 +00002997/// AMDGPU Toolchain
2998AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2999 const ArgList &Args)
3000 : Generic_ELF(D, Triple, Args) { }
3001
3002Tool *AMDGPUToolChain::buildLinker() const {
3003 return new tools::amdgpu::Linker(*this);
3004}
3005// End AMDGPU
3006
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003007/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00003008NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
3009 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003010 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003011
3012 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
3013 // default paths, and must instead only use the paths provided
3014 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003015 path_list &file_paths = getFilePaths();
3016 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003017
3018 file_paths.clear();
3019 prog_paths.clear();
3020
3021 // Path for library files (libc.a, ...)
3022 std::string FilePath(getDriver().Dir + "/../");
3023
3024 // Path for tools (clang, ld, etc..)
3025 std::string ProgPath(getDriver().Dir + "/../");
3026
3027 // Path for toolchain libraries (libgcc.a, ...)
3028 std::string ToolPath(getDriver().ResourceDir + "/lib/");
3029
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003030 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00003031 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003032 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00003033 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003034 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3035 file_paths.push_back(ToolPath + "i686-nacl");
3036 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003037 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003038 file_paths.push_back(FilePath + "x86_64-nacl/lib");
3039 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
3040 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3041 file_paths.push_back(ToolPath + "x86_64-nacl");
3042 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003043 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003044 file_paths.push_back(FilePath + "arm-nacl/lib");
3045 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
3046 prog_paths.push_back(ProgPath + "arm-nacl/bin");
3047 file_paths.push_back(ToolPath + "arm-nacl");
3048 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003049 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003050 file_paths.push_back(FilePath + "mipsel-nacl/lib");
3051 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
3052 prog_paths.push_back(ProgPath + "bin");
3053 file_paths.push_back(ToolPath + "mipsel-nacl");
3054 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003055 default:
3056 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003057 }
3058
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003059 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
3060}
3061
Douglas Katzman54366072015-07-27 16:53:08 +00003062void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3063 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003064 const Driver &D = getDriver();
3065 if (DriverArgs.hasArg(options::OPT_nostdinc))
3066 return;
3067
3068 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
3069 SmallString<128> P(D.ResourceDir);
3070 llvm::sys::path::append(P, "include");
3071 addSystemInclude(DriverArgs, CC1Args, P.str());
3072 }
3073
3074 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3075 return;
3076
3077 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003078 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00003079 case llvm::Triple::x86:
3080 // x86 is special because multilib style uses x86_64-nacl/include for libc
3081 // headers but the SDK wants i686-nacl/usr/include. The other architectures
3082 // have the same substring.
3083 llvm::sys::path::append(P, "i686-nacl/usr/include");
3084 addSystemInclude(DriverArgs, CC1Args, P.str());
3085 llvm::sys::path::remove_filename(P);
3086 llvm::sys::path::remove_filename(P);
3087 llvm::sys::path::remove_filename(P);
3088 llvm::sys::path::append(P, "x86_64-nacl/include");
3089 addSystemInclude(DriverArgs, CC1Args, P.str());
3090 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003091 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003092 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003093 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003094 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003095 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003096 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003097 case llvm::Triple::mipsel:
3098 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
3099 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003100 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003101 return;
3102 }
3103
3104 addSystemInclude(DriverArgs, CC1Args, P.str());
3105 llvm::sys::path::remove_filename(P);
3106 llvm::sys::path::remove_filename(P);
3107 llvm::sys::path::append(P, "include");
3108 addSystemInclude(DriverArgs, CC1Args, P.str());
3109}
3110
Douglas Katzman54366072015-07-27 16:53:08 +00003111void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3112 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003113 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3114 // if the value is libc++, and emits an error for other values.
3115 GetCXXStdlibType(Args);
3116 CmdArgs.push_back("-lc++");
3117}
3118
Douglas Katzman54366072015-07-27 16:53:08 +00003119void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3120 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003121 const Driver &D = getDriver();
3122 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3123 DriverArgs.hasArg(options::OPT_nostdincxx))
3124 return;
3125
3126 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3127 // if the value is libc++, and emits an error for other values.
3128 GetCXXStdlibType(DriverArgs);
3129
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003130 SmallString<128> P(D.Dir + "/../");
3131 switch (getTriple().getArch()) {
3132 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003133 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
3134 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003135 break;
3136 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003137 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
3138 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003139 break;
3140 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003141 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
3142 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003143 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003144 case llvm::Triple::mipsel:
3145 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
3146 addSystemInclude(DriverArgs, CC1Args, P.str());
3147 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00003148 default:
3149 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003150 }
3151}
3152
Douglas Katzman54366072015-07-27 16:53:08 +00003153ToolChain::CXXStdlibType
3154NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003155 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3156 StringRef Value = A->getValue();
3157 if (Value == "libc++")
3158 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003159 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003160 }
3161
3162 return ToolChain::CST_Libcxx;
3163}
3164
Douglas Katzman54366072015-07-27 16:53:08 +00003165std::string
3166NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
3167 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003168 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
3169 if (TheTriple.getArch() == llvm::Triple::arm &&
3170 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
3171 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
3172 return TheTriple.getTriple();
3173}
3174
Douglas Katzman54366072015-07-27 16:53:08 +00003175Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003176 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003177}
3178
Douglas Katzman54366072015-07-27 16:53:08 +00003179Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003180 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00003181 return new tools::nacltools::AssemblerARM(*this);
3182 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003183}
3184// End NaCl
3185
Chris Lattner09797542010-03-04 21:07:38 +00003186/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
3187/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
3188/// Currently does not support anything else but compilation.
3189
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003190TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00003191 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003192 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00003193 // Path mangling to find libexec
3194 std::string Path(getDriver().Dir);
3195
3196 Path += "/../libexec";
3197 getProgramPaths().push_back(Path);
3198}
3199
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00003200TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00003201
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003202bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00003203
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003204bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003205
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003206bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003207
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003208bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003209
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003210// CloudABI - CloudABI tool chain which can call ld(1) directly.
3211
3212CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
3213 const ArgList &Args)
3214 : Generic_ELF(D, Triple, Args) {
3215 SmallString<128> P(getDriver().Dir);
3216 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
3217 getFilePaths().push_back(P.str());
3218}
3219
3220void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3221 ArgStringList &CC1Args) const {
3222 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
3223 DriverArgs.hasArg(options::OPT_nostdincxx))
3224 return;
3225
3226 SmallString<128> P(getDriver().Dir);
3227 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
3228 addSystemInclude(DriverArgs, CC1Args, P.str());
3229}
3230
3231void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
3232 ArgStringList &CmdArgs) const {
3233 CmdArgs.push_back("-lc++");
3234 CmdArgs.push_back("-lc++abi");
3235 CmdArgs.push_back("-lunwind");
3236}
3237
Douglas Katzman95354292015-06-23 20:42:09 +00003238Tool *CloudABI::buildLinker() const {
3239 return new tools::cloudabi::Linker(*this);
3240}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003241
Ed Schouten51bfbe72016-02-17 18:56:20 +00003242SanitizerMask CloudABI::getSupportedSanitizers() const {
3243 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3244 Res |= SanitizerKind::SafeStack;
3245 return Res;
3246}
3247
Ed Schoutenfc79d2c2016-03-29 21:13:53 +00003248SanitizerMask CloudABI::getDefaultSanitizers() const {
3249 return SanitizerKind::SafeStack;
3250}
3251
Reid Kleckner330fb172016-05-11 16:19:05 +00003252/// Haiku - Haiku tool chain which can call as(1) and ld(1) directly.
3253
3254Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
3255 : Generic_ELF(D, Triple, Args) {
3256
3257}
3258
3259void Haiku::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3260 ArgStringList &CC1Args) const {
3261 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3262 DriverArgs.hasArg(options::OPT_nostdincxx))
3263 return;
3264
3265 switch (GetCXXStdlibType(DriverArgs)) {
3266 case ToolChain::CST_Libcxx:
3267 addSystemInclude(DriverArgs, CC1Args,
3268 getDriver().SysRoot + "/system/develop/headers/c++/v1");
3269 break;
3270 case ToolChain::CST_Libstdcxx:
3271 addSystemInclude(DriverArgs, CC1Args,
3272 getDriver().SysRoot + "/system/develop/headers/c++");
3273 addSystemInclude(DriverArgs, CC1Args,
3274 getDriver().SysRoot + "/system/develop/headers/c++/backward");
3275
3276 StringRef Triple = getTriple().str();
3277 addSystemInclude(DriverArgs, CC1Args,
3278 getDriver().SysRoot + "/system/develop/headers/c++/" +
3279 Triple);
3280 break;
3281 }
3282}
3283
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003284/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3285
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003286OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3287 const ArgList &Args)
3288 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003289 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003290 getFilePaths().push_back("/usr/lib");
3291}
3292
Rafael Espindola7cf32212013-03-20 03:05:54 +00003293Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003294 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003295}
3296
Douglas Katzman95354292015-06-23 20:42:09 +00003297Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003298
Eli Friedman9fa28852012-08-08 23:57:20 +00003299/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3300
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003301Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3302 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003303 getFilePaths().push_back(getDriver().Dir + "/../lib");
3304 getFilePaths().push_back("/usr/lib");
3305}
3306
Rafael Espindola7cf32212013-03-20 03:05:54 +00003307Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003308 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003309}
3310
Douglas Katzman95354292015-06-23 20:42:09 +00003311Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003312
Jonas Hahnfeldaae83742016-02-12 07:48:37 +00003313ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
Richard Smith51af5192014-05-01 23:24:24 +00003314 return ToolChain::CST_Libcxx;
3315}
3316
Eli Friedman9fa28852012-08-08 23:57:20 +00003317void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3318 ArgStringList &CC1Args) const {
3319 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3320 DriverArgs.hasArg(options::OPT_nostdincxx))
3321 return;
3322
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003323 switch (GetCXXStdlibType(DriverArgs)) {
3324 case ToolChain::CST_Libcxx:
3325 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003326 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003327 break;
3328 case ToolChain::CST_Libstdcxx:
3329 addSystemInclude(DriverArgs, CC1Args,
3330 getDriver().SysRoot + "/usr/include/c++/stdc++");
3331 addSystemInclude(DriverArgs, CC1Args,
3332 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003333
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003334 StringRef Triple = getTriple().str();
3335 if (Triple.startswith("amd64"))
3336 addSystemInclude(DriverArgs, CC1Args,
3337 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003338 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003339 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003340 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3341 "/usr/include/c++/stdc++/" +
3342 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003343 break;
3344 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003345}
3346
3347void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3348 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003349 switch (GetCXXStdlibType(Args)) {
3350 case ToolChain::CST_Libcxx:
3351 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003352 CmdArgs.push_back("-lc++abi");
3353 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003354 break;
3355 case ToolChain::CST_Libstdcxx:
3356 CmdArgs.push_back("-lstdc++");
3357 break;
3358 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003359}
3360
Daniel Dunbare24297c2009-03-30 21:06:03 +00003361/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3362
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003363FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3364 const ArgList &Args)
3365 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003366
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003367 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3368 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003369 if ((Triple.getArch() == llvm::Triple::x86 ||
3370 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003371 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003372 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3373 else
3374 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003375}
3376
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003377ToolChain::CXXStdlibType FreeBSD::GetDefaultCXXStdlibType() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003378 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003379 return ToolChain::CST_Libcxx;
3380 return ToolChain::CST_Libstdcxx;
3381}
3382
3383void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3384 ArgStringList &CC1Args) const {
3385 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3386 DriverArgs.hasArg(options::OPT_nostdincxx))
3387 return;
3388
3389 switch (GetCXXStdlibType(DriverArgs)) {
3390 case ToolChain::CST_Libcxx:
3391 addSystemInclude(DriverArgs, CC1Args,
3392 getDriver().SysRoot + "/usr/include/c++/v1");
3393 break;
3394 case ToolChain::CST_Libstdcxx:
3395 addSystemInclude(DriverArgs, CC1Args,
3396 getDriver().SysRoot + "/usr/include/c++/4.2");
3397 addSystemInclude(DriverArgs, CC1Args,
3398 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3399 break;
3400 }
3401}
3402
Dimitry Andric60907392016-02-14 16:08:20 +00003403void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3404 ArgStringList &CmdArgs) const {
3405 CXXStdlibType Type = GetCXXStdlibType(Args);
3406 bool Profiling = Args.hasArg(options::OPT_pg);
3407
3408 switch (Type) {
3409 case ToolChain::CST_Libcxx:
3410 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3411 break;
3412
3413 case ToolChain::CST_Libstdcxx:
3414 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3415 break;
3416 }
3417}
3418
Rafael Espindola7cf32212013-03-20 03:05:54 +00003419Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003420 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003421}
3422
Douglas Katzman95354292015-06-23 20:42:09 +00003423Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003424
Tim Northovere931f9f2015-10-30 16:30:41 +00003425bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003426 // FreeBSD uses SjLj exceptions on ARM oabi.
3427 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003428 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003429 case llvm::Triple::GNUEABI:
3430 case llvm::Triple::EABI:
3431 return false;
3432
3433 default:
3434 return (getTriple().getArch() == llvm::Triple::arm ||
3435 getTriple().getArch() == llvm::Triple::thumb);
3436 }
3437}
3438
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003439bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003440
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003441bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003442
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003443SanitizerMask FreeBSD::getSupportedSanitizers() const {
3444 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3445 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3446 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3447 getTriple().getArch() == llvm::Triple::mips64el;
3448 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3449 Res |= SanitizerKind::Address;
3450 Res |= SanitizerKind::Vptr;
3451 if (IsX86_64 || IsMIPS64) {
3452 Res |= SanitizerKind::Leak;
3453 Res |= SanitizerKind::Thread;
3454 }
3455 if (IsX86 || IsX86_64) {
3456 Res |= SanitizerKind::SafeStack;
3457 }
3458 return Res;
3459}
3460
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003461/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3462
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003463NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3464 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003465 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003466 // When targeting a 32-bit platform, try the special directory used on
3467 // 64-bit hosts, and only fall back to the main library directory if that
3468 // doesn't work.
3469 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3470 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003471 switch (Triple.getArch()) {
3472 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003473 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003474 break;
3475 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003476 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003477 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003478 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003479 switch (Triple.getEnvironment()) {
3480 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003481 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003482 getFilePaths().push_back("=/usr/lib/eabi");
3483 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003484 case llvm::Triple::EABIHF:
3485 case llvm::Triple::GNUEABIHF:
3486 getFilePaths().push_back("=/usr/lib/eabihf");
3487 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003488 default:
3489 getFilePaths().push_back("=/usr/lib/oabi");
3490 break;
3491 }
3492 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003493 case llvm::Triple::mips64:
3494 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003495 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003496 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003497 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003498 getFilePaths().push_back("=/usr/lib/64");
3499 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003500 case llvm::Triple::ppc:
3501 getFilePaths().push_back("=/usr/lib/powerpc");
3502 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003503 case llvm::Triple::sparc:
3504 getFilePaths().push_back("=/usr/lib/sparc");
3505 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003506 default:
3507 break;
3508 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003509
3510 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003511 }
3512}
3513
Rafael Espindola7cf32212013-03-20 03:05:54 +00003514Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003515 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003516}
3517
Douglas Katzman95354292015-06-23 20:42:09 +00003518Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003519
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003520ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const {
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003521 unsigned Major, Minor, Micro;
3522 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003523 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003524 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003525 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003526 case llvm::Triple::arm:
3527 case llvm::Triple::armeb:
3528 case llvm::Triple::thumb:
3529 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003530 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003531 case llvm::Triple::ppc64:
3532 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003533 case llvm::Triple::sparc:
3534 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003535 case llvm::Triple::x86:
3536 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003537 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003538 default:
3539 break;
3540 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003541 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003542 return ToolChain::CST_Libstdcxx;
3543}
3544
3545void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3546 ArgStringList &CC1Args) const {
3547 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3548 DriverArgs.hasArg(options::OPT_nostdincxx))
3549 return;
3550
3551 switch (GetCXXStdlibType(DriverArgs)) {
3552 case ToolChain::CST_Libcxx:
3553 addSystemInclude(DriverArgs, CC1Args,
3554 getDriver().SysRoot + "/usr/include/c++/");
3555 break;
3556 case ToolChain::CST_Libstdcxx:
3557 addSystemInclude(DriverArgs, CC1Args,
3558 getDriver().SysRoot + "/usr/include/g++");
3559 addSystemInclude(DriverArgs, CC1Args,
3560 getDriver().SysRoot + "/usr/include/g++/backward");
3561 break;
3562 }
3563}
3564
Chris Lattner3e2ee142010-07-07 16:01:42 +00003565/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3566
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003567Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3568 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003569 getFilePaths().push_back(getDriver().Dir + "/../lib");
3570 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003571}
3572
Rafael Espindola7cf32212013-03-20 03:05:54 +00003573Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003574 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003575}
3576
Douglas Katzman95354292015-06-23 20:42:09 +00003577Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003578
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003579static void addPathIfExists(const Driver &D, const Twine &Path,
3580 ToolChain::path_list &Paths) {
3581 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003582 Paths.push_back(Path.str());
3583}
3584
David Chisnallf571cde2012-02-15 13:39:01 +00003585/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3586
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003587Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003588 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003589 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003590
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003591 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003592
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003593 path_list &Paths = getFilePaths();
3594 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003595 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003596
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003597 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003598 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003599 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003600
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003601 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003602
3603 std::string LibPath = "/usr/lib/";
3604 switch (Triple.getArch()) {
3605 case llvm::Triple::x86:
3606 case llvm::Triple::sparc:
3607 break;
3608 case llvm::Triple::x86_64:
3609 LibPath += "amd64/";
3610 break;
3611 case llvm::Triple::sparcv9:
3612 LibPath += "sparcv9/";
3613 break;
3614 default:
3615 llvm_unreachable("Unsupported architecture");
3616 }
3617
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003618 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003619}
3620
Rafael Espindola7cf32212013-03-20 03:05:54 +00003621Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003622 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003623}
3624
Douglas Katzman95354292015-06-23 20:42:09 +00003625Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003626
Rafael Espindolad5117262015-09-09 13:36:00 +00003627void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3628 ArgStringList &CC1Args) const {
3629 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3630 DriverArgs.hasArg(options::OPT_nostdincxx))
3631 return;
3632
3633 // Include the support directory for things like xlocale and fudged system
3634 // headers.
3635 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3636
3637 if (GCCInstallation.isValid()) {
3638 GCCVersion Version = GCCInstallation.getVersion();
3639 addSystemInclude(DriverArgs, CC1Args,
3640 getDriver().SysRoot + "/usr/gcc/" +
3641 Version.MajorStr + "." +
3642 Version.MinorStr +
3643 "/include/c++/" + Version.Text);
3644 addSystemInclude(DriverArgs, CC1Args,
3645 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3646 "." + Version.MinorStr + "/include/c++/" +
3647 Version.Text + "/" +
3648 GCCInstallation.getTriple().str());
3649 }
3650}
3651
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003652/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003653
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003654enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003655 // NB: Releases of a particular Linux distro should be kept together
3656 // in this enum, because some tests are done by integer comparison against
3657 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003658 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003659 DebianLenny,
3660 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003661 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003662 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003663 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003664 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003665 RHEL5,
3666 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003667 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003668 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003669 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003670 UbuntuHardy,
3671 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003672 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003673 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003674 UbuntuLucid,
3675 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003676 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003677 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003678 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003679 UbuntuQuantal,
3680 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003681 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003682 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003683 UbuntuUtopic,
3684 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003685 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003686 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003687 UnknownDistro
3688};
3689
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003690static bool IsRedhat(enum Distro Distro) {
Rafael Espindola52fe8962016-05-09 13:13:50 +00003691 return Distro == Fedora || (Distro >= RHEL5 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003692}
3693
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003694static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003695
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003696static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003697 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003698}
3699
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003700static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003701 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003702}
3703
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003704static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003705 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3706 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3707 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003708 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003709 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003710 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003711 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003712 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003713 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3714 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3715 .Case("hardy", UbuntuHardy)
3716 .Case("intrepid", UbuntuIntrepid)
3717 .Case("jaunty", UbuntuJaunty)
3718 .Case("karmic", UbuntuKarmic)
3719 .Case("lucid", UbuntuLucid)
3720 .Case("maverick", UbuntuMaverick)
3721 .Case("natty", UbuntuNatty)
3722 .Case("oneiric", UbuntuOneiric)
3723 .Case("precise", UbuntuPrecise)
3724 .Case("quantal", UbuntuQuantal)
3725 .Case("raring", UbuntuRaring)
3726 .Case("saucy", UbuntuSaucy)
3727 .Case("trusty", UbuntuTrusty)
3728 .Case("utopic", UbuntuUtopic)
3729 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003730 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003731 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003732 .Default(UnknownDistro);
Rafael Espindola52fe8962016-05-09 13:13:50 +00003733 if (Version != UnknownDistro)
3734 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003735 }
3736
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003737 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3738 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003739 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003740 if (Data.startswith("Fedora release"))
3741 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003742 if (Data.startswith("Red Hat Enterprise Linux") ||
Rafael Espindola52fe8962016-05-09 13:13:50 +00003743 Data.startswith("CentOS") ||
3744 Data.startswith("Scientific Linux")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003745 if (Data.find("release 7") != StringRef::npos)
3746 return RHEL7;
3747 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003748 return RHEL6;
3749 else if (Data.find("release 5") != StringRef::npos)
3750 return RHEL5;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003751 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003752 return UnknownDistro;
3753 }
3754
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003755 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3756 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003757 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003758 if (Data[0] == '5')
3759 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003760 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003761 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003762 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003763 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003764 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003765 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003766 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3767 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003768 return UnknownDistro;
3769 }
3770
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003771 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003772 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003773
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003774 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003775 return Exherbo;
3776
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003777 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003778 return ArchLinux;
3779
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003780 return UnknownDistro;
3781}
3782
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003783/// \brief Get our best guess at the multiarch triple for a target.
3784///
3785/// Debian-based systems are starting to use a multiarch setup where they use
3786/// a target-triple directory in the library and header search paths.
3787/// Unfortunately, this triple does not align with the vanilla target triple,
3788/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003789static std::string getMultiarchTriple(const Driver &D,
3790 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003791 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003792 llvm::Triple::EnvironmentType TargetEnvironment =
3793 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003794
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003795 // For most architectures, just use whatever we have rather than trying to be
3796 // clever.
3797 switch (TargetTriple.getArch()) {
3798 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003799 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003800
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003801 // We use the existence of '/lib/<triple>' as a directory to detect some
3802 // common linux triples that don't quite match the Clang triple for both
3803 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3804 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003805 case llvm::Triple::arm:
3806 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003807 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003808 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003809 return "arm-linux-gnueabihf";
3810 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003811 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003812 return "arm-linux-gnueabi";
3813 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003814 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003815 case llvm::Triple::armeb:
3816 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003817 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003818 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003819 return "armeb-linux-gnueabihf";
3820 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003821 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003822 return "armeb-linux-gnueabi";
3823 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003824 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003825 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003826 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003827 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003828 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003829 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003830 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003831 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003832 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003833 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003834 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003835 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003836 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003837 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003838 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003839 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003840 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003841 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003842 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003843 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003844 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003845 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003846 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003847 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003848 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003849 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003850 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003851 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003852 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003853 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003854 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003855 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003856 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003857 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003858 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003859 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003860 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003861 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003862 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003863 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003864 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003865 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003866 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003867 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003868 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003869 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003870 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003871 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003872 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003873 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003874 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003875 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003876 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003877 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003878 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003879 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003880 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003881 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003882 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003883 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003884 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003885 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003886 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003887 return "s390x-linux-gnu";
3888 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003889 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003890 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003891}
3892
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003893static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003894 if (isMipsArch(Triple.getArch())) {
3895 // lib32 directory has a special meaning on MIPS targets.
3896 // It contains N32 ABI binaries. Use this folder if produce
3897 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003898 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003899 return "lib32";
3900 return Triple.isArch32Bit() ? "lib" : "lib64";
3901 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003902
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003903 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003904 // using that variant while targeting other architectures causes problems
3905 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003906 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003907 // them when we know we may need it.
3908 //
3909 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003910 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003911 // GCCInstallationDetector, but that is a more significant refactoring.
3912 if (Triple.getArch() == llvm::Triple::x86 ||
3913 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003914 return "lib32";
3915
Zinovy Nis1db95732014-07-10 15:27:19 +00003916 if (Triple.getArch() == llvm::Triple::x86_64 &&
3917 Triple.getEnvironment() == llvm::Triple::GNUX32)
3918 return "libx32";
3919
Simon Atanasyand4413882012-09-14 11:27:24 +00003920 return Triple.isArch32Bit() ? "lib" : "lib64";
3921}
3922
Simon Atanasyan2834a222016-05-22 18:18:07 +00003923static void addMultilibsFilePaths(const Driver &D, const MultilibSet &Multilibs,
3924 const Multilib &Multilib,
3925 StringRef InstallPath,
3926 ToolChain::path_list &Paths) {
3927 if (const auto &PathsCallback = Multilibs.filePathsCallback())
3928 for (const auto &Path : PathsCallback(Multilib))
3929 addPathIfExists(D, InstallPath + Path, Paths);
3930}
3931
Rafael Espindola1af7c212012-02-19 01:38:32 +00003932Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003933 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003934 GCCInstallation.init(Triple, Args);
3935 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003936 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003937 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003938 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003939
Rafael Espindola10a63c22013-07-03 14:14:00 +00003940 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003941 // least) put various tools in a triple-prefixed directory off of the parent
3942 // of the GCC installation. We use the GCC triple here to ensure that we end
3943 // up with tools that support the same amount of cross compiling as the
3944 // detected GCC installation. For example, if we find a GCC installation
3945 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3946 // used to target i386.
3947 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003948 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003949 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003950 GCCInstallation.getTriple().str() + "/bin")
3951 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003952
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003953 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003954
Rafael Espindola10a63c22013-07-03 14:14:00 +00003955 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003956 ExtraOpts.push_back("-z");
3957 ExtraOpts.push_back("relro");
3958 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003959
Douglas Gregord9bb1522011-03-06 19:11:49 +00003960 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003961 ExtraOpts.push_back("-X");
3962
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003963 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003964 const bool IsMips = isMipsArch(Arch);
3965
3966 if (IsMips && !SysRoot.empty())
3967 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003968
Chandler Carruth0b842912011-12-09 04:45:18 +00003969 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3970 // and the MIPS ABI require .dynsym to be sorted in different ways.
3971 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3972 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003973 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003974 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003975 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003976 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003977 ExtraOpts.push_back("--hash-style=gnu");
3978
Rafael Espindola10a63c22013-07-03 14:14:00 +00003979 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003980 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3981 ExtraOpts.push_back("--hash-style=both");
3982 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003983
Rafael Espindola52fe8962016-05-09 13:13:50 +00003984 if (IsRedhat(Distro) && Distro != RHEL5 && Distro != RHEL6)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003985 ExtraOpts.push_back("--no-add-needed");
3986
Rafael Espindola5ed89d42016-06-03 17:26:16 +00003987#ifdef ENABLE_LINKER_BUILD_ID
3988 ExtraOpts.push_back("--build-id");
3989#endif
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003990
Rafael Espindola10a63c22013-07-03 14:14:00 +00003991 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003992 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003993
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003994 // The selection of paths to try here is designed to match the patterns which
3995 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3996 // This was determined by running GCC in a fake filesystem, creating all
3997 // possible permutations of these directories, and seeing which ones it added
3998 // to the link paths.
3999 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00004000
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004001 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004002 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004003
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004004 // Add the multilib suffixed paths where they are available.
4005 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00004006 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00004007 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004008 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan2834a222016-05-22 18:18:07 +00004009 const MultilibSet &Multilibs = GCCInstallation.getMultilibs();
4010
4011 // Add toolchain / multilib specific file paths.
4012 addMultilibsFilePaths(D, Multilibs, Multilib,
4013 GCCInstallation.getInstallPath(), Paths);
Simon Atanasyan53fefd12012-10-03 17:46:38 +00004014
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004015 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00004016 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004017 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004018 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004019
4020 // GCC cross compiling toolchains will install target libraries which ship
4021 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
4022 // any part of the GCC installation in
4023 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
4024 // debatable, but is the reality today. We need to search this tree even
4025 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004026 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004027 // installation that is *not* within the system root to ensure two things:
4028 //
4029 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00004030 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004031 // appropriate rpath.
4032 // 2) There must not be libraries installed into
4033 // <prefix>/<triple>/<libdir> unless they should be preferred over
4034 // those within the system root.
4035 //
4036 // Note that this matches the GCC behavior. See the below comment for where
4037 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004038 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
4039 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004040 Paths);
4041
Chandler Carruth69a125b2012-04-06 16:32:06 +00004042 // If the GCC installation we found is inside of the sysroot, we want to
4043 // prefer libraries installed in the parent prefix of the GCC installation.
4044 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00004045 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004046 // This usually happens when there is an external cross compiler on the
4047 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004048 // the cross. Note that GCC does include some of these directories in some
4049 // configurations but this seems somewhere between questionable and simply
4050 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004051 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004052 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
4053 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00004054 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004055 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004056
4057 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004058 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00004059 // those searched.
4060 // FIXME: It's not clear whether we should use the driver's installed
4061 // directory ('Dir' below) or the ResourceDir.
4062 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004063 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
4064 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004065 }
4066
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004067 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
4068 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
4069 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
4070 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004071
Chandler Carruthb427c562013-06-22 11:35:51 +00004072 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004073 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00004074 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004075 addPathIfExists(D,
4076 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004077 "/../../" + OSLibDir,
4078 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00004079
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004080 // Add the 'other' biarch variant path
4081 Multilib BiarchSibling;
4082 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004083 addPathIfExists(D, GCCInstallation.getInstallPath() +
4084 BiarchSibling.gccSuffix(),
4085 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004086 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00004087
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004088 // See comments above on the multilib variant for details of why this is
4089 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004090 const std::string &LibPath = GCCInstallation.getParentLibPath();
4091 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
4092 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004093 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
4094 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004095 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004096
4097 // See comments above on the multilib variant for details of why this is
4098 // only included from within the sysroot.
4099 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004100 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004101 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004102
4103 // Similar to the logic for GCC above, if we are currently running Clang
4104 // inside of the requested system root, add its parent library path to those
4105 // searched.
4106 // FIXME: It's not clear whether we should use the driver's installed
4107 // directory ('Dir' below) or the ResourceDir.
4108 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004109 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004110
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004111 addPathIfExists(D, SysRoot + "/lib", Paths);
4112 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004113}
4114
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004115bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00004116
Douglas Katzman95354292015-06-23 20:42:09 +00004117Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00004118
4119Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004120 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00004121}
4122
Simon Atanasyana0d89572013-10-05 14:37:55 +00004123std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004124 if (!getDriver().SysRoot.empty())
4125 return getDriver().SysRoot;
4126
4127 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
4128 return std::string();
4129
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004130 // Standalone MIPS toolchains use different names for sysroot folder
4131 // and put it into different places. Here we try to check some known
4132 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004133
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004134 const StringRef InstallDir = GCCInstallation.getInstallPath();
4135 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004136 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004137
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004138 std::string Path =
4139 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
4140 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004141
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004142 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004143 return Path;
4144
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004145 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004146
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004147 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004148 return Path;
4149
4150 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004151}
4152
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004153std::string Linux::getDynamicLinker(const ArgList &Args) const {
4154 const llvm::Triple::ArchType Arch = getArch();
4155 const llvm::Triple &Triple = getTriple();
4156
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004157 const enum Distro Distro = DetectDistro(getDriver(), Arch);
4158
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004159 if (Triple.isAndroid())
4160 return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker";
Rafael Espindola164fe342016-06-14 12:47:24 +00004161 else if (Triple.getEnvironment() == llvm::Triple::Musl)
4162 return "/lib/ld-musl-" + Triple.getArchName().str() + ".so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004163
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004164 std::string LibDir;
4165 std::string Loader;
4166
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004167 switch (Arch) {
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004168 default:
4169 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004170
4171 case llvm::Triple::aarch64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004172 LibDir = "lib";
4173 Loader = "ld-linux-aarch64.so.1";
4174 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004175 case llvm::Triple::aarch64_be:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004176 LibDir = "lib";
4177 Loader = "ld-linux-aarch64_be.so.1";
4178 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004179 case llvm::Triple::arm:
4180 case llvm::Triple::thumb:
4181 case llvm::Triple::armeb:
4182 case llvm::Triple::thumbeb: {
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004183 const bool HF =
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004184 Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
4185 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
4186
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004187 LibDir = "lib";
4188 Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";
4189 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004190 }
4191 case llvm::Triple::mips:
4192 case llvm::Triple::mipsel:
4193 case llvm::Triple::mips64:
4194 case llvm::Triple::mips64el: {
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004195 bool LE = (Triple.getArch() == llvm::Triple::mipsel) ||
4196 (Triple.getArch() == llvm::Triple::mips64el);
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004197 bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple);
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004198
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004199 LibDir = "lib" + tools::mips::getMipsABILibSuffix(Args, Triple);
4200
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004201 if (tools::mips::isUCLibc(Args))
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004202 Loader = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004203 else if (!Triple.hasEnvironment() &&
4204 Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies)
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004205 Loader = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004206 else
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004207 Loader = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004208
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004209 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004210 }
4211 case llvm::Triple::ppc:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004212 LibDir = "lib";
4213 Loader = "ld.so.1";
4214 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004215 case llvm::Triple::ppc64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004216 LibDir = "lib64";
4217 Loader =
4218 (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "ld64.so.2" : "ld64.so.1";
4219 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004220 case llvm::Triple::ppc64le:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004221 LibDir = "lib64";
4222 Loader =
4223 (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2";
4224 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004225 case llvm::Triple::sparc:
4226 case llvm::Triple::sparcel:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004227 LibDir = "lib";
4228 Loader = "ld-linux.so.2";
4229 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004230 case llvm::Triple::sparcv9:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004231 LibDir = "lib64";
4232 Loader = "ld-linux.so.2";
4233 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004234 case llvm::Triple::systemz:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004235 LibDir = "lib";
4236 Loader = "ld64.so.1";
4237 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004238 case llvm::Triple::x86:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004239 LibDir = "lib";
4240 Loader = "ld-linux.so.2";
4241 break;
4242 case llvm::Triple::x86_64: {
4243 bool X32 = Triple.getEnvironment() == llvm::Triple::GNUX32;
4244
4245 LibDir = X32 ? "libx32" : "lib64";
4246 Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2";
4247 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004248 }
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004249 }
4250
4251 if (Distro == Exherbo && (Triple.getVendor() == llvm::Triple::UnknownVendor ||
4252 Triple.getVendor() == llvm::Triple::PC))
4253 return "/usr/" + Triple.str() + "/lib/" + Loader;
4254 return "/" + LibDir + "/" + Loader;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004255}
4256
Chandler Carrutha796f532011-11-05 20:17:13 +00004257void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4258 ArgStringList &CC1Args) const {
4259 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00004260 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00004261
4262 if (DriverArgs.hasArg(options::OPT_nostdinc))
4263 return;
4264
4265 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004266 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004267
4268 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00004269 SmallString<128> P(D.ResourceDir);
4270 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00004271 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00004272 }
4273
4274 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
4275 return;
4276
4277 // Check for configure-time C include directories.
4278 StringRef CIncludeDirs(C_INCLUDE_DIRS);
4279 if (CIncludeDirs != "") {
4280 SmallVector<StringRef, 5> dirs;
4281 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004282 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00004283 StringRef Prefix =
4284 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004285 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00004286 }
4287 return;
4288 }
4289
4290 // Lacking those, try to detect the correct set of system includes for the
4291 // target triple.
4292
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004293 // Add include directories specific to the selected multilib set and multilib.
4294 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00004295 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004296 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00004297 for (const auto &Path : Callback(GCCInstallation.getMultilib()))
4298 addExternCSystemIncludeIfExists(
4299 DriverArgs, CC1Args, GCCInstallation.getInstallPath() + Path);
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004300 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004301 }
4302
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004303 // Implement generic Debian multiarch support.
4304 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004305 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004306
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004307 // FIXME: These are older forms of multiarch. It's not clear that they're
4308 // in use in any released version of Debian, so we should consider
4309 // removing them.
4310 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004311 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004312 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004313
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004314 // FIXME: These are older forms of multiarch. It's not clear that they're
4315 // in use in any released version of Debian, so we should consider
4316 // removing them.
4317 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
4318 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00004319 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004320 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004321 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004322 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004323 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004324 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004325 const StringRef ARMEBMultiarchIncludeDirs[] = {
4326 "/usr/include/armeb-linux-gnueabi"};
4327 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
4328 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004329 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00004330 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004331 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004332 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004333 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004334 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004335 "/usr/include/mips64el-linux-gnu",
4336 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004337 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004338 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004339 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004340 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004341 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004342 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004343 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004344 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004345 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004346 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004347 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
4348 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004349 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004350 switch (getTriple().getArch()) {
4351 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004352 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004353 break;
4354 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004355 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004356 break;
4357 case llvm::Triple::aarch64:
4358 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00004359 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004360 break;
4361 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004362 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004363 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4364 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
4365 else
4366 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004367 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004368 case llvm::Triple::armeb:
4369 case llvm::Triple::thumbeb:
4370 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4371 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
4372 else
4373 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
4374 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004375 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00004376 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004377 break;
4378 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00004379 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004380 break;
4381 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004382 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004383 break;
4384 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004385 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004386 break;
4387 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004388 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004389 break;
4390 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004391 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004392 break;
4393 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004394 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004395 break;
4396 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004397 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004398 break;
4399 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004400 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004401 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004402 case llvm::Triple::systemz:
4403 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4404 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004405 default:
4406 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004407 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004408 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004409 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004410 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004411 break;
4412 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004413 }
4414
4415 if (getTriple().getOS() == llvm::Triple::RTEMS)
4416 return;
4417
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004418 // Add an include of '/include' directly. This isn't provided by default by
4419 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4420 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004421 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004422
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004423 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004424}
4425
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004426static std::string DetectLibcxxIncludePath(StringRef base) {
4427 std::error_code EC;
4428 int MaxVersion = 0;
4429 std::string MaxVersionString = "";
4430 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4431 LI = LI.increment(EC)) {
4432 StringRef VersionText = llvm::sys::path::filename(LI->path());
4433 int Version;
4434 if (VersionText[0] == 'v' &&
4435 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4436 if (Version > MaxVersion) {
4437 MaxVersion = Version;
4438 MaxVersionString = VersionText;
4439 }
4440 }
4441 }
4442 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4443}
4444
Chandler Carrutha796f532011-11-05 20:17:13 +00004445void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4446 ArgStringList &CC1Args) const {
4447 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4448 DriverArgs.hasArg(options::OPT_nostdincxx))
4449 return;
4450
Chandler Carruthf4701732011-11-07 09:01:17 +00004451 // Check if libc++ has been enabled and provide its include paths if so.
4452 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004453 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004454 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Yaron Keren5439b642016-05-17 19:01:16 +00004455 // If this is a development, non-installed, clang, libcxx will
4456 // not be found at ../include/c++ but it likely to be found at
4457 // one of the following two locations:
4458 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/local/include/c++"),
4459 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++") };
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004460 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004461 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004462 continue;
4463 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004464 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004465 break;
4466 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004467 return;
4468 }
4469
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004470 // We need a detected GCC installation on Linux to provide libstdc++'s
4471 // headers. We handled the libc++ case above.
4472 if (!GCCInstallation.isValid())
4473 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004474
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004475 // By default, look for the C++ headers in an include directory adjacent to
4476 // the lib directory of the GCC installation. Note that this is expect to be
4477 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4478 StringRef LibDir = GCCInstallation.getParentLibPath();
4479 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004480 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004481 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004482 const std::string GCCMultiarchTriple = getMultiarchTriple(
4483 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004484 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004485 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004486 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004487
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004488 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004489 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004490 "/c++/" + Version.Text, TripleStr,
4491 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004492 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004493 return;
4494
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004495 // Otherwise, fall back on a bunch of options which don't use multiarch
4496 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004497 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004498 // Gentoo is weird and places its headers inside the GCC install,
4499 // so if the first attempt to find the headers fails, try these patterns.
Chandler Carruth81296fb2016-05-08 07:59:56 +00004500 InstallDir.str() + "/include/g++-v" + Version.Text,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004501 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4502 Version.MinorStr,
4503 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4504 // Android standalone toolchain has C++ headers in yet another place.
4505 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4506 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4507 // without a subdirectory corresponding to the gcc version.
4508 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004509 };
4510
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004511 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004512 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4513 /*GCCMultiarchTriple*/ "",
4514 /*TargetMultiarchTriple*/ "",
4515 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004516 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004517 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004518}
4519
Artem Belevichfa11ab52015-11-17 22:28:46 +00004520void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4521 ArgStringList &CC1Args) const {
4522 if (DriverArgs.hasArg(options::OPT_nocudainc))
4523 return;
4524
Justin Lebar423019d2016-04-16 00:11:11 +00004525 if (!CudaInstallation.isValid()) {
4526 getDriver().Diag(diag::err_drv_no_cuda_installation);
4527 return;
Artem Belevich86017332015-11-17 22:28:55 +00004528 }
Justin Lebar423019d2016-04-16 00:11:11 +00004529
4530 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
4531 CC1Args.push_back("-include");
4532 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevichfa11ab52015-11-17 22:28:46 +00004533}
4534
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00004535void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs,
4536 ArgStringList &CC1Args) const {
4537 if (GCCInstallation.isValid()) {
4538 CC1Args.push_back("-isystem");
4539 CC1Args.push_back(DriverArgs.MakeArgString(
4540 GCCInstallation.getParentLibPath() + "/../" +
4541 GCCInstallation.getTriple().str() + "/include"));
4542 }
4543}
4544
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004545bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004546
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004547SanitizerMask Linux::getSupportedSanitizers() const {
4548 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4549 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4550 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4551 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004552 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4553 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004554 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4555 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004556 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4557 Res |= SanitizerKind::Address;
4558 Res |= SanitizerKind::KernelAddress;
4559 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004560 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004561 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004562 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004563 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004564 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004565 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004566 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004567 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004568 Res |= SanitizerKind::Memory;
Derek Bruening256c2e12016-04-21 21:32:04 +00004569 if (IsX86_64)
4570 Res |= SanitizerKind::Efficiency;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004571 if (IsX86 || IsX86_64) {
4572 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004573 }
4574 return Res;
4575}
4576
Xinliang David Li170cd102015-10-27 05:15:35 +00004577void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4578 llvm::opt::ArgStringList &CmdArgs) const {
4579 if (!needsProfileRT(Args)) return;
4580
4581 // Add linker option -u__llvm_runtime_variable to cause runtime
4582 // initialization module to be linked in.
4583 if (!Args.hasArg(options::OPT_coverage))
4584 CmdArgs.push_back(Args.MakeArgString(
4585 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4586 ToolChain::addProfileRTLibs(Args, CmdArgs);
4587}
4588
Daniel Dunbarcc912342009-05-02 18:28:39 +00004589/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4590
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004591DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4592 const ArgList &Args)
4593 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004594
4595 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004596 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004597 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004598 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004599
Daniel Dunbar083edf72009-12-21 18:54:17 +00004600 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004601 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004602 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004603}
4604
Rafael Espindola7cf32212013-03-20 03:05:54 +00004605Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004606 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004607}
4608
4609Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004610 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004611}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004612
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004613/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4614/// which isn't properly a linker but nonetheless performs the step of stitching
4615/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004616
4617CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4618 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004619 : Linux(D, Triple, Args) {
4620 if (CudaInstallation.isValid())
4621 getProgramPaths().push_back(CudaInstallation.getBinPath());
4622}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004623
4624void
4625CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4626 llvm::opt::ArgStringList &CC1Args) const {
4627 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4628 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004629
Justin Lebard3a44f62016-04-05 18:26:20 +00004630 if (DriverArgs.hasFlag(options::OPT_fcuda_flush_denormals_to_zero,
4631 options::OPT_fno_cuda_flush_denormals_to_zero, false))
4632 CC1Args.push_back("-fcuda-flush-denormals-to-zero");
4633
Justin Lebar91f6f072016-05-23 20:19:56 +00004634 if (DriverArgs.hasFlag(options::OPT_fcuda_approx_transcendentals,
4635 options::OPT_fno_cuda_approx_transcendentals, false))
4636 CC1Args.push_back("-fcuda-approx-transcendentals");
4637
Artem Belevich34f481a2015-11-17 22:28:50 +00004638 if (DriverArgs.hasArg(options::OPT_nocudalib))
4639 return;
4640
4641 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4642 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4643 if (!LibDeviceFile.empty()) {
4644 CC1Args.push_back("-mlink-cuda-bitcode");
4645 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4646
4647 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4648 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4649 // came with CUDA-7.0.
4650 CC1Args.push_back("-target-feature");
4651 CC1Args.push_back("+ptx42");
4652 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004653}
4654
4655llvm::opt::DerivedArgList *
4656CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4657 const char *BoundArch) const {
4658 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4659 const OptTable &Opts = getDriver().getOpts();
4660
4661 for (Arg *A : Args) {
4662 if (A->getOption().matches(options::OPT_Xarch__)) {
4663 // Skip this argument unless the architecture matches BoundArch
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004664 if (!BoundArch || A->getValue(0) != StringRef(BoundArch))
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004665 continue;
4666
4667 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4668 unsigned Prev = Index;
4669 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4670
4671 // If the argument parsing failed or more than one argument was
4672 // consumed, the -Xarch_ argument's parameter tried to consume
4673 // extra arguments. Emit an error and ignore.
4674 //
4675 // We also want to disallow any options which would alter the
4676 // driver behavior; that isn't going to work in our model. We
4677 // use isDriverOption() as an approximation, although things
4678 // like -O4 are going to slip through.
4679 if (!XarchArg || Index > Prev + 1) {
4680 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4681 << A->getAsString(Args);
4682 continue;
4683 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4684 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4685 << A->getAsString(Args);
4686 continue;
4687 }
4688 XarchArg->setBaseArg(A);
4689 A = XarchArg.release();
4690 DAL->AddSynthesizedArg(A);
4691 }
4692 DAL->append(A);
4693 }
4694
Justin Lebar4db224e2016-06-15 23:46:11 +00004695 if (BoundArch) {
4696 DAL->eraseArg(options::OPT_march_EQ);
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004697 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Justin Lebar4db224e2016-06-15 23:46:11 +00004698 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004699 return DAL;
4700}
4701
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004702Tool *CudaToolChain::buildAssembler() const {
4703 return new tools::NVPTX::Assembler(*this);
4704}
4705
4706Tool *CudaToolChain::buildLinker() const {
4707 return new tools::NVPTX::Linker(*this);
4708}
4709
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004710/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004711XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4712 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004713 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004714 // ProgramPaths are found via 'PATH' environment variable.
4715}
4716
Douglas Katzman54366072015-07-27 16:53:08 +00004717Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004718 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004719}
4720
Douglas Katzman54366072015-07-27 16:53:08 +00004721Tool *XCoreToolChain::buildLinker() const {
4722 return new tools::XCore::Linker(*this);
4723}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004724
Douglas Katzman54366072015-07-27 16:53:08 +00004725bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004726
Douglas Katzman54366072015-07-27 16:53:08 +00004727bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004728
Douglas Katzman54366072015-07-27 16:53:08 +00004729bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004730
Douglas Katzman54366072015-07-27 16:53:08 +00004731bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004732
Douglas Katzman54366072015-07-27 16:53:08 +00004733bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004734
Douglas Katzman54366072015-07-27 16:53:08 +00004735void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4736 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004737 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4738 DriverArgs.hasArg(options::OPT_nostdlibinc))
4739 return;
4740 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4741 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004742 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004743 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4744 ArrayRef<StringRef> DirVec(Dirs);
4745 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4746 }
4747}
4748
Douglas Katzman54366072015-07-27 16:53:08 +00004749void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4750 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004751 CC1Args.push_back("-nostdsysteminc");
4752}
4753
Douglas Katzman54366072015-07-27 16:53:08 +00004754void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4755 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004756 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004757 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4758 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004759 return;
4760 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4761 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004762 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004763 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4764 ArrayRef<StringRef> DirVec(Dirs);
4765 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4766 }
4767}
4768
Douglas Katzman54366072015-07-27 16:53:08 +00004769void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4770 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004771 // We don't output any lib args. This is handled by xcc.
4772}
Douglas Katzman84a75642015-06-19 14:55:19 +00004773
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004774MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4775 const ArgList &Args)
Douglas Katzman5eddc232016-05-09 19:09:59 +00004776 : Generic_ELF(D, Triple, Args) {
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004777 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4778 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4779 // This won't work to find gcc. Instead we give the installation detector an
4780 // extra triple, which is preferable to further hacks of the logic that at
4781 // present is based solely on getArch(). In particular, it would be wrong to
4782 // choose the myriad installation when targeting a non-myriad sparc install.
4783 switch (Triple.getArch()) {
4784 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00004785 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4786 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004787 case llvm::Triple::sparc:
4788 case llvm::Triple::sparcel:
4789 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004790 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004791 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004792
4793 if (GCCInstallation.isValid()) {
4794 // The contents of LibDir are independent of the version of gcc.
4795 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4796 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4797 if (Triple.getArch() == llvm::Triple::sparcel)
4798 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4799 else
4800 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4801 addPathIfExists(D, LibDir, getFilePaths());
4802
4803 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4804 // These files are tied to a particular version of gcc.
4805 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4806 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4807 // but as this toolchain is for LEON sparc, it can assume FPU.
4808 if (Triple.getArch() == llvm::Triple::sparcel)
4809 llvm::sys::path::append(CompilerSupportDir, "le");
4810 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4811 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004812}
4813
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004814MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004815
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004816void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4817 ArgStringList &CC1Args) const {
4818 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4819 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4820}
4821
Eric Christopherefef8ef2015-12-07 22:43:05 +00004822void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4823 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00004824 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4825 DriverArgs.hasArg(options::OPT_nostdincxx))
4826 return;
4827
4828 // Only libstdc++, for now.
4829 StringRef LibDir = GCCInstallation.getParentLibPath();
4830 const GCCVersion &Version = GCCInstallation.getVersion();
4831 StringRef TripleStr = GCCInstallation.getTriple().str();
4832 const Multilib &Multilib = GCCInstallation.getMultilib();
4833
Eric Christopherefef8ef2015-12-07 22:43:05 +00004834 addLibStdCXXIncludePaths(
4835 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4836 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00004837}
4838
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004839// MyriadToolChain handles several triples:
4840// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4841Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4842 // The inherited method works fine if not targeting the SHAVE.
4843 if (!isShaveCompilation(getTriple()))
4844 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004845 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00004846 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00004847 case Action::CompileJobClass:
4848 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004849 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004850 return Compiler.get();
4851 case Action::AssembleJobClass:
4852 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004853 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004854 return Assembler.get();
4855 default:
4856 return ToolChain::getTool(JA.getKind());
4857 }
4858}
4859
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004860Tool *MyriadToolChain::buildLinker() const {
4861 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004862}
Dan Gohmanc2853072015-09-03 22:51:53 +00004863
Dan Gohman52816862015-12-16 23:30:41 +00004864WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
4865 const llvm::opt::ArgList &Args)
4866 : ToolChain(D, Triple, Args) {
Dan Gohman57b62c52016-02-22 19:26:15 +00004867
4868 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
4869 getFilePaths().push_back(
4870 getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64"));
4871
Dan Gohman52816862015-12-16 23:30:41 +00004872 // Use LLD by default.
4873 DefaultLinker = "lld";
4874}
4875
Dan Gohmanc2853072015-09-03 22:51:53 +00004876bool WebAssembly::IsMathErrnoDefault() const { return false; }
4877
4878bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4879
4880bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4881
4882bool WebAssembly::isPICDefault() const { return false; }
4883
4884bool WebAssembly::isPIEDefault() const { return false; }
4885
4886bool WebAssembly::isPICDefaultForced() const { return false; }
4887
4888bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4889
4890// TODO: Support Objective C stuff.
4891bool WebAssembly::SupportsObjCGC() const { return false; }
4892
4893bool WebAssembly::hasBlocksRuntime() const { return false; }
4894
4895// TODO: Support profiling.
4896bool WebAssembly::SupportsProfiling() const { return false; }
4897
Dan Gohman52816862015-12-16 23:30:41 +00004898bool WebAssembly::HasNativeLLVMSupport() const { return true; }
4899
Dan Gohmanc2853072015-09-03 22:51:53 +00004900void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4901 ArgStringList &CC1Args) const {
4902 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4903 options::OPT_fno_use_init_array, true))
4904 CC1Args.push_back("-fuse-init-array");
4905}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004906
Dan Gohman6ad8f612016-01-14 16:00:13 +00004907ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
4908 return ToolChain::RLT_CompilerRT;
4909}
4910
4911ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
4912 return ToolChain::CST_Libcxx;
4913}
4914
4915void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4916 ArgStringList &CC1Args) const {
4917 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4918 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4919}
4920
4921void WebAssembly::AddClangCXXStdlibIncludeArgs(
4922 const llvm::opt::ArgList &DriverArgs,
4923 llvm::opt::ArgStringList &CC1Args) const {
4924 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
4925 !DriverArgs.hasArg(options::OPT_nostdincxx))
4926 addSystemInclude(DriverArgs, CC1Args,
4927 getDriver().SysRoot + "/include/c++/v1");
4928}
4929
Dan Gohman52816862015-12-16 23:30:41 +00004930Tool *WebAssembly::buildLinker() const {
4931 return new tools::wasm::Linker(*this);
4932}
4933
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004934PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4935 : Generic_ELF(D, Triple, Args) {
4936 if (Args.hasArg(options::OPT_static))
4937 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4938
Paul Robinson9d613612016-05-16 17:22:25 +00004939 // Determine where to find the PS4 libraries. We use SCE_ORBIS_SDK_DIR
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004940 // if it exists; otherwise use the driver's installation path, which
4941 // should be <SDK_DIR>/host_tools/bin.
4942
4943 SmallString<512> PS4SDKDir;
Paul Robinson9d613612016-05-16 17:22:25 +00004944 if (const char *EnvValue = getenv("SCE_ORBIS_SDK_DIR")) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004945 if (!llvm::sys::fs::exists(EnvValue))
4946 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4947 PS4SDKDir = EnvValue;
4948 } else {
4949 PS4SDKDir = getDriver().Dir;
4950 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00004951 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004952
Eric Christopherefef8ef2015-12-07 22:43:05 +00004953 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004954 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00004955 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004956 // If -isysroot was passed, use that as the SDK base path.
4957 std::string PrefixDir;
4958 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4959 PrefixDir = A->getValue();
4960 if (!llvm::sys::fs::exists(PrefixDir))
4961 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4962 } else
4963 PrefixDir = PS4SDKDir.str();
4964
4965 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4966 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4967 if (!Args.hasArg(options::OPT_nostdinc) &&
4968 !Args.hasArg(options::OPT_nostdlibinc) &&
4969 !Args.hasArg(options::OPT_isysroot) &&
4970 !Args.hasArg(options::OPT__sysroot_EQ) &&
4971 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4972 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4973 << "PS4 system headers" << PS4SDKIncludeDir;
4974 }
4975
4976 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4977 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4978 if (!Args.hasArg(options::OPT_nostdlib) &&
4979 !Args.hasArg(options::OPT_nodefaultlibs) &&
4980 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4981 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4982 !Args.hasArg(options::OPT_emit_ast) &&
4983 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4984 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4985 << "PS4 system libraries" << PS4SDKLibDir;
4986 return;
4987 }
4988 getFilePaths().push_back(PS4SDKLibDir.str());
4989}
4990
4991Tool *PS4CPU::buildAssembler() const {
4992 return new tools::PS4cpu::Assemble(*this);
4993}
4994
4995Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4996
4997bool PS4CPU::isPICDefault() const { return true; }
4998
4999bool PS4CPU::HasNativeLLVMSupport() const { return true; }
5000
5001SanitizerMask PS4CPU::getSupportedSanitizers() const {
5002 SanitizerMask Res = ToolChain::getSupportedSanitizers();
5003 Res |= SanitizerKind::Address;
5004 Res |= SanitizerKind::Vptr;
5005 return Res;
5006}