blob: 6f55a3b593907a794eba24dea5ba3a0a4f5e5a0f [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
Tim Northover157d9112014-01-16 08:48:16 +000057types::ID MachO::LookupTypeForExtension(const char *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
Tim Northover157d9112014-01-16 08:48:16 +0000292void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000293 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000294 bool IsEmbedded, bool AddRPath) const {
295 SmallString<128> Dir(getDriver().ResourceDir);
296 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
297
298 SmallString<128> P(Dir);
299 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000300
Eric Christopherc235d0c62011-06-22 17:41:40 +0000301 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000302 // not have compiler-rt checked out or integrated into their build (unless
303 // we explicitly force linking with this library).
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000304 if (AlwaysLink || getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000305 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000306
307 // Adding the rpaths might negatively interact when other rpaths are involved,
308 // so we should make sure we add the rpaths last, after all user-specified
309 // rpaths. This is currently true from this place, but we need to be
310 // careful if this function is ever called before user's rpaths are emitted.
311 if (AddRPath) {
312 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
313
314 // Add @executable_path to rpath to support having the dylib copied with
315 // the executable.
316 CmdArgs.push_back("-rpath");
317 CmdArgs.push_back("@executable_path");
318
319 // Add the path to the resource dir to rpath to support using the dylib
320 // from the default location without copying.
321 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000322 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000323 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000324}
325
Chris Bienemane60e7c22016-04-29 22:28:34 +0000326StringRef Darwin::getPlatformFamily() const {
327 switch (TargetPlatform) {
328 case DarwinPlatformKind::MacOS:
329 return "MacOSX";
330 case DarwinPlatformKind::IPhoneOS:
331 case DarwinPlatformKind::IPhoneOSSimulator:
332 return "iPhone";
333 case DarwinPlatformKind::TvOS:
334 case DarwinPlatformKind::TvOSSimulator:
335 return "AppleTV";
336 case DarwinPlatformKind::WatchOS:
337 case DarwinPlatformKind::WatchOSSimulator:
338 return "Watch";
339 }
340 llvm_unreachable("Unsupported platform");
341}
342
343StringRef Darwin::getSDKName(StringRef isysroot) {
344 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
345 llvm::sys::path::const_iterator SDKDir;
346 auto BeginSDK = llvm::sys::path::begin(isysroot);
347 auto EndSDK = llvm::sys::path::end(isysroot);
348 for (auto IT = BeginSDK; IT != EndSDK; ++IT) {
349 StringRef SDK = *IT;
350 if (SDK.endswith(".sdk"))
351 return SDK.slice(0, SDK.size() - 4);
352 }
353 return "";
354}
355
Anna Zakse67b4022016-02-02 02:04:48 +0000356StringRef Darwin::getOSLibraryNameSuffix() const {
357 switch(TargetPlatform) {
358 case DarwinPlatformKind::MacOS:
359 return "osx";
360 case DarwinPlatformKind::IPhoneOS:
361 return "ios";
362 case DarwinPlatformKind::IPhoneOSSimulator:
363 return "iossim";
364 case DarwinPlatformKind::TvOS:
365 return "tvos";
366 case DarwinPlatformKind::TvOSSimulator:
367 return "tvossim";
368 case DarwinPlatformKind::WatchOS:
369 return "watchos";
370 case DarwinPlatformKind::WatchOSSimulator:
371 return "watchossim";
372 }
373 llvm_unreachable("Unsupported platform");
374}
375
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000376void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000377 ArgStringList &CmdArgs) const {
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000378 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000379
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000380 AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.profile_") +
381 getOSLibraryNameSuffix() + ".a").str(),
382 /*AlwaysLink*/ true);
Justin Bognerc7701242015-05-12 05:44:36 +0000383}
384
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000385void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
386 ArgStringList &CmdArgs,
387 StringRef Sanitizer) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000388 AddLinkRuntimeLib(
389 Args, CmdArgs,
Anna Zakse67b4022016-02-02 02:04:48 +0000390 (Twine("libclang_rt.") + Sanitizer + "_" +
391 getOSLibraryNameSuffix() + "_dynamic.dylib").str(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000392 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
393 /*AddRPath*/ true);
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000394}
395
Jonas Hahnfeldd196fa52016-07-27 08:15:54 +0000396ToolChain::RuntimeLibType DarwinClang::GetRuntimeLibType(
397 const ArgList &Args) const {
398 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
399 StringRef Value = A->getValue();
400 if (Value != "compiler-rt")
401 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
402 << Value << "darwin";
403 }
404
405 return ToolChain::RLT_CompilerRT;
406}
407
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000408void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
Daniel Dunbar6276f992009-09-18 08:15:13 +0000409 ArgStringList &CmdArgs) const {
Jonas Hahnfeldd196fa52016-07-27 08:15:54 +0000410 // Call once to ensure diagnostic is printed if wrong value was specified
411 GetRuntimeLibType(Args);
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000412
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000413 // Darwin doesn't support real static executables, don't link any runtime
414 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000415 if (Args.hasArg(options::OPT_static) ||
416 Args.hasArg(options::OPT_fapple_kext) ||
417 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000418 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000419
420 // Reject -static-libgcc for now, we can deal with this when and if someone
421 // cares. This is useful in situations where someone wants to statically link
422 // something like libstdc++, and needs its runtime support routines.
423 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000424 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000425 return;
426 }
427
Peter Collingbourne32701642013-11-01 18:16:25 +0000428 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000429 if (Sanitize.needsAsanRt())
430 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
431 if (Sanitize.needsUbsanRt())
432 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000433 if (Sanitize.needsTsanRt())
434 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Peter Collingbournedc134532016-01-16 00:31:22 +0000435 if (Sanitize.needsStatsRt()) {
436 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
437 AddLinkRuntimeLib(Args, CmdArgs,
438 (Twine("libclang_rt.stats_client_") + OS + ".a").str(),
439 /*AlwaysLink=*/true);
440 AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");
441 }
Derek Bruening256c2e12016-04-21 21:32:04 +0000442 if (Sanitize.needsEsanRt())
443 AddLinkSanitizerLibArgs(Args, CmdArgs, "esan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000444
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000445 // Otherwise link libSystem, then the dynamic runtime library, and finally any
446 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000447 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000448
449 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000450 if (isTargetWatchOSBased()) {
451 // We currently always need a static runtime library for watchOS.
452 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
453 } else if (isTargetTvOSBased()) {
454 // We currently always need a static runtime library for tvOS.
455 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
456 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000457 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
458 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000459 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000460 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000461 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000462 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000463
Daniel Dunbard1076382011-04-18 23:48:36 +0000464 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000465 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000466 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000467 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000468 // The dynamic runtime library was merged with libSystem for 10.6 and
469 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000470 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000471 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000472 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000473 CmdArgs.push_back("-lgcc_s.10.5");
474
Chris Bieneman90743412016-08-17 21:54:30 +0000475 // Originally for OS X, we thought we would only need a static runtime
476 // library when targeting 10.4, to provide versions of the static functions
477 // which were omitted from 10.4.dylib. This led to the creation of the 10.4
478 // builtins library.
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000479 //
480 // Unfortunately, that turned out to not be true, because Darwin system
481 // headers can still use eprintf on i386, and it is not exported from
482 // libSystem. Therefore, we still must provide a runtime library just for
483 // the tiny tiny handful of projects that *might* use that symbol.
Chris Bieneman90743412016-08-17 21:54:30 +0000484 //
485 // Then over time, we figured out it was useful to add more things to the
486 // runtime so we created libclang_rt.osx.a to provide new functions when
487 // deploying to old OS builds, and for a long time we had both eprintf and
488 // osx builtin libraries. Which just seems excessive. So with PR 28855, we
489 // are removing the eprintf library and expecting eprintf to be provided by
490 // the OS X builtins library.
491 if (isMacosxVersionLT(10, 5))
Eric Christopherc235d0c62011-06-22 17:41:40 +0000492 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Chris Bieneman90743412016-08-17 21:54:30 +0000493 else
Eric Christopherc235d0c62011-06-22 17:41:40 +0000494 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000495 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000496}
497
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000498void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000499 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000500
Daniel Dunbar455a0492012-08-17 18:43:50 +0000501 // Support allowing the SDKROOT environment variable used by xcrun and other
502 // Xcode tools to define the default sysroot, by making it the default for
503 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000504 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
505 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000506 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000507 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
508 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000509 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000510 // We only use this value as the default if it is an absolute path,
511 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000512 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000513 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000514 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000515 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000516 }
517 }
518 }
519
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000520 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000521 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000522 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
523 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000524
Tim Northover6f3ff222015-10-30 16:30:27 +0000525 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000526 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000527 << OSXVersion->getAsString(Args)
528 << (iOSVersion ? iOSVersion :
529 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
530 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
531 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
532 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
533 << iOSVersion->getAsString(Args)
534 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
535 TvOSVersion = WatchOSVersion = nullptr;
536 } else if (TvOSVersion && WatchOSVersion) {
537 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
538 << TvOSVersion->getAsString(Args)
539 << WatchOSVersion->getAsString(Args);
540 WatchOSVersion = nullptr;
541 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000542 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000543 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000544 std::string OSXTarget;
545 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000546 std::string TvOSTarget;
547 std::string WatchOSTarget;
548
Chad Rosier64707fe2011-08-31 20:56:25 +0000549 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
550 OSXTarget = env;
551 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
552 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000553 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
554 TvOSTarget = env;
555 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
556 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000557
Steven Wu7a1372c2015-06-25 01:59:35 +0000558 // If there is no command-line argument to specify the Target version and
559 // no environment variable defined, see if we can set the default based
560 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000561 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Frederic Riss3ad83bd2016-01-12 23:47:59 +0000562 TvOSTarget.empty() && Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000563 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000564 StringRef isysroot = A->getValue();
Chris Bienemane60e7c22016-04-29 22:28:34 +0000565 StringRef SDK = getSDKName(isysroot);
566 if (SDK.size() > 0) {
Steven Wu7a1372c2015-06-25 01:59:35 +0000567 // Slice the version number out.
568 // Version number is between the first and the last number.
569 size_t StartVer = SDK.find_first_of("0123456789");
570 size_t EndVer = SDK.find_last_of("0123456789");
571 if (StartVer != StringRef::npos && EndVer > StartVer) {
572 StringRef Version = SDK.slice(StartVer, EndVer + 1);
573 if (SDK.startswith("iPhoneOS") ||
574 SDK.startswith("iPhoneSimulator"))
575 iOSTarget = Version;
576 else if (SDK.startswith("MacOSX"))
577 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000578 else if (SDK.startswith("WatchOS") ||
579 SDK.startswith("WatchSimulator"))
580 WatchOSTarget = Version;
581 else if (SDK.startswith("AppleTVOS") ||
582 SDK.startswith("AppleTVSimulator"))
583 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000584 }
585 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000586 }
587 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000588
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000589 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000590 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000591 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
592 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000593 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000594 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000595 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000596 MachOArchName == "arm64") {
597 getTriple().getiOSVersion(Major, Minor, Micro);
598 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
599 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000600 } else if (MachOArchName == "armv7k") {
601 getTriple().getWatchOSVersion(Major, Minor, Micro);
602 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
603 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000604 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
605 MachOArchName != "armv7em") {
606 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
607 getDriver().Diag(diag::err_drv_invalid_darwin_version)
608 << getTriple().getOSName();
609 }
610 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
611 << Micro;
612 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000613 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000614
Tim Northover6f3ff222015-10-30 16:30:27 +0000615 // Do not allow conflicts with the watchOS target.
616 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
617 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
618 << "WATCHOS_DEPLOYMENT_TARGET"
619 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
620 "TVOS_DEPLOYMENT_TARGET");
621 }
622
623 // Do not allow conflicts with the tvOS target.
624 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
625 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
626 << "TVOS_DEPLOYMENT_TARGET"
627 << "IPHONEOS_DEPLOYMENT_TARGET";
628 }
629
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000630 // Allow conflicts among OSX and iOS for historical reasons, but choose the
631 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000632 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
633 !WatchOSTarget.empty() ||
634 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000635 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000636 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000637 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000638 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000639 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000640 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000641 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000642
Chad Rosier64707fe2011-08-31 20:56:25 +0000643 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000644 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000645 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000646 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000647 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000648 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000649 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000650 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000651 } else if (!TvOSTarget.empty()) {
652 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
653 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
654 Args.append(TvOSVersion);
655 } else if (!WatchOSTarget.empty()) {
656 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
657 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
658 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000659 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000660 }
Mike Stump11289f42009-09-09 15:08:12 +0000661
Tim Northover9c7e0352013-12-12 11:55:52 +0000662 DarwinPlatformKind Platform;
663 if (OSXVersion)
664 Platform = MacOS;
665 else if (iOSVersion)
666 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000667 else if (TvOSVersion)
668 Platform = TvOS;
669 else if (WatchOSVersion)
670 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000671 else
Tim Northover157d9112014-01-16 08:48:16 +0000672 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000673
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000674 // Set the tool chain target information.
675 unsigned Major, Minor, Micro;
676 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000677 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000678 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
679 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000680 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
681 HadExtra) ||
682 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000683 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000684 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000685 } else if (Platform == IPhoneOS) {
686 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000687 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
688 HadExtra) ||
Bob Wilson4cf27c42016-07-18 20:29:14 +0000689 HadExtra || Major >= 100 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000690 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000691 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000692 } else if (Platform == TvOS) {
693 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
694 Micro, HadExtra) || HadExtra ||
Bob Wilson4cf27c42016-07-18 20:29:14 +0000695 Major >= 100 || Minor >= 100 || Micro >= 100)
Tim Northover6f3ff222015-10-30 16:30:27 +0000696 getDriver().Diag(diag::err_drv_invalid_version_number)
697 << TvOSVersion->getAsString(Args);
698 } else if (Platform == WatchOS) {
699 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
700 Micro, HadExtra) || HadExtra ||
701 Major >= 10 || Minor >= 100 || Micro >= 100)
702 getDriver().Diag(diag::err_drv_invalid_version_number)
703 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000704 } else
705 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000706
Bob Wilson7f294b52014-10-10 23:10:10 +0000707 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000708 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
709 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000710 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000711 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
712 getTriple().getArch() == llvm::Triple::x86_64))
713 Platform = TvOSSimulator;
714 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
715 getTriple().getArch() == llvm::Triple::x86_64))
716 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000717
Tim Northover9c7e0352013-12-12 11:55:52 +0000718 setTarget(Platform, Major, Minor, Micro);
Chris Bienemane60e7c22016-04-29 22:28:34 +0000719
720 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
721 StringRef SDK = getSDKName(A->getValue());
722 if (SDK.size() > 0) {
723 size_t StartVer = SDK.find_first_of("0123456789");
724 StringRef SDKName = SDK.slice(0, StartVer);
725 if (!SDKName.startswith(getPlatformFamily()))
726 getDriver().Diag(diag::warn_incompatible_sysroot)
727 << SDKName << getPlatformFamily();
728 }
729 }
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000730}
731
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000732void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000733 ArgStringList &CmdArgs) const {
734 CXXStdlibType Type = GetCXXStdlibType(Args);
735
736 switch (Type) {
737 case ToolChain::CST_Libcxx:
738 CmdArgs.push_back("-lc++");
739 break;
740
Hans Wennborgdcfba332015-10-06 23:40:43 +0000741 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000742 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
743 // it was previously found in the gcc lib dir. However, for all the Darwin
744 // platforms we care about it was -lstdc++.6, so we search for that
745 // explicitly if we can't see an obvious -lstdc++ candidate.
746
747 // Check in the sysroot first.
748 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000749 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000750 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000751
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000752 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000753 llvm::sys::path::remove_filename(P);
754 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000755 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000756 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000757 return;
758 }
759 }
760 }
761
762 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000763 // FIXME: This should be removed someday when we don't have to care about
764 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000765 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
766 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000767 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
768 return;
769 }
770
771 // Otherwise, let the linker search.
772 CmdArgs.push_back("-lstdc++");
773 break;
774 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000775}
776
Shantonu Senafeb03b2010-09-17 18:39:08 +0000777void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
778 ArgStringList &CmdArgs) const {
Shantonu Senafeb03b2010-09-17 18:39:08 +0000779 // For Darwin platforms, use the compiler-rt-based support library
780 // instead of the gcc-provided one (which is also incidentally
781 // only present in the gcc lib dir, which makes it hard to find).
782
Rafael Espindola358256c2013-06-26 02:13:00 +0000783 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000784 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000785
786 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000787 if (isTargetWatchOS()) {
788 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
789 } else if (isTargetTvOS()) {
790 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
791 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000792 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000793 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000794 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000795 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000796
Shantonu Senafeb03b2010-09-17 18:39:08 +0000797 // For now, allow missing resource libraries to support developers who may
798 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000799 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000800 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000801}
802
Tim Northover157d9112014-01-16 08:48:16 +0000803DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
Mehdi Aminic50b1a22016-10-07 21:27:26 +0000804 StringRef BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000805 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
806 const OptTable &Opts = getDriver().getOpts();
807
808 // FIXME: We really want to get out of the tool chain level argument
809 // translation business, as it makes the driver functionality much
810 // more opaque. For now, we follow gcc closely solely for the
811 // purpose of easily achieving feature parity & testability. Once we
812 // have something that works, we should reevaluate each translation
813 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000814
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000815 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000816 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000817 // Skip this argument unless the architecture matches either the toolchain
818 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000819 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000820 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
821 if (!(XarchArch == getArch() ||
Mehdi Aminic50b1a22016-10-07 21:27:26 +0000822 (!BoundArch.empty() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000823 XarchArch ==
824 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000825 continue;
826
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000827 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000828 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000829 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000830 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000831
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000832 // If the argument parsing failed or more than one argument was
833 // consumed, the -Xarch_ argument's parameter tried to consume
834 // extra arguments. Emit an error and ignore.
835 //
836 // We also want to disallow any options which would alter the
837 // driver behavior; that isn't going to work in our model. We
838 // use isDriverOption() as an approximation, although things
839 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000840 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000841 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000842 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000843 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000844 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000845 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000846 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000847 continue;
848 }
849
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000850 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000851
Nico Webera04d5f82014-05-11 17:27:13 +0000852 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000853 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000854
855 // Linker input arguments require custom handling. The problem is that we
856 // have already constructed the phase actions, so we can not treat them as
857 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000858 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000859 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000860 for (const char *Value : A->getValues()) {
861 DAL->AddSeparateArg(
862 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000863 }
864 continue;
865 }
Mike Stump11289f42009-09-09 15:08:12 +0000866 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000867
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000868 // Sob. These is strictly gcc compatible for the time being. Apple
869 // gcc translates options twice, which means that self-expanding
870 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000871 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000872 default:
873 DAL->append(A);
874 break;
875
876 case options::OPT_mkernel:
877 case options::OPT_fapple_kext:
878 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000879 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000880 break;
Mike Stump11289f42009-09-09 15:08:12 +0000881
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000882 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000883 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000884 break;
885
886 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000887 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000888 DAL->AddFlagArg(
889 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000890 break;
891
892 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000893 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000894 DAL->AddFlagArg(
895 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000896 break;
897
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000898 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000899 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000900 break;
901
902 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000903 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000904 break;
905
906 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000907 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000908 break;
909
910 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000911 DAL->AddFlagArg(A,
912 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000913 break;
914
915 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000916 DAL->AddFlagArg(
917 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000918 break;
919
920 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000921 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000922 break;
923
924 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000925 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000926 break;
927 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000928 }
929
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000930 if (getTriple().getArch() == llvm::Triple::x86 ||
931 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000932 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000933 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
934 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000935
936 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000937 // how the driver driver works.
Mehdi Aminic50b1a22016-10-07 21:27:26 +0000938 if (!BoundArch.empty()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000939 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000940 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
941 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000942
943 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
944 // which defines the list of which architectures we accept.
945 if (Name == "ppc")
946 ;
947 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000948 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000949 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000950 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000951 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000952 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000953 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000954 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000955 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000956 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000957 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000958 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000959 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000960 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000961 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000962 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000963
Bill Schmidt778d3872013-07-26 01:36:11 +0000964 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000965 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000966
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000967 else if (Name == "i386")
968 ;
969 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000970 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000971 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000972 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000973 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000974 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000975 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000976 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000977 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000978 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000979 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000980 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000981 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000982 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000983
984 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000985 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000986 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000987 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
988 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000989 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000990
991 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000992 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000993 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000994 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000995 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000996 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000997 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000998 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000999 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +00001000 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +00001001 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +00001002 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001003 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +00001004 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +00001005 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +00001006 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001007 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +00001008 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +00001009 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +00001010 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001011 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +00001012 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001013 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +00001014
Tim Northover157d9112014-01-16 08:48:16 +00001015 return DAL;
1016}
1017
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001018void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001019 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001020 // Embedded targets are simple at the moment, not supporting sanitizers and
1021 // with different libraries for each member of the product { static, PIC } x
1022 // { hard-float, soft-float }
1023 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001024 CompilerRT +=
1025 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
1026 ? "hard"
1027 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +00001028 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
1029
1030 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
1031}
1032
Tim Northover157d9112014-01-16 08:48:16 +00001033DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
Mehdi Aminic50b1a22016-10-07 21:27:26 +00001034 StringRef BoundArch) const {
Tim Northover157d9112014-01-16 08:48:16 +00001035 // First get the generic Apple args, before moving onto Darwin-specific ones.
1036 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
Tim Northoverb534ce42016-02-12 22:30:42 +00001037 const OptTable &Opts = getDriver().getOpts();
Tim Northover157d9112014-01-16 08:48:16 +00001038
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001039 // If no architecture is bound, none of the translations here are relevant.
Mehdi Aminic50b1a22016-10-07 21:27:26 +00001040 if (BoundArch.empty())
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001041 return DAL;
1042
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001043 // Add an explicit version min argument for the deployment target. We do this
1044 // after argument translation because -Xarch_ arguments may add a version min
1045 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001046 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001047
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001048 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
1049 // FIXME: It would be far better to avoid inserting those -static arguments,
1050 // but we can't check the deployment target in the translation code until
1051 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +00001052 if (isTargetWatchOSBased() ||
1053 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1054 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001055 Arg *A = *it;
1056 ++it;
1057 if (A->getOption().getID() != options::OPT_mkernel &&
1058 A->getOption().getID() != options::OPT_fapple_kext)
1059 continue;
1060 assert(it != ie && "unexpected argument translation");
1061 A = *it;
1062 assert(A->getOption().getID() == options::OPT_static &&
1063 "missing expected -static argument");
1064 it = DAL->getArgs().erase(it);
1065 }
1066 }
1067
Tim Northoverb534ce42016-02-12 22:30:42 +00001068 if (!Args.getLastArg(options::OPT_stdlib_EQ) &&
Tim Northover3a098c12016-02-15 16:38:10 +00001069 GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
Tim Northoverb534ce42016-02-12 22:30:42 +00001070 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1071 "libc++");
1072
Bob Wilson102be442011-10-07 17:54:41 +00001073 // Validate the C++ standard library choice.
1074 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1075 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001076 // Check whether the target provides libc++.
1077 StringRef where;
1078
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001079 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001080 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001081 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001082
1083 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001084 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001085 }
1086 }
1087
Tim Northoverc0f6c9b2016-08-23 18:12:58 +00001088 auto Arch = tools::darwin::getArchTypeForMachOArchName(BoundArch);
1089 if ((Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)) {
1090 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
1091 options::OPT_fno_omit_frame_pointer, false))
1092 getDriver().Diag(clang::diag::warn_drv_unsupported_opt_for_target)
1093 << "-fomit-frame-pointer" << BoundArch;
1094 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
1095 options::OPT_mno_omit_leaf_frame_pointer, false))
1096 getDriver().Diag(clang::diag::warn_drv_unsupported_opt_for_target)
1097 << "-momit-leaf-frame-pointer" << BoundArch;
1098 }
1099
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001100 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001101}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001102
Tim Northover157d9112014-01-16 08:48:16 +00001103bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001104 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001105}
1106
Tim Northover157d9112014-01-16 08:48:16 +00001107bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001108 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1109 return S[0] != '\0';
1110 return false;
1111}
1112
Tim Northovere931f9f2015-10-30 16:30:41 +00001113bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001114 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001115 if (getTriple().getArch() != llvm::Triple::arm &&
1116 getTriple().getArch() != llvm::Triple::thumb)
1117 return false;
1118
Tim Northoverc741b042015-11-17 18:27:27 +00001119 // Only watchOS uses the new DWARF/Compact unwinding method.
Tim Northoverd88ecb32016-01-27 19:32:40 +00001120 llvm::Triple Triple(ComputeLLVMTriple(Args));
Tim Northover4c9ac7d2016-01-27 22:14:02 +00001121 return !Triple.isWatchABI();
Daniel Dunbar3241d402010-02-10 18:49:11 +00001122}
1123
Steven Wu574b0f22016-03-01 01:07:58 +00001124bool Darwin::SupportsEmbeddedBitcode() const {
1125 assert(TargetInitialized && "Target not initialized!");
1126 if (isTargetIPhoneOS() && isIPhoneOSVersionLT(6, 0))
1127 return false;
1128 return true;
1129}
1130
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001131bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001132
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001133bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001134
Tim Northover157d9112014-01-16 08:48:16 +00001135bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001136 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001137 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001138}
1139
Tim Northover157d9112014-01-16 08:48:16 +00001140bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001141 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001142 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001143}
1144
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001145void Darwin::addMinVersionArgs(const ArgList &Args,
1146 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001147 VersionTuple TargetVersion = getTargetVersion();
1148
Tim Northover6f3ff222015-10-30 16:30:27 +00001149 if (isTargetWatchOS())
1150 CmdArgs.push_back("-watchos_version_min");
1151 else if (isTargetWatchOSSimulator())
1152 CmdArgs.push_back("-watchos_simulator_version_min");
1153 else if (isTargetTvOS())
1154 CmdArgs.push_back("-tvos_version_min");
1155 else if (isTargetTvOSSimulator())
1156 CmdArgs.push_back("-tvos_simulator_version_min");
1157 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001158 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001159 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001160 CmdArgs.push_back("-iphoneos_version_min");
1161 else {
1162 assert(isTargetMacOS() && "unexpected target");
1163 CmdArgs.push_back("-macosx_version_min");
1164 }
1165
1166 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1167}
1168
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001169void Darwin::addStartObjectFileArgs(const ArgList &Args,
1170 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001171 // Derived from startfile spec.
1172 if (Args.hasArg(options::OPT_dynamiclib)) {
1173 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001174 if (isTargetWatchOSBased()) {
1175 ; // watchOS does not need dylib1.o.
1176 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001177 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001178 } else if (isTargetIPhoneOS()) {
1179 if (isIPhoneOSVersionLT(3, 1))
1180 CmdArgs.push_back("-ldylib1.o");
1181 } else {
1182 if (isMacosxVersionLT(10, 5))
1183 CmdArgs.push_back("-ldylib1.o");
1184 else if (isMacosxVersionLT(10, 6))
1185 CmdArgs.push_back("-ldylib1.10.5.o");
1186 }
1187 } else {
1188 if (Args.hasArg(options::OPT_bundle)) {
1189 if (!Args.hasArg(options::OPT_static)) {
1190 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001191 if (isTargetWatchOSBased()) {
1192 ; // watchOS does not need bundle1.o.
1193 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001194 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001195 } else if (isTargetIPhoneOS()) {
1196 if (isIPhoneOSVersionLT(3, 1))
1197 CmdArgs.push_back("-lbundle1.o");
1198 } else {
1199 if (isMacosxVersionLT(10, 6))
1200 CmdArgs.push_back("-lbundle1.o");
1201 }
1202 }
1203 } else {
1204 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1205 if (Args.hasArg(options::OPT_static) ||
1206 Args.hasArg(options::OPT_object) ||
1207 Args.hasArg(options::OPT_preload)) {
1208 CmdArgs.push_back("-lgcrt0.o");
1209 } else {
1210 CmdArgs.push_back("-lgcrt1.o");
1211
1212 // darwin_crt2 spec is empty.
1213 }
1214 // By default on OS X 10.8 and later, we don't link with a crt1.o
1215 // file and the linker knows to use _main as the entry point. But,
1216 // when compiling with -pg, we need to link with the gcrt1.o file,
1217 // so pass the -no_new_main option to tell the linker to use the
1218 // "start" symbol as the entry point.
1219 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1220 CmdArgs.push_back("-no_new_main");
1221 } else {
1222 if (Args.hasArg(options::OPT_static) ||
1223 Args.hasArg(options::OPT_object) ||
1224 Args.hasArg(options::OPT_preload)) {
1225 CmdArgs.push_back("-lcrt0.o");
1226 } else {
1227 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001228 if (isTargetWatchOSBased()) {
1229 ; // watchOS does not need crt1.o.
1230 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001231 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001232 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001233 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001234 ; // iOS does not need any crt1 files for arm64
1235 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001236 CmdArgs.push_back("-lcrt1.o");
1237 else if (isIPhoneOSVersionLT(6, 0))
1238 CmdArgs.push_back("-lcrt1.3.1.o");
1239 } else {
1240 if (isMacosxVersionLT(10, 5))
1241 CmdArgs.push_back("-lcrt1.o");
1242 else if (isMacosxVersionLT(10, 6))
1243 CmdArgs.push_back("-lcrt1.10.5.o");
1244 else if (isMacosxVersionLT(10, 8))
1245 CmdArgs.push_back("-lcrt1.10.6.o");
1246
1247 // darwin_crt2 spec is empty.
1248 }
1249 }
1250 }
1251 }
1252 }
1253
1254 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001255 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001256 isMacosxVersionLT(10, 5)) {
1257 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1258 CmdArgs.push_back(Str);
1259 }
1260}
1261
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001262bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001263
John McCall3deb1ad2012-08-21 02:47:43 +00001264void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001265 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1266 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001267 return;
John McCall93207072012-08-27 01:56:21 +00001268 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001269}
1270
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001271SanitizerMask Darwin::getSupportedSanitizers() const {
Devin Coughlinfcfa38c2016-03-20 18:24:33 +00001272 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001273 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Anna Zakse67b4022016-02-02 02:04:48 +00001274 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001275 if (isTargetMacOS()) {
1276 if (!isMacosxVersionLT(10, 9))
1277 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001278 Res |= SanitizerKind::SafeStack;
Devin Coughlinfcfa38c2016-03-20 18:24:33 +00001279 if (IsX86_64)
1280 Res |= SanitizerKind::Thread;
1281 } else if (isTargetIOSSimulator() || isTargetTvOSSimulator()) {
1282 if (IsX86_64)
1283 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001284 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001285 return Res;
1286}
1287
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001288/// Generic_GCC - A tool chain using the 'gcc' command to perform
1289/// all subcommands; this relies on gcc translating the majority of
1290/// command line options.
1291
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001292/// \brief Parse a GCCVersion object out of a string of text.
1293///
1294/// This is the primary means of forming GCCVersion objects.
1295/*static*/
1296Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001297 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001298 std::pair<StringRef, StringRef> First = VersionText.split('.');
1299 std::pair<StringRef, StringRef> Second = First.second.split('.');
1300
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001301 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1302 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001303 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001304 GoodVersion.MajorStr = First.first.str();
Bryan Chand346ae62016-06-17 16:47:14 +00001305 if (First.second.empty())
1306 return GoodVersion;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001307 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001308 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001309 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001310
1311 // First look for a number prefix and parse that if present. Otherwise just
1312 // stash the entire patch string in the suffix, and leave the number
1313 // unspecified. This covers versions strings such as:
Bryan Chand346ae62016-06-17 16:47:14 +00001314 // 5 (handled above)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001315 // 4.4
1316 // 4.4.0
1317 // 4.4.x
1318 // 4.4.2-rc4
1319 // 4.4.x-patched
1320 // And retains any patch number it finds.
1321 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1322 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001323 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001324 // Try to parse the number and any suffix.
1325 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1326 GoodVersion.Patch < 0)
1327 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001328 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001329 }
1330 }
1331
1332 return GoodVersion;
1333}
1334
1335/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001336bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1337 int RHSPatch,
1338 StringRef RHSPatchSuffix) const {
1339 if (Major != RHSMajor)
1340 return Major < RHSMajor;
1341 if (Minor != RHSMinor)
1342 return Minor < RHSMinor;
1343 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001344 // Note that versions without a specified patch sort higher than those with
1345 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001346 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001347 return true;
1348 if (Patch == -1)
1349 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001350
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001351 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001352 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001353 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001354 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001355 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001356 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001357 return true;
1358 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001359 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001360
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001361 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001362 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001363 }
1364
1365 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001366 return false;
1367}
1368
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001369static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001370 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1371 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001372 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001373 return GCC_INSTALL_PREFIX;
1374}
1375
Roman Divacky326d9982013-12-06 18:32:18 +00001376/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001377///
1378/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001379/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001380///
1381/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1382/// should instead pull the target out of the driver. This is currently
1383/// necessary because the driver doesn't store the final version of the target
1384/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001385void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001386 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001387 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001388 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1389 ? TargetTriple.get64BitArchVariant()
1390 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001391 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001392 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001393 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001394 SmallVector<StringRef, 16> CandidateTripleAliases;
1395 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001396 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1397 CandidateTripleAliases, CandidateBiarchLibDirs,
1398 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001399
1400 // Compute the set of prefixes for our search.
1401 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1402 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001403
Rafael Espindola1af7c212012-02-19 01:38:32 +00001404 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1405 if (GCCToolchainDir != "") {
1406 if (GCCToolchainDir.back() == '/')
1407 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001408
Rafael Espindola1af7c212012-02-19 01:38:32 +00001409 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001410 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001411 // If we have a SysRoot, try that first.
1412 if (!D.SysRoot.empty()) {
1413 Prefixes.push_back(D.SysRoot);
1414 Prefixes.push_back(D.SysRoot + "/usr");
1415 }
1416
1417 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001418 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001419
Rafael Espindola2edca412016-05-09 13:03:10 +00001420 // Then look for distribution supplied gcc installations.
1421 if (D.SysRoot.empty()) {
1422 // Look for RHEL devtoolsets.
1423 Prefixes.push_back("/opt/rh/devtoolset-4/root/usr");
1424 Prefixes.push_back("/opt/rh/devtoolset-3/root/usr");
1425 Prefixes.push_back("/opt/rh/devtoolset-2/root/usr");
1426 Prefixes.push_back("/opt/rh/devtoolset-1.1/root/usr");
1427 Prefixes.push_back("/opt/rh/devtoolset-1.0/root/usr");
1428 // And finally in /usr.
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001429 Prefixes.push_back("/usr");
Rafael Espindola2edca412016-05-09 13:03:10 +00001430 }
Rafael Espindolac29af942012-02-03 01:01:20 +00001431 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001432
1433 // Loop over the various components which exist and select the best GCC
1434 // installation available. GCC installs are ranked by version number.
1435 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001436 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001437 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001438 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001439 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001440 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001441 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001442 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001443 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001444 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001445 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001446 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001447 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001448 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001449 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001450 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001451 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001452 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001453 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001454 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001455 }
1456 }
1457}
1458
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001459void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001460 for (const auto &InstallPath : CandidateGCCInstallPaths)
1461 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001462
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001463 if (!GCCInstallPath.empty())
1464 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1465
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001466 for (const auto &Multilib : Multilibs)
1467 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001468
1469 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1470 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001471}
1472
1473bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1474 if (BiarchSibling.hasValue()) {
1475 M = BiarchSibling.getValue();
1476 return true;
1477 }
1478 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001479}
1480
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001481/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001482 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001483 SmallVectorImpl<StringRef> &LibDirs,
1484 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001485 SmallVectorImpl<StringRef> &BiarchLibDirs,
1486 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001487 // Declare a bunch of static data sets that we'll select between below. These
1488 // are specifically designed to always refer to string literals to avoid any
1489 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001490 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1491 static const char *const AArch64Triples[] = {
1492 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1493 "aarch64-redhat-linux"};
1494 static const char *const AArch64beLibDirs[] = {"/lib"};
1495 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1496 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001497
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001498 static const char *const ARMLibDirs[] = {"/lib"};
1499 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1500 "arm-linux-androideabi"};
1501 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1502 "armv7hl-redhat-linux-gnueabi"};
1503 static const char *const ARMebLibDirs[] = {"/lib"};
1504 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1505 "armeb-linux-androideabi"};
1506 static const char *const ARMebHFTriples[] = {
1507 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001508
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001509 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001510 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001511 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1512 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1513 "x86_64-redhat-linux", "x86_64-suse-linux",
1514 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1515 "x86_64-slackware-linux", "x86_64-linux-android",
1516 "x86_64-unknown-linux"};
1517 static const char *const X32LibDirs[] = {"/libx32"};
1518 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001519 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001520 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1521 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1522 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1523 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1524 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001525
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001526 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001527 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1528 "mips-mti-linux-gnu",
1529 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001530 static const char *const MIPSELLibDirs[] = {"/lib"};
Simon Atanasyan603018a2016-07-19 07:09:48 +00001531 static const char *const MIPSELTriples[] = {"mipsel-linux-gnu",
1532 "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001533
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001534 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1535 static const char *const MIPS64Triples[] = {
1536 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1537 "mips64-linux-gnuabi64"};
1538 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1539 static const char *const MIPS64ELTriples[] = {
1540 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
Simon Atanasyan603018a2016-07-19 07:09:48 +00001541 "mips64el-linux-gnuabi64"};
1542
1543 static const char *const MIPSELAndroidLibDirs[] = {"/lib", "/libr2",
1544 "/libr6"};
1545 static const char *const MIPSELAndroidTriples[] = {"mipsel-linux-android"};
1546 static const char *const MIPS64ELAndroidLibDirs[] = {"/lib64", "/lib",
1547 "/libr2", "/libr6"};
1548 static const char *const MIPS64ELAndroidTriples[] = {
1549 "mips64el-linux-android"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001550
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001551 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001552 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001553 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1554 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1555 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1556 static const char *const PPC64Triples[] = {
1557 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1558 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1559 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1560 static const char *const PPC64LETriples[] = {
1561 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1562 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001563
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001564 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1565 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1566 "sparcv8-linux-gnu"};
1567 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1568 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1569 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001570
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001571 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001572 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001573 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1574 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001575
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001576 // Solaris.
1577 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1578 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1579 "i386-pc-solaris2.11"};
1580
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001581 using std::begin;
1582 using std::end;
1583
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001584 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1585 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1586 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001587 return;
1588 }
1589
Chandler Carruth866faab2012-01-25 07:21:38 +00001590 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001591 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001592 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1593 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1594 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1595 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001596 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001597 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001598 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1599 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1600 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1601 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001602 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001603 case llvm::Triple::arm:
1604 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001605 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001606 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001607 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001608 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001609 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001610 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001611 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001612 case llvm::Triple::armeb:
1613 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001614 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001615 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001616 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001617 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001618 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001619 }
1620 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001621 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001622 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1623 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1624 // x32 is always available when x86_64 is available, so adding it as
1625 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001626 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001627 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1628 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001629 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001630 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1631 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001632 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001633 break;
1634 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001635 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001636 // MCU toolchain is 32 bit only and its triple alias is TargetTriple
1637 // itself, which will be appended below.
1638 if (!TargetTriple.isOSIAMCU()) {
1639 TripleAliases.append(begin(X86Triples), end(X86Triples));
1640 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1641 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1642 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001643 break;
1644 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001645 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1646 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1647 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1648 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001649 break;
1650 case llvm::Triple::mipsel:
Simon Atanasyan603018a2016-07-19 07:09:48 +00001651 if (TargetTriple.isAndroid()) {
1652 LibDirs.append(begin(MIPSELAndroidLibDirs), end(MIPSELAndroidLibDirs));
1653 TripleAliases.append(begin(MIPSELAndroidTriples),
1654 end(MIPSELAndroidTriples));
1655 BiarchLibDirs.append(begin(MIPS64ELAndroidLibDirs),
1656 end(MIPS64ELAndroidLibDirs));
1657 BiarchTripleAliases.append(begin(MIPS64ELAndroidTriples),
1658 end(MIPS64ELAndroidTriples));
1659
1660 } else {
1661 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1662 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1663 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1664 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1665 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1666 }
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001667 break;
1668 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001669 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1670 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1671 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1672 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001673 break;
1674 case llvm::Triple::mips64el:
Simon Atanasyan603018a2016-07-19 07:09:48 +00001675 if (TargetTriple.isAndroid()) {
1676 LibDirs.append(begin(MIPS64ELAndroidLibDirs),
1677 end(MIPS64ELAndroidLibDirs));
1678 TripleAliases.append(begin(MIPS64ELAndroidTriples),
1679 end(MIPS64ELAndroidTriples));
1680 BiarchLibDirs.append(begin(MIPSELAndroidLibDirs),
1681 end(MIPSELAndroidLibDirs));
1682 BiarchTripleAliases.append(begin(MIPSELAndroidTriples),
1683 end(MIPSELAndroidTriples));
1684
1685 } else {
1686 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1687 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1688 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1689 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1690 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1691 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001692 break;
1693 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001694 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1695 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1696 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1697 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001698 break;
1699 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001700 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1701 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1702 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1703 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001704 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001705 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001706 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1707 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001708 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001709 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001710 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001711 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1712 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1713 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1714 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001715 break;
1716 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001717 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1718 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1719 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1720 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001721 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001722 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001723 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1724 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001725 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001726 default:
1727 // By default, just rely on the standard lib directories and the original
1728 // triple.
1729 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001730 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001731
1732 // Always append the drivers target triple to the end, in case it doesn't
1733 // match any of our aliases.
1734 TripleAliases.push_back(TargetTriple.str());
1735
1736 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001737 if (TargetTriple.str() != BiarchTriple.str())
1738 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001739}
1740
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001741// Parses the contents of version.txt in an CUDA installation. It should
1742// contain one line of the from e.g. "CUDA Version 7.5.2".
1743static CudaVersion ParseCudaVersionFile(llvm::StringRef V) {
1744 if (!V.startswith("CUDA Version "))
1745 return CudaVersion::UNKNOWN;
1746 V = V.substr(strlen("CUDA Version "));
1747 int Major = -1, Minor = -1;
1748 auto First = V.split('.');
1749 auto Second = First.second.split('.');
Justin Lebara27654a2016-08-15 20:38:48 +00001750 if (First.first.getAsInteger(10, Major) ||
1751 Second.first.getAsInteger(10, Minor))
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001752 return CudaVersion::UNKNOWN;
1753
1754 if (Major == 7 && Minor == 0) {
1755 // This doesn't appear to ever happen -- version.txt doesn't exist in the
1756 // CUDA 7 installs I've seen. But no harm in checking.
1757 return CudaVersion::CUDA_70;
1758 }
1759 if (Major == 7 && Minor == 5)
1760 return CudaVersion::CUDA_75;
1761 if (Major == 8 && Minor == 0)
1762 return CudaVersion::CUDA_80;
1763 return CudaVersion::UNKNOWN;
1764}
1765
Artem Belevich98607b62015-09-23 21:49:39 +00001766// \brief -- try common CUDA installation paths looking for files we need for
1767// CUDA compilation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001768void Generic_GCC::CudaInstallationDetector::init(
1769 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001770 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001771
1772 if (Args.hasArg(options::OPT_cuda_path_EQ))
1773 CudaPathCandidates.push_back(
1774 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1775 else {
1776 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001777 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-8.0");
Artem Belevich86017332015-11-17 22:28:55 +00001778 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001779 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1780 }
1781
Benjamin Kramere8b76412015-09-24 14:48:37 +00001782 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001783 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001784 continue;
1785
Justin Lebar710c1312016-07-06 21:21:43 +00001786 InstallPath = CudaPath;
1787 BinPath = CudaPath + "/bin";
1788 IncludePath = InstallPath + "/include";
1789 LibDevicePath = InstallPath + "/nvvm/libdevice";
1790 LibPath = InstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
Artem Belevich98607b62015-09-23 21:49:39 +00001791
Justin Lebar710c1312016-07-06 21:21:43 +00001792 auto &FS = D.getVFS();
1793 if (!(FS.exists(IncludePath) && FS.exists(BinPath) && FS.exists(LibPath) &&
1794 FS.exists(LibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001795 continue;
1796
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001797 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> VersionFile =
1798 FS.getBufferForFile(InstallPath + "/version.txt");
1799 if (!VersionFile) {
1800 // CUDA 7.0 doesn't have a version.txt, so guess that's our version if
1801 // version.txt isn't present.
1802 Version = CudaVersion::CUDA_70;
1803 } else {
1804 Version = ParseCudaVersionFile((*VersionFile)->getBuffer());
1805 }
1806
Artem Belevich34f481a2015-11-17 22:28:50 +00001807 std::error_code EC;
Justin Lebar710c1312016-07-06 21:21:43 +00001808 for (llvm::sys::fs::directory_iterator LI(LibDevicePath, EC), LE;
Artem Belevich34f481a2015-11-17 22:28:50 +00001809 !EC && LI != LE; LI = LI.increment(EC)) {
1810 StringRef FilePath = LI->path();
1811 StringRef FileName = llvm::sys::path::filename(FilePath);
1812 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1813 const StringRef LibDeviceName = "libdevice.";
1814 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1815 continue;
1816 StringRef GpuArch = FileName.slice(
1817 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
Justin Lebar710c1312016-07-06 21:21:43 +00001818 LibDeviceMap[GpuArch] = FilePath.str();
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001819 // Insert map entries for specifc devices with this compute
1820 // capability. NVCC's choice of the libdevice library version is
1821 // rather peculiar and depends on the CUDA version.
Artem Belevich34f481a2015-11-17 22:28:50 +00001822 if (GpuArch == "compute_20") {
Justin Lebar710c1312016-07-06 21:21:43 +00001823 LibDeviceMap["sm_20"] = FilePath;
1824 LibDeviceMap["sm_21"] = FilePath;
Artem Belevich02a1e972016-08-02 23:12:51 +00001825 LibDeviceMap["sm_32"] = FilePath;
Artem Belevich34f481a2015-11-17 22:28:50 +00001826 } else if (GpuArch == "compute_30") {
Justin Lebar710c1312016-07-06 21:21:43 +00001827 LibDeviceMap["sm_30"] = FilePath;
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001828 if (Version < CudaVersion::CUDA_80) {
1829 LibDeviceMap["sm_50"] = FilePath;
1830 LibDeviceMap["sm_52"] = FilePath;
1831 LibDeviceMap["sm_53"] = FilePath;
1832 }
Artem Belevich02a1e972016-08-02 23:12:51 +00001833 LibDeviceMap["sm_60"] = FilePath;
1834 LibDeviceMap["sm_61"] = FilePath;
1835 LibDeviceMap["sm_62"] = FilePath;
Artem Belevich34f481a2015-11-17 22:28:50 +00001836 } else if (GpuArch == "compute_35") {
Justin Lebar710c1312016-07-06 21:21:43 +00001837 LibDeviceMap["sm_35"] = FilePath;
1838 LibDeviceMap["sm_37"] = FilePath;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001839 } else if (GpuArch == "compute_50") {
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001840 if (Version >= CudaVersion::CUDA_80) {
1841 LibDeviceMap["sm_50"] = FilePath;
1842 LibDeviceMap["sm_52"] = FilePath;
1843 LibDeviceMap["sm_53"] = FilePath;
1844 }
Artem Belevich34f481a2015-11-17 22:28:50 +00001845 }
1846 }
1847
Artem Belevich98607b62015-09-23 21:49:39 +00001848 IsValid = true;
1849 break;
1850 }
1851}
1852
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001853void Generic_GCC::CudaInstallationDetector::CheckCudaVersionSupportsArch(
1854 CudaArch Arch) const {
1855 if (Arch == CudaArch::UNKNOWN || Version == CudaVersion::UNKNOWN ||
1856 ArchsWithVersionTooLowErrors.count(Arch) > 0)
1857 return;
1858
1859 auto RequiredVersion = MinVersionForCudaArch(Arch);
1860 if (Version < RequiredVersion) {
1861 ArchsWithVersionTooLowErrors.insert(Arch);
1862 D.Diag(diag::err_drv_cuda_version_too_low)
1863 << InstallPath << CudaArchToString(Arch) << CudaVersionToString(Version)
1864 << CudaVersionToString(RequiredVersion);
1865 }
1866}
1867
Artem Belevich98607b62015-09-23 21:49:39 +00001868void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1869 if (isValid())
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001870 OS << "Found CUDA installation: " << InstallPath << ", version "
1871 << CudaVersionToString(Version) << "\n";
Artem Belevich98607b62015-09-23 21:49:39 +00001872}
1873
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001874namespace {
1875// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001876class FilterNonExistent {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001877 StringRef Base, File;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001878 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001879
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001880public:
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001881 FilterNonExistent(StringRef Base, StringRef File, vfs::FileSystem &VFS)
1882 : Base(Base), File(File), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001883 bool operator()(const Multilib &M) {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001884 return !VFS.exists(Base + M.gccSuffix() + File);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001885 }
1886};
1887} // end anonymous namespace
1888
1889static void addMultilibFlag(bool Enabled, const char *const Flag,
1890 std::vector<std::string> &Flags) {
1891 if (Enabled)
1892 Flags.push_back(std::string("+") + Flag);
1893 else
1894 Flags.push_back(std::string("-") + Flag);
1895}
1896
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00001897static bool isArmOrThumbArch(llvm::Triple::ArchType Arch) {
1898 return Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb;
1899}
1900
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001901static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001902 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1903 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1904}
1905
1906static bool isMips32(llvm::Triple::ArchType Arch) {
1907 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1908}
1909
1910static bool isMips64(llvm::Triple::ArchType Arch) {
1911 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1912}
1913
1914static bool isMipsEL(llvm::Triple::ArchType Arch) {
1915 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1916}
1917
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001918static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001920 return A && A->getOption().matches(options::OPT_mips16);
1921}
1922
1923static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001924 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001925 return A && A->getOption().matches(options::OPT_mmicromips);
1926}
1927
Benjamin Kramere003ca22015-10-28 13:54:16 +00001928namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001929struct DetectedMultilibs {
1930 /// The set of multilibs that the detected installation supports.
1931 MultilibSet Multilibs;
1932
1933 /// The primary multilib appropriate for the given flags.
1934 Multilib SelectedMultilib;
1935
1936 /// On Biarch systems, this corresponds to the default multilib when
1937 /// targeting the non-default multilib. Otherwise, it is empty.
1938 llvm::Optional<Multilib> BiarchSibling;
1939};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001940} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001941
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001942static Multilib makeMultilib(StringRef commonSuffix) {
1943 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1944}
1945
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00001946static bool findMipsCsMultilibs(const Multilib::flags_list &Flags,
1947 FilterNonExistent &NonExistent,
1948 DetectedMultilibs &Result) {
1949 // Check for Code Sourcery toolchain multilibs
1950 MultilibSet CSMipsMultilibs;
1951 {
1952 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001953
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00001954 auto MArchMicroMips =
1955 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001956
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00001957 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
1958
1959 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
1960
1961 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
1962
1963 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
1964
1965 auto DefaultFloat =
1966 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
1967
1968 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
1969
1970 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
1971
1972 // Note that this one's osSuffix is ""
1973 auto MAbi64 = makeMultilib("")
1974 .gccSuffix("/64")
1975 .includeSuffix("/64")
1976 .flag("+mabi=n64")
1977 .flag("-mabi=n32")
1978 .flag("-m32");
1979
1980 CSMipsMultilibs =
1981 MultilibSet()
1982 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1983 .Maybe(UCLibc)
1984 .Either(SoftFloat, Nan2008, DefaultFloat)
1985 .FilterOut("/micromips/nan2008")
1986 .FilterOut("/mips16/nan2008")
1987 .Either(BigEndian, LittleEndian)
1988 .Maybe(MAbi64)
1989 .FilterOut("/mips16.*/64")
1990 .FilterOut("/micromips.*/64")
1991 .FilterOut(NonExistent)
1992 .setIncludeDirsCallback([](const Multilib &M) {
1993 std::vector<std::string> Dirs({"/include"});
1994 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1995 Dirs.push_back(
1996 "/../../../../mips-linux-gnu/libc/uclibc/usr/include");
1997 else
1998 Dirs.push_back("/../../../../mips-linux-gnu/libc/usr/include");
1999 return Dirs;
2000 });
2001 }
2002
2003 MultilibSet DebianMipsMultilibs;
2004 {
2005 Multilib MAbiN32 =
2006 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
2007
2008 Multilib M64 = Multilib()
2009 .gccSuffix("/64")
2010 .includeSuffix("/64")
2011 .flag("+m64")
2012 .flag("-m32")
2013 .flag("-mabi=n32");
2014
2015 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
2016
2017 DebianMipsMultilibs =
2018 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
2019 }
2020
2021 // Sort candidates. Toolchain that best meets the directories tree goes first.
2022 // Then select the first toolchains matches command line flags.
2023 MultilibSet *Candidates[] = {&CSMipsMultilibs, &DebianMipsMultilibs};
2024 if (CSMipsMultilibs.size() < DebianMipsMultilibs.size())
2025 std::iter_swap(Candidates, Candidates + 1);
2026 for (const MultilibSet *Candidate : Candidates) {
2027 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2028 if (Candidate == &DebianMipsMultilibs)
2029 Result.BiarchSibling = Multilib();
2030 Result.Multilibs = *Candidate;
2031 return true;
2032 }
2033 }
2034 return false;
2035}
2036
Simon Atanasyan603018a2016-07-19 07:09:48 +00002037static bool findMipsAndroidMultilibs(vfs::FileSystem &VFS, StringRef Path,
2038 const Multilib::flags_list &Flags,
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002039 FilterNonExistent &NonExistent,
2040 DetectedMultilibs &Result) {
2041
2042 MultilibSet AndroidMipsMultilibs =
2043 MultilibSet()
2044 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
2045 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
2046 .FilterOut(NonExistent);
2047
Simon Atanasyan603018a2016-07-19 07:09:48 +00002048 MultilibSet AndroidMipselMultilibs =
2049 MultilibSet()
2050 .Either(Multilib().flag("+march=mips32"),
2051 Multilib("/mips-r2", "", "/mips-r2").flag("+march=mips32r2"),
2052 Multilib("/mips-r6", "", "/mips-r6").flag("+march=mips32r6"))
2053 .FilterOut(NonExistent);
2054
2055 MultilibSet AndroidMips64elMultilibs =
2056 MultilibSet()
2057 .Either(
2058 Multilib().flag("+march=mips64r6"),
2059 Multilib("/32/mips-r1", "", "/mips-r1").flag("+march=mips32"),
2060 Multilib("/32/mips-r2", "", "/mips-r2").flag("+march=mips32r2"),
2061 Multilib("/32/mips-r6", "", "/mips-r6").flag("+march=mips32r6"))
2062 .FilterOut(NonExistent);
2063
2064 MultilibSet *MS = &AndroidMipsMultilibs;
2065 if (VFS.exists(Path + "/mips-r6"))
2066 MS = &AndroidMipselMultilibs;
2067 else if (VFS.exists(Path + "/32"))
2068 MS = &AndroidMips64elMultilibs;
2069 if (MS->select(Flags, Result.SelectedMultilib)) {
2070 Result.Multilibs = *MS;
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002071 return true;
2072 }
2073 return false;
2074}
2075
2076static bool findMipsMuslMultilibs(const Multilib::flags_list &Flags,
2077 FilterNonExistent &NonExistent,
2078 DetectedMultilibs &Result) {
2079 // Musl toolchain multilibs
2080 MultilibSet MuslMipsMultilibs;
2081 {
2082 auto MArchMipsR2 = makeMultilib("")
2083 .osSuffix("/mips-r2-hard-musl")
2084 .flag("+EB")
2085 .flag("-EL")
2086 .flag("+march=mips32r2");
2087
2088 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
2089 .flag("-EB")
2090 .flag("+EL")
2091 .flag("+march=mips32r2");
2092
2093 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
2094
2095 // Specify the callback that computes the include directories.
2096 MuslMipsMultilibs.setIncludeDirsCallback([](const Multilib &M) {
2097 return std::vector<std::string>(
2098 {"/../sysroot" + M.osSuffix() + "/usr/include"});
2099 });
2100 }
2101 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2102 Result.Multilibs = MuslMipsMultilibs;
2103 return true;
2104 }
2105 return false;
2106}
2107
2108static bool findMipsMtiMultilibs(const Multilib::flags_list &Flags,
2109 FilterNonExistent &NonExistent,
2110 DetectedMultilibs &Result) {
2111 // CodeScape MTI toolchain v1.2 and early.
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002112 MultilibSet MtiMipsMultilibsV1;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002113 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002114 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002115 .flag("+m32")
2116 .flag("-m64")
2117 .flag("-mmicromips")
2118 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002119
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002120 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002121 .flag("+m32")
2122 .flag("-m64")
2123 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002124
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002125 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002126 .flag("-m32")
2127 .flag("+m64")
2128 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002129
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002130 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
2131 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002132
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002133 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002134 .flag("+m32")
2135 .flag("-m64")
2136 .flag("-mmicromips")
2137 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002139 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002140
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002141 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002142
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002143 auto MAbi64 =
2144 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002145
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002146 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002147
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002148 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002149
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002150 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002151
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002152 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002153
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002154 MtiMipsMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002155 MultilibSet()
2156 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
2157 MArchDefault)
2158 .Maybe(UCLibc)
2159 .Maybe(Mips16)
2160 .FilterOut("/mips64/mips16")
2161 .FilterOut("/mips64r2/mips16")
2162 .FilterOut("/micromips/mips16")
2163 .Maybe(MAbi64)
2164 .FilterOut("/micromips/64")
2165 .FilterOut("/mips32/64")
2166 .FilterOut("^/64")
2167 .FilterOut("/mips16/64")
2168 .Either(BigEndian, LittleEndian)
2169 .Maybe(SoftFloat)
2170 .Maybe(Nan2008)
2171 .FilterOut(".*sof/nan2008")
2172 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002173 .setIncludeDirsCallback([](const Multilib &M) {
2174 std::vector<std::string> Dirs({"/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002175 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
Simon Atanasyana45502d2016-05-19 15:07:21 +00002176 Dirs.push_back("/../../../../sysroot/uclibc/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002177 else
Simon Atanasyana45502d2016-05-19 15:07:21 +00002178 Dirs.push_back("/../../../../sysroot/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002179 return Dirs;
2180 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00002181 }
2182
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002183 // CodeScape IMG toolchain starting from v1.3.
Simon Atanasyan2834a222016-05-22 18:18:07 +00002184 MultilibSet MtiMipsMultilibsV2;
2185 {
2186 auto BeHard = makeMultilib("/mips-r2-hard")
2187 .flag("+EB")
2188 .flag("-msoft-float")
2189 .flag("-mnan=2008")
2190 .flag("-muclibc");
2191 auto BeSoft = makeMultilib("/mips-r2-soft")
2192 .flag("+EB")
2193 .flag("+msoft-float")
2194 .flag("-mnan=2008");
2195 auto ElHard = makeMultilib("/mipsel-r2-hard")
2196 .flag("+EL")
2197 .flag("-msoft-float")
2198 .flag("-mnan=2008")
2199 .flag("-muclibc");
2200 auto ElSoft = makeMultilib("/mipsel-r2-soft")
2201 .flag("+EL")
2202 .flag("+msoft-float")
2203 .flag("-mnan=2008")
2204 .flag("-mmicromips");
2205 auto BeHardNan = makeMultilib("/mips-r2-hard-nan2008")
2206 .flag("+EB")
2207 .flag("-msoft-float")
2208 .flag("+mnan=2008")
2209 .flag("-muclibc");
2210 auto ElHardNan = makeMultilib("/mipsel-r2-hard-nan2008")
2211 .flag("+EL")
2212 .flag("-msoft-float")
2213 .flag("+mnan=2008")
2214 .flag("-muclibc")
2215 .flag("-mmicromips");
2216 auto BeHardNanUclibc = makeMultilib("/mips-r2-hard-nan2008-uclibc")
2217 .flag("+EB")
2218 .flag("-msoft-float")
2219 .flag("+mnan=2008")
2220 .flag("+muclibc");
2221 auto ElHardNanUclibc = makeMultilib("/mipsel-r2-hard-nan2008-uclibc")
2222 .flag("+EL")
2223 .flag("-msoft-float")
2224 .flag("+mnan=2008")
2225 .flag("+muclibc");
2226 auto BeHardUclibc = makeMultilib("/mips-r2-hard-uclibc")
2227 .flag("+EB")
2228 .flag("-msoft-float")
2229 .flag("-mnan=2008")
2230 .flag("+muclibc");
2231 auto ElHardUclibc = makeMultilib("/mipsel-r2-hard-uclibc")
2232 .flag("+EL")
2233 .flag("-msoft-float")
2234 .flag("-mnan=2008")
2235 .flag("+muclibc");
2236 auto ElMicroHardNan = makeMultilib("/micromipsel-r2-hard-nan2008")
2237 .flag("+EL")
2238 .flag("-msoft-float")
2239 .flag("+mnan=2008")
2240 .flag("+mmicromips");
2241 auto ElMicroSoft = makeMultilib("/micromipsel-r2-soft")
2242 .flag("+EL")
2243 .flag("+msoft-float")
2244 .flag("-mnan=2008")
2245 .flag("+mmicromips");
2246
2247 auto O32 =
2248 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2249 auto N32 =
2250 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2251 auto N64 =
2252 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2253
2254 MtiMipsMultilibsV2 =
2255 MultilibSet()
2256 .Either({BeHard, BeSoft, ElHard, ElSoft, BeHardNan, ElHardNan,
2257 BeHardNanUclibc, ElHardNanUclibc, BeHardUclibc,
2258 ElHardUclibc, ElMicroHardNan, ElMicroSoft})
2259 .Either(O32, N32, N64)
2260 .FilterOut(NonExistent)
2261 .setIncludeDirsCallback([](const Multilib &M) {
2262 return std::vector<std::string>({"/../../../../sysroot" +
2263 M.includeSuffix() +
2264 "/../usr/include"});
2265 })
2266 .setFilePathsCallback([](const Multilib &M) {
2267 return std::vector<std::string>(
2268 {"/../../../../mips-mti-linux-gnu/lib" + M.gccSuffix()});
2269 });
2270 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002271 for (auto Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
2272 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2273 Result.Multilibs = *Candidate;
2274 return true;
2275 }
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002276 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002277 return false;
2278}
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002279
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002280static bool findMipsImgMultilibs(const Multilib::flags_list &Flags,
2281 FilterNonExistent &NonExistent,
2282 DetectedMultilibs &Result) {
2283 // CodeScape IMG toolchain v1.2 and early.
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002284 MultilibSet ImgMultilibsV1;
Daniel Sanders2bf13662014-07-10 14:40:57 +00002285 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002286 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002287
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002288 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002289
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002290 auto MAbi64 =
2291 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002292
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002293 ImgMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002294 MultilibSet()
2295 .Maybe(Mips64r6)
2296 .Maybe(MAbi64)
2297 .Maybe(LittleEndian)
2298 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002299 .setIncludeDirsCallback([](const Multilib &M) {
2300 return std::vector<std::string>(
2301 {"/include", "/../../../../sysroot/usr/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002302 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002303 }
2304
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002305 // CodeScape IMG toolchain starting from v1.3.
Simon Atanasyan2834a222016-05-22 18:18:07 +00002306 MultilibSet ImgMultilibsV2;
2307 {
2308 auto BeHard = makeMultilib("/mips-r6-hard")
2309 .flag("+EB")
2310 .flag("-msoft-float")
2311 .flag("-mmicromips");
2312 auto BeSoft = makeMultilib("/mips-r6-soft")
2313 .flag("+EB")
2314 .flag("+msoft-float")
2315 .flag("-mmicromips");
2316 auto ElHard = makeMultilib("/mipsel-r6-hard")
2317 .flag("+EL")
2318 .flag("-msoft-float")
2319 .flag("-mmicromips");
2320 auto ElSoft = makeMultilib("/mipsel-r6-soft")
2321 .flag("+EL")
2322 .flag("+msoft-float")
2323 .flag("-mmicromips");
2324 auto BeMicroHard = makeMultilib("/micromips-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002325 .flag("+EB")
2326 .flag("-msoft-float")
2327 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002328 auto BeMicroSoft = makeMultilib("/micromips-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002329 .flag("+EB")
2330 .flag("+msoft-float")
2331 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002332 auto ElMicroHard = makeMultilib("/micromipsel-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002333 .flag("+EL")
2334 .flag("-msoft-float")
2335 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002336 auto ElMicroSoft = makeMultilib("/micromipsel-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002337 .flag("+EL")
2338 .flag("+msoft-float")
2339 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002340
2341 auto O32 =
2342 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2343 auto N32 =
2344 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2345 auto N64 =
2346 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2347
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002348 ImgMultilibsV2 =
2349 MultilibSet()
2350 .Either({BeHard, BeSoft, ElHard, ElSoft, BeMicroHard, BeMicroSoft,
2351 ElMicroHard, ElMicroSoft})
2352 .Either(O32, N32, N64)
2353 .FilterOut(NonExistent)
2354 .setIncludeDirsCallback([](const Multilib &M) {
2355 return std::vector<std::string>({"/../../../../sysroot" +
2356 M.includeSuffix() +
2357 "/../usr/include"});
2358 })
2359 .setFilePathsCallback([](const Multilib &M) {
2360 return std::vector<std::string>(
2361 {"/../../../../mips-img-linux-gnu/lib" + M.gccSuffix()});
2362 });
Simon Atanasyan2834a222016-05-22 18:18:07 +00002363 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002364 for (auto Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
2365 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2366 Result.Multilibs = *Candidate;
2367 return true;
2368 }
2369 }
2370 return false;
2371}
2372
2373static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
2374 StringRef Path, const ArgList &Args,
2375 DetectedMultilibs &Result) {
2376 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Simon Atanasyan2834a222016-05-22 18:18:07 +00002377
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002378 StringRef CPUName;
2379 StringRef ABIName;
2380 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2381
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002382 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2383
2384 Multilib::flags_list Flags;
2385 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2386 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2387 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002388 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002389 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002390 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002391 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002392 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002393 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002394 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2395 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002396 "march=mips64r2", Flags);
Simon Atanasyan603018a2016-07-19 07:09:48 +00002397 addMultilibFlag(CPUName == "mips64r6", "march=mips64r6", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002398 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002399 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002400 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2401 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002402 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2403 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002404 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002405 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002406 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002407 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002408
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002409 if (TargetTriple.isAndroid())
Simon Atanasyan603018a2016-07-19 07:09:48 +00002410 return findMipsAndroidMultilibs(D.getVFS(), Path, Flags, NonExistent,
2411 Result);
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002412
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002413 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2414 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002415 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2416 return findMipsMuslMultilibs(Flags, NonExistent, Result);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002417
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002418 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2419 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002420 TargetTriple.getEnvironment() == llvm::Triple::GNU)
2421 return findMipsMtiMultilibs(Flags, NonExistent, Result);
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002422
Daniel Sanders2bf13662014-07-10 14:40:57 +00002423 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2424 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002425 TargetTriple.getEnvironment() == llvm::Triple::GNU)
2426 return findMipsImgMultilibs(Flags, NonExistent, Result);
Daniel Sanders2bf13662014-07-10 14:40:57 +00002427
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002428 if (findMipsCsMultilibs(Flags, NonExistent, Result))
2429 return true;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002430
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002431 // Fallback to the regular toolchain-tree structure.
2432 Multilib Default;
2433 Result.Multilibs.push_back(Default);
2434 Result.Multilibs.FilterOut(NonExistent);
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002435
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002436 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2437 Result.BiarchSibling = Multilib();
2438 return true;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002439 }
2440
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002441 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002442}
2443
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002444static void findAndroidArmMultilibs(const Driver &D,
2445 const llvm::Triple &TargetTriple,
2446 StringRef Path, const ArgList &Args,
2447 DetectedMultilibs &Result) {
2448 // Find multilibs with subdirectories like armv7-a, thumb, armv7-a/thumb.
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002449 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002450 Multilib ArmV7Multilib = makeMultilib("/armv7-a")
2451 .flag("+armv7")
2452 .flag("-thumb");
2453 Multilib ThumbMultilib = makeMultilib("/thumb")
2454 .flag("-armv7")
2455 .flag("+thumb");
2456 Multilib ArmV7ThumbMultilib = makeMultilib("/armv7-a/thumb")
2457 .flag("+armv7")
2458 .flag("+thumb");
2459 Multilib DefaultMultilib = makeMultilib("")
2460 .flag("-armv7")
2461 .flag("-thumb");
2462 MultilibSet AndroidArmMultilibs =
2463 MultilibSet()
2464 .Either(ThumbMultilib, ArmV7Multilib,
2465 ArmV7ThumbMultilib, DefaultMultilib)
2466 .FilterOut(NonExistent);
2467
2468 Multilib::flags_list Flags;
2469 llvm::StringRef Arch = Args.getLastArgValue(options::OPT_march_EQ);
2470 bool IsArmArch = TargetTriple.getArch() == llvm::Triple::arm;
2471 bool IsThumbArch = TargetTriple.getArch() == llvm::Triple::thumb;
2472 bool IsV7SubArch = TargetTriple.getSubArch() == llvm::Triple::ARMSubArch_v7;
2473 bool IsThumbMode = IsThumbArch ||
2474 Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, false) ||
2475 (IsArmArch && llvm::ARM::parseArchISA(Arch) == llvm::ARM::IK_THUMB);
2476 bool IsArmV7Mode = (IsArmArch || IsThumbArch) &&
2477 (llvm::ARM::parseArchVersion(Arch) == 7 ||
2478 (IsArmArch && Arch == "" && IsV7SubArch));
2479 addMultilibFlag(IsArmV7Mode, "armv7", Flags);
2480 addMultilibFlag(IsThumbMode, "thumb", Flags);
2481
2482 if (AndroidArmMultilibs.select(Flags, Result.SelectedMultilib))
2483 Result.Multilibs = AndroidArmMultilibs;
2484}
2485
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002486static bool findBiarchMultilibs(const Driver &D,
2487 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002488 StringRef Path, const ArgList &Args,
2489 bool NeedsBiarchSuffix,
2490 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002491 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2492 // in what would normally be GCCInstallPath and put the 64-bit
2493 // libs in a subdirectory named 64. The simple logic we follow is that
2494 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2495 // we use that. If not, and if not a biarch triple alias, we look for
2496 // crtbegin.o without the subdirectory.
2497
2498 Multilib Default;
2499 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002500 .gccSuffix("/64")
2501 .includeSuffix("/64")
2502 .flag("-m32")
2503 .flag("+m64")
2504 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002505 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002506 .gccSuffix("/32")
2507 .includeSuffix("/32")
2508 .flag("+m32")
2509 .flag("-m64")
2510 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002511 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002512 .gccSuffix("/x32")
2513 .includeSuffix("/x32")
2514 .flag("-m32")
2515 .flag("-m64")
2516 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002517
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002518 // GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a.
2519 FilterNonExistent NonExistent(
2520 Path, TargetTriple.isOSIAMCU() ? "/libgcc.a" : "/crtbegin.o", D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002521
Zinovy Nis1db95732014-07-10 15:27:19 +00002522 // Determine default multilib from: 32, 64, x32
2523 // Also handle cases such as 64 on 32, 32 on 64, etc.
2524 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002525 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002526 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002527 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002528 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002529 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002530 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002531 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002532 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002533 if (TargetTriple.isArch32Bit())
2534 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002535 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002536 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002537 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002538 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002539 }
2540
Zinovy Nis1db95732014-07-10 15:27:19 +00002541 if (Want == WANT32)
2542 Default.flag("+m32").flag("-m64").flag("-mx32");
2543 else if (Want == WANT64)
2544 Default.flag("-m32").flag("+m64").flag("-mx32");
2545 else if (Want == WANTX32)
2546 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002547 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002548 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002549
Simon Atanasyan60280b42014-05-12 07:37:51 +00002550 Result.Multilibs.push_back(Default);
2551 Result.Multilibs.push_back(Alt64);
2552 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002553 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002554
Simon Atanasyan60280b42014-05-12 07:37:51 +00002555 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002556
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002557 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002558 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002559 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002560 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002561
Simon Atanasyan60280b42014-05-12 07:37:51 +00002562 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002563 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002564
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002565 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002566 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002567 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002568
2569 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002570}
2571
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002572void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2573 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2574 const std::string &LibDir, StringRef CandidateTriple,
2575 bool NeedsBiarchSuffix) {
2576 // Solaris is a special case. The GCC installation is under
2577 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2578 // need to iterate twice.
2579 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002580 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2581 !EC && LI != LE; LI = LI.increment(EC)) {
2582 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002583 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2584
2585 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002586 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002587 continue; // Saw this path before; no need to look at it again.
2588 if (CandidateVersion.isOlderThan(4, 1, 1))
2589 continue;
2590 if (CandidateVersion <= Version)
2591 continue;
2592
2593 GCCInstallPath =
2594 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002595 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002596 continue;
2597
2598 // If we make it here there has to be at least one GCC version, let's just
2599 // use the latest one.
2600 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002601 for (vfs::directory_iterator
2602 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2603 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002604 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2605
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002606 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002607 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2608
2609 if (CandidateSubVersion > Version)
2610 Version = CandidateSubVersion;
2611 }
2612
2613 GCCTriple.setTriple(CandidateTriple);
2614
2615 GCCInstallPath += "/" + Version.Text;
2616 GCCParentLibPath = GCCInstallPath + "/../../../../";
2617
2618 IsValid = true;
2619 }
2620}
2621
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002622void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002623 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002624 const std::string &LibDir, StringRef CandidateTriple,
2625 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002626 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002627 // There are various different suffixes involving the triple we
2628 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002629 // up to the lib directory. Specifically, the number of "up" steps
2630 // in the second half of each row is 1 + the number of path separators
2631 // in the first half.
2632 const std::string LibAndInstallSuffixes[][2] = {
2633 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2634
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002635 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002636 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2637
2638 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2639 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002640
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002641 // The Freescale PPC SDK has the gcc libraries in
2642 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002643 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002644
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002645 // Ubuntu has a strange mis-matched pair of triples that this happens to
2646 // match.
2647 // FIXME: It may be worthwhile to generalize this and look for a second
2648 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002649 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2650
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002651 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2652 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2653 NeedsBiarchSuffix);
2654 return;
2655 }
2656
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002657 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002658 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2659 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002660 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002661 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002662 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002663 for (vfs::directory_iterator
2664 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2665 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002666 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002667 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002668 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002669 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002670 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002671 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002672 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002673 continue;
2674 if (CandidateVersion <= Version)
2675 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002676
Simon Atanasyan60280b42014-05-12 07:37:51 +00002677 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002678
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002679 // Android standalone toolchain could have multilibs for ARM and Thumb.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002680 // Debian mips multilibs behave more like the rest of the biarch ones,
2681 // so handle them there
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002682 if (isArmOrThumbArch(TargetArch) && TargetTriple.isAndroid()) {
2683 // It should also work without multilibs in a simplified toolchain.
2684 findAndroidArmMultilibs(D, TargetTriple, LI->getName(), Args, Detected);
2685 } else if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002686 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002687 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002688 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002689 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002690 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002691 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002692
Simon Atanasyan60280b42014-05-12 07:37:51 +00002693 Multilibs = Detected.Multilibs;
2694 SelectedMultilib = Detected.SelectedMultilib;
2695 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002696 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002697 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002698 // FIXME: We hack together the directory name here instead of
2699 // using LI to ensure stable path separators across Windows and
2700 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002701 GCCInstallPath =
2702 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2703 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002704 IsValid = true;
2705 }
2706 }
2707}
2708
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002709Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002710 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002711 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002712 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002713 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002714 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002715}
2716
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002717Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002718
Rafael Espindola7cf32212013-03-20 03:05:54 +00002719Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002720 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002721 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002722 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002723 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002724 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002725 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002726 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002727 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002728 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002729 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002730 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002731 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002732}
2733
Rafael Espindola7cf32212013-03-20 03:05:54 +00002734Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002735 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002736}
2737
Douglas Katzman95354292015-06-23 20:42:09 +00002738Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002739
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002740void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2741 // Print the information about how we detected the GCC installation.
2742 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002743 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002744}
2745
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002746bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002747 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002748}
2749
David Majnemer17f448b2015-06-28 04:23:33 +00002750bool Generic_GCC::isPICDefault() const {
2751 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2752}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002753
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002754bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002755
David Majnemer17f448b2015-06-28 04:23:33 +00002756bool Generic_GCC::isPICDefaultForced() const {
2757 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2758}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002759
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002760bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002761 switch (getTriple().getArch()) {
2762 case llvm::Triple::x86:
2763 case llvm::Triple::x86_64:
2764 case llvm::Triple::aarch64:
2765 case llvm::Triple::aarch64_be:
2766 case llvm::Triple::arm:
2767 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002768 case llvm::Triple::bpfel:
2769 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002770 case llvm::Triple::thumb:
2771 case llvm::Triple::thumbeb:
2772 case llvm::Triple::ppc:
2773 case llvm::Triple::ppc64:
2774 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002775 case llvm::Triple::systemz:
Daniel Sanderse160f832016-05-14 12:43:08 +00002776 case llvm::Triple::mips:
2777 case llvm::Triple::mipsel:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002778 return true;
Simon Dardis9edf96e2016-09-15 14:01:55 +00002779 case llvm::Triple::mips64:
2780 case llvm::Triple::mips64el:
2781 // Enabled for Debian mips64/mips64el only. Other targets are unable to
2782 // distinguish N32 from N64.
2783 if (getTriple().getEnvironment() == llvm::Triple::GNUABI64)
2784 return true;
2785 return false;
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002786 default:
2787 return false;
2788 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002789}
2790
James Y Knighta6c9ee72015-10-16 18:46:26 +00002791/// \brief Helper to add the variant paths of a libstdc++ installation.
2792bool Generic_GCC::addLibStdCXXIncludePaths(
2793 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2794 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2795 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2796 if (!getVFS().exists(Base + Suffix))
2797 return false;
2798
2799 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2800
2801 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2802 // that path exists or we have neither a GCC nor target multiarch triple, use
2803 // this vanilla search path.
2804 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2805 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2806 addSystemInclude(DriverArgs, CC1Args,
2807 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2808 } else {
2809 // Otherwise try to use multiarch naming schemes which have normalized the
2810 // triples and put the triple before the suffix.
2811 //
2812 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2813 // the target triple, so we support that here.
2814 addSystemInclude(DriverArgs, CC1Args,
2815 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2816 addSystemInclude(DriverArgs, CC1Args,
2817 Base + "/" + TargetMultiarchTriple + Suffix);
2818 }
2819
2820 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2821 return true;
2822}
2823
Kristof Beylsfb387292014-01-10 13:44:34 +00002824void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2825 ArgStringList &CC1Args) const {
2826 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002827 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002828 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002829 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002830 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002831 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002832 getTriple().getOS() == llvm::Triple::NaCl ||
2833 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2834 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002835
2836 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002837 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002838 CC1Args.push_back("-fuse-init-array");
2839}
2840
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002841/// Mips Toolchain
2842MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2843 const llvm::Triple &Triple,
2844 const ArgList &Args)
2845 : Linux(D, Triple, Args) {
2846 // Select the correct multilib according to the given arguments.
2847 DetectedMultilibs Result;
2848 findMIPSMultilibs(D, Triple, "", Args, Result);
2849 Multilibs = Result.Multilibs;
2850 SelectedMultilib = Result.SelectedMultilib;
2851
2852 // Find out the library suffix based on the ABI.
2853 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2854 getFilePaths().clear();
2855 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2856
2857 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002858 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002859}
2860
2861void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2862 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2863 if (DriverArgs.hasArg(options::OPT_nostdinc))
2864 return;
2865
2866 const Driver &D = getDriver();
2867
2868 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2869 SmallString<128> P(D.ResourceDir);
2870 llvm::sys::path::append(P, "include");
2871 addSystemInclude(DriverArgs, CC1Args, P);
2872 }
2873
2874 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2875 return;
2876
2877 const auto &Callback = Multilibs.includeDirsCallback();
2878 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002879 for (const auto &Path : Callback(SelectedMultilib))
2880 addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
2881 D.getInstalledDir() + Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002882 }
2883}
2884
2885Tool *MipsLLVMToolChain::buildLinker() const {
2886 return new tools::gnutools::Linker(*this);
2887}
2888
2889std::string MipsLLVMToolChain::computeSysRoot() const {
2890 if (!getDriver().SysRoot.empty())
2891 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2892
2893 const std::string InstalledDir(getDriver().getInstalledDir());
2894 std::string SysRootPath =
2895 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2896 if (llvm::sys::fs::exists(SysRootPath))
2897 return SysRootPath;
2898
2899 return std::string();
2900}
2901
2902ToolChain::CXXStdlibType
2903MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2904 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2905 if (A) {
2906 StringRef Value = A->getValue();
2907 if (Value != "libc++")
2908 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2909 << A->getAsString(Args);
2910 }
2911
2912 return ToolChain::CST_Libcxx;
2913}
2914
2915void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2916 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2917 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2918 DriverArgs.hasArg(options::OPT_nostdincxx))
2919 return;
2920
2921 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2922 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2923
2924 const auto &Callback = Multilibs.includeDirsCallback();
2925 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002926 for (std::string Path : Callback(SelectedMultilib)) {
2927 Path = getDriver().getInstalledDir() + Path + "/c++/v1";
2928 if (llvm::sys::fs::exists(Path)) {
2929 addSystemInclude(DriverArgs, CC1Args, Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002930 break;
2931 }
2932 }
2933 }
2934}
2935
2936void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2937 ArgStringList &CmdArgs) const {
2938 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2939 "Only -lc++ (aka libxx) is suported in this toolchain.");
2940
2941 CmdArgs.push_back("-lc++");
2942 CmdArgs.push_back("-lc++abi");
2943 CmdArgs.push_back("-lunwind");
2944}
2945
Vedant Kumar5fb00e42016-07-27 23:01:55 +00002946std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2947 StringRef Component,
2948 bool Shared) const {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002949 SmallString<128> Path(getDriver().ResourceDir);
2950 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2951 getOS());
2952 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002953 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002954 return Path.str();
2955}
2956
Tony Linthicum76329bf2011-12-12 21:14:55 +00002957/// Hexagon Toolchain
2958
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002959std::string HexagonToolChain::getHexagonTargetDir(
2960 const std::string &InstalledDir,
2961 const SmallVectorImpl<std::string> &PrefixDirs) const {
2962 std::string InstallRelDir;
2963 const Driver &D = getDriver();
2964
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002965 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002966 for (auto &I : PrefixDirs)
2967 if (D.getVFS().exists(I))
2968 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00002969
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002970 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002971 return InstallRelDir;
2972
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002973 return InstallRelDir;
2974}
2975
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002976Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
2977 const ArgList &Args) {
2978 StringRef Gn = "";
2979 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
2980 options::OPT_msmall_data_threshold_EQ)) {
2981 Gn = A->getValue();
2982 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
2983 options::OPT_fPIC)) {
2984 Gn = "0";
2985 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002986
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002987 unsigned G;
2988 if (!Gn.getAsInteger(10, G))
2989 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002990
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002991 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002992}
2993
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002994void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
2995 ToolChain::path_list &LibPaths) const {
2996 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00002997
2998 //----------------------------------------------------------------------------
2999 // -L Args
3000 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003001 for (Arg *A : Args.filtered(options::OPT_L))
3002 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003003 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00003004
3005 //----------------------------------------------------------------------------
3006 // Other standard paths
3007 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003008 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00003009 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
3010 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00003011
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003012 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
3013 D.PrefixDirs);
3014 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
3015 RootDirs.push_back(TargetDir);
3016
3017 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
3018 // Assume G0 with -shared.
3019 bool HasG0 = Args.hasArg(options::OPT_shared);
3020 if (auto G = getSmallDataThreshold(Args))
3021 HasG0 = G.getValue() == 0;
3022
3023 const std::string CpuVer = GetTargetCPUVersion(Args).str();
3024 for (auto &Dir : RootDirs) {
3025 std::string LibDir = Dir + "/hexagon/lib";
3026 std::string LibDirCpu = LibDir + '/' + CpuVer;
3027 if (HasG0) {
3028 if (HasPIC)
3029 LibPaths.push_back(LibDirCpu + "/G0/pic");
3030 LibPaths.push_back(LibDirCpu + "/G0");
3031 }
3032 LibPaths.push_back(LibDirCpu);
3033 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00003034 }
Matthew Curtise689b052012-12-06 15:46:07 +00003035}
3036
Douglas Katzman54366072015-07-27 16:53:08 +00003037HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003038 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003039 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003040 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
3041 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003042
3043 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
3044 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003045 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003046 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003047 getProgramPaths().push_back(BinDir);
3048
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003049 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00003050
3051 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
3052 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
3053 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003054 LibPaths.clear();
3055 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003056}
3057
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00003058HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00003059
Douglas Katzman54366072015-07-27 16:53:08 +00003060Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003061 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003062}
3063
Douglas Katzman54366072015-07-27 16:53:08 +00003064Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003065 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003066}
3067
Douglas Katzman54366072015-07-27 16:53:08 +00003068void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3069 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003070 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3071 DriverArgs.hasArg(options::OPT_nostdlibinc))
3072 return;
3073
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003074 const Driver &D = getDriver();
3075 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
3076 D.PrefixDirs);
3077 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003078}
3079
Douglas Katzman54366072015-07-27 16:53:08 +00003080void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
3081 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003082 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3083 DriverArgs.hasArg(options::OPT_nostdincxx))
3084 return;
3085
3086 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003087 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
3088 addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003089}
Matthew Curtisf10a5952012-12-06 14:16:43 +00003090
Matthew Curtise689b052012-12-06 15:46:07 +00003091ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00003092HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00003093 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
3094 if (!A)
3095 return ToolChain::CST_Libstdcxx;
3096
3097 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003098 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003099 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00003100
3101 return ToolChain::CST_Libstdcxx;
3102}
3103
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003104//
3105// Returns the default CPU for Hexagon. This is the default compilation target
3106// if no Hexagon processor is selected at the command-line.
3107//
3108const StringRef HexagonToolChain::GetDefaultCPU() {
3109 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003110}
3111
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003112const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
3113 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00003114 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
3115 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003116
3117 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
3118 if (CPU.startswith("hexagon"))
3119 return CPU.substr(sizeof("hexagon") - 1);
3120 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00003121}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003122// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00003123
Tom Stellard8fa33092015-07-18 01:49:05 +00003124/// AMDGPU Toolchain
3125AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
3126 const ArgList &Args)
3127 : Generic_ELF(D, Triple, Args) { }
3128
3129Tool *AMDGPUToolChain::buildLinker() const {
3130 return new tools::amdgpu::Linker(*this);
3131}
3132// End AMDGPU
3133
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003134/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00003135NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
3136 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003137 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003138
3139 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
3140 // default paths, and must instead only use the paths provided
3141 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003142 path_list &file_paths = getFilePaths();
3143 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003144
3145 file_paths.clear();
3146 prog_paths.clear();
3147
3148 // Path for library files (libc.a, ...)
3149 std::string FilePath(getDriver().Dir + "/../");
3150
3151 // Path for tools (clang, ld, etc..)
3152 std::string ProgPath(getDriver().Dir + "/../");
3153
3154 // Path for toolchain libraries (libgcc.a, ...)
3155 std::string ToolPath(getDriver().ResourceDir + "/lib/");
3156
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003157 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00003158 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003159 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00003160 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003161 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3162 file_paths.push_back(ToolPath + "i686-nacl");
3163 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003164 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003165 file_paths.push_back(FilePath + "x86_64-nacl/lib");
3166 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
3167 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3168 file_paths.push_back(ToolPath + "x86_64-nacl");
3169 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003170 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003171 file_paths.push_back(FilePath + "arm-nacl/lib");
3172 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
3173 prog_paths.push_back(ProgPath + "arm-nacl/bin");
3174 file_paths.push_back(ToolPath + "arm-nacl");
3175 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003176 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003177 file_paths.push_back(FilePath + "mipsel-nacl/lib");
3178 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
3179 prog_paths.push_back(ProgPath + "bin");
3180 file_paths.push_back(ToolPath + "mipsel-nacl");
3181 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003182 default:
3183 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003184 }
3185
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003186 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
3187}
3188
Douglas Katzman54366072015-07-27 16:53:08 +00003189void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3190 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003191 const Driver &D = getDriver();
3192 if (DriverArgs.hasArg(options::OPT_nostdinc))
3193 return;
3194
3195 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
3196 SmallString<128> P(D.ResourceDir);
3197 llvm::sys::path::append(P, "include");
3198 addSystemInclude(DriverArgs, CC1Args, P.str());
3199 }
3200
3201 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3202 return;
3203
3204 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003205 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00003206 case llvm::Triple::x86:
3207 // x86 is special because multilib style uses x86_64-nacl/include for libc
3208 // headers but the SDK wants i686-nacl/usr/include. The other architectures
3209 // have the same substring.
3210 llvm::sys::path::append(P, "i686-nacl/usr/include");
3211 addSystemInclude(DriverArgs, CC1Args, P.str());
3212 llvm::sys::path::remove_filename(P);
3213 llvm::sys::path::remove_filename(P);
3214 llvm::sys::path::remove_filename(P);
3215 llvm::sys::path::append(P, "x86_64-nacl/include");
3216 addSystemInclude(DriverArgs, CC1Args, P.str());
3217 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003218 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003219 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003220 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003221 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003222 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003223 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003224 case llvm::Triple::mipsel:
3225 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
3226 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003227 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003228 return;
3229 }
3230
3231 addSystemInclude(DriverArgs, CC1Args, P.str());
3232 llvm::sys::path::remove_filename(P);
3233 llvm::sys::path::remove_filename(P);
3234 llvm::sys::path::append(P, "include");
3235 addSystemInclude(DriverArgs, CC1Args, P.str());
3236}
3237
Douglas Katzman54366072015-07-27 16:53:08 +00003238void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3239 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003240 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3241 // if the value is libc++, and emits an error for other values.
3242 GetCXXStdlibType(Args);
3243 CmdArgs.push_back("-lc++");
3244}
3245
Douglas Katzman54366072015-07-27 16:53:08 +00003246void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3247 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003248 const Driver &D = getDriver();
3249 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3250 DriverArgs.hasArg(options::OPT_nostdincxx))
3251 return;
3252
3253 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3254 // if the value is libc++, and emits an error for other values.
3255 GetCXXStdlibType(DriverArgs);
3256
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003257 SmallString<128> P(D.Dir + "/../");
3258 switch (getTriple().getArch()) {
3259 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003260 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
3261 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003262 break;
3263 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003264 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
3265 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003266 break;
3267 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003268 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
3269 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003270 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003271 case llvm::Triple::mipsel:
3272 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
3273 addSystemInclude(DriverArgs, CC1Args, P.str());
3274 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00003275 default:
3276 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003277 }
3278}
3279
Douglas Katzman54366072015-07-27 16:53:08 +00003280ToolChain::CXXStdlibType
3281NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003282 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3283 StringRef Value = A->getValue();
3284 if (Value == "libc++")
3285 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003286 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003287 }
3288
3289 return ToolChain::CST_Libcxx;
3290}
3291
Douglas Katzman54366072015-07-27 16:53:08 +00003292std::string
3293NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
3294 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003295 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
3296 if (TheTriple.getArch() == llvm::Triple::arm &&
3297 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
3298 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
3299 return TheTriple.getTriple();
3300}
3301
Douglas Katzman54366072015-07-27 16:53:08 +00003302Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003303 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003304}
3305
Douglas Katzman54366072015-07-27 16:53:08 +00003306Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003307 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00003308 return new tools::nacltools::AssemblerARM(*this);
3309 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003310}
3311// End NaCl
3312
Chris Lattner09797542010-03-04 21:07:38 +00003313/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
3314/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
3315/// Currently does not support anything else but compilation.
3316
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003317TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00003318 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003319 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00003320 // Path mangling to find libexec
3321 std::string Path(getDriver().Dir);
3322
3323 Path += "/../libexec";
3324 getProgramPaths().push_back(Path);
3325}
3326
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00003327TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00003328
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003329bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00003330
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003331bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003332
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003333bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003334
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003335bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003336
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003337// CloudABI - CloudABI tool chain which can call ld(1) directly.
3338
3339CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
3340 const ArgList &Args)
3341 : Generic_ELF(D, Triple, Args) {
3342 SmallString<128> P(getDriver().Dir);
3343 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
3344 getFilePaths().push_back(P.str());
3345}
3346
3347void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3348 ArgStringList &CC1Args) const {
3349 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
3350 DriverArgs.hasArg(options::OPT_nostdincxx))
3351 return;
3352
3353 SmallString<128> P(getDriver().Dir);
3354 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
3355 addSystemInclude(DriverArgs, CC1Args, P.str());
3356}
3357
3358void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
3359 ArgStringList &CmdArgs) const {
3360 CmdArgs.push_back("-lc++");
3361 CmdArgs.push_back("-lc++abi");
3362 CmdArgs.push_back("-lunwind");
3363}
3364
Douglas Katzman95354292015-06-23 20:42:09 +00003365Tool *CloudABI::buildLinker() const {
3366 return new tools::cloudabi::Linker(*this);
3367}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003368
Ed Schouten610adae2016-08-11 20:03:22 +00003369bool CloudABI::isPIEDefault() const {
3370 // Only enable PIE on architectures that support PC-relative
3371 // addressing. PC-relative addressing is required, as the process
3372 // startup code must be able to relocate itself.
3373 switch (getTriple().getArch()) {
3374 case llvm::Triple::aarch64:
3375 case llvm::Triple::x86_64:
3376 return true;
3377 default:
3378 return false;
3379 }
3380}
3381
Ed Schouten51bfbe72016-02-17 18:56:20 +00003382SanitizerMask CloudABI::getSupportedSanitizers() const {
3383 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3384 Res |= SanitizerKind::SafeStack;
3385 return Res;
3386}
3387
Ed Schoutenfc79d2c2016-03-29 21:13:53 +00003388SanitizerMask CloudABI::getDefaultSanitizers() const {
3389 return SanitizerKind::SafeStack;
3390}
3391
Reid Kleckner330fb172016-05-11 16:19:05 +00003392/// Haiku - Haiku tool chain which can call as(1) and ld(1) directly.
3393
3394Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
3395 : Generic_ELF(D, Triple, Args) {
3396
3397}
3398
3399void Haiku::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3400 ArgStringList &CC1Args) const {
3401 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3402 DriverArgs.hasArg(options::OPT_nostdincxx))
3403 return;
3404
3405 switch (GetCXXStdlibType(DriverArgs)) {
3406 case ToolChain::CST_Libcxx:
3407 addSystemInclude(DriverArgs, CC1Args,
3408 getDriver().SysRoot + "/system/develop/headers/c++/v1");
3409 break;
3410 case ToolChain::CST_Libstdcxx:
3411 addSystemInclude(DriverArgs, CC1Args,
3412 getDriver().SysRoot + "/system/develop/headers/c++");
3413 addSystemInclude(DriverArgs, CC1Args,
3414 getDriver().SysRoot + "/system/develop/headers/c++/backward");
3415
3416 StringRef Triple = getTriple().str();
3417 addSystemInclude(DriverArgs, CC1Args,
3418 getDriver().SysRoot + "/system/develop/headers/c++/" +
3419 Triple);
3420 break;
3421 }
3422}
3423
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003424/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3425
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003426OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3427 const ArgList &Args)
3428 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003429 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003430 getFilePaths().push_back("/usr/lib");
3431}
3432
Rafael Espindola7cf32212013-03-20 03:05:54 +00003433Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003434 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003435}
3436
Douglas Katzman95354292015-06-23 20:42:09 +00003437Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003438
Eli Friedman9fa28852012-08-08 23:57:20 +00003439/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3440
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003441Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3442 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003443 getFilePaths().push_back(getDriver().Dir + "/../lib");
3444 getFilePaths().push_back("/usr/lib");
3445}
3446
Rafael Espindola7cf32212013-03-20 03:05:54 +00003447Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003448 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003449}
3450
Douglas Katzman95354292015-06-23 20:42:09 +00003451Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003452
Jonas Hahnfeldaae83742016-02-12 07:48:37 +00003453ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
Richard Smith51af5192014-05-01 23:24:24 +00003454 return ToolChain::CST_Libcxx;
3455}
3456
Eli Friedman9fa28852012-08-08 23:57:20 +00003457void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3458 ArgStringList &CC1Args) const {
3459 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3460 DriverArgs.hasArg(options::OPT_nostdincxx))
3461 return;
3462
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003463 switch (GetCXXStdlibType(DriverArgs)) {
3464 case ToolChain::CST_Libcxx:
3465 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003466 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003467 break;
3468 case ToolChain::CST_Libstdcxx:
3469 addSystemInclude(DriverArgs, CC1Args,
3470 getDriver().SysRoot + "/usr/include/c++/stdc++");
3471 addSystemInclude(DriverArgs, CC1Args,
3472 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003473
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003474 StringRef Triple = getTriple().str();
3475 if (Triple.startswith("amd64"))
3476 addSystemInclude(DriverArgs, CC1Args,
3477 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003478 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003479 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003480 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3481 "/usr/include/c++/stdc++/" +
3482 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003483 break;
3484 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003485}
3486
3487void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3488 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003489 switch (GetCXXStdlibType(Args)) {
3490 case ToolChain::CST_Libcxx:
3491 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003492 CmdArgs.push_back("-lc++abi");
3493 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003494 break;
3495 case ToolChain::CST_Libstdcxx:
3496 CmdArgs.push_back("-lstdc++");
3497 break;
3498 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003499}
3500
Daniel Dunbare24297c2009-03-30 21:06:03 +00003501/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3502
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003503FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3504 const ArgList &Args)
3505 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003506
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003507 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3508 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003509 if ((Triple.getArch() == llvm::Triple::x86 ||
3510 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003511 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003512 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3513 else
3514 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003515}
3516
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003517ToolChain::CXXStdlibType FreeBSD::GetDefaultCXXStdlibType() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003518 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003519 return ToolChain::CST_Libcxx;
3520 return ToolChain::CST_Libstdcxx;
3521}
3522
3523void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3524 ArgStringList &CC1Args) const {
3525 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3526 DriverArgs.hasArg(options::OPT_nostdincxx))
3527 return;
3528
3529 switch (GetCXXStdlibType(DriverArgs)) {
3530 case ToolChain::CST_Libcxx:
3531 addSystemInclude(DriverArgs, CC1Args,
3532 getDriver().SysRoot + "/usr/include/c++/v1");
3533 break;
3534 case ToolChain::CST_Libstdcxx:
3535 addSystemInclude(DriverArgs, CC1Args,
3536 getDriver().SysRoot + "/usr/include/c++/4.2");
3537 addSystemInclude(DriverArgs, CC1Args,
3538 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3539 break;
3540 }
3541}
3542
Dimitry Andric60907392016-02-14 16:08:20 +00003543void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3544 ArgStringList &CmdArgs) const {
3545 CXXStdlibType Type = GetCXXStdlibType(Args);
3546 bool Profiling = Args.hasArg(options::OPT_pg);
3547
3548 switch (Type) {
3549 case ToolChain::CST_Libcxx:
3550 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3551 break;
3552
3553 case ToolChain::CST_Libstdcxx:
3554 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3555 break;
3556 }
3557}
3558
Rafael Espindola7cf32212013-03-20 03:05:54 +00003559Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003560 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003561}
3562
Douglas Katzman95354292015-06-23 20:42:09 +00003563Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003564
Tim Northovere931f9f2015-10-30 16:30:41 +00003565bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003566 // FreeBSD uses SjLj exceptions on ARM oabi.
3567 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003568 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003569 case llvm::Triple::GNUEABI:
3570 case llvm::Triple::EABI:
3571 return false;
3572
3573 default:
3574 return (getTriple().getArch() == llvm::Triple::arm ||
3575 getTriple().getArch() == llvm::Triple::thumb);
3576 }
3577}
3578
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003579bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003580
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003581bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003582
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003583SanitizerMask FreeBSD::getSupportedSanitizers() const {
3584 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3585 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3586 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3587 getTriple().getArch() == llvm::Triple::mips64el;
3588 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3589 Res |= SanitizerKind::Address;
3590 Res |= SanitizerKind::Vptr;
3591 if (IsX86_64 || IsMIPS64) {
3592 Res |= SanitizerKind::Leak;
3593 Res |= SanitizerKind::Thread;
3594 }
3595 if (IsX86 || IsX86_64) {
3596 Res |= SanitizerKind::SafeStack;
3597 }
3598 return Res;
3599}
3600
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003601/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3602
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003603NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3604 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003605 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003606 // When targeting a 32-bit platform, try the special directory used on
3607 // 64-bit hosts, and only fall back to the main library directory if that
3608 // doesn't work.
3609 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3610 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003611 switch (Triple.getArch()) {
3612 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003613 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003614 break;
3615 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003616 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003617 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003618 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003619 switch (Triple.getEnvironment()) {
3620 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003621 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003622 getFilePaths().push_back("=/usr/lib/eabi");
3623 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003624 case llvm::Triple::EABIHF:
3625 case llvm::Triple::GNUEABIHF:
3626 getFilePaths().push_back("=/usr/lib/eabihf");
3627 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003628 default:
3629 getFilePaths().push_back("=/usr/lib/oabi");
3630 break;
3631 }
3632 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003633 case llvm::Triple::mips64:
3634 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003635 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003636 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003637 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003638 getFilePaths().push_back("=/usr/lib/64");
3639 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003640 case llvm::Triple::ppc:
3641 getFilePaths().push_back("=/usr/lib/powerpc");
3642 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003643 case llvm::Triple::sparc:
3644 getFilePaths().push_back("=/usr/lib/sparc");
3645 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003646 default:
3647 break;
3648 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003649
3650 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003651 }
3652}
3653
Rafael Espindola7cf32212013-03-20 03:05:54 +00003654Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003655 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003656}
3657
Douglas Katzman95354292015-06-23 20:42:09 +00003658Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003659
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003660ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const {
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003661 unsigned Major, Minor, Micro;
3662 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003663 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003664 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003665 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003666 case llvm::Triple::arm:
3667 case llvm::Triple::armeb:
3668 case llvm::Triple::thumb:
3669 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003670 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003671 case llvm::Triple::ppc64:
3672 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003673 case llvm::Triple::sparc:
3674 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003675 case llvm::Triple::x86:
3676 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003677 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003678 default:
3679 break;
3680 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003681 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003682 return ToolChain::CST_Libstdcxx;
3683}
3684
3685void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3686 ArgStringList &CC1Args) const {
3687 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3688 DriverArgs.hasArg(options::OPT_nostdincxx))
3689 return;
3690
3691 switch (GetCXXStdlibType(DriverArgs)) {
3692 case ToolChain::CST_Libcxx:
3693 addSystemInclude(DriverArgs, CC1Args,
3694 getDriver().SysRoot + "/usr/include/c++/");
3695 break;
3696 case ToolChain::CST_Libstdcxx:
3697 addSystemInclude(DriverArgs, CC1Args,
3698 getDriver().SysRoot + "/usr/include/g++");
3699 addSystemInclude(DriverArgs, CC1Args,
3700 getDriver().SysRoot + "/usr/include/g++/backward");
3701 break;
3702 }
3703}
3704
Chris Lattner3e2ee142010-07-07 16:01:42 +00003705/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3706
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003707Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3708 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003709 getFilePaths().push_back(getDriver().Dir + "/../lib");
3710 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003711}
3712
Rafael Espindola7cf32212013-03-20 03:05:54 +00003713Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003714 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003715}
3716
Douglas Katzman95354292015-06-23 20:42:09 +00003717Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003718
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003719static void addPathIfExists(const Driver &D, const Twine &Path,
3720 ToolChain::path_list &Paths) {
3721 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003722 Paths.push_back(Path.str());
3723}
3724
David Chisnallf571cde2012-02-15 13:39:01 +00003725/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3726
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003727Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003728 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003729 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003730
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003731 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003732
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003733 path_list &Paths = getFilePaths();
3734 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003735 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003736
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003737 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003738 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003739 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003740
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003741 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003742
3743 std::string LibPath = "/usr/lib/";
3744 switch (Triple.getArch()) {
3745 case llvm::Triple::x86:
3746 case llvm::Triple::sparc:
3747 break;
3748 case llvm::Triple::x86_64:
3749 LibPath += "amd64/";
3750 break;
3751 case llvm::Triple::sparcv9:
3752 LibPath += "sparcv9/";
3753 break;
3754 default:
3755 llvm_unreachable("Unsupported architecture");
3756 }
3757
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003758 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003759}
3760
Rafael Espindola7cf32212013-03-20 03:05:54 +00003761Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003762 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003763}
3764
Douglas Katzman95354292015-06-23 20:42:09 +00003765Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003766
Rafael Espindolad5117262015-09-09 13:36:00 +00003767void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3768 ArgStringList &CC1Args) const {
3769 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3770 DriverArgs.hasArg(options::OPT_nostdincxx))
3771 return;
3772
3773 // Include the support directory for things like xlocale and fudged system
3774 // headers.
3775 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3776
3777 if (GCCInstallation.isValid()) {
3778 GCCVersion Version = GCCInstallation.getVersion();
3779 addSystemInclude(DriverArgs, CC1Args,
3780 getDriver().SysRoot + "/usr/gcc/" +
3781 Version.MajorStr + "." +
3782 Version.MinorStr +
3783 "/include/c++/" + Version.Text);
3784 addSystemInclude(DriverArgs, CC1Args,
3785 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3786 "." + Version.MinorStr + "/include/c++/" +
3787 Version.Text + "/" +
3788 GCCInstallation.getTriple().str());
3789 }
3790}
3791
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003792/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003793
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003794enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003795 // NB: Releases of a particular Linux distro should be kept together
3796 // in this enum, because some tests are done by integer comparison against
3797 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003798 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003799 DebianLenny,
3800 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003801 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003802 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003803 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003804 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003805 RHEL5,
3806 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003807 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003808 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003809 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003810 UbuntuHardy,
3811 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003812 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003813 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003814 UbuntuLucid,
3815 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003816 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003817 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003818 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003819 UbuntuQuantal,
3820 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003821 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003822 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003823 UbuntuUtopic,
3824 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003825 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003826 UbuntuXenial,
Sylvestre Ledrud3078e72016-07-19 14:00:57 +00003827 UbuntuYakkety,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003828 UnknownDistro
3829};
3830
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003831static bool IsRedhat(enum Distro Distro) {
Rafael Espindola52fe8962016-05-09 13:13:50 +00003832 return Distro == Fedora || (Distro >= RHEL5 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003833}
3834
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003835static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003836
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003837static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003838 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003839}
3840
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003841static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledrud3078e72016-07-19 14:00:57 +00003842 return Distro >= UbuntuHardy && Distro <= UbuntuYakkety;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003843}
3844
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003845static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003846 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3847 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3848 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003849 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003850 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003851 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003852 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003853 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003854 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3855 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3856 .Case("hardy", UbuntuHardy)
3857 .Case("intrepid", UbuntuIntrepid)
3858 .Case("jaunty", UbuntuJaunty)
3859 .Case("karmic", UbuntuKarmic)
3860 .Case("lucid", UbuntuLucid)
3861 .Case("maverick", UbuntuMaverick)
3862 .Case("natty", UbuntuNatty)
3863 .Case("oneiric", UbuntuOneiric)
3864 .Case("precise", UbuntuPrecise)
3865 .Case("quantal", UbuntuQuantal)
3866 .Case("raring", UbuntuRaring)
3867 .Case("saucy", UbuntuSaucy)
3868 .Case("trusty", UbuntuTrusty)
3869 .Case("utopic", UbuntuUtopic)
3870 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003871 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003872 .Case("xenial", UbuntuXenial)
Sylvestre Ledrud3078e72016-07-19 14:00:57 +00003873 .Case("yakkety", UbuntuYakkety)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003874 .Default(UnknownDistro);
Rafael Espindola52fe8962016-05-09 13:13:50 +00003875 if (Version != UnknownDistro)
3876 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003877 }
3878
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003879 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3880 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003881 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003882 if (Data.startswith("Fedora release"))
3883 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003884 if (Data.startswith("Red Hat Enterprise Linux") ||
Rafael Espindola52fe8962016-05-09 13:13:50 +00003885 Data.startswith("CentOS") ||
3886 Data.startswith("Scientific Linux")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003887 if (Data.find("release 7") != StringRef::npos)
3888 return RHEL7;
3889 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003890 return RHEL6;
3891 else if (Data.find("release 5") != StringRef::npos)
3892 return RHEL5;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003893 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003894 return UnknownDistro;
3895 }
3896
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003897 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3898 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003899 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003900 if (Data[0] == '5')
3901 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003902 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003903 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003904 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003905 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003906 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003907 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003908 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3909 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003910 return UnknownDistro;
3911 }
3912
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003913 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003914 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003915
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003916 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003917 return Exherbo;
3918
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003919 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003920 return ArchLinux;
3921
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003922 return UnknownDistro;
3923}
3924
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003925/// \brief Get our best guess at the multiarch triple for a target.
3926///
3927/// Debian-based systems are starting to use a multiarch setup where they use
3928/// a target-triple directory in the library and header search paths.
3929/// Unfortunately, this triple does not align with the vanilla target triple,
3930/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003931static std::string getMultiarchTriple(const Driver &D,
3932 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003933 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003934 llvm::Triple::EnvironmentType TargetEnvironment =
3935 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003936
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003937 // For most architectures, just use whatever we have rather than trying to be
3938 // clever.
3939 switch (TargetTriple.getArch()) {
3940 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003941 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003942
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003943 // We use the existence of '/lib/<triple>' as a directory to detect some
3944 // common linux triples that don't quite match the Clang triple for both
3945 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3946 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003947 case llvm::Triple::arm:
3948 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003949 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003950 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003951 return "arm-linux-gnueabihf";
3952 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003953 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003954 return "arm-linux-gnueabi";
3955 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003956 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003957 case llvm::Triple::armeb:
3958 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003959 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003960 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003961 return "armeb-linux-gnueabihf";
3962 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003963 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003964 return "armeb-linux-gnueabi";
3965 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003966 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003967 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003968 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003969 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003970 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003971 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003972 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003973 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003974 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003975 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003976 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003977 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003978 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003979 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003980 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003981 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003982 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003983 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003984 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003985 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003986 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003987 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003988 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003989 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003990 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003991 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003992 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003993 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003994 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003995 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003996 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003997 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003998 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003999 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004000 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004001 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004002 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004003 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004004 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004005 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004006 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00004007 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004008 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004009 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004010 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004011 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004012 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004013 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004014 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00004015 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004016 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00004017 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004018 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00004019 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004020 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00004021 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004022 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00004023 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004024 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00004025 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004026 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004027 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004028 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004029 return "s390x-linux-gnu";
4030 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004031 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004032 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004033}
4034
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004035static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00004036 if (isMipsArch(Triple.getArch())) {
Simon Atanasyan603018a2016-07-19 07:09:48 +00004037 if (Triple.isAndroid()) {
4038 StringRef CPUName;
4039 StringRef ABIName;
4040 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
4041 if (CPUName == "mips32r6")
4042 return "libr6";
4043 if (CPUName == "mips32r2")
4044 return "libr2";
4045 }
Chandler Carruthda797042013-10-29 10:27:30 +00004046 // lib32 directory has a special meaning on MIPS targets.
4047 // It contains N32 ABI binaries. Use this folder if produce
4048 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004049 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00004050 return "lib32";
4051 return Triple.isArch32Bit() ? "lib" : "lib64";
4052 }
Simon Atanasyand4413882012-09-14 11:27:24 +00004053
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004054 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00004055 // using that variant while targeting other architectures causes problems
4056 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004057 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00004058 // them when we know we may need it.
4059 //
4060 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004061 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00004062 // GCCInstallationDetector, but that is a more significant refactoring.
4063 if (Triple.getArch() == llvm::Triple::x86 ||
4064 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00004065 return "lib32";
4066
Zinovy Nis1db95732014-07-10 15:27:19 +00004067 if (Triple.getArch() == llvm::Triple::x86_64 &&
4068 Triple.getEnvironment() == llvm::Triple::GNUX32)
4069 return "libx32";
4070
Simon Atanasyand4413882012-09-14 11:27:24 +00004071 return Triple.isArch32Bit() ? "lib" : "lib64";
4072}
4073
Simon Atanasyan2834a222016-05-22 18:18:07 +00004074static void addMultilibsFilePaths(const Driver &D, const MultilibSet &Multilibs,
4075 const Multilib &Multilib,
4076 StringRef InstallPath,
4077 ToolChain::path_list &Paths) {
4078 if (const auto &PathsCallback = Multilibs.filePathsCallback())
4079 for (const auto &Path : PathsCallback(Multilib))
4080 addPathIfExists(D, InstallPath + Path, Paths);
4081}
4082
Rafael Espindola1af7c212012-02-19 01:38:32 +00004083Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004084 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004085 GCCInstallation.init(Triple, Args);
4086 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004087 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00004088 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00004089 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004090
Rafael Espindola10a63c22013-07-03 14:14:00 +00004091 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00004092 // least) put various tools in a triple-prefixed directory off of the parent
4093 // of the GCC installation. We use the GCC triple here to ensure that we end
4094 // up with tools that support the same amount of cross compiling as the
4095 // detected GCC installation. For example, if we find a GCC installation
4096 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
4097 // used to target i386.
4098 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00004099 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00004100 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004101 GCCInstallation.getTriple().str() + "/bin")
4102 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00004103
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004104 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004105
Rafael Espindola10a63c22013-07-03 14:14:00 +00004106 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00004107 ExtraOpts.push_back("-z");
4108 ExtraOpts.push_back("relro");
4109 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004110
Douglas Gregord9bb1522011-03-06 19:11:49 +00004111 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004112 ExtraOpts.push_back("-X");
4113
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004114 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004115 const bool IsMips = isMipsArch(Arch);
4116
4117 if (IsMips && !SysRoot.empty())
4118 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00004119
Chandler Carruth0b842912011-12-09 04:45:18 +00004120 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
4121 // and the MIPS ABI require .dynsym to be sorted in different ways.
4122 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
4123 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00004124 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004125 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00004126 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00004127 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00004128 ExtraOpts.push_back("--hash-style=gnu");
4129
Rafael Espindola10a63c22013-07-03 14:14:00 +00004130 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00004131 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
4132 ExtraOpts.push_back("--hash-style=both");
4133 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004134
Rafael Espindola52fe8962016-05-09 13:13:50 +00004135 if (IsRedhat(Distro) && Distro != RHEL5 && Distro != RHEL6)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004136 ExtraOpts.push_back("--no-add-needed");
4137
Rafael Espindola5ed89d42016-06-03 17:26:16 +00004138#ifdef ENABLE_LINKER_BUILD_ID
4139 ExtraOpts.push_back("--build-id");
4140#endif
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004141
Rafael Espindola10a63c22013-07-03 14:14:00 +00004142 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00004143 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00004144
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004145 // The selection of paths to try here is designed to match the patterns which
4146 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
4147 // This was determined by running GCC in a fake filesystem, creating all
4148 // possible permutations of these directories, and seeing which ones it added
4149 // to the link paths.
4150 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00004151
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004152 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004153 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004154
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004155 // Add the multilib suffixed paths where they are available.
4156 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00004157 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00004158 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004159 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan2834a222016-05-22 18:18:07 +00004160 const MultilibSet &Multilibs = GCCInstallation.getMultilibs();
4161
4162 // Add toolchain / multilib specific file paths.
4163 addMultilibsFilePaths(D, Multilibs, Multilib,
4164 GCCInstallation.getInstallPath(), Paths);
Simon Atanasyan53fefd12012-10-03 17:46:38 +00004165
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004166 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00004167 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004168 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004169 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004170
4171 // GCC cross compiling toolchains will install target libraries which ship
4172 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
4173 // any part of the GCC installation in
4174 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
4175 // debatable, but is the reality today. We need to search this tree even
4176 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004177 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004178 // installation that is *not* within the system root to ensure two things:
4179 //
4180 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00004181 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004182 // appropriate rpath.
4183 // 2) There must not be libraries installed into
4184 // <prefix>/<triple>/<libdir> unless they should be preferred over
4185 // those within the system root.
4186 //
4187 // Note that this matches the GCC behavior. See the below comment for where
4188 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004189 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
4190 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004191 Paths);
4192
Chandler Carruth69a125b2012-04-06 16:32:06 +00004193 // If the GCC installation we found is inside of the sysroot, we want to
4194 // prefer libraries installed in the parent prefix of the GCC installation.
4195 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00004196 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004197 // This usually happens when there is an external cross compiler on the
4198 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004199 // the cross. Note that GCC does include some of these directories in some
4200 // configurations but this seems somewhere between questionable and simply
4201 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004202 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004203 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
4204 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00004205 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004206 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004207
4208 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004209 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00004210 // those searched.
4211 // FIXME: It's not clear whether we should use the driver's installed
4212 // directory ('Dir' below) or the ResourceDir.
4213 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004214 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
4215 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004216 }
4217
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004218 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
4219 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
4220 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
4221 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004222
Chandler Carruthb427c562013-06-22 11:35:51 +00004223 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004224 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00004225 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004226 addPathIfExists(D,
4227 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004228 "/../../" + OSLibDir,
4229 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00004230
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004231 // Add the 'other' biarch variant path
4232 Multilib BiarchSibling;
4233 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004234 addPathIfExists(D, GCCInstallation.getInstallPath() +
4235 BiarchSibling.gccSuffix(),
4236 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004237 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00004238
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004239 // See comments above on the multilib variant for details of why this is
4240 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004241 const std::string &LibPath = GCCInstallation.getParentLibPath();
4242 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
4243 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004244 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
4245 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004246 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004247
4248 // See comments above on the multilib variant for details of why this is
4249 // only included from within the sysroot.
4250 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004251 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004252 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004253
4254 // Similar to the logic for GCC above, if we are currently running Clang
4255 // inside of the requested system root, add its parent library path to those
4256 // searched.
4257 // FIXME: It's not clear whether we should use the driver's installed
4258 // directory ('Dir' below) or the ResourceDir.
4259 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004260 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004261
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004262 addPathIfExists(D, SysRoot + "/lib", Paths);
4263 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004264}
4265
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004266bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00004267
Douglas Katzman95354292015-06-23 20:42:09 +00004268Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00004269
4270Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004271 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00004272}
4273
Simon Atanasyana0d89572013-10-05 14:37:55 +00004274std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004275 if (!getDriver().SysRoot.empty())
4276 return getDriver().SysRoot;
4277
4278 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
4279 return std::string();
4280
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004281 // Standalone MIPS toolchains use different names for sysroot folder
4282 // and put it into different places. Here we try to check some known
4283 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004284
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004285 const StringRef InstallDir = GCCInstallation.getInstallPath();
4286 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004287 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004288
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004289 std::string Path =
4290 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
4291 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004292
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004293 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004294 return Path;
4295
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004296 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004297
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004298 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004299 return Path;
4300
4301 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004302}
4303
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004304std::string Linux::getDynamicLinker(const ArgList &Args) const {
4305 const llvm::Triple::ArchType Arch = getArch();
4306 const llvm::Triple &Triple = getTriple();
4307
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004308 const enum Distro Distro = DetectDistro(getDriver(), Arch);
4309
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004310 if (Triple.isAndroid())
4311 return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker";
Diana Picus86db9e72016-08-08 08:27:36 +00004312
4313 if (Triple.isMusl()) {
Rafael Espindola0fa66802016-06-24 21:35:06 +00004314 std::string ArchName;
Diana Picus86db9e72016-08-08 08:27:36 +00004315 bool IsArm = false;
4316
Rafael Espindola0fa66802016-06-24 21:35:06 +00004317 switch (Arch) {
Diana Picus86db9e72016-08-08 08:27:36 +00004318 case llvm::Triple::arm:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004319 case llvm::Triple::thumb:
4320 ArchName = "arm";
Diana Picus86db9e72016-08-08 08:27:36 +00004321 IsArm = true;
Rafael Espindola0fa66802016-06-24 21:35:06 +00004322 break;
Diana Picus86db9e72016-08-08 08:27:36 +00004323 case llvm::Triple::armeb:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004324 case llvm::Triple::thumbeb:
4325 ArchName = "armeb";
Diana Picus86db9e72016-08-08 08:27:36 +00004326 IsArm = true;
Rafael Espindola0fa66802016-06-24 21:35:06 +00004327 break;
4328 default:
4329 ArchName = Triple.getArchName().str();
4330 }
Diana Picus86db9e72016-08-08 08:27:36 +00004331 if (IsArm &&
4332 (Triple.getEnvironment() == llvm::Triple::MuslEABIHF ||
4333 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard))
Rafael Espindola0fa66802016-06-24 21:35:06 +00004334 ArchName += "hf";
4335
4336 return "/lib/ld-musl-" + ArchName + ".so.1";
4337 }
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004338
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004339 std::string LibDir;
4340 std::string Loader;
4341
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004342 switch (Arch) {
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004343 default:
4344 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004345
4346 case llvm::Triple::aarch64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004347 LibDir = "lib";
4348 Loader = "ld-linux-aarch64.so.1";
4349 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004350 case llvm::Triple::aarch64_be:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004351 LibDir = "lib";
4352 Loader = "ld-linux-aarch64_be.so.1";
4353 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004354 case llvm::Triple::arm:
4355 case llvm::Triple::thumb:
4356 case llvm::Triple::armeb:
4357 case llvm::Triple::thumbeb: {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004358 const bool HF =
4359 Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
4360 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004361
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004362 LibDir = "lib";
4363 Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";
4364 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004365 }
4366 case llvm::Triple::mips:
4367 case llvm::Triple::mipsel:
4368 case llvm::Triple::mips64:
4369 case llvm::Triple::mips64el: {
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004370 bool LE = (Triple.getArch() == llvm::Triple::mipsel) ||
4371 (Triple.getArch() == llvm::Triple::mips64el);
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004372 bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple);
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004373
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004374 LibDir = "lib" + tools::mips::getMipsABILibSuffix(Args, Triple);
4375
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004376 if (tools::mips::isUCLibc(Args))
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004377 Loader = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004378 else if (!Triple.hasEnvironment() &&
4379 Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies)
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004380 Loader = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004381 else
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004382 Loader = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004383
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004384 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004385 }
4386 case llvm::Triple::ppc:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004387 LibDir = "lib";
4388 Loader = "ld.so.1";
4389 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004390 case llvm::Triple::ppc64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004391 LibDir = "lib64";
4392 Loader =
4393 (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "ld64.so.2" : "ld64.so.1";
4394 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004395 case llvm::Triple::ppc64le:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004396 LibDir = "lib64";
4397 Loader =
4398 (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2";
4399 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004400 case llvm::Triple::sparc:
4401 case llvm::Triple::sparcel:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004402 LibDir = "lib";
4403 Loader = "ld-linux.so.2";
4404 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004405 case llvm::Triple::sparcv9:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004406 LibDir = "lib64";
4407 Loader = "ld-linux.so.2";
4408 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004409 case llvm::Triple::systemz:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004410 LibDir = "lib";
4411 Loader = "ld64.so.1";
4412 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004413 case llvm::Triple::x86:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004414 LibDir = "lib";
4415 Loader = "ld-linux.so.2";
4416 break;
4417 case llvm::Triple::x86_64: {
4418 bool X32 = Triple.getEnvironment() == llvm::Triple::GNUX32;
4419
4420 LibDir = X32 ? "libx32" : "lib64";
4421 Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2";
4422 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004423 }
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004424 }
4425
4426 if (Distro == Exherbo && (Triple.getVendor() == llvm::Triple::UnknownVendor ||
4427 Triple.getVendor() == llvm::Triple::PC))
4428 return "/usr/" + Triple.str() + "/lib/" + Loader;
4429 return "/" + LibDir + "/" + Loader;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004430}
4431
Chandler Carrutha796f532011-11-05 20:17:13 +00004432void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4433 ArgStringList &CC1Args) const {
4434 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00004435 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00004436
4437 if (DriverArgs.hasArg(options::OPT_nostdinc))
4438 return;
4439
4440 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004441 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004442
4443 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00004444 SmallString<128> P(D.ResourceDir);
4445 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00004446 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00004447 }
4448
4449 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
4450 return;
4451
4452 // Check for configure-time C include directories.
4453 StringRef CIncludeDirs(C_INCLUDE_DIRS);
4454 if (CIncludeDirs != "") {
4455 SmallVector<StringRef, 5> dirs;
4456 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004457 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00004458 StringRef Prefix =
4459 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004460 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00004461 }
4462 return;
4463 }
4464
4465 // Lacking those, try to detect the correct set of system includes for the
4466 // target triple.
4467
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004468 // Add include directories specific to the selected multilib set and multilib.
4469 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00004470 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004471 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00004472 for (const auto &Path : Callback(GCCInstallation.getMultilib()))
4473 addExternCSystemIncludeIfExists(
4474 DriverArgs, CC1Args, GCCInstallation.getInstallPath() + Path);
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004475 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004476 }
4477
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004478 // Implement generic Debian multiarch support.
4479 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004480 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004481
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004482 // FIXME: These are older forms of multiarch. It's not clear that they're
4483 // in use in any released version of Debian, so we should consider
4484 // removing them.
4485 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004486 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004487 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004488
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004489 // FIXME: These are older forms of multiarch. It's not clear that they're
4490 // in use in any released version of Debian, so we should consider
4491 // removing them.
4492 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
4493 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00004494 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004495 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004496 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004497 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004498 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004499 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004500 const StringRef ARMEBMultiarchIncludeDirs[] = {
4501 "/usr/include/armeb-linux-gnueabi"};
4502 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
4503 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004504 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00004505 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004506 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004507 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004508 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004509 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004510 "/usr/include/mips64el-linux-gnu",
4511 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004512 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004513 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004514 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004515 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004516 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004517 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004518 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004519 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004520 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004521 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004522 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
4523 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004524 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004525 switch (getTriple().getArch()) {
4526 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004527 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004528 break;
4529 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004530 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004531 break;
4532 case llvm::Triple::aarch64:
4533 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00004534 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004535 break;
4536 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004537 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004538 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4539 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
4540 else
4541 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004542 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004543 case llvm::Triple::armeb:
4544 case llvm::Triple::thumbeb:
4545 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4546 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
4547 else
4548 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
4549 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004550 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00004551 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004552 break;
4553 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00004554 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004555 break;
4556 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004557 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004558 break;
4559 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004560 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004561 break;
4562 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004563 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004564 break;
4565 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004566 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004567 break;
4568 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004569 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004570 break;
4571 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004572 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004573 break;
4574 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004575 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004576 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004577 case llvm::Triple::systemz:
4578 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4579 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004580 default:
4581 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004582 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004583 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004584 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004585 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004586 break;
4587 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004588 }
4589
4590 if (getTriple().getOS() == llvm::Triple::RTEMS)
4591 return;
4592
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004593 // Add an include of '/include' directly. This isn't provided by default by
4594 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4595 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004596 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004597
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004598 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004599}
4600
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004601static std::string DetectLibcxxIncludePath(StringRef base) {
4602 std::error_code EC;
4603 int MaxVersion = 0;
4604 std::string MaxVersionString = "";
4605 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4606 LI = LI.increment(EC)) {
4607 StringRef VersionText = llvm::sys::path::filename(LI->path());
4608 int Version;
4609 if (VersionText[0] == 'v' &&
4610 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4611 if (Version > MaxVersion) {
4612 MaxVersion = Version;
4613 MaxVersionString = VersionText;
4614 }
4615 }
4616 }
4617 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4618}
4619
Chandler Carrutha796f532011-11-05 20:17:13 +00004620void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4621 ArgStringList &CC1Args) const {
4622 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4623 DriverArgs.hasArg(options::OPT_nostdincxx))
4624 return;
4625
Chandler Carruthf4701732011-11-07 09:01:17 +00004626 // Check if libc++ has been enabled and provide its include paths if so.
4627 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004628 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004629 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Yaron Keren5439b642016-05-17 19:01:16 +00004630 // If this is a development, non-installed, clang, libcxx will
4631 // not be found at ../include/c++ but it likely to be found at
4632 // one of the following two locations:
4633 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/local/include/c++"),
4634 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++") };
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004635 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004636 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004637 continue;
4638 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004639 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004640 break;
4641 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004642 return;
4643 }
4644
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004645 // We need a detected GCC installation on Linux to provide libstdc++'s
4646 // headers. We handled the libc++ case above.
4647 if (!GCCInstallation.isValid())
4648 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004649
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004650 // By default, look for the C++ headers in an include directory adjacent to
4651 // the lib directory of the GCC installation. Note that this is expect to be
4652 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4653 StringRef LibDir = GCCInstallation.getParentLibPath();
4654 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004655 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004656 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004657 const std::string GCCMultiarchTriple = getMultiarchTriple(
4658 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004659 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004660 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004661 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004662
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004663 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004664 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004665 "/c++/" + Version.Text, TripleStr,
4666 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004667 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004668 return;
4669
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004670 // Otherwise, fall back on a bunch of options which don't use multiarch
4671 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004672 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004673 // Gentoo is weird and places its headers inside the GCC install,
4674 // so if the first attempt to find the headers fails, try these patterns.
Chandler Carruth81296fb2016-05-08 07:59:56 +00004675 InstallDir.str() + "/include/g++-v" + Version.Text,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004676 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4677 Version.MinorStr,
4678 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4679 // Android standalone toolchain has C++ headers in yet another place.
4680 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4681 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4682 // without a subdirectory corresponding to the gcc version.
4683 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004684 };
4685
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004686 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004687 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4688 /*GCCMultiarchTriple*/ "",
4689 /*TargetMultiarchTriple*/ "",
4690 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004691 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004692 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004693}
4694
Artem Belevichfa11ab52015-11-17 22:28:46 +00004695void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4696 ArgStringList &CC1Args) const {
4697 if (DriverArgs.hasArg(options::OPT_nocudainc))
4698 return;
4699
Justin Lebar423019d2016-04-16 00:11:11 +00004700 if (!CudaInstallation.isValid()) {
4701 getDriver().Diag(diag::err_drv_no_cuda_installation);
4702 return;
Artem Belevich86017332015-11-17 22:28:55 +00004703 }
Justin Lebar423019d2016-04-16 00:11:11 +00004704
4705 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
4706 CC1Args.push_back("-include");
4707 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevichfa11ab52015-11-17 22:28:46 +00004708}
4709
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00004710void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs,
4711 ArgStringList &CC1Args) const {
4712 if (GCCInstallation.isValid()) {
4713 CC1Args.push_back("-isystem");
4714 CC1Args.push_back(DriverArgs.MakeArgString(
4715 GCCInstallation.getParentLibPath() + "/../" +
4716 GCCInstallation.getTriple().str() + "/include"));
4717 }
4718}
4719
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004720bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004721
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004722SanitizerMask Linux::getSupportedSanitizers() const {
4723 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4724 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4725 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4726 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004727 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4728 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004729 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4730 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004731 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4732 Res |= SanitizerKind::Address;
4733 Res |= SanitizerKind::KernelAddress;
4734 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004735 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004736 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004737 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004738 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004739 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004740 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004741 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004742 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004743 Res |= SanitizerKind::Memory;
Sagar Thakurc9113e42016-09-07 12:23:15 +00004744 if (IsX86_64 || IsMIPS64)
Derek Bruening256c2e12016-04-21 21:32:04 +00004745 Res |= SanitizerKind::Efficiency;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004746 if (IsX86 || IsX86_64) {
4747 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004748 }
4749 return Res;
4750}
4751
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004752void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
Xinliang David Li170cd102015-10-27 05:15:35 +00004753 llvm::opt::ArgStringList &CmdArgs) const {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004754 if (!needsProfileRT(Args)) return;
Xinliang David Li170cd102015-10-27 05:15:35 +00004755
4756 // Add linker option -u__llvm_runtime_variable to cause runtime
4757 // initialization module to be linked in.
4758 if (!Args.hasArg(options::OPT_coverage))
4759 CmdArgs.push_back(Args.MakeArgString(
4760 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004761 ToolChain::addProfileRTLibs(Args, CmdArgs);
Xinliang David Li170cd102015-10-27 05:15:35 +00004762}
4763
Petr Hosek62e1d232016-10-06 06:08:09 +00004764/// Fuchsia - Fuchsia tool chain which can call as(1) and ld(1) directly.
4765
4766Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple,
4767 const ArgList &Args)
4768 : Generic_ELF(D, Triple, Args) {
4769
4770 getFilePaths().push_back(D.SysRoot + "/lib");
4771 getFilePaths().push_back(D.ResourceDir + "/lib/fuchsia");
4772
4773 // Use LLD by default.
4774 DefaultLinker = "lld";
4775}
4776
4777Tool *Fuchsia::buildAssembler() const {
4778 return new tools::gnutools::Assembler(*this);
4779}
4780
4781Tool *Fuchsia::buildLinker() const {
4782 return new tools::fuchsia::Linker(*this);
4783}
4784
4785ToolChain::RuntimeLibType Fuchsia::GetRuntimeLibType(
4786 const ArgList &Args) const {
4787 if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) {
4788 StringRef Value = A->getValue();
4789 if (Value != "compiler-rt")
4790 getDriver().Diag(diag::err_drv_invalid_rtlib_name)
4791 << A->getAsString(Args);
4792 }
4793
4794 return ToolChain::RLT_CompilerRT;
4795}
4796
4797ToolChain::CXXStdlibType
4798Fuchsia::GetCXXStdlibType(const ArgList &Args) const {
4799 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
4800 StringRef Value = A->getValue();
4801 if (Value != "libc++")
4802 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
4803 << A->getAsString(Args);
4804 }
4805
4806 return ToolChain::CST_Libcxx;
4807}
4808
4809void Fuchsia::addClangTargetOptions(const ArgList &DriverArgs,
4810 ArgStringList &CC1Args) const {
4811 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4812 options::OPT_fno_use_init_array, true))
4813 CC1Args.push_back("-fuse-init-array");
4814}
4815
4816void Fuchsia::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4817 ArgStringList &CC1Args) const {
4818 const Driver &D = getDriver();
4819
4820 if (DriverArgs.hasArg(options::OPT_nostdinc))
4821 return;
4822
4823 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
4824 SmallString<128> P(D.ResourceDir);
4825 llvm::sys::path::append(P, "include");
4826 addSystemInclude(DriverArgs, CC1Args, P);
4827 }
4828
4829 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
4830 return;
4831
4832 // Check for configure-time C include directories.
4833 StringRef CIncludeDirs(C_INCLUDE_DIRS);
4834 if (CIncludeDirs != "") {
4835 SmallVector<StringRef, 5> dirs;
4836 CIncludeDirs.split(dirs, ":");
4837 for (StringRef dir : dirs) {
4838 StringRef Prefix =
4839 llvm::sys::path::is_absolute(dir) ? StringRef(D.SysRoot) : "";
4840 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
4841 }
4842 return;
4843 }
4844
4845 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
4846}
4847
4848void Fuchsia::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4849 ArgStringList &CC1Args) const {
4850 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4851 DriverArgs.hasArg(options::OPT_nostdincxx))
4852 return;
4853
4854 addSystemInclude(DriverArgs, CC1Args,
4855 getDriver().SysRoot + "/include/c++/v1");
4856}
4857
4858void Fuchsia::AddCXXStdlibLibArgs(const ArgList &Args,
4859 ArgStringList &CmdArgs) const {
4860 (void) GetCXXStdlibType(Args);
4861 CmdArgs.push_back("-lc++");
4862 CmdArgs.push_back("-lc++abi");
4863 CmdArgs.push_back("-lunwind");
4864}
4865
Daniel Dunbarcc912342009-05-02 18:28:39 +00004866/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4867
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004868DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4869 const ArgList &Args)
4870 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004871
4872 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004873 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004874 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004875 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004876
Daniel Dunbar083edf72009-12-21 18:54:17 +00004877 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004878 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004879 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004880}
4881
Rafael Espindola7cf32212013-03-20 03:05:54 +00004882Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004883 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004884}
4885
4886Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004887 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004888}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004889
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004890/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4891/// which isn't properly a linker but nonetheless performs the step of stitching
4892/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004893
4894CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4895 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004896 : Linux(D, Triple, Args) {
4897 if (CudaInstallation.isValid())
4898 getProgramPaths().push_back(CudaInstallation.getBinPath());
4899}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004900
4901void
4902CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4903 llvm::opt::ArgStringList &CC1Args) const {
4904 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4905 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004906
Justin Lebard3a44f62016-04-05 18:26:20 +00004907 if (DriverArgs.hasFlag(options::OPT_fcuda_flush_denormals_to_zero,
4908 options::OPT_fno_cuda_flush_denormals_to_zero, false))
4909 CC1Args.push_back("-fcuda-flush-denormals-to-zero");
4910
Justin Lebar91f6f072016-05-23 20:19:56 +00004911 if (DriverArgs.hasFlag(options::OPT_fcuda_approx_transcendentals,
4912 options::OPT_fno_cuda_approx_transcendentals, false))
4913 CC1Args.push_back("-fcuda-approx-transcendentals");
4914
Artem Belevich34f481a2015-11-17 22:28:50 +00004915 if (DriverArgs.hasArg(options::OPT_nocudalib))
4916 return;
4917
Artem Belevich02a1e972016-08-02 23:12:51 +00004918 StringRef GpuArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
4919 assert(!GpuArch.empty() && "Must have an explicit GPU arch.");
4920 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(GpuArch);
Artem Belevich34f481a2015-11-17 22:28:50 +00004921
Artem Belevich02a1e972016-08-02 23:12:51 +00004922 if (LibDeviceFile.empty()) {
4923 getDriver().Diag(diag::err_drv_no_cuda_libdevice) << GpuArch;
4924 return;
Artem Belevich34f481a2015-11-17 22:28:50 +00004925 }
Artem Belevich02a1e972016-08-02 23:12:51 +00004926
4927 CC1Args.push_back("-mlink-cuda-bitcode");
4928 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4929
4930 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4931 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4932 // came with CUDA-7.0.
4933 CC1Args.push_back("-target-feature");
4934 CC1Args.push_back("+ptx42");
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004935}
4936
Justin Lebarc43ad9e2016-07-07 18:17:52 +00004937void CudaToolChain::AddCudaIncludeArgs(const ArgList &DriverArgs,
4938 ArgStringList &CC1Args) const {
4939 // Check our CUDA version if we're going to include the CUDA headers.
4940 if (!DriverArgs.hasArg(options::OPT_nocudainc) &&
Justin Lebarf3997712016-07-07 18:24:28 +00004941 !DriverArgs.hasArg(options::OPT_no_cuda_version_check)) {
Justin Lebarc43ad9e2016-07-07 18:17:52 +00004942 StringRef Arch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
4943 assert(!Arch.empty() && "Must have an explicit GPU arch.");
4944 CudaInstallation.CheckCudaVersionSupportsArch(StringToCudaArch(Arch));
4945 }
4946 Linux::AddCudaIncludeArgs(DriverArgs, CC1Args);
4947}
4948
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004949llvm::opt::DerivedArgList *
4950CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
Mehdi Aminic50b1a22016-10-07 21:27:26 +00004951 StringRef BoundArch) const {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004952 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4953 const OptTable &Opts = getDriver().getOpts();
4954
4955 for (Arg *A : Args) {
4956 if (A->getOption().matches(options::OPT_Xarch__)) {
4957 // Skip this argument unless the architecture matches BoundArch
Mehdi Aminic50b1a22016-10-07 21:27:26 +00004958 if (BoundArch.empty() || A->getValue(0) != BoundArch)
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004959 continue;
4960
4961 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4962 unsigned Prev = Index;
4963 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4964
4965 // If the argument parsing failed or more than one argument was
4966 // consumed, the -Xarch_ argument's parameter tried to consume
4967 // extra arguments. Emit an error and ignore.
4968 //
4969 // We also want to disallow any options which would alter the
4970 // driver behavior; that isn't going to work in our model. We
4971 // use isDriverOption() as an approximation, although things
4972 // like -O4 are going to slip through.
4973 if (!XarchArg || Index > Prev + 1) {
4974 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4975 << A->getAsString(Args);
4976 continue;
4977 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4978 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4979 << A->getAsString(Args);
4980 continue;
4981 }
4982 XarchArg->setBaseArg(A);
4983 A = XarchArg.release();
4984 DAL->AddSynthesizedArg(A);
4985 }
4986 DAL->append(A);
4987 }
4988
Mehdi Aminic50b1a22016-10-07 21:27:26 +00004989 if (!BoundArch.empty()) {
Justin Lebar4db224e2016-06-15 23:46:11 +00004990 DAL->eraseArg(options::OPT_march_EQ);
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004991 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Justin Lebar4db224e2016-06-15 23:46:11 +00004992 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004993 return DAL;
4994}
4995
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004996Tool *CudaToolChain::buildAssembler() const {
4997 return new tools::NVPTX::Assembler(*this);
4998}
4999
5000Tool *CudaToolChain::buildLinker() const {
5001 return new tools::NVPTX::Linker(*this);
5002}
5003
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005004/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00005005XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
5006 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005007 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005008 // ProgramPaths are found via 'PATH' environment variable.
5009}
5010
Douglas Katzman54366072015-07-27 16:53:08 +00005011Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00005012 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005013}
5014
Douglas Katzman54366072015-07-27 16:53:08 +00005015Tool *XCoreToolChain::buildLinker() const {
5016 return new tools::XCore::Linker(*this);
5017}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005018
Douglas Katzman54366072015-07-27 16:53:08 +00005019bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005020
Douglas Katzman54366072015-07-27 16:53:08 +00005021bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005022
Douglas Katzman54366072015-07-27 16:53:08 +00005023bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005024
Douglas Katzman54366072015-07-27 16:53:08 +00005025bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005026
Douglas Katzman54366072015-07-27 16:53:08 +00005027bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005028
Douglas Katzman54366072015-07-27 16:53:08 +00005029void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
5030 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005031 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
5032 DriverArgs.hasArg(options::OPT_nostdlibinc))
5033 return;
5034 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
5035 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005036 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005037 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
5038 ArrayRef<StringRef> DirVec(Dirs);
5039 addSystemIncludes(DriverArgs, CC1Args, DirVec);
5040 }
5041}
5042
Douglas Katzman54366072015-07-27 16:53:08 +00005043void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
5044 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005045 CC1Args.push_back("-nostdsysteminc");
5046}
5047
Douglas Katzman54366072015-07-27 16:53:08 +00005048void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
5049 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005050 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00005051 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
5052 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005053 return;
5054 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
5055 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005056 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005057 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
5058 ArrayRef<StringRef> DirVec(Dirs);
5059 addSystemIncludes(DriverArgs, CC1Args, DirVec);
5060 }
5061}
5062
Douglas Katzman54366072015-07-27 16:53:08 +00005063void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
5064 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005065 // We don't output any lib args. This is handled by xcc.
5066}
Douglas Katzman84a75642015-06-19 14:55:19 +00005067
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005068MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
5069 const ArgList &Args)
Douglas Katzman5eddc232016-05-09 19:09:59 +00005070 : Generic_ELF(D, Triple, Args) {
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005071 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
5072 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
5073 // This won't work to find gcc. Instead we give the installation detector an
5074 // extra triple, which is preferable to further hacks of the logic that at
5075 // present is based solely on getArch(). In particular, it would be wrong to
5076 // choose the myriad installation when targeting a non-myriad sparc install.
5077 switch (Triple.getArch()) {
5078 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00005079 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
5080 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005081 case llvm::Triple::sparc:
5082 case llvm::Triple::sparcel:
5083 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00005084 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005085 }
Douglas Katzman674a3122015-11-18 16:24:46 +00005086
5087 if (GCCInstallation.isValid()) {
5088 // The contents of LibDir are independent of the version of gcc.
Douglas Katzman87da5f42016-07-25 16:36:02 +00005089 // This contains libc, libg, libm, libstdc++, libssp.
5090 // The 'ma1x00' and 'nofpu' variants are irrelevant.
Douglas Katzman674a3122015-11-18 16:24:46 +00005091 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
Douglas Katzman87da5f42016-07-25 16:36:02 +00005092 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
Douglas Katzman674a3122015-11-18 16:24:46 +00005093 addPathIfExists(D, LibDir, getFilePaths());
5094
5095 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
5096 // These files are tied to a particular version of gcc.
5097 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
Douglas Katzman674a3122015-11-18 16:24:46 +00005098 addPathIfExists(D, CompilerSupportDir, getFilePaths());
5099 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005100}
5101
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00005102MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005103
Douglas Katzmanb1278f32015-09-17 21:20:16 +00005104void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
5105 ArgStringList &CC1Args) const {
5106 if (!DriverArgs.hasArg(options::OPT_nostdinc))
5107 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
5108}
5109
Eric Christopherefef8ef2015-12-07 22:43:05 +00005110void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
5111 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00005112 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
5113 DriverArgs.hasArg(options::OPT_nostdincxx))
5114 return;
5115
5116 // Only libstdc++, for now.
5117 StringRef LibDir = GCCInstallation.getParentLibPath();
5118 const GCCVersion &Version = GCCInstallation.getVersion();
5119 StringRef TripleStr = GCCInstallation.getTriple().str();
5120 const Multilib &Multilib = GCCInstallation.getMultilib();
5121
Eric Christopherefef8ef2015-12-07 22:43:05 +00005122 addLibStdCXXIncludePaths(
5123 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
5124 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00005125}
5126
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005127// MyriadToolChain handles several triples:
5128// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
5129Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
5130 // The inherited method works fine if not targeting the SHAVE.
5131 if (!isShaveCompilation(getTriple()))
5132 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00005133 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00005134 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00005135 case Action::CompileJobClass:
5136 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00005137 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00005138 return Compiler.get();
5139 case Action::AssembleJobClass:
5140 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00005141 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00005142 return Assembler.get();
5143 default:
5144 return ToolChain::getTool(JA.getKind());
5145 }
5146}
5147
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005148Tool *MyriadToolChain::buildLinker() const {
5149 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00005150}
Dan Gohmanc2853072015-09-03 22:51:53 +00005151
Douglas Katzman3972f9e2016-09-09 18:20:49 +00005152SanitizerMask MyriadToolChain::getSupportedSanitizers() const {
5153 return SanitizerKind::Address;
5154}
5155
Dan Gohman52816862015-12-16 23:30:41 +00005156WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
5157 const llvm::opt::ArgList &Args)
5158 : ToolChain(D, Triple, Args) {
Dan Gohman57b62c52016-02-22 19:26:15 +00005159
5160 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
5161 getFilePaths().push_back(
5162 getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64"));
5163
Dan Gohman52816862015-12-16 23:30:41 +00005164 // Use LLD by default.
5165 DefaultLinker = "lld";
5166}
5167
Dan Gohmanc2853072015-09-03 22:51:53 +00005168bool WebAssembly::IsMathErrnoDefault() const { return false; }
5169
5170bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
5171
5172bool WebAssembly::UseObjCMixedDispatch() const { return true; }
5173
5174bool WebAssembly::isPICDefault() const { return false; }
5175
5176bool WebAssembly::isPIEDefault() const { return false; }
5177
5178bool WebAssembly::isPICDefaultForced() const { return false; }
5179
5180bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
5181
5182// TODO: Support Objective C stuff.
5183bool WebAssembly::SupportsObjCGC() const { return false; }
5184
5185bool WebAssembly::hasBlocksRuntime() const { return false; }
5186
5187// TODO: Support profiling.
5188bool WebAssembly::SupportsProfiling() const { return false; }
5189
Dan Gohman52816862015-12-16 23:30:41 +00005190bool WebAssembly::HasNativeLLVMSupport() const { return true; }
5191
Dan Gohmanc2853072015-09-03 22:51:53 +00005192void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
5193 ArgStringList &CC1Args) const {
5194 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
5195 options::OPT_fno_use_init_array, true))
5196 CC1Args.push_back("-fuse-init-array");
5197}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005198
Dan Gohman6ad8f612016-01-14 16:00:13 +00005199ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
5200 return ToolChain::RLT_CompilerRT;
5201}
5202
5203ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
5204 return ToolChain::CST_Libcxx;
5205}
5206
5207void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
5208 ArgStringList &CC1Args) const {
5209 if (!DriverArgs.hasArg(options::OPT_nostdinc))
5210 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
5211}
5212
5213void WebAssembly::AddClangCXXStdlibIncludeArgs(
5214 const llvm::opt::ArgList &DriverArgs,
5215 llvm::opt::ArgStringList &CC1Args) const {
5216 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
5217 !DriverArgs.hasArg(options::OPT_nostdincxx))
5218 addSystemInclude(DriverArgs, CC1Args,
5219 getDriver().SysRoot + "/include/c++/v1");
5220}
5221
Dan Gohman52816862015-12-16 23:30:41 +00005222Tool *WebAssembly::buildLinker() const {
5223 return new tools::wasm::Linker(*this);
5224}
5225
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005226PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
5227 : Generic_ELF(D, Triple, Args) {
5228 if (Args.hasArg(options::OPT_static))
5229 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
5230
Paul Robinson9d613612016-05-16 17:22:25 +00005231 // Determine where to find the PS4 libraries. We use SCE_ORBIS_SDK_DIR
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005232 // if it exists; otherwise use the driver's installation path, which
5233 // should be <SDK_DIR>/host_tools/bin.
5234
5235 SmallString<512> PS4SDKDir;
Paul Robinson9d613612016-05-16 17:22:25 +00005236 if (const char *EnvValue = getenv("SCE_ORBIS_SDK_DIR")) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005237 if (!llvm::sys::fs::exists(EnvValue))
5238 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
5239 PS4SDKDir = EnvValue;
5240 } else {
5241 PS4SDKDir = getDriver().Dir;
5242 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00005243 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005244
Eric Christopherefef8ef2015-12-07 22:43:05 +00005245 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005246 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00005247 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005248 // If -isysroot was passed, use that as the SDK base path.
5249 std::string PrefixDir;
5250 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5251 PrefixDir = A->getValue();
5252 if (!llvm::sys::fs::exists(PrefixDir))
5253 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
5254 } else
5255 PrefixDir = PS4SDKDir.str();
5256
5257 SmallString<512> PS4SDKIncludeDir(PrefixDir);
5258 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
5259 if (!Args.hasArg(options::OPT_nostdinc) &&
5260 !Args.hasArg(options::OPT_nostdlibinc) &&
5261 !Args.hasArg(options::OPT_isysroot) &&
5262 !Args.hasArg(options::OPT__sysroot_EQ) &&
5263 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
5264 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
5265 << "PS4 system headers" << PS4SDKIncludeDir;
5266 }
5267
5268 SmallString<512> PS4SDKLibDir(PS4SDKDir);
5269 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
5270 if (!Args.hasArg(options::OPT_nostdlib) &&
5271 !Args.hasArg(options::OPT_nodefaultlibs) &&
5272 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
5273 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
5274 !Args.hasArg(options::OPT_emit_ast) &&
5275 !llvm::sys::fs::exists(PS4SDKLibDir)) {
5276 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
5277 << "PS4 system libraries" << PS4SDKLibDir;
5278 return;
5279 }
5280 getFilePaths().push_back(PS4SDKLibDir.str());
5281}
5282
5283Tool *PS4CPU::buildAssembler() const {
5284 return new tools::PS4cpu::Assemble(*this);
5285}
5286
5287Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
5288
5289bool PS4CPU::isPICDefault() const { return true; }
5290
5291bool PS4CPU::HasNativeLLVMSupport() const { return true; }
5292
5293SanitizerMask PS4CPU::getSupportedSanitizers() const {
5294 SanitizerMask Res = ToolChain::getSupportedSanitizers();
5295 Res |= SanitizerKind::Address;
5296 Res |= SanitizerKind::Vptr;
5297 return Res;
5298}