blob: 286b64d9df4e828bf8341540f04fe6aaa57e327f [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();
Bryan Chand346ae62016-06-17 16:47:14 +00001301 if (First.second.empty())
1302 return GoodVersion;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001303 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001304 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001305 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001306
1307 // First look for a number prefix and parse that if present. Otherwise just
1308 // stash the entire patch string in the suffix, and leave the number
1309 // unspecified. This covers versions strings such as:
Bryan Chand346ae62016-06-17 16:47:14 +00001310 // 5 (handled above)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001311 // 4.4
1312 // 4.4.0
1313 // 4.4.x
1314 // 4.4.2-rc4
1315 // 4.4.x-patched
1316 // And retains any patch number it finds.
1317 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1318 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001319 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001320 // Try to parse the number and any suffix.
1321 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1322 GoodVersion.Patch < 0)
1323 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001324 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001325 }
1326 }
1327
1328 return GoodVersion;
1329}
1330
1331/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001332bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1333 int RHSPatch,
1334 StringRef RHSPatchSuffix) const {
1335 if (Major != RHSMajor)
1336 return Major < RHSMajor;
1337 if (Minor != RHSMinor)
1338 return Minor < RHSMinor;
1339 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001340 // Note that versions without a specified patch sort higher than those with
1341 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001342 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001343 return true;
1344 if (Patch == -1)
1345 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001346
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001347 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001348 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001349 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001350 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001351 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001352 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001353 return true;
1354 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001355 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001356
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001357 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001358 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001359 }
1360
1361 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001362 return false;
1363}
1364
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001365static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001366 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1367 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001368 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001369 return GCC_INSTALL_PREFIX;
1370}
1371
Roman Divacky326d9982013-12-06 18:32:18 +00001372/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001373///
1374/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001375/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001376///
1377/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1378/// should instead pull the target out of the driver. This is currently
1379/// necessary because the driver doesn't store the final version of the target
1380/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001381void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001382 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001383 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001384 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1385 ? TargetTriple.get64BitArchVariant()
1386 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001387 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001388 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001389 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001390 SmallVector<StringRef, 16> CandidateTripleAliases;
1391 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001392 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1393 CandidateTripleAliases, CandidateBiarchLibDirs,
1394 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001395
1396 // Compute the set of prefixes for our search.
1397 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1398 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001399
Rafael Espindola1af7c212012-02-19 01:38:32 +00001400 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1401 if (GCCToolchainDir != "") {
1402 if (GCCToolchainDir.back() == '/')
1403 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001404
Rafael Espindola1af7c212012-02-19 01:38:32 +00001405 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001406 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001407 // If we have a SysRoot, try that first.
1408 if (!D.SysRoot.empty()) {
1409 Prefixes.push_back(D.SysRoot);
1410 Prefixes.push_back(D.SysRoot + "/usr");
1411 }
1412
1413 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001414 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001415
Rafael Espindola2edca412016-05-09 13:03:10 +00001416 // Then look for distribution supplied gcc installations.
1417 if (D.SysRoot.empty()) {
1418 // Look for RHEL devtoolsets.
1419 Prefixes.push_back("/opt/rh/devtoolset-4/root/usr");
1420 Prefixes.push_back("/opt/rh/devtoolset-3/root/usr");
1421 Prefixes.push_back("/opt/rh/devtoolset-2/root/usr");
1422 Prefixes.push_back("/opt/rh/devtoolset-1.1/root/usr");
1423 Prefixes.push_back("/opt/rh/devtoolset-1.0/root/usr");
1424 // And finally in /usr.
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001425 Prefixes.push_back("/usr");
Rafael Espindola2edca412016-05-09 13:03:10 +00001426 }
Rafael Espindolac29af942012-02-03 01:01:20 +00001427 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001428
1429 // Loop over the various components which exist and select the best GCC
1430 // installation available. GCC installs are ranked by version number.
1431 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001432 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001433 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001434 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001435 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001436 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001437 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001438 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001439 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001440 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001441 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001442 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001443 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001444 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001445 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001446 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001447 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001448 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001449 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001450 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001451 }
1452 }
1453}
1454
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001455void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001456 for (const auto &InstallPath : CandidateGCCInstallPaths)
1457 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001458
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001459 if (!GCCInstallPath.empty())
1460 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1461
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001462 for (const auto &Multilib : Multilibs)
1463 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001464
1465 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1466 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001467}
1468
1469bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1470 if (BiarchSibling.hasValue()) {
1471 M = BiarchSibling.getValue();
1472 return true;
1473 }
1474 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001475}
1476
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001477/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001478 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001479 SmallVectorImpl<StringRef> &LibDirs,
1480 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001481 SmallVectorImpl<StringRef> &BiarchLibDirs,
1482 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001483 // Declare a bunch of static data sets that we'll select between below. These
1484 // are specifically designed to always refer to string literals to avoid any
1485 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001486 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1487 static const char *const AArch64Triples[] = {
1488 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1489 "aarch64-redhat-linux"};
1490 static const char *const AArch64beLibDirs[] = {"/lib"};
1491 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1492 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001493
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001494 static const char *const ARMLibDirs[] = {"/lib"};
1495 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1496 "arm-linux-androideabi"};
1497 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1498 "armv7hl-redhat-linux-gnueabi"};
1499 static const char *const ARMebLibDirs[] = {"/lib"};
1500 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1501 "armeb-linux-androideabi"};
1502 static const char *const ARMebHFTriples[] = {
1503 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001504
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001505 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001506 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001507 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1508 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1509 "x86_64-redhat-linux", "x86_64-suse-linux",
1510 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1511 "x86_64-slackware-linux", "x86_64-linux-android",
1512 "x86_64-unknown-linux"};
1513 static const char *const X32LibDirs[] = {"/libx32"};
1514 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001515 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001516 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1517 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1518 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1519 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1520 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001521
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001522 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001523 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1524 "mips-mti-linux-gnu",
1525 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001526 static const char *const MIPSELLibDirs[] = {"/lib"};
1527 static const char *const MIPSELTriples[] = {
1528 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001529
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001530 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1531 static const char *const MIPS64Triples[] = {
1532 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1533 "mips64-linux-gnuabi64"};
1534 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1535 static const char *const MIPS64ELTriples[] = {
1536 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1537 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001538
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001539 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001540 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001541 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1542 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1543 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1544 static const char *const PPC64Triples[] = {
1545 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1546 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1547 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1548 static const char *const PPC64LETriples[] = {
1549 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1550 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001551
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001552 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1553 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1554 "sparcv8-linux-gnu"};
1555 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1556 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1557 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001558
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001559 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001560 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001561 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1562 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001563
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001564 // Solaris.
1565 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1566 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1567 "i386-pc-solaris2.11"};
1568
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001569 using std::begin;
1570 using std::end;
1571
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001572 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1573 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1574 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001575 return;
1576 }
1577
Chandler Carruth866faab2012-01-25 07:21:38 +00001578 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001579 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001580 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1581 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1582 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1583 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001584 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001585 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001586 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1587 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1588 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1589 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001590 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001591 case llvm::Triple::arm:
1592 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001593 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001594 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001595 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001596 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001597 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001598 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001599 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001600 case llvm::Triple::armeb:
1601 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001602 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001603 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001604 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001605 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001606 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001607 }
1608 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001609 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001610 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1611 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1612 // x32 is always available when x86_64 is available, so adding it as
1613 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001614 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001615 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1616 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001617 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001618 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1619 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001620 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001621 break;
1622 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001623 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001624 // MCU toolchain is 32 bit only and its triple alias is TargetTriple
1625 // itself, which will be appended below.
1626 if (!TargetTriple.isOSIAMCU()) {
1627 TripleAliases.append(begin(X86Triples), end(X86Triples));
1628 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1629 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1630 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001631 break;
1632 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001633 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1634 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1635 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1636 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001637 break;
1638 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001639 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1640 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1641 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1642 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1643 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001644 break;
1645 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001646 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1647 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1648 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1649 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001650 break;
1651 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001652 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1653 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1654 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1655 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1656 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001657 break;
1658 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001659 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1660 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1661 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1662 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001663 break;
1664 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001665 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1666 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1667 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1668 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001669 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001670 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001671 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1672 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001673 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001674 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001675 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001676 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1677 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1678 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1679 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001680 break;
1681 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001682 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1683 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1684 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1685 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001686 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001687 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001688 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1689 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001690 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001691 default:
1692 // By default, just rely on the standard lib directories and the original
1693 // triple.
1694 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001695 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001696
1697 // Always append the drivers target triple to the end, in case it doesn't
1698 // match any of our aliases.
1699 TripleAliases.push_back(TargetTriple.str());
1700
1701 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001702 if (TargetTriple.str() != BiarchTriple.str())
1703 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001704}
1705
Artem Belevich98607b62015-09-23 21:49:39 +00001706// \brief -- try common CUDA installation paths looking for files we need for
1707// CUDA compilation.
1708
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001709void Generic_GCC::CudaInstallationDetector::init(
1710 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001711 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001712
1713 if (Args.hasArg(options::OPT_cuda_path_EQ))
1714 CudaPathCandidates.push_back(
1715 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1716 else {
1717 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
Artem Belevich86017332015-11-17 22:28:55 +00001718 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001719 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1720 }
1721
Benjamin Kramere8b76412015-09-24 14:48:37 +00001722 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001723 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001724 continue;
1725
1726 CudaInstallPath = CudaPath;
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001727 CudaBinPath = CudaPath + "/bin";
Artem Belevich98607b62015-09-23 21:49:39 +00001728 CudaIncludePath = CudaInstallPath + "/include";
1729 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1730 CudaLibPath =
1731 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1732
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001733 if (!(D.getVFS().exists(CudaIncludePath) &&
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001734 D.getVFS().exists(CudaBinPath) && D.getVFS().exists(CudaLibPath) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001735 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001736 continue;
1737
Artem Belevich34f481a2015-11-17 22:28:50 +00001738 std::error_code EC;
1739 for (llvm::sys::fs::directory_iterator LI(CudaLibDevicePath, EC), LE;
1740 !EC && LI != LE; LI = LI.increment(EC)) {
1741 StringRef FilePath = LI->path();
1742 StringRef FileName = llvm::sys::path::filename(FilePath);
1743 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1744 const StringRef LibDeviceName = "libdevice.";
1745 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1746 continue;
1747 StringRef GpuArch = FileName.slice(
1748 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
1749 CudaLibDeviceMap[GpuArch] = FilePath.str();
1750 // Insert map entries for specifc devices with this compute capability.
1751 if (GpuArch == "compute_20") {
1752 CudaLibDeviceMap["sm_20"] = FilePath;
1753 CudaLibDeviceMap["sm_21"] = FilePath;
1754 } else if (GpuArch == "compute_30") {
1755 CudaLibDeviceMap["sm_30"] = FilePath;
1756 CudaLibDeviceMap["sm_32"] = FilePath;
1757 } else if (GpuArch == "compute_35") {
1758 CudaLibDeviceMap["sm_35"] = FilePath;
1759 CudaLibDeviceMap["sm_37"] = FilePath;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001760 } else if (GpuArch == "compute_50") {
1761 CudaLibDeviceMap["sm_50"] = FilePath;
1762 CudaLibDeviceMap["sm_52"] = FilePath;
1763 CudaLibDeviceMap["sm_53"] = FilePath;
Artem Belevich34f481a2015-11-17 22:28:50 +00001764 }
1765 }
1766
Artem Belevich98607b62015-09-23 21:49:39 +00001767 IsValid = true;
1768 break;
1769 }
1770}
1771
1772void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1773 if (isValid())
1774 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1775}
1776
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001777namespace {
1778// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001779class FilterNonExistent {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001780 StringRef Base, File;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001781 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001782
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001783public:
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001784 FilterNonExistent(StringRef Base, StringRef File, vfs::FileSystem &VFS)
1785 : Base(Base), File(File), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001786 bool operator()(const Multilib &M) {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001787 return !VFS.exists(Base + M.gccSuffix() + File);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001788 }
1789};
1790} // end anonymous namespace
1791
1792static void addMultilibFlag(bool Enabled, const char *const Flag,
1793 std::vector<std::string> &Flags) {
1794 if (Enabled)
1795 Flags.push_back(std::string("+") + Flag);
1796 else
1797 Flags.push_back(std::string("-") + Flag);
1798}
1799
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00001800static bool isArmOrThumbArch(llvm::Triple::ArchType Arch) {
1801 return Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb;
1802}
1803
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001804static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001805 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1806 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1807}
1808
1809static bool isMips32(llvm::Triple::ArchType Arch) {
1810 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1811}
1812
1813static bool isMips64(llvm::Triple::ArchType Arch) {
1814 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1815}
1816
1817static bool isMipsEL(llvm::Triple::ArchType Arch) {
1818 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1819}
1820
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001821static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001822 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001823 return A && A->getOption().matches(options::OPT_mips16);
1824}
1825
1826static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001827 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001828 return A && A->getOption().matches(options::OPT_mmicromips);
1829}
1830
Benjamin Kramere003ca22015-10-28 13:54:16 +00001831namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001832struct DetectedMultilibs {
1833 /// The set of multilibs that the detected installation supports.
1834 MultilibSet Multilibs;
1835
1836 /// The primary multilib appropriate for the given flags.
1837 Multilib SelectedMultilib;
1838
1839 /// On Biarch systems, this corresponds to the default multilib when
1840 /// targeting the non-default multilib. Otherwise, it is empty.
1841 llvm::Optional<Multilib> BiarchSibling;
1842};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001843} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001844
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001845static Multilib makeMultilib(StringRef commonSuffix) {
1846 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1847}
1848
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001849static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1850 StringRef Path, const ArgList &Args,
1851 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001852 // Some MIPS toolchains put libraries and object files compiled
1853 // using different options in to the sub-directoris which names
1854 // reflects the flags used for compilation. For example sysroot
1855 // directory might looks like the following examples:
1856 //
1857 // /usr
1858 // /lib <= crt*.o files compiled with '-mips32'
1859 // /mips16
1860 // /usr
1861 // /lib <= crt*.o files compiled with '-mips16'
1862 // /el
1863 // /usr
1864 // /lib <= crt*.o files compiled with '-mips16 -EL'
1865 //
1866 // or
1867 //
1868 // /usr
1869 // /lib <= crt*.o files compiled with '-mips32r2'
1870 // /mips16
1871 // /usr
1872 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1873 // /mips32
1874 // /usr
1875 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001876
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001877 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001878
Simon Atanasyancf7ac672016-05-22 15:27:58 +00001879 // Check for CodeScape MTI toolchain v1.2 and early.
1880 MultilibSet MtiMipsMultilibsV1;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001881 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001882 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001883 .flag("+m32")
1884 .flag("-m64")
1885 .flag("-mmicromips")
1886 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001887
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001888 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001889 .flag("+m32")
1890 .flag("-m64")
1891 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001892
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001893 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001894 .flag("-m32")
1895 .flag("+m64")
1896 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001897
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1899 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001900
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001901 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001902 .flag("+m32")
1903 .flag("-m64")
1904 .flag("-mmicromips")
1905 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001906
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001907 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001909 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001910
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001911 auto MAbi64 =
1912 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001913
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001914 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001915
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001916 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001917
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001918 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001919
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001920 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001921
Simon Atanasyancf7ac672016-05-22 15:27:58 +00001922 MtiMipsMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001923 MultilibSet()
1924 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1925 MArchDefault)
1926 .Maybe(UCLibc)
1927 .Maybe(Mips16)
1928 .FilterOut("/mips64/mips16")
1929 .FilterOut("/mips64r2/mips16")
1930 .FilterOut("/micromips/mips16")
1931 .Maybe(MAbi64)
1932 .FilterOut("/micromips/64")
1933 .FilterOut("/mips32/64")
1934 .FilterOut("^/64")
1935 .FilterOut("/mips16/64")
1936 .Either(BigEndian, LittleEndian)
1937 .Maybe(SoftFloat)
1938 .Maybe(Nan2008)
1939 .FilterOut(".*sof/nan2008")
1940 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00001941 .setIncludeDirsCallback([](const Multilib &M) {
1942 std::vector<std::string> Dirs({"/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001943 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
Simon Atanasyana45502d2016-05-19 15:07:21 +00001944 Dirs.push_back("/../../../../sysroot/uclibc/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001945 else
Simon Atanasyana45502d2016-05-19 15:07:21 +00001946 Dirs.push_back("/../../../../sysroot/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001947 return Dirs;
1948 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001949 }
1950
Simon Atanasyan2834a222016-05-22 18:18:07 +00001951 // Check for CodeScape IMG toolchain starting from v1.3.
1952 MultilibSet MtiMipsMultilibsV2;
1953 {
1954 auto BeHard = makeMultilib("/mips-r2-hard")
1955 .flag("+EB")
1956 .flag("-msoft-float")
1957 .flag("-mnan=2008")
1958 .flag("-muclibc");
1959 auto BeSoft = makeMultilib("/mips-r2-soft")
1960 .flag("+EB")
1961 .flag("+msoft-float")
1962 .flag("-mnan=2008");
1963 auto ElHard = makeMultilib("/mipsel-r2-hard")
1964 .flag("+EL")
1965 .flag("-msoft-float")
1966 .flag("-mnan=2008")
1967 .flag("-muclibc");
1968 auto ElSoft = makeMultilib("/mipsel-r2-soft")
1969 .flag("+EL")
1970 .flag("+msoft-float")
1971 .flag("-mnan=2008")
1972 .flag("-mmicromips");
1973 auto BeHardNan = makeMultilib("/mips-r2-hard-nan2008")
1974 .flag("+EB")
1975 .flag("-msoft-float")
1976 .flag("+mnan=2008")
1977 .flag("-muclibc");
1978 auto ElHardNan = makeMultilib("/mipsel-r2-hard-nan2008")
1979 .flag("+EL")
1980 .flag("-msoft-float")
1981 .flag("+mnan=2008")
1982 .flag("-muclibc")
1983 .flag("-mmicromips");
1984 auto BeHardNanUclibc = makeMultilib("/mips-r2-hard-nan2008-uclibc")
1985 .flag("+EB")
1986 .flag("-msoft-float")
1987 .flag("+mnan=2008")
1988 .flag("+muclibc");
1989 auto ElHardNanUclibc = makeMultilib("/mipsel-r2-hard-nan2008-uclibc")
1990 .flag("+EL")
1991 .flag("-msoft-float")
1992 .flag("+mnan=2008")
1993 .flag("+muclibc");
1994 auto BeHardUclibc = makeMultilib("/mips-r2-hard-uclibc")
1995 .flag("+EB")
1996 .flag("-msoft-float")
1997 .flag("-mnan=2008")
1998 .flag("+muclibc");
1999 auto ElHardUclibc = makeMultilib("/mipsel-r2-hard-uclibc")
2000 .flag("+EL")
2001 .flag("-msoft-float")
2002 .flag("-mnan=2008")
2003 .flag("+muclibc");
2004 auto ElMicroHardNan = makeMultilib("/micromipsel-r2-hard-nan2008")
2005 .flag("+EL")
2006 .flag("-msoft-float")
2007 .flag("+mnan=2008")
2008 .flag("+mmicromips");
2009 auto ElMicroSoft = makeMultilib("/micromipsel-r2-soft")
2010 .flag("+EL")
2011 .flag("+msoft-float")
2012 .flag("-mnan=2008")
2013 .flag("+mmicromips");
2014
2015 auto O32 =
2016 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2017 auto N32 =
2018 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2019 auto N64 =
2020 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2021
2022 MtiMipsMultilibsV2 =
2023 MultilibSet()
2024 .Either({BeHard, BeSoft, ElHard, ElSoft, BeHardNan, ElHardNan,
2025 BeHardNanUclibc, ElHardNanUclibc, BeHardUclibc,
2026 ElHardUclibc, ElMicroHardNan, ElMicroSoft})
2027 .Either(O32, N32, N64)
2028 .FilterOut(NonExistent)
2029 .setIncludeDirsCallback([](const Multilib &M) {
2030 return std::vector<std::string>({"/../../../../sysroot" +
2031 M.includeSuffix() +
2032 "/../usr/include"});
2033 })
2034 .setFilePathsCallback([](const Multilib &M) {
2035 return std::vector<std::string>(
2036 {"/../../../../mips-mti-linux-gnu/lib" + M.gccSuffix()});
2037 });
2038 }
2039
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002040 // Check for Musl toolchain multilibs
2041 MultilibSet MuslMipsMultilibs;
2042 {
2043 auto MArchMipsR2 = makeMultilib("")
2044 .osSuffix("/mips-r2-hard-musl")
2045 .flag("+EB")
2046 .flag("-EL")
2047 .flag("+march=mips32r2");
2048
2049 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
2050 .flag("-EB")
2051 .flag("+EL")
2052 .flag("+march=mips32r2");
2053
2054 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
2055
2056 // Specify the callback that computes the include directories.
Simon Atanasyana45502d2016-05-19 15:07:21 +00002057 MuslMipsMultilibs.setIncludeDirsCallback([](const Multilib &M) {
2058 return std::vector<std::string>(
2059 {"/../sysroot" + M.osSuffix() + "/usr/include"});
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002060 });
2061 }
2062
Simon Atanasyan4de8e6d2016-05-28 09:44:04 +00002063 // Check for Code Sourcery toolchain multilibs
2064 MultilibSet CSMipsMultilibs;
2065 {
2066 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
2067
2068 auto MArchMicroMips =
2069 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
2070
2071 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
2072
2073 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
2074
2075 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
2076
2077 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
2078
2079 auto DefaultFloat =
2080 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
2081
2082 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
2083
2084 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
2085
2086 // Note that this one's osSuffix is ""
2087 auto MAbi64 = makeMultilib("")
2088 .gccSuffix("/64")
2089 .includeSuffix("/64")
2090 .flag("+mabi=n64")
2091 .flag("-mabi=n32")
2092 .flag("-m32");
2093
2094 CSMipsMultilibs =
2095 MultilibSet()
2096 .Either(MArchMips16, MArchMicroMips, MArchDefault)
2097 .Maybe(UCLibc)
2098 .Either(SoftFloat, Nan2008, DefaultFloat)
2099 .FilterOut("/micromips/nan2008")
2100 .FilterOut("/mips16/nan2008")
2101 .Either(BigEndian, LittleEndian)
2102 .Maybe(MAbi64)
2103 .FilterOut("/mips16.*/64")
2104 .FilterOut("/micromips.*/64")
2105 .FilterOut(NonExistent)
2106 .setIncludeDirsCallback([](const Multilib &M) {
2107 std::vector<std::string> Dirs({"/include"});
2108 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
2109 Dirs.push_back(
2110 "/../../../../mips-linux-gnu/libc/uclibc/usr/include");
2111 else
2112 Dirs.push_back("/../../../../mips-linux-gnu/libc/usr/include");
2113 return Dirs;
2114 });
2115 }
2116
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002117 MultilibSet AndroidMipsMultilibs =
2118 MultilibSet()
2119 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
2120 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
2121 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002122
2123 MultilibSet DebianMipsMultilibs;
2124 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002125 Multilib MAbiN32 =
2126 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002127
2128 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002129 .gccSuffix("/64")
2130 .includeSuffix("/64")
2131 .flag("+m64")
2132 .flag("-m32")
2133 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002134
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002135 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002136
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002137 DebianMipsMultilibs =
2138 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002139 }
2140
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002141 // Check for CodeScape IMG toolchain v1.2 and early.
2142 MultilibSet ImgMultilibsV1;
Daniel Sanders2bf13662014-07-10 14:40:57 +00002143 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002144 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002145
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002146 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002147
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002148 auto MAbi64 =
2149 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002150
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002151 ImgMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002152 MultilibSet()
2153 .Maybe(Mips64r6)
2154 .Maybe(MAbi64)
2155 .Maybe(LittleEndian)
2156 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002157 .setIncludeDirsCallback([](const Multilib &M) {
2158 return std::vector<std::string>(
2159 {"/include", "/../../../../sysroot/usr/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002160 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002161 }
2162
Simon Atanasyan2834a222016-05-22 18:18:07 +00002163 // Check for CodeScape IMG toolchain starting from v1.3.
2164 MultilibSet ImgMultilibsV2;
2165 {
2166 auto BeHard = makeMultilib("/mips-r6-hard")
2167 .flag("+EB")
2168 .flag("-msoft-float")
2169 .flag("-mmicromips");
2170 auto BeSoft = makeMultilib("/mips-r6-soft")
2171 .flag("+EB")
2172 .flag("+msoft-float")
2173 .flag("-mmicromips");
2174 auto ElHard = makeMultilib("/mipsel-r6-hard")
2175 .flag("+EL")
2176 .flag("-msoft-float")
2177 .flag("-mmicromips");
2178 auto ElSoft = makeMultilib("/mipsel-r6-soft")
2179 .flag("+EL")
2180 .flag("+msoft-float")
2181 .flag("-mmicromips");
2182 auto BeMicroHard = makeMultilib("/micromips-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002183 .flag("+EB")
2184 .flag("-msoft-float")
2185 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002186 auto BeMicroSoft = makeMultilib("/micromips-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002187 .flag("+EB")
2188 .flag("+msoft-float")
2189 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002190 auto ElMicroHard = makeMultilib("/micromipsel-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002191 .flag("+EL")
2192 .flag("-msoft-float")
2193 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002194 auto ElMicroSoft = makeMultilib("/micromipsel-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002195 .flag("+EL")
2196 .flag("+msoft-float")
2197 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002198
2199 auto O32 =
2200 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2201 auto N32 =
2202 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2203 auto N64 =
2204 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2205
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002206 ImgMultilibsV2 =
2207 MultilibSet()
2208 .Either({BeHard, BeSoft, ElHard, ElSoft, BeMicroHard, BeMicroSoft,
2209 ElMicroHard, ElMicroSoft})
2210 .Either(O32, N32, N64)
2211 .FilterOut(NonExistent)
2212 .setIncludeDirsCallback([](const Multilib &M) {
2213 return std::vector<std::string>({"/../../../../sysroot" +
2214 M.includeSuffix() +
2215 "/../usr/include"});
2216 })
2217 .setFilePathsCallback([](const Multilib &M) {
2218 return std::vector<std::string>(
2219 {"/../../../../mips-img-linux-gnu/lib" + M.gccSuffix()});
2220 });
Simon Atanasyan2834a222016-05-22 18:18:07 +00002221 }
2222
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002223 StringRef CPUName;
2224 StringRef ABIName;
2225 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2226
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002227 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2228
2229 Multilib::flags_list Flags;
2230 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2231 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2232 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002233 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002234 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002235 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002236 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002237 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002238 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002239 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2240 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002241 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002242 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002243 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002244 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2245 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002246 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2247 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002248 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002249 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002250 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002251 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002252
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002253 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002254 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00002255 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2256 Result.Multilibs = AndroidMipsMultilibs;
2257 return true;
2258 }
2259 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002260 }
2261
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002262 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2263 TargetTriple.getOS() == llvm::Triple::Linux &&
2264 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2265 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2266 Result.Multilibs = MuslMipsMultilibs;
2267 return true;
2268 }
2269 return false;
2270 }
2271
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002272 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2273 TargetTriple.getOS() == llvm::Triple::Linux &&
2274 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2275 // Select mips-mti-linux-gnu toolchain.
Simon Atanasyan96d06c62016-05-28 09:44:15 +00002276 for (auto Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
2277 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2278 Result.Multilibs = *Candidate;
Simon Atanasyan2834a222016-05-22 18:18:07 +00002279 return true;
2280 }
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002281 }
2282 return false;
2283 }
2284
Daniel Sanders2bf13662014-07-10 14:40:57 +00002285 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2286 TargetTriple.getOS() == llvm::Triple::Linux &&
2287 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2288 // Select mips-img-linux-gnu toolchain.
Simon Atanasyan96d06c62016-05-28 09:44:15 +00002289 for (auto Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
2290 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2291 Result.Multilibs = *Candidate;
Simon Atanasyan2834a222016-05-22 18:18:07 +00002292 return true;
2293 }
Daniel Sanders2bf13662014-07-10 14:40:57 +00002294 }
2295 return false;
2296 }
2297
Simon Atanasyan4de8e6d2016-05-28 09:44:04 +00002298 // Sort candidates. Toolchain that best meets the directories tree goes first.
2299 // Then select the first toolchains matches command line flags.
2300 MultilibSet *Candidates[] = {&CSMipsMultilibs, &DebianMipsMultilibs};
2301 if (CSMipsMultilibs.size() < DebianMipsMultilibs.size())
2302 std::iter_swap(Candidates, Candidates + 1);
2303 for (const MultilibSet *Candidate : Candidates) {
2304 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2305 if (Candidate == &DebianMipsMultilibs)
2306 Result.BiarchSibling = Multilib();
2307 Result.Multilibs = *Candidate;
2308 return true;
2309 }
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002310 }
2311
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002312 {
2313 // Fallback to the regular toolchain-tree structure.
2314 Multilib Default;
2315 Result.Multilibs.push_back(Default);
2316 Result.Multilibs.FilterOut(NonExistent);
2317
2318 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2319 Result.BiarchSibling = Multilib();
2320 return true;
2321 }
2322 }
2323
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002324 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002325}
2326
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002327static void findAndroidArmMultilibs(const Driver &D,
2328 const llvm::Triple &TargetTriple,
2329 StringRef Path, const ArgList &Args,
2330 DetectedMultilibs &Result) {
2331 // Find multilibs with subdirectories like armv7-a, thumb, armv7-a/thumb.
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002332 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002333 Multilib ArmV7Multilib = makeMultilib("/armv7-a")
2334 .flag("+armv7")
2335 .flag("-thumb");
2336 Multilib ThumbMultilib = makeMultilib("/thumb")
2337 .flag("-armv7")
2338 .flag("+thumb");
2339 Multilib ArmV7ThumbMultilib = makeMultilib("/armv7-a/thumb")
2340 .flag("+armv7")
2341 .flag("+thumb");
2342 Multilib DefaultMultilib = makeMultilib("")
2343 .flag("-armv7")
2344 .flag("-thumb");
2345 MultilibSet AndroidArmMultilibs =
2346 MultilibSet()
2347 .Either(ThumbMultilib, ArmV7Multilib,
2348 ArmV7ThumbMultilib, DefaultMultilib)
2349 .FilterOut(NonExistent);
2350
2351 Multilib::flags_list Flags;
2352 llvm::StringRef Arch = Args.getLastArgValue(options::OPT_march_EQ);
2353 bool IsArmArch = TargetTriple.getArch() == llvm::Triple::arm;
2354 bool IsThumbArch = TargetTriple.getArch() == llvm::Triple::thumb;
2355 bool IsV7SubArch = TargetTriple.getSubArch() == llvm::Triple::ARMSubArch_v7;
2356 bool IsThumbMode = IsThumbArch ||
2357 Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, false) ||
2358 (IsArmArch && llvm::ARM::parseArchISA(Arch) == llvm::ARM::IK_THUMB);
2359 bool IsArmV7Mode = (IsArmArch || IsThumbArch) &&
2360 (llvm::ARM::parseArchVersion(Arch) == 7 ||
2361 (IsArmArch && Arch == "" && IsV7SubArch));
2362 addMultilibFlag(IsArmV7Mode, "armv7", Flags);
2363 addMultilibFlag(IsThumbMode, "thumb", Flags);
2364
2365 if (AndroidArmMultilibs.select(Flags, Result.SelectedMultilib))
2366 Result.Multilibs = AndroidArmMultilibs;
2367}
2368
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002369static bool findBiarchMultilibs(const Driver &D,
2370 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002371 StringRef Path, const ArgList &Args,
2372 bool NeedsBiarchSuffix,
2373 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002374 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2375 // in what would normally be GCCInstallPath and put the 64-bit
2376 // libs in a subdirectory named 64. The simple logic we follow is that
2377 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2378 // we use that. If not, and if not a biarch triple alias, we look for
2379 // crtbegin.o without the subdirectory.
2380
2381 Multilib Default;
2382 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002383 .gccSuffix("/64")
2384 .includeSuffix("/64")
2385 .flag("-m32")
2386 .flag("+m64")
2387 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002388 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002389 .gccSuffix("/32")
2390 .includeSuffix("/32")
2391 .flag("+m32")
2392 .flag("-m64")
2393 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002394 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002395 .gccSuffix("/x32")
2396 .includeSuffix("/x32")
2397 .flag("-m32")
2398 .flag("-m64")
2399 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002400
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002401 // GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a.
2402 FilterNonExistent NonExistent(
2403 Path, TargetTriple.isOSIAMCU() ? "/libgcc.a" : "/crtbegin.o", D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002404
Zinovy Nis1db95732014-07-10 15:27:19 +00002405 // Determine default multilib from: 32, 64, x32
2406 // Also handle cases such as 64 on 32, 32 on 64, etc.
2407 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002408 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002409 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002410 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002411 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002412 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002413 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002414 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002415 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002416 if (TargetTriple.isArch32Bit())
2417 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002418 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002419 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002420 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002421 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002422 }
2423
Zinovy Nis1db95732014-07-10 15:27:19 +00002424 if (Want == WANT32)
2425 Default.flag("+m32").flag("-m64").flag("-mx32");
2426 else if (Want == WANT64)
2427 Default.flag("-m32").flag("+m64").flag("-mx32");
2428 else if (Want == WANTX32)
2429 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002430 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002431 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002432
Simon Atanasyan60280b42014-05-12 07:37:51 +00002433 Result.Multilibs.push_back(Default);
2434 Result.Multilibs.push_back(Alt64);
2435 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002436 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002437
Simon Atanasyan60280b42014-05-12 07:37:51 +00002438 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002439
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002440 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002441 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002442 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002443 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002444
Simon Atanasyan60280b42014-05-12 07:37:51 +00002445 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002446 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002447
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002448 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002449 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002450 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002451
2452 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002453}
2454
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002455void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2456 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2457 const std::string &LibDir, StringRef CandidateTriple,
2458 bool NeedsBiarchSuffix) {
2459 // Solaris is a special case. The GCC installation is under
2460 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2461 // need to iterate twice.
2462 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002463 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2464 !EC && LI != LE; LI = LI.increment(EC)) {
2465 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002466 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2467
2468 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002469 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002470 continue; // Saw this path before; no need to look at it again.
2471 if (CandidateVersion.isOlderThan(4, 1, 1))
2472 continue;
2473 if (CandidateVersion <= Version)
2474 continue;
2475
2476 GCCInstallPath =
2477 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002478 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002479 continue;
2480
2481 // If we make it here there has to be at least one GCC version, let's just
2482 // use the latest one.
2483 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002484 for (vfs::directory_iterator
2485 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2486 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002487 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2488
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002489 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002490 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2491
2492 if (CandidateSubVersion > Version)
2493 Version = CandidateSubVersion;
2494 }
2495
2496 GCCTriple.setTriple(CandidateTriple);
2497
2498 GCCInstallPath += "/" + Version.Text;
2499 GCCParentLibPath = GCCInstallPath + "/../../../../";
2500
2501 IsValid = true;
2502 }
2503}
2504
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002505void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002506 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002507 const std::string &LibDir, StringRef CandidateTriple,
2508 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002509 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002510 // There are various different suffixes involving the triple we
2511 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002512 // up to the lib directory. Specifically, the number of "up" steps
2513 // in the second half of each row is 1 + the number of path separators
2514 // in the first half.
2515 const std::string LibAndInstallSuffixes[][2] = {
2516 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2517
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002518 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002519 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2520
2521 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2522 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002523
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002524 // The Freescale PPC SDK has the gcc libraries in
2525 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002526 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002527
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002528 // Ubuntu has a strange mis-matched pair of triples that this happens to
2529 // match.
2530 // FIXME: It may be worthwhile to generalize this and look for a second
2531 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002532 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2533
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002534 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2535 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2536 NeedsBiarchSuffix);
2537 return;
2538 }
2539
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002540 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002541 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2542 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002543 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002544 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002545 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002546 for (vfs::directory_iterator
2547 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2548 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002549 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002550 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002551 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002552 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002553 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002554 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002555 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002556 continue;
2557 if (CandidateVersion <= Version)
2558 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002559
Simon Atanasyan60280b42014-05-12 07:37:51 +00002560 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002561
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002562 // Android standalone toolchain could have multilibs for ARM and Thumb.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002563 // Debian mips multilibs behave more like the rest of the biarch ones,
2564 // so handle them there
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002565 if (isArmOrThumbArch(TargetArch) && TargetTriple.isAndroid()) {
2566 // It should also work without multilibs in a simplified toolchain.
2567 findAndroidArmMultilibs(D, TargetTriple, LI->getName(), Args, Detected);
2568 } else if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002569 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002570 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002571 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002572 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002573 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002574 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002575
Simon Atanasyan60280b42014-05-12 07:37:51 +00002576 Multilibs = Detected.Multilibs;
2577 SelectedMultilib = Detected.SelectedMultilib;
2578 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002579 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002580 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002581 // FIXME: We hack together the directory name here instead of
2582 // using LI to ensure stable path separators across Windows and
2583 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002584 GCCInstallPath =
2585 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2586 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002587 IsValid = true;
2588 }
2589 }
2590}
2591
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002592Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002593 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002594 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002595 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002596 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002597 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002598}
2599
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002600Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002601
Rafael Espindola7cf32212013-03-20 03:05:54 +00002602Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002603 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002604 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002605 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002606 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002607 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002608 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002609 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002610 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002611 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002612 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002613 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002614 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002615}
2616
Rafael Espindola7cf32212013-03-20 03:05:54 +00002617Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002618 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002619}
2620
Douglas Katzman95354292015-06-23 20:42:09 +00002621Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002622
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002623void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2624 // Print the information about how we detected the GCC installation.
2625 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002626 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002627}
2628
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002629bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002630 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002631}
2632
David Majnemer17f448b2015-06-28 04:23:33 +00002633bool Generic_GCC::isPICDefault() const {
2634 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2635}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002636
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002637bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002638
David Majnemer17f448b2015-06-28 04:23:33 +00002639bool Generic_GCC::isPICDefaultForced() const {
2640 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2641}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002642
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002643bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002644 switch (getTriple().getArch()) {
2645 case llvm::Triple::x86:
2646 case llvm::Triple::x86_64:
2647 case llvm::Triple::aarch64:
2648 case llvm::Triple::aarch64_be:
2649 case llvm::Triple::arm:
2650 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002651 case llvm::Triple::bpfel:
2652 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002653 case llvm::Triple::thumb:
2654 case llvm::Triple::thumbeb:
2655 case llvm::Triple::ppc:
2656 case llvm::Triple::ppc64:
2657 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002658 case llvm::Triple::systemz:
Daniel Sanderse160f832016-05-14 12:43:08 +00002659 case llvm::Triple::mips:
2660 case llvm::Triple::mipsel:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002661 return true;
2662 default:
2663 return false;
2664 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002665}
2666
James Y Knighta6c9ee72015-10-16 18:46:26 +00002667/// \brief Helper to add the variant paths of a libstdc++ installation.
2668bool Generic_GCC::addLibStdCXXIncludePaths(
2669 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2670 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2671 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2672 if (!getVFS().exists(Base + Suffix))
2673 return false;
2674
2675 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2676
2677 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2678 // that path exists or we have neither a GCC nor target multiarch triple, use
2679 // this vanilla search path.
2680 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2681 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2682 addSystemInclude(DriverArgs, CC1Args,
2683 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2684 } else {
2685 // Otherwise try to use multiarch naming schemes which have normalized the
2686 // triples and put the triple before the suffix.
2687 //
2688 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2689 // the target triple, so we support that here.
2690 addSystemInclude(DriverArgs, CC1Args,
2691 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2692 addSystemInclude(DriverArgs, CC1Args,
2693 Base + "/" + TargetMultiarchTriple + Suffix);
2694 }
2695
2696 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2697 return true;
2698}
2699
Kristof Beylsfb387292014-01-10 13:44:34 +00002700void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2701 ArgStringList &CC1Args) const {
2702 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002703 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002704 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002705 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002706 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002707 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002708 getTriple().getOS() == llvm::Triple::NaCl ||
2709 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2710 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002711
2712 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002713 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002714 CC1Args.push_back("-fuse-init-array");
2715}
2716
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002717/// Mips Toolchain
2718MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2719 const llvm::Triple &Triple,
2720 const ArgList &Args)
2721 : Linux(D, Triple, Args) {
2722 // Select the correct multilib according to the given arguments.
2723 DetectedMultilibs Result;
2724 findMIPSMultilibs(D, Triple, "", Args, Result);
2725 Multilibs = Result.Multilibs;
2726 SelectedMultilib = Result.SelectedMultilib;
2727
2728 // Find out the library suffix based on the ABI.
2729 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2730 getFilePaths().clear();
2731 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2732
2733 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002734 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002735}
2736
2737void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2738 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2739 if (DriverArgs.hasArg(options::OPT_nostdinc))
2740 return;
2741
2742 const Driver &D = getDriver();
2743
2744 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2745 SmallString<128> P(D.ResourceDir);
2746 llvm::sys::path::append(P, "include");
2747 addSystemInclude(DriverArgs, CC1Args, P);
2748 }
2749
2750 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2751 return;
2752
2753 const auto &Callback = Multilibs.includeDirsCallback();
2754 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002755 for (const auto &Path : Callback(SelectedMultilib))
2756 addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
2757 D.getInstalledDir() + Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002758 }
2759}
2760
2761Tool *MipsLLVMToolChain::buildLinker() const {
2762 return new tools::gnutools::Linker(*this);
2763}
2764
2765std::string MipsLLVMToolChain::computeSysRoot() const {
2766 if (!getDriver().SysRoot.empty())
2767 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2768
2769 const std::string InstalledDir(getDriver().getInstalledDir());
2770 std::string SysRootPath =
2771 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2772 if (llvm::sys::fs::exists(SysRootPath))
2773 return SysRootPath;
2774
2775 return std::string();
2776}
2777
2778ToolChain::CXXStdlibType
2779MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2780 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2781 if (A) {
2782 StringRef Value = A->getValue();
2783 if (Value != "libc++")
2784 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2785 << A->getAsString(Args);
2786 }
2787
2788 return ToolChain::CST_Libcxx;
2789}
2790
2791void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2792 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2793 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2794 DriverArgs.hasArg(options::OPT_nostdincxx))
2795 return;
2796
2797 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2798 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2799
2800 const auto &Callback = Multilibs.includeDirsCallback();
2801 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002802 for (std::string Path : Callback(SelectedMultilib)) {
2803 Path = getDriver().getInstalledDir() + Path + "/c++/v1";
2804 if (llvm::sys::fs::exists(Path)) {
2805 addSystemInclude(DriverArgs, CC1Args, Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002806 break;
2807 }
2808 }
2809 }
2810}
2811
2812void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2813 ArgStringList &CmdArgs) const {
2814 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2815 "Only -lc++ (aka libxx) is suported in this toolchain.");
2816
2817 CmdArgs.push_back("-lc++");
2818 CmdArgs.push_back("-lc++abi");
2819 CmdArgs.push_back("-lunwind");
2820}
2821
2822std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2823 StringRef Component,
2824 bool Shared) const {
2825 SmallString<128> Path(getDriver().ResourceDir);
2826 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2827 getOS());
2828 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002829 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002830 return Path.str();
2831}
2832
Tony Linthicum76329bf2011-12-12 21:14:55 +00002833/// Hexagon Toolchain
2834
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002835std::string HexagonToolChain::getHexagonTargetDir(
2836 const std::string &InstalledDir,
2837 const SmallVectorImpl<std::string> &PrefixDirs) const {
2838 std::string InstallRelDir;
2839 const Driver &D = getDriver();
2840
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002841 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002842 for (auto &I : PrefixDirs)
2843 if (D.getVFS().exists(I))
2844 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00002845
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002846 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002847 return InstallRelDir;
2848
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002849 return InstallRelDir;
2850}
2851
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002852Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
2853 const ArgList &Args) {
2854 StringRef Gn = "";
2855 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
2856 options::OPT_msmall_data_threshold_EQ)) {
2857 Gn = A->getValue();
2858 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
2859 options::OPT_fPIC)) {
2860 Gn = "0";
2861 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002862
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002863 unsigned G;
2864 if (!Gn.getAsInteger(10, G))
2865 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002866
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002867 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002868}
2869
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002870void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
2871 ToolChain::path_list &LibPaths) const {
2872 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00002873
2874 //----------------------------------------------------------------------------
2875 // -L Args
2876 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002877 for (Arg *A : Args.filtered(options::OPT_L))
2878 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002879 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002880
2881 //----------------------------------------------------------------------------
2882 // Other standard paths
2883 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002884 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00002885 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
2886 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00002887
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002888 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2889 D.PrefixDirs);
2890 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
2891 RootDirs.push_back(TargetDir);
2892
2893 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
2894 // Assume G0 with -shared.
2895 bool HasG0 = Args.hasArg(options::OPT_shared);
2896 if (auto G = getSmallDataThreshold(Args))
2897 HasG0 = G.getValue() == 0;
2898
2899 const std::string CpuVer = GetTargetCPUVersion(Args).str();
2900 for (auto &Dir : RootDirs) {
2901 std::string LibDir = Dir + "/hexagon/lib";
2902 std::string LibDirCpu = LibDir + '/' + CpuVer;
2903 if (HasG0) {
2904 if (HasPIC)
2905 LibPaths.push_back(LibDirCpu + "/G0/pic");
2906 LibPaths.push_back(LibDirCpu + "/G0");
2907 }
2908 LibPaths.push_back(LibDirCpu);
2909 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00002910 }
Matthew Curtise689b052012-12-06 15:46:07 +00002911}
2912
Douglas Katzman54366072015-07-27 16:53:08 +00002913HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002914 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002915 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002916 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2917 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002918
2919 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2920 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002921 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002922 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002923 getProgramPaths().push_back(BinDir);
2924
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002925 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002926
2927 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2928 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2929 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002930 LibPaths.clear();
2931 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002932}
2933
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002934HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002935
Douglas Katzman54366072015-07-27 16:53:08 +00002936Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002937 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002938}
2939
Douglas Katzman54366072015-07-27 16:53:08 +00002940Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002941 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002942}
2943
Douglas Katzman54366072015-07-27 16:53:08 +00002944void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2945 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002946 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2947 DriverArgs.hasArg(options::OPT_nostdlibinc))
2948 return;
2949
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002950 const Driver &D = getDriver();
2951 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2952 D.PrefixDirs);
2953 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002954}
2955
Douglas Katzman54366072015-07-27 16:53:08 +00002956void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2957 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002958 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2959 DriverArgs.hasArg(options::OPT_nostdincxx))
2960 return;
2961
2962 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002963 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
2964 addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002965}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002966
Matthew Curtise689b052012-12-06 15:46:07 +00002967ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002968HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002969 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2970 if (!A)
2971 return ToolChain::CST_Libstdcxx;
2972
2973 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002974 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002975 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002976
2977 return ToolChain::CST_Libstdcxx;
2978}
2979
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002980//
2981// Returns the default CPU for Hexagon. This is the default compilation target
2982// if no Hexagon processor is selected at the command-line.
2983//
2984const StringRef HexagonToolChain::GetDefaultCPU() {
2985 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002986}
2987
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002988const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
2989 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00002990 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
2991 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002992
2993 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
2994 if (CPU.startswith("hexagon"))
2995 return CPU.substr(sizeof("hexagon") - 1);
2996 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002997}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002998// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002999
Tom Stellard8fa33092015-07-18 01:49:05 +00003000/// AMDGPU Toolchain
3001AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
3002 const ArgList &Args)
3003 : Generic_ELF(D, Triple, Args) { }
3004
3005Tool *AMDGPUToolChain::buildLinker() const {
3006 return new tools::amdgpu::Linker(*this);
3007}
3008// End AMDGPU
3009
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003010/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00003011NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
3012 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003013 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003014
3015 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
3016 // default paths, and must instead only use the paths provided
3017 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003018 path_list &file_paths = getFilePaths();
3019 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003020
3021 file_paths.clear();
3022 prog_paths.clear();
3023
3024 // Path for library files (libc.a, ...)
3025 std::string FilePath(getDriver().Dir + "/../");
3026
3027 // Path for tools (clang, ld, etc..)
3028 std::string ProgPath(getDriver().Dir + "/../");
3029
3030 // Path for toolchain libraries (libgcc.a, ...)
3031 std::string ToolPath(getDriver().ResourceDir + "/lib/");
3032
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003033 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00003034 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003035 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00003036 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003037 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3038 file_paths.push_back(ToolPath + "i686-nacl");
3039 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003040 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003041 file_paths.push_back(FilePath + "x86_64-nacl/lib");
3042 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
3043 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3044 file_paths.push_back(ToolPath + "x86_64-nacl");
3045 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003046 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003047 file_paths.push_back(FilePath + "arm-nacl/lib");
3048 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
3049 prog_paths.push_back(ProgPath + "arm-nacl/bin");
3050 file_paths.push_back(ToolPath + "arm-nacl");
3051 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003052 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003053 file_paths.push_back(FilePath + "mipsel-nacl/lib");
3054 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
3055 prog_paths.push_back(ProgPath + "bin");
3056 file_paths.push_back(ToolPath + "mipsel-nacl");
3057 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003058 default:
3059 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003060 }
3061
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003062 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
3063}
3064
Douglas Katzman54366072015-07-27 16:53:08 +00003065void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3066 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003067 const Driver &D = getDriver();
3068 if (DriverArgs.hasArg(options::OPT_nostdinc))
3069 return;
3070
3071 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
3072 SmallString<128> P(D.ResourceDir);
3073 llvm::sys::path::append(P, "include");
3074 addSystemInclude(DriverArgs, CC1Args, P.str());
3075 }
3076
3077 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3078 return;
3079
3080 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003081 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00003082 case llvm::Triple::x86:
3083 // x86 is special because multilib style uses x86_64-nacl/include for libc
3084 // headers but the SDK wants i686-nacl/usr/include. The other architectures
3085 // have the same substring.
3086 llvm::sys::path::append(P, "i686-nacl/usr/include");
3087 addSystemInclude(DriverArgs, CC1Args, P.str());
3088 llvm::sys::path::remove_filename(P);
3089 llvm::sys::path::remove_filename(P);
3090 llvm::sys::path::remove_filename(P);
3091 llvm::sys::path::append(P, "x86_64-nacl/include");
3092 addSystemInclude(DriverArgs, CC1Args, P.str());
3093 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003094 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003095 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003096 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003097 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003098 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003099 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003100 case llvm::Triple::mipsel:
3101 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
3102 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003103 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003104 return;
3105 }
3106
3107 addSystemInclude(DriverArgs, CC1Args, P.str());
3108 llvm::sys::path::remove_filename(P);
3109 llvm::sys::path::remove_filename(P);
3110 llvm::sys::path::append(P, "include");
3111 addSystemInclude(DriverArgs, CC1Args, P.str());
3112}
3113
Douglas Katzman54366072015-07-27 16:53:08 +00003114void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3115 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003116 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3117 // if the value is libc++, and emits an error for other values.
3118 GetCXXStdlibType(Args);
3119 CmdArgs.push_back("-lc++");
3120}
3121
Douglas Katzman54366072015-07-27 16:53:08 +00003122void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3123 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003124 const Driver &D = getDriver();
3125 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3126 DriverArgs.hasArg(options::OPT_nostdincxx))
3127 return;
3128
3129 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3130 // if the value is libc++, and emits an error for other values.
3131 GetCXXStdlibType(DriverArgs);
3132
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003133 SmallString<128> P(D.Dir + "/../");
3134 switch (getTriple().getArch()) {
3135 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003136 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
3137 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003138 break;
3139 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003140 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
3141 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003142 break;
3143 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003144 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
3145 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003146 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003147 case llvm::Triple::mipsel:
3148 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
3149 addSystemInclude(DriverArgs, CC1Args, P.str());
3150 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00003151 default:
3152 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003153 }
3154}
3155
Douglas Katzman54366072015-07-27 16:53:08 +00003156ToolChain::CXXStdlibType
3157NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003158 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3159 StringRef Value = A->getValue();
3160 if (Value == "libc++")
3161 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003162 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003163 }
3164
3165 return ToolChain::CST_Libcxx;
3166}
3167
Douglas Katzman54366072015-07-27 16:53:08 +00003168std::string
3169NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
3170 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003171 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
3172 if (TheTriple.getArch() == llvm::Triple::arm &&
3173 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
3174 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
3175 return TheTriple.getTriple();
3176}
3177
Douglas Katzman54366072015-07-27 16:53:08 +00003178Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003179 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003180}
3181
Douglas Katzman54366072015-07-27 16:53:08 +00003182Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003183 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00003184 return new tools::nacltools::AssemblerARM(*this);
3185 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003186}
3187// End NaCl
3188
Chris Lattner09797542010-03-04 21:07:38 +00003189/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
3190/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
3191/// Currently does not support anything else but compilation.
3192
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003193TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00003194 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003195 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00003196 // Path mangling to find libexec
3197 std::string Path(getDriver().Dir);
3198
3199 Path += "/../libexec";
3200 getProgramPaths().push_back(Path);
3201}
3202
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00003203TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00003204
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003205bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00003206
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003207bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003208
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003209bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003210
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003211bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003212
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003213// CloudABI - CloudABI tool chain which can call ld(1) directly.
3214
3215CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
3216 const ArgList &Args)
3217 : Generic_ELF(D, Triple, Args) {
3218 SmallString<128> P(getDriver().Dir);
3219 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
3220 getFilePaths().push_back(P.str());
3221}
3222
3223void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3224 ArgStringList &CC1Args) const {
3225 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
3226 DriverArgs.hasArg(options::OPT_nostdincxx))
3227 return;
3228
3229 SmallString<128> P(getDriver().Dir);
3230 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
3231 addSystemInclude(DriverArgs, CC1Args, P.str());
3232}
3233
3234void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
3235 ArgStringList &CmdArgs) const {
3236 CmdArgs.push_back("-lc++");
3237 CmdArgs.push_back("-lc++abi");
3238 CmdArgs.push_back("-lunwind");
3239}
3240
Douglas Katzman95354292015-06-23 20:42:09 +00003241Tool *CloudABI::buildLinker() const {
3242 return new tools::cloudabi::Linker(*this);
3243}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003244
Ed Schouten51bfbe72016-02-17 18:56:20 +00003245SanitizerMask CloudABI::getSupportedSanitizers() const {
3246 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3247 Res |= SanitizerKind::SafeStack;
3248 return Res;
3249}
3250
Ed Schoutenfc79d2c2016-03-29 21:13:53 +00003251SanitizerMask CloudABI::getDefaultSanitizers() const {
3252 return SanitizerKind::SafeStack;
3253}
3254
Reid Kleckner330fb172016-05-11 16:19:05 +00003255/// Haiku - Haiku tool chain which can call as(1) and ld(1) directly.
3256
3257Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
3258 : Generic_ELF(D, Triple, Args) {
3259
3260}
3261
3262void Haiku::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3263 ArgStringList &CC1Args) const {
3264 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3265 DriverArgs.hasArg(options::OPT_nostdincxx))
3266 return;
3267
3268 switch (GetCXXStdlibType(DriverArgs)) {
3269 case ToolChain::CST_Libcxx:
3270 addSystemInclude(DriverArgs, CC1Args,
3271 getDriver().SysRoot + "/system/develop/headers/c++/v1");
3272 break;
3273 case ToolChain::CST_Libstdcxx:
3274 addSystemInclude(DriverArgs, CC1Args,
3275 getDriver().SysRoot + "/system/develop/headers/c++");
3276 addSystemInclude(DriverArgs, CC1Args,
3277 getDriver().SysRoot + "/system/develop/headers/c++/backward");
3278
3279 StringRef Triple = getTriple().str();
3280 addSystemInclude(DriverArgs, CC1Args,
3281 getDriver().SysRoot + "/system/develop/headers/c++/" +
3282 Triple);
3283 break;
3284 }
3285}
3286
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003287/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3288
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003289OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3290 const ArgList &Args)
3291 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003292 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003293 getFilePaths().push_back("/usr/lib");
3294}
3295
Rafael Espindola7cf32212013-03-20 03:05:54 +00003296Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003297 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003298}
3299
Douglas Katzman95354292015-06-23 20:42:09 +00003300Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003301
Eli Friedman9fa28852012-08-08 23:57:20 +00003302/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3303
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003304Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3305 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003306 getFilePaths().push_back(getDriver().Dir + "/../lib");
3307 getFilePaths().push_back("/usr/lib");
3308}
3309
Rafael Espindola7cf32212013-03-20 03:05:54 +00003310Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003311 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003312}
3313
Douglas Katzman95354292015-06-23 20:42:09 +00003314Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003315
Jonas Hahnfeldaae83742016-02-12 07:48:37 +00003316ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
Richard Smith51af5192014-05-01 23:24:24 +00003317 return ToolChain::CST_Libcxx;
3318}
3319
Eli Friedman9fa28852012-08-08 23:57:20 +00003320void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3321 ArgStringList &CC1Args) const {
3322 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3323 DriverArgs.hasArg(options::OPT_nostdincxx))
3324 return;
3325
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003326 switch (GetCXXStdlibType(DriverArgs)) {
3327 case ToolChain::CST_Libcxx:
3328 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003329 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003330 break;
3331 case ToolChain::CST_Libstdcxx:
3332 addSystemInclude(DriverArgs, CC1Args,
3333 getDriver().SysRoot + "/usr/include/c++/stdc++");
3334 addSystemInclude(DriverArgs, CC1Args,
3335 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003336
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003337 StringRef Triple = getTriple().str();
3338 if (Triple.startswith("amd64"))
3339 addSystemInclude(DriverArgs, CC1Args,
3340 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003341 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003342 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003343 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3344 "/usr/include/c++/stdc++/" +
3345 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003346 break;
3347 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003348}
3349
3350void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3351 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003352 switch (GetCXXStdlibType(Args)) {
3353 case ToolChain::CST_Libcxx:
3354 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003355 CmdArgs.push_back("-lc++abi");
3356 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003357 break;
3358 case ToolChain::CST_Libstdcxx:
3359 CmdArgs.push_back("-lstdc++");
3360 break;
3361 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003362}
3363
Daniel Dunbare24297c2009-03-30 21:06:03 +00003364/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3365
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003366FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3367 const ArgList &Args)
3368 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003369
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003370 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3371 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003372 if ((Triple.getArch() == llvm::Triple::x86 ||
3373 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003374 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003375 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3376 else
3377 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003378}
3379
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003380ToolChain::CXXStdlibType FreeBSD::GetDefaultCXXStdlibType() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003381 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003382 return ToolChain::CST_Libcxx;
3383 return ToolChain::CST_Libstdcxx;
3384}
3385
3386void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3387 ArgStringList &CC1Args) const {
3388 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3389 DriverArgs.hasArg(options::OPT_nostdincxx))
3390 return;
3391
3392 switch (GetCXXStdlibType(DriverArgs)) {
3393 case ToolChain::CST_Libcxx:
3394 addSystemInclude(DriverArgs, CC1Args,
3395 getDriver().SysRoot + "/usr/include/c++/v1");
3396 break;
3397 case ToolChain::CST_Libstdcxx:
3398 addSystemInclude(DriverArgs, CC1Args,
3399 getDriver().SysRoot + "/usr/include/c++/4.2");
3400 addSystemInclude(DriverArgs, CC1Args,
3401 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3402 break;
3403 }
3404}
3405
Dimitry Andric60907392016-02-14 16:08:20 +00003406void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3407 ArgStringList &CmdArgs) const {
3408 CXXStdlibType Type = GetCXXStdlibType(Args);
3409 bool Profiling = Args.hasArg(options::OPT_pg);
3410
3411 switch (Type) {
3412 case ToolChain::CST_Libcxx:
3413 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3414 break;
3415
3416 case ToolChain::CST_Libstdcxx:
3417 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3418 break;
3419 }
3420}
3421
Rafael Espindola7cf32212013-03-20 03:05:54 +00003422Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003423 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003424}
3425
Douglas Katzman95354292015-06-23 20:42:09 +00003426Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003427
Tim Northovere931f9f2015-10-30 16:30:41 +00003428bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003429 // FreeBSD uses SjLj exceptions on ARM oabi.
3430 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003431 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003432 case llvm::Triple::GNUEABI:
3433 case llvm::Triple::EABI:
3434 return false;
3435
3436 default:
3437 return (getTriple().getArch() == llvm::Triple::arm ||
3438 getTriple().getArch() == llvm::Triple::thumb);
3439 }
3440}
3441
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003442bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003443
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003444bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003445
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003446SanitizerMask FreeBSD::getSupportedSanitizers() const {
3447 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3448 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3449 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3450 getTriple().getArch() == llvm::Triple::mips64el;
3451 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3452 Res |= SanitizerKind::Address;
3453 Res |= SanitizerKind::Vptr;
3454 if (IsX86_64 || IsMIPS64) {
3455 Res |= SanitizerKind::Leak;
3456 Res |= SanitizerKind::Thread;
3457 }
3458 if (IsX86 || IsX86_64) {
3459 Res |= SanitizerKind::SafeStack;
3460 }
3461 return Res;
3462}
3463
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003464/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3465
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003466NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3467 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003468 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003469 // When targeting a 32-bit platform, try the special directory used on
3470 // 64-bit hosts, and only fall back to the main library directory if that
3471 // doesn't work.
3472 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3473 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003474 switch (Triple.getArch()) {
3475 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003476 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003477 break;
3478 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003479 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003480 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003481 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003482 switch (Triple.getEnvironment()) {
3483 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003484 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003485 getFilePaths().push_back("=/usr/lib/eabi");
3486 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003487 case llvm::Triple::EABIHF:
3488 case llvm::Triple::GNUEABIHF:
3489 getFilePaths().push_back("=/usr/lib/eabihf");
3490 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003491 default:
3492 getFilePaths().push_back("=/usr/lib/oabi");
3493 break;
3494 }
3495 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003496 case llvm::Triple::mips64:
3497 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003498 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003499 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003500 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003501 getFilePaths().push_back("=/usr/lib/64");
3502 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003503 case llvm::Triple::ppc:
3504 getFilePaths().push_back("=/usr/lib/powerpc");
3505 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003506 case llvm::Triple::sparc:
3507 getFilePaths().push_back("=/usr/lib/sparc");
3508 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003509 default:
3510 break;
3511 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003512
3513 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003514 }
3515}
3516
Rafael Espindola7cf32212013-03-20 03:05:54 +00003517Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003518 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003519}
3520
Douglas Katzman95354292015-06-23 20:42:09 +00003521Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003522
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003523ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const {
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003524 unsigned Major, Minor, Micro;
3525 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003526 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003527 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003528 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003529 case llvm::Triple::arm:
3530 case llvm::Triple::armeb:
3531 case llvm::Triple::thumb:
3532 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003533 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003534 case llvm::Triple::ppc64:
3535 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003536 case llvm::Triple::sparc:
3537 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003538 case llvm::Triple::x86:
3539 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003540 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003541 default:
3542 break;
3543 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003544 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003545 return ToolChain::CST_Libstdcxx;
3546}
3547
3548void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3549 ArgStringList &CC1Args) const {
3550 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3551 DriverArgs.hasArg(options::OPT_nostdincxx))
3552 return;
3553
3554 switch (GetCXXStdlibType(DriverArgs)) {
3555 case ToolChain::CST_Libcxx:
3556 addSystemInclude(DriverArgs, CC1Args,
3557 getDriver().SysRoot + "/usr/include/c++/");
3558 break;
3559 case ToolChain::CST_Libstdcxx:
3560 addSystemInclude(DriverArgs, CC1Args,
3561 getDriver().SysRoot + "/usr/include/g++");
3562 addSystemInclude(DriverArgs, CC1Args,
3563 getDriver().SysRoot + "/usr/include/g++/backward");
3564 break;
3565 }
3566}
3567
Chris Lattner3e2ee142010-07-07 16:01:42 +00003568/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3569
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003570Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3571 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003572 getFilePaths().push_back(getDriver().Dir + "/../lib");
3573 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003574}
3575
Rafael Espindola7cf32212013-03-20 03:05:54 +00003576Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003577 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003578}
3579
Douglas Katzman95354292015-06-23 20:42:09 +00003580Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003581
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003582static void addPathIfExists(const Driver &D, const Twine &Path,
3583 ToolChain::path_list &Paths) {
3584 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003585 Paths.push_back(Path.str());
3586}
3587
David Chisnallf571cde2012-02-15 13:39:01 +00003588/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3589
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003590Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003591 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003592 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003593
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003594 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003595
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003596 path_list &Paths = getFilePaths();
3597 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003598 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003599
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003600 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003601 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003602 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003603
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003604 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003605
3606 std::string LibPath = "/usr/lib/";
3607 switch (Triple.getArch()) {
3608 case llvm::Triple::x86:
3609 case llvm::Triple::sparc:
3610 break;
3611 case llvm::Triple::x86_64:
3612 LibPath += "amd64/";
3613 break;
3614 case llvm::Triple::sparcv9:
3615 LibPath += "sparcv9/";
3616 break;
3617 default:
3618 llvm_unreachable("Unsupported architecture");
3619 }
3620
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003621 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003622}
3623
Rafael Espindola7cf32212013-03-20 03:05:54 +00003624Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003625 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003626}
3627
Douglas Katzman95354292015-06-23 20:42:09 +00003628Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003629
Rafael Espindolad5117262015-09-09 13:36:00 +00003630void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3631 ArgStringList &CC1Args) const {
3632 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3633 DriverArgs.hasArg(options::OPT_nostdincxx))
3634 return;
3635
3636 // Include the support directory for things like xlocale and fudged system
3637 // headers.
3638 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3639
3640 if (GCCInstallation.isValid()) {
3641 GCCVersion Version = GCCInstallation.getVersion();
3642 addSystemInclude(DriverArgs, CC1Args,
3643 getDriver().SysRoot + "/usr/gcc/" +
3644 Version.MajorStr + "." +
3645 Version.MinorStr +
3646 "/include/c++/" + Version.Text);
3647 addSystemInclude(DriverArgs, CC1Args,
3648 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3649 "." + Version.MinorStr + "/include/c++/" +
3650 Version.Text + "/" +
3651 GCCInstallation.getTriple().str());
3652 }
3653}
3654
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003655/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003656
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003657enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003658 // NB: Releases of a particular Linux distro should be kept together
3659 // in this enum, because some tests are done by integer comparison against
3660 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003661 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003662 DebianLenny,
3663 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003664 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003665 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003666 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003667 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003668 RHEL5,
3669 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003670 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003671 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003672 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003673 UbuntuHardy,
3674 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003675 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003676 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003677 UbuntuLucid,
3678 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003679 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003680 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003681 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003682 UbuntuQuantal,
3683 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003684 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003685 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003686 UbuntuUtopic,
3687 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003688 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003689 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003690 UnknownDistro
3691};
3692
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003693static bool IsRedhat(enum Distro Distro) {
Rafael Espindola52fe8962016-05-09 13:13:50 +00003694 return Distro == Fedora || (Distro >= RHEL5 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003695}
3696
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003697static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003698
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003699static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003700 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003701}
3702
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003703static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003704 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003705}
3706
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003707static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003708 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3709 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3710 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003711 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003712 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003713 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003714 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003715 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003716 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3717 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3718 .Case("hardy", UbuntuHardy)
3719 .Case("intrepid", UbuntuIntrepid)
3720 .Case("jaunty", UbuntuJaunty)
3721 .Case("karmic", UbuntuKarmic)
3722 .Case("lucid", UbuntuLucid)
3723 .Case("maverick", UbuntuMaverick)
3724 .Case("natty", UbuntuNatty)
3725 .Case("oneiric", UbuntuOneiric)
3726 .Case("precise", UbuntuPrecise)
3727 .Case("quantal", UbuntuQuantal)
3728 .Case("raring", UbuntuRaring)
3729 .Case("saucy", UbuntuSaucy)
3730 .Case("trusty", UbuntuTrusty)
3731 .Case("utopic", UbuntuUtopic)
3732 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003733 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003734 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003735 .Default(UnknownDistro);
Rafael Espindola52fe8962016-05-09 13:13:50 +00003736 if (Version != UnknownDistro)
3737 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003738 }
3739
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003740 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3741 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003742 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003743 if (Data.startswith("Fedora release"))
3744 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003745 if (Data.startswith("Red Hat Enterprise Linux") ||
Rafael Espindola52fe8962016-05-09 13:13:50 +00003746 Data.startswith("CentOS") ||
3747 Data.startswith("Scientific Linux")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003748 if (Data.find("release 7") != StringRef::npos)
3749 return RHEL7;
3750 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003751 return RHEL6;
3752 else if (Data.find("release 5") != StringRef::npos)
3753 return RHEL5;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003754 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003755 return UnknownDistro;
3756 }
3757
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003758 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3759 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003760 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003761 if (Data[0] == '5')
3762 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003763 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003764 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003765 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003766 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003767 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003768 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003769 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3770 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003771 return UnknownDistro;
3772 }
3773
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003774 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003775 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003776
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003777 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003778 return Exherbo;
3779
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003780 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003781 return ArchLinux;
3782
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003783 return UnknownDistro;
3784}
3785
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003786/// \brief Get our best guess at the multiarch triple for a target.
3787///
3788/// Debian-based systems are starting to use a multiarch setup where they use
3789/// a target-triple directory in the library and header search paths.
3790/// Unfortunately, this triple does not align with the vanilla target triple,
3791/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003792static std::string getMultiarchTriple(const Driver &D,
3793 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003794 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003795 llvm::Triple::EnvironmentType TargetEnvironment =
3796 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003797
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003798 // For most architectures, just use whatever we have rather than trying to be
3799 // clever.
3800 switch (TargetTriple.getArch()) {
3801 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003802 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003803
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003804 // We use the existence of '/lib/<triple>' as a directory to detect some
3805 // common linux triples that don't quite match the Clang triple for both
3806 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3807 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003808 case llvm::Triple::arm:
3809 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003810 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003811 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003812 return "arm-linux-gnueabihf";
3813 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003814 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003815 return "arm-linux-gnueabi";
3816 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003817 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003818 case llvm::Triple::armeb:
3819 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003820 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003821 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003822 return "armeb-linux-gnueabihf";
3823 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003824 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003825 return "armeb-linux-gnueabi";
3826 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003827 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003828 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003829 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003830 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003831 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003832 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003833 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003834 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003835 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003836 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003837 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003838 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003839 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003840 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003841 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003842 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003843 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003844 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003845 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003846 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003847 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003848 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003849 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003850 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003851 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003852 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003853 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003854 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003855 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003856 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003857 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003858 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003859 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003860 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003861 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003862 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003863 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003864 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003865 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003866 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003867 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003868 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003869 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003870 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003871 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003872 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003873 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003874 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003875 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003876 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003877 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003878 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003879 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003880 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003881 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003882 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003883 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003884 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003885 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003886 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003887 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003888 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003889 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003890 return "s390x-linux-gnu";
3891 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003892 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003893 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003894}
3895
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003896static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003897 if (isMipsArch(Triple.getArch())) {
3898 // lib32 directory has a special meaning on MIPS targets.
3899 // It contains N32 ABI binaries. Use this folder if produce
3900 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003901 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003902 return "lib32";
3903 return Triple.isArch32Bit() ? "lib" : "lib64";
3904 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003905
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003906 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003907 // using that variant while targeting other architectures causes problems
3908 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003909 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003910 // them when we know we may need it.
3911 //
3912 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003913 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003914 // GCCInstallationDetector, but that is a more significant refactoring.
3915 if (Triple.getArch() == llvm::Triple::x86 ||
3916 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003917 return "lib32";
3918
Zinovy Nis1db95732014-07-10 15:27:19 +00003919 if (Triple.getArch() == llvm::Triple::x86_64 &&
3920 Triple.getEnvironment() == llvm::Triple::GNUX32)
3921 return "libx32";
3922
Simon Atanasyand4413882012-09-14 11:27:24 +00003923 return Triple.isArch32Bit() ? "lib" : "lib64";
3924}
3925
Simon Atanasyan2834a222016-05-22 18:18:07 +00003926static void addMultilibsFilePaths(const Driver &D, const MultilibSet &Multilibs,
3927 const Multilib &Multilib,
3928 StringRef InstallPath,
3929 ToolChain::path_list &Paths) {
3930 if (const auto &PathsCallback = Multilibs.filePathsCallback())
3931 for (const auto &Path : PathsCallback(Multilib))
3932 addPathIfExists(D, InstallPath + Path, Paths);
3933}
3934
Rafael Espindola1af7c212012-02-19 01:38:32 +00003935Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003936 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003937 GCCInstallation.init(Triple, Args);
3938 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003939 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003940 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003941 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003942
Rafael Espindola10a63c22013-07-03 14:14:00 +00003943 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003944 // least) put various tools in a triple-prefixed directory off of the parent
3945 // of the GCC installation. We use the GCC triple here to ensure that we end
3946 // up with tools that support the same amount of cross compiling as the
3947 // detected GCC installation. For example, if we find a GCC installation
3948 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3949 // used to target i386.
3950 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003951 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003952 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003953 GCCInstallation.getTriple().str() + "/bin")
3954 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003955
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003956 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003957
Rafael Espindola10a63c22013-07-03 14:14:00 +00003958 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003959 ExtraOpts.push_back("-z");
3960 ExtraOpts.push_back("relro");
3961 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003962
Douglas Gregord9bb1522011-03-06 19:11:49 +00003963 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003964 ExtraOpts.push_back("-X");
3965
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003966 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003967 const bool IsMips = isMipsArch(Arch);
3968
3969 if (IsMips && !SysRoot.empty())
3970 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003971
Chandler Carruth0b842912011-12-09 04:45:18 +00003972 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3973 // and the MIPS ABI require .dynsym to be sorted in different ways.
3974 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3975 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003976 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003977 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003978 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003979 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003980 ExtraOpts.push_back("--hash-style=gnu");
3981
Rafael Espindola10a63c22013-07-03 14:14:00 +00003982 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003983 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3984 ExtraOpts.push_back("--hash-style=both");
3985 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003986
Rafael Espindola52fe8962016-05-09 13:13:50 +00003987 if (IsRedhat(Distro) && Distro != RHEL5 && Distro != RHEL6)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003988 ExtraOpts.push_back("--no-add-needed");
3989
Rafael Espindola5ed89d42016-06-03 17:26:16 +00003990#ifdef ENABLE_LINKER_BUILD_ID
3991 ExtraOpts.push_back("--build-id");
3992#endif
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003993
Rafael Espindola10a63c22013-07-03 14:14:00 +00003994 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003995 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003996
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003997 // The selection of paths to try here is designed to match the patterns which
3998 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3999 // This was determined by running GCC in a fake filesystem, creating all
4000 // possible permutations of these directories, and seeing which ones it added
4001 // to the link paths.
4002 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00004003
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004004 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004005 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004006
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004007 // Add the multilib suffixed paths where they are available.
4008 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00004009 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00004010 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004011 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan2834a222016-05-22 18:18:07 +00004012 const MultilibSet &Multilibs = GCCInstallation.getMultilibs();
4013
4014 // Add toolchain / multilib specific file paths.
4015 addMultilibsFilePaths(D, Multilibs, Multilib,
4016 GCCInstallation.getInstallPath(), Paths);
Simon Atanasyan53fefd12012-10-03 17:46:38 +00004017
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004018 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00004019 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004020 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004021 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004022
4023 // GCC cross compiling toolchains will install target libraries which ship
4024 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
4025 // any part of the GCC installation in
4026 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
4027 // debatable, but is the reality today. We need to search this tree even
4028 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004029 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004030 // installation that is *not* within the system root to ensure two things:
4031 //
4032 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00004033 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004034 // appropriate rpath.
4035 // 2) There must not be libraries installed into
4036 // <prefix>/<triple>/<libdir> unless they should be preferred over
4037 // those within the system root.
4038 //
4039 // Note that this matches the GCC behavior. See the below comment for where
4040 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004041 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
4042 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004043 Paths);
4044
Chandler Carruth69a125b2012-04-06 16:32:06 +00004045 // If the GCC installation we found is inside of the sysroot, we want to
4046 // prefer libraries installed in the parent prefix of the GCC installation.
4047 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00004048 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004049 // This usually happens when there is an external cross compiler on the
4050 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004051 // the cross. Note that GCC does include some of these directories in some
4052 // configurations but this seems somewhere between questionable and simply
4053 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004054 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004055 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
4056 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00004057 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004058 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004059
4060 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004061 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00004062 // those searched.
4063 // FIXME: It's not clear whether we should use the driver's installed
4064 // directory ('Dir' below) or the ResourceDir.
4065 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004066 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
4067 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004068 }
4069
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004070 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
4071 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
4072 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
4073 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004074
Chandler Carruthb427c562013-06-22 11:35:51 +00004075 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004076 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00004077 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004078 addPathIfExists(D,
4079 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004080 "/../../" + OSLibDir,
4081 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00004082
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004083 // Add the 'other' biarch variant path
4084 Multilib BiarchSibling;
4085 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004086 addPathIfExists(D, GCCInstallation.getInstallPath() +
4087 BiarchSibling.gccSuffix(),
4088 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004089 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00004090
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004091 // See comments above on the multilib variant for details of why this is
4092 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004093 const std::string &LibPath = GCCInstallation.getParentLibPath();
4094 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
4095 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004096 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
4097 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004098 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004099
4100 // See comments above on the multilib variant for details of why this is
4101 // only included from within the sysroot.
4102 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004103 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004104 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004105
4106 // Similar to the logic for GCC above, if we are currently running Clang
4107 // inside of the requested system root, add its parent library path to those
4108 // searched.
4109 // FIXME: It's not clear whether we should use the driver's installed
4110 // directory ('Dir' below) or the ResourceDir.
4111 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004112 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004113
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004114 addPathIfExists(D, SysRoot + "/lib", Paths);
4115 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004116}
4117
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004118bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00004119
Douglas Katzman95354292015-06-23 20:42:09 +00004120Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00004121
4122Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004123 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00004124}
4125
Simon Atanasyana0d89572013-10-05 14:37:55 +00004126std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004127 if (!getDriver().SysRoot.empty())
4128 return getDriver().SysRoot;
4129
4130 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
4131 return std::string();
4132
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004133 // Standalone MIPS toolchains use different names for sysroot folder
4134 // and put it into different places. Here we try to check some known
4135 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004136
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004137 const StringRef InstallDir = GCCInstallation.getInstallPath();
4138 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004139 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004141 std::string Path =
4142 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
4143 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004144
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004145 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004146 return Path;
4147
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004148 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004149
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004150 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004151 return Path;
4152
4153 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004154}
4155
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004156std::string Linux::getDynamicLinker(const ArgList &Args) const {
4157 const llvm::Triple::ArchType Arch = getArch();
4158 const llvm::Triple &Triple = getTriple();
4159
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004160 const enum Distro Distro = DetectDistro(getDriver(), Arch);
4161
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004162 if (Triple.isAndroid())
4163 return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker";
Rafael Espindola164fe342016-06-14 12:47:24 +00004164 else if (Triple.getEnvironment() == llvm::Triple::Musl)
4165 return "/lib/ld-musl-" + Triple.getArchName().str() + ".so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004166
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004167 std::string LibDir;
4168 std::string Loader;
4169
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004170 switch (Arch) {
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004171 default:
4172 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004173
4174 case llvm::Triple::aarch64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004175 LibDir = "lib";
4176 Loader = "ld-linux-aarch64.so.1";
4177 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004178 case llvm::Triple::aarch64_be:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004179 LibDir = "lib";
4180 Loader = "ld-linux-aarch64_be.so.1";
4181 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004182 case llvm::Triple::arm:
4183 case llvm::Triple::thumb:
4184 case llvm::Triple::armeb:
4185 case llvm::Triple::thumbeb: {
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004186 const bool HF =
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004187 Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
4188 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
4189
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004190 LibDir = "lib";
4191 Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";
4192 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004193 }
4194 case llvm::Triple::mips:
4195 case llvm::Triple::mipsel:
4196 case llvm::Triple::mips64:
4197 case llvm::Triple::mips64el: {
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004198 bool LE = (Triple.getArch() == llvm::Triple::mipsel) ||
4199 (Triple.getArch() == llvm::Triple::mips64el);
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004200 bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple);
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004201
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004202 LibDir = "lib" + tools::mips::getMipsABILibSuffix(Args, Triple);
4203
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004204 if (tools::mips::isUCLibc(Args))
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004205 Loader = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004206 else if (!Triple.hasEnvironment() &&
4207 Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies)
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004208 Loader = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004209 else
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004210 Loader = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004211
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004212 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004213 }
4214 case llvm::Triple::ppc:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004215 LibDir = "lib";
4216 Loader = "ld.so.1";
4217 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004218 case llvm::Triple::ppc64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004219 LibDir = "lib64";
4220 Loader =
4221 (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "ld64.so.2" : "ld64.so.1";
4222 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004223 case llvm::Triple::ppc64le:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004224 LibDir = "lib64";
4225 Loader =
4226 (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2";
4227 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004228 case llvm::Triple::sparc:
4229 case llvm::Triple::sparcel:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004230 LibDir = "lib";
4231 Loader = "ld-linux.so.2";
4232 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004233 case llvm::Triple::sparcv9:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004234 LibDir = "lib64";
4235 Loader = "ld-linux.so.2";
4236 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004237 case llvm::Triple::systemz:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004238 LibDir = "lib";
4239 Loader = "ld64.so.1";
4240 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004241 case llvm::Triple::x86:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004242 LibDir = "lib";
4243 Loader = "ld-linux.so.2";
4244 break;
4245 case llvm::Triple::x86_64: {
4246 bool X32 = Triple.getEnvironment() == llvm::Triple::GNUX32;
4247
4248 LibDir = X32 ? "libx32" : "lib64";
4249 Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2";
4250 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004251 }
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004252 }
4253
4254 if (Distro == Exherbo && (Triple.getVendor() == llvm::Triple::UnknownVendor ||
4255 Triple.getVendor() == llvm::Triple::PC))
4256 return "/usr/" + Triple.str() + "/lib/" + Loader;
4257 return "/" + LibDir + "/" + Loader;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004258}
4259
Chandler Carrutha796f532011-11-05 20:17:13 +00004260void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4261 ArgStringList &CC1Args) const {
4262 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00004263 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00004264
4265 if (DriverArgs.hasArg(options::OPT_nostdinc))
4266 return;
4267
4268 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004269 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004270
4271 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00004272 SmallString<128> P(D.ResourceDir);
4273 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00004274 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00004275 }
4276
4277 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
4278 return;
4279
4280 // Check for configure-time C include directories.
4281 StringRef CIncludeDirs(C_INCLUDE_DIRS);
4282 if (CIncludeDirs != "") {
4283 SmallVector<StringRef, 5> dirs;
4284 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004285 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00004286 StringRef Prefix =
4287 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004288 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00004289 }
4290 return;
4291 }
4292
4293 // Lacking those, try to detect the correct set of system includes for the
4294 // target triple.
4295
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004296 // Add include directories specific to the selected multilib set and multilib.
4297 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00004298 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004299 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00004300 for (const auto &Path : Callback(GCCInstallation.getMultilib()))
4301 addExternCSystemIncludeIfExists(
4302 DriverArgs, CC1Args, GCCInstallation.getInstallPath() + Path);
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004303 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004304 }
4305
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004306 // Implement generic Debian multiarch support.
4307 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004308 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004309
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004310 // FIXME: These are older forms of multiarch. It's not clear that they're
4311 // in use in any released version of Debian, so we should consider
4312 // removing them.
4313 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004314 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004315 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004316
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004317 // FIXME: These are older forms of multiarch. It's not clear that they're
4318 // in use in any released version of Debian, so we should consider
4319 // removing them.
4320 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
4321 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00004322 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004323 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004324 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004325 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004326 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004327 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004328 const StringRef ARMEBMultiarchIncludeDirs[] = {
4329 "/usr/include/armeb-linux-gnueabi"};
4330 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
4331 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004332 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00004333 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004334 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004335 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004336 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004337 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004338 "/usr/include/mips64el-linux-gnu",
4339 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004340 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004341 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004342 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004343 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004344 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004345 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004346 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004347 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004348 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004349 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004350 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
4351 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004352 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004353 switch (getTriple().getArch()) {
4354 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004355 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004356 break;
4357 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004358 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004359 break;
4360 case llvm::Triple::aarch64:
4361 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00004362 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004363 break;
4364 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004365 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004366 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4367 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
4368 else
4369 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004370 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004371 case llvm::Triple::armeb:
4372 case llvm::Triple::thumbeb:
4373 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4374 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
4375 else
4376 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
4377 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004378 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00004379 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004380 break;
4381 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00004382 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004383 break;
4384 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004385 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004386 break;
4387 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004388 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004389 break;
4390 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004391 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004392 break;
4393 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004394 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004395 break;
4396 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004397 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004398 break;
4399 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004400 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004401 break;
4402 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004403 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004404 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004405 case llvm::Triple::systemz:
4406 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4407 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004408 default:
4409 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004410 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004411 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004412 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004413 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004414 break;
4415 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004416 }
4417
4418 if (getTriple().getOS() == llvm::Triple::RTEMS)
4419 return;
4420
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004421 // Add an include of '/include' directly. This isn't provided by default by
4422 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4423 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004424 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004425
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004426 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004427}
4428
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004429static std::string DetectLibcxxIncludePath(StringRef base) {
4430 std::error_code EC;
4431 int MaxVersion = 0;
4432 std::string MaxVersionString = "";
4433 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4434 LI = LI.increment(EC)) {
4435 StringRef VersionText = llvm::sys::path::filename(LI->path());
4436 int Version;
4437 if (VersionText[0] == 'v' &&
4438 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4439 if (Version > MaxVersion) {
4440 MaxVersion = Version;
4441 MaxVersionString = VersionText;
4442 }
4443 }
4444 }
4445 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4446}
4447
Chandler Carrutha796f532011-11-05 20:17:13 +00004448void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4449 ArgStringList &CC1Args) const {
4450 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4451 DriverArgs.hasArg(options::OPT_nostdincxx))
4452 return;
4453
Chandler Carruthf4701732011-11-07 09:01:17 +00004454 // Check if libc++ has been enabled and provide its include paths if so.
4455 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004456 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004457 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Yaron Keren5439b642016-05-17 19:01:16 +00004458 // If this is a development, non-installed, clang, libcxx will
4459 // not be found at ../include/c++ but it likely to be found at
4460 // one of the following two locations:
4461 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/local/include/c++"),
4462 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++") };
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004463 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004464 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004465 continue;
4466 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004467 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004468 break;
4469 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004470 return;
4471 }
4472
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004473 // We need a detected GCC installation on Linux to provide libstdc++'s
4474 // headers. We handled the libc++ case above.
4475 if (!GCCInstallation.isValid())
4476 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004477
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004478 // By default, look for the C++ headers in an include directory adjacent to
4479 // the lib directory of the GCC installation. Note that this is expect to be
4480 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4481 StringRef LibDir = GCCInstallation.getParentLibPath();
4482 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004483 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004484 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004485 const std::string GCCMultiarchTriple = getMultiarchTriple(
4486 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004487 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004488 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004489 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004490
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004491 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004492 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004493 "/c++/" + Version.Text, TripleStr,
4494 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004495 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004496 return;
4497
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004498 // Otherwise, fall back on a bunch of options which don't use multiarch
4499 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004500 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004501 // Gentoo is weird and places its headers inside the GCC install,
4502 // so if the first attempt to find the headers fails, try these patterns.
Chandler Carruth81296fb2016-05-08 07:59:56 +00004503 InstallDir.str() + "/include/g++-v" + Version.Text,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004504 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4505 Version.MinorStr,
4506 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4507 // Android standalone toolchain has C++ headers in yet another place.
4508 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4509 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4510 // without a subdirectory corresponding to the gcc version.
4511 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004512 };
4513
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004514 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004515 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4516 /*GCCMultiarchTriple*/ "",
4517 /*TargetMultiarchTriple*/ "",
4518 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004519 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004520 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004521}
4522
Artem Belevichfa11ab52015-11-17 22:28:46 +00004523void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4524 ArgStringList &CC1Args) const {
4525 if (DriverArgs.hasArg(options::OPT_nocudainc))
4526 return;
4527
Justin Lebar423019d2016-04-16 00:11:11 +00004528 if (!CudaInstallation.isValid()) {
4529 getDriver().Diag(diag::err_drv_no_cuda_installation);
4530 return;
Artem Belevich86017332015-11-17 22:28:55 +00004531 }
Justin Lebar423019d2016-04-16 00:11:11 +00004532
4533 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
4534 CC1Args.push_back("-include");
4535 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevichfa11ab52015-11-17 22:28:46 +00004536}
4537
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00004538void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs,
4539 ArgStringList &CC1Args) const {
4540 if (GCCInstallation.isValid()) {
4541 CC1Args.push_back("-isystem");
4542 CC1Args.push_back(DriverArgs.MakeArgString(
4543 GCCInstallation.getParentLibPath() + "/../" +
4544 GCCInstallation.getTriple().str() + "/include"));
4545 }
4546}
4547
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004548bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004549
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004550SanitizerMask Linux::getSupportedSanitizers() const {
4551 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4552 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4553 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4554 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004555 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4556 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004557 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4558 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004559 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4560 Res |= SanitizerKind::Address;
4561 Res |= SanitizerKind::KernelAddress;
4562 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004563 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004564 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004565 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004566 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004567 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004568 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004569 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004570 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004571 Res |= SanitizerKind::Memory;
Derek Bruening256c2e12016-04-21 21:32:04 +00004572 if (IsX86_64)
4573 Res |= SanitizerKind::Efficiency;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004574 if (IsX86 || IsX86_64) {
4575 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004576 }
4577 return Res;
4578}
4579
Xinliang David Li170cd102015-10-27 05:15:35 +00004580void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4581 llvm::opt::ArgStringList &CmdArgs) const {
4582 if (!needsProfileRT(Args)) return;
4583
4584 // Add linker option -u__llvm_runtime_variable to cause runtime
4585 // initialization module to be linked in.
4586 if (!Args.hasArg(options::OPT_coverage))
4587 CmdArgs.push_back(Args.MakeArgString(
4588 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4589 ToolChain::addProfileRTLibs(Args, CmdArgs);
4590}
4591
Daniel Dunbarcc912342009-05-02 18:28:39 +00004592/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4593
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004594DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4595 const ArgList &Args)
4596 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004597
4598 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004599 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004600 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004601 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004602
Daniel Dunbar083edf72009-12-21 18:54:17 +00004603 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004604 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004605 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004606}
4607
Rafael Espindola7cf32212013-03-20 03:05:54 +00004608Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004609 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004610}
4611
4612Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004613 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004614}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004615
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004616/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4617/// which isn't properly a linker but nonetheless performs the step of stitching
4618/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004619
4620CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4621 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004622 : Linux(D, Triple, Args) {
4623 if (CudaInstallation.isValid())
4624 getProgramPaths().push_back(CudaInstallation.getBinPath());
4625}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004626
4627void
4628CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4629 llvm::opt::ArgStringList &CC1Args) const {
4630 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4631 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004632
Justin Lebard3a44f62016-04-05 18:26:20 +00004633 if (DriverArgs.hasFlag(options::OPT_fcuda_flush_denormals_to_zero,
4634 options::OPT_fno_cuda_flush_denormals_to_zero, false))
4635 CC1Args.push_back("-fcuda-flush-denormals-to-zero");
4636
Justin Lebar91f6f072016-05-23 20:19:56 +00004637 if (DriverArgs.hasFlag(options::OPT_fcuda_approx_transcendentals,
4638 options::OPT_fno_cuda_approx_transcendentals, false))
4639 CC1Args.push_back("-fcuda-approx-transcendentals");
4640
Artem Belevich34f481a2015-11-17 22:28:50 +00004641 if (DriverArgs.hasArg(options::OPT_nocudalib))
4642 return;
4643
4644 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4645 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4646 if (!LibDeviceFile.empty()) {
4647 CC1Args.push_back("-mlink-cuda-bitcode");
4648 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4649
4650 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4651 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4652 // came with CUDA-7.0.
4653 CC1Args.push_back("-target-feature");
4654 CC1Args.push_back("+ptx42");
4655 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004656}
4657
4658llvm::opt::DerivedArgList *
4659CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4660 const char *BoundArch) const {
4661 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4662 const OptTable &Opts = getDriver().getOpts();
4663
4664 for (Arg *A : Args) {
4665 if (A->getOption().matches(options::OPT_Xarch__)) {
4666 // Skip this argument unless the architecture matches BoundArch
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004667 if (!BoundArch || A->getValue(0) != StringRef(BoundArch))
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004668 continue;
4669
4670 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4671 unsigned Prev = Index;
4672 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4673
4674 // If the argument parsing failed or more than one argument was
4675 // consumed, the -Xarch_ argument's parameter tried to consume
4676 // extra arguments. Emit an error and ignore.
4677 //
4678 // We also want to disallow any options which would alter the
4679 // driver behavior; that isn't going to work in our model. We
4680 // use isDriverOption() as an approximation, although things
4681 // like -O4 are going to slip through.
4682 if (!XarchArg || Index > Prev + 1) {
4683 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4684 << A->getAsString(Args);
4685 continue;
4686 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4687 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4688 << A->getAsString(Args);
4689 continue;
4690 }
4691 XarchArg->setBaseArg(A);
4692 A = XarchArg.release();
4693 DAL->AddSynthesizedArg(A);
4694 }
4695 DAL->append(A);
4696 }
4697
Justin Lebar4db224e2016-06-15 23:46:11 +00004698 if (BoundArch) {
4699 DAL->eraseArg(options::OPT_march_EQ);
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004700 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Justin Lebar4db224e2016-06-15 23:46:11 +00004701 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004702 return DAL;
4703}
4704
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004705Tool *CudaToolChain::buildAssembler() const {
4706 return new tools::NVPTX::Assembler(*this);
4707}
4708
4709Tool *CudaToolChain::buildLinker() const {
4710 return new tools::NVPTX::Linker(*this);
4711}
4712
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004713/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004714XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4715 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004716 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004717 // ProgramPaths are found via 'PATH' environment variable.
4718}
4719
Douglas Katzman54366072015-07-27 16:53:08 +00004720Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004721 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004722}
4723
Douglas Katzman54366072015-07-27 16:53:08 +00004724Tool *XCoreToolChain::buildLinker() const {
4725 return new tools::XCore::Linker(*this);
4726}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004727
Douglas Katzman54366072015-07-27 16:53:08 +00004728bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004729
Douglas Katzman54366072015-07-27 16:53:08 +00004730bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004731
Douglas Katzman54366072015-07-27 16:53:08 +00004732bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004733
Douglas Katzman54366072015-07-27 16:53:08 +00004734bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004735
Douglas Katzman54366072015-07-27 16:53:08 +00004736bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004737
Douglas Katzman54366072015-07-27 16:53:08 +00004738void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4739 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004740 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4741 DriverArgs.hasArg(options::OPT_nostdlibinc))
4742 return;
4743 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4744 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004745 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004746 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4747 ArrayRef<StringRef> DirVec(Dirs);
4748 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4749 }
4750}
4751
Douglas Katzman54366072015-07-27 16:53:08 +00004752void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4753 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004754 CC1Args.push_back("-nostdsysteminc");
4755}
4756
Douglas Katzman54366072015-07-27 16:53:08 +00004757void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4758 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004759 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004760 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4761 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004762 return;
4763 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4764 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004765 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004766 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4767 ArrayRef<StringRef> DirVec(Dirs);
4768 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4769 }
4770}
4771
Douglas Katzman54366072015-07-27 16:53:08 +00004772void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4773 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004774 // We don't output any lib args. This is handled by xcc.
4775}
Douglas Katzman84a75642015-06-19 14:55:19 +00004776
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004777MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4778 const ArgList &Args)
Douglas Katzman5eddc232016-05-09 19:09:59 +00004779 : Generic_ELF(D, Triple, Args) {
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004780 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4781 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4782 // This won't work to find gcc. Instead we give the installation detector an
4783 // extra triple, which is preferable to further hacks of the logic that at
4784 // present is based solely on getArch(). In particular, it would be wrong to
4785 // choose the myriad installation when targeting a non-myriad sparc install.
4786 switch (Triple.getArch()) {
4787 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00004788 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4789 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004790 case llvm::Triple::sparc:
4791 case llvm::Triple::sparcel:
4792 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004793 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004794 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004795
4796 if (GCCInstallation.isValid()) {
4797 // The contents of LibDir are independent of the version of gcc.
4798 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4799 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4800 if (Triple.getArch() == llvm::Triple::sparcel)
4801 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4802 else
4803 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4804 addPathIfExists(D, LibDir, getFilePaths());
4805
4806 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4807 // These files are tied to a particular version of gcc.
4808 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4809 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4810 // but as this toolchain is for LEON sparc, it can assume FPU.
4811 if (Triple.getArch() == llvm::Triple::sparcel)
4812 llvm::sys::path::append(CompilerSupportDir, "le");
4813 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4814 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004815}
4816
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004817MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004818
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004819void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4820 ArgStringList &CC1Args) const {
4821 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4822 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4823}
4824
Eric Christopherefef8ef2015-12-07 22:43:05 +00004825void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4826 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00004827 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4828 DriverArgs.hasArg(options::OPT_nostdincxx))
4829 return;
4830
4831 // Only libstdc++, for now.
4832 StringRef LibDir = GCCInstallation.getParentLibPath();
4833 const GCCVersion &Version = GCCInstallation.getVersion();
4834 StringRef TripleStr = GCCInstallation.getTriple().str();
4835 const Multilib &Multilib = GCCInstallation.getMultilib();
4836
Eric Christopherefef8ef2015-12-07 22:43:05 +00004837 addLibStdCXXIncludePaths(
4838 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4839 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00004840}
4841
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004842// MyriadToolChain handles several triples:
4843// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4844Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4845 // The inherited method works fine if not targeting the SHAVE.
4846 if (!isShaveCompilation(getTriple()))
4847 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004848 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00004849 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00004850 case Action::CompileJobClass:
4851 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004852 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004853 return Compiler.get();
4854 case Action::AssembleJobClass:
4855 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004856 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004857 return Assembler.get();
4858 default:
4859 return ToolChain::getTool(JA.getKind());
4860 }
4861}
4862
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004863Tool *MyriadToolChain::buildLinker() const {
4864 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004865}
Dan Gohmanc2853072015-09-03 22:51:53 +00004866
Dan Gohman52816862015-12-16 23:30:41 +00004867WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
4868 const llvm::opt::ArgList &Args)
4869 : ToolChain(D, Triple, Args) {
Dan Gohman57b62c52016-02-22 19:26:15 +00004870
4871 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
4872 getFilePaths().push_back(
4873 getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64"));
4874
Dan Gohman52816862015-12-16 23:30:41 +00004875 // Use LLD by default.
4876 DefaultLinker = "lld";
4877}
4878
Dan Gohmanc2853072015-09-03 22:51:53 +00004879bool WebAssembly::IsMathErrnoDefault() const { return false; }
4880
4881bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4882
4883bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4884
4885bool WebAssembly::isPICDefault() const { return false; }
4886
4887bool WebAssembly::isPIEDefault() const { return false; }
4888
4889bool WebAssembly::isPICDefaultForced() const { return false; }
4890
4891bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4892
4893// TODO: Support Objective C stuff.
4894bool WebAssembly::SupportsObjCGC() const { return false; }
4895
4896bool WebAssembly::hasBlocksRuntime() const { return false; }
4897
4898// TODO: Support profiling.
4899bool WebAssembly::SupportsProfiling() const { return false; }
4900
Dan Gohman52816862015-12-16 23:30:41 +00004901bool WebAssembly::HasNativeLLVMSupport() const { return true; }
4902
Dan Gohmanc2853072015-09-03 22:51:53 +00004903void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4904 ArgStringList &CC1Args) const {
4905 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4906 options::OPT_fno_use_init_array, true))
4907 CC1Args.push_back("-fuse-init-array");
4908}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004909
Dan Gohman6ad8f612016-01-14 16:00:13 +00004910ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
4911 return ToolChain::RLT_CompilerRT;
4912}
4913
4914ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
4915 return ToolChain::CST_Libcxx;
4916}
4917
4918void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4919 ArgStringList &CC1Args) const {
4920 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4921 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4922}
4923
4924void WebAssembly::AddClangCXXStdlibIncludeArgs(
4925 const llvm::opt::ArgList &DriverArgs,
4926 llvm::opt::ArgStringList &CC1Args) const {
4927 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
4928 !DriverArgs.hasArg(options::OPT_nostdincxx))
4929 addSystemInclude(DriverArgs, CC1Args,
4930 getDriver().SysRoot + "/include/c++/v1");
4931}
4932
Dan Gohman52816862015-12-16 23:30:41 +00004933Tool *WebAssembly::buildLinker() const {
4934 return new tools::wasm::Linker(*this);
4935}
4936
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004937PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4938 : Generic_ELF(D, Triple, Args) {
4939 if (Args.hasArg(options::OPT_static))
4940 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4941
Paul Robinson9d613612016-05-16 17:22:25 +00004942 // Determine where to find the PS4 libraries. We use SCE_ORBIS_SDK_DIR
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004943 // if it exists; otherwise use the driver's installation path, which
4944 // should be <SDK_DIR>/host_tools/bin.
4945
4946 SmallString<512> PS4SDKDir;
Paul Robinson9d613612016-05-16 17:22:25 +00004947 if (const char *EnvValue = getenv("SCE_ORBIS_SDK_DIR")) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004948 if (!llvm::sys::fs::exists(EnvValue))
4949 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4950 PS4SDKDir = EnvValue;
4951 } else {
4952 PS4SDKDir = getDriver().Dir;
4953 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00004954 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004955
Eric Christopherefef8ef2015-12-07 22:43:05 +00004956 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004957 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00004958 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004959 // If -isysroot was passed, use that as the SDK base path.
4960 std::string PrefixDir;
4961 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4962 PrefixDir = A->getValue();
4963 if (!llvm::sys::fs::exists(PrefixDir))
4964 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4965 } else
4966 PrefixDir = PS4SDKDir.str();
4967
4968 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4969 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4970 if (!Args.hasArg(options::OPT_nostdinc) &&
4971 !Args.hasArg(options::OPT_nostdlibinc) &&
4972 !Args.hasArg(options::OPT_isysroot) &&
4973 !Args.hasArg(options::OPT__sysroot_EQ) &&
4974 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4975 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4976 << "PS4 system headers" << PS4SDKIncludeDir;
4977 }
4978
4979 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4980 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4981 if (!Args.hasArg(options::OPT_nostdlib) &&
4982 !Args.hasArg(options::OPT_nodefaultlibs) &&
4983 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4984 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4985 !Args.hasArg(options::OPT_emit_ast) &&
4986 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4987 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4988 << "PS4 system libraries" << PS4SDKLibDir;
4989 return;
4990 }
4991 getFilePaths().push_back(PS4SDKLibDir.str());
4992}
4993
4994Tool *PS4CPU::buildAssembler() const {
4995 return new tools::PS4cpu::Assemble(*this);
4996}
4997
4998Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4999
5000bool PS4CPU::isPICDefault() const { return true; }
5001
5002bool PS4CPU::HasNativeLLVMSupport() const { return true; }
5003
5004SanitizerMask PS4CPU::getSupportedSanitizers() const {
5005 SanitizerMask Res = ToolChain::getSupportedSanitizers();
5006 Res |= SanitizerKind::Address;
5007 Res |= SanitizerKind::Vptr;
5008 return Res;
5009}