blob: 58786e092fd6e329b4bc2fc2bd4cc4f03187a4d1 [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");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001718 // FIXME: Uncomment this once we can compile the cuda 8 headers.
1719 // CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-8.0");
Artem Belevich86017332015-11-17 22:28:55 +00001720 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001721 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1722 }
1723
Benjamin Kramere8b76412015-09-24 14:48:37 +00001724 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001725 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001726 continue;
1727
1728 CudaInstallPath = CudaPath;
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001729 CudaBinPath = CudaPath + "/bin";
Artem Belevich98607b62015-09-23 21:49:39 +00001730 CudaIncludePath = CudaInstallPath + "/include";
1731 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1732 CudaLibPath =
1733 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1734
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001735 if (!(D.getVFS().exists(CudaIncludePath) &&
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001736 D.getVFS().exists(CudaBinPath) && D.getVFS().exists(CudaLibPath) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001737 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001738 continue;
1739
Artem Belevich34f481a2015-11-17 22:28:50 +00001740 std::error_code EC;
1741 for (llvm::sys::fs::directory_iterator LI(CudaLibDevicePath, EC), LE;
1742 !EC && LI != LE; LI = LI.increment(EC)) {
1743 StringRef FilePath = LI->path();
1744 StringRef FileName = llvm::sys::path::filename(FilePath);
1745 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1746 const StringRef LibDeviceName = "libdevice.";
1747 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1748 continue;
1749 StringRef GpuArch = FileName.slice(
1750 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
1751 CudaLibDeviceMap[GpuArch] = FilePath.str();
1752 // Insert map entries for specifc devices with this compute capability.
1753 if (GpuArch == "compute_20") {
1754 CudaLibDeviceMap["sm_20"] = FilePath;
1755 CudaLibDeviceMap["sm_21"] = FilePath;
1756 } else if (GpuArch == "compute_30") {
1757 CudaLibDeviceMap["sm_30"] = FilePath;
1758 CudaLibDeviceMap["sm_32"] = FilePath;
1759 } else if (GpuArch == "compute_35") {
1760 CudaLibDeviceMap["sm_35"] = FilePath;
1761 CudaLibDeviceMap["sm_37"] = FilePath;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001762 } else if (GpuArch == "compute_50") {
1763 CudaLibDeviceMap["sm_50"] = FilePath;
1764 CudaLibDeviceMap["sm_52"] = FilePath;
1765 CudaLibDeviceMap["sm_53"] = FilePath;
Justin Lebaref1aaac2016-07-06 21:21:14 +00001766 CudaLibDeviceMap["sm_60"] = FilePath;
1767 CudaLibDeviceMap["sm_61"] = FilePath;
1768 CudaLibDeviceMap["sm_62"] = FilePath;
Artem Belevich34f481a2015-11-17 22:28:50 +00001769 }
1770 }
1771
Artem Belevich98607b62015-09-23 21:49:39 +00001772 IsValid = true;
1773 break;
1774 }
1775}
1776
1777void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1778 if (isValid())
1779 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1780}
1781
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001782namespace {
1783// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001784class FilterNonExistent {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001785 StringRef Base, File;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001786 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001787
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001788public:
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001789 FilterNonExistent(StringRef Base, StringRef File, vfs::FileSystem &VFS)
1790 : Base(Base), File(File), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001791 bool operator()(const Multilib &M) {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001792 return !VFS.exists(Base + M.gccSuffix() + File);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001793 }
1794};
1795} // end anonymous namespace
1796
1797static void addMultilibFlag(bool Enabled, const char *const Flag,
1798 std::vector<std::string> &Flags) {
1799 if (Enabled)
1800 Flags.push_back(std::string("+") + Flag);
1801 else
1802 Flags.push_back(std::string("-") + Flag);
1803}
1804
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00001805static bool isArmOrThumbArch(llvm::Triple::ArchType Arch) {
1806 return Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb;
1807}
1808
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001809static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001810 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1811 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1812}
1813
1814static bool isMips32(llvm::Triple::ArchType Arch) {
1815 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1816}
1817
1818static bool isMips64(llvm::Triple::ArchType Arch) {
1819 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1820}
1821
1822static bool isMipsEL(llvm::Triple::ArchType Arch) {
1823 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1824}
1825
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001826static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001827 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001828 return A && A->getOption().matches(options::OPT_mips16);
1829}
1830
1831static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001832 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001833 return A && A->getOption().matches(options::OPT_mmicromips);
1834}
1835
Benjamin Kramere003ca22015-10-28 13:54:16 +00001836namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001837struct DetectedMultilibs {
1838 /// The set of multilibs that the detected installation supports.
1839 MultilibSet Multilibs;
1840
1841 /// The primary multilib appropriate for the given flags.
1842 Multilib SelectedMultilib;
1843
1844 /// On Biarch systems, this corresponds to the default multilib when
1845 /// targeting the non-default multilib. Otherwise, it is empty.
1846 llvm::Optional<Multilib> BiarchSibling;
1847};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001848} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001849
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001850static Multilib makeMultilib(StringRef commonSuffix) {
1851 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1852}
1853
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00001854static bool findMipsCsMultilibs(const Multilib::flags_list &Flags,
1855 FilterNonExistent &NonExistent,
1856 DetectedMultilibs &Result) {
1857 // Check for Code Sourcery toolchain multilibs
1858 MultilibSet CSMipsMultilibs;
1859 {
1860 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001861
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00001862 auto MArchMicroMips =
1863 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001864
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00001865 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
1866
1867 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
1868
1869 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
1870
1871 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
1872
1873 auto DefaultFloat =
1874 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
1875
1876 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
1877
1878 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
1879
1880 // Note that this one's osSuffix is ""
1881 auto MAbi64 = makeMultilib("")
1882 .gccSuffix("/64")
1883 .includeSuffix("/64")
1884 .flag("+mabi=n64")
1885 .flag("-mabi=n32")
1886 .flag("-m32");
1887
1888 CSMipsMultilibs =
1889 MultilibSet()
1890 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1891 .Maybe(UCLibc)
1892 .Either(SoftFloat, Nan2008, DefaultFloat)
1893 .FilterOut("/micromips/nan2008")
1894 .FilterOut("/mips16/nan2008")
1895 .Either(BigEndian, LittleEndian)
1896 .Maybe(MAbi64)
1897 .FilterOut("/mips16.*/64")
1898 .FilterOut("/micromips.*/64")
1899 .FilterOut(NonExistent)
1900 .setIncludeDirsCallback([](const Multilib &M) {
1901 std::vector<std::string> Dirs({"/include"});
1902 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1903 Dirs.push_back(
1904 "/../../../../mips-linux-gnu/libc/uclibc/usr/include");
1905 else
1906 Dirs.push_back("/../../../../mips-linux-gnu/libc/usr/include");
1907 return Dirs;
1908 });
1909 }
1910
1911 MultilibSet DebianMipsMultilibs;
1912 {
1913 Multilib MAbiN32 =
1914 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
1915
1916 Multilib M64 = Multilib()
1917 .gccSuffix("/64")
1918 .includeSuffix("/64")
1919 .flag("+m64")
1920 .flag("-m32")
1921 .flag("-mabi=n32");
1922
1923 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
1924
1925 DebianMipsMultilibs =
1926 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
1927 }
1928
1929 // Sort candidates. Toolchain that best meets the directories tree goes first.
1930 // Then select the first toolchains matches command line flags.
1931 MultilibSet *Candidates[] = {&CSMipsMultilibs, &DebianMipsMultilibs};
1932 if (CSMipsMultilibs.size() < DebianMipsMultilibs.size())
1933 std::iter_swap(Candidates, Candidates + 1);
1934 for (const MultilibSet *Candidate : Candidates) {
1935 if (Candidate->select(Flags, Result.SelectedMultilib)) {
1936 if (Candidate == &DebianMipsMultilibs)
1937 Result.BiarchSibling = Multilib();
1938 Result.Multilibs = *Candidate;
1939 return true;
1940 }
1941 }
1942 return false;
1943}
1944
1945static bool findMipsAndroidMultilibs(const Multilib::flags_list &Flags,
1946 FilterNonExistent &NonExistent,
1947 DetectedMultilibs &Result) {
1948
1949 MultilibSet AndroidMipsMultilibs =
1950 MultilibSet()
1951 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1952 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1953 .FilterOut(NonExistent);
1954
1955 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1956 Result.Multilibs = AndroidMipsMultilibs;
1957 return true;
1958 }
1959 return false;
1960}
1961
1962static bool findMipsMuslMultilibs(const Multilib::flags_list &Flags,
1963 FilterNonExistent &NonExistent,
1964 DetectedMultilibs &Result) {
1965 // Musl toolchain multilibs
1966 MultilibSet MuslMipsMultilibs;
1967 {
1968 auto MArchMipsR2 = makeMultilib("")
1969 .osSuffix("/mips-r2-hard-musl")
1970 .flag("+EB")
1971 .flag("-EL")
1972 .flag("+march=mips32r2");
1973
1974 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1975 .flag("-EB")
1976 .flag("+EL")
1977 .flag("+march=mips32r2");
1978
1979 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1980
1981 // Specify the callback that computes the include directories.
1982 MuslMipsMultilibs.setIncludeDirsCallback([](const Multilib &M) {
1983 return std::vector<std::string>(
1984 {"/../sysroot" + M.osSuffix() + "/usr/include"});
1985 });
1986 }
1987 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1988 Result.Multilibs = MuslMipsMultilibs;
1989 return true;
1990 }
1991 return false;
1992}
1993
1994static bool findMipsMtiMultilibs(const Multilib::flags_list &Flags,
1995 FilterNonExistent &NonExistent,
1996 DetectedMultilibs &Result) {
1997 // CodeScape MTI toolchain v1.2 and early.
Simon Atanasyancf7ac672016-05-22 15:27:58 +00001998 MultilibSet MtiMipsMultilibsV1;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001999 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002000 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002001 .flag("+m32")
2002 .flag("-m64")
2003 .flag("-mmicromips")
2004 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002005
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002006 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002007 .flag("+m32")
2008 .flag("-m64")
2009 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002010
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002011 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002012 .flag("-m32")
2013 .flag("+m64")
2014 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002015
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002016 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
2017 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002018
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002019 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002020 .flag("+m32")
2021 .flag("-m64")
2022 .flag("-mmicromips")
2023 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002024
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002025 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002026
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002027 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002028
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002029 auto MAbi64 =
2030 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002031
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002032 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002034 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002035
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002036 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002037
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002038 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002039
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002040 MtiMipsMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002041 MultilibSet()
2042 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
2043 MArchDefault)
2044 .Maybe(UCLibc)
2045 .Maybe(Mips16)
2046 .FilterOut("/mips64/mips16")
2047 .FilterOut("/mips64r2/mips16")
2048 .FilterOut("/micromips/mips16")
2049 .Maybe(MAbi64)
2050 .FilterOut("/micromips/64")
2051 .FilterOut("/mips32/64")
2052 .FilterOut("^/64")
2053 .FilterOut("/mips16/64")
2054 .Either(BigEndian, LittleEndian)
2055 .Maybe(SoftFloat)
2056 .Maybe(Nan2008)
2057 .FilterOut(".*sof/nan2008")
2058 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002059 .setIncludeDirsCallback([](const Multilib &M) {
2060 std::vector<std::string> Dirs({"/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002061 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
Simon Atanasyana45502d2016-05-19 15:07:21 +00002062 Dirs.push_back("/../../../../sysroot/uclibc/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002063 else
Simon Atanasyana45502d2016-05-19 15:07:21 +00002064 Dirs.push_back("/../../../../sysroot/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002065 return Dirs;
2066 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00002067 }
2068
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002069 // CodeScape IMG toolchain starting from v1.3.
Simon Atanasyan2834a222016-05-22 18:18:07 +00002070 MultilibSet MtiMipsMultilibsV2;
2071 {
2072 auto BeHard = makeMultilib("/mips-r2-hard")
2073 .flag("+EB")
2074 .flag("-msoft-float")
2075 .flag("-mnan=2008")
2076 .flag("-muclibc");
2077 auto BeSoft = makeMultilib("/mips-r2-soft")
2078 .flag("+EB")
2079 .flag("+msoft-float")
2080 .flag("-mnan=2008");
2081 auto ElHard = makeMultilib("/mipsel-r2-hard")
2082 .flag("+EL")
2083 .flag("-msoft-float")
2084 .flag("-mnan=2008")
2085 .flag("-muclibc");
2086 auto ElSoft = makeMultilib("/mipsel-r2-soft")
2087 .flag("+EL")
2088 .flag("+msoft-float")
2089 .flag("-mnan=2008")
2090 .flag("-mmicromips");
2091 auto BeHardNan = makeMultilib("/mips-r2-hard-nan2008")
2092 .flag("+EB")
2093 .flag("-msoft-float")
2094 .flag("+mnan=2008")
2095 .flag("-muclibc");
2096 auto ElHardNan = makeMultilib("/mipsel-r2-hard-nan2008")
2097 .flag("+EL")
2098 .flag("-msoft-float")
2099 .flag("+mnan=2008")
2100 .flag("-muclibc")
2101 .flag("-mmicromips");
2102 auto BeHardNanUclibc = makeMultilib("/mips-r2-hard-nan2008-uclibc")
2103 .flag("+EB")
2104 .flag("-msoft-float")
2105 .flag("+mnan=2008")
2106 .flag("+muclibc");
2107 auto ElHardNanUclibc = makeMultilib("/mipsel-r2-hard-nan2008-uclibc")
2108 .flag("+EL")
2109 .flag("-msoft-float")
2110 .flag("+mnan=2008")
2111 .flag("+muclibc");
2112 auto BeHardUclibc = makeMultilib("/mips-r2-hard-uclibc")
2113 .flag("+EB")
2114 .flag("-msoft-float")
2115 .flag("-mnan=2008")
2116 .flag("+muclibc");
2117 auto ElHardUclibc = makeMultilib("/mipsel-r2-hard-uclibc")
2118 .flag("+EL")
2119 .flag("-msoft-float")
2120 .flag("-mnan=2008")
2121 .flag("+muclibc");
2122 auto ElMicroHardNan = makeMultilib("/micromipsel-r2-hard-nan2008")
2123 .flag("+EL")
2124 .flag("-msoft-float")
2125 .flag("+mnan=2008")
2126 .flag("+mmicromips");
2127 auto ElMicroSoft = makeMultilib("/micromipsel-r2-soft")
2128 .flag("+EL")
2129 .flag("+msoft-float")
2130 .flag("-mnan=2008")
2131 .flag("+mmicromips");
2132
2133 auto O32 =
2134 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2135 auto N32 =
2136 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2137 auto N64 =
2138 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2139
2140 MtiMipsMultilibsV2 =
2141 MultilibSet()
2142 .Either({BeHard, BeSoft, ElHard, ElSoft, BeHardNan, ElHardNan,
2143 BeHardNanUclibc, ElHardNanUclibc, BeHardUclibc,
2144 ElHardUclibc, ElMicroHardNan, ElMicroSoft})
2145 .Either(O32, N32, N64)
2146 .FilterOut(NonExistent)
2147 .setIncludeDirsCallback([](const Multilib &M) {
2148 return std::vector<std::string>({"/../../../../sysroot" +
2149 M.includeSuffix() +
2150 "/../usr/include"});
2151 })
2152 .setFilePathsCallback([](const Multilib &M) {
2153 return std::vector<std::string>(
2154 {"/../../../../mips-mti-linux-gnu/lib" + M.gccSuffix()});
2155 });
2156 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002157 for (auto Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
2158 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2159 Result.Multilibs = *Candidate;
2160 return true;
2161 }
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002162 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002163 return false;
2164}
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002165
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002166static bool findMipsImgMultilibs(const Multilib::flags_list &Flags,
2167 FilterNonExistent &NonExistent,
2168 DetectedMultilibs &Result) {
2169 // CodeScape IMG toolchain v1.2 and early.
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002170 MultilibSet ImgMultilibsV1;
Daniel Sanders2bf13662014-07-10 14:40:57 +00002171 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002172 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002173
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002174 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002175
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002176 auto MAbi64 =
2177 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002178
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002179 ImgMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002180 MultilibSet()
2181 .Maybe(Mips64r6)
2182 .Maybe(MAbi64)
2183 .Maybe(LittleEndian)
2184 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002185 .setIncludeDirsCallback([](const Multilib &M) {
2186 return std::vector<std::string>(
2187 {"/include", "/../../../../sysroot/usr/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002188 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002189 }
2190
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002191 // CodeScape IMG toolchain starting from v1.3.
Simon Atanasyan2834a222016-05-22 18:18:07 +00002192 MultilibSet ImgMultilibsV2;
2193 {
2194 auto BeHard = makeMultilib("/mips-r6-hard")
2195 .flag("+EB")
2196 .flag("-msoft-float")
2197 .flag("-mmicromips");
2198 auto BeSoft = makeMultilib("/mips-r6-soft")
2199 .flag("+EB")
2200 .flag("+msoft-float")
2201 .flag("-mmicromips");
2202 auto ElHard = makeMultilib("/mipsel-r6-hard")
2203 .flag("+EL")
2204 .flag("-msoft-float")
2205 .flag("-mmicromips");
2206 auto ElSoft = makeMultilib("/mipsel-r6-soft")
2207 .flag("+EL")
2208 .flag("+msoft-float")
2209 .flag("-mmicromips");
2210 auto BeMicroHard = makeMultilib("/micromips-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002211 .flag("+EB")
2212 .flag("-msoft-float")
2213 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002214 auto BeMicroSoft = makeMultilib("/micromips-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002215 .flag("+EB")
2216 .flag("+msoft-float")
2217 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002218 auto ElMicroHard = makeMultilib("/micromipsel-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002219 .flag("+EL")
2220 .flag("-msoft-float")
2221 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002222 auto ElMicroSoft = makeMultilib("/micromipsel-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002223 .flag("+EL")
2224 .flag("+msoft-float")
2225 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002226
2227 auto O32 =
2228 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2229 auto N32 =
2230 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2231 auto N64 =
2232 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2233
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002234 ImgMultilibsV2 =
2235 MultilibSet()
2236 .Either({BeHard, BeSoft, ElHard, ElSoft, BeMicroHard, BeMicroSoft,
2237 ElMicroHard, ElMicroSoft})
2238 .Either(O32, N32, N64)
2239 .FilterOut(NonExistent)
2240 .setIncludeDirsCallback([](const Multilib &M) {
2241 return std::vector<std::string>({"/../../../../sysroot" +
2242 M.includeSuffix() +
2243 "/../usr/include"});
2244 })
2245 .setFilePathsCallback([](const Multilib &M) {
2246 return std::vector<std::string>(
2247 {"/../../../../mips-img-linux-gnu/lib" + M.gccSuffix()});
2248 });
Simon Atanasyan2834a222016-05-22 18:18:07 +00002249 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002250 for (auto Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
2251 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2252 Result.Multilibs = *Candidate;
2253 return true;
2254 }
2255 }
2256 return false;
2257}
2258
2259static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
2260 StringRef Path, const ArgList &Args,
2261 DetectedMultilibs &Result) {
2262 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Simon Atanasyan2834a222016-05-22 18:18:07 +00002263
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002264 StringRef CPUName;
2265 StringRef ABIName;
2266 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2267
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002268 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2269
2270 Multilib::flags_list Flags;
2271 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2272 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2273 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002274 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002275 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002276 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002277 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002278 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002279 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002280 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2281 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002282 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002283 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002284 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002285 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2286 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002287 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2288 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002289 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002290 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002291 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002292 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002293
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002294 if (TargetTriple.isAndroid())
2295 return findMipsAndroidMultilibs(Flags, NonExistent, Result);
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002296
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002297 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2298 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002299 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2300 return findMipsMuslMultilibs(Flags, NonExistent, Result);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002301
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002302 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2303 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002304 TargetTriple.getEnvironment() == llvm::Triple::GNU)
2305 return findMipsMtiMultilibs(Flags, NonExistent, Result);
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002306
Daniel Sanders2bf13662014-07-10 14:40:57 +00002307 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2308 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002309 TargetTriple.getEnvironment() == llvm::Triple::GNU)
2310 return findMipsImgMultilibs(Flags, NonExistent, Result);
Daniel Sanders2bf13662014-07-10 14:40:57 +00002311
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002312 if (findMipsCsMultilibs(Flags, NonExistent, Result))
2313 return true;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002314
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002315 // Fallback to the regular toolchain-tree structure.
2316 Multilib Default;
2317 Result.Multilibs.push_back(Default);
2318 Result.Multilibs.FilterOut(NonExistent);
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002319
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002320 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2321 Result.BiarchSibling = Multilib();
2322 return true;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002323 }
2324
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002325 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002326}
2327
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002328static void findAndroidArmMultilibs(const Driver &D,
2329 const llvm::Triple &TargetTriple,
2330 StringRef Path, const ArgList &Args,
2331 DetectedMultilibs &Result) {
2332 // Find multilibs with subdirectories like armv7-a, thumb, armv7-a/thumb.
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002333 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002334 Multilib ArmV7Multilib = makeMultilib("/armv7-a")
2335 .flag("+armv7")
2336 .flag("-thumb");
2337 Multilib ThumbMultilib = makeMultilib("/thumb")
2338 .flag("-armv7")
2339 .flag("+thumb");
2340 Multilib ArmV7ThumbMultilib = makeMultilib("/armv7-a/thumb")
2341 .flag("+armv7")
2342 .flag("+thumb");
2343 Multilib DefaultMultilib = makeMultilib("")
2344 .flag("-armv7")
2345 .flag("-thumb");
2346 MultilibSet AndroidArmMultilibs =
2347 MultilibSet()
2348 .Either(ThumbMultilib, ArmV7Multilib,
2349 ArmV7ThumbMultilib, DefaultMultilib)
2350 .FilterOut(NonExistent);
2351
2352 Multilib::flags_list Flags;
2353 llvm::StringRef Arch = Args.getLastArgValue(options::OPT_march_EQ);
2354 bool IsArmArch = TargetTriple.getArch() == llvm::Triple::arm;
2355 bool IsThumbArch = TargetTriple.getArch() == llvm::Triple::thumb;
2356 bool IsV7SubArch = TargetTriple.getSubArch() == llvm::Triple::ARMSubArch_v7;
2357 bool IsThumbMode = IsThumbArch ||
2358 Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, false) ||
2359 (IsArmArch && llvm::ARM::parseArchISA(Arch) == llvm::ARM::IK_THUMB);
2360 bool IsArmV7Mode = (IsArmArch || IsThumbArch) &&
2361 (llvm::ARM::parseArchVersion(Arch) == 7 ||
2362 (IsArmArch && Arch == "" && IsV7SubArch));
2363 addMultilibFlag(IsArmV7Mode, "armv7", Flags);
2364 addMultilibFlag(IsThumbMode, "thumb", Flags);
2365
2366 if (AndroidArmMultilibs.select(Flags, Result.SelectedMultilib))
2367 Result.Multilibs = AndroidArmMultilibs;
2368}
2369
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002370static bool findBiarchMultilibs(const Driver &D,
2371 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002372 StringRef Path, const ArgList &Args,
2373 bool NeedsBiarchSuffix,
2374 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002375 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2376 // in what would normally be GCCInstallPath and put the 64-bit
2377 // libs in a subdirectory named 64. The simple logic we follow is that
2378 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2379 // we use that. If not, and if not a biarch triple alias, we look for
2380 // crtbegin.o without the subdirectory.
2381
2382 Multilib Default;
2383 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002384 .gccSuffix("/64")
2385 .includeSuffix("/64")
2386 .flag("-m32")
2387 .flag("+m64")
2388 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002389 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002390 .gccSuffix("/32")
2391 .includeSuffix("/32")
2392 .flag("+m32")
2393 .flag("-m64")
2394 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002395 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002396 .gccSuffix("/x32")
2397 .includeSuffix("/x32")
2398 .flag("-m32")
2399 .flag("-m64")
2400 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002401
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002402 // GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a.
2403 FilterNonExistent NonExistent(
2404 Path, TargetTriple.isOSIAMCU() ? "/libgcc.a" : "/crtbegin.o", D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002405
Zinovy Nis1db95732014-07-10 15:27:19 +00002406 // Determine default multilib from: 32, 64, x32
2407 // Also handle cases such as 64 on 32, 32 on 64, etc.
2408 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002409 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002410 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002411 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002412 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002413 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002414 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002415 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002416 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002417 if (TargetTriple.isArch32Bit())
2418 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002419 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002420 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002421 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002422 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002423 }
2424
Zinovy Nis1db95732014-07-10 15:27:19 +00002425 if (Want == WANT32)
2426 Default.flag("+m32").flag("-m64").flag("-mx32");
2427 else if (Want == WANT64)
2428 Default.flag("-m32").flag("+m64").flag("-mx32");
2429 else if (Want == WANTX32)
2430 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002431 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002432 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002433
Simon Atanasyan60280b42014-05-12 07:37:51 +00002434 Result.Multilibs.push_back(Default);
2435 Result.Multilibs.push_back(Alt64);
2436 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002437 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002438
Simon Atanasyan60280b42014-05-12 07:37:51 +00002439 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002440
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002441 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002442 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002443 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002444 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002445
Simon Atanasyan60280b42014-05-12 07:37:51 +00002446 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002447 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002448
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002449 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002450 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002451 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002452
2453 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002454}
2455
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002456void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2457 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2458 const std::string &LibDir, StringRef CandidateTriple,
2459 bool NeedsBiarchSuffix) {
2460 // Solaris is a special case. The GCC installation is under
2461 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2462 // need to iterate twice.
2463 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002464 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2465 !EC && LI != LE; LI = LI.increment(EC)) {
2466 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002467 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2468
2469 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002470 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002471 continue; // Saw this path before; no need to look at it again.
2472 if (CandidateVersion.isOlderThan(4, 1, 1))
2473 continue;
2474 if (CandidateVersion <= Version)
2475 continue;
2476
2477 GCCInstallPath =
2478 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002479 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002480 continue;
2481
2482 // If we make it here there has to be at least one GCC version, let's just
2483 // use the latest one.
2484 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002485 for (vfs::directory_iterator
2486 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2487 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002488 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2489
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002490 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002491 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2492
2493 if (CandidateSubVersion > Version)
2494 Version = CandidateSubVersion;
2495 }
2496
2497 GCCTriple.setTriple(CandidateTriple);
2498
2499 GCCInstallPath += "/" + Version.Text;
2500 GCCParentLibPath = GCCInstallPath + "/../../../../";
2501
2502 IsValid = true;
2503 }
2504}
2505
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002506void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002507 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002508 const std::string &LibDir, StringRef CandidateTriple,
2509 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002510 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002511 // There are various different suffixes involving the triple we
2512 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002513 // up to the lib directory. Specifically, the number of "up" steps
2514 // in the second half of each row is 1 + the number of path separators
2515 // in the first half.
2516 const std::string LibAndInstallSuffixes[][2] = {
2517 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2518
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002519 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002520 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2521
2522 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2523 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002524
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002525 // The Freescale PPC SDK has the gcc libraries in
2526 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002527 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002528
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002529 // Ubuntu has a strange mis-matched pair of triples that this happens to
2530 // match.
2531 // FIXME: It may be worthwhile to generalize this and look for a second
2532 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002533 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2534
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002535 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2536 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2537 NeedsBiarchSuffix);
2538 return;
2539 }
2540
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002541 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002542 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2543 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002544 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002545 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002546 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002547 for (vfs::directory_iterator
2548 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2549 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002550 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002551 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002552 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002553 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002554 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002555 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002556 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002557 continue;
2558 if (CandidateVersion <= Version)
2559 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002560
Simon Atanasyan60280b42014-05-12 07:37:51 +00002561 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002562
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002563 // Android standalone toolchain could have multilibs for ARM and Thumb.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002564 // Debian mips multilibs behave more like the rest of the biarch ones,
2565 // so handle them there
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002566 if (isArmOrThumbArch(TargetArch) && TargetTriple.isAndroid()) {
2567 // It should also work without multilibs in a simplified toolchain.
2568 findAndroidArmMultilibs(D, TargetTriple, LI->getName(), Args, Detected);
2569 } else if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002570 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002571 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002572 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002573 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002574 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002575 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002576
Simon Atanasyan60280b42014-05-12 07:37:51 +00002577 Multilibs = Detected.Multilibs;
2578 SelectedMultilib = Detected.SelectedMultilib;
2579 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002580 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002581 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002582 // FIXME: We hack together the directory name here instead of
2583 // using LI to ensure stable path separators across Windows and
2584 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002585 GCCInstallPath =
2586 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2587 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002588 IsValid = true;
2589 }
2590 }
2591}
2592
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002593Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002594 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002595 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002596 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002597 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002598 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002599}
2600
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002601Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002602
Rafael Espindola7cf32212013-03-20 03:05:54 +00002603Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002604 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002605 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002606 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002607 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002608 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002609 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002610 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002611 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002612 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002613 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002614 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002615 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002616}
2617
Rafael Espindola7cf32212013-03-20 03:05:54 +00002618Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002619 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002620}
2621
Douglas Katzman95354292015-06-23 20:42:09 +00002622Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002623
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002624void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2625 // Print the information about how we detected the GCC installation.
2626 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002627 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002628}
2629
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002630bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002631 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002632}
2633
David Majnemer17f448b2015-06-28 04:23:33 +00002634bool Generic_GCC::isPICDefault() const {
2635 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2636}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002637
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002638bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002639
David Majnemer17f448b2015-06-28 04:23:33 +00002640bool Generic_GCC::isPICDefaultForced() const {
2641 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2642}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002643
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002644bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002645 switch (getTriple().getArch()) {
2646 case llvm::Triple::x86:
2647 case llvm::Triple::x86_64:
2648 case llvm::Triple::aarch64:
2649 case llvm::Triple::aarch64_be:
2650 case llvm::Triple::arm:
2651 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002652 case llvm::Triple::bpfel:
2653 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002654 case llvm::Triple::thumb:
2655 case llvm::Triple::thumbeb:
2656 case llvm::Triple::ppc:
2657 case llvm::Triple::ppc64:
2658 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002659 case llvm::Triple::systemz:
Daniel Sanderse160f832016-05-14 12:43:08 +00002660 case llvm::Triple::mips:
2661 case llvm::Triple::mipsel:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002662 return true;
2663 default:
2664 return false;
2665 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002666}
2667
James Y Knighta6c9ee72015-10-16 18:46:26 +00002668/// \brief Helper to add the variant paths of a libstdc++ installation.
2669bool Generic_GCC::addLibStdCXXIncludePaths(
2670 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2671 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2672 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2673 if (!getVFS().exists(Base + Suffix))
2674 return false;
2675
2676 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2677
2678 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2679 // that path exists or we have neither a GCC nor target multiarch triple, use
2680 // this vanilla search path.
2681 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2682 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2683 addSystemInclude(DriverArgs, CC1Args,
2684 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2685 } else {
2686 // Otherwise try to use multiarch naming schemes which have normalized the
2687 // triples and put the triple before the suffix.
2688 //
2689 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2690 // the target triple, so we support that here.
2691 addSystemInclude(DriverArgs, CC1Args,
2692 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2693 addSystemInclude(DriverArgs, CC1Args,
2694 Base + "/" + TargetMultiarchTriple + Suffix);
2695 }
2696
2697 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2698 return true;
2699}
2700
Kristof Beylsfb387292014-01-10 13:44:34 +00002701void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2702 ArgStringList &CC1Args) const {
2703 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002704 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002705 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002706 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002707 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002708 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002709 getTriple().getOS() == llvm::Triple::NaCl ||
2710 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2711 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002712
2713 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002714 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002715 CC1Args.push_back("-fuse-init-array");
2716}
2717
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002718/// Mips Toolchain
2719MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2720 const llvm::Triple &Triple,
2721 const ArgList &Args)
2722 : Linux(D, Triple, Args) {
2723 // Select the correct multilib according to the given arguments.
2724 DetectedMultilibs Result;
2725 findMIPSMultilibs(D, Triple, "", Args, Result);
2726 Multilibs = Result.Multilibs;
2727 SelectedMultilib = Result.SelectedMultilib;
2728
2729 // Find out the library suffix based on the ABI.
2730 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2731 getFilePaths().clear();
2732 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2733
2734 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002735 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002736}
2737
2738void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2739 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2740 if (DriverArgs.hasArg(options::OPT_nostdinc))
2741 return;
2742
2743 const Driver &D = getDriver();
2744
2745 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2746 SmallString<128> P(D.ResourceDir);
2747 llvm::sys::path::append(P, "include");
2748 addSystemInclude(DriverArgs, CC1Args, P);
2749 }
2750
2751 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2752 return;
2753
2754 const auto &Callback = Multilibs.includeDirsCallback();
2755 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002756 for (const auto &Path : Callback(SelectedMultilib))
2757 addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
2758 D.getInstalledDir() + Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002759 }
2760}
2761
2762Tool *MipsLLVMToolChain::buildLinker() const {
2763 return new tools::gnutools::Linker(*this);
2764}
2765
2766std::string MipsLLVMToolChain::computeSysRoot() const {
2767 if (!getDriver().SysRoot.empty())
2768 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2769
2770 const std::string InstalledDir(getDriver().getInstalledDir());
2771 std::string SysRootPath =
2772 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2773 if (llvm::sys::fs::exists(SysRootPath))
2774 return SysRootPath;
2775
2776 return std::string();
2777}
2778
2779ToolChain::CXXStdlibType
2780MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2781 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2782 if (A) {
2783 StringRef Value = A->getValue();
2784 if (Value != "libc++")
2785 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2786 << A->getAsString(Args);
2787 }
2788
2789 return ToolChain::CST_Libcxx;
2790}
2791
2792void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2793 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2794 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2795 DriverArgs.hasArg(options::OPT_nostdincxx))
2796 return;
2797
2798 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2799 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2800
2801 const auto &Callback = Multilibs.includeDirsCallback();
2802 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002803 for (std::string Path : Callback(SelectedMultilib)) {
2804 Path = getDriver().getInstalledDir() + Path + "/c++/v1";
2805 if (llvm::sys::fs::exists(Path)) {
2806 addSystemInclude(DriverArgs, CC1Args, Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002807 break;
2808 }
2809 }
2810 }
2811}
2812
2813void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2814 ArgStringList &CmdArgs) const {
2815 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2816 "Only -lc++ (aka libxx) is suported in this toolchain.");
2817
2818 CmdArgs.push_back("-lc++");
2819 CmdArgs.push_back("-lc++abi");
2820 CmdArgs.push_back("-lunwind");
2821}
2822
2823std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2824 StringRef Component,
2825 bool Shared) const {
2826 SmallString<128> Path(getDriver().ResourceDir);
2827 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2828 getOS());
2829 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002830 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002831 return Path.str();
2832}
2833
Tony Linthicum76329bf2011-12-12 21:14:55 +00002834/// Hexagon Toolchain
2835
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002836std::string HexagonToolChain::getHexagonTargetDir(
2837 const std::string &InstalledDir,
2838 const SmallVectorImpl<std::string> &PrefixDirs) const {
2839 std::string InstallRelDir;
2840 const Driver &D = getDriver();
2841
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002842 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002843 for (auto &I : PrefixDirs)
2844 if (D.getVFS().exists(I))
2845 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00002846
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002847 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002848 return InstallRelDir;
2849
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002850 return InstallRelDir;
2851}
2852
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002853Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
2854 const ArgList &Args) {
2855 StringRef Gn = "";
2856 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
2857 options::OPT_msmall_data_threshold_EQ)) {
2858 Gn = A->getValue();
2859 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
2860 options::OPT_fPIC)) {
2861 Gn = "0";
2862 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002863
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002864 unsigned G;
2865 if (!Gn.getAsInteger(10, G))
2866 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002867
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002868 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002869}
2870
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002871void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
2872 ToolChain::path_list &LibPaths) const {
2873 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00002874
2875 //----------------------------------------------------------------------------
2876 // -L Args
2877 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002878 for (Arg *A : Args.filtered(options::OPT_L))
2879 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002880 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002881
2882 //----------------------------------------------------------------------------
2883 // Other standard paths
2884 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002885 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00002886 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
2887 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00002888
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002889 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2890 D.PrefixDirs);
2891 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
2892 RootDirs.push_back(TargetDir);
2893
2894 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
2895 // Assume G0 with -shared.
2896 bool HasG0 = Args.hasArg(options::OPT_shared);
2897 if (auto G = getSmallDataThreshold(Args))
2898 HasG0 = G.getValue() == 0;
2899
2900 const std::string CpuVer = GetTargetCPUVersion(Args).str();
2901 for (auto &Dir : RootDirs) {
2902 std::string LibDir = Dir + "/hexagon/lib";
2903 std::string LibDirCpu = LibDir + '/' + CpuVer;
2904 if (HasG0) {
2905 if (HasPIC)
2906 LibPaths.push_back(LibDirCpu + "/G0/pic");
2907 LibPaths.push_back(LibDirCpu + "/G0");
2908 }
2909 LibPaths.push_back(LibDirCpu);
2910 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00002911 }
Matthew Curtise689b052012-12-06 15:46:07 +00002912}
2913
Douglas Katzman54366072015-07-27 16:53:08 +00002914HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002915 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002916 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002917 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2918 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002919
2920 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2921 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002922 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002923 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002924 getProgramPaths().push_back(BinDir);
2925
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002926 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002927
2928 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2929 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2930 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002931 LibPaths.clear();
2932 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002933}
2934
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002935HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002936
Douglas Katzman54366072015-07-27 16:53:08 +00002937Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002938 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002939}
2940
Douglas Katzman54366072015-07-27 16:53:08 +00002941Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002942 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002943}
2944
Douglas Katzman54366072015-07-27 16:53:08 +00002945void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2946 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002947 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2948 DriverArgs.hasArg(options::OPT_nostdlibinc))
2949 return;
2950
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002951 const Driver &D = getDriver();
2952 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2953 D.PrefixDirs);
2954 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002955}
2956
Douglas Katzman54366072015-07-27 16:53:08 +00002957void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2958 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002959 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2960 DriverArgs.hasArg(options::OPT_nostdincxx))
2961 return;
2962
2963 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002964 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
2965 addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002966}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002967
Matthew Curtise689b052012-12-06 15:46:07 +00002968ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002969HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002970 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2971 if (!A)
2972 return ToolChain::CST_Libstdcxx;
2973
2974 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002975 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002976 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002977
2978 return ToolChain::CST_Libstdcxx;
2979}
2980
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002981//
2982// Returns the default CPU for Hexagon. This is the default compilation target
2983// if no Hexagon processor is selected at the command-line.
2984//
2985const StringRef HexagonToolChain::GetDefaultCPU() {
2986 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002987}
2988
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002989const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
2990 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00002991 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
2992 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002993
2994 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
2995 if (CPU.startswith("hexagon"))
2996 return CPU.substr(sizeof("hexagon") - 1);
2997 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002998}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002999// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00003000
Tom Stellard8fa33092015-07-18 01:49:05 +00003001/// AMDGPU Toolchain
3002AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
3003 const ArgList &Args)
3004 : Generic_ELF(D, Triple, Args) { }
3005
3006Tool *AMDGPUToolChain::buildLinker() const {
3007 return new tools::amdgpu::Linker(*this);
3008}
3009// End AMDGPU
3010
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003011/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00003012NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
3013 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003014 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003015
3016 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
3017 // default paths, and must instead only use the paths provided
3018 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003019 path_list &file_paths = getFilePaths();
3020 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003021
3022 file_paths.clear();
3023 prog_paths.clear();
3024
3025 // Path for library files (libc.a, ...)
3026 std::string FilePath(getDriver().Dir + "/../");
3027
3028 // Path for tools (clang, ld, etc..)
3029 std::string ProgPath(getDriver().Dir + "/../");
3030
3031 // Path for toolchain libraries (libgcc.a, ...)
3032 std::string ToolPath(getDriver().ResourceDir + "/lib/");
3033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003034 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00003035 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003036 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00003037 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003038 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3039 file_paths.push_back(ToolPath + "i686-nacl");
3040 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003041 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003042 file_paths.push_back(FilePath + "x86_64-nacl/lib");
3043 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
3044 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3045 file_paths.push_back(ToolPath + "x86_64-nacl");
3046 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003047 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003048 file_paths.push_back(FilePath + "arm-nacl/lib");
3049 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
3050 prog_paths.push_back(ProgPath + "arm-nacl/bin");
3051 file_paths.push_back(ToolPath + "arm-nacl");
3052 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003053 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003054 file_paths.push_back(FilePath + "mipsel-nacl/lib");
3055 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
3056 prog_paths.push_back(ProgPath + "bin");
3057 file_paths.push_back(ToolPath + "mipsel-nacl");
3058 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003059 default:
3060 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003061 }
3062
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003063 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
3064}
3065
Douglas Katzman54366072015-07-27 16:53:08 +00003066void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3067 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003068 const Driver &D = getDriver();
3069 if (DriverArgs.hasArg(options::OPT_nostdinc))
3070 return;
3071
3072 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
3073 SmallString<128> P(D.ResourceDir);
3074 llvm::sys::path::append(P, "include");
3075 addSystemInclude(DriverArgs, CC1Args, P.str());
3076 }
3077
3078 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3079 return;
3080
3081 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003082 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00003083 case llvm::Triple::x86:
3084 // x86 is special because multilib style uses x86_64-nacl/include for libc
3085 // headers but the SDK wants i686-nacl/usr/include. The other architectures
3086 // have the same substring.
3087 llvm::sys::path::append(P, "i686-nacl/usr/include");
3088 addSystemInclude(DriverArgs, CC1Args, P.str());
3089 llvm::sys::path::remove_filename(P);
3090 llvm::sys::path::remove_filename(P);
3091 llvm::sys::path::remove_filename(P);
3092 llvm::sys::path::append(P, "x86_64-nacl/include");
3093 addSystemInclude(DriverArgs, CC1Args, P.str());
3094 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003095 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003096 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003097 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003098 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003099 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003100 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003101 case llvm::Triple::mipsel:
3102 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
3103 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003104 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003105 return;
3106 }
3107
3108 addSystemInclude(DriverArgs, CC1Args, P.str());
3109 llvm::sys::path::remove_filename(P);
3110 llvm::sys::path::remove_filename(P);
3111 llvm::sys::path::append(P, "include");
3112 addSystemInclude(DriverArgs, CC1Args, P.str());
3113}
3114
Douglas Katzman54366072015-07-27 16:53:08 +00003115void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3116 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003117 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3118 // if the value is libc++, and emits an error for other values.
3119 GetCXXStdlibType(Args);
3120 CmdArgs.push_back("-lc++");
3121}
3122
Douglas Katzman54366072015-07-27 16:53:08 +00003123void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3124 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003125 const Driver &D = getDriver();
3126 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3127 DriverArgs.hasArg(options::OPT_nostdincxx))
3128 return;
3129
3130 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3131 // if the value is libc++, and emits an error for other values.
3132 GetCXXStdlibType(DriverArgs);
3133
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003134 SmallString<128> P(D.Dir + "/../");
3135 switch (getTriple().getArch()) {
3136 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003137 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
3138 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003139 break;
3140 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003141 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
3142 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003143 break;
3144 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003145 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
3146 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003147 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003148 case llvm::Triple::mipsel:
3149 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
3150 addSystemInclude(DriverArgs, CC1Args, P.str());
3151 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00003152 default:
3153 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003154 }
3155}
3156
Douglas Katzman54366072015-07-27 16:53:08 +00003157ToolChain::CXXStdlibType
3158NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003159 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3160 StringRef Value = A->getValue();
3161 if (Value == "libc++")
3162 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003163 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003164 }
3165
3166 return ToolChain::CST_Libcxx;
3167}
3168
Douglas Katzman54366072015-07-27 16:53:08 +00003169std::string
3170NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
3171 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003172 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
3173 if (TheTriple.getArch() == llvm::Triple::arm &&
3174 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
3175 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
3176 return TheTriple.getTriple();
3177}
3178
Douglas Katzman54366072015-07-27 16:53:08 +00003179Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003180 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003181}
3182
Douglas Katzman54366072015-07-27 16:53:08 +00003183Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003184 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00003185 return new tools::nacltools::AssemblerARM(*this);
3186 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003187}
3188// End NaCl
3189
Chris Lattner09797542010-03-04 21:07:38 +00003190/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
3191/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
3192/// Currently does not support anything else but compilation.
3193
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003194TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00003195 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003196 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00003197 // Path mangling to find libexec
3198 std::string Path(getDriver().Dir);
3199
3200 Path += "/../libexec";
3201 getProgramPaths().push_back(Path);
3202}
3203
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00003204TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00003205
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003206bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00003207
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003208bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003210bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003211
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003212bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003213
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003214// CloudABI - CloudABI tool chain which can call ld(1) directly.
3215
3216CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
3217 const ArgList &Args)
3218 : Generic_ELF(D, Triple, Args) {
3219 SmallString<128> P(getDriver().Dir);
3220 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
3221 getFilePaths().push_back(P.str());
3222}
3223
3224void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3225 ArgStringList &CC1Args) const {
3226 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
3227 DriverArgs.hasArg(options::OPT_nostdincxx))
3228 return;
3229
3230 SmallString<128> P(getDriver().Dir);
3231 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
3232 addSystemInclude(DriverArgs, CC1Args, P.str());
3233}
3234
3235void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
3236 ArgStringList &CmdArgs) const {
3237 CmdArgs.push_back("-lc++");
3238 CmdArgs.push_back("-lc++abi");
3239 CmdArgs.push_back("-lunwind");
3240}
3241
Douglas Katzman95354292015-06-23 20:42:09 +00003242Tool *CloudABI::buildLinker() const {
3243 return new tools::cloudabi::Linker(*this);
3244}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003245
Ed Schouten51bfbe72016-02-17 18:56:20 +00003246SanitizerMask CloudABI::getSupportedSanitizers() const {
3247 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3248 Res |= SanitizerKind::SafeStack;
3249 return Res;
3250}
3251
Ed Schoutenfc79d2c2016-03-29 21:13:53 +00003252SanitizerMask CloudABI::getDefaultSanitizers() const {
3253 return SanitizerKind::SafeStack;
3254}
3255
Reid Kleckner330fb172016-05-11 16:19:05 +00003256/// Haiku - Haiku tool chain which can call as(1) and ld(1) directly.
3257
3258Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
3259 : Generic_ELF(D, Triple, Args) {
3260
3261}
3262
3263void Haiku::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3264 ArgStringList &CC1Args) const {
3265 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3266 DriverArgs.hasArg(options::OPT_nostdincxx))
3267 return;
3268
3269 switch (GetCXXStdlibType(DriverArgs)) {
3270 case ToolChain::CST_Libcxx:
3271 addSystemInclude(DriverArgs, CC1Args,
3272 getDriver().SysRoot + "/system/develop/headers/c++/v1");
3273 break;
3274 case ToolChain::CST_Libstdcxx:
3275 addSystemInclude(DriverArgs, CC1Args,
3276 getDriver().SysRoot + "/system/develop/headers/c++");
3277 addSystemInclude(DriverArgs, CC1Args,
3278 getDriver().SysRoot + "/system/develop/headers/c++/backward");
3279
3280 StringRef Triple = getTriple().str();
3281 addSystemInclude(DriverArgs, CC1Args,
3282 getDriver().SysRoot + "/system/develop/headers/c++/" +
3283 Triple);
3284 break;
3285 }
3286}
3287
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003288/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3289
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003290OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3291 const ArgList &Args)
3292 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003293 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003294 getFilePaths().push_back("/usr/lib");
3295}
3296
Rafael Espindola7cf32212013-03-20 03:05:54 +00003297Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003298 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003299}
3300
Douglas Katzman95354292015-06-23 20:42:09 +00003301Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003302
Eli Friedman9fa28852012-08-08 23:57:20 +00003303/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3304
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003305Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3306 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003307 getFilePaths().push_back(getDriver().Dir + "/../lib");
3308 getFilePaths().push_back("/usr/lib");
3309}
3310
Rafael Espindola7cf32212013-03-20 03:05:54 +00003311Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003312 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003313}
3314
Douglas Katzman95354292015-06-23 20:42:09 +00003315Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003316
Jonas Hahnfeldaae83742016-02-12 07:48:37 +00003317ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
Richard Smith51af5192014-05-01 23:24:24 +00003318 return ToolChain::CST_Libcxx;
3319}
3320
Eli Friedman9fa28852012-08-08 23:57:20 +00003321void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3322 ArgStringList &CC1Args) const {
3323 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3324 DriverArgs.hasArg(options::OPT_nostdincxx))
3325 return;
3326
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003327 switch (GetCXXStdlibType(DriverArgs)) {
3328 case ToolChain::CST_Libcxx:
3329 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003330 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003331 break;
3332 case ToolChain::CST_Libstdcxx:
3333 addSystemInclude(DriverArgs, CC1Args,
3334 getDriver().SysRoot + "/usr/include/c++/stdc++");
3335 addSystemInclude(DriverArgs, CC1Args,
3336 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003337
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003338 StringRef Triple = getTriple().str();
3339 if (Triple.startswith("amd64"))
3340 addSystemInclude(DriverArgs, CC1Args,
3341 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003342 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003343 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003344 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3345 "/usr/include/c++/stdc++/" +
3346 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003347 break;
3348 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003349}
3350
3351void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3352 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003353 switch (GetCXXStdlibType(Args)) {
3354 case ToolChain::CST_Libcxx:
3355 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003356 CmdArgs.push_back("-lc++abi");
3357 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003358 break;
3359 case ToolChain::CST_Libstdcxx:
3360 CmdArgs.push_back("-lstdc++");
3361 break;
3362 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003363}
3364
Daniel Dunbare24297c2009-03-30 21:06:03 +00003365/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3366
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003367FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3368 const ArgList &Args)
3369 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003370
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003371 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3372 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003373 if ((Triple.getArch() == llvm::Triple::x86 ||
3374 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003375 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003376 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3377 else
3378 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003379}
3380
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003381ToolChain::CXXStdlibType FreeBSD::GetDefaultCXXStdlibType() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003382 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003383 return ToolChain::CST_Libcxx;
3384 return ToolChain::CST_Libstdcxx;
3385}
3386
3387void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3388 ArgStringList &CC1Args) const {
3389 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3390 DriverArgs.hasArg(options::OPT_nostdincxx))
3391 return;
3392
3393 switch (GetCXXStdlibType(DriverArgs)) {
3394 case ToolChain::CST_Libcxx:
3395 addSystemInclude(DriverArgs, CC1Args,
3396 getDriver().SysRoot + "/usr/include/c++/v1");
3397 break;
3398 case ToolChain::CST_Libstdcxx:
3399 addSystemInclude(DriverArgs, CC1Args,
3400 getDriver().SysRoot + "/usr/include/c++/4.2");
3401 addSystemInclude(DriverArgs, CC1Args,
3402 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3403 break;
3404 }
3405}
3406
Dimitry Andric60907392016-02-14 16:08:20 +00003407void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3408 ArgStringList &CmdArgs) const {
3409 CXXStdlibType Type = GetCXXStdlibType(Args);
3410 bool Profiling = Args.hasArg(options::OPT_pg);
3411
3412 switch (Type) {
3413 case ToolChain::CST_Libcxx:
3414 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3415 break;
3416
3417 case ToolChain::CST_Libstdcxx:
3418 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3419 break;
3420 }
3421}
3422
Rafael Espindola7cf32212013-03-20 03:05:54 +00003423Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003424 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003425}
3426
Douglas Katzman95354292015-06-23 20:42:09 +00003427Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003428
Tim Northovere931f9f2015-10-30 16:30:41 +00003429bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003430 // FreeBSD uses SjLj exceptions on ARM oabi.
3431 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003432 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003433 case llvm::Triple::GNUEABI:
3434 case llvm::Triple::EABI:
3435 return false;
3436
3437 default:
3438 return (getTriple().getArch() == llvm::Triple::arm ||
3439 getTriple().getArch() == llvm::Triple::thumb);
3440 }
3441}
3442
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003443bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003444
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003445bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003446
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003447SanitizerMask FreeBSD::getSupportedSanitizers() const {
3448 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3449 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3450 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3451 getTriple().getArch() == llvm::Triple::mips64el;
3452 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3453 Res |= SanitizerKind::Address;
3454 Res |= SanitizerKind::Vptr;
3455 if (IsX86_64 || IsMIPS64) {
3456 Res |= SanitizerKind::Leak;
3457 Res |= SanitizerKind::Thread;
3458 }
3459 if (IsX86 || IsX86_64) {
3460 Res |= SanitizerKind::SafeStack;
3461 }
3462 return Res;
3463}
3464
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003465/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3466
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003467NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3468 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003469 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003470 // When targeting a 32-bit platform, try the special directory used on
3471 // 64-bit hosts, and only fall back to the main library directory if that
3472 // doesn't work.
3473 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3474 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003475 switch (Triple.getArch()) {
3476 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003477 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003478 break;
3479 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003480 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003481 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003482 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003483 switch (Triple.getEnvironment()) {
3484 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003485 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003486 getFilePaths().push_back("=/usr/lib/eabi");
3487 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003488 case llvm::Triple::EABIHF:
3489 case llvm::Triple::GNUEABIHF:
3490 getFilePaths().push_back("=/usr/lib/eabihf");
3491 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003492 default:
3493 getFilePaths().push_back("=/usr/lib/oabi");
3494 break;
3495 }
3496 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003497 case llvm::Triple::mips64:
3498 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003499 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003500 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003501 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003502 getFilePaths().push_back("=/usr/lib/64");
3503 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003504 case llvm::Triple::ppc:
3505 getFilePaths().push_back("=/usr/lib/powerpc");
3506 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003507 case llvm::Triple::sparc:
3508 getFilePaths().push_back("=/usr/lib/sparc");
3509 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003510 default:
3511 break;
3512 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003513
3514 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003515 }
3516}
3517
Rafael Espindola7cf32212013-03-20 03:05:54 +00003518Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003519 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003520}
3521
Douglas Katzman95354292015-06-23 20:42:09 +00003522Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003523
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003524ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const {
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003525 unsigned Major, Minor, Micro;
3526 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003527 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003528 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003529 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003530 case llvm::Triple::arm:
3531 case llvm::Triple::armeb:
3532 case llvm::Triple::thumb:
3533 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003534 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003535 case llvm::Triple::ppc64:
3536 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003537 case llvm::Triple::sparc:
3538 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003539 case llvm::Triple::x86:
3540 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003541 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003542 default:
3543 break;
3544 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003545 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003546 return ToolChain::CST_Libstdcxx;
3547}
3548
3549void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3550 ArgStringList &CC1Args) const {
3551 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3552 DriverArgs.hasArg(options::OPT_nostdincxx))
3553 return;
3554
3555 switch (GetCXXStdlibType(DriverArgs)) {
3556 case ToolChain::CST_Libcxx:
3557 addSystemInclude(DriverArgs, CC1Args,
3558 getDriver().SysRoot + "/usr/include/c++/");
3559 break;
3560 case ToolChain::CST_Libstdcxx:
3561 addSystemInclude(DriverArgs, CC1Args,
3562 getDriver().SysRoot + "/usr/include/g++");
3563 addSystemInclude(DriverArgs, CC1Args,
3564 getDriver().SysRoot + "/usr/include/g++/backward");
3565 break;
3566 }
3567}
3568
Chris Lattner3e2ee142010-07-07 16:01:42 +00003569/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3570
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003571Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3572 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003573 getFilePaths().push_back(getDriver().Dir + "/../lib");
3574 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003575}
3576
Rafael Espindola7cf32212013-03-20 03:05:54 +00003577Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003578 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003579}
3580
Douglas Katzman95354292015-06-23 20:42:09 +00003581Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003582
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003583static void addPathIfExists(const Driver &D, const Twine &Path,
3584 ToolChain::path_list &Paths) {
3585 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003586 Paths.push_back(Path.str());
3587}
3588
David Chisnallf571cde2012-02-15 13:39:01 +00003589/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3590
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003591Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003592 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003593 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003594
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003595 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003596
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003597 path_list &Paths = getFilePaths();
3598 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003599 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003600
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003601 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003602 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003603 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003604
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003605 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003606
3607 std::string LibPath = "/usr/lib/";
3608 switch (Triple.getArch()) {
3609 case llvm::Triple::x86:
3610 case llvm::Triple::sparc:
3611 break;
3612 case llvm::Triple::x86_64:
3613 LibPath += "amd64/";
3614 break;
3615 case llvm::Triple::sparcv9:
3616 LibPath += "sparcv9/";
3617 break;
3618 default:
3619 llvm_unreachable("Unsupported architecture");
3620 }
3621
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003622 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003623}
3624
Rafael Espindola7cf32212013-03-20 03:05:54 +00003625Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003626 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003627}
3628
Douglas Katzman95354292015-06-23 20:42:09 +00003629Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003630
Rafael Espindolad5117262015-09-09 13:36:00 +00003631void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3632 ArgStringList &CC1Args) const {
3633 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3634 DriverArgs.hasArg(options::OPT_nostdincxx))
3635 return;
3636
3637 // Include the support directory for things like xlocale and fudged system
3638 // headers.
3639 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3640
3641 if (GCCInstallation.isValid()) {
3642 GCCVersion Version = GCCInstallation.getVersion();
3643 addSystemInclude(DriverArgs, CC1Args,
3644 getDriver().SysRoot + "/usr/gcc/" +
3645 Version.MajorStr + "." +
3646 Version.MinorStr +
3647 "/include/c++/" + Version.Text);
3648 addSystemInclude(DriverArgs, CC1Args,
3649 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3650 "." + Version.MinorStr + "/include/c++/" +
3651 Version.Text + "/" +
3652 GCCInstallation.getTriple().str());
3653 }
3654}
3655
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003656/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003657
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003658enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003659 // NB: Releases of a particular Linux distro should be kept together
3660 // in this enum, because some tests are done by integer comparison against
3661 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003662 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003663 DebianLenny,
3664 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003665 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003666 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003667 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003668 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003669 RHEL5,
3670 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003671 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003672 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003673 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003674 UbuntuHardy,
3675 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003676 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003677 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003678 UbuntuLucid,
3679 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003680 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003681 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003682 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003683 UbuntuQuantal,
3684 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003685 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003686 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003687 UbuntuUtopic,
3688 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003689 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003690 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003691 UnknownDistro
3692};
3693
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003694static bool IsRedhat(enum Distro Distro) {
Rafael Espindola52fe8962016-05-09 13:13:50 +00003695 return Distro == Fedora || (Distro >= RHEL5 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003696}
3697
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003698static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003699
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003700static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003701 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003702}
3703
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003704static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003705 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003706}
3707
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003708static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003709 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3710 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3711 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003712 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003713 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003714 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003715 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003716 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003717 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3718 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3719 .Case("hardy", UbuntuHardy)
3720 .Case("intrepid", UbuntuIntrepid)
3721 .Case("jaunty", UbuntuJaunty)
3722 .Case("karmic", UbuntuKarmic)
3723 .Case("lucid", UbuntuLucid)
3724 .Case("maverick", UbuntuMaverick)
3725 .Case("natty", UbuntuNatty)
3726 .Case("oneiric", UbuntuOneiric)
3727 .Case("precise", UbuntuPrecise)
3728 .Case("quantal", UbuntuQuantal)
3729 .Case("raring", UbuntuRaring)
3730 .Case("saucy", UbuntuSaucy)
3731 .Case("trusty", UbuntuTrusty)
3732 .Case("utopic", UbuntuUtopic)
3733 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003734 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003735 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003736 .Default(UnknownDistro);
Rafael Espindola52fe8962016-05-09 13:13:50 +00003737 if (Version != UnknownDistro)
3738 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003739 }
3740
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003741 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3742 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003743 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003744 if (Data.startswith("Fedora release"))
3745 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003746 if (Data.startswith("Red Hat Enterprise Linux") ||
Rafael Espindola52fe8962016-05-09 13:13:50 +00003747 Data.startswith("CentOS") ||
3748 Data.startswith("Scientific Linux")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003749 if (Data.find("release 7") != StringRef::npos)
3750 return RHEL7;
3751 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003752 return RHEL6;
3753 else if (Data.find("release 5") != StringRef::npos)
3754 return RHEL5;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003755 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003756 return UnknownDistro;
3757 }
3758
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003759 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3760 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003761 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003762 if (Data[0] == '5')
3763 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003764 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003765 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003766 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003767 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003768 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003769 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003770 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3771 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003772 return UnknownDistro;
3773 }
3774
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003775 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003776 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003777
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003778 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003779 return Exherbo;
3780
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003781 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003782 return ArchLinux;
3783
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003784 return UnknownDistro;
3785}
3786
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003787/// \brief Get our best guess at the multiarch triple for a target.
3788///
3789/// Debian-based systems are starting to use a multiarch setup where they use
3790/// a target-triple directory in the library and header search paths.
3791/// Unfortunately, this triple does not align with the vanilla target triple,
3792/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003793static std::string getMultiarchTriple(const Driver &D,
3794 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003795 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003796 llvm::Triple::EnvironmentType TargetEnvironment =
3797 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003798
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003799 // For most architectures, just use whatever we have rather than trying to be
3800 // clever.
3801 switch (TargetTriple.getArch()) {
3802 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003803 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003804
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003805 // We use the existence of '/lib/<triple>' as a directory to detect some
3806 // common linux triples that don't quite match the Clang triple for both
3807 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3808 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003809 case llvm::Triple::arm:
3810 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003811 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003812 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003813 return "arm-linux-gnueabihf";
3814 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003815 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003816 return "arm-linux-gnueabi";
3817 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003818 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003819 case llvm::Triple::armeb:
3820 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003821 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003822 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003823 return "armeb-linux-gnueabihf";
3824 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003825 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003826 return "armeb-linux-gnueabi";
3827 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003828 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003829 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003830 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003831 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003832 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003833 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003834 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003835 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003836 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003837 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003838 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003839 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003840 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003841 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003842 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003843 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003844 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003845 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003846 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003847 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003848 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003849 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003850 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003851 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003852 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003853 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003854 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003855 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003856 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003857 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003858 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003859 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003860 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003861 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003862 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003863 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003864 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003865 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003866 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003867 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003868 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003869 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003870 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003871 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003872 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003873 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003874 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003875 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003876 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003877 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003878 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003879 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003880 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003881 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003882 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003883 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003884 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003885 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003886 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003887 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003888 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003889 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003890 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003891 return "s390x-linux-gnu";
3892 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003893 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003894 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003895}
3896
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003897static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003898 if (isMipsArch(Triple.getArch())) {
3899 // lib32 directory has a special meaning on MIPS targets.
3900 // It contains N32 ABI binaries. Use this folder if produce
3901 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003902 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003903 return "lib32";
3904 return Triple.isArch32Bit() ? "lib" : "lib64";
3905 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003906
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003907 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003908 // using that variant while targeting other architectures causes problems
3909 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003910 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003911 // them when we know we may need it.
3912 //
3913 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003914 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003915 // GCCInstallationDetector, but that is a more significant refactoring.
3916 if (Triple.getArch() == llvm::Triple::x86 ||
3917 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003918 return "lib32";
3919
Zinovy Nis1db95732014-07-10 15:27:19 +00003920 if (Triple.getArch() == llvm::Triple::x86_64 &&
3921 Triple.getEnvironment() == llvm::Triple::GNUX32)
3922 return "libx32";
3923
Simon Atanasyand4413882012-09-14 11:27:24 +00003924 return Triple.isArch32Bit() ? "lib" : "lib64";
3925}
3926
Simon Atanasyan2834a222016-05-22 18:18:07 +00003927static void addMultilibsFilePaths(const Driver &D, const MultilibSet &Multilibs,
3928 const Multilib &Multilib,
3929 StringRef InstallPath,
3930 ToolChain::path_list &Paths) {
3931 if (const auto &PathsCallback = Multilibs.filePathsCallback())
3932 for (const auto &Path : PathsCallback(Multilib))
3933 addPathIfExists(D, InstallPath + Path, Paths);
3934}
3935
Rafael Espindola1af7c212012-02-19 01:38:32 +00003936Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003938 GCCInstallation.init(Triple, Args);
3939 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003940 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003941 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003942 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003943
Rafael Espindola10a63c22013-07-03 14:14:00 +00003944 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003945 // least) put various tools in a triple-prefixed directory off of the parent
3946 // of the GCC installation. We use the GCC triple here to ensure that we end
3947 // up with tools that support the same amount of cross compiling as the
3948 // detected GCC installation. For example, if we find a GCC installation
3949 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3950 // used to target i386.
3951 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003952 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003953 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003954 GCCInstallation.getTriple().str() + "/bin")
3955 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003956
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003957 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003958
Rafael Espindola10a63c22013-07-03 14:14:00 +00003959 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003960 ExtraOpts.push_back("-z");
3961 ExtraOpts.push_back("relro");
3962 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003963
Douglas Gregord9bb1522011-03-06 19:11:49 +00003964 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003965 ExtraOpts.push_back("-X");
3966
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003967 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003968 const bool IsMips = isMipsArch(Arch);
3969
3970 if (IsMips && !SysRoot.empty())
3971 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003972
Chandler Carruth0b842912011-12-09 04:45:18 +00003973 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3974 // and the MIPS ABI require .dynsym to be sorted in different ways.
3975 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3976 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003977 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003978 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003979 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003980 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003981 ExtraOpts.push_back("--hash-style=gnu");
3982
Rafael Espindola10a63c22013-07-03 14:14:00 +00003983 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003984 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3985 ExtraOpts.push_back("--hash-style=both");
3986 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003987
Rafael Espindola52fe8962016-05-09 13:13:50 +00003988 if (IsRedhat(Distro) && Distro != RHEL5 && Distro != RHEL6)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003989 ExtraOpts.push_back("--no-add-needed");
3990
Rafael Espindola5ed89d42016-06-03 17:26:16 +00003991#ifdef ENABLE_LINKER_BUILD_ID
3992 ExtraOpts.push_back("--build-id");
3993#endif
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003994
Rafael Espindola10a63c22013-07-03 14:14:00 +00003995 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003996 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003997
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003998 // The selection of paths to try here is designed to match the patterns which
3999 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
4000 // This was determined by running GCC in a fake filesystem, creating all
4001 // possible permutations of these directories, and seeing which ones it added
4002 // to the link paths.
4003 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00004004
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004005 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004006 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004007
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004008 // Add the multilib suffixed paths where they are available.
4009 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00004010 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00004011 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004012 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan2834a222016-05-22 18:18:07 +00004013 const MultilibSet &Multilibs = GCCInstallation.getMultilibs();
4014
4015 // Add toolchain / multilib specific file paths.
4016 addMultilibsFilePaths(D, Multilibs, Multilib,
4017 GCCInstallation.getInstallPath(), Paths);
Simon Atanasyan53fefd12012-10-03 17:46:38 +00004018
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004019 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00004020 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004021 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004022 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004023
4024 // GCC cross compiling toolchains will install target libraries which ship
4025 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
4026 // any part of the GCC installation in
4027 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
4028 // debatable, but is the reality today. We need to search this tree even
4029 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004030 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004031 // installation that is *not* within the system root to ensure two things:
4032 //
4033 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00004034 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004035 // appropriate rpath.
4036 // 2) There must not be libraries installed into
4037 // <prefix>/<triple>/<libdir> unless they should be preferred over
4038 // those within the system root.
4039 //
4040 // Note that this matches the GCC behavior. See the below comment for where
4041 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004042 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
4043 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004044 Paths);
4045
Chandler Carruth69a125b2012-04-06 16:32:06 +00004046 // If the GCC installation we found is inside of the sysroot, we want to
4047 // prefer libraries installed in the parent prefix of the GCC installation.
4048 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00004049 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004050 // This usually happens when there is an external cross compiler on the
4051 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004052 // the cross. Note that GCC does include some of these directories in some
4053 // configurations but this seems somewhere between questionable and simply
4054 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004055 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004056 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
4057 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00004058 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004059 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004060
4061 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004062 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00004063 // those searched.
4064 // FIXME: It's not clear whether we should use the driver's installed
4065 // directory ('Dir' below) or the ResourceDir.
4066 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004067 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
4068 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004069 }
4070
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004071 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
4072 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
4073 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
4074 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004075
Chandler Carruthb427c562013-06-22 11:35:51 +00004076 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004077 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00004078 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004079 addPathIfExists(D,
4080 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004081 "/../../" + OSLibDir,
4082 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00004083
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004084 // Add the 'other' biarch variant path
4085 Multilib BiarchSibling;
4086 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004087 addPathIfExists(D, GCCInstallation.getInstallPath() +
4088 BiarchSibling.gccSuffix(),
4089 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004090 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00004091
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004092 // See comments above on the multilib variant for details of why this is
4093 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004094 const std::string &LibPath = GCCInstallation.getParentLibPath();
4095 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
4096 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004097 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
4098 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004099 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004100
4101 // See comments above on the multilib variant for details of why this is
4102 // only included from within the sysroot.
4103 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004104 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004105 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004106
4107 // Similar to the logic for GCC above, if we are currently running Clang
4108 // inside of the requested system root, add its parent library path to those
4109 // searched.
4110 // FIXME: It's not clear whether we should use the driver's installed
4111 // directory ('Dir' below) or the ResourceDir.
4112 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004113 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004114
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004115 addPathIfExists(D, SysRoot + "/lib", Paths);
4116 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004117}
4118
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004119bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00004120
Douglas Katzman95354292015-06-23 20:42:09 +00004121Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00004122
4123Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004124 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00004125}
4126
Simon Atanasyana0d89572013-10-05 14:37:55 +00004127std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004128 if (!getDriver().SysRoot.empty())
4129 return getDriver().SysRoot;
4130
4131 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
4132 return std::string();
4133
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004134 // Standalone MIPS toolchains use different names for sysroot folder
4135 // and put it into different places. Here we try to check some known
4136 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004137
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004138 const StringRef InstallDir = GCCInstallation.getInstallPath();
4139 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004140 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004141
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004142 std::string Path =
4143 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
4144 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004145
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004146 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004147 return Path;
4148
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004149 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004150
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004151 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004152 return Path;
4153
4154 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004155}
4156
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004157std::string Linux::getDynamicLinker(const ArgList &Args) const {
4158 const llvm::Triple::ArchType Arch = getArch();
4159 const llvm::Triple &Triple = getTriple();
4160
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004161 const enum Distro Distro = DetectDistro(getDriver(), Arch);
4162
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004163 if (Triple.isAndroid())
4164 return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker";
Rafael Espindola0fa66802016-06-24 21:35:06 +00004165 else if (Triple.isMusl()) {
4166 std::string ArchName;
4167 switch (Arch) {
4168 case llvm::Triple::thumb:
4169 ArchName = "arm";
4170 break;
4171 case llvm::Triple::thumbeb:
4172 ArchName = "armeb";
4173 break;
4174 default:
4175 ArchName = Triple.getArchName().str();
4176 }
4177 if (Triple.getEnvironment() == llvm::Triple::MuslEABIHF)
4178 ArchName += "hf";
4179
4180 return "/lib/ld-musl-" + ArchName + ".so.1";
4181 }
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004182
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004183 std::string LibDir;
4184 std::string Loader;
4185
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004186 switch (Arch) {
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004187 default:
4188 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004189
4190 case llvm::Triple::aarch64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004191 LibDir = "lib";
4192 Loader = "ld-linux-aarch64.so.1";
4193 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004194 case llvm::Triple::aarch64_be:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004195 LibDir = "lib";
4196 Loader = "ld-linux-aarch64_be.so.1";
4197 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004198 case llvm::Triple::arm:
4199 case llvm::Triple::thumb:
4200 case llvm::Triple::armeb:
4201 case llvm::Triple::thumbeb: {
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004202 const bool HF =
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004203 Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
4204 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
4205
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004206 LibDir = "lib";
4207 Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";
4208 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004209 }
4210 case llvm::Triple::mips:
4211 case llvm::Triple::mipsel:
4212 case llvm::Triple::mips64:
4213 case llvm::Triple::mips64el: {
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004214 bool LE = (Triple.getArch() == llvm::Triple::mipsel) ||
4215 (Triple.getArch() == llvm::Triple::mips64el);
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004216 bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple);
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004217
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004218 LibDir = "lib" + tools::mips::getMipsABILibSuffix(Args, Triple);
4219
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004220 if (tools::mips::isUCLibc(Args))
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004221 Loader = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004222 else if (!Triple.hasEnvironment() &&
4223 Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies)
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004224 Loader = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004225 else
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004226 Loader = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004227
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004228 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004229 }
4230 case llvm::Triple::ppc:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004231 LibDir = "lib";
4232 Loader = "ld.so.1";
4233 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004234 case llvm::Triple::ppc64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004235 LibDir = "lib64";
4236 Loader =
4237 (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "ld64.so.2" : "ld64.so.1";
4238 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004239 case llvm::Triple::ppc64le:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004240 LibDir = "lib64";
4241 Loader =
4242 (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2";
4243 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004244 case llvm::Triple::sparc:
4245 case llvm::Triple::sparcel:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004246 LibDir = "lib";
4247 Loader = "ld-linux.so.2";
4248 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004249 case llvm::Triple::sparcv9:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004250 LibDir = "lib64";
4251 Loader = "ld-linux.so.2";
4252 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004253 case llvm::Triple::systemz:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004254 LibDir = "lib";
4255 Loader = "ld64.so.1";
4256 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004257 case llvm::Triple::x86:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004258 LibDir = "lib";
4259 Loader = "ld-linux.so.2";
4260 break;
4261 case llvm::Triple::x86_64: {
4262 bool X32 = Triple.getEnvironment() == llvm::Triple::GNUX32;
4263
4264 LibDir = X32 ? "libx32" : "lib64";
4265 Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2";
4266 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004267 }
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004268 }
4269
4270 if (Distro == Exherbo && (Triple.getVendor() == llvm::Triple::UnknownVendor ||
4271 Triple.getVendor() == llvm::Triple::PC))
4272 return "/usr/" + Triple.str() + "/lib/" + Loader;
4273 return "/" + LibDir + "/" + Loader;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004274}
4275
Chandler Carrutha796f532011-11-05 20:17:13 +00004276void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4277 ArgStringList &CC1Args) const {
4278 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00004279 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00004280
4281 if (DriverArgs.hasArg(options::OPT_nostdinc))
4282 return;
4283
4284 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004285 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004286
4287 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00004288 SmallString<128> P(D.ResourceDir);
4289 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00004290 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00004291 }
4292
4293 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
4294 return;
4295
4296 // Check for configure-time C include directories.
4297 StringRef CIncludeDirs(C_INCLUDE_DIRS);
4298 if (CIncludeDirs != "") {
4299 SmallVector<StringRef, 5> dirs;
4300 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004301 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00004302 StringRef Prefix =
4303 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004304 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00004305 }
4306 return;
4307 }
4308
4309 // Lacking those, try to detect the correct set of system includes for the
4310 // target triple.
4311
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004312 // Add include directories specific to the selected multilib set and multilib.
4313 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00004314 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004315 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00004316 for (const auto &Path : Callback(GCCInstallation.getMultilib()))
4317 addExternCSystemIncludeIfExists(
4318 DriverArgs, CC1Args, GCCInstallation.getInstallPath() + Path);
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004319 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004320 }
4321
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004322 // Implement generic Debian multiarch support.
4323 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004324 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004325
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004326 // FIXME: These are older forms of multiarch. It's not clear that they're
4327 // in use in any released version of Debian, so we should consider
4328 // removing them.
4329 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004330 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004331 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004332
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004333 // FIXME: These are older forms of multiarch. It's not clear that they're
4334 // in use in any released version of Debian, so we should consider
4335 // removing them.
4336 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
4337 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00004338 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004339 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004340 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004341 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004342 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004343 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004344 const StringRef ARMEBMultiarchIncludeDirs[] = {
4345 "/usr/include/armeb-linux-gnueabi"};
4346 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
4347 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004348 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00004349 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004350 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004351 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004352 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004353 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004354 "/usr/include/mips64el-linux-gnu",
4355 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004356 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004357 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004358 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004359 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004360 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004361 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004362 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004363 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004364 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004365 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004366 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
4367 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004368 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004369 switch (getTriple().getArch()) {
4370 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004371 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004372 break;
4373 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004374 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004375 break;
4376 case llvm::Triple::aarch64:
4377 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00004378 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004379 break;
4380 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004381 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004382 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4383 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
4384 else
4385 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004386 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004387 case llvm::Triple::armeb:
4388 case llvm::Triple::thumbeb:
4389 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4390 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
4391 else
4392 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
4393 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004394 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00004395 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004396 break;
4397 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00004398 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004399 break;
4400 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004401 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004402 break;
4403 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004404 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004405 break;
4406 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004407 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004408 break;
4409 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004410 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004411 break;
4412 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004413 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004414 break;
4415 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004416 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004417 break;
4418 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004419 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004420 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004421 case llvm::Triple::systemz:
4422 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4423 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004424 default:
4425 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004426 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004427 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004428 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004429 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004430 break;
4431 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004432 }
4433
4434 if (getTriple().getOS() == llvm::Triple::RTEMS)
4435 return;
4436
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004437 // Add an include of '/include' directly. This isn't provided by default by
4438 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4439 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004440 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004441
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004442 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004443}
4444
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004445static std::string DetectLibcxxIncludePath(StringRef base) {
4446 std::error_code EC;
4447 int MaxVersion = 0;
4448 std::string MaxVersionString = "";
4449 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4450 LI = LI.increment(EC)) {
4451 StringRef VersionText = llvm::sys::path::filename(LI->path());
4452 int Version;
4453 if (VersionText[0] == 'v' &&
4454 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4455 if (Version > MaxVersion) {
4456 MaxVersion = Version;
4457 MaxVersionString = VersionText;
4458 }
4459 }
4460 }
4461 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4462}
4463
Chandler Carrutha796f532011-11-05 20:17:13 +00004464void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4465 ArgStringList &CC1Args) const {
4466 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4467 DriverArgs.hasArg(options::OPT_nostdincxx))
4468 return;
4469
Chandler Carruthf4701732011-11-07 09:01:17 +00004470 // Check if libc++ has been enabled and provide its include paths if so.
4471 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004472 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004473 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Yaron Keren5439b642016-05-17 19:01:16 +00004474 // If this is a development, non-installed, clang, libcxx will
4475 // not be found at ../include/c++ but it likely to be found at
4476 // one of the following two locations:
4477 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/local/include/c++"),
4478 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++") };
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004479 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004480 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004481 continue;
4482 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004483 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004484 break;
4485 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004486 return;
4487 }
4488
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004489 // We need a detected GCC installation on Linux to provide libstdc++'s
4490 // headers. We handled the libc++ case above.
4491 if (!GCCInstallation.isValid())
4492 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004493
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004494 // By default, look for the C++ headers in an include directory adjacent to
4495 // the lib directory of the GCC installation. Note that this is expect to be
4496 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4497 StringRef LibDir = GCCInstallation.getParentLibPath();
4498 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004499 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004500 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004501 const std::string GCCMultiarchTriple = getMultiarchTriple(
4502 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004503 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004504 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004505 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004506
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004507 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004508 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004509 "/c++/" + Version.Text, TripleStr,
4510 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004511 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004512 return;
4513
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004514 // Otherwise, fall back on a bunch of options which don't use multiarch
4515 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004516 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004517 // Gentoo is weird and places its headers inside the GCC install,
4518 // so if the first attempt to find the headers fails, try these patterns.
Chandler Carruth81296fb2016-05-08 07:59:56 +00004519 InstallDir.str() + "/include/g++-v" + Version.Text,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004520 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4521 Version.MinorStr,
4522 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4523 // Android standalone toolchain has C++ headers in yet another place.
4524 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4525 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4526 // without a subdirectory corresponding to the gcc version.
4527 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004528 };
4529
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004530 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004531 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4532 /*GCCMultiarchTriple*/ "",
4533 /*TargetMultiarchTriple*/ "",
4534 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004535 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004536 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004537}
4538
Artem Belevichfa11ab52015-11-17 22:28:46 +00004539void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4540 ArgStringList &CC1Args) const {
4541 if (DriverArgs.hasArg(options::OPT_nocudainc))
4542 return;
4543
Justin Lebar423019d2016-04-16 00:11:11 +00004544 if (!CudaInstallation.isValid()) {
4545 getDriver().Diag(diag::err_drv_no_cuda_installation);
4546 return;
Artem Belevich86017332015-11-17 22:28:55 +00004547 }
Justin Lebar423019d2016-04-16 00:11:11 +00004548
4549 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
4550 CC1Args.push_back("-include");
4551 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevichfa11ab52015-11-17 22:28:46 +00004552}
4553
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00004554void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs,
4555 ArgStringList &CC1Args) const {
4556 if (GCCInstallation.isValid()) {
4557 CC1Args.push_back("-isystem");
4558 CC1Args.push_back(DriverArgs.MakeArgString(
4559 GCCInstallation.getParentLibPath() + "/../" +
4560 GCCInstallation.getTriple().str() + "/include"));
4561 }
4562}
4563
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004564bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004565
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004566SanitizerMask Linux::getSupportedSanitizers() const {
4567 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4568 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4569 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4570 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004571 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4572 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004573 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4574 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004575 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4576 Res |= SanitizerKind::Address;
4577 Res |= SanitizerKind::KernelAddress;
4578 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004579 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004580 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004581 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004582 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004583 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004584 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004585 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004586 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004587 Res |= SanitizerKind::Memory;
Derek Bruening256c2e12016-04-21 21:32:04 +00004588 if (IsX86_64)
4589 Res |= SanitizerKind::Efficiency;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004590 if (IsX86 || IsX86_64) {
4591 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004592 }
4593 return Res;
4594}
4595
Xinliang David Li170cd102015-10-27 05:15:35 +00004596void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4597 llvm::opt::ArgStringList &CmdArgs) const {
4598 if (!needsProfileRT(Args)) return;
4599
4600 // Add linker option -u__llvm_runtime_variable to cause runtime
4601 // initialization module to be linked in.
4602 if (!Args.hasArg(options::OPT_coverage))
4603 CmdArgs.push_back(Args.MakeArgString(
4604 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4605 ToolChain::addProfileRTLibs(Args, CmdArgs);
4606}
4607
Daniel Dunbarcc912342009-05-02 18:28:39 +00004608/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4609
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004610DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4611 const ArgList &Args)
4612 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004613
4614 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004615 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004616 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004617 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004618
Daniel Dunbar083edf72009-12-21 18:54:17 +00004619 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004620 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004621 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004622}
4623
Rafael Espindola7cf32212013-03-20 03:05:54 +00004624Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004625 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004626}
4627
4628Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004629 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004630}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004631
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004632/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4633/// which isn't properly a linker but nonetheless performs the step of stitching
4634/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004635
4636CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4637 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004638 : Linux(D, Triple, Args) {
4639 if (CudaInstallation.isValid())
4640 getProgramPaths().push_back(CudaInstallation.getBinPath());
4641}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004642
4643void
4644CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4645 llvm::opt::ArgStringList &CC1Args) const {
4646 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4647 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004648
Justin Lebard3a44f62016-04-05 18:26:20 +00004649 if (DriverArgs.hasFlag(options::OPT_fcuda_flush_denormals_to_zero,
4650 options::OPT_fno_cuda_flush_denormals_to_zero, false))
4651 CC1Args.push_back("-fcuda-flush-denormals-to-zero");
4652
Justin Lebar91f6f072016-05-23 20:19:56 +00004653 if (DriverArgs.hasFlag(options::OPT_fcuda_approx_transcendentals,
4654 options::OPT_fno_cuda_approx_transcendentals, false))
4655 CC1Args.push_back("-fcuda-approx-transcendentals");
4656
Artem Belevich34f481a2015-11-17 22:28:50 +00004657 if (DriverArgs.hasArg(options::OPT_nocudalib))
4658 return;
4659
4660 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4661 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4662 if (!LibDeviceFile.empty()) {
4663 CC1Args.push_back("-mlink-cuda-bitcode");
4664 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4665
4666 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4667 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4668 // came with CUDA-7.0.
4669 CC1Args.push_back("-target-feature");
4670 CC1Args.push_back("+ptx42");
4671 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004672}
4673
4674llvm::opt::DerivedArgList *
4675CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4676 const char *BoundArch) const {
4677 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4678 const OptTable &Opts = getDriver().getOpts();
4679
4680 for (Arg *A : Args) {
4681 if (A->getOption().matches(options::OPT_Xarch__)) {
4682 // Skip this argument unless the architecture matches BoundArch
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004683 if (!BoundArch || A->getValue(0) != StringRef(BoundArch))
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004684 continue;
4685
4686 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4687 unsigned Prev = Index;
4688 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4689
4690 // If the argument parsing failed or more than one argument was
4691 // consumed, the -Xarch_ argument's parameter tried to consume
4692 // extra arguments. Emit an error and ignore.
4693 //
4694 // We also want to disallow any options which would alter the
4695 // driver behavior; that isn't going to work in our model. We
4696 // use isDriverOption() as an approximation, although things
4697 // like -O4 are going to slip through.
4698 if (!XarchArg || Index > Prev + 1) {
4699 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4700 << A->getAsString(Args);
4701 continue;
4702 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4703 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4704 << A->getAsString(Args);
4705 continue;
4706 }
4707 XarchArg->setBaseArg(A);
4708 A = XarchArg.release();
4709 DAL->AddSynthesizedArg(A);
4710 }
4711 DAL->append(A);
4712 }
4713
Justin Lebar4db224e2016-06-15 23:46:11 +00004714 if (BoundArch) {
4715 DAL->eraseArg(options::OPT_march_EQ);
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004716 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Justin Lebar4db224e2016-06-15 23:46:11 +00004717 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004718 return DAL;
4719}
4720
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004721Tool *CudaToolChain::buildAssembler() const {
4722 return new tools::NVPTX::Assembler(*this);
4723}
4724
4725Tool *CudaToolChain::buildLinker() const {
4726 return new tools::NVPTX::Linker(*this);
4727}
4728
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004729/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004730XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4731 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004732 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004733 // ProgramPaths are found via 'PATH' environment variable.
4734}
4735
Douglas Katzman54366072015-07-27 16:53:08 +00004736Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004737 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004738}
4739
Douglas Katzman54366072015-07-27 16:53:08 +00004740Tool *XCoreToolChain::buildLinker() const {
4741 return new tools::XCore::Linker(*this);
4742}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004743
Douglas Katzman54366072015-07-27 16:53:08 +00004744bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004745
Douglas Katzman54366072015-07-27 16:53:08 +00004746bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004747
Douglas Katzman54366072015-07-27 16:53:08 +00004748bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004749
Douglas Katzman54366072015-07-27 16:53:08 +00004750bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004751
Douglas Katzman54366072015-07-27 16:53:08 +00004752bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004753
Douglas Katzman54366072015-07-27 16:53:08 +00004754void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4755 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004756 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4757 DriverArgs.hasArg(options::OPT_nostdlibinc))
4758 return;
4759 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4760 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004761 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004762 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4763 ArrayRef<StringRef> DirVec(Dirs);
4764 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4765 }
4766}
4767
Douglas Katzman54366072015-07-27 16:53:08 +00004768void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4769 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004770 CC1Args.push_back("-nostdsysteminc");
4771}
4772
Douglas Katzman54366072015-07-27 16:53:08 +00004773void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4774 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004775 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004776 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4777 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004778 return;
4779 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4780 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004781 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004782 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4783 ArrayRef<StringRef> DirVec(Dirs);
4784 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4785 }
4786}
4787
Douglas Katzman54366072015-07-27 16:53:08 +00004788void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4789 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004790 // We don't output any lib args. This is handled by xcc.
4791}
Douglas Katzman84a75642015-06-19 14:55:19 +00004792
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004793MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4794 const ArgList &Args)
Douglas Katzman5eddc232016-05-09 19:09:59 +00004795 : Generic_ELF(D, Triple, Args) {
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004796 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4797 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4798 // This won't work to find gcc. Instead we give the installation detector an
4799 // extra triple, which is preferable to further hacks of the logic that at
4800 // present is based solely on getArch(). In particular, it would be wrong to
4801 // choose the myriad installation when targeting a non-myriad sparc install.
4802 switch (Triple.getArch()) {
4803 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00004804 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4805 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004806 case llvm::Triple::sparc:
4807 case llvm::Triple::sparcel:
4808 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004809 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004810 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004811
4812 if (GCCInstallation.isValid()) {
4813 // The contents of LibDir are independent of the version of gcc.
4814 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4815 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4816 if (Triple.getArch() == llvm::Triple::sparcel)
4817 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4818 else
4819 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4820 addPathIfExists(D, LibDir, getFilePaths());
4821
4822 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4823 // These files are tied to a particular version of gcc.
4824 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4825 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4826 // but as this toolchain is for LEON sparc, it can assume FPU.
4827 if (Triple.getArch() == llvm::Triple::sparcel)
4828 llvm::sys::path::append(CompilerSupportDir, "le");
4829 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4830 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004831}
4832
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004833MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004834
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004835void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4836 ArgStringList &CC1Args) const {
4837 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4838 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4839}
4840
Eric Christopherefef8ef2015-12-07 22:43:05 +00004841void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4842 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00004843 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4844 DriverArgs.hasArg(options::OPT_nostdincxx))
4845 return;
4846
4847 // Only libstdc++, for now.
4848 StringRef LibDir = GCCInstallation.getParentLibPath();
4849 const GCCVersion &Version = GCCInstallation.getVersion();
4850 StringRef TripleStr = GCCInstallation.getTriple().str();
4851 const Multilib &Multilib = GCCInstallation.getMultilib();
4852
Eric Christopherefef8ef2015-12-07 22:43:05 +00004853 addLibStdCXXIncludePaths(
4854 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4855 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00004856}
4857
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004858// MyriadToolChain handles several triples:
4859// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4860Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4861 // The inherited method works fine if not targeting the SHAVE.
4862 if (!isShaveCompilation(getTriple()))
4863 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004864 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00004865 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00004866 case Action::CompileJobClass:
4867 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004868 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004869 return Compiler.get();
4870 case Action::AssembleJobClass:
4871 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004872 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004873 return Assembler.get();
4874 default:
4875 return ToolChain::getTool(JA.getKind());
4876 }
4877}
4878
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004879Tool *MyriadToolChain::buildLinker() const {
4880 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004881}
Dan Gohmanc2853072015-09-03 22:51:53 +00004882
Dan Gohman52816862015-12-16 23:30:41 +00004883WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
4884 const llvm::opt::ArgList &Args)
4885 : ToolChain(D, Triple, Args) {
Dan Gohman57b62c52016-02-22 19:26:15 +00004886
4887 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
4888 getFilePaths().push_back(
4889 getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64"));
4890
Dan Gohman52816862015-12-16 23:30:41 +00004891 // Use LLD by default.
4892 DefaultLinker = "lld";
4893}
4894
Dan Gohmanc2853072015-09-03 22:51:53 +00004895bool WebAssembly::IsMathErrnoDefault() const { return false; }
4896
4897bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4898
4899bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4900
4901bool WebAssembly::isPICDefault() const { return false; }
4902
4903bool WebAssembly::isPIEDefault() const { return false; }
4904
4905bool WebAssembly::isPICDefaultForced() const { return false; }
4906
4907bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4908
4909// TODO: Support Objective C stuff.
4910bool WebAssembly::SupportsObjCGC() const { return false; }
4911
4912bool WebAssembly::hasBlocksRuntime() const { return false; }
4913
4914// TODO: Support profiling.
4915bool WebAssembly::SupportsProfiling() const { return false; }
4916
Dan Gohman52816862015-12-16 23:30:41 +00004917bool WebAssembly::HasNativeLLVMSupport() const { return true; }
4918
Dan Gohmanc2853072015-09-03 22:51:53 +00004919void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4920 ArgStringList &CC1Args) const {
4921 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4922 options::OPT_fno_use_init_array, true))
4923 CC1Args.push_back("-fuse-init-array");
4924}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004925
Dan Gohman6ad8f612016-01-14 16:00:13 +00004926ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
4927 return ToolChain::RLT_CompilerRT;
4928}
4929
4930ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
4931 return ToolChain::CST_Libcxx;
4932}
4933
4934void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4935 ArgStringList &CC1Args) const {
4936 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4937 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4938}
4939
4940void WebAssembly::AddClangCXXStdlibIncludeArgs(
4941 const llvm::opt::ArgList &DriverArgs,
4942 llvm::opt::ArgStringList &CC1Args) const {
4943 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
4944 !DriverArgs.hasArg(options::OPT_nostdincxx))
4945 addSystemInclude(DriverArgs, CC1Args,
4946 getDriver().SysRoot + "/include/c++/v1");
4947}
4948
Dan Gohman52816862015-12-16 23:30:41 +00004949Tool *WebAssembly::buildLinker() const {
4950 return new tools::wasm::Linker(*this);
4951}
4952
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004953PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4954 : Generic_ELF(D, Triple, Args) {
4955 if (Args.hasArg(options::OPT_static))
4956 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4957
Paul Robinson9d613612016-05-16 17:22:25 +00004958 // Determine where to find the PS4 libraries. We use SCE_ORBIS_SDK_DIR
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004959 // if it exists; otherwise use the driver's installation path, which
4960 // should be <SDK_DIR>/host_tools/bin.
4961
4962 SmallString<512> PS4SDKDir;
Paul Robinson9d613612016-05-16 17:22:25 +00004963 if (const char *EnvValue = getenv("SCE_ORBIS_SDK_DIR")) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004964 if (!llvm::sys::fs::exists(EnvValue))
4965 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4966 PS4SDKDir = EnvValue;
4967 } else {
4968 PS4SDKDir = getDriver().Dir;
4969 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00004970 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004971
Eric Christopherefef8ef2015-12-07 22:43:05 +00004972 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004973 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00004974 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004975 // If -isysroot was passed, use that as the SDK base path.
4976 std::string PrefixDir;
4977 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4978 PrefixDir = A->getValue();
4979 if (!llvm::sys::fs::exists(PrefixDir))
4980 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4981 } else
4982 PrefixDir = PS4SDKDir.str();
4983
4984 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4985 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4986 if (!Args.hasArg(options::OPT_nostdinc) &&
4987 !Args.hasArg(options::OPT_nostdlibinc) &&
4988 !Args.hasArg(options::OPT_isysroot) &&
4989 !Args.hasArg(options::OPT__sysroot_EQ) &&
4990 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4991 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4992 << "PS4 system headers" << PS4SDKIncludeDir;
4993 }
4994
4995 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4996 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4997 if (!Args.hasArg(options::OPT_nostdlib) &&
4998 !Args.hasArg(options::OPT_nodefaultlibs) &&
4999 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
5000 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
5001 !Args.hasArg(options::OPT_emit_ast) &&
5002 !llvm::sys::fs::exists(PS4SDKLibDir)) {
5003 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
5004 << "PS4 system libraries" << PS4SDKLibDir;
5005 return;
5006 }
5007 getFilePaths().push_back(PS4SDKLibDir.str());
5008}
5009
5010Tool *PS4CPU::buildAssembler() const {
5011 return new tools::PS4cpu::Assemble(*this);
5012}
5013
5014Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
5015
5016bool PS4CPU::isPICDefault() const { return true; }
5017
5018bool PS4CPU::HasNativeLLVMSupport() const { return true; }
5019
5020SanitizerMask PS4CPU::getSupportedSanitizers() const {
5021 SanitizerMask Res = ToolChain::getSupportedSanitizers();
5022 Res |= SanitizerKind::Address;
5023 Res |= SanitizerKind::Vptr;
5024 return Res;
5025}