blob: f04c443a886053e81111e43ec3419614d23d6b14 [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"
Justin Lebarc43ad9e2016-07-07 18:17:52 +000011#include "clang/Basic/Cuda.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "clang/Basic/ObjCRuntime.h"
13#include "clang/Basic/Version.h"
Benjamin Kramerd45b2052015-10-07 15:48:01 +000014#include "clang/Basic/VirtualFileSystem.h"
Alp Toker1d257e12014-06-04 03:28:55 +000015#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
Daniel Dunbar6232d342010-05-20 21:48:38 +000016#include "clang/Driver/Compilation.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000017#include "clang/Driver/Driver.h"
Daniel Dunbaraabb0b12009-03-25 06:12:34 +000018#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000019#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000020#include "clang/Driver/SanitizerArgs.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000021#include "llvm/ADT/STLExtras.h"
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +000022#include "llvm/ADT/SmallString.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000023#include "llvm/ADT/StringExtras.h"
Bob Wilson997a97f2011-10-07 00:37:57 +000024#include "llvm/ADT/StringSwitch.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000025#include "llvm/Option/Arg.h"
26#include "llvm/Option/ArgList.h"
27#include "llvm/Option/OptTable.h"
28#include "llvm/Option/Option.h"
Xinliang David Li170cd102015-10-27 05:15:35 +000029#include "llvm/ProfileData/InstrProf.h"
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +000030#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000031#include "llvm/Support/FileSystem.h"
Rafael Espindolac8f008f2010-11-07 20:14:31 +000032#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000033#include "llvm/Support/Path.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000034#include "llvm/Support/Program.h"
Renato Golin33e1f822015-05-28 15:49:28 +000035#include "llvm/Support/TargetParser.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000036#include "llvm/Support/raw_ostream.h"
Daniel Dunbarb5023e92009-04-10 21:00:07 +000037#include <cstdlib> // ::getenv
Rafael Espindola8a8e5542014-06-12 17:19:42 +000038#include <system_error>
Daniel Dunbarb5023e92009-04-10 21:00:07 +000039
Daniel Dunbar59e5e882009-03-20 00:20:03 +000040using namespace clang::driver;
41using namespace clang::driver::toolchains;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000043using namespace llvm::opt;
Daniel Dunbar59e5e882009-03-20 00:20:03 +000044
Douglas Katzmana67e50c2015-06-26 15:47:46 +000045MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
46 : ToolChain(D, Triple, Args) {
Tim Northover15ff71d2014-05-22 13:12:14 +000047 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
48 getProgramPaths().push_back(getDriver().getInstalledDir());
49 if (getDriver().getInstalledDir() != getDriver().Dir)
50 getProgramPaths().push_back(getDriver().Dir);
Tim Northover157d9112014-01-16 08:48:16 +000051}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +000052
Tim Northover157d9112014-01-16 08:48:16 +000053/// Darwin - Darwin tool chain for i386 and x86_64.
Alexey Samsonov905c8022015-06-18 21:46:05 +000054Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
55 : MachO(D, Triple, Args), TargetInitialized(false) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +000056
Mehdi Amini6fcd4eb2016-10-07 21:41:00 +000057types::ID MachO::LookupTypeForExtension(StringRef Ext) const {
Daniel Dunbarcc7df6c2010-08-02 05:43:56 +000058 types::ID Ty = types::lookupTypeForExtension(Ext);
59
60 // Darwin always preprocesses assembly files (unless -x is used explicitly).
61 if (Ty == types::TY_PP_Asm)
62 return types::TY_Asm;
63
64 return Ty;
65}
66
Douglas Katzmana67e50c2015-06-26 15:47:46 +000067bool MachO::HasNativeLLVMSupport() const { return true; }
Daniel Dunbar62123a12010-09-17 00:24:52 +000068
Jonas Hahnfeldaae83742016-02-12 07:48:37 +000069ToolChain::CXXStdlibType Darwin::GetDefaultCXXStdlibType() const {
70 // Default to use libc++ on OS X 10.9+ and iOS 7+.
71 if ((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
72 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) ||
73 isTargetWatchOSBased())
74 return ToolChain::CST_Libcxx;
75
76 return ToolChain::CST_Libstdcxx;
77}
78
John McCall24fc0de2011-07-06 00:26:06 +000079/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000080ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover6f3ff222015-10-30 16:30:27 +000081 if (isTargetWatchOSBased())
Tim Northover756447a2015-10-30 16:30:36 +000082 return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion);
Tim Northover9c7e0352013-12-12 11:55:52 +000083 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000084 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000085 if (isNonFragile)
86 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
87 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000088}
89
John McCall7959fee2011-09-09 20:41:01 +000090/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
91bool Darwin::hasBlocksRuntime() const {
Tim Northover6f3ff222015-10-30 16:30:27 +000092 if (isTargetWatchOSBased())
93 return true;
94 else if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000095 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000096 else {
Tim Northover157d9112014-01-16 08:48:16 +000097 assert(isTargetMacOS() && "unexpected darwin target");
98 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000099 }
John McCall7959fee2011-09-09 20:41:01 +0000100}
101
Renato Golin33e1f822015-05-28 15:49:28 +0000102// This is just a MachO name translation routine and there's no
103// way to join this into ARMTargetParser without breaking all
104// other assumptions. Maybe MachO should consider standardising
105// their nomenclature.
106static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000107 return llvm::StringSwitch<const char *>(Arch)
108 .Case("armv6k", "armv6")
109 .Case("armv6m", "armv6m")
110 .Case("armv5tej", "armv5")
111 .Case("xscale", "xscale")
112 .Case("armv4t", "armv4t")
113 .Case("armv7", "armv7")
114 .Cases("armv7a", "armv7-a", "armv7")
115 .Cases("armv7r", "armv7-r", "armv7")
116 .Cases("armv7em", "armv7e-m", "armv7em")
117 .Cases("armv7k", "armv7-k", "armv7k")
118 .Cases("armv7m", "armv7-m", "armv7m")
119 .Cases("armv7s", "armv7-s", "armv7s")
120 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000121}
122
Renato Golin33e1f822015-05-28 15:49:28 +0000123static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000124 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000125 if (ArchKind == llvm::ARM::AK_INVALID)
126 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000127 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000128
129 // FIXME: Make sure this MachO triple mangling is really necessary.
130 // ARMv5* normalises to ARMv5.
131 if (Arch.startswith("armv5"))
132 Arch = Arch.substr(0, 5);
133 // ARMv6*, except ARMv6M, normalises to ARMv6.
134 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
135 Arch = Arch.substr(0, 5);
136 // ARMv7A normalises to ARMv7.
137 else if (Arch.endswith("v7a"))
138 Arch = Arch.substr(0, 5);
139 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000140}
141
Tim Northover9c7e0352013-12-12 11:55:52 +0000142static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000143 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000144 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000145 if (!A)
146 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000147
Tim Northover9c7e0352013-12-12 11:55:52 +0000148 return A->getOption().matches(options::OPT_msoft_float) ||
149 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
150 A->getValue() == StringRef("soft"));
151}
152
Tim Northover157d9112014-01-16 08:48:16 +0000153StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000154 switch (getTriple().getArch()) {
155 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000156 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000157
Tim Northover40956e62014-07-23 12:32:58 +0000158 case llvm::Triple::aarch64:
159 return "arm64";
160
Douglas Gregord9bb1522011-03-06 19:11:49 +0000161 case llvm::Triple::thumb:
Hans Wennborgdcfba332015-10-06 23:40:43 +0000162 case llvm::Triple::arm:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000163 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000164 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000165 return Arch;
166
167 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000168 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000169 return Arch;
170
171 return "arm";
172 }
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000173}
174
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000175Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000176
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000177MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000178
Chad Rosierd3a0f952011-09-20 20:44:06 +0000179std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
180 types::ID InputType) const {
181 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000182
183 // If the target isn't initialized (e.g., an unknown Darwin platform, return
184 // the default triple).
185 if (!isTargetInitialized())
186 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000187
Tim Northover157d9112014-01-16 08:48:16 +0000188 SmallString<16> Str;
Tim Northover6f3ff222015-10-30 16:30:27 +0000189 if (isTargetWatchOSBased())
190 Str += "watchos";
191 else if (isTargetTvOSBased())
192 Str += "tvos";
193 else if (isTargetIOSBased())
194 Str += "ios";
195 else
196 Str += "macosx";
Tim Northover157d9112014-01-16 08:48:16 +0000197 Str += getTargetVersion().getAsString();
198 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000199
200 return Triple.getTriple();
201}
202
David Blaikie68e081d2011-12-20 02:48:34 +0000203void Generic_ELF::anchor() {}
204
Tim Northover157d9112014-01-16 08:48:16 +0000205Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000206 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000207 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000208 if (!Lipo)
209 Lipo.reset(new tools::darwin::Lipo(*this));
210 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000211 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000212 if (!Dsymutil)
213 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
214 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000215 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000216 if (!VerifyDebug)
217 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
218 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000219 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000220 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000221 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000222}
223
Douglas Katzman95354292015-06-23 20:42:09 +0000224Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000225
Tim Northover157d9112014-01-16 08:48:16 +0000226Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000227 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000228}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000229
Douglas Katzman95354292015-06-23 20:42:09 +0000230DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000231 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000232 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000233
Tim Northover336f1892014-03-29 13:16:12 +0000234void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
Tim Northover6f3ff222015-10-30 16:30:27 +0000235 // For modern targets, promote certain warnings to errors.
236 if (isTargetWatchOSBased() || getTriple().isArch64Bit()) {
Tim Northover336f1892014-03-29 13:16:12 +0000237 // Always enable -Wdeprecated-objc-isa-usage and promote it
238 // to an error.
239 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
240 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
241
Tim Northover6f3ff222015-10-30 16:30:27 +0000242 // For iOS and watchOS, also error about implicit function declarations,
243 // as that can impact calling conventions.
244 if (!isTargetMacOS())
245 CC1Args.push_back("-Werror=implicit-function-declaration");
Tim Northover336f1892014-03-29 13:16:12 +0000246 }
247}
248
Tim Northover157d9112014-01-16 08:48:16 +0000249/// \brief Determine whether Objective-C automated reference counting is
250/// enabled.
251static bool isObjCAutoRefCount(const ArgList &Args) {
252 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
253}
254
John McCall31168b02011-06-15 23:02:42 +0000255void DarwinClang::AddLinkARCArgs(const ArgList &Args,
256 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000257 // Avoid linking compatibility stubs on i386 mac.
258 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
259 return;
260
261 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
262
263 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
264 runtime.hasSubscripting())
265 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000266
267 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000268 SmallString<128> P(getDriver().ClangExecutable);
269 llvm::sys::path::remove_filename(P); // 'clang'
270 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000271 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000272 // Mash in the platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000273 if (isTargetWatchOSSimulator())
274 P += "watchsimulator";
275 else if (isTargetWatchOS())
276 P += "watchos";
277 else if (isTargetTvOSSimulator())
278 P += "appletvsimulator";
279 else if (isTargetTvOS())
280 P += "appletvos";
281 else if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000282 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000283 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000284 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000285 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000286 P += "macosx";
287 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000288
Rafael Espindola358256c2013-06-26 02:13:00 +0000289 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000290}
291
Adrian Prantld50d56c2016-10-17 19:36:18 +0000292unsigned DarwinClang::GetDefaultDwarfVersion() const {
293 // Default to use DWARF 2 on OS X 10.10 / iOS 8 and lower.
294 if ((isTargetMacOS() && isMacosxVersionLT(10, 11)) ||
295 (isTargetIOSBased() && isIPhoneOSVersionLT(9)))
296 return 2;
297 return 4;
298}
299
Tim Northover157d9112014-01-16 08:48:16 +0000300void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000301 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000302 bool IsEmbedded, bool AddRPath) const {
303 SmallString<128> Dir(getDriver().ResourceDir);
304 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
305
306 SmallString<128> P(Dir);
307 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000308
Eric Christopherc235d0c62011-06-22 17:41:40 +0000309 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000310 // not have compiler-rt checked out or integrated into their build (unless
311 // we explicitly force linking with this library).
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000312 if (AlwaysLink || getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000313 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000314
315 // Adding the rpaths might negatively interact when other rpaths are involved,
316 // so we should make sure we add the rpaths last, after all user-specified
317 // rpaths. This is currently true from this place, but we need to be
318 // careful if this function is ever called before user's rpaths are emitted.
319 if (AddRPath) {
320 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
321
322 // Add @executable_path to rpath to support having the dylib copied with
323 // the executable.
324 CmdArgs.push_back("-rpath");
325 CmdArgs.push_back("@executable_path");
326
327 // Add the path to the resource dir to rpath to support using the dylib
328 // from the default location without copying.
329 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000330 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000331 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000332}
333
Chris Bienemane60e7c22016-04-29 22:28:34 +0000334StringRef Darwin::getPlatformFamily() const {
335 switch (TargetPlatform) {
336 case DarwinPlatformKind::MacOS:
337 return "MacOSX";
338 case DarwinPlatformKind::IPhoneOS:
339 case DarwinPlatformKind::IPhoneOSSimulator:
340 return "iPhone";
341 case DarwinPlatformKind::TvOS:
342 case DarwinPlatformKind::TvOSSimulator:
343 return "AppleTV";
344 case DarwinPlatformKind::WatchOS:
345 case DarwinPlatformKind::WatchOSSimulator:
346 return "Watch";
347 }
348 llvm_unreachable("Unsupported platform");
349}
350
351StringRef Darwin::getSDKName(StringRef isysroot) {
352 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
353 llvm::sys::path::const_iterator SDKDir;
354 auto BeginSDK = llvm::sys::path::begin(isysroot);
355 auto EndSDK = llvm::sys::path::end(isysroot);
356 for (auto IT = BeginSDK; IT != EndSDK; ++IT) {
357 StringRef SDK = *IT;
358 if (SDK.endswith(".sdk"))
359 return SDK.slice(0, SDK.size() - 4);
360 }
361 return "";
362}
363
Anna Zakse67b4022016-02-02 02:04:48 +0000364StringRef Darwin::getOSLibraryNameSuffix() const {
365 switch(TargetPlatform) {
366 case DarwinPlatformKind::MacOS:
367 return "osx";
368 case DarwinPlatformKind::IPhoneOS:
369 return "ios";
370 case DarwinPlatformKind::IPhoneOSSimulator:
371 return "iossim";
372 case DarwinPlatformKind::TvOS:
373 return "tvos";
374 case DarwinPlatformKind::TvOSSimulator:
375 return "tvossim";
376 case DarwinPlatformKind::WatchOS:
377 return "watchos";
378 case DarwinPlatformKind::WatchOSSimulator:
379 return "watchossim";
380 }
381 llvm_unreachable("Unsupported platform");
382}
383
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000384void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000385 ArgStringList &CmdArgs) const {
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000386 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000387
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000388 AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.profile_") +
389 getOSLibraryNameSuffix() + ".a").str(),
390 /*AlwaysLink*/ true);
Justin Bognerc7701242015-05-12 05:44:36 +0000391}
392
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000393void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
394 ArgStringList &CmdArgs,
395 StringRef Sanitizer) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000396 AddLinkRuntimeLib(
397 Args, CmdArgs,
Anna Zakse67b4022016-02-02 02:04:48 +0000398 (Twine("libclang_rt.") + Sanitizer + "_" +
399 getOSLibraryNameSuffix() + "_dynamic.dylib").str(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000400 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
401 /*AddRPath*/ true);
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000402}
403
Jonas Hahnfeldd196fa52016-07-27 08:15:54 +0000404ToolChain::RuntimeLibType DarwinClang::GetRuntimeLibType(
405 const ArgList &Args) const {
406 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
407 StringRef Value = A->getValue();
408 if (Value != "compiler-rt")
409 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
410 << Value << "darwin";
411 }
412
413 return ToolChain::RLT_CompilerRT;
414}
415
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000416void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
Daniel Dunbar6276f992009-09-18 08:15:13 +0000417 ArgStringList &CmdArgs) const {
Jonas Hahnfeldd196fa52016-07-27 08:15:54 +0000418 // Call once to ensure diagnostic is printed if wrong value was specified
419 GetRuntimeLibType(Args);
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000420
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000421 // Darwin doesn't support real static executables, don't link any runtime
422 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000423 if (Args.hasArg(options::OPT_static) ||
424 Args.hasArg(options::OPT_fapple_kext) ||
425 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000426 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000427
428 // Reject -static-libgcc for now, we can deal with this when and if someone
429 // cares. This is useful in situations where someone wants to statically link
430 // something like libstdc++, and needs its runtime support routines.
431 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000432 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000433 return;
434 }
435
Peter Collingbourne32701642013-11-01 18:16:25 +0000436 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000437 if (Sanitize.needsAsanRt())
438 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
439 if (Sanitize.needsUbsanRt())
440 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000441 if (Sanitize.needsTsanRt())
442 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Peter Collingbournedc134532016-01-16 00:31:22 +0000443 if (Sanitize.needsStatsRt()) {
444 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
445 AddLinkRuntimeLib(Args, CmdArgs,
446 (Twine("libclang_rt.stats_client_") + OS + ".a").str(),
447 /*AlwaysLink=*/true);
448 AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");
449 }
Derek Bruening256c2e12016-04-21 21:32:04 +0000450 if (Sanitize.needsEsanRt())
451 AddLinkSanitizerLibArgs(Args, CmdArgs, "esan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000452
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000453 // Otherwise link libSystem, then the dynamic runtime library, and finally any
454 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000455 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000456
457 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000458 if (isTargetWatchOSBased()) {
459 // We currently always need a static runtime library for watchOS.
460 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
461 } else if (isTargetTvOSBased()) {
462 // We currently always need a static runtime library for tvOS.
463 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
464 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000465 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
466 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000467 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000468 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000469 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000470 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000471
Daniel Dunbard1076382011-04-18 23:48:36 +0000472 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000473 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000474 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000475 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000476 // The dynamic runtime library was merged with libSystem for 10.6 and
477 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000478 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000479 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000480 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000481 CmdArgs.push_back("-lgcc_s.10.5");
482
Chris Bieneman90743412016-08-17 21:54:30 +0000483 // Originally for OS X, we thought we would only need a static runtime
484 // library when targeting 10.4, to provide versions of the static functions
485 // which were omitted from 10.4.dylib. This led to the creation of the 10.4
486 // builtins library.
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000487 //
488 // Unfortunately, that turned out to not be true, because Darwin system
489 // headers can still use eprintf on i386, and it is not exported from
490 // libSystem. Therefore, we still must provide a runtime library just for
491 // the tiny tiny handful of projects that *might* use that symbol.
Chris Bieneman90743412016-08-17 21:54:30 +0000492 //
493 // Then over time, we figured out it was useful to add more things to the
494 // runtime so we created libclang_rt.osx.a to provide new functions when
495 // deploying to old OS builds, and for a long time we had both eprintf and
496 // osx builtin libraries. Which just seems excessive. So with PR 28855, we
497 // are removing the eprintf library and expecting eprintf to be provided by
498 // the OS X builtins library.
499 if (isMacosxVersionLT(10, 5))
Eric Christopherc235d0c62011-06-22 17:41:40 +0000500 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Chris Bieneman90743412016-08-17 21:54:30 +0000501 else
Eric Christopherc235d0c62011-06-22 17:41:40 +0000502 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
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) ||
Bob Wilson4cf27c42016-07-18 20:29:14 +0000697 HadExtra || Major >= 100 || 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 ||
Bob Wilson4cf27c42016-07-18 20:29:14 +0000703 Major >= 100 || Minor >= 100 || Micro >= 100)
Tim Northover6f3ff222015-10-30 16:30:27 +0000704 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,
Mehdi Aminic50b1a22016-10-07 21:27:26 +0000812 StringRef 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() ||
Mehdi Aminic50b1a22016-10-07 21:27:26 +0000830 (!BoundArch.empty() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000831 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.
Mehdi Aminic50b1a22016-10-07 21:27:26 +0000946 if (!BoundArch.empty()) {
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
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001026void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001027 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.");
Vedant Kumar5fb00e42016-07-27 23:01:55 +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,
Mehdi Aminic50b1a22016-10-07 21:27:26 +00001042 StringRef BoundArch) const {
Tim Northover157d9112014-01-16 08:48:16 +00001043 // 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.
Mehdi Aminic50b1a22016-10-07 21:27:26 +00001048 if (BoundArch.empty())
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001049 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
Tim Northoverc0f6c9b2016-08-23 18:12:58 +00001096 auto Arch = tools::darwin::getArchTypeForMachOArchName(BoundArch);
1097 if ((Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)) {
1098 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
1099 options::OPT_fno_omit_frame_pointer, false))
1100 getDriver().Diag(clang::diag::warn_drv_unsupported_opt_for_target)
1101 << "-fomit-frame-pointer" << BoundArch;
1102 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
1103 options::OPT_mno_omit_leaf_frame_pointer, false))
1104 getDriver().Diag(clang::diag::warn_drv_unsupported_opt_for_target)
1105 << "-momit-leaf-frame-pointer" << BoundArch;
1106 }
1107
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001108 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001109}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001110
Tim Northover157d9112014-01-16 08:48:16 +00001111bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001112 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001113}
1114
Tim Northover157d9112014-01-16 08:48:16 +00001115bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001116 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1117 return S[0] != '\0';
1118 return false;
1119}
1120
Tim Northovere931f9f2015-10-30 16:30:41 +00001121bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001122 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001123 if (getTriple().getArch() != llvm::Triple::arm &&
1124 getTriple().getArch() != llvm::Triple::thumb)
1125 return false;
1126
Tim Northoverc741b042015-11-17 18:27:27 +00001127 // Only watchOS uses the new DWARF/Compact unwinding method.
Tim Northoverd88ecb32016-01-27 19:32:40 +00001128 llvm::Triple Triple(ComputeLLVMTriple(Args));
Tim Northover4c9ac7d2016-01-27 22:14:02 +00001129 return !Triple.isWatchABI();
Daniel Dunbar3241d402010-02-10 18:49:11 +00001130}
1131
Steven Wu574b0f22016-03-01 01:07:58 +00001132bool Darwin::SupportsEmbeddedBitcode() const {
1133 assert(TargetInitialized && "Target not initialized!");
1134 if (isTargetIPhoneOS() && isIPhoneOSVersionLT(6, 0))
1135 return false;
1136 return true;
1137}
1138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001139bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001141bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001142
Tim Northover157d9112014-01-16 08:48:16 +00001143bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001144 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001145 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001146}
1147
Tim Northover157d9112014-01-16 08:48:16 +00001148bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001149 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001150 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001151}
1152
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001153void Darwin::addMinVersionArgs(const ArgList &Args,
1154 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001155 VersionTuple TargetVersion = getTargetVersion();
1156
Tim Northover6f3ff222015-10-30 16:30:27 +00001157 if (isTargetWatchOS())
1158 CmdArgs.push_back("-watchos_version_min");
1159 else if (isTargetWatchOSSimulator())
1160 CmdArgs.push_back("-watchos_simulator_version_min");
1161 else if (isTargetTvOS())
1162 CmdArgs.push_back("-tvos_version_min");
1163 else if (isTargetTvOSSimulator())
1164 CmdArgs.push_back("-tvos_simulator_version_min");
1165 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001166 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001167 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001168 CmdArgs.push_back("-iphoneos_version_min");
1169 else {
1170 assert(isTargetMacOS() && "unexpected target");
1171 CmdArgs.push_back("-macosx_version_min");
1172 }
1173
1174 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1175}
1176
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001177void Darwin::addStartObjectFileArgs(const ArgList &Args,
1178 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001179 // Derived from startfile spec.
1180 if (Args.hasArg(options::OPT_dynamiclib)) {
1181 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001182 if (isTargetWatchOSBased()) {
1183 ; // watchOS does not need dylib1.o.
1184 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001185 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001186 } else if (isTargetIPhoneOS()) {
1187 if (isIPhoneOSVersionLT(3, 1))
1188 CmdArgs.push_back("-ldylib1.o");
1189 } else {
1190 if (isMacosxVersionLT(10, 5))
1191 CmdArgs.push_back("-ldylib1.o");
1192 else if (isMacosxVersionLT(10, 6))
1193 CmdArgs.push_back("-ldylib1.10.5.o");
1194 }
1195 } else {
1196 if (Args.hasArg(options::OPT_bundle)) {
1197 if (!Args.hasArg(options::OPT_static)) {
1198 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001199 if (isTargetWatchOSBased()) {
1200 ; // watchOS does not need bundle1.o.
1201 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001202 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001203 } else if (isTargetIPhoneOS()) {
1204 if (isIPhoneOSVersionLT(3, 1))
1205 CmdArgs.push_back("-lbundle1.o");
1206 } else {
1207 if (isMacosxVersionLT(10, 6))
1208 CmdArgs.push_back("-lbundle1.o");
1209 }
1210 }
1211 } else {
1212 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1213 if (Args.hasArg(options::OPT_static) ||
1214 Args.hasArg(options::OPT_object) ||
1215 Args.hasArg(options::OPT_preload)) {
1216 CmdArgs.push_back("-lgcrt0.o");
1217 } else {
1218 CmdArgs.push_back("-lgcrt1.o");
1219
1220 // darwin_crt2 spec is empty.
1221 }
1222 // By default on OS X 10.8 and later, we don't link with a crt1.o
1223 // file and the linker knows to use _main as the entry point. But,
1224 // when compiling with -pg, we need to link with the gcrt1.o file,
1225 // so pass the -no_new_main option to tell the linker to use the
1226 // "start" symbol as the entry point.
1227 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1228 CmdArgs.push_back("-no_new_main");
1229 } else {
1230 if (Args.hasArg(options::OPT_static) ||
1231 Args.hasArg(options::OPT_object) ||
1232 Args.hasArg(options::OPT_preload)) {
1233 CmdArgs.push_back("-lcrt0.o");
1234 } else {
1235 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001236 if (isTargetWatchOSBased()) {
1237 ; // watchOS does not need crt1.o.
1238 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001239 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001240 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001241 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001242 ; // iOS does not need any crt1 files for arm64
1243 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001244 CmdArgs.push_back("-lcrt1.o");
1245 else if (isIPhoneOSVersionLT(6, 0))
1246 CmdArgs.push_back("-lcrt1.3.1.o");
1247 } else {
1248 if (isMacosxVersionLT(10, 5))
1249 CmdArgs.push_back("-lcrt1.o");
1250 else if (isMacosxVersionLT(10, 6))
1251 CmdArgs.push_back("-lcrt1.10.5.o");
1252 else if (isMacosxVersionLT(10, 8))
1253 CmdArgs.push_back("-lcrt1.10.6.o");
1254
1255 // darwin_crt2 spec is empty.
1256 }
1257 }
1258 }
1259 }
1260 }
1261
1262 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001263 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001264 isMacosxVersionLT(10, 5)) {
1265 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1266 CmdArgs.push_back(Str);
1267 }
1268}
1269
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001270bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001271
John McCall3deb1ad2012-08-21 02:47:43 +00001272void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001273 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1274 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001275 return;
John McCall93207072012-08-27 01:56:21 +00001276 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001277}
1278
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001279SanitizerMask Darwin::getSupportedSanitizers() const {
Devin Coughlinfcfa38c2016-03-20 18:24:33 +00001280 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001281 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Anna Zakse67b4022016-02-02 02:04:48 +00001282 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001283 if (isTargetMacOS()) {
1284 if (!isMacosxVersionLT(10, 9))
1285 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001286 Res |= SanitizerKind::SafeStack;
Devin Coughlinfcfa38c2016-03-20 18:24:33 +00001287 if (IsX86_64)
1288 Res |= SanitizerKind::Thread;
1289 } else if (isTargetIOSSimulator() || isTargetTvOSSimulator()) {
1290 if (IsX86_64)
1291 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001292 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001293 return Res;
1294}
1295
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001296/// Generic_GCC - A tool chain using the 'gcc' command to perform
1297/// all subcommands; this relies on gcc translating the majority of
1298/// command line options.
1299
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001300/// \brief Parse a GCCVersion object out of a string of text.
1301///
1302/// This is the primary means of forming GCCVersion objects.
1303/*static*/
1304Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001305 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001306 std::pair<StringRef, StringRef> First = VersionText.split('.');
1307 std::pair<StringRef, StringRef> Second = First.second.split('.');
1308
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001309 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1310 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001311 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001312 GoodVersion.MajorStr = First.first.str();
Bryan Chand346ae62016-06-17 16:47:14 +00001313 if (First.second.empty())
1314 return GoodVersion;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001315 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001316 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001317 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001318
1319 // First look for a number prefix and parse that if present. Otherwise just
1320 // stash the entire patch string in the suffix, and leave the number
1321 // unspecified. This covers versions strings such as:
Bryan Chand346ae62016-06-17 16:47:14 +00001322 // 5 (handled above)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001323 // 4.4
1324 // 4.4.0
1325 // 4.4.x
1326 // 4.4.2-rc4
1327 // 4.4.x-patched
1328 // And retains any patch number it finds.
1329 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1330 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001331 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001332 // Try to parse the number and any suffix.
1333 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1334 GoodVersion.Patch < 0)
1335 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001336 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001337 }
1338 }
1339
1340 return GoodVersion;
1341}
1342
1343/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001344bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1345 int RHSPatch,
1346 StringRef RHSPatchSuffix) const {
1347 if (Major != RHSMajor)
1348 return Major < RHSMajor;
1349 if (Minor != RHSMinor)
1350 return Minor < RHSMinor;
1351 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001352 // Note that versions without a specified patch sort higher than those with
1353 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001354 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001355 return true;
1356 if (Patch == -1)
1357 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001358
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001359 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001360 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001361 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001362 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001363 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001364 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001365 return true;
1366 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001367 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001368
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001369 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001370 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001371 }
1372
1373 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001374 return false;
1375}
1376
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001377static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001378 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1379 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001380 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001381 return GCC_INSTALL_PREFIX;
1382}
1383
Roman Divacky326d9982013-12-06 18:32:18 +00001384/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001385///
1386/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001387/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001388///
1389/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1390/// should instead pull the target out of the driver. This is currently
1391/// necessary because the driver doesn't store the final version of the target
1392/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001393void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001394 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001395 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001396 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1397 ? TargetTriple.get64BitArchVariant()
1398 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001399 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001400 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001401 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001402 SmallVector<StringRef, 16> CandidateTripleAliases;
1403 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001404 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1405 CandidateTripleAliases, CandidateBiarchLibDirs,
1406 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001407
1408 // Compute the set of prefixes for our search.
1409 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1410 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001411
Rafael Espindola1af7c212012-02-19 01:38:32 +00001412 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1413 if (GCCToolchainDir != "") {
1414 if (GCCToolchainDir.back() == '/')
1415 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001416
Rafael Espindola1af7c212012-02-19 01:38:32 +00001417 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001418 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001419 // If we have a SysRoot, try that first.
1420 if (!D.SysRoot.empty()) {
1421 Prefixes.push_back(D.SysRoot);
1422 Prefixes.push_back(D.SysRoot + "/usr");
1423 }
1424
1425 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001426 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001427
Rafael Espindola2edca412016-05-09 13:03:10 +00001428 // Then look for distribution supplied gcc installations.
1429 if (D.SysRoot.empty()) {
1430 // Look for RHEL devtoolsets.
1431 Prefixes.push_back("/opt/rh/devtoolset-4/root/usr");
1432 Prefixes.push_back("/opt/rh/devtoolset-3/root/usr");
1433 Prefixes.push_back("/opt/rh/devtoolset-2/root/usr");
1434 Prefixes.push_back("/opt/rh/devtoolset-1.1/root/usr");
1435 Prefixes.push_back("/opt/rh/devtoolset-1.0/root/usr");
1436 // And finally in /usr.
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001437 Prefixes.push_back("/usr");
Rafael Espindola2edca412016-05-09 13:03:10 +00001438 }
Rafael Espindolac29af942012-02-03 01:01:20 +00001439 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001440
Michal Gornybd449c22016-10-25 15:07:41 +00001441 // Try to respect gcc-config on Gentoo. However, do that only
1442 // if --gcc-toolchain is not provided or equal to the Gentoo install
1443 // in /usr. This avoids accidentally enforcing the system GCC version
1444 // when using a custom toolchain.
1445 if (GCCToolchainDir == "" || GCCToolchainDir == D.SysRoot + "/usr") {
1446 for (StringRef CandidateTriple : CandidateTripleAliases) {
1447 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
1448 D.getVFS().getBufferForFile(D.SysRoot + "/etc/env.d/gcc/config-" +
1449 CandidateTriple.str());
1450 if (File) {
1451 SmallVector<StringRef, 2> Lines;
1452 File.get()->getBuffer().split(Lines, "\n");
1453 for (StringRef Line : Lines) {
1454 // CURRENT=triple-version
1455 if (Line.consume_front("CURRENT=")) {
1456 const std::pair<StringRef, StringRef> ActiveVersion =
1457 Line.rsplit('-');
1458 // Note: Strictly speaking, we should be reading
1459 // /etc/env.d/gcc/${CURRENT} now. However, the file doesn't
1460 // contain anything new or especially useful to us.
1461 const std::string GentooPath = D.SysRoot + "/usr/lib/gcc/" +
1462 ActiveVersion.first.str() + "/" +
1463 ActiveVersion.second.str();
1464 if (D.getVFS().exists(GentooPath + "/crtbegin.o")) {
1465 Version = GCCVersion::Parse(ActiveVersion.second);
1466 GCCInstallPath = GentooPath;
1467 GCCParentLibPath = GentooPath + "/../../..";
1468 GCCTriple.setTriple(ActiveVersion.first);
1469 IsValid = true;
1470 return;
1471 }
1472 }
1473 }
1474 }
1475 }
1476 }
1477
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001478 // Loop over the various components which exist and select the best GCC
1479 // installation available. GCC installs are ranked by version number.
1480 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001481 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001482 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001483 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001484 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001485 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001486 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001487 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001488 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001489 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001490 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001491 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001492 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001493 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001494 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001495 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001496 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001497 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001498 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001499 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001500 }
1501 }
1502}
1503
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001504void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001505 for (const auto &InstallPath : CandidateGCCInstallPaths)
1506 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001507
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001508 if (!GCCInstallPath.empty())
1509 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1510
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001511 for (const auto &Multilib : Multilibs)
1512 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001513
1514 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1515 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001516}
1517
1518bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1519 if (BiarchSibling.hasValue()) {
1520 M = BiarchSibling.getValue();
1521 return true;
1522 }
1523 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001524}
1525
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001526/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001527 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001528 SmallVectorImpl<StringRef> &LibDirs,
1529 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001530 SmallVectorImpl<StringRef> &BiarchLibDirs,
1531 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001532 // Declare a bunch of static data sets that we'll select between below. These
1533 // are specifically designed to always refer to string literals to avoid any
1534 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001535 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1536 static const char *const AArch64Triples[] = {
1537 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1538 "aarch64-redhat-linux"};
1539 static const char *const AArch64beLibDirs[] = {"/lib"};
1540 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1541 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001542
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001543 static const char *const ARMLibDirs[] = {"/lib"};
1544 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1545 "arm-linux-androideabi"};
1546 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1547 "armv7hl-redhat-linux-gnueabi"};
1548 static const char *const ARMebLibDirs[] = {"/lib"};
1549 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1550 "armeb-linux-androideabi"};
1551 static const char *const ARMebHFTriples[] = {
1552 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001553
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001554 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001555 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001556 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1557 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1558 "x86_64-redhat-linux", "x86_64-suse-linux",
1559 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1560 "x86_64-slackware-linux", "x86_64-linux-android",
1561 "x86_64-unknown-linux"};
1562 static const char *const X32LibDirs[] = {"/libx32"};
1563 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001564 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001565 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1566 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1567 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1568 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1569 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001570
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001571 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001572 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1573 "mips-mti-linux-gnu",
1574 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001575 static const char *const MIPSELLibDirs[] = {"/lib"};
Simon Atanasyan603018a2016-07-19 07:09:48 +00001576 static const char *const MIPSELTriples[] = {"mipsel-linux-gnu",
1577 "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001578
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001579 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1580 static const char *const MIPS64Triples[] = {
1581 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1582 "mips64-linux-gnuabi64"};
1583 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1584 static const char *const MIPS64ELTriples[] = {
1585 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
Simon Atanasyan603018a2016-07-19 07:09:48 +00001586 "mips64el-linux-gnuabi64"};
1587
1588 static const char *const MIPSELAndroidLibDirs[] = {"/lib", "/libr2",
1589 "/libr6"};
1590 static const char *const MIPSELAndroidTriples[] = {"mipsel-linux-android"};
1591 static const char *const MIPS64ELAndroidLibDirs[] = {"/lib64", "/lib",
1592 "/libr2", "/libr6"};
1593 static const char *const MIPS64ELAndroidTriples[] = {
1594 "mips64el-linux-android"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001595
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001596 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001597 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001598 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1599 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1600 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1601 static const char *const PPC64Triples[] = {
1602 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1603 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1604 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1605 static const char *const PPC64LETriples[] = {
1606 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1607 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001608
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001609 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1610 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1611 "sparcv8-linux-gnu"};
1612 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1613 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1614 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001615
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001616 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001617 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001618 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1619 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001620
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001621 // Solaris.
1622 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1623 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1624 "i386-pc-solaris2.11"};
1625
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001626 using std::begin;
1627 using std::end;
1628
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001629 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1630 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1631 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001632 return;
1633 }
1634
Chandler Carruth866faab2012-01-25 07:21:38 +00001635 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001636 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001637 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1638 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1639 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1640 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001641 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001642 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001643 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1644 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1645 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1646 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001647 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001648 case llvm::Triple::arm:
1649 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001650 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001651 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001652 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001653 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001654 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001655 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001656 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001657 case llvm::Triple::armeb:
1658 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001659 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001660 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001661 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001662 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001663 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001664 }
1665 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001666 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001667 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1668 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1669 // x32 is always available when x86_64 is available, so adding it as
1670 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001671 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001672 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1673 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001674 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001675 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1676 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001677 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001678 break;
1679 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001680 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001681 // MCU toolchain is 32 bit only and its triple alias is TargetTriple
1682 // itself, which will be appended below.
1683 if (!TargetTriple.isOSIAMCU()) {
1684 TripleAliases.append(begin(X86Triples), end(X86Triples));
1685 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1686 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1687 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001688 break;
1689 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001690 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1691 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1692 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1693 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001694 break;
1695 case llvm::Triple::mipsel:
Simon Atanasyan603018a2016-07-19 07:09:48 +00001696 if (TargetTriple.isAndroid()) {
1697 LibDirs.append(begin(MIPSELAndroidLibDirs), end(MIPSELAndroidLibDirs));
1698 TripleAliases.append(begin(MIPSELAndroidTriples),
1699 end(MIPSELAndroidTriples));
1700 BiarchLibDirs.append(begin(MIPS64ELAndroidLibDirs),
1701 end(MIPS64ELAndroidLibDirs));
1702 BiarchTripleAliases.append(begin(MIPS64ELAndroidTriples),
1703 end(MIPS64ELAndroidTriples));
1704
1705 } else {
1706 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1707 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1708 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1709 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1710 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1711 }
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001712 break;
1713 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001714 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1715 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1716 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1717 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001718 break;
1719 case llvm::Triple::mips64el:
Simon Atanasyan603018a2016-07-19 07:09:48 +00001720 if (TargetTriple.isAndroid()) {
1721 LibDirs.append(begin(MIPS64ELAndroidLibDirs),
1722 end(MIPS64ELAndroidLibDirs));
1723 TripleAliases.append(begin(MIPS64ELAndroidTriples),
1724 end(MIPS64ELAndroidTriples));
1725 BiarchLibDirs.append(begin(MIPSELAndroidLibDirs),
1726 end(MIPSELAndroidLibDirs));
1727 BiarchTripleAliases.append(begin(MIPSELAndroidTriples),
1728 end(MIPSELAndroidTriples));
1729
1730 } else {
1731 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1732 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1733 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1734 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1735 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1736 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001737 break;
1738 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001739 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1740 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1741 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1742 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001743 break;
1744 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001745 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1746 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1747 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1748 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001749 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001750 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001751 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1752 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001753 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001754 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001755 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001756 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1757 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1758 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1759 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001760 break;
1761 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001762 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1763 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1764 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1765 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001766 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001767 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001768 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1769 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001770 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001771 default:
1772 // By default, just rely on the standard lib directories and the original
1773 // triple.
1774 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001775 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001776
1777 // Always append the drivers target triple to the end, in case it doesn't
1778 // match any of our aliases.
1779 TripleAliases.push_back(TargetTriple.str());
1780
1781 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001782 if (TargetTriple.str() != BiarchTriple.str())
1783 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001784}
1785
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001786// Parses the contents of version.txt in an CUDA installation. It should
1787// contain one line of the from e.g. "CUDA Version 7.5.2".
1788static CudaVersion ParseCudaVersionFile(llvm::StringRef V) {
1789 if (!V.startswith("CUDA Version "))
1790 return CudaVersion::UNKNOWN;
1791 V = V.substr(strlen("CUDA Version "));
1792 int Major = -1, Minor = -1;
1793 auto First = V.split('.');
1794 auto Second = First.second.split('.');
Justin Lebara27654a2016-08-15 20:38:48 +00001795 if (First.first.getAsInteger(10, Major) ||
1796 Second.first.getAsInteger(10, Minor))
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001797 return CudaVersion::UNKNOWN;
1798
1799 if (Major == 7 && Minor == 0) {
1800 // This doesn't appear to ever happen -- version.txt doesn't exist in the
1801 // CUDA 7 installs I've seen. But no harm in checking.
1802 return CudaVersion::CUDA_70;
1803 }
1804 if (Major == 7 && Minor == 5)
1805 return CudaVersion::CUDA_75;
1806 if (Major == 8 && Minor == 0)
1807 return CudaVersion::CUDA_80;
1808 return CudaVersion::UNKNOWN;
1809}
1810
Artem Belevich98607b62015-09-23 21:49:39 +00001811// \brief -- try common CUDA installation paths looking for files we need for
1812// CUDA compilation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001813void Generic_GCC::CudaInstallationDetector::init(
1814 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001815 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001816
1817 if (Args.hasArg(options::OPT_cuda_path_EQ))
1818 CudaPathCandidates.push_back(
1819 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1820 else {
1821 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001822 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-8.0");
Artem Belevich86017332015-11-17 22:28:55 +00001823 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001824 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1825 }
1826
Benjamin Kramere8b76412015-09-24 14:48:37 +00001827 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001828 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001829 continue;
1830
Justin Lebar710c1312016-07-06 21:21:43 +00001831 InstallPath = CudaPath;
1832 BinPath = CudaPath + "/bin";
1833 IncludePath = InstallPath + "/include";
1834 LibDevicePath = InstallPath + "/nvvm/libdevice";
1835 LibPath = InstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
Artem Belevich98607b62015-09-23 21:49:39 +00001836
Justin Lebar710c1312016-07-06 21:21:43 +00001837 auto &FS = D.getVFS();
1838 if (!(FS.exists(IncludePath) && FS.exists(BinPath) && FS.exists(LibPath) &&
1839 FS.exists(LibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001840 continue;
1841
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001842 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> VersionFile =
1843 FS.getBufferForFile(InstallPath + "/version.txt");
1844 if (!VersionFile) {
1845 // CUDA 7.0 doesn't have a version.txt, so guess that's our version if
1846 // version.txt isn't present.
1847 Version = CudaVersion::CUDA_70;
1848 } else {
1849 Version = ParseCudaVersionFile((*VersionFile)->getBuffer());
1850 }
1851
Artem Belevich34f481a2015-11-17 22:28:50 +00001852 std::error_code EC;
Justin Lebar710c1312016-07-06 21:21:43 +00001853 for (llvm::sys::fs::directory_iterator LI(LibDevicePath, EC), LE;
Artem Belevich34f481a2015-11-17 22:28:50 +00001854 !EC && LI != LE; LI = LI.increment(EC)) {
1855 StringRef FilePath = LI->path();
1856 StringRef FileName = llvm::sys::path::filename(FilePath);
1857 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1858 const StringRef LibDeviceName = "libdevice.";
1859 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1860 continue;
1861 StringRef GpuArch = FileName.slice(
1862 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
Justin Lebar710c1312016-07-06 21:21:43 +00001863 LibDeviceMap[GpuArch] = FilePath.str();
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001864 // Insert map entries for specifc devices with this compute
1865 // capability. NVCC's choice of the libdevice library version is
1866 // rather peculiar and depends on the CUDA version.
Artem Belevich34f481a2015-11-17 22:28:50 +00001867 if (GpuArch == "compute_20") {
Justin Lebar710c1312016-07-06 21:21:43 +00001868 LibDeviceMap["sm_20"] = FilePath;
1869 LibDeviceMap["sm_21"] = FilePath;
Artem Belevich02a1e972016-08-02 23:12:51 +00001870 LibDeviceMap["sm_32"] = FilePath;
Artem Belevich34f481a2015-11-17 22:28:50 +00001871 } else if (GpuArch == "compute_30") {
Justin Lebar710c1312016-07-06 21:21:43 +00001872 LibDeviceMap["sm_30"] = FilePath;
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001873 if (Version < CudaVersion::CUDA_80) {
1874 LibDeviceMap["sm_50"] = FilePath;
1875 LibDeviceMap["sm_52"] = FilePath;
1876 LibDeviceMap["sm_53"] = FilePath;
1877 }
Artem Belevich02a1e972016-08-02 23:12:51 +00001878 LibDeviceMap["sm_60"] = FilePath;
1879 LibDeviceMap["sm_61"] = FilePath;
1880 LibDeviceMap["sm_62"] = FilePath;
Artem Belevich34f481a2015-11-17 22:28:50 +00001881 } else if (GpuArch == "compute_35") {
Justin Lebar710c1312016-07-06 21:21:43 +00001882 LibDeviceMap["sm_35"] = FilePath;
1883 LibDeviceMap["sm_37"] = FilePath;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001884 } else if (GpuArch == "compute_50") {
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001885 if (Version >= CudaVersion::CUDA_80) {
1886 LibDeviceMap["sm_50"] = FilePath;
1887 LibDeviceMap["sm_52"] = FilePath;
1888 LibDeviceMap["sm_53"] = FilePath;
1889 }
Artem Belevich34f481a2015-11-17 22:28:50 +00001890 }
1891 }
1892
Artem Belevich98607b62015-09-23 21:49:39 +00001893 IsValid = true;
1894 break;
1895 }
1896}
1897
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001898void Generic_GCC::CudaInstallationDetector::CheckCudaVersionSupportsArch(
1899 CudaArch Arch) const {
1900 if (Arch == CudaArch::UNKNOWN || Version == CudaVersion::UNKNOWN ||
1901 ArchsWithVersionTooLowErrors.count(Arch) > 0)
1902 return;
1903
1904 auto RequiredVersion = MinVersionForCudaArch(Arch);
1905 if (Version < RequiredVersion) {
1906 ArchsWithVersionTooLowErrors.insert(Arch);
1907 D.Diag(diag::err_drv_cuda_version_too_low)
1908 << InstallPath << CudaArchToString(Arch) << CudaVersionToString(Version)
1909 << CudaVersionToString(RequiredVersion);
1910 }
1911}
1912
Artem Belevich98607b62015-09-23 21:49:39 +00001913void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1914 if (isValid())
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001915 OS << "Found CUDA installation: " << InstallPath << ", version "
1916 << CudaVersionToString(Version) << "\n";
Artem Belevich98607b62015-09-23 21:49:39 +00001917}
1918
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001919namespace {
1920// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001921class FilterNonExistent {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001922 StringRef Base, File;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001923 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001924
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001925public:
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001926 FilterNonExistent(StringRef Base, StringRef File, vfs::FileSystem &VFS)
1927 : Base(Base), File(File), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001928 bool operator()(const Multilib &M) {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001929 return !VFS.exists(Base + M.gccSuffix() + File);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001930 }
1931};
1932} // end anonymous namespace
1933
1934static void addMultilibFlag(bool Enabled, const char *const Flag,
1935 std::vector<std::string> &Flags) {
1936 if (Enabled)
1937 Flags.push_back(std::string("+") + Flag);
1938 else
1939 Flags.push_back(std::string("-") + Flag);
1940}
1941
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00001942static bool isArmOrThumbArch(llvm::Triple::ArchType Arch) {
1943 return Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb;
1944}
1945
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001946static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001947 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1948 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1949}
1950
1951static bool isMips32(llvm::Triple::ArchType Arch) {
1952 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1953}
1954
1955static bool isMips64(llvm::Triple::ArchType Arch) {
1956 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1957}
1958
1959static bool isMipsEL(llvm::Triple::ArchType Arch) {
1960 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1961}
1962
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001963static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001964 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001965 return A && A->getOption().matches(options::OPT_mips16);
1966}
1967
1968static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001969 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001970 return A && A->getOption().matches(options::OPT_mmicromips);
1971}
1972
Benjamin Kramere003ca22015-10-28 13:54:16 +00001973namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001974struct DetectedMultilibs {
1975 /// The set of multilibs that the detected installation supports.
1976 MultilibSet Multilibs;
1977
1978 /// The primary multilib appropriate for the given flags.
1979 Multilib SelectedMultilib;
1980
1981 /// On Biarch systems, this corresponds to the default multilib when
1982 /// targeting the non-default multilib. Otherwise, it is empty.
1983 llvm::Optional<Multilib> BiarchSibling;
1984};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001985} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001986
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001987static Multilib makeMultilib(StringRef commonSuffix) {
1988 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1989}
1990
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00001991static bool findMipsCsMultilibs(const Multilib::flags_list &Flags,
1992 FilterNonExistent &NonExistent,
1993 DetectedMultilibs &Result) {
1994 // Check for Code Sourcery toolchain multilibs
1995 MultilibSet CSMipsMultilibs;
1996 {
1997 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001998
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00001999 auto MArchMicroMips =
2000 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002001
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002002 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
2003
2004 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
2005
2006 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
2007
2008 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
2009
2010 auto DefaultFloat =
2011 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
2012
2013 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
2014
2015 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
2016
2017 // Note that this one's osSuffix is ""
2018 auto MAbi64 = makeMultilib("")
2019 .gccSuffix("/64")
2020 .includeSuffix("/64")
2021 .flag("+mabi=n64")
2022 .flag("-mabi=n32")
2023 .flag("-m32");
2024
2025 CSMipsMultilibs =
2026 MultilibSet()
2027 .Either(MArchMips16, MArchMicroMips, MArchDefault)
2028 .Maybe(UCLibc)
2029 .Either(SoftFloat, Nan2008, DefaultFloat)
2030 .FilterOut("/micromips/nan2008")
2031 .FilterOut("/mips16/nan2008")
2032 .Either(BigEndian, LittleEndian)
2033 .Maybe(MAbi64)
2034 .FilterOut("/mips16.*/64")
2035 .FilterOut("/micromips.*/64")
2036 .FilterOut(NonExistent)
2037 .setIncludeDirsCallback([](const Multilib &M) {
2038 std::vector<std::string> Dirs({"/include"});
2039 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
2040 Dirs.push_back(
2041 "/../../../../mips-linux-gnu/libc/uclibc/usr/include");
2042 else
2043 Dirs.push_back("/../../../../mips-linux-gnu/libc/usr/include");
2044 return Dirs;
2045 });
2046 }
2047
2048 MultilibSet DebianMipsMultilibs;
2049 {
2050 Multilib MAbiN32 =
2051 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
2052
2053 Multilib M64 = Multilib()
2054 .gccSuffix("/64")
2055 .includeSuffix("/64")
2056 .flag("+m64")
2057 .flag("-m32")
2058 .flag("-mabi=n32");
2059
2060 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
2061
2062 DebianMipsMultilibs =
2063 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
2064 }
2065
2066 // Sort candidates. Toolchain that best meets the directories tree goes first.
2067 // Then select the first toolchains matches command line flags.
2068 MultilibSet *Candidates[] = {&CSMipsMultilibs, &DebianMipsMultilibs};
2069 if (CSMipsMultilibs.size() < DebianMipsMultilibs.size())
2070 std::iter_swap(Candidates, Candidates + 1);
2071 for (const MultilibSet *Candidate : Candidates) {
2072 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2073 if (Candidate == &DebianMipsMultilibs)
2074 Result.BiarchSibling = Multilib();
2075 Result.Multilibs = *Candidate;
2076 return true;
2077 }
2078 }
2079 return false;
2080}
2081
Simon Atanasyan603018a2016-07-19 07:09:48 +00002082static bool findMipsAndroidMultilibs(vfs::FileSystem &VFS, StringRef Path,
2083 const Multilib::flags_list &Flags,
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002084 FilterNonExistent &NonExistent,
2085 DetectedMultilibs &Result) {
2086
2087 MultilibSet AndroidMipsMultilibs =
2088 MultilibSet()
2089 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
2090 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
2091 .FilterOut(NonExistent);
2092
Simon Atanasyan603018a2016-07-19 07:09:48 +00002093 MultilibSet AndroidMipselMultilibs =
2094 MultilibSet()
2095 .Either(Multilib().flag("+march=mips32"),
2096 Multilib("/mips-r2", "", "/mips-r2").flag("+march=mips32r2"),
2097 Multilib("/mips-r6", "", "/mips-r6").flag("+march=mips32r6"))
2098 .FilterOut(NonExistent);
2099
2100 MultilibSet AndroidMips64elMultilibs =
2101 MultilibSet()
2102 .Either(
2103 Multilib().flag("+march=mips64r6"),
2104 Multilib("/32/mips-r1", "", "/mips-r1").flag("+march=mips32"),
2105 Multilib("/32/mips-r2", "", "/mips-r2").flag("+march=mips32r2"),
2106 Multilib("/32/mips-r6", "", "/mips-r6").flag("+march=mips32r6"))
2107 .FilterOut(NonExistent);
2108
2109 MultilibSet *MS = &AndroidMipsMultilibs;
2110 if (VFS.exists(Path + "/mips-r6"))
2111 MS = &AndroidMipselMultilibs;
2112 else if (VFS.exists(Path + "/32"))
2113 MS = &AndroidMips64elMultilibs;
2114 if (MS->select(Flags, Result.SelectedMultilib)) {
2115 Result.Multilibs = *MS;
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002116 return true;
2117 }
2118 return false;
2119}
2120
2121static bool findMipsMuslMultilibs(const Multilib::flags_list &Flags,
2122 FilterNonExistent &NonExistent,
2123 DetectedMultilibs &Result) {
2124 // Musl toolchain multilibs
2125 MultilibSet MuslMipsMultilibs;
2126 {
2127 auto MArchMipsR2 = makeMultilib("")
2128 .osSuffix("/mips-r2-hard-musl")
2129 .flag("+EB")
2130 .flag("-EL")
2131 .flag("+march=mips32r2");
2132
2133 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
2134 .flag("-EB")
2135 .flag("+EL")
2136 .flag("+march=mips32r2");
2137
2138 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
2139
2140 // Specify the callback that computes the include directories.
2141 MuslMipsMultilibs.setIncludeDirsCallback([](const Multilib &M) {
2142 return std::vector<std::string>(
2143 {"/../sysroot" + M.osSuffix() + "/usr/include"});
2144 });
2145 }
2146 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2147 Result.Multilibs = MuslMipsMultilibs;
2148 return true;
2149 }
2150 return false;
2151}
2152
2153static bool findMipsMtiMultilibs(const Multilib::flags_list &Flags,
2154 FilterNonExistent &NonExistent,
2155 DetectedMultilibs &Result) {
2156 // CodeScape MTI toolchain v1.2 and early.
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002157 MultilibSet MtiMipsMultilibsV1;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002158 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002159 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002160 .flag("+m32")
2161 .flag("-m64")
2162 .flag("-mmicromips")
2163 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002164
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002165 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002166 .flag("+m32")
2167 .flag("-m64")
2168 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002169
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002170 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002171 .flag("-m32")
2172 .flag("+m64")
2173 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002174
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002175 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
2176 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002177
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002178 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002179 .flag("+m32")
2180 .flag("-m64")
2181 .flag("-mmicromips")
2182 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002183
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002184 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002185
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002186 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002187
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002188 auto MAbi64 =
2189 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002190
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002191 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002192
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002193 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002194
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002195 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002196
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002197 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002198
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002199 MtiMipsMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002200 MultilibSet()
2201 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
2202 MArchDefault)
2203 .Maybe(UCLibc)
2204 .Maybe(Mips16)
2205 .FilterOut("/mips64/mips16")
2206 .FilterOut("/mips64r2/mips16")
2207 .FilterOut("/micromips/mips16")
2208 .Maybe(MAbi64)
2209 .FilterOut("/micromips/64")
2210 .FilterOut("/mips32/64")
2211 .FilterOut("^/64")
2212 .FilterOut("/mips16/64")
2213 .Either(BigEndian, LittleEndian)
2214 .Maybe(SoftFloat)
2215 .Maybe(Nan2008)
2216 .FilterOut(".*sof/nan2008")
2217 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002218 .setIncludeDirsCallback([](const Multilib &M) {
2219 std::vector<std::string> Dirs({"/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002220 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
Simon Atanasyana45502d2016-05-19 15:07:21 +00002221 Dirs.push_back("/../../../../sysroot/uclibc/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002222 else
Simon Atanasyana45502d2016-05-19 15:07:21 +00002223 Dirs.push_back("/../../../../sysroot/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002224 return Dirs;
2225 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00002226 }
2227
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002228 // CodeScape IMG toolchain starting from v1.3.
Simon Atanasyan2834a222016-05-22 18:18:07 +00002229 MultilibSet MtiMipsMultilibsV2;
2230 {
2231 auto BeHard = makeMultilib("/mips-r2-hard")
2232 .flag("+EB")
2233 .flag("-msoft-float")
2234 .flag("-mnan=2008")
2235 .flag("-muclibc");
2236 auto BeSoft = makeMultilib("/mips-r2-soft")
2237 .flag("+EB")
2238 .flag("+msoft-float")
2239 .flag("-mnan=2008");
2240 auto ElHard = makeMultilib("/mipsel-r2-hard")
2241 .flag("+EL")
2242 .flag("-msoft-float")
2243 .flag("-mnan=2008")
2244 .flag("-muclibc");
2245 auto ElSoft = makeMultilib("/mipsel-r2-soft")
2246 .flag("+EL")
2247 .flag("+msoft-float")
2248 .flag("-mnan=2008")
2249 .flag("-mmicromips");
2250 auto BeHardNan = makeMultilib("/mips-r2-hard-nan2008")
2251 .flag("+EB")
2252 .flag("-msoft-float")
2253 .flag("+mnan=2008")
2254 .flag("-muclibc");
2255 auto ElHardNan = makeMultilib("/mipsel-r2-hard-nan2008")
2256 .flag("+EL")
2257 .flag("-msoft-float")
2258 .flag("+mnan=2008")
2259 .flag("-muclibc")
2260 .flag("-mmicromips");
2261 auto BeHardNanUclibc = makeMultilib("/mips-r2-hard-nan2008-uclibc")
2262 .flag("+EB")
2263 .flag("-msoft-float")
2264 .flag("+mnan=2008")
2265 .flag("+muclibc");
2266 auto ElHardNanUclibc = makeMultilib("/mipsel-r2-hard-nan2008-uclibc")
2267 .flag("+EL")
2268 .flag("-msoft-float")
2269 .flag("+mnan=2008")
2270 .flag("+muclibc");
2271 auto BeHardUclibc = makeMultilib("/mips-r2-hard-uclibc")
2272 .flag("+EB")
2273 .flag("-msoft-float")
2274 .flag("-mnan=2008")
2275 .flag("+muclibc");
2276 auto ElHardUclibc = makeMultilib("/mipsel-r2-hard-uclibc")
2277 .flag("+EL")
2278 .flag("-msoft-float")
2279 .flag("-mnan=2008")
2280 .flag("+muclibc");
2281 auto ElMicroHardNan = makeMultilib("/micromipsel-r2-hard-nan2008")
2282 .flag("+EL")
2283 .flag("-msoft-float")
2284 .flag("+mnan=2008")
2285 .flag("+mmicromips");
2286 auto ElMicroSoft = makeMultilib("/micromipsel-r2-soft")
2287 .flag("+EL")
2288 .flag("+msoft-float")
2289 .flag("-mnan=2008")
2290 .flag("+mmicromips");
2291
2292 auto O32 =
2293 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2294 auto N32 =
2295 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2296 auto N64 =
2297 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2298
2299 MtiMipsMultilibsV2 =
2300 MultilibSet()
2301 .Either({BeHard, BeSoft, ElHard, ElSoft, BeHardNan, ElHardNan,
2302 BeHardNanUclibc, ElHardNanUclibc, BeHardUclibc,
2303 ElHardUclibc, ElMicroHardNan, ElMicroSoft})
2304 .Either(O32, N32, N64)
2305 .FilterOut(NonExistent)
2306 .setIncludeDirsCallback([](const Multilib &M) {
2307 return std::vector<std::string>({"/../../../../sysroot" +
2308 M.includeSuffix() +
2309 "/../usr/include"});
2310 })
2311 .setFilePathsCallback([](const Multilib &M) {
2312 return std::vector<std::string>(
2313 {"/../../../../mips-mti-linux-gnu/lib" + M.gccSuffix()});
2314 });
2315 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002316 for (auto Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
2317 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2318 Result.Multilibs = *Candidate;
2319 return true;
2320 }
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002321 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002322 return false;
2323}
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002324
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002325static bool findMipsImgMultilibs(const Multilib::flags_list &Flags,
2326 FilterNonExistent &NonExistent,
2327 DetectedMultilibs &Result) {
2328 // CodeScape IMG toolchain v1.2 and early.
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002329 MultilibSet ImgMultilibsV1;
Daniel Sanders2bf13662014-07-10 14:40:57 +00002330 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002331 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002332
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002333 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002334
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002335 auto MAbi64 =
2336 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002337
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002338 ImgMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002339 MultilibSet()
2340 .Maybe(Mips64r6)
2341 .Maybe(MAbi64)
2342 .Maybe(LittleEndian)
2343 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002344 .setIncludeDirsCallback([](const Multilib &M) {
2345 return std::vector<std::string>(
2346 {"/include", "/../../../../sysroot/usr/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002347 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002348 }
2349
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002350 // CodeScape IMG toolchain starting from v1.3.
Simon Atanasyan2834a222016-05-22 18:18:07 +00002351 MultilibSet ImgMultilibsV2;
2352 {
2353 auto BeHard = makeMultilib("/mips-r6-hard")
2354 .flag("+EB")
2355 .flag("-msoft-float")
2356 .flag("-mmicromips");
2357 auto BeSoft = makeMultilib("/mips-r6-soft")
2358 .flag("+EB")
2359 .flag("+msoft-float")
2360 .flag("-mmicromips");
2361 auto ElHard = makeMultilib("/mipsel-r6-hard")
2362 .flag("+EL")
2363 .flag("-msoft-float")
2364 .flag("-mmicromips");
2365 auto ElSoft = makeMultilib("/mipsel-r6-soft")
2366 .flag("+EL")
2367 .flag("+msoft-float")
2368 .flag("-mmicromips");
2369 auto BeMicroHard = makeMultilib("/micromips-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002370 .flag("+EB")
2371 .flag("-msoft-float")
2372 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002373 auto BeMicroSoft = makeMultilib("/micromips-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002374 .flag("+EB")
2375 .flag("+msoft-float")
2376 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002377 auto ElMicroHard = makeMultilib("/micromipsel-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002378 .flag("+EL")
2379 .flag("-msoft-float")
2380 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002381 auto ElMicroSoft = makeMultilib("/micromipsel-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002382 .flag("+EL")
2383 .flag("+msoft-float")
2384 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002385
2386 auto O32 =
2387 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2388 auto N32 =
2389 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2390 auto N64 =
2391 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2392
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002393 ImgMultilibsV2 =
2394 MultilibSet()
2395 .Either({BeHard, BeSoft, ElHard, ElSoft, BeMicroHard, BeMicroSoft,
2396 ElMicroHard, ElMicroSoft})
2397 .Either(O32, N32, N64)
2398 .FilterOut(NonExistent)
2399 .setIncludeDirsCallback([](const Multilib &M) {
2400 return std::vector<std::string>({"/../../../../sysroot" +
2401 M.includeSuffix() +
2402 "/../usr/include"});
2403 })
2404 .setFilePathsCallback([](const Multilib &M) {
2405 return std::vector<std::string>(
2406 {"/../../../../mips-img-linux-gnu/lib" + M.gccSuffix()});
2407 });
Simon Atanasyan2834a222016-05-22 18:18:07 +00002408 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002409 for (auto Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
2410 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2411 Result.Multilibs = *Candidate;
2412 return true;
2413 }
2414 }
2415 return false;
2416}
2417
2418static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
2419 StringRef Path, const ArgList &Args,
2420 DetectedMultilibs &Result) {
2421 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Simon Atanasyan2834a222016-05-22 18:18:07 +00002422
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002423 StringRef CPUName;
2424 StringRef ABIName;
2425 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2426
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002427 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2428
2429 Multilib::flags_list Flags;
2430 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2431 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2432 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002433 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002434 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002435 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002436 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002437 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002438 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002439 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2440 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002441 "march=mips64r2", Flags);
Simon Atanasyan603018a2016-07-19 07:09:48 +00002442 addMultilibFlag(CPUName == "mips64r6", "march=mips64r6", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002443 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002444 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002445 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2446 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002447 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2448 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002449 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002450 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002451 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002452 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002453
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002454 if (TargetTriple.isAndroid())
Simon Atanasyan603018a2016-07-19 07:09:48 +00002455 return findMipsAndroidMultilibs(D.getVFS(), Path, Flags, NonExistent,
2456 Result);
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002457
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002458 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2459 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002460 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2461 return findMipsMuslMultilibs(Flags, NonExistent, Result);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002462
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002463 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2464 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002465 TargetTriple.getEnvironment() == llvm::Triple::GNU)
2466 return findMipsMtiMultilibs(Flags, NonExistent, Result);
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002467
Daniel Sanders2bf13662014-07-10 14:40:57 +00002468 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2469 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002470 TargetTriple.getEnvironment() == llvm::Triple::GNU)
2471 return findMipsImgMultilibs(Flags, NonExistent, Result);
Daniel Sanders2bf13662014-07-10 14:40:57 +00002472
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002473 if (findMipsCsMultilibs(Flags, NonExistent, Result))
2474 return true;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002475
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002476 // Fallback to the regular toolchain-tree structure.
2477 Multilib Default;
2478 Result.Multilibs.push_back(Default);
2479 Result.Multilibs.FilterOut(NonExistent);
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002480
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002481 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2482 Result.BiarchSibling = Multilib();
2483 return true;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002484 }
2485
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002486 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002487}
2488
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002489static void findAndroidArmMultilibs(const Driver &D,
2490 const llvm::Triple &TargetTriple,
2491 StringRef Path, const ArgList &Args,
2492 DetectedMultilibs &Result) {
2493 // Find multilibs with subdirectories like armv7-a, thumb, armv7-a/thumb.
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002494 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002495 Multilib ArmV7Multilib = makeMultilib("/armv7-a")
2496 .flag("+armv7")
2497 .flag("-thumb");
2498 Multilib ThumbMultilib = makeMultilib("/thumb")
2499 .flag("-armv7")
2500 .flag("+thumb");
2501 Multilib ArmV7ThumbMultilib = makeMultilib("/armv7-a/thumb")
2502 .flag("+armv7")
2503 .flag("+thumb");
2504 Multilib DefaultMultilib = makeMultilib("")
2505 .flag("-armv7")
2506 .flag("-thumb");
2507 MultilibSet AndroidArmMultilibs =
2508 MultilibSet()
2509 .Either(ThumbMultilib, ArmV7Multilib,
2510 ArmV7ThumbMultilib, DefaultMultilib)
2511 .FilterOut(NonExistent);
2512
2513 Multilib::flags_list Flags;
2514 llvm::StringRef Arch = Args.getLastArgValue(options::OPT_march_EQ);
2515 bool IsArmArch = TargetTriple.getArch() == llvm::Triple::arm;
2516 bool IsThumbArch = TargetTriple.getArch() == llvm::Triple::thumb;
2517 bool IsV7SubArch = TargetTriple.getSubArch() == llvm::Triple::ARMSubArch_v7;
2518 bool IsThumbMode = IsThumbArch ||
2519 Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, false) ||
2520 (IsArmArch && llvm::ARM::parseArchISA(Arch) == llvm::ARM::IK_THUMB);
2521 bool IsArmV7Mode = (IsArmArch || IsThumbArch) &&
2522 (llvm::ARM::parseArchVersion(Arch) == 7 ||
2523 (IsArmArch && Arch == "" && IsV7SubArch));
2524 addMultilibFlag(IsArmV7Mode, "armv7", Flags);
2525 addMultilibFlag(IsThumbMode, "thumb", Flags);
2526
2527 if (AndroidArmMultilibs.select(Flags, Result.SelectedMultilib))
2528 Result.Multilibs = AndroidArmMultilibs;
2529}
2530
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002531static bool findBiarchMultilibs(const Driver &D,
2532 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002533 StringRef Path, const ArgList &Args,
2534 bool NeedsBiarchSuffix,
2535 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002536 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2537 // in what would normally be GCCInstallPath and put the 64-bit
2538 // libs in a subdirectory named 64. The simple logic we follow is that
2539 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2540 // we use that. If not, and if not a biarch triple alias, we look for
2541 // crtbegin.o without the subdirectory.
2542
2543 Multilib Default;
2544 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002545 .gccSuffix("/64")
2546 .includeSuffix("/64")
2547 .flag("-m32")
2548 .flag("+m64")
2549 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002550 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002551 .gccSuffix("/32")
2552 .includeSuffix("/32")
2553 .flag("+m32")
2554 .flag("-m64")
2555 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002556 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002557 .gccSuffix("/x32")
2558 .includeSuffix("/x32")
2559 .flag("-m32")
2560 .flag("-m64")
2561 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002562
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002563 // GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a.
2564 FilterNonExistent NonExistent(
2565 Path, TargetTriple.isOSIAMCU() ? "/libgcc.a" : "/crtbegin.o", D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002566
Zinovy Nis1db95732014-07-10 15:27:19 +00002567 // Determine default multilib from: 32, 64, x32
2568 // Also handle cases such as 64 on 32, 32 on 64, etc.
2569 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002570 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002571 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002572 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002573 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002574 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002575 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002576 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002577 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002578 if (TargetTriple.isArch32Bit())
2579 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002580 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002581 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002582 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002583 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002584 }
2585
Zinovy Nis1db95732014-07-10 15:27:19 +00002586 if (Want == WANT32)
2587 Default.flag("+m32").flag("-m64").flag("-mx32");
2588 else if (Want == WANT64)
2589 Default.flag("-m32").flag("+m64").flag("-mx32");
2590 else if (Want == WANTX32)
2591 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002592 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002593 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002594
Simon Atanasyan60280b42014-05-12 07:37:51 +00002595 Result.Multilibs.push_back(Default);
2596 Result.Multilibs.push_back(Alt64);
2597 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002598 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002599
Simon Atanasyan60280b42014-05-12 07:37:51 +00002600 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002601
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002602 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002603 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002604 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002605 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002606
Simon Atanasyan60280b42014-05-12 07:37:51 +00002607 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002608 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002609
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002610 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002611 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002612 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002613
2614 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002615}
2616
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002617void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2618 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2619 const std::string &LibDir, StringRef CandidateTriple,
2620 bool NeedsBiarchSuffix) {
2621 // Solaris is a special case. The GCC installation is under
2622 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2623 // need to iterate twice.
2624 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002625 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2626 !EC && LI != LE; LI = LI.increment(EC)) {
2627 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002628 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2629
2630 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002631 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002632 continue; // Saw this path before; no need to look at it again.
2633 if (CandidateVersion.isOlderThan(4, 1, 1))
2634 continue;
2635 if (CandidateVersion <= Version)
2636 continue;
2637
2638 GCCInstallPath =
2639 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002640 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002641 continue;
2642
2643 // If we make it here there has to be at least one GCC version, let's just
2644 // use the latest one.
2645 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002646 for (vfs::directory_iterator
2647 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2648 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002649 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2650
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002651 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002652 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2653
2654 if (CandidateSubVersion > Version)
2655 Version = CandidateSubVersion;
2656 }
2657
2658 GCCTriple.setTriple(CandidateTriple);
2659
2660 GCCInstallPath += "/" + Version.Text;
2661 GCCParentLibPath = GCCInstallPath + "/../../../../";
2662
2663 IsValid = true;
2664 }
2665}
2666
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002667void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002668 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002669 const std::string &LibDir, StringRef CandidateTriple,
2670 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002671 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002672 // There are various different suffixes involving the triple we
2673 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002674 // up to the lib directory. Specifically, the number of "up" steps
2675 // in the second half of each row is 1 + the number of path separators
2676 // in the first half.
2677 const std::string LibAndInstallSuffixes[][2] = {
2678 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2679
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002680 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002681 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2682
2683 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2684 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002685
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002686 // The Freescale PPC SDK has the gcc libraries in
2687 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002688 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002689
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002690 // Ubuntu has a strange mis-matched pair of triples that this happens to
2691 // match.
2692 // FIXME: It may be worthwhile to generalize this and look for a second
2693 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002694 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2695
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002696 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2697 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2698 NeedsBiarchSuffix);
2699 return;
2700 }
2701
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002702 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002703 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2704 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002705 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002706 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002707 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002708 for (vfs::directory_iterator
2709 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2710 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002711 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002712 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002713 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002714 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002715 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002716 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002717 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002718 continue;
2719 if (CandidateVersion <= Version)
2720 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002721
Simon Atanasyan60280b42014-05-12 07:37:51 +00002722 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002723
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002724 // Android standalone toolchain could have multilibs for ARM and Thumb.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002725 // Debian mips multilibs behave more like the rest of the biarch ones,
2726 // so handle them there
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002727 if (isArmOrThumbArch(TargetArch) && TargetTriple.isAndroid()) {
2728 // It should also work without multilibs in a simplified toolchain.
2729 findAndroidArmMultilibs(D, TargetTriple, LI->getName(), Args, Detected);
2730 } else if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002731 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002732 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002733 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002734 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002735 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002736 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002737
Simon Atanasyan60280b42014-05-12 07:37:51 +00002738 Multilibs = Detected.Multilibs;
2739 SelectedMultilib = Detected.SelectedMultilib;
2740 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002741 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002742 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002743 // FIXME: We hack together the directory name here instead of
2744 // using LI to ensure stable path separators across Windows and
2745 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002746 GCCInstallPath =
2747 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2748 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002749 IsValid = true;
2750 }
2751 }
2752}
2753
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002754Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002755 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002756 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002757 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002758 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002759 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002760}
2761
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002762Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002763
Rafael Espindola7cf32212013-03-20 03:05:54 +00002764Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002765 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002766 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002767 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002768 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002769 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002770 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002771 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002772 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002773 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002774 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002775 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002776 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002777}
2778
Rafael Espindola7cf32212013-03-20 03:05:54 +00002779Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002780 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002781}
2782
Douglas Katzman95354292015-06-23 20:42:09 +00002783Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002784
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002785void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2786 // Print the information about how we detected the GCC installation.
2787 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002788 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002789}
2790
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002791bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002792 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002793}
2794
David Majnemer17f448b2015-06-28 04:23:33 +00002795bool Generic_GCC::isPICDefault() const {
2796 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2797}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002798
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002799bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002800
David Majnemer17f448b2015-06-28 04:23:33 +00002801bool Generic_GCC::isPICDefaultForced() const {
2802 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2803}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002804
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002805bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002806 switch (getTriple().getArch()) {
2807 case llvm::Triple::x86:
2808 case llvm::Triple::x86_64:
2809 case llvm::Triple::aarch64:
2810 case llvm::Triple::aarch64_be:
2811 case llvm::Triple::arm:
2812 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002813 case llvm::Triple::bpfel:
2814 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002815 case llvm::Triple::thumb:
2816 case llvm::Triple::thumbeb:
2817 case llvm::Triple::ppc:
2818 case llvm::Triple::ppc64:
2819 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002820 case llvm::Triple::systemz:
Daniel Sanderse160f832016-05-14 12:43:08 +00002821 case llvm::Triple::mips:
2822 case llvm::Triple::mipsel:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002823 return true;
Simon Dardis9edf96e2016-09-15 14:01:55 +00002824 case llvm::Triple::mips64:
2825 case llvm::Triple::mips64el:
2826 // Enabled for Debian mips64/mips64el only. Other targets are unable to
2827 // distinguish N32 from N64.
2828 if (getTriple().getEnvironment() == llvm::Triple::GNUABI64)
2829 return true;
2830 return false;
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002831 default:
2832 return false;
2833 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002834}
2835
James Y Knighta6c9ee72015-10-16 18:46:26 +00002836/// \brief Helper to add the variant paths of a libstdc++ installation.
2837bool Generic_GCC::addLibStdCXXIncludePaths(
2838 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2839 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2840 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2841 if (!getVFS().exists(Base + Suffix))
2842 return false;
2843
2844 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2845
2846 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2847 // that path exists or we have neither a GCC nor target multiarch triple, use
2848 // this vanilla search path.
2849 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2850 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2851 addSystemInclude(DriverArgs, CC1Args,
2852 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2853 } else {
2854 // Otherwise try to use multiarch naming schemes which have normalized the
2855 // triples and put the triple before the suffix.
2856 //
2857 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2858 // the target triple, so we support that here.
2859 addSystemInclude(DriverArgs, CC1Args,
2860 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2861 addSystemInclude(DriverArgs, CC1Args,
2862 Base + "/" + TargetMultiarchTriple + Suffix);
2863 }
2864
2865 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2866 return true;
2867}
2868
Kristof Beylsfb387292014-01-10 13:44:34 +00002869void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2870 ArgStringList &CC1Args) const {
2871 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002872 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002873 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002874 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002875 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002876 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002877 getTriple().getOS() == llvm::Triple::NaCl ||
2878 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2879 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002880
2881 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002882 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002883 CC1Args.push_back("-fuse-init-array");
2884}
2885
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002886/// Mips Toolchain
2887MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2888 const llvm::Triple &Triple,
2889 const ArgList &Args)
2890 : Linux(D, Triple, Args) {
2891 // Select the correct multilib according to the given arguments.
2892 DetectedMultilibs Result;
2893 findMIPSMultilibs(D, Triple, "", Args, Result);
2894 Multilibs = Result.Multilibs;
2895 SelectedMultilib = Result.SelectedMultilib;
2896
2897 // Find out the library suffix based on the ABI.
2898 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2899 getFilePaths().clear();
2900 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2901
2902 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002903 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002904}
2905
2906void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2907 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2908 if (DriverArgs.hasArg(options::OPT_nostdinc))
2909 return;
2910
2911 const Driver &D = getDriver();
2912
2913 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2914 SmallString<128> P(D.ResourceDir);
2915 llvm::sys::path::append(P, "include");
2916 addSystemInclude(DriverArgs, CC1Args, P);
2917 }
2918
2919 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2920 return;
2921
2922 const auto &Callback = Multilibs.includeDirsCallback();
2923 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002924 for (const auto &Path : Callback(SelectedMultilib))
2925 addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
2926 D.getInstalledDir() + Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002927 }
2928}
2929
2930Tool *MipsLLVMToolChain::buildLinker() const {
2931 return new tools::gnutools::Linker(*this);
2932}
2933
2934std::string MipsLLVMToolChain::computeSysRoot() const {
2935 if (!getDriver().SysRoot.empty())
2936 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2937
2938 const std::string InstalledDir(getDriver().getInstalledDir());
2939 std::string SysRootPath =
2940 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2941 if (llvm::sys::fs::exists(SysRootPath))
2942 return SysRootPath;
2943
2944 return std::string();
2945}
2946
2947ToolChain::CXXStdlibType
2948MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2949 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2950 if (A) {
2951 StringRef Value = A->getValue();
2952 if (Value != "libc++")
2953 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2954 << A->getAsString(Args);
2955 }
2956
2957 return ToolChain::CST_Libcxx;
2958}
2959
2960void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2961 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2962 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2963 DriverArgs.hasArg(options::OPT_nostdincxx))
2964 return;
2965
2966 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2967 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2968
2969 const auto &Callback = Multilibs.includeDirsCallback();
2970 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002971 for (std::string Path : Callback(SelectedMultilib)) {
2972 Path = getDriver().getInstalledDir() + Path + "/c++/v1";
2973 if (llvm::sys::fs::exists(Path)) {
2974 addSystemInclude(DriverArgs, CC1Args, Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002975 break;
2976 }
2977 }
2978 }
2979}
2980
2981void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2982 ArgStringList &CmdArgs) const {
2983 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2984 "Only -lc++ (aka libxx) is suported in this toolchain.");
2985
2986 CmdArgs.push_back("-lc++");
2987 CmdArgs.push_back("-lc++abi");
2988 CmdArgs.push_back("-lunwind");
2989}
2990
Vedant Kumar5fb00e42016-07-27 23:01:55 +00002991std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2992 StringRef Component,
2993 bool Shared) const {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002994 SmallString<128> Path(getDriver().ResourceDir);
2995 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2996 getOS());
2997 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002998 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002999 return Path.str();
3000}
3001
Tony Linthicum76329bf2011-12-12 21:14:55 +00003002/// Hexagon Toolchain
3003
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003004std::string HexagonToolChain::getHexagonTargetDir(
3005 const std::string &InstalledDir,
3006 const SmallVectorImpl<std::string> &PrefixDirs) const {
3007 std::string InstallRelDir;
3008 const Driver &D = getDriver();
3009
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003010 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003011 for (auto &I : PrefixDirs)
3012 if (D.getVFS().exists(I))
3013 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00003014
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003015 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003016 return InstallRelDir;
3017
Krzysztof Parzyszek50fd6152016-10-17 15:30:10 +00003018 return InstalledDir;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003019}
3020
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003021Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
3022 const ArgList &Args) {
3023 StringRef Gn = "";
3024 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
3025 options::OPT_msmall_data_threshold_EQ)) {
3026 Gn = A->getValue();
3027 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
3028 options::OPT_fPIC)) {
3029 Gn = "0";
3030 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00003031
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003032 unsigned G;
3033 if (!Gn.getAsInteger(10, G))
3034 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00003035
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003036 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00003037}
3038
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003039void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
3040 ToolChain::path_list &LibPaths) const {
3041 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00003042
3043 //----------------------------------------------------------------------------
3044 // -L Args
3045 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003046 for (Arg *A : Args.filtered(options::OPT_L))
3047 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003048 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00003049
3050 //----------------------------------------------------------------------------
3051 // Other standard paths
3052 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003053 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00003054 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
3055 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00003056
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003057 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
3058 D.PrefixDirs);
3059 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
3060 RootDirs.push_back(TargetDir);
3061
3062 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
3063 // Assume G0 with -shared.
3064 bool HasG0 = Args.hasArg(options::OPT_shared);
3065 if (auto G = getSmallDataThreshold(Args))
3066 HasG0 = G.getValue() == 0;
3067
3068 const std::string CpuVer = GetTargetCPUVersion(Args).str();
3069 for (auto &Dir : RootDirs) {
3070 std::string LibDir = Dir + "/hexagon/lib";
3071 std::string LibDirCpu = LibDir + '/' + CpuVer;
3072 if (HasG0) {
3073 if (HasPIC)
3074 LibPaths.push_back(LibDirCpu + "/G0/pic");
3075 LibPaths.push_back(LibDirCpu + "/G0");
3076 }
3077 LibPaths.push_back(LibDirCpu);
3078 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00003079 }
Matthew Curtise689b052012-12-06 15:46:07 +00003080}
3081
Douglas Katzman54366072015-07-27 16:53:08 +00003082HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003083 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003084 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003085 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
3086 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003087
3088 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
3089 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003090 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003091 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003092 getProgramPaths().push_back(BinDir);
3093
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003094 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00003095
3096 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
3097 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
3098 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003099 LibPaths.clear();
3100 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003101}
3102
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00003103HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00003104
Douglas Katzman54366072015-07-27 16:53:08 +00003105Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003106 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003107}
3108
Douglas Katzman54366072015-07-27 16:53:08 +00003109Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003110 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003111}
3112
Douglas Katzman54366072015-07-27 16:53:08 +00003113void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3114 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003115 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3116 DriverArgs.hasArg(options::OPT_nostdlibinc))
3117 return;
3118
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003119 const Driver &D = getDriver();
3120 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
3121 D.PrefixDirs);
3122 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003123}
3124
Douglas Katzman54366072015-07-27 16:53:08 +00003125void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
3126 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003127 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3128 DriverArgs.hasArg(options::OPT_nostdincxx))
3129 return;
3130
3131 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003132 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
3133 addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003134}
Matthew Curtisf10a5952012-12-06 14:16:43 +00003135
Matthew Curtise689b052012-12-06 15:46:07 +00003136ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00003137HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00003138 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
3139 if (!A)
3140 return ToolChain::CST_Libstdcxx;
3141
3142 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003143 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003144 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00003145
3146 return ToolChain::CST_Libstdcxx;
3147}
3148
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003149//
3150// Returns the default CPU for Hexagon. This is the default compilation target
3151// if no Hexagon processor is selected at the command-line.
3152//
3153const StringRef HexagonToolChain::GetDefaultCPU() {
3154 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003155}
3156
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003157const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
3158 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00003159 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
3160 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003161
3162 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
3163 if (CPU.startswith("hexagon"))
3164 return CPU.substr(sizeof("hexagon") - 1);
3165 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00003166}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003167// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00003168
Tom Stellard8fa33092015-07-18 01:49:05 +00003169/// AMDGPU Toolchain
3170AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
3171 const ArgList &Args)
3172 : Generic_ELF(D, Triple, Args) { }
3173
3174Tool *AMDGPUToolChain::buildLinker() const {
3175 return new tools::amdgpu::Linker(*this);
3176}
3177// End AMDGPU
3178
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003179/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00003180NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
3181 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003182 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003183
3184 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
3185 // default paths, and must instead only use the paths provided
3186 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003187 path_list &file_paths = getFilePaths();
3188 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003189
3190 file_paths.clear();
3191 prog_paths.clear();
3192
3193 // Path for library files (libc.a, ...)
3194 std::string FilePath(getDriver().Dir + "/../");
3195
3196 // Path for tools (clang, ld, etc..)
3197 std::string ProgPath(getDriver().Dir + "/../");
3198
3199 // Path for toolchain libraries (libgcc.a, ...)
3200 std::string ToolPath(getDriver().ResourceDir + "/lib/");
3201
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003202 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00003203 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003204 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00003205 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003206 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3207 file_paths.push_back(ToolPath + "i686-nacl");
3208 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003209 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003210 file_paths.push_back(FilePath + "x86_64-nacl/lib");
3211 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
3212 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3213 file_paths.push_back(ToolPath + "x86_64-nacl");
3214 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003215 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003216 file_paths.push_back(FilePath + "arm-nacl/lib");
3217 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
3218 prog_paths.push_back(ProgPath + "arm-nacl/bin");
3219 file_paths.push_back(ToolPath + "arm-nacl");
3220 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003221 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003222 file_paths.push_back(FilePath + "mipsel-nacl/lib");
3223 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
3224 prog_paths.push_back(ProgPath + "bin");
3225 file_paths.push_back(ToolPath + "mipsel-nacl");
3226 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003227 default:
3228 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003229 }
3230
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003231 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
3232}
3233
Douglas Katzman54366072015-07-27 16:53:08 +00003234void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3235 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003236 const Driver &D = getDriver();
3237 if (DriverArgs.hasArg(options::OPT_nostdinc))
3238 return;
3239
3240 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
3241 SmallString<128> P(D.ResourceDir);
3242 llvm::sys::path::append(P, "include");
3243 addSystemInclude(DriverArgs, CC1Args, P.str());
3244 }
3245
3246 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3247 return;
3248
3249 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003250 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00003251 case llvm::Triple::x86:
3252 // x86 is special because multilib style uses x86_64-nacl/include for libc
3253 // headers but the SDK wants i686-nacl/usr/include. The other architectures
3254 // have the same substring.
3255 llvm::sys::path::append(P, "i686-nacl/usr/include");
3256 addSystemInclude(DriverArgs, CC1Args, P.str());
3257 llvm::sys::path::remove_filename(P);
3258 llvm::sys::path::remove_filename(P);
3259 llvm::sys::path::remove_filename(P);
3260 llvm::sys::path::append(P, "x86_64-nacl/include");
3261 addSystemInclude(DriverArgs, CC1Args, P.str());
3262 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003263 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003264 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003265 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003266 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003267 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003268 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003269 case llvm::Triple::mipsel:
3270 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
3271 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003272 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003273 return;
3274 }
3275
3276 addSystemInclude(DriverArgs, CC1Args, P.str());
3277 llvm::sys::path::remove_filename(P);
3278 llvm::sys::path::remove_filename(P);
3279 llvm::sys::path::append(P, "include");
3280 addSystemInclude(DriverArgs, CC1Args, P.str());
3281}
3282
Douglas Katzman54366072015-07-27 16:53:08 +00003283void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3284 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003285 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3286 // if the value is libc++, and emits an error for other values.
3287 GetCXXStdlibType(Args);
3288 CmdArgs.push_back("-lc++");
3289}
3290
Douglas Katzman54366072015-07-27 16:53:08 +00003291void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3292 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003293 const Driver &D = getDriver();
3294 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3295 DriverArgs.hasArg(options::OPT_nostdincxx))
3296 return;
3297
3298 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3299 // if the value is libc++, and emits an error for other values.
3300 GetCXXStdlibType(DriverArgs);
3301
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003302 SmallString<128> P(D.Dir + "/../");
3303 switch (getTriple().getArch()) {
3304 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003305 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
3306 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003307 break;
3308 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003309 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
3310 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003311 break;
3312 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003313 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
3314 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003315 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003316 case llvm::Triple::mipsel:
3317 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
3318 addSystemInclude(DriverArgs, CC1Args, P.str());
3319 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00003320 default:
3321 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003322 }
3323}
3324
Douglas Katzman54366072015-07-27 16:53:08 +00003325ToolChain::CXXStdlibType
3326NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003327 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3328 StringRef Value = A->getValue();
3329 if (Value == "libc++")
3330 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003331 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003332 }
3333
3334 return ToolChain::CST_Libcxx;
3335}
3336
Douglas Katzman54366072015-07-27 16:53:08 +00003337std::string
3338NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
3339 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003340 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
3341 if (TheTriple.getArch() == llvm::Triple::arm &&
3342 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
3343 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
3344 return TheTriple.getTriple();
3345}
3346
Douglas Katzman54366072015-07-27 16:53:08 +00003347Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003348 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003349}
3350
Douglas Katzman54366072015-07-27 16:53:08 +00003351Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003352 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00003353 return new tools::nacltools::AssemblerARM(*this);
3354 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003355}
3356// End NaCl
3357
Chris Lattner09797542010-03-04 21:07:38 +00003358/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
3359/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
3360/// Currently does not support anything else but compilation.
3361
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003362TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00003363 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003364 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00003365 // Path mangling to find libexec
3366 std::string Path(getDriver().Dir);
3367
3368 Path += "/../libexec";
3369 getProgramPaths().push_back(Path);
3370}
3371
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00003372TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00003373
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003374bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00003375
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003376bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003377
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003378bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003379
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003380bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003381
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003382// CloudABI - CloudABI tool chain which can call ld(1) directly.
3383
3384CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
3385 const ArgList &Args)
3386 : Generic_ELF(D, Triple, Args) {
3387 SmallString<128> P(getDriver().Dir);
3388 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
3389 getFilePaths().push_back(P.str());
3390}
3391
3392void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3393 ArgStringList &CC1Args) const {
3394 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
3395 DriverArgs.hasArg(options::OPT_nostdincxx))
3396 return;
3397
3398 SmallString<128> P(getDriver().Dir);
3399 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
3400 addSystemInclude(DriverArgs, CC1Args, P.str());
3401}
3402
3403void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
3404 ArgStringList &CmdArgs) const {
3405 CmdArgs.push_back("-lc++");
3406 CmdArgs.push_back("-lc++abi");
3407 CmdArgs.push_back("-lunwind");
3408}
3409
Douglas Katzman95354292015-06-23 20:42:09 +00003410Tool *CloudABI::buildLinker() const {
3411 return new tools::cloudabi::Linker(*this);
3412}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003413
Ed Schouten610adae2016-08-11 20:03:22 +00003414bool CloudABI::isPIEDefault() const {
3415 // Only enable PIE on architectures that support PC-relative
3416 // addressing. PC-relative addressing is required, as the process
3417 // startup code must be able to relocate itself.
3418 switch (getTriple().getArch()) {
3419 case llvm::Triple::aarch64:
3420 case llvm::Triple::x86_64:
3421 return true;
3422 default:
3423 return false;
3424 }
3425}
3426
Ed Schouten51bfbe72016-02-17 18:56:20 +00003427SanitizerMask CloudABI::getSupportedSanitizers() const {
3428 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3429 Res |= SanitizerKind::SafeStack;
3430 return Res;
3431}
3432
Ed Schoutenfc79d2c2016-03-29 21:13:53 +00003433SanitizerMask CloudABI::getDefaultSanitizers() const {
3434 return SanitizerKind::SafeStack;
3435}
3436
Reid Kleckner330fb172016-05-11 16:19:05 +00003437/// Haiku - Haiku tool chain which can call as(1) and ld(1) directly.
3438
3439Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
3440 : Generic_ELF(D, Triple, Args) {
3441
3442}
3443
3444void Haiku::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3445 ArgStringList &CC1Args) const {
3446 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3447 DriverArgs.hasArg(options::OPT_nostdincxx))
3448 return;
3449
3450 switch (GetCXXStdlibType(DriverArgs)) {
3451 case ToolChain::CST_Libcxx:
3452 addSystemInclude(DriverArgs, CC1Args,
3453 getDriver().SysRoot + "/system/develop/headers/c++/v1");
3454 break;
3455 case ToolChain::CST_Libstdcxx:
3456 addSystemInclude(DriverArgs, CC1Args,
3457 getDriver().SysRoot + "/system/develop/headers/c++");
3458 addSystemInclude(DriverArgs, CC1Args,
3459 getDriver().SysRoot + "/system/develop/headers/c++/backward");
3460
3461 StringRef Triple = getTriple().str();
3462 addSystemInclude(DriverArgs, CC1Args,
3463 getDriver().SysRoot + "/system/develop/headers/c++/" +
3464 Triple);
3465 break;
3466 }
3467}
3468
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003469/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3470
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003471OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3472 const ArgList &Args)
3473 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003474 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003475 getFilePaths().push_back("/usr/lib");
3476}
3477
Rafael Espindola7cf32212013-03-20 03:05:54 +00003478Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003479 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003480}
3481
Douglas Katzman95354292015-06-23 20:42:09 +00003482Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003483
Eli Friedman9fa28852012-08-08 23:57:20 +00003484/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3485
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003486Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3487 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003488 getFilePaths().push_back(getDriver().Dir + "/../lib");
3489 getFilePaths().push_back("/usr/lib");
3490}
3491
Rafael Espindola7cf32212013-03-20 03:05:54 +00003492Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003493 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003494}
3495
Douglas Katzman95354292015-06-23 20:42:09 +00003496Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003497
Jonas Hahnfeldaae83742016-02-12 07:48:37 +00003498ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
Richard Smith51af5192014-05-01 23:24:24 +00003499 return ToolChain::CST_Libcxx;
3500}
3501
Eli Friedman9fa28852012-08-08 23:57:20 +00003502void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3503 ArgStringList &CC1Args) const {
3504 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3505 DriverArgs.hasArg(options::OPT_nostdincxx))
3506 return;
3507
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003508 switch (GetCXXStdlibType(DriverArgs)) {
3509 case ToolChain::CST_Libcxx:
3510 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003511 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003512 break;
3513 case ToolChain::CST_Libstdcxx:
3514 addSystemInclude(DriverArgs, CC1Args,
3515 getDriver().SysRoot + "/usr/include/c++/stdc++");
3516 addSystemInclude(DriverArgs, CC1Args,
3517 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003518
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003519 StringRef Triple = getTriple().str();
3520 if (Triple.startswith("amd64"))
3521 addSystemInclude(DriverArgs, CC1Args,
3522 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003523 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003524 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003525 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3526 "/usr/include/c++/stdc++/" +
3527 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003528 break;
3529 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003530}
3531
3532void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3533 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003534 switch (GetCXXStdlibType(Args)) {
3535 case ToolChain::CST_Libcxx:
3536 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003537 CmdArgs.push_back("-lc++abi");
3538 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003539 break;
3540 case ToolChain::CST_Libstdcxx:
3541 CmdArgs.push_back("-lstdc++");
3542 break;
3543 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003544}
3545
Daniel Dunbare24297c2009-03-30 21:06:03 +00003546/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3547
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003548FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3549 const ArgList &Args)
3550 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003551
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003552 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3553 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003554 if ((Triple.getArch() == llvm::Triple::x86 ||
3555 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003556 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003557 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3558 else
3559 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003560}
3561
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003562ToolChain::CXXStdlibType FreeBSD::GetDefaultCXXStdlibType() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003563 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003564 return ToolChain::CST_Libcxx;
3565 return ToolChain::CST_Libstdcxx;
3566}
3567
3568void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3569 ArgStringList &CC1Args) const {
3570 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3571 DriverArgs.hasArg(options::OPT_nostdincxx))
3572 return;
3573
3574 switch (GetCXXStdlibType(DriverArgs)) {
3575 case ToolChain::CST_Libcxx:
3576 addSystemInclude(DriverArgs, CC1Args,
3577 getDriver().SysRoot + "/usr/include/c++/v1");
3578 break;
3579 case ToolChain::CST_Libstdcxx:
3580 addSystemInclude(DriverArgs, CC1Args,
3581 getDriver().SysRoot + "/usr/include/c++/4.2");
3582 addSystemInclude(DriverArgs, CC1Args,
3583 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3584 break;
3585 }
3586}
3587
Dimitry Andric60907392016-02-14 16:08:20 +00003588void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3589 ArgStringList &CmdArgs) const {
3590 CXXStdlibType Type = GetCXXStdlibType(Args);
3591 bool Profiling = Args.hasArg(options::OPT_pg);
3592
3593 switch (Type) {
3594 case ToolChain::CST_Libcxx:
3595 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3596 break;
3597
3598 case ToolChain::CST_Libstdcxx:
3599 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3600 break;
3601 }
3602}
3603
Rafael Espindola7cf32212013-03-20 03:05:54 +00003604Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003605 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003606}
3607
Douglas Katzman95354292015-06-23 20:42:09 +00003608Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003609
Tim Northovere931f9f2015-10-30 16:30:41 +00003610bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003611 // FreeBSD uses SjLj exceptions on ARM oabi.
3612 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003613 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003614 case llvm::Triple::GNUEABI:
3615 case llvm::Triple::EABI:
3616 return false;
3617
3618 default:
3619 return (getTriple().getArch() == llvm::Triple::arm ||
3620 getTriple().getArch() == llvm::Triple::thumb);
3621 }
3622}
3623
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003624bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003625
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003626bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003627
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003628SanitizerMask FreeBSD::getSupportedSanitizers() const {
3629 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3630 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3631 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3632 getTriple().getArch() == llvm::Triple::mips64el;
3633 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3634 Res |= SanitizerKind::Address;
3635 Res |= SanitizerKind::Vptr;
3636 if (IsX86_64 || IsMIPS64) {
3637 Res |= SanitizerKind::Leak;
3638 Res |= SanitizerKind::Thread;
3639 }
3640 if (IsX86 || IsX86_64) {
3641 Res |= SanitizerKind::SafeStack;
3642 }
3643 return Res;
3644}
3645
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003646/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3647
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003648NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3649 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003650 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003651 // When targeting a 32-bit platform, try the special directory used on
3652 // 64-bit hosts, and only fall back to the main library directory if that
3653 // doesn't work.
3654 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3655 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003656 switch (Triple.getArch()) {
3657 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003658 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003659 break;
3660 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003661 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003662 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003663 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003664 switch (Triple.getEnvironment()) {
3665 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003666 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003667 getFilePaths().push_back("=/usr/lib/eabi");
3668 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003669 case llvm::Triple::EABIHF:
3670 case llvm::Triple::GNUEABIHF:
3671 getFilePaths().push_back("=/usr/lib/eabihf");
3672 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003673 default:
3674 getFilePaths().push_back("=/usr/lib/oabi");
3675 break;
3676 }
3677 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003678 case llvm::Triple::mips64:
3679 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003680 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003681 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003682 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003683 getFilePaths().push_back("=/usr/lib/64");
3684 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003685 case llvm::Triple::ppc:
3686 getFilePaths().push_back("=/usr/lib/powerpc");
3687 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003688 case llvm::Triple::sparc:
3689 getFilePaths().push_back("=/usr/lib/sparc");
3690 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003691 default:
3692 break;
3693 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003694
3695 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003696 }
3697}
3698
Rafael Espindola7cf32212013-03-20 03:05:54 +00003699Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003700 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003701}
3702
Douglas Katzman95354292015-06-23 20:42:09 +00003703Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003704
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003705ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const {
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003706 unsigned Major, Minor, Micro;
3707 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003708 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003709 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003710 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003711 case llvm::Triple::arm:
3712 case llvm::Triple::armeb:
3713 case llvm::Triple::thumb:
3714 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003715 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003716 case llvm::Triple::ppc64:
3717 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003718 case llvm::Triple::sparc:
3719 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003720 case llvm::Triple::x86:
3721 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003722 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003723 default:
3724 break;
3725 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003726 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003727 return ToolChain::CST_Libstdcxx;
3728}
3729
3730void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3731 ArgStringList &CC1Args) const {
3732 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3733 DriverArgs.hasArg(options::OPT_nostdincxx))
3734 return;
3735
3736 switch (GetCXXStdlibType(DriverArgs)) {
3737 case ToolChain::CST_Libcxx:
3738 addSystemInclude(DriverArgs, CC1Args,
3739 getDriver().SysRoot + "/usr/include/c++/");
3740 break;
3741 case ToolChain::CST_Libstdcxx:
3742 addSystemInclude(DriverArgs, CC1Args,
3743 getDriver().SysRoot + "/usr/include/g++");
3744 addSystemInclude(DriverArgs, CC1Args,
3745 getDriver().SysRoot + "/usr/include/g++/backward");
3746 break;
3747 }
3748}
3749
Chris Lattner3e2ee142010-07-07 16:01:42 +00003750/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003752Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3753 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003754 getFilePaths().push_back(getDriver().Dir + "/../lib");
3755 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003756}
3757
Rafael Espindola7cf32212013-03-20 03:05:54 +00003758Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003759 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003760}
3761
Douglas Katzman95354292015-06-23 20:42:09 +00003762Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003763
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003764static void addPathIfExists(const Driver &D, const Twine &Path,
3765 ToolChain::path_list &Paths) {
3766 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003767 Paths.push_back(Path.str());
3768}
3769
David Chisnallf571cde2012-02-15 13:39:01 +00003770/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3771
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003772Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003773 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003774 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003775
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003776 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003777
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003778 path_list &Paths = getFilePaths();
3779 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003780 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003781
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003782 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003783 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003784 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003785
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003786 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003787
3788 std::string LibPath = "/usr/lib/";
3789 switch (Triple.getArch()) {
3790 case llvm::Triple::x86:
3791 case llvm::Triple::sparc:
3792 break;
3793 case llvm::Triple::x86_64:
3794 LibPath += "amd64/";
3795 break;
3796 case llvm::Triple::sparcv9:
3797 LibPath += "sparcv9/";
3798 break;
3799 default:
3800 llvm_unreachable("Unsupported architecture");
3801 }
3802
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003803 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003804}
3805
Rafael Espindola7cf32212013-03-20 03:05:54 +00003806Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003807 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003808}
3809
Douglas Katzman95354292015-06-23 20:42:09 +00003810Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003811
Rafael Espindolad5117262015-09-09 13:36:00 +00003812void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3813 ArgStringList &CC1Args) const {
3814 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3815 DriverArgs.hasArg(options::OPT_nostdincxx))
3816 return;
3817
3818 // Include the support directory for things like xlocale and fudged system
3819 // headers.
3820 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3821
3822 if (GCCInstallation.isValid()) {
3823 GCCVersion Version = GCCInstallation.getVersion();
3824 addSystemInclude(DriverArgs, CC1Args,
3825 getDriver().SysRoot + "/usr/gcc/" +
3826 Version.MajorStr + "." +
3827 Version.MinorStr +
3828 "/include/c++/" + Version.Text);
3829 addSystemInclude(DriverArgs, CC1Args,
3830 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3831 "." + Version.MinorStr + "/include/c++/" +
3832 Version.Text + "/" +
3833 GCCInstallation.getTriple().str());
3834 }
3835}
3836
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003837/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003838
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003839enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003840 // NB: Releases of a particular Linux distro should be kept together
3841 // in this enum, because some tests are done by integer comparison against
3842 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003843 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003844 DebianLenny,
3845 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003846 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003847 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003848 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003849 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003850 RHEL5,
3851 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003852 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003853 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003854 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003855 UbuntuHardy,
3856 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003857 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003858 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003859 UbuntuLucid,
3860 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003861 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003862 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003863 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003864 UbuntuQuantal,
3865 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003866 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003867 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003868 UbuntuUtopic,
3869 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003870 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003871 UbuntuXenial,
Sylvestre Ledrud3078e72016-07-19 14:00:57 +00003872 UbuntuYakkety,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003873 UnknownDistro
3874};
3875
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003876static bool IsRedhat(enum Distro Distro) {
Rafael Espindola52fe8962016-05-09 13:13:50 +00003877 return Distro == Fedora || (Distro >= RHEL5 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003878}
3879
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003880static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003881
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003882static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003883 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003884}
3885
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003886static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledrud3078e72016-07-19 14:00:57 +00003887 return Distro >= UbuntuHardy && Distro <= UbuntuYakkety;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003888}
3889
Michal Gorny16f37c32016-10-20 20:45:40 +00003890static Distro DetectDistro(vfs::FileSystem &VFS) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003891 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
Michal Gorny16f37c32016-10-20 20:45:40 +00003892 VFS.getBufferForFile("/etc/lsb-release");
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003893 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003894 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003895 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003896 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003897 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003898 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003899 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3900 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3901 .Case("hardy", UbuntuHardy)
3902 .Case("intrepid", UbuntuIntrepid)
3903 .Case("jaunty", UbuntuJaunty)
3904 .Case("karmic", UbuntuKarmic)
3905 .Case("lucid", UbuntuLucid)
3906 .Case("maverick", UbuntuMaverick)
3907 .Case("natty", UbuntuNatty)
3908 .Case("oneiric", UbuntuOneiric)
3909 .Case("precise", UbuntuPrecise)
3910 .Case("quantal", UbuntuQuantal)
3911 .Case("raring", UbuntuRaring)
3912 .Case("saucy", UbuntuSaucy)
3913 .Case("trusty", UbuntuTrusty)
3914 .Case("utopic", UbuntuUtopic)
3915 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003916 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003917 .Case("xenial", UbuntuXenial)
Sylvestre Ledrud3078e72016-07-19 14:00:57 +00003918 .Case("yakkety", UbuntuYakkety)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003919 .Default(UnknownDistro);
Rafael Espindola52fe8962016-05-09 13:13:50 +00003920 if (Version != UnknownDistro)
3921 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003922 }
3923
Michal Gorny16f37c32016-10-20 20:45:40 +00003924 File = VFS.getBufferForFile("/etc/redhat-release");
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003925 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003926 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003927 if (Data.startswith("Fedora release"))
3928 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003929 if (Data.startswith("Red Hat Enterprise Linux") ||
Rafael Espindola52fe8962016-05-09 13:13:50 +00003930 Data.startswith("CentOS") ||
3931 Data.startswith("Scientific Linux")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003932 if (Data.find("release 7") != StringRef::npos)
3933 return RHEL7;
3934 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003935 return RHEL6;
3936 else if (Data.find("release 5") != StringRef::npos)
3937 return RHEL5;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003938 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003939 return UnknownDistro;
3940 }
3941
Michal Gorny16f37c32016-10-20 20:45:40 +00003942 File = VFS.getBufferForFile("/etc/debian_version");
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003943 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003944 StringRef Data = File.get()->getBuffer();
Michal Gorny0a2cd962016-10-20 20:13:35 +00003945 // Contents: < major.minor > or < codename/sid >
3946 int MajorVersion;
3947 if (!Data.split('.').first.getAsInteger(10, MajorVersion)) {
3948 switch (MajorVersion) {
3949 case 5:
3950 return DebianLenny;
3951 case 6:
3952 return DebianSqueeze;
3953 case 7:
3954 return DebianWheezy;
3955 case 8:
3956 return DebianJessie;
3957 case 9:
3958 return DebianStretch;
3959 default:
3960 return UnknownDistro;
3961 }
3962 }
3963 return llvm::StringSwitch<Distro>(Data.split("\n").first)
3964 .Case("squeeze/sid", DebianSqueeze)
3965 .Case("wheezy/sid", DebianWheezy)
3966 .Case("jessie/sid", DebianJessie)
3967 .Case("stretch/sid", DebianStretch)
3968 .Default(UnknownDistro);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003969 }
3970
Michal Gorny16f37c32016-10-20 20:45:40 +00003971 if (VFS.exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003972 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003973
Michal Gorny16f37c32016-10-20 20:45:40 +00003974 if (VFS.exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003975 return Exherbo;
3976
Michal Gorny16f37c32016-10-20 20:45:40 +00003977 if (VFS.exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003978 return ArchLinux;
3979
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003980 return UnknownDistro;
3981}
3982
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003983/// \brief Get our best guess at the multiarch triple for a target.
3984///
3985/// Debian-based systems are starting to use a multiarch setup where they use
3986/// a target-triple directory in the library and header search paths.
3987/// Unfortunately, this triple does not align with the vanilla target triple,
3988/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003989static std::string getMultiarchTriple(const Driver &D,
3990 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003991 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003992 llvm::Triple::EnvironmentType TargetEnvironment =
3993 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003994
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003995 // For most architectures, just use whatever we have rather than trying to be
3996 // clever.
3997 switch (TargetTriple.getArch()) {
3998 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003999 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004000
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004001 // We use the existence of '/lib/<triple>' as a directory to detect some
4002 // common linux triples that don't quite match the Clang triple for both
4003 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
4004 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00004005 case llvm::Triple::arm:
4006 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004007 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004008 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004009 return "arm-linux-gnueabihf";
4010 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004011 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004012 return "arm-linux-gnueabi";
4013 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004014 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004015 case llvm::Triple::armeb:
4016 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004017 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004018 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004019 return "armeb-linux-gnueabihf";
4020 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004021 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004022 return "armeb-linux-gnueabi";
4023 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004024 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004025 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004026 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004027 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004028 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004029 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00004030 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004031 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004032 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004033 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004034 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00004035 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004036 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00004037 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004038 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00004039 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004040 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00004041 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004042 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00004043 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004044 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00004045 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004046 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00004047 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004048 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00004049 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004050 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004051 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004052 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004053 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004054 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004055 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004056 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004057 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004058 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004059 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004060 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004061 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004062 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004063 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004064 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00004065 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004066 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004067 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004068 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004069 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004070 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004071 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004072 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00004073 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004074 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00004075 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004076 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00004077 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004078 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00004079 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004080 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00004081 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004082 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00004083 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004084 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004085 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004086 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004087 return "s390x-linux-gnu";
4088 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004089 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004090 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004091}
4092
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004093static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00004094 if (isMipsArch(Triple.getArch())) {
Simon Atanasyan603018a2016-07-19 07:09:48 +00004095 if (Triple.isAndroid()) {
4096 StringRef CPUName;
4097 StringRef ABIName;
4098 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
4099 if (CPUName == "mips32r6")
4100 return "libr6";
4101 if (CPUName == "mips32r2")
4102 return "libr2";
4103 }
Chandler Carruthda797042013-10-29 10:27:30 +00004104 // lib32 directory has a special meaning on MIPS targets.
4105 // It contains N32 ABI binaries. Use this folder if produce
4106 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004107 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00004108 return "lib32";
4109 return Triple.isArch32Bit() ? "lib" : "lib64";
4110 }
Simon Atanasyand4413882012-09-14 11:27:24 +00004111
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004112 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00004113 // using that variant while targeting other architectures causes problems
4114 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004115 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00004116 // them when we know we may need it.
4117 //
4118 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004119 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00004120 // GCCInstallationDetector, but that is a more significant refactoring.
4121 if (Triple.getArch() == llvm::Triple::x86 ||
4122 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00004123 return "lib32";
4124
Zinovy Nis1db95732014-07-10 15:27:19 +00004125 if (Triple.getArch() == llvm::Triple::x86_64 &&
4126 Triple.getEnvironment() == llvm::Triple::GNUX32)
4127 return "libx32";
4128
Simon Atanasyand4413882012-09-14 11:27:24 +00004129 return Triple.isArch32Bit() ? "lib" : "lib64";
4130}
4131
Simon Atanasyan2834a222016-05-22 18:18:07 +00004132static void addMultilibsFilePaths(const Driver &D, const MultilibSet &Multilibs,
4133 const Multilib &Multilib,
4134 StringRef InstallPath,
4135 ToolChain::path_list &Paths) {
4136 if (const auto &PathsCallback = Multilibs.filePathsCallback())
4137 for (const auto &Path : PathsCallback(Multilib))
4138 addPathIfExists(D, InstallPath + Path, Paths);
4139}
4140
Rafael Espindola1af7c212012-02-19 01:38:32 +00004141Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004142 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004143 GCCInstallation.init(Triple, Args);
4144 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004145 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00004146 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00004147 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004148
Rafael Espindola10a63c22013-07-03 14:14:00 +00004149 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00004150 // least) put various tools in a triple-prefixed directory off of the parent
4151 // of the GCC installation. We use the GCC triple here to ensure that we end
4152 // up with tools that support the same amount of cross compiling as the
4153 // detected GCC installation. For example, if we find a GCC installation
4154 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
4155 // used to target i386.
4156 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00004157 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00004158 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004159 GCCInstallation.getTriple().str() + "/bin")
4160 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00004161
Michal Gorny16f37c32016-10-20 20:45:40 +00004162 Distro Distro = DetectDistro(D.getVFS());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004163
Rafael Espindola10a63c22013-07-03 14:14:00 +00004164 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00004165 ExtraOpts.push_back("-z");
4166 ExtraOpts.push_back("relro");
4167 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004168
Douglas Gregord9bb1522011-03-06 19:11:49 +00004169 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004170 ExtraOpts.push_back("-X");
4171
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004172 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004173 const bool IsMips = isMipsArch(Arch);
4174
4175 if (IsMips && !SysRoot.empty())
4176 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00004177
Chandler Carruth0b842912011-12-09 04:45:18 +00004178 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
4179 // and the MIPS ABI require .dynsym to be sorted in different ways.
4180 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
4181 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00004182 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004183 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00004184 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00004185 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00004186 ExtraOpts.push_back("--hash-style=gnu");
4187
Rafael Espindola10a63c22013-07-03 14:14:00 +00004188 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00004189 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
4190 ExtraOpts.push_back("--hash-style=both");
4191 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004192
Rafael Espindola52fe8962016-05-09 13:13:50 +00004193 if (IsRedhat(Distro) && Distro != RHEL5 && Distro != RHEL6)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004194 ExtraOpts.push_back("--no-add-needed");
4195
Rafael Espindola5ed89d42016-06-03 17:26:16 +00004196#ifdef ENABLE_LINKER_BUILD_ID
4197 ExtraOpts.push_back("--build-id");
4198#endif
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004199
Rafael Espindola10a63c22013-07-03 14:14:00 +00004200 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00004201 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00004202
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004203 // The selection of paths to try here is designed to match the patterns which
4204 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
4205 // This was determined by running GCC in a fake filesystem, creating all
4206 // possible permutations of these directories, and seeing which ones it added
4207 // to the link paths.
4208 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00004209
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004210 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004211 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004212
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004213 // Add the multilib suffixed paths where they are available.
4214 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00004215 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00004216 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004217 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan2834a222016-05-22 18:18:07 +00004218 const MultilibSet &Multilibs = GCCInstallation.getMultilibs();
4219
4220 // Add toolchain / multilib specific file paths.
4221 addMultilibsFilePaths(D, Multilibs, Multilib,
4222 GCCInstallation.getInstallPath(), Paths);
Simon Atanasyan53fefd12012-10-03 17:46:38 +00004223
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004224 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00004225 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004226 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004227 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004228
4229 // GCC cross compiling toolchains will install target libraries which ship
4230 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
4231 // any part of the GCC installation in
4232 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
4233 // debatable, but is the reality today. We need to search this tree even
4234 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004235 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004236 // installation that is *not* within the system root to ensure two things:
4237 //
4238 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00004239 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004240 // appropriate rpath.
4241 // 2) There must not be libraries installed into
4242 // <prefix>/<triple>/<libdir> unless they should be preferred over
4243 // those within the system root.
4244 //
4245 // Note that this matches the GCC behavior. See the below comment for where
4246 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004247 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
4248 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004249 Paths);
4250
Chandler Carruth69a125b2012-04-06 16:32:06 +00004251 // If the GCC installation we found is inside of the sysroot, we want to
4252 // prefer libraries installed in the parent prefix of the GCC installation.
4253 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00004254 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004255 // This usually happens when there is an external cross compiler on the
4256 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004257 // the cross. Note that GCC does include some of these directories in some
4258 // configurations but this seems somewhere between questionable and simply
4259 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004260 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004261 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
4262 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00004263 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004264 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004265
4266 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004267 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00004268 // those searched.
4269 // FIXME: It's not clear whether we should use the driver's installed
4270 // directory ('Dir' below) or the ResourceDir.
4271 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004272 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
4273 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004274 }
4275
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004276 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
4277 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
4278 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
4279 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004280
Chandler Carruthb427c562013-06-22 11:35:51 +00004281 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004282 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00004283 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004284 addPathIfExists(D,
4285 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004286 "/../../" + OSLibDir,
4287 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00004288
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004289 // Add the 'other' biarch variant path
4290 Multilib BiarchSibling;
4291 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004292 addPathIfExists(D, GCCInstallation.getInstallPath() +
4293 BiarchSibling.gccSuffix(),
4294 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004295 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00004296
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004297 // See comments above on the multilib variant for details of why this is
4298 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004299 const std::string &LibPath = GCCInstallation.getParentLibPath();
4300 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
4301 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004302 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
4303 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004304 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004305
4306 // See comments above on the multilib variant for details of why this is
4307 // only included from within the sysroot.
4308 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004309 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004310 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004311
4312 // Similar to the logic for GCC above, if we are currently running Clang
4313 // inside of the requested system root, add its parent library path to those
4314 // searched.
4315 // FIXME: It's not clear whether we should use the driver's installed
4316 // directory ('Dir' below) or the ResourceDir.
4317 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004318 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004319
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004320 addPathIfExists(D, SysRoot + "/lib", Paths);
4321 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004322}
4323
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004324bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00004325
Douglas Katzman95354292015-06-23 20:42:09 +00004326Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00004327
4328Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004329 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00004330}
4331
Simon Atanasyana0d89572013-10-05 14:37:55 +00004332std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004333 if (!getDriver().SysRoot.empty())
4334 return getDriver().SysRoot;
4335
4336 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
4337 return std::string();
4338
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004339 // Standalone MIPS toolchains use different names for sysroot folder
4340 // and put it into different places. Here we try to check some known
4341 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004342
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004343 const StringRef InstallDir = GCCInstallation.getInstallPath();
4344 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004345 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004346
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004347 std::string Path =
4348 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
4349 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004350
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004351 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004352 return Path;
4353
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004354 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004355
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004356 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004357 return Path;
4358
4359 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004360}
4361
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004362std::string Linux::getDynamicLinker(const ArgList &Args) const {
4363 const llvm::Triple::ArchType Arch = getArch();
4364 const llvm::Triple &Triple = getTriple();
4365
Michal Gorny16f37c32016-10-20 20:45:40 +00004366 const enum Distro Distro = DetectDistro(getDriver().getVFS());
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004367
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004368 if (Triple.isAndroid())
4369 return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker";
Diana Picus86db9e72016-08-08 08:27:36 +00004370
4371 if (Triple.isMusl()) {
Rafael Espindola0fa66802016-06-24 21:35:06 +00004372 std::string ArchName;
Diana Picus86db9e72016-08-08 08:27:36 +00004373 bool IsArm = false;
4374
Rafael Espindola0fa66802016-06-24 21:35:06 +00004375 switch (Arch) {
Diana Picus86db9e72016-08-08 08:27:36 +00004376 case llvm::Triple::arm:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004377 case llvm::Triple::thumb:
4378 ArchName = "arm";
Diana Picus86db9e72016-08-08 08:27:36 +00004379 IsArm = true;
Rafael Espindola0fa66802016-06-24 21:35:06 +00004380 break;
Diana Picus86db9e72016-08-08 08:27:36 +00004381 case llvm::Triple::armeb:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004382 case llvm::Triple::thumbeb:
4383 ArchName = "armeb";
Diana Picus86db9e72016-08-08 08:27:36 +00004384 IsArm = true;
Rafael Espindola0fa66802016-06-24 21:35:06 +00004385 break;
4386 default:
4387 ArchName = Triple.getArchName().str();
4388 }
Diana Picus86db9e72016-08-08 08:27:36 +00004389 if (IsArm &&
4390 (Triple.getEnvironment() == llvm::Triple::MuslEABIHF ||
4391 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard))
Rafael Espindola0fa66802016-06-24 21:35:06 +00004392 ArchName += "hf";
4393
4394 return "/lib/ld-musl-" + ArchName + ".so.1";
4395 }
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004396
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004397 std::string LibDir;
4398 std::string Loader;
4399
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004400 switch (Arch) {
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004401 default:
4402 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004403
4404 case llvm::Triple::aarch64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004405 LibDir = "lib";
4406 Loader = "ld-linux-aarch64.so.1";
4407 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004408 case llvm::Triple::aarch64_be:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004409 LibDir = "lib";
4410 Loader = "ld-linux-aarch64_be.so.1";
4411 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004412 case llvm::Triple::arm:
4413 case llvm::Triple::thumb:
4414 case llvm::Triple::armeb:
4415 case llvm::Triple::thumbeb: {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004416 const bool HF =
4417 Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
4418 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004419
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004420 LibDir = "lib";
4421 Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";
4422 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004423 }
4424 case llvm::Triple::mips:
4425 case llvm::Triple::mipsel:
4426 case llvm::Triple::mips64:
4427 case llvm::Triple::mips64el: {
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004428 bool LE = (Triple.getArch() == llvm::Triple::mipsel) ||
4429 (Triple.getArch() == llvm::Triple::mips64el);
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004430 bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple);
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004431
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004432 LibDir = "lib" + tools::mips::getMipsABILibSuffix(Args, Triple);
4433
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004434 if (tools::mips::isUCLibc(Args))
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004435 Loader = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004436 else if (!Triple.hasEnvironment() &&
4437 Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies)
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004438 Loader = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004439 else
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004440 Loader = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004441
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004442 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004443 }
4444 case llvm::Triple::ppc:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004445 LibDir = "lib";
4446 Loader = "ld.so.1";
4447 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004448 case llvm::Triple::ppc64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004449 LibDir = "lib64";
4450 Loader =
4451 (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "ld64.so.2" : "ld64.so.1";
4452 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004453 case llvm::Triple::ppc64le:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004454 LibDir = "lib64";
4455 Loader =
4456 (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2";
4457 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004458 case llvm::Triple::sparc:
4459 case llvm::Triple::sparcel:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004460 LibDir = "lib";
4461 Loader = "ld-linux.so.2";
4462 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004463 case llvm::Triple::sparcv9:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004464 LibDir = "lib64";
4465 Loader = "ld-linux.so.2";
4466 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004467 case llvm::Triple::systemz:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004468 LibDir = "lib";
4469 Loader = "ld64.so.1";
4470 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004471 case llvm::Triple::x86:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004472 LibDir = "lib";
4473 Loader = "ld-linux.so.2";
4474 break;
4475 case llvm::Triple::x86_64: {
4476 bool X32 = Triple.getEnvironment() == llvm::Triple::GNUX32;
4477
4478 LibDir = X32 ? "libx32" : "lib64";
4479 Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2";
4480 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004481 }
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004482 }
4483
4484 if (Distro == Exherbo && (Triple.getVendor() == llvm::Triple::UnknownVendor ||
4485 Triple.getVendor() == llvm::Triple::PC))
4486 return "/usr/" + Triple.str() + "/lib/" + Loader;
4487 return "/" + LibDir + "/" + Loader;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004488}
4489
Chandler Carrutha796f532011-11-05 20:17:13 +00004490void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4491 ArgStringList &CC1Args) const {
4492 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00004493 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00004494
4495 if (DriverArgs.hasArg(options::OPT_nostdinc))
4496 return;
4497
4498 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004499 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004500
4501 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00004502 SmallString<128> P(D.ResourceDir);
4503 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00004504 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00004505 }
4506
4507 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
4508 return;
4509
4510 // Check for configure-time C include directories.
4511 StringRef CIncludeDirs(C_INCLUDE_DIRS);
4512 if (CIncludeDirs != "") {
4513 SmallVector<StringRef, 5> dirs;
4514 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004515 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00004516 StringRef Prefix =
4517 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004518 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00004519 }
4520 return;
4521 }
4522
4523 // Lacking those, try to detect the correct set of system includes for the
4524 // target triple.
4525
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004526 // Add include directories specific to the selected multilib set and multilib.
4527 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00004528 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004529 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00004530 for (const auto &Path : Callback(GCCInstallation.getMultilib()))
4531 addExternCSystemIncludeIfExists(
4532 DriverArgs, CC1Args, GCCInstallation.getInstallPath() + Path);
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004533 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004534 }
4535
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004536 // Implement generic Debian multiarch support.
4537 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004538 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004539
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004540 // FIXME: These are older forms of multiarch. It's not clear that they're
4541 // in use in any released version of Debian, so we should consider
4542 // removing them.
4543 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004544 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004545 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004546
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004547 // FIXME: These are older forms of multiarch. It's not clear that they're
4548 // in use in any released version of Debian, so we should consider
4549 // removing them.
4550 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
4551 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00004552 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004553 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004554 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004555 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004556 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004557 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004558 const StringRef ARMEBMultiarchIncludeDirs[] = {
4559 "/usr/include/armeb-linux-gnueabi"};
4560 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
4561 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004562 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00004563 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004564 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004565 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004566 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004567 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004568 "/usr/include/mips64el-linux-gnu",
4569 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004570 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004571 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004572 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004573 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004574 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004575 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004576 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004577 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004578 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004579 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004580 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
4581 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004582 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004583 switch (getTriple().getArch()) {
4584 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004585 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004586 break;
4587 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004588 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004589 break;
4590 case llvm::Triple::aarch64:
4591 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00004592 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004593 break;
4594 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004595 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004596 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4597 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
4598 else
4599 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004600 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004601 case llvm::Triple::armeb:
4602 case llvm::Triple::thumbeb:
4603 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4604 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
4605 else
4606 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
4607 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004608 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00004609 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004610 break;
4611 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00004612 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004613 break;
4614 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004615 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004616 break;
4617 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004618 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004619 break;
4620 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004621 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004622 break;
4623 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004624 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004625 break;
4626 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004627 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004628 break;
4629 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004630 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004631 break;
4632 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004633 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004634 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004635 case llvm::Triple::systemz:
4636 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4637 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004638 default:
4639 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004640 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004641 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004642 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004643 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004644 break;
4645 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004646 }
4647
4648 if (getTriple().getOS() == llvm::Triple::RTEMS)
4649 return;
4650
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004651 // Add an include of '/include' directly. This isn't provided by default by
4652 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4653 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004654 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004655
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004656 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004657}
4658
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004659static std::string DetectLibcxxIncludePath(StringRef base) {
4660 std::error_code EC;
4661 int MaxVersion = 0;
4662 std::string MaxVersionString = "";
4663 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4664 LI = LI.increment(EC)) {
4665 StringRef VersionText = llvm::sys::path::filename(LI->path());
4666 int Version;
4667 if (VersionText[0] == 'v' &&
4668 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4669 if (Version > MaxVersion) {
4670 MaxVersion = Version;
4671 MaxVersionString = VersionText;
4672 }
4673 }
4674 }
4675 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4676}
4677
Chandler Carrutha796f532011-11-05 20:17:13 +00004678void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4679 ArgStringList &CC1Args) const {
4680 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4681 DriverArgs.hasArg(options::OPT_nostdincxx))
4682 return;
4683
Chandler Carruthf4701732011-11-07 09:01:17 +00004684 // Check if libc++ has been enabled and provide its include paths if so.
4685 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004686 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004687 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Yaron Keren5439b642016-05-17 19:01:16 +00004688 // If this is a development, non-installed, clang, libcxx will
4689 // not be found at ../include/c++ but it likely to be found at
4690 // one of the following two locations:
4691 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/local/include/c++"),
4692 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++") };
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004693 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004694 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004695 continue;
4696 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004697 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004698 break;
4699 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004700 return;
4701 }
4702
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004703 // We need a detected GCC installation on Linux to provide libstdc++'s
4704 // headers. We handled the libc++ case above.
4705 if (!GCCInstallation.isValid())
4706 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004707
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004708 // By default, look for the C++ headers in an include directory adjacent to
4709 // the lib directory of the GCC installation. Note that this is expect to be
4710 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4711 StringRef LibDir = GCCInstallation.getParentLibPath();
4712 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004713 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004714 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004715 const std::string GCCMultiarchTriple = getMultiarchTriple(
4716 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004717 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004718 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004719 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004720
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004721 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004722 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004723 "/c++/" + Version.Text, TripleStr,
4724 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004725 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004726 return;
4727
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004728 // Otherwise, fall back on a bunch of options which don't use multiarch
4729 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004730 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004731 // Gentoo is weird and places its headers inside the GCC install,
4732 // so if the first attempt to find the headers fails, try these patterns.
Chandler Carruth81296fb2016-05-08 07:59:56 +00004733 InstallDir.str() + "/include/g++-v" + Version.Text,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004734 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4735 Version.MinorStr,
4736 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4737 // Android standalone toolchain has C++ headers in yet another place.
4738 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4739 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4740 // without a subdirectory corresponding to the gcc version.
4741 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004742 };
4743
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004744 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004745 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4746 /*GCCMultiarchTriple*/ "",
4747 /*TargetMultiarchTriple*/ "",
4748 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004749 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004750 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004751}
4752
Artem Belevichfa11ab52015-11-17 22:28:46 +00004753void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4754 ArgStringList &CC1Args) const {
Justin Lebar49ec1462016-10-11 17:36:03 +00004755 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
4756 // Add cuda_wrappers/* to our system include path. This lets us wrap
4757 // standard library headers.
4758 SmallString<128> P(getDriver().ResourceDir);
4759 llvm::sys::path::append(P, "include");
4760 llvm::sys::path::append(P, "cuda_wrappers");
4761 addSystemInclude(DriverArgs, CC1Args, P);
4762 }
4763
Artem Belevichfa11ab52015-11-17 22:28:46 +00004764 if (DriverArgs.hasArg(options::OPT_nocudainc))
4765 return;
4766
Justin Lebar423019d2016-04-16 00:11:11 +00004767 if (!CudaInstallation.isValid()) {
4768 getDriver().Diag(diag::err_drv_no_cuda_installation);
4769 return;
Artem Belevich86017332015-11-17 22:28:55 +00004770 }
Justin Lebar423019d2016-04-16 00:11:11 +00004771
4772 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
4773 CC1Args.push_back("-include");
4774 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevichfa11ab52015-11-17 22:28:46 +00004775}
4776
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00004777void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs,
4778 ArgStringList &CC1Args) const {
4779 if (GCCInstallation.isValid()) {
4780 CC1Args.push_back("-isystem");
4781 CC1Args.push_back(DriverArgs.MakeArgString(
4782 GCCInstallation.getParentLibPath() + "/../" +
4783 GCCInstallation.getTriple().str() + "/include"));
4784 }
4785}
4786
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004787bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004788
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004789SanitizerMask Linux::getSupportedSanitizers() const {
4790 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4791 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4792 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4793 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004794 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4795 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004796 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4797 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004798 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4799 Res |= SanitizerKind::Address;
4800 Res |= SanitizerKind::KernelAddress;
4801 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004802 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004803 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004804 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004805 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004806 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004807 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004808 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004809 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004810 Res |= SanitizerKind::Memory;
Sagar Thakurc9113e42016-09-07 12:23:15 +00004811 if (IsX86_64 || IsMIPS64)
Derek Bruening256c2e12016-04-21 21:32:04 +00004812 Res |= SanitizerKind::Efficiency;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004813 if (IsX86 || IsX86_64) {
4814 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004815 }
4816 return Res;
4817}
4818
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004819void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
Xinliang David Li170cd102015-10-27 05:15:35 +00004820 llvm::opt::ArgStringList &CmdArgs) const {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004821 if (!needsProfileRT(Args)) return;
Xinliang David Li170cd102015-10-27 05:15:35 +00004822
4823 // Add linker option -u__llvm_runtime_variable to cause runtime
4824 // initialization module to be linked in.
4825 if (!Args.hasArg(options::OPT_coverage))
4826 CmdArgs.push_back(Args.MakeArgString(
4827 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004828 ToolChain::addProfileRTLibs(Args, CmdArgs);
Xinliang David Li170cd102015-10-27 05:15:35 +00004829}
4830
Petr Hosek62e1d232016-10-06 06:08:09 +00004831/// Fuchsia - Fuchsia tool chain which can call as(1) and ld(1) directly.
4832
4833Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple,
4834 const ArgList &Args)
4835 : Generic_ELF(D, Triple, Args) {
4836
4837 getFilePaths().push_back(D.SysRoot + "/lib");
4838 getFilePaths().push_back(D.ResourceDir + "/lib/fuchsia");
4839
4840 // Use LLD by default.
4841 DefaultLinker = "lld";
4842}
4843
4844Tool *Fuchsia::buildAssembler() const {
4845 return new tools::gnutools::Assembler(*this);
4846}
4847
4848Tool *Fuchsia::buildLinker() const {
4849 return new tools::fuchsia::Linker(*this);
4850}
4851
4852ToolChain::RuntimeLibType Fuchsia::GetRuntimeLibType(
4853 const ArgList &Args) const {
4854 if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) {
4855 StringRef Value = A->getValue();
4856 if (Value != "compiler-rt")
4857 getDriver().Diag(diag::err_drv_invalid_rtlib_name)
4858 << A->getAsString(Args);
4859 }
4860
4861 return ToolChain::RLT_CompilerRT;
4862}
4863
4864ToolChain::CXXStdlibType
4865Fuchsia::GetCXXStdlibType(const ArgList &Args) const {
4866 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
4867 StringRef Value = A->getValue();
4868 if (Value != "libc++")
4869 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
4870 << A->getAsString(Args);
4871 }
4872
4873 return ToolChain::CST_Libcxx;
4874}
4875
4876void Fuchsia::addClangTargetOptions(const ArgList &DriverArgs,
4877 ArgStringList &CC1Args) const {
4878 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4879 options::OPT_fno_use_init_array, true))
4880 CC1Args.push_back("-fuse-init-array");
4881}
4882
4883void Fuchsia::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4884 ArgStringList &CC1Args) const {
4885 const Driver &D = getDriver();
4886
4887 if (DriverArgs.hasArg(options::OPT_nostdinc))
4888 return;
4889
4890 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
4891 SmallString<128> P(D.ResourceDir);
4892 llvm::sys::path::append(P, "include");
4893 addSystemInclude(DriverArgs, CC1Args, P);
4894 }
4895
4896 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
4897 return;
4898
4899 // Check for configure-time C include directories.
4900 StringRef CIncludeDirs(C_INCLUDE_DIRS);
4901 if (CIncludeDirs != "") {
4902 SmallVector<StringRef, 5> dirs;
4903 CIncludeDirs.split(dirs, ":");
4904 for (StringRef dir : dirs) {
4905 StringRef Prefix =
4906 llvm::sys::path::is_absolute(dir) ? StringRef(D.SysRoot) : "";
4907 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
4908 }
4909 return;
4910 }
4911
4912 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
4913}
4914
4915void Fuchsia::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4916 ArgStringList &CC1Args) const {
4917 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4918 DriverArgs.hasArg(options::OPT_nostdincxx))
4919 return;
4920
4921 addSystemInclude(DriverArgs, CC1Args,
4922 getDriver().SysRoot + "/include/c++/v1");
4923}
4924
4925void Fuchsia::AddCXXStdlibLibArgs(const ArgList &Args,
4926 ArgStringList &CmdArgs) const {
4927 (void) GetCXXStdlibType(Args);
4928 CmdArgs.push_back("-lc++");
4929 CmdArgs.push_back("-lc++abi");
4930 CmdArgs.push_back("-lunwind");
4931}
4932
Daniel Dunbarcc912342009-05-02 18:28:39 +00004933/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4934
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004935DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4936 const ArgList &Args)
4937 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004938
4939 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004940 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004941 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004942 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004943
Daniel Dunbar083edf72009-12-21 18:54:17 +00004944 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004945 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004946 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004947}
4948
Rafael Espindola7cf32212013-03-20 03:05:54 +00004949Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004950 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004951}
4952
4953Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004954 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004955}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004956
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004957/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4958/// which isn't properly a linker but nonetheless performs the step of stitching
4959/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004960
4961CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4962 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004963 : Linux(D, Triple, Args) {
4964 if (CudaInstallation.isValid())
4965 getProgramPaths().push_back(CudaInstallation.getBinPath());
4966}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004967
4968void
4969CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4970 llvm::opt::ArgStringList &CC1Args) const {
4971 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4972 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004973
Justin Lebard3a44f62016-04-05 18:26:20 +00004974 if (DriverArgs.hasFlag(options::OPT_fcuda_flush_denormals_to_zero,
4975 options::OPT_fno_cuda_flush_denormals_to_zero, false))
4976 CC1Args.push_back("-fcuda-flush-denormals-to-zero");
4977
Justin Lebar91f6f072016-05-23 20:19:56 +00004978 if (DriverArgs.hasFlag(options::OPT_fcuda_approx_transcendentals,
4979 options::OPT_fno_cuda_approx_transcendentals, false))
4980 CC1Args.push_back("-fcuda-approx-transcendentals");
4981
Artem Belevich34f481a2015-11-17 22:28:50 +00004982 if (DriverArgs.hasArg(options::OPT_nocudalib))
4983 return;
4984
Artem Belevich02a1e972016-08-02 23:12:51 +00004985 StringRef GpuArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
4986 assert(!GpuArch.empty() && "Must have an explicit GPU arch.");
4987 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(GpuArch);
Artem Belevich34f481a2015-11-17 22:28:50 +00004988
Artem Belevich02a1e972016-08-02 23:12:51 +00004989 if (LibDeviceFile.empty()) {
4990 getDriver().Diag(diag::err_drv_no_cuda_libdevice) << GpuArch;
4991 return;
Artem Belevich34f481a2015-11-17 22:28:50 +00004992 }
Artem Belevich02a1e972016-08-02 23:12:51 +00004993
4994 CC1Args.push_back("-mlink-cuda-bitcode");
4995 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4996
4997 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4998 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4999 // came with CUDA-7.0.
5000 CC1Args.push_back("-target-feature");
5001 CC1Args.push_back("+ptx42");
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005002}
5003
Justin Lebarc43ad9e2016-07-07 18:17:52 +00005004void CudaToolChain::AddCudaIncludeArgs(const ArgList &DriverArgs,
5005 ArgStringList &CC1Args) const {
5006 // Check our CUDA version if we're going to include the CUDA headers.
5007 if (!DriverArgs.hasArg(options::OPT_nocudainc) &&
Justin Lebarf3997712016-07-07 18:24:28 +00005008 !DriverArgs.hasArg(options::OPT_no_cuda_version_check)) {
Justin Lebarc43ad9e2016-07-07 18:17:52 +00005009 StringRef Arch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
5010 assert(!Arch.empty() && "Must have an explicit GPU arch.");
5011 CudaInstallation.CheckCudaVersionSupportsArch(StringToCudaArch(Arch));
5012 }
5013 Linux::AddCudaIncludeArgs(DriverArgs, CC1Args);
5014}
5015
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005016llvm::opt::DerivedArgList *
5017CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
Mehdi Aminic50b1a22016-10-07 21:27:26 +00005018 StringRef BoundArch) const {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005019 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
5020 const OptTable &Opts = getDriver().getOpts();
5021
5022 for (Arg *A : Args) {
5023 if (A->getOption().matches(options::OPT_Xarch__)) {
5024 // Skip this argument unless the architecture matches BoundArch
Mehdi Aminic50b1a22016-10-07 21:27:26 +00005025 if (BoundArch.empty() || A->getValue(0) != BoundArch)
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005026 continue;
5027
5028 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
5029 unsigned Prev = Index;
5030 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
5031
5032 // If the argument parsing failed or more than one argument was
5033 // consumed, the -Xarch_ argument's parameter tried to consume
5034 // extra arguments. Emit an error and ignore.
5035 //
5036 // We also want to disallow any options which would alter the
5037 // driver behavior; that isn't going to work in our model. We
5038 // use isDriverOption() as an approximation, although things
5039 // like -O4 are going to slip through.
5040 if (!XarchArg || Index > Prev + 1) {
5041 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
5042 << A->getAsString(Args);
5043 continue;
5044 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
5045 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
5046 << A->getAsString(Args);
5047 continue;
5048 }
5049 XarchArg->setBaseArg(A);
5050 A = XarchArg.release();
5051 DAL->AddSynthesizedArg(A);
5052 }
5053 DAL->append(A);
5054 }
5055
Mehdi Aminic50b1a22016-10-07 21:27:26 +00005056 if (!BoundArch.empty()) {
Justin Lebar4db224e2016-06-15 23:46:11 +00005057 DAL->eraseArg(options::OPT_march_EQ);
Justin Lebar21e5d4f2016-01-14 21:41:27 +00005058 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Justin Lebar4db224e2016-06-15 23:46:11 +00005059 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005060 return DAL;
5061}
5062
Justin Lebar21e5d4f2016-01-14 21:41:27 +00005063Tool *CudaToolChain::buildAssembler() const {
5064 return new tools::NVPTX::Assembler(*this);
5065}
5066
5067Tool *CudaToolChain::buildLinker() const {
5068 return new tools::NVPTX::Linker(*this);
5069}
5070
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005071/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00005072XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
5073 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005074 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005075 // ProgramPaths are found via 'PATH' environment variable.
5076}
5077
Douglas Katzman54366072015-07-27 16:53:08 +00005078Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00005079 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005080}
5081
Douglas Katzman54366072015-07-27 16:53:08 +00005082Tool *XCoreToolChain::buildLinker() const {
5083 return new tools::XCore::Linker(*this);
5084}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005085
Douglas Katzman54366072015-07-27 16:53:08 +00005086bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005087
Douglas Katzman54366072015-07-27 16:53:08 +00005088bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005089
Douglas Katzman54366072015-07-27 16:53:08 +00005090bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005091
Douglas Katzman54366072015-07-27 16:53:08 +00005092bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005093
Douglas Katzman54366072015-07-27 16:53:08 +00005094bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005095
Douglas Katzman54366072015-07-27 16:53:08 +00005096void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
5097 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005098 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
5099 DriverArgs.hasArg(options::OPT_nostdlibinc))
5100 return;
5101 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
5102 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005103 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005104 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
5105 ArrayRef<StringRef> DirVec(Dirs);
5106 addSystemIncludes(DriverArgs, CC1Args, DirVec);
5107 }
5108}
5109
Douglas Katzman54366072015-07-27 16:53:08 +00005110void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
5111 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005112 CC1Args.push_back("-nostdsysteminc");
5113}
5114
Douglas Katzman54366072015-07-27 16:53:08 +00005115void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
5116 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005117 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00005118 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
5119 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005120 return;
5121 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
5122 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005123 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005124 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
5125 ArrayRef<StringRef> DirVec(Dirs);
5126 addSystemIncludes(DriverArgs, CC1Args, DirVec);
5127 }
5128}
5129
Douglas Katzman54366072015-07-27 16:53:08 +00005130void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
5131 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005132 // We don't output any lib args. This is handled by xcc.
5133}
Douglas Katzman84a75642015-06-19 14:55:19 +00005134
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005135MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
5136 const ArgList &Args)
Douglas Katzman5eddc232016-05-09 19:09:59 +00005137 : Generic_ELF(D, Triple, Args) {
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005138 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
5139 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
5140 // This won't work to find gcc. Instead we give the installation detector an
5141 // extra triple, which is preferable to further hacks of the logic that at
5142 // present is based solely on getArch(). In particular, it would be wrong to
5143 // choose the myriad installation when targeting a non-myriad sparc install.
5144 switch (Triple.getArch()) {
5145 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00005146 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
5147 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005148 case llvm::Triple::sparc:
5149 case llvm::Triple::sparcel:
5150 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00005151 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005152 }
Douglas Katzman674a3122015-11-18 16:24:46 +00005153
5154 if (GCCInstallation.isValid()) {
5155 // The contents of LibDir are independent of the version of gcc.
Douglas Katzman87da5f42016-07-25 16:36:02 +00005156 // This contains libc, libg, libm, libstdc++, libssp.
5157 // The 'ma1x00' and 'nofpu' variants are irrelevant.
Douglas Katzman674a3122015-11-18 16:24:46 +00005158 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
Douglas Katzman87da5f42016-07-25 16:36:02 +00005159 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
Douglas Katzman674a3122015-11-18 16:24:46 +00005160 addPathIfExists(D, LibDir, getFilePaths());
5161
5162 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
5163 // These files are tied to a particular version of gcc.
5164 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
Douglas Katzman674a3122015-11-18 16:24:46 +00005165 addPathIfExists(D, CompilerSupportDir, getFilePaths());
5166 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005167}
5168
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00005169MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005170
Douglas Katzmanb1278f32015-09-17 21:20:16 +00005171void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
5172 ArgStringList &CC1Args) const {
5173 if (!DriverArgs.hasArg(options::OPT_nostdinc))
5174 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
5175}
5176
Eric Christopherefef8ef2015-12-07 22:43:05 +00005177void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
5178 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00005179 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
5180 DriverArgs.hasArg(options::OPT_nostdincxx))
5181 return;
5182
Douglas Katzman69d7cf02016-10-19 17:30:40 +00005183 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
5184 std::string Path(getDriver().getInstalledDir());
5185 Path += "/../include/c++/v1";
5186 addSystemInclude(DriverArgs, CC1Args, Path);
5187 } else {
5188 StringRef LibDir = GCCInstallation.getParentLibPath();
5189 const GCCVersion &Version = GCCInstallation.getVersion();
5190 StringRef TripleStr = GCCInstallation.getTriple().str();
5191 const Multilib &Multilib = GCCInstallation.getMultilib();
5192 addLibStdCXXIncludePaths(
5193 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
5194 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
5195 }
James Y Knighta6c9ee72015-10-16 18:46:26 +00005196}
5197
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005198// MyriadToolChain handles several triples:
5199// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
5200Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
5201 // The inherited method works fine if not targeting the SHAVE.
5202 if (!isShaveCompilation(getTriple()))
5203 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00005204 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00005205 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00005206 case Action::CompileJobClass:
5207 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00005208 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00005209 return Compiler.get();
5210 case Action::AssembleJobClass:
5211 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00005212 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00005213 return Assembler.get();
5214 default:
5215 return ToolChain::getTool(JA.getKind());
5216 }
5217}
5218
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005219Tool *MyriadToolChain::buildLinker() const {
5220 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00005221}
Dan Gohmanc2853072015-09-03 22:51:53 +00005222
Douglas Katzman3972f9e2016-09-09 18:20:49 +00005223SanitizerMask MyriadToolChain::getSupportedSanitizers() const {
5224 return SanitizerKind::Address;
5225}
5226
Dan Gohman52816862015-12-16 23:30:41 +00005227WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
5228 const llvm::opt::ArgList &Args)
5229 : ToolChain(D, Triple, Args) {
Dan Gohman57b62c52016-02-22 19:26:15 +00005230
5231 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
5232 getFilePaths().push_back(
5233 getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64"));
5234
Dan Gohman52816862015-12-16 23:30:41 +00005235 // Use LLD by default.
5236 DefaultLinker = "lld";
5237}
5238
Dan Gohmanc2853072015-09-03 22:51:53 +00005239bool WebAssembly::IsMathErrnoDefault() const { return false; }
5240
5241bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
5242
5243bool WebAssembly::UseObjCMixedDispatch() const { return true; }
5244
5245bool WebAssembly::isPICDefault() const { return false; }
5246
5247bool WebAssembly::isPIEDefault() const { return false; }
5248
5249bool WebAssembly::isPICDefaultForced() const { return false; }
5250
5251bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
5252
5253// TODO: Support Objective C stuff.
5254bool WebAssembly::SupportsObjCGC() const { return false; }
5255
5256bool WebAssembly::hasBlocksRuntime() const { return false; }
5257
5258// TODO: Support profiling.
5259bool WebAssembly::SupportsProfiling() const { return false; }
5260
Dan Gohman52816862015-12-16 23:30:41 +00005261bool WebAssembly::HasNativeLLVMSupport() const { return true; }
5262
Dan Gohmanc2853072015-09-03 22:51:53 +00005263void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
5264 ArgStringList &CC1Args) const {
5265 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
5266 options::OPT_fno_use_init_array, true))
5267 CC1Args.push_back("-fuse-init-array");
5268}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005269
Dan Gohman6ad8f612016-01-14 16:00:13 +00005270ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
5271 return ToolChain::RLT_CompilerRT;
5272}
5273
5274ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
5275 return ToolChain::CST_Libcxx;
5276}
5277
5278void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
5279 ArgStringList &CC1Args) const {
5280 if (!DriverArgs.hasArg(options::OPT_nostdinc))
5281 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
5282}
5283
5284void WebAssembly::AddClangCXXStdlibIncludeArgs(
5285 const llvm::opt::ArgList &DriverArgs,
5286 llvm::opt::ArgStringList &CC1Args) const {
5287 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
5288 !DriverArgs.hasArg(options::OPT_nostdincxx))
5289 addSystemInclude(DriverArgs, CC1Args,
5290 getDriver().SysRoot + "/include/c++/v1");
5291}
5292
Dan Gohman52816862015-12-16 23:30:41 +00005293Tool *WebAssembly::buildLinker() const {
5294 return new tools::wasm::Linker(*this);
5295}
5296
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005297PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
5298 : Generic_ELF(D, Triple, Args) {
5299 if (Args.hasArg(options::OPT_static))
5300 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
5301
Paul Robinson9d613612016-05-16 17:22:25 +00005302 // Determine where to find the PS4 libraries. We use SCE_ORBIS_SDK_DIR
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005303 // if it exists; otherwise use the driver's installation path, which
5304 // should be <SDK_DIR>/host_tools/bin.
5305
5306 SmallString<512> PS4SDKDir;
Paul Robinson9d613612016-05-16 17:22:25 +00005307 if (const char *EnvValue = getenv("SCE_ORBIS_SDK_DIR")) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005308 if (!llvm::sys::fs::exists(EnvValue))
5309 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
5310 PS4SDKDir = EnvValue;
5311 } else {
5312 PS4SDKDir = getDriver().Dir;
5313 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00005314 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005315
Eric Christopherefef8ef2015-12-07 22:43:05 +00005316 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005317 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00005318 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005319 // If -isysroot was passed, use that as the SDK base path.
5320 std::string PrefixDir;
5321 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5322 PrefixDir = A->getValue();
5323 if (!llvm::sys::fs::exists(PrefixDir))
5324 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
5325 } else
5326 PrefixDir = PS4SDKDir.str();
5327
5328 SmallString<512> PS4SDKIncludeDir(PrefixDir);
5329 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
5330 if (!Args.hasArg(options::OPT_nostdinc) &&
5331 !Args.hasArg(options::OPT_nostdlibinc) &&
5332 !Args.hasArg(options::OPT_isysroot) &&
5333 !Args.hasArg(options::OPT__sysroot_EQ) &&
5334 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
5335 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
5336 << "PS4 system headers" << PS4SDKIncludeDir;
5337 }
5338
5339 SmallString<512> PS4SDKLibDir(PS4SDKDir);
5340 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
5341 if (!Args.hasArg(options::OPT_nostdlib) &&
5342 !Args.hasArg(options::OPT_nodefaultlibs) &&
5343 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
5344 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
5345 !Args.hasArg(options::OPT_emit_ast) &&
5346 !llvm::sys::fs::exists(PS4SDKLibDir)) {
5347 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
5348 << "PS4 system libraries" << PS4SDKLibDir;
5349 return;
5350 }
5351 getFilePaths().push_back(PS4SDKLibDir.str());
5352}
5353
5354Tool *PS4CPU::buildAssembler() const {
5355 return new tools::PS4cpu::Assemble(*this);
5356}
5357
5358Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
5359
5360bool PS4CPU::isPICDefault() const { return true; }
5361
5362bool PS4CPU::HasNativeLLVMSupport() const { return true; }
5363
5364SanitizerMask PS4CPU::getSupportedSanitizers() const {
5365 SanitizerMask Res = ToolChain::getSupportedSanitizers();
5366 Res |= SanitizerKind::Address;
5367 Res |= SanitizerKind::Vptr;
5368 return Res;
5369}
David L Kreitzerd397ea42016-10-14 20:44:33 +00005370
5371Contiki::Contiki(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
5372 : Generic_ELF(D, Triple, Args) {}
5373
5374SanitizerMask Contiki::getSupportedSanitizers() const {
5375 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
5376 SanitizerMask Res = ToolChain::getSupportedSanitizers();
5377 if (IsX86)
5378 Res |= SanitizerKind::SafeStack;
5379 return Res;
5380}