blob: 7ea7d417a9346c3c3fa904fef920850fc1f16060 [file] [log] [blame]
Hans Wennborgdcfba332015-10-06 23:40:43 +00001//===--- ToolChains.cpp - ToolChain Implementations -------------*- C++ -*-===//
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ToolChains.h"
Justin Lebarc43ad9e2016-07-07 18:17:52 +000011#include "clang/Basic/Cuda.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "clang/Basic/ObjCRuntime.h"
13#include "clang/Basic/Version.h"
Benjamin Kramerd45b2052015-10-07 15:48:01 +000014#include "clang/Basic/VirtualFileSystem.h"
Alp Toker1d257e12014-06-04 03:28:55 +000015#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
Daniel Dunbar6232d342010-05-20 21:48:38 +000016#include "clang/Driver/Compilation.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000017#include "clang/Driver/Driver.h"
Daniel Dunbaraabb0b12009-03-25 06:12:34 +000018#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000019#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000020#include "clang/Driver/SanitizerArgs.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000021#include "llvm/ADT/STLExtras.h"
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +000022#include "llvm/ADT/SmallString.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000023#include "llvm/ADT/StringExtras.h"
Bob Wilson997a97f2011-10-07 00:37:57 +000024#include "llvm/ADT/StringSwitch.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000025#include "llvm/Option/Arg.h"
26#include "llvm/Option/ArgList.h"
27#include "llvm/Option/OptTable.h"
28#include "llvm/Option/Option.h"
Xinliang David Li170cd102015-10-27 05:15:35 +000029#include "llvm/ProfileData/InstrProf.h"
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +000030#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000031#include "llvm/Support/FileSystem.h"
Rafael Espindolac8f008f2010-11-07 20:14:31 +000032#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000033#include "llvm/Support/Path.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000034#include "llvm/Support/Program.h"
Renato Golin33e1f822015-05-28 15:49:28 +000035#include "llvm/Support/TargetParser.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000036#include "llvm/Support/raw_ostream.h"
Daniel Dunbarb5023e92009-04-10 21:00:07 +000037#include <cstdlib> // ::getenv
Rafael Espindola8a8e5542014-06-12 17:19:42 +000038#include <system_error>
Daniel Dunbarb5023e92009-04-10 21:00:07 +000039
Daniel Dunbar59e5e882009-03-20 00:20:03 +000040using namespace clang::driver;
41using namespace clang::driver::toolchains;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000042using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000043using namespace llvm::opt;
Daniel Dunbar59e5e882009-03-20 00:20:03 +000044
Douglas Katzmana67e50c2015-06-26 15:47:46 +000045MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
46 : ToolChain(D, Triple, Args) {
Tim Northover15ff71d2014-05-22 13:12:14 +000047 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
48 getProgramPaths().push_back(getDriver().getInstalledDir());
49 if (getDriver().getInstalledDir() != getDriver().Dir)
50 getProgramPaths().push_back(getDriver().Dir);
Tim Northover157d9112014-01-16 08:48:16 +000051}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +000052
Tim Northover157d9112014-01-16 08:48:16 +000053/// Darwin - Darwin tool chain for i386 and x86_64.
Alexey Samsonov905c8022015-06-18 21:46:05 +000054Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
55 : MachO(D, Triple, Args), TargetInitialized(false) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +000056
Mehdi Amini6fcd4eb2016-10-07 21:41:00 +000057types::ID MachO::LookupTypeForExtension(StringRef Ext) const {
Daniel Dunbarcc7df6c2010-08-02 05:43:56 +000058 types::ID Ty = types::lookupTypeForExtension(Ext);
59
60 // Darwin always preprocesses assembly files (unless -x is used explicitly).
61 if (Ty == types::TY_PP_Asm)
62 return types::TY_Asm;
63
64 return Ty;
65}
66
Douglas Katzmana67e50c2015-06-26 15:47:46 +000067bool MachO::HasNativeLLVMSupport() const { return true; }
Daniel Dunbar62123a12010-09-17 00:24:52 +000068
Jonas Hahnfeldaae83742016-02-12 07:48:37 +000069ToolChain::CXXStdlibType Darwin::GetDefaultCXXStdlibType() const {
70 // Default to use libc++ on OS X 10.9+ and iOS 7+.
71 if ((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
72 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) ||
73 isTargetWatchOSBased())
74 return ToolChain::CST_Libcxx;
75
76 return ToolChain::CST_Libstdcxx;
77}
78
John McCall24fc0de2011-07-06 00:26:06 +000079/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000080ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover6f3ff222015-10-30 16:30:27 +000081 if (isTargetWatchOSBased())
Tim Northover756447a2015-10-30 16:30:36 +000082 return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion);
Tim Northover9c7e0352013-12-12 11:55:52 +000083 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000084 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000085 if (isNonFragile)
86 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
87 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000088}
89
John McCall7959fee2011-09-09 20:41:01 +000090/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
91bool Darwin::hasBlocksRuntime() const {
Tim Northover6f3ff222015-10-30 16:30:27 +000092 if (isTargetWatchOSBased())
93 return true;
94 else if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000095 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000096 else {
Tim Northover157d9112014-01-16 08:48:16 +000097 assert(isTargetMacOS() && "unexpected darwin target");
98 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000099 }
John McCall7959fee2011-09-09 20:41:01 +0000100}
101
Renato Golin33e1f822015-05-28 15:49:28 +0000102// This is just a MachO name translation routine and there's no
103// way to join this into ARMTargetParser without breaking all
104// other assumptions. Maybe MachO should consider standardising
105// their nomenclature.
106static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000107 return llvm::StringSwitch<const char *>(Arch)
108 .Case("armv6k", "armv6")
109 .Case("armv6m", "armv6m")
110 .Case("armv5tej", "armv5")
111 .Case("xscale", "xscale")
112 .Case("armv4t", "armv4t")
113 .Case("armv7", "armv7")
114 .Cases("armv7a", "armv7-a", "armv7")
115 .Cases("armv7r", "armv7-r", "armv7")
116 .Cases("armv7em", "armv7e-m", "armv7em")
117 .Cases("armv7k", "armv7-k", "armv7k")
118 .Cases("armv7m", "armv7-m", "armv7m")
119 .Cases("armv7s", "armv7-s", "armv7s")
120 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000121}
122
Renato Golin33e1f822015-05-28 15:49:28 +0000123static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000124 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000125 if (ArchKind == llvm::ARM::AK_INVALID)
126 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000127 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000128
129 // FIXME: Make sure this MachO triple mangling is really necessary.
130 // ARMv5* normalises to ARMv5.
131 if (Arch.startswith("armv5"))
132 Arch = Arch.substr(0, 5);
133 // ARMv6*, except ARMv6M, normalises to ARMv6.
134 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
135 Arch = Arch.substr(0, 5);
136 // ARMv7A normalises to ARMv7.
137 else if (Arch.endswith("v7a"))
138 Arch = Arch.substr(0, 5);
139 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000140}
141
Tim Northover9c7e0352013-12-12 11:55:52 +0000142static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000143 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000144 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000145 if (!A)
146 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000147
Tim Northover9c7e0352013-12-12 11:55:52 +0000148 return A->getOption().matches(options::OPT_msoft_float) ||
149 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
150 A->getValue() == StringRef("soft"));
151}
152
Tim Northover157d9112014-01-16 08:48:16 +0000153StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000154 switch (getTriple().getArch()) {
155 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000156 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000157
Tim Northover40956e62014-07-23 12:32:58 +0000158 case llvm::Triple::aarch64:
159 return "arm64";
160
Douglas Gregord9bb1522011-03-06 19:11:49 +0000161 case llvm::Triple::thumb:
Hans Wennborgdcfba332015-10-06 23:40:43 +0000162 case llvm::Triple::arm:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000163 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000164 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000165 return Arch;
166
167 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000168 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000169 return Arch;
170
171 return "arm";
172 }
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000173}
174
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000175Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000176
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000177MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000178
Chad Rosierd3a0f952011-09-20 20:44:06 +0000179std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
180 types::ID InputType) const {
181 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000182
183 // If the target isn't initialized (e.g., an unknown Darwin platform, return
184 // the default triple).
185 if (!isTargetInitialized())
186 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000187
Tim Northover157d9112014-01-16 08:48:16 +0000188 SmallString<16> Str;
Tim Northover6f3ff222015-10-30 16:30:27 +0000189 if (isTargetWatchOSBased())
190 Str += "watchos";
191 else if (isTargetTvOSBased())
192 Str += "tvos";
193 else if (isTargetIOSBased())
194 Str += "ios";
195 else
196 Str += "macosx";
Tim Northover157d9112014-01-16 08:48:16 +0000197 Str += getTargetVersion().getAsString();
198 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000199
200 return Triple.getTriple();
201}
202
David Blaikie68e081d2011-12-20 02:48:34 +0000203void Generic_ELF::anchor() {}
204
Tim Northover157d9112014-01-16 08:48:16 +0000205Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000206 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000207 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000208 if (!Lipo)
209 Lipo.reset(new tools::darwin::Lipo(*this));
210 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000211 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000212 if (!Dsymutil)
213 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
214 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000215 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000216 if (!VerifyDebug)
217 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
218 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000219 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000220 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000221 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000222}
223
Douglas Katzman95354292015-06-23 20:42:09 +0000224Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000225
Tim Northover157d9112014-01-16 08:48:16 +0000226Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000227 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000228}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000229
Douglas Katzman95354292015-06-23 20:42:09 +0000230DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000231 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000232 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000233
Tim Northover336f1892014-03-29 13:16:12 +0000234void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
Tim Northover6f3ff222015-10-30 16:30:27 +0000235 // For modern targets, promote certain warnings to errors.
236 if (isTargetWatchOSBased() || getTriple().isArch64Bit()) {
Tim Northover336f1892014-03-29 13:16:12 +0000237 // Always enable -Wdeprecated-objc-isa-usage and promote it
238 // to an error.
239 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
240 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
241
Tim Northover6f3ff222015-10-30 16:30:27 +0000242 // For iOS and watchOS, also error about implicit function declarations,
243 // as that can impact calling conventions.
244 if (!isTargetMacOS())
245 CC1Args.push_back("-Werror=implicit-function-declaration");
Tim Northover336f1892014-03-29 13:16:12 +0000246 }
247}
248
Tim Northover157d9112014-01-16 08:48:16 +0000249/// \brief Determine whether Objective-C automated reference counting is
250/// enabled.
251static bool isObjCAutoRefCount(const ArgList &Args) {
252 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
253}
254
John McCall31168b02011-06-15 23:02:42 +0000255void DarwinClang::AddLinkARCArgs(const ArgList &Args,
256 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000257 // Avoid linking compatibility stubs on i386 mac.
258 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
259 return;
260
261 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
262
263 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
264 runtime.hasSubscripting())
265 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000266
267 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000268 SmallString<128> P(getDriver().ClangExecutable);
269 llvm::sys::path::remove_filename(P); // 'clang'
270 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000271 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000272 // Mash in the platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000273 if (isTargetWatchOSSimulator())
274 P += "watchsimulator";
275 else if (isTargetWatchOS())
276 P += "watchos";
277 else if (isTargetTvOSSimulator())
278 P += "appletvsimulator";
279 else if (isTargetTvOS())
280 P += "appletvos";
281 else if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000282 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000283 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000284 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000285 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000286 P += "macosx";
287 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000288
Rafael Espindola358256c2013-06-26 02:13:00 +0000289 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000290}
291
Adrian Prantld50d56c2016-10-17 19:36:18 +0000292unsigned DarwinClang::GetDefaultDwarfVersion() const {
293 // Default to use DWARF 2 on OS X 10.10 / iOS 8 and lower.
294 if ((isTargetMacOS() && isMacosxVersionLT(10, 11)) ||
295 (isTargetIOSBased() && isIPhoneOSVersionLT(9)))
296 return 2;
297 return 4;
298}
299
Tim Northover157d9112014-01-16 08:48:16 +0000300void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000301 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000302 bool IsEmbedded, bool AddRPath) const {
303 SmallString<128> Dir(getDriver().ResourceDir);
304 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
305
306 SmallString<128> P(Dir);
307 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000308
Eric Christopherc235d0c62011-06-22 17:41:40 +0000309 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000310 // not have compiler-rt checked out or integrated into their build (unless
311 // we explicitly force linking with this library).
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000312 if (AlwaysLink || getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000313 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000314
315 // Adding the rpaths might negatively interact when other rpaths are involved,
316 // so we should make sure we add the rpaths last, after all user-specified
317 // rpaths. This is currently true from this place, but we need to be
318 // careful if this function is ever called before user's rpaths are emitted.
319 if (AddRPath) {
320 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
321
322 // Add @executable_path to rpath to support having the dylib copied with
323 // the executable.
324 CmdArgs.push_back("-rpath");
325 CmdArgs.push_back("@executable_path");
326
327 // Add the path to the resource dir to rpath to support using the dylib
328 // from the default location without copying.
329 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000330 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000331 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000332}
333
Chris Bienemane60e7c22016-04-29 22:28:34 +0000334StringRef Darwin::getPlatformFamily() const {
335 switch (TargetPlatform) {
336 case DarwinPlatformKind::MacOS:
337 return "MacOSX";
338 case DarwinPlatformKind::IPhoneOS:
339 case DarwinPlatformKind::IPhoneOSSimulator:
340 return "iPhone";
341 case DarwinPlatformKind::TvOS:
342 case DarwinPlatformKind::TvOSSimulator:
343 return "AppleTV";
344 case DarwinPlatformKind::WatchOS:
345 case DarwinPlatformKind::WatchOSSimulator:
346 return "Watch";
347 }
348 llvm_unreachable("Unsupported platform");
349}
350
351StringRef Darwin::getSDKName(StringRef isysroot) {
352 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
353 llvm::sys::path::const_iterator SDKDir;
354 auto BeginSDK = llvm::sys::path::begin(isysroot);
355 auto EndSDK = llvm::sys::path::end(isysroot);
356 for (auto IT = BeginSDK; IT != EndSDK; ++IT) {
357 StringRef SDK = *IT;
358 if (SDK.endswith(".sdk"))
359 return SDK.slice(0, SDK.size() - 4);
360 }
361 return "";
362}
363
Anna Zakse67b4022016-02-02 02:04:48 +0000364StringRef Darwin::getOSLibraryNameSuffix() const {
365 switch(TargetPlatform) {
366 case DarwinPlatformKind::MacOS:
367 return "osx";
368 case DarwinPlatformKind::IPhoneOS:
369 return "ios";
370 case DarwinPlatformKind::IPhoneOSSimulator:
371 return "iossim";
372 case DarwinPlatformKind::TvOS:
373 return "tvos";
374 case DarwinPlatformKind::TvOSSimulator:
375 return "tvossim";
376 case DarwinPlatformKind::WatchOS:
377 return "watchos";
378 case DarwinPlatformKind::WatchOSSimulator:
379 return "watchossim";
380 }
381 llvm_unreachable("Unsupported platform");
382}
383
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000384void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000385 ArgStringList &CmdArgs) const {
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000386 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000387
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000388 AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.profile_") +
389 getOSLibraryNameSuffix() + ".a").str(),
390 /*AlwaysLink*/ true);
Justin Bognerc7701242015-05-12 05:44:36 +0000391}
392
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000393void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
394 ArgStringList &CmdArgs,
395 StringRef Sanitizer) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000396 AddLinkRuntimeLib(
397 Args, CmdArgs,
Anna Zakse67b4022016-02-02 02:04:48 +0000398 (Twine("libclang_rt.") + Sanitizer + "_" +
399 getOSLibraryNameSuffix() + "_dynamic.dylib").str(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000400 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
401 /*AddRPath*/ true);
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000402}
403
Jonas Hahnfeldd196fa52016-07-27 08:15:54 +0000404ToolChain::RuntimeLibType DarwinClang::GetRuntimeLibType(
405 const ArgList &Args) const {
406 if (Arg* A = Args.getLastArg(options::OPT_rtlib_EQ)) {
407 StringRef Value = A->getValue();
408 if (Value != "compiler-rt")
409 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
410 << Value << "darwin";
411 }
412
413 return ToolChain::RLT_CompilerRT;
414}
415
Vedant Kumar5fb00e42016-07-27 23:01:55 +0000416void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
Daniel Dunbar6276f992009-09-18 08:15:13 +0000417 ArgStringList &CmdArgs) const {
Jonas Hahnfeldd196fa52016-07-27 08:15:54 +0000418 // Call once to ensure diagnostic is printed if wrong value was specified
419 GetRuntimeLibType(Args);
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000420
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000421 // Darwin doesn't support real static executables, don't link any runtime
422 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000423 if (Args.hasArg(options::OPT_static) ||
424 Args.hasArg(options::OPT_fapple_kext) ||
425 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000426 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000427
428 // Reject -static-libgcc for now, we can deal with this when and if someone
429 // cares. This is useful in situations where someone wants to statically link
430 // something like libstdc++, and needs its runtime support routines.
431 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000432 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000433 return;
434 }
435
Peter Collingbourne32701642013-11-01 18:16:25 +0000436 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000437 if (Sanitize.needsAsanRt())
438 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
439 if (Sanitize.needsUbsanRt())
440 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000441 if (Sanitize.needsTsanRt())
442 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Peter Collingbournedc134532016-01-16 00:31:22 +0000443 if (Sanitize.needsStatsRt()) {
444 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
445 AddLinkRuntimeLib(Args, CmdArgs,
446 (Twine("libclang_rt.stats_client_") + OS + ".a").str(),
447 /*AlwaysLink=*/true);
448 AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");
449 }
Derek Bruening256c2e12016-04-21 21:32:04 +0000450 if (Sanitize.needsEsanRt())
451 AddLinkSanitizerLibArgs(Args, CmdArgs, "esan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000452
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000453 // Otherwise link libSystem, then the dynamic runtime library, and finally any
454 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000455 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000456
457 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000458 if (isTargetWatchOSBased()) {
459 // We currently always need a static runtime library for watchOS.
460 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
461 } else if (isTargetTvOSBased()) {
462 // We currently always need a static runtime library for tvOS.
463 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
464 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000465 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
466 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000467 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000468 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000469 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000470 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000471
Daniel Dunbard1076382011-04-18 23:48:36 +0000472 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000473 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000474 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000475 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000476 // The dynamic runtime library was merged with libSystem for 10.6 and
477 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000478 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000479 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000480 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000481 CmdArgs.push_back("-lgcc_s.10.5");
482
Chris Bieneman90743412016-08-17 21:54:30 +0000483 // Originally for OS X, we thought we would only need a static runtime
484 // library when targeting 10.4, to provide versions of the static functions
485 // which were omitted from 10.4.dylib. This led to the creation of the 10.4
486 // builtins library.
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000487 //
488 // Unfortunately, that turned out to not be true, because Darwin system
489 // headers can still use eprintf on i386, and it is not exported from
490 // libSystem. Therefore, we still must provide a runtime library just for
491 // the tiny tiny handful of projects that *might* use that symbol.
Chris Bieneman90743412016-08-17 21:54:30 +0000492 //
493 // Then over time, we figured out it was useful to add more things to the
494 // runtime so we created libclang_rt.osx.a to provide new functions when
495 // deploying to old OS builds, and for a long time we had both eprintf and
496 // osx builtin libraries. Which just seems excessive. So with PR 28855, we
497 // are removing the eprintf library and expecting eprintf to be provided by
498 // the OS X builtins library.
499 if (isMacosxVersionLT(10, 5))
Eric Christopherc235d0c62011-06-22 17:41:40 +0000500 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Chris Bieneman90743412016-08-17 21:54:30 +0000501 else
Eric Christopherc235d0c62011-06-22 17:41:40 +0000502 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000503 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000504}
505
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000506void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000507 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000508
Daniel Dunbar455a0492012-08-17 18:43:50 +0000509 // Support allowing the SDKROOT environment variable used by xcrun and other
510 // Xcode tools to define the default sysroot, by making it the default for
511 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000512 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
513 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000514 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000515 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
516 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000517 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000518 // We only use this value as the default if it is an absolute path,
519 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000520 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000521 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000522 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000523 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000524 }
525 }
526 }
527
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000528 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000529 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000530 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
531 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000532
Tim Northover6f3ff222015-10-30 16:30:27 +0000533 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000534 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000535 << OSXVersion->getAsString(Args)
536 << (iOSVersion ? iOSVersion :
537 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
538 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
539 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
540 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
541 << iOSVersion->getAsString(Args)
542 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
543 TvOSVersion = WatchOSVersion = nullptr;
544 } else if (TvOSVersion && WatchOSVersion) {
545 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
546 << TvOSVersion->getAsString(Args)
547 << WatchOSVersion->getAsString(Args);
548 WatchOSVersion = nullptr;
549 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000550 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000551 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000552 std::string OSXTarget;
553 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000554 std::string TvOSTarget;
555 std::string WatchOSTarget;
556
Chad Rosier64707fe2011-08-31 20:56:25 +0000557 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
558 OSXTarget = env;
559 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
560 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000561 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
562 TvOSTarget = env;
563 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
564 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000565
Steven Wu7a1372c2015-06-25 01:59:35 +0000566 // If there is no command-line argument to specify the Target version and
567 // no environment variable defined, see if we can set the default based
568 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000569 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Frederic Riss3ad83bd2016-01-12 23:47:59 +0000570 TvOSTarget.empty() && Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000571 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000572 StringRef isysroot = A->getValue();
Chris Bienemane60e7c22016-04-29 22:28:34 +0000573 StringRef SDK = getSDKName(isysroot);
574 if (SDK.size() > 0) {
Steven Wu7a1372c2015-06-25 01:59:35 +0000575 // Slice the version number out.
576 // Version number is between the first and the last number.
577 size_t StartVer = SDK.find_first_of("0123456789");
578 size_t EndVer = SDK.find_last_of("0123456789");
579 if (StartVer != StringRef::npos && EndVer > StartVer) {
580 StringRef Version = SDK.slice(StartVer, EndVer + 1);
581 if (SDK.startswith("iPhoneOS") ||
582 SDK.startswith("iPhoneSimulator"))
583 iOSTarget = Version;
584 else if (SDK.startswith("MacOSX"))
585 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000586 else if (SDK.startswith("WatchOS") ||
587 SDK.startswith("WatchSimulator"))
588 WatchOSTarget = Version;
589 else if (SDK.startswith("AppleTVOS") ||
590 SDK.startswith("AppleTVSimulator"))
591 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000592 }
593 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000594 }
595 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000596
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000597 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000598 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000599 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
600 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000601 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000602 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000603 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000604 MachOArchName == "arm64") {
605 getTriple().getiOSVersion(Major, Minor, Micro);
606 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
607 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000608 } else if (MachOArchName == "armv7k") {
609 getTriple().getWatchOSVersion(Major, Minor, Micro);
610 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
611 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000612 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
613 MachOArchName != "armv7em") {
614 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
615 getDriver().Diag(diag::err_drv_invalid_darwin_version)
616 << getTriple().getOSName();
617 }
618 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
619 << Micro;
620 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000621 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000622
Tim Northover6f3ff222015-10-30 16:30:27 +0000623 // Do not allow conflicts with the watchOS target.
624 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
625 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
626 << "WATCHOS_DEPLOYMENT_TARGET"
627 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
628 "TVOS_DEPLOYMENT_TARGET");
629 }
630
631 // Do not allow conflicts with the tvOS target.
632 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
633 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
634 << "TVOS_DEPLOYMENT_TARGET"
635 << "IPHONEOS_DEPLOYMENT_TARGET";
636 }
637
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000638 // Allow conflicts among OSX and iOS for historical reasons, but choose the
639 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000640 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
641 !WatchOSTarget.empty() ||
642 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000643 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000644 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000645 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000646 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000647 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000648 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000649 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000650
Chad Rosier64707fe2011-08-31 20:56:25 +0000651 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000652 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000653 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000654 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000655 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000656 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000657 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000658 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000659 } else if (!TvOSTarget.empty()) {
660 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
661 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
662 Args.append(TvOSVersion);
663 } else if (!WatchOSTarget.empty()) {
664 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
665 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
666 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000667 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000668 }
Mike Stump11289f42009-09-09 15:08:12 +0000669
Tim Northover9c7e0352013-12-12 11:55:52 +0000670 DarwinPlatformKind Platform;
671 if (OSXVersion)
672 Platform = MacOS;
673 else if (iOSVersion)
674 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000675 else if (TvOSVersion)
676 Platform = TvOS;
677 else if (WatchOSVersion)
678 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000679 else
Tim Northover157d9112014-01-16 08:48:16 +0000680 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000681
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000682 // Set the tool chain target information.
683 unsigned Major, Minor, Micro;
684 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000685 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000686 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
687 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000688 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
689 HadExtra) ||
690 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000691 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000692 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000693 } else if (Platform == IPhoneOS) {
694 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000695 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
696 HadExtra) ||
Bob Wilson4cf27c42016-07-18 20:29:14 +0000697 HadExtra || Major >= 100 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000698 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000699 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000700 } else if (Platform == TvOS) {
701 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
702 Micro, HadExtra) || HadExtra ||
Bob Wilson4cf27c42016-07-18 20:29:14 +0000703 Major >= 100 || Minor >= 100 || Micro >= 100)
Tim Northover6f3ff222015-10-30 16:30:27 +0000704 getDriver().Diag(diag::err_drv_invalid_version_number)
705 << TvOSVersion->getAsString(Args);
706 } else if (Platform == WatchOS) {
707 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
708 Micro, HadExtra) || HadExtra ||
709 Major >= 10 || Minor >= 100 || Micro >= 100)
710 getDriver().Diag(diag::err_drv_invalid_version_number)
711 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000712 } else
713 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000714
Bob Wilson7f294b52014-10-10 23:10:10 +0000715 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000716 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
717 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000718 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000719 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
720 getTriple().getArch() == llvm::Triple::x86_64))
721 Platform = TvOSSimulator;
722 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
723 getTriple().getArch() == llvm::Triple::x86_64))
724 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000725
Tim Northover9c7e0352013-12-12 11:55:52 +0000726 setTarget(Platform, Major, Minor, Micro);
Chris Bienemane60e7c22016-04-29 22:28:34 +0000727
728 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
729 StringRef SDK = getSDKName(A->getValue());
730 if (SDK.size() > 0) {
731 size_t StartVer = SDK.find_first_of("0123456789");
732 StringRef SDKName = SDK.slice(0, StartVer);
733 if (!SDKName.startswith(getPlatformFamily()))
734 getDriver().Diag(diag::warn_incompatible_sysroot)
735 << SDKName << getPlatformFamily();
736 }
737 }
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000738}
739
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000740void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000741 ArgStringList &CmdArgs) const {
742 CXXStdlibType Type = GetCXXStdlibType(Args);
743
744 switch (Type) {
745 case ToolChain::CST_Libcxx:
746 CmdArgs.push_back("-lc++");
747 break;
748
Hans Wennborgdcfba332015-10-06 23:40:43 +0000749 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000750 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
751 // it was previously found in the gcc lib dir. However, for all the Darwin
752 // platforms we care about it was -lstdc++.6, so we search for that
753 // explicitly if we can't see an obvious -lstdc++ candidate.
754
755 // Check in the sysroot first.
756 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000757 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000758 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000759
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000760 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000761 llvm::sys::path::remove_filename(P);
762 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000763 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000764 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000765 return;
766 }
767 }
768 }
769
770 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000771 // FIXME: This should be removed someday when we don't have to care about
772 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000773 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
774 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000775 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
776 return;
777 }
778
779 // Otherwise, let the linker search.
780 CmdArgs.push_back("-lstdc++");
781 break;
782 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000783}
784
Shantonu Senafeb03b2010-09-17 18:39:08 +0000785void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
786 ArgStringList &CmdArgs) const {
Shantonu Senafeb03b2010-09-17 18:39:08 +0000787 // For Darwin platforms, use the compiler-rt-based support library
788 // instead of the gcc-provided one (which is also incidentally
789 // only present in the gcc lib dir, which makes it hard to find).
790
Rafael Espindola358256c2013-06-26 02:13:00 +0000791 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000792 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000793
794 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000795 if (isTargetWatchOS()) {
796 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
797 } else if (isTargetTvOS()) {
798 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
799 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000800 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000801 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000802 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000803 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000804
Shantonu Senafeb03b2010-09-17 18:39:08 +0000805 // For now, allow missing resource libraries to support developers who may
806 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000807 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000808 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000809}
810
Tim Northover157d9112014-01-16 08:48:16 +0000811DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
Samuel Antao31fef982016-10-27 17:39:44 +0000812 StringRef BoundArch,
813 Action::OffloadKind) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000814 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
815 const OptTable &Opts = getDriver().getOpts();
816
817 // FIXME: We really want to get out of the tool chain level argument
818 // translation business, as it makes the driver functionality much
819 // more opaque. For now, we follow gcc closely solely for the
820 // purpose of easily achieving feature parity & testability. Once we
821 // have something that works, we should reevaluate each translation
822 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000823
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000824 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000825 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000826 // Skip this argument unless the architecture matches either the toolchain
827 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000828 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000829 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
830 if (!(XarchArch == getArch() ||
Mehdi Aminic50b1a22016-10-07 21:27:26 +0000831 (!BoundArch.empty() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000832 XarchArch ==
833 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000834 continue;
835
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000836 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000837 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000838 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000839 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000840
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000841 // If the argument parsing failed or more than one argument was
842 // consumed, the -Xarch_ argument's parameter tried to consume
843 // extra arguments. Emit an error and ignore.
844 //
845 // We also want to disallow any options which would alter the
846 // driver behavior; that isn't going to work in our model. We
847 // use isDriverOption() as an approximation, although things
848 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000849 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000850 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000851 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000852 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000853 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000854 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000855 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000856 continue;
857 }
858
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000859 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000860
Nico Webera04d5f82014-05-11 17:27:13 +0000861 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000862 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000863
864 // Linker input arguments require custom handling. The problem is that we
865 // have already constructed the phase actions, so we can not treat them as
866 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000867 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000868 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000869 for (const char *Value : A->getValues()) {
870 DAL->AddSeparateArg(
871 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000872 }
873 continue;
874 }
Mike Stump11289f42009-09-09 15:08:12 +0000875 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000876
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000877 // Sob. These is strictly gcc compatible for the time being. Apple
878 // gcc translates options twice, which means that self-expanding
879 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000880 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000881 default:
882 DAL->append(A);
883 break;
884
885 case options::OPT_mkernel:
886 case options::OPT_fapple_kext:
887 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000888 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000889 break;
Mike Stump11289f42009-09-09 15:08:12 +0000890
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000891 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000892 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000893 break;
894
895 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000896 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000897 DAL->AddFlagArg(
898 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000899 break;
900
901 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000902 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000903 DAL->AddFlagArg(
904 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000905 break;
906
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000907 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000908 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000909 break;
910
911 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000912 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000913 break;
914
915 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000916 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000917 break;
918
919 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000920 DAL->AddFlagArg(A,
921 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000922 break;
923
924 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000925 DAL->AddFlagArg(
926 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000927 break;
928
929 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000930 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000931 break;
932
933 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000934 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000935 break;
936 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000937 }
938
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000939 if (getTriple().getArch() == llvm::Triple::x86 ||
940 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000941 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000942 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
943 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000944
945 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000946 // how the driver driver works.
Mehdi Aminic50b1a22016-10-07 21:27:26 +0000947 if (!BoundArch.empty()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000948 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000949 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
950 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000951
952 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
953 // which defines the list of which architectures we accept.
954 if (Name == "ppc")
955 ;
956 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000957 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000958 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000959 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000960 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000961 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000962 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000963 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000964 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000965 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000966 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000967 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000968 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000969 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000970 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000971 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000972
Bill Schmidt778d3872013-07-26 01:36:11 +0000973 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000974 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000975
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000976 else if (Name == "i386")
977 ;
978 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000979 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000980 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000981 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000982 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000983 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000984 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000985 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000986 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000987 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000988 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000989 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000990 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000991 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000992
993 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000994 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000995 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000996 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
997 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000998 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000999
1000 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +00001001 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001002 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +00001003 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001004 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +00001005 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001006 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +00001007 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001008 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +00001009 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +00001010 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +00001011 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001012 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +00001013 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +00001014 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +00001015 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001016 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +00001017 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +00001018 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +00001019 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001020 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +00001021 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001022 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +00001023
Tim Northover157d9112014-01-16 08:48:16 +00001024 return DAL;
1025}
1026
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001027void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001028 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001029 // Embedded targets are simple at the moment, not supporting sanitizers and
1030 // with different libraries for each member of the product { static, PIC } x
1031 // { hard-float, soft-float }
1032 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Vedant Kumar5fb00e42016-07-27 23:01:55 +00001033 CompilerRT +=
1034 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
1035 ? "hard"
1036 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +00001037 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
1038
1039 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
1040}
1041
Samuel Antao31fef982016-10-27 17:39:44 +00001042DerivedArgList *
1043Darwin::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
1044 Action::OffloadKind DeviceOffloadKind) const {
Tim Northover157d9112014-01-16 08:48:16 +00001045 // First get the generic Apple args, before moving onto Darwin-specific ones.
Samuel Antao31fef982016-10-27 17:39:44 +00001046 DerivedArgList *DAL =
1047 MachO::TranslateArgs(Args, BoundArch, DeviceOffloadKind);
Tim Northoverb534ce42016-02-12 22:30:42 +00001048 const OptTable &Opts = getDriver().getOpts();
Tim Northover157d9112014-01-16 08:48:16 +00001049
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001050 // If no architecture is bound, none of the translations here are relevant.
Mehdi Aminic50b1a22016-10-07 21:27:26 +00001051 if (BoundArch.empty())
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001052 return DAL;
1053
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001054 // Add an explicit version min argument for the deployment target. We do this
1055 // after argument translation because -Xarch_ arguments may add a version min
1056 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001057 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001058
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001059 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
1060 // FIXME: It would be far better to avoid inserting those -static arguments,
1061 // but we can't check the deployment target in the translation code until
1062 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +00001063 if (isTargetWatchOSBased() ||
1064 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1065 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001066 Arg *A = *it;
1067 ++it;
1068 if (A->getOption().getID() != options::OPT_mkernel &&
1069 A->getOption().getID() != options::OPT_fapple_kext)
1070 continue;
1071 assert(it != ie && "unexpected argument translation");
1072 A = *it;
1073 assert(A->getOption().getID() == options::OPT_static &&
1074 "missing expected -static argument");
1075 it = DAL->getArgs().erase(it);
1076 }
1077 }
1078
Tim Northoverb534ce42016-02-12 22:30:42 +00001079 if (!Args.getLastArg(options::OPT_stdlib_EQ) &&
Tim Northover3a098c12016-02-15 16:38:10 +00001080 GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
Tim Northoverb534ce42016-02-12 22:30:42 +00001081 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1082 "libc++");
1083
Bob Wilson102be442011-10-07 17:54:41 +00001084 // Validate the C++ standard library choice.
1085 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1086 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001087 // Check whether the target provides libc++.
1088 StringRef where;
1089
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001090 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001091 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001092 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001093
1094 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001095 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001096 }
1097 }
1098
Tim Northoverc0f6c9b2016-08-23 18:12:58 +00001099 auto Arch = tools::darwin::getArchTypeForMachOArchName(BoundArch);
1100 if ((Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)) {
1101 if (Args.hasFlag(options::OPT_fomit_frame_pointer,
1102 options::OPT_fno_omit_frame_pointer, false))
1103 getDriver().Diag(clang::diag::warn_drv_unsupported_opt_for_target)
1104 << "-fomit-frame-pointer" << BoundArch;
1105 if (Args.hasFlag(options::OPT_momit_leaf_frame_pointer,
1106 options::OPT_mno_omit_leaf_frame_pointer, false))
1107 getDriver().Diag(clang::diag::warn_drv_unsupported_opt_for_target)
1108 << "-momit-leaf-frame-pointer" << BoundArch;
1109 }
1110
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001111 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001112}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001113
Tim Northover157d9112014-01-16 08:48:16 +00001114bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001115 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001116}
1117
Tim Northover157d9112014-01-16 08:48:16 +00001118bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001119 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1120 return S[0] != '\0';
1121 return false;
1122}
1123
Tim Northovere931f9f2015-10-30 16:30:41 +00001124bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001125 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001126 if (getTriple().getArch() != llvm::Triple::arm &&
1127 getTriple().getArch() != llvm::Triple::thumb)
1128 return false;
1129
Tim Northoverc741b042015-11-17 18:27:27 +00001130 // Only watchOS uses the new DWARF/Compact unwinding method.
Tim Northoverd88ecb32016-01-27 19:32:40 +00001131 llvm::Triple Triple(ComputeLLVMTriple(Args));
Tim Northover4c9ac7d2016-01-27 22:14:02 +00001132 return !Triple.isWatchABI();
Daniel Dunbar3241d402010-02-10 18:49:11 +00001133}
1134
Steven Wu574b0f22016-03-01 01:07:58 +00001135bool Darwin::SupportsEmbeddedBitcode() const {
1136 assert(TargetInitialized && "Target not initialized!");
1137 if (isTargetIPhoneOS() && isIPhoneOSVersionLT(6, 0))
1138 return false;
1139 return true;
1140}
1141
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001142bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001143
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001144bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001145
Tim Northover157d9112014-01-16 08:48:16 +00001146bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001147 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001148 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001149}
1150
Tim Northover157d9112014-01-16 08:48:16 +00001151bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001152 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001153 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001154}
1155
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001156void Darwin::addMinVersionArgs(const ArgList &Args,
1157 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001158 VersionTuple TargetVersion = getTargetVersion();
1159
Tim Northover6f3ff222015-10-30 16:30:27 +00001160 if (isTargetWatchOS())
1161 CmdArgs.push_back("-watchos_version_min");
1162 else if (isTargetWatchOSSimulator())
1163 CmdArgs.push_back("-watchos_simulator_version_min");
1164 else if (isTargetTvOS())
1165 CmdArgs.push_back("-tvos_version_min");
1166 else if (isTargetTvOSSimulator())
1167 CmdArgs.push_back("-tvos_simulator_version_min");
1168 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001169 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001170 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001171 CmdArgs.push_back("-iphoneos_version_min");
1172 else {
1173 assert(isTargetMacOS() && "unexpected target");
1174 CmdArgs.push_back("-macosx_version_min");
1175 }
1176
1177 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1178}
1179
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001180void Darwin::addStartObjectFileArgs(const ArgList &Args,
1181 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001182 // Derived from startfile spec.
1183 if (Args.hasArg(options::OPT_dynamiclib)) {
1184 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001185 if (isTargetWatchOSBased()) {
1186 ; // watchOS does not need dylib1.o.
1187 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001188 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001189 } else if (isTargetIPhoneOS()) {
1190 if (isIPhoneOSVersionLT(3, 1))
1191 CmdArgs.push_back("-ldylib1.o");
1192 } else {
1193 if (isMacosxVersionLT(10, 5))
1194 CmdArgs.push_back("-ldylib1.o");
1195 else if (isMacosxVersionLT(10, 6))
1196 CmdArgs.push_back("-ldylib1.10.5.o");
1197 }
1198 } else {
1199 if (Args.hasArg(options::OPT_bundle)) {
1200 if (!Args.hasArg(options::OPT_static)) {
1201 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001202 if (isTargetWatchOSBased()) {
1203 ; // watchOS does not need bundle1.o.
1204 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001205 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001206 } else if (isTargetIPhoneOS()) {
1207 if (isIPhoneOSVersionLT(3, 1))
1208 CmdArgs.push_back("-lbundle1.o");
1209 } else {
1210 if (isMacosxVersionLT(10, 6))
1211 CmdArgs.push_back("-lbundle1.o");
1212 }
1213 }
1214 } else {
1215 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1216 if (Args.hasArg(options::OPT_static) ||
1217 Args.hasArg(options::OPT_object) ||
1218 Args.hasArg(options::OPT_preload)) {
1219 CmdArgs.push_back("-lgcrt0.o");
1220 } else {
1221 CmdArgs.push_back("-lgcrt1.o");
1222
1223 // darwin_crt2 spec is empty.
1224 }
1225 // By default on OS X 10.8 and later, we don't link with a crt1.o
1226 // file and the linker knows to use _main as the entry point. But,
1227 // when compiling with -pg, we need to link with the gcrt1.o file,
1228 // so pass the -no_new_main option to tell the linker to use the
1229 // "start" symbol as the entry point.
1230 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1231 CmdArgs.push_back("-no_new_main");
1232 } else {
1233 if (Args.hasArg(options::OPT_static) ||
1234 Args.hasArg(options::OPT_object) ||
1235 Args.hasArg(options::OPT_preload)) {
1236 CmdArgs.push_back("-lcrt0.o");
1237 } else {
1238 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001239 if (isTargetWatchOSBased()) {
1240 ; // watchOS does not need crt1.o.
1241 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001242 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001243 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001244 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001245 ; // iOS does not need any crt1 files for arm64
1246 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001247 CmdArgs.push_back("-lcrt1.o");
1248 else if (isIPhoneOSVersionLT(6, 0))
1249 CmdArgs.push_back("-lcrt1.3.1.o");
1250 } else {
1251 if (isMacosxVersionLT(10, 5))
1252 CmdArgs.push_back("-lcrt1.o");
1253 else if (isMacosxVersionLT(10, 6))
1254 CmdArgs.push_back("-lcrt1.10.5.o");
1255 else if (isMacosxVersionLT(10, 8))
1256 CmdArgs.push_back("-lcrt1.10.6.o");
1257
1258 // darwin_crt2 spec is empty.
1259 }
1260 }
1261 }
1262 }
1263 }
1264
1265 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001266 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001267 isMacosxVersionLT(10, 5)) {
1268 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1269 CmdArgs.push_back(Str);
1270 }
1271}
1272
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001273bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001274
John McCall3deb1ad2012-08-21 02:47:43 +00001275void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001276 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1277 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001278 return;
John McCall93207072012-08-27 01:56:21 +00001279 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001280}
1281
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001282SanitizerMask Darwin::getSupportedSanitizers() const {
Devin Coughlinfcfa38c2016-03-20 18:24:33 +00001283 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001284 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Anna Zakse67b4022016-02-02 02:04:48 +00001285 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001286 if (isTargetMacOS()) {
1287 if (!isMacosxVersionLT(10, 9))
1288 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001289 Res |= SanitizerKind::SafeStack;
Devin Coughlinfcfa38c2016-03-20 18:24:33 +00001290 if (IsX86_64)
1291 Res |= SanitizerKind::Thread;
1292 } else if (isTargetIOSSimulator() || isTargetTvOSSimulator()) {
1293 if (IsX86_64)
1294 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001295 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001296 return Res;
1297}
1298
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001299/// Generic_GCC - A tool chain using the 'gcc' command to perform
1300/// all subcommands; this relies on gcc translating the majority of
1301/// command line options.
1302
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001303/// \brief Parse a GCCVersion object out of a string of text.
1304///
1305/// This is the primary means of forming GCCVersion objects.
1306/*static*/
1307Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001308 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001309 std::pair<StringRef, StringRef> First = VersionText.split('.');
1310 std::pair<StringRef, StringRef> Second = First.second.split('.');
1311
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001312 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1313 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001314 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001315 GoodVersion.MajorStr = First.first.str();
Bryan Chand346ae62016-06-17 16:47:14 +00001316 if (First.second.empty())
1317 return GoodVersion;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001318 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001319 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001320 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001321
1322 // First look for a number prefix and parse that if present. Otherwise just
1323 // stash the entire patch string in the suffix, and leave the number
1324 // unspecified. This covers versions strings such as:
Bryan Chand346ae62016-06-17 16:47:14 +00001325 // 5 (handled above)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001326 // 4.4
1327 // 4.4.0
1328 // 4.4.x
1329 // 4.4.2-rc4
1330 // 4.4.x-patched
1331 // And retains any patch number it finds.
1332 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1333 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001334 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001335 // Try to parse the number and any suffix.
1336 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1337 GoodVersion.Patch < 0)
1338 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001339 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001340 }
1341 }
1342
1343 return GoodVersion;
1344}
1345
1346/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001347bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1348 int RHSPatch,
1349 StringRef RHSPatchSuffix) const {
1350 if (Major != RHSMajor)
1351 return Major < RHSMajor;
1352 if (Minor != RHSMinor)
1353 return Minor < RHSMinor;
1354 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001355 // Note that versions without a specified patch sort higher than those with
1356 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001357 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001358 return true;
1359 if (Patch == -1)
1360 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001361
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001362 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001363 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001364 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001365 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001366 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001367 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001368 return true;
1369 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001370 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001371
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001372 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001373 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001374 }
1375
1376 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001377 return false;
1378}
1379
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001380static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001381 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1382 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001383 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001384 return GCC_INSTALL_PREFIX;
1385}
1386
Roman Divacky326d9982013-12-06 18:32:18 +00001387/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001388///
1389/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001390/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001391///
1392/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1393/// should instead pull the target out of the driver. This is currently
1394/// necessary because the driver doesn't store the final version of the target
1395/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001396void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001397 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001398 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001399 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1400 ? TargetTriple.get64BitArchVariant()
1401 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001402 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001403 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001404 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001405 SmallVector<StringRef, 16> CandidateTripleAliases;
1406 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001407 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1408 CandidateTripleAliases, CandidateBiarchLibDirs,
1409 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001410
1411 // Compute the set of prefixes for our search.
1412 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1413 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001414
Rafael Espindola1af7c212012-02-19 01:38:32 +00001415 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1416 if (GCCToolchainDir != "") {
1417 if (GCCToolchainDir.back() == '/')
1418 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001419
Rafael Espindola1af7c212012-02-19 01:38:32 +00001420 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001421 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001422 // If we have a SysRoot, try that first.
1423 if (!D.SysRoot.empty()) {
1424 Prefixes.push_back(D.SysRoot);
1425 Prefixes.push_back(D.SysRoot + "/usr");
1426 }
1427
1428 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001429 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001430
Rafael Espindola2edca412016-05-09 13:03:10 +00001431 // Then look for distribution supplied gcc installations.
1432 if (D.SysRoot.empty()) {
1433 // Look for RHEL devtoolsets.
1434 Prefixes.push_back("/opt/rh/devtoolset-4/root/usr");
1435 Prefixes.push_back("/opt/rh/devtoolset-3/root/usr");
1436 Prefixes.push_back("/opt/rh/devtoolset-2/root/usr");
1437 Prefixes.push_back("/opt/rh/devtoolset-1.1/root/usr");
1438 Prefixes.push_back("/opt/rh/devtoolset-1.0/root/usr");
1439 // And finally in /usr.
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001440 Prefixes.push_back("/usr");
Rafael Espindola2edca412016-05-09 13:03:10 +00001441 }
Rafael Espindolac29af942012-02-03 01:01:20 +00001442 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001443
Michal Gornybd449c22016-10-25 15:07:41 +00001444 // Try to respect gcc-config on Gentoo. However, do that only
1445 // if --gcc-toolchain is not provided or equal to the Gentoo install
1446 // in /usr. This avoids accidentally enforcing the system GCC version
1447 // when using a custom toolchain.
1448 if (GCCToolchainDir == "" || GCCToolchainDir == D.SysRoot + "/usr") {
1449 for (StringRef CandidateTriple : CandidateTripleAliases) {
1450 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
1451 D.getVFS().getBufferForFile(D.SysRoot + "/etc/env.d/gcc/config-" +
1452 CandidateTriple.str());
1453 if (File) {
1454 SmallVector<StringRef, 2> Lines;
1455 File.get()->getBuffer().split(Lines, "\n");
1456 for (StringRef Line : Lines) {
1457 // CURRENT=triple-version
1458 if (Line.consume_front("CURRENT=")) {
1459 const std::pair<StringRef, StringRef> ActiveVersion =
1460 Line.rsplit('-');
1461 // Note: Strictly speaking, we should be reading
1462 // /etc/env.d/gcc/${CURRENT} now. However, the file doesn't
1463 // contain anything new or especially useful to us.
1464 const std::string GentooPath = D.SysRoot + "/usr/lib/gcc/" +
1465 ActiveVersion.first.str() + "/" +
1466 ActiveVersion.second.str();
1467 if (D.getVFS().exists(GentooPath + "/crtbegin.o")) {
1468 Version = GCCVersion::Parse(ActiveVersion.second);
1469 GCCInstallPath = GentooPath;
1470 GCCParentLibPath = GentooPath + "/../../..";
1471 GCCTriple.setTriple(ActiveVersion.first);
1472 IsValid = true;
1473 return;
1474 }
1475 }
1476 }
1477 }
1478 }
1479 }
1480
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001481 // Loop over the various components which exist and select the best GCC
1482 // installation available. GCC installs are ranked by version number.
1483 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001484 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001485 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001486 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001487 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001488 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001489 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001490 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001491 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001492 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001493 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001494 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001495 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001496 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001497 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001498 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001499 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001500 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001501 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001502 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001503 }
1504 }
1505}
1506
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001507void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001508 for (const auto &InstallPath : CandidateGCCInstallPaths)
1509 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001510
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001511 if (!GCCInstallPath.empty())
1512 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1513
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001514 for (const auto &Multilib : Multilibs)
1515 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001516
1517 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1518 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001519}
1520
1521bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1522 if (BiarchSibling.hasValue()) {
1523 M = BiarchSibling.getValue();
1524 return true;
1525 }
1526 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001527}
1528
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001529/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001530 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001531 SmallVectorImpl<StringRef> &LibDirs,
1532 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001533 SmallVectorImpl<StringRef> &BiarchLibDirs,
1534 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001535 // Declare a bunch of static data sets that we'll select between below. These
1536 // are specifically designed to always refer to string literals to avoid any
1537 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001538 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1539 static const char *const AArch64Triples[] = {
1540 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1541 "aarch64-redhat-linux"};
1542 static const char *const AArch64beLibDirs[] = {"/lib"};
1543 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1544 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001545
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001546 static const char *const ARMLibDirs[] = {"/lib"};
1547 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1548 "arm-linux-androideabi"};
1549 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1550 "armv7hl-redhat-linux-gnueabi"};
1551 static const char *const ARMebLibDirs[] = {"/lib"};
1552 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1553 "armeb-linux-androideabi"};
1554 static const char *const ARMebHFTriples[] = {
1555 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001556
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001557 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001558 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001559 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1560 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1561 "x86_64-redhat-linux", "x86_64-suse-linux",
1562 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1563 "x86_64-slackware-linux", "x86_64-linux-android",
1564 "x86_64-unknown-linux"};
1565 static const char *const X32LibDirs[] = {"/libx32"};
1566 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001567 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001568 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1569 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1570 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1571 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1572 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001573
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001574 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001575 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1576 "mips-mti-linux-gnu",
1577 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001578 static const char *const MIPSELLibDirs[] = {"/lib"};
Simon Atanasyan603018a2016-07-19 07:09:48 +00001579 static const char *const MIPSELTriples[] = {"mipsel-linux-gnu",
1580 "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001581
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001582 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1583 static const char *const MIPS64Triples[] = {
1584 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1585 "mips64-linux-gnuabi64"};
1586 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1587 static const char *const MIPS64ELTriples[] = {
1588 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
Simon Atanasyan603018a2016-07-19 07:09:48 +00001589 "mips64el-linux-gnuabi64"};
1590
1591 static const char *const MIPSELAndroidLibDirs[] = {"/lib", "/libr2",
1592 "/libr6"};
1593 static const char *const MIPSELAndroidTriples[] = {"mipsel-linux-android"};
1594 static const char *const MIPS64ELAndroidLibDirs[] = {"/lib64", "/lib",
1595 "/libr2", "/libr6"};
1596 static const char *const MIPS64ELAndroidTriples[] = {
1597 "mips64el-linux-android"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001598
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001599 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001600 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001601 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1602 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1603 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1604 static const char *const PPC64Triples[] = {
1605 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1606 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1607 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1608 static const char *const PPC64LETriples[] = {
1609 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1610 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001611
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001612 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1613 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1614 "sparcv8-linux-gnu"};
1615 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1616 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1617 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001618
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001619 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001620 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001621 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1622 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001623
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001624 // Solaris.
1625 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1626 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1627 "i386-pc-solaris2.11"};
1628
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001629 using std::begin;
1630 using std::end;
1631
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001632 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1633 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1634 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001635 return;
1636 }
1637
Chandler Carruth866faab2012-01-25 07:21:38 +00001638 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001639 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001640 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1641 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1642 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1643 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001644 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001645 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001646 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1647 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1648 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1649 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001650 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001651 case llvm::Triple::arm:
1652 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001653 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001654 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001655 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001656 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001657 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001658 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001659 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001660 case llvm::Triple::armeb:
1661 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001662 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001663 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001664 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001665 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001666 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001667 }
1668 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001669 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001670 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1671 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1672 // x32 is always available when x86_64 is available, so adding it as
1673 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001674 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001675 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1676 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001677 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001678 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1679 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001680 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001681 break;
1682 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001683 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001684 // MCU toolchain is 32 bit only and its triple alias is TargetTriple
1685 // itself, which will be appended below.
1686 if (!TargetTriple.isOSIAMCU()) {
1687 TripleAliases.append(begin(X86Triples), end(X86Triples));
1688 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1689 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1690 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001691 break;
1692 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001693 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1694 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1695 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1696 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001697 break;
1698 case llvm::Triple::mipsel:
Simon Atanasyan603018a2016-07-19 07:09:48 +00001699 if (TargetTriple.isAndroid()) {
1700 LibDirs.append(begin(MIPSELAndroidLibDirs), end(MIPSELAndroidLibDirs));
1701 TripleAliases.append(begin(MIPSELAndroidTriples),
1702 end(MIPSELAndroidTriples));
1703 BiarchLibDirs.append(begin(MIPS64ELAndroidLibDirs),
1704 end(MIPS64ELAndroidLibDirs));
1705 BiarchTripleAliases.append(begin(MIPS64ELAndroidTriples),
1706 end(MIPS64ELAndroidTriples));
1707
1708 } else {
1709 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1710 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1711 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1712 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1713 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1714 }
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001715 break;
1716 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001717 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1718 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1719 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1720 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001721 break;
1722 case llvm::Triple::mips64el:
Simon Atanasyan603018a2016-07-19 07:09:48 +00001723 if (TargetTriple.isAndroid()) {
1724 LibDirs.append(begin(MIPS64ELAndroidLibDirs),
1725 end(MIPS64ELAndroidLibDirs));
1726 TripleAliases.append(begin(MIPS64ELAndroidTriples),
1727 end(MIPS64ELAndroidTriples));
1728 BiarchLibDirs.append(begin(MIPSELAndroidLibDirs),
1729 end(MIPSELAndroidLibDirs));
1730 BiarchTripleAliases.append(begin(MIPSELAndroidTriples),
1731 end(MIPSELAndroidTriples));
1732
1733 } else {
1734 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1735 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1736 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1737 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1738 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1739 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001740 break;
1741 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001742 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1743 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1744 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1745 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001746 break;
1747 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001748 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1749 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1750 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1751 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001752 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001753 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001754 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1755 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001756 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001757 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001758 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001759 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1760 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1761 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1762 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001763 break;
1764 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001765 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1766 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1767 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1768 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001769 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001770 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001771 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1772 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001773 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001774 default:
1775 // By default, just rely on the standard lib directories and the original
1776 // triple.
1777 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001778 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001779
1780 // Always append the drivers target triple to the end, in case it doesn't
1781 // match any of our aliases.
1782 TripleAliases.push_back(TargetTriple.str());
1783
1784 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001785 if (TargetTriple.str() != BiarchTriple.str())
1786 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001787}
1788
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001789// Parses the contents of version.txt in an CUDA installation. It should
1790// contain one line of the from e.g. "CUDA Version 7.5.2".
1791static CudaVersion ParseCudaVersionFile(llvm::StringRef V) {
1792 if (!V.startswith("CUDA Version "))
1793 return CudaVersion::UNKNOWN;
1794 V = V.substr(strlen("CUDA Version "));
1795 int Major = -1, Minor = -1;
1796 auto First = V.split('.');
1797 auto Second = First.second.split('.');
Justin Lebara27654a2016-08-15 20:38:48 +00001798 if (First.first.getAsInteger(10, Major) ||
1799 Second.first.getAsInteger(10, Minor))
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001800 return CudaVersion::UNKNOWN;
1801
1802 if (Major == 7 && Minor == 0) {
1803 // This doesn't appear to ever happen -- version.txt doesn't exist in the
1804 // CUDA 7 installs I've seen. But no harm in checking.
1805 return CudaVersion::CUDA_70;
1806 }
1807 if (Major == 7 && Minor == 5)
1808 return CudaVersion::CUDA_75;
1809 if (Major == 8 && Minor == 0)
1810 return CudaVersion::CUDA_80;
1811 return CudaVersion::UNKNOWN;
1812}
1813
Artem Belevich98607b62015-09-23 21:49:39 +00001814// \brief -- try common CUDA installation paths looking for files we need for
1815// CUDA compilation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001816void Generic_GCC::CudaInstallationDetector::init(
1817 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001818 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001819
1820 if (Args.hasArg(options::OPT_cuda_path_EQ))
1821 CudaPathCandidates.push_back(
1822 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1823 else {
1824 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001825 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-8.0");
Artem Belevich86017332015-11-17 22:28:55 +00001826 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001827 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1828 }
1829
Benjamin Kramere8b76412015-09-24 14:48:37 +00001830 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001831 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001832 continue;
1833
Justin Lebar710c1312016-07-06 21:21:43 +00001834 InstallPath = CudaPath;
1835 BinPath = CudaPath + "/bin";
1836 IncludePath = InstallPath + "/include";
1837 LibDevicePath = InstallPath + "/nvvm/libdevice";
1838 LibPath = InstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
Artem Belevich98607b62015-09-23 21:49:39 +00001839
Justin Lebar710c1312016-07-06 21:21:43 +00001840 auto &FS = D.getVFS();
1841 if (!(FS.exists(IncludePath) && FS.exists(BinPath) && FS.exists(LibPath) &&
1842 FS.exists(LibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001843 continue;
1844
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001845 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> VersionFile =
1846 FS.getBufferForFile(InstallPath + "/version.txt");
1847 if (!VersionFile) {
1848 // CUDA 7.0 doesn't have a version.txt, so guess that's our version if
1849 // version.txt isn't present.
1850 Version = CudaVersion::CUDA_70;
1851 } else {
1852 Version = ParseCudaVersionFile((*VersionFile)->getBuffer());
1853 }
1854
Artem Belevich34f481a2015-11-17 22:28:50 +00001855 std::error_code EC;
Justin Lebar710c1312016-07-06 21:21:43 +00001856 for (llvm::sys::fs::directory_iterator LI(LibDevicePath, EC), LE;
Artem Belevich34f481a2015-11-17 22:28:50 +00001857 !EC && LI != LE; LI = LI.increment(EC)) {
1858 StringRef FilePath = LI->path();
1859 StringRef FileName = llvm::sys::path::filename(FilePath);
1860 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1861 const StringRef LibDeviceName = "libdevice.";
1862 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1863 continue;
1864 StringRef GpuArch = FileName.slice(
1865 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
Justin Lebar710c1312016-07-06 21:21:43 +00001866 LibDeviceMap[GpuArch] = FilePath.str();
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001867 // Insert map entries for specifc devices with this compute
1868 // capability. NVCC's choice of the libdevice library version is
1869 // rather peculiar and depends on the CUDA version.
Artem Belevich34f481a2015-11-17 22:28:50 +00001870 if (GpuArch == "compute_20") {
Justin Lebar710c1312016-07-06 21:21:43 +00001871 LibDeviceMap["sm_20"] = FilePath;
1872 LibDeviceMap["sm_21"] = FilePath;
Artem Belevich02a1e972016-08-02 23:12:51 +00001873 LibDeviceMap["sm_32"] = FilePath;
Artem Belevich34f481a2015-11-17 22:28:50 +00001874 } else if (GpuArch == "compute_30") {
Justin Lebar710c1312016-07-06 21:21:43 +00001875 LibDeviceMap["sm_30"] = FilePath;
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001876 if (Version < CudaVersion::CUDA_80) {
1877 LibDeviceMap["sm_50"] = FilePath;
1878 LibDeviceMap["sm_52"] = FilePath;
1879 LibDeviceMap["sm_53"] = FilePath;
1880 }
Artem Belevich02a1e972016-08-02 23:12:51 +00001881 LibDeviceMap["sm_60"] = FilePath;
1882 LibDeviceMap["sm_61"] = FilePath;
1883 LibDeviceMap["sm_62"] = FilePath;
Artem Belevich34f481a2015-11-17 22:28:50 +00001884 } else if (GpuArch == "compute_35") {
Justin Lebar710c1312016-07-06 21:21:43 +00001885 LibDeviceMap["sm_35"] = FilePath;
1886 LibDeviceMap["sm_37"] = FilePath;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001887 } else if (GpuArch == "compute_50") {
Artem Belevichd4d9dc82016-09-28 17:47:40 +00001888 if (Version >= CudaVersion::CUDA_80) {
1889 LibDeviceMap["sm_50"] = FilePath;
1890 LibDeviceMap["sm_52"] = FilePath;
1891 LibDeviceMap["sm_53"] = FilePath;
1892 }
Artem Belevich34f481a2015-11-17 22:28:50 +00001893 }
1894 }
1895
Artem Belevich98607b62015-09-23 21:49:39 +00001896 IsValid = true;
1897 break;
1898 }
1899}
1900
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001901void Generic_GCC::CudaInstallationDetector::CheckCudaVersionSupportsArch(
1902 CudaArch Arch) const {
1903 if (Arch == CudaArch::UNKNOWN || Version == CudaVersion::UNKNOWN ||
1904 ArchsWithVersionTooLowErrors.count(Arch) > 0)
1905 return;
1906
1907 auto RequiredVersion = MinVersionForCudaArch(Arch);
1908 if (Version < RequiredVersion) {
1909 ArchsWithVersionTooLowErrors.insert(Arch);
1910 D.Diag(diag::err_drv_cuda_version_too_low)
1911 << InstallPath << CudaArchToString(Arch) << CudaVersionToString(Version)
1912 << CudaVersionToString(RequiredVersion);
1913 }
1914}
1915
Artem Belevich98607b62015-09-23 21:49:39 +00001916void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1917 if (isValid())
Justin Lebarc43ad9e2016-07-07 18:17:52 +00001918 OS << "Found CUDA installation: " << InstallPath << ", version "
1919 << CudaVersionToString(Version) << "\n";
Artem Belevich98607b62015-09-23 21:49:39 +00001920}
1921
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001922namespace {
1923// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001924class FilterNonExistent {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001925 StringRef Base, File;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001926 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001927
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001928public:
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001929 FilterNonExistent(StringRef Base, StringRef File, vfs::FileSystem &VFS)
1930 : Base(Base), File(File), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001931 bool operator()(const Multilib &M) {
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00001932 return !VFS.exists(Base + M.gccSuffix() + File);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001933 }
1934};
1935} // end anonymous namespace
1936
1937static void addMultilibFlag(bool Enabled, const char *const Flag,
1938 std::vector<std::string> &Flags) {
1939 if (Enabled)
1940 Flags.push_back(std::string("+") + Flag);
1941 else
1942 Flags.push_back(std::string("-") + Flag);
1943}
1944
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00001945static bool isArmOrThumbArch(llvm::Triple::ArchType Arch) {
1946 return Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb;
1947}
1948
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001949static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001950 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1951 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1952}
1953
1954static bool isMips32(llvm::Triple::ArchType Arch) {
1955 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1956}
1957
1958static bool isMips64(llvm::Triple::ArchType Arch) {
1959 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1960}
1961
1962static bool isMipsEL(llvm::Triple::ArchType Arch) {
1963 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1964}
1965
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001966static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001967 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001968 return A && A->getOption().matches(options::OPT_mips16);
1969}
1970
1971static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001972 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001973 return A && A->getOption().matches(options::OPT_mmicromips);
1974}
1975
Benjamin Kramere003ca22015-10-28 13:54:16 +00001976namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001977struct DetectedMultilibs {
1978 /// The set of multilibs that the detected installation supports.
1979 MultilibSet Multilibs;
1980
1981 /// The primary multilib appropriate for the given flags.
1982 Multilib SelectedMultilib;
1983
1984 /// On Biarch systems, this corresponds to the default multilib when
1985 /// targeting the non-default multilib. Otherwise, it is empty.
1986 llvm::Optional<Multilib> BiarchSibling;
1987};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001988} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001989
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001990static Multilib makeMultilib(StringRef commonSuffix) {
1991 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1992}
1993
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00001994static bool findMipsCsMultilibs(const Multilib::flags_list &Flags,
1995 FilterNonExistent &NonExistent,
1996 DetectedMultilibs &Result) {
1997 // Check for Code Sourcery toolchain multilibs
1998 MultilibSet CSMipsMultilibs;
1999 {
2000 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002001
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002002 auto MArchMicroMips =
2003 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002004
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002005 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
2006
2007 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
2008
2009 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
2010
2011 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
2012
2013 auto DefaultFloat =
2014 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
2015
2016 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
2017
2018 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
2019
2020 // Note that this one's osSuffix is ""
2021 auto MAbi64 = makeMultilib("")
2022 .gccSuffix("/64")
2023 .includeSuffix("/64")
2024 .flag("+mabi=n64")
2025 .flag("-mabi=n32")
2026 .flag("-m32");
2027
2028 CSMipsMultilibs =
2029 MultilibSet()
2030 .Either(MArchMips16, MArchMicroMips, MArchDefault)
2031 .Maybe(UCLibc)
2032 .Either(SoftFloat, Nan2008, DefaultFloat)
2033 .FilterOut("/micromips/nan2008")
2034 .FilterOut("/mips16/nan2008")
2035 .Either(BigEndian, LittleEndian)
2036 .Maybe(MAbi64)
2037 .FilterOut("/mips16.*/64")
2038 .FilterOut("/micromips.*/64")
2039 .FilterOut(NonExistent)
2040 .setIncludeDirsCallback([](const Multilib &M) {
2041 std::vector<std::string> Dirs({"/include"});
2042 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
2043 Dirs.push_back(
2044 "/../../../../mips-linux-gnu/libc/uclibc/usr/include");
2045 else
2046 Dirs.push_back("/../../../../mips-linux-gnu/libc/usr/include");
2047 return Dirs;
2048 });
2049 }
2050
2051 MultilibSet DebianMipsMultilibs;
2052 {
2053 Multilib MAbiN32 =
2054 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
2055
2056 Multilib M64 = Multilib()
2057 .gccSuffix("/64")
2058 .includeSuffix("/64")
2059 .flag("+m64")
2060 .flag("-m32")
2061 .flag("-mabi=n32");
2062
2063 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
2064
2065 DebianMipsMultilibs =
2066 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
2067 }
2068
2069 // Sort candidates. Toolchain that best meets the directories tree goes first.
2070 // Then select the first toolchains matches command line flags.
2071 MultilibSet *Candidates[] = {&CSMipsMultilibs, &DebianMipsMultilibs};
2072 if (CSMipsMultilibs.size() < DebianMipsMultilibs.size())
2073 std::iter_swap(Candidates, Candidates + 1);
2074 for (const MultilibSet *Candidate : Candidates) {
2075 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2076 if (Candidate == &DebianMipsMultilibs)
2077 Result.BiarchSibling = Multilib();
2078 Result.Multilibs = *Candidate;
2079 return true;
2080 }
2081 }
2082 return false;
2083}
2084
Simon Atanasyan603018a2016-07-19 07:09:48 +00002085static bool findMipsAndroidMultilibs(vfs::FileSystem &VFS, StringRef Path,
2086 const Multilib::flags_list &Flags,
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002087 FilterNonExistent &NonExistent,
2088 DetectedMultilibs &Result) {
2089
2090 MultilibSet AndroidMipsMultilibs =
2091 MultilibSet()
2092 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
2093 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
2094 .FilterOut(NonExistent);
2095
Simon Atanasyan603018a2016-07-19 07:09:48 +00002096 MultilibSet AndroidMipselMultilibs =
2097 MultilibSet()
2098 .Either(Multilib().flag("+march=mips32"),
2099 Multilib("/mips-r2", "", "/mips-r2").flag("+march=mips32r2"),
2100 Multilib("/mips-r6", "", "/mips-r6").flag("+march=mips32r6"))
2101 .FilterOut(NonExistent);
2102
2103 MultilibSet AndroidMips64elMultilibs =
2104 MultilibSet()
2105 .Either(
2106 Multilib().flag("+march=mips64r6"),
2107 Multilib("/32/mips-r1", "", "/mips-r1").flag("+march=mips32"),
2108 Multilib("/32/mips-r2", "", "/mips-r2").flag("+march=mips32r2"),
2109 Multilib("/32/mips-r6", "", "/mips-r6").flag("+march=mips32r6"))
2110 .FilterOut(NonExistent);
2111
2112 MultilibSet *MS = &AndroidMipsMultilibs;
2113 if (VFS.exists(Path + "/mips-r6"))
2114 MS = &AndroidMipselMultilibs;
2115 else if (VFS.exists(Path + "/32"))
2116 MS = &AndroidMips64elMultilibs;
2117 if (MS->select(Flags, Result.SelectedMultilib)) {
2118 Result.Multilibs = *MS;
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002119 return true;
2120 }
2121 return false;
2122}
2123
2124static bool findMipsMuslMultilibs(const Multilib::flags_list &Flags,
2125 FilterNonExistent &NonExistent,
2126 DetectedMultilibs &Result) {
2127 // Musl toolchain multilibs
2128 MultilibSet MuslMipsMultilibs;
2129 {
2130 auto MArchMipsR2 = makeMultilib("")
2131 .osSuffix("/mips-r2-hard-musl")
2132 .flag("+EB")
2133 .flag("-EL")
2134 .flag("+march=mips32r2");
2135
2136 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
2137 .flag("-EB")
2138 .flag("+EL")
2139 .flag("+march=mips32r2");
2140
2141 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
2142
2143 // Specify the callback that computes the include directories.
2144 MuslMipsMultilibs.setIncludeDirsCallback([](const Multilib &M) {
2145 return std::vector<std::string>(
2146 {"/../sysroot" + M.osSuffix() + "/usr/include"});
2147 });
2148 }
2149 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2150 Result.Multilibs = MuslMipsMultilibs;
2151 return true;
2152 }
2153 return false;
2154}
2155
2156static bool findMipsMtiMultilibs(const Multilib::flags_list &Flags,
2157 FilterNonExistent &NonExistent,
2158 DetectedMultilibs &Result) {
2159 // CodeScape MTI toolchain v1.2 and early.
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002160 MultilibSet MtiMipsMultilibsV1;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002161 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002162 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002163 .flag("+m32")
2164 .flag("-m64")
2165 .flag("-mmicromips")
2166 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002167
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002168 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002169 .flag("+m32")
2170 .flag("-m64")
2171 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002172
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002173 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002174 .flag("-m32")
2175 .flag("+m64")
2176 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002177
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002178 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
2179 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002180
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00002181 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002182 .flag("+m32")
2183 .flag("-m64")
2184 .flag("-mmicromips")
2185 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002186
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002187 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002188
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002189 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002190
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002191 auto MAbi64 =
2192 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002193
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002194 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002195
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002196 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002197
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002198 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002199
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002200 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002201
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002202 MtiMipsMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002203 MultilibSet()
2204 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
2205 MArchDefault)
2206 .Maybe(UCLibc)
2207 .Maybe(Mips16)
2208 .FilterOut("/mips64/mips16")
2209 .FilterOut("/mips64r2/mips16")
2210 .FilterOut("/micromips/mips16")
2211 .Maybe(MAbi64)
2212 .FilterOut("/micromips/64")
2213 .FilterOut("/mips32/64")
2214 .FilterOut("^/64")
2215 .FilterOut("/mips16/64")
2216 .Either(BigEndian, LittleEndian)
2217 .Maybe(SoftFloat)
2218 .Maybe(Nan2008)
2219 .FilterOut(".*sof/nan2008")
2220 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002221 .setIncludeDirsCallback([](const Multilib &M) {
2222 std::vector<std::string> Dirs({"/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002223 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
Simon Atanasyana45502d2016-05-19 15:07:21 +00002224 Dirs.push_back("/../../../../sysroot/uclibc/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002225 else
Simon Atanasyana45502d2016-05-19 15:07:21 +00002226 Dirs.push_back("/../../../../sysroot/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002227 return Dirs;
2228 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00002229 }
2230
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002231 // CodeScape IMG toolchain starting from v1.3.
Simon Atanasyan2834a222016-05-22 18:18:07 +00002232 MultilibSet MtiMipsMultilibsV2;
2233 {
2234 auto BeHard = makeMultilib("/mips-r2-hard")
2235 .flag("+EB")
2236 .flag("-msoft-float")
2237 .flag("-mnan=2008")
2238 .flag("-muclibc");
2239 auto BeSoft = makeMultilib("/mips-r2-soft")
2240 .flag("+EB")
2241 .flag("+msoft-float")
2242 .flag("-mnan=2008");
2243 auto ElHard = makeMultilib("/mipsel-r2-hard")
2244 .flag("+EL")
2245 .flag("-msoft-float")
2246 .flag("-mnan=2008")
2247 .flag("-muclibc");
2248 auto ElSoft = makeMultilib("/mipsel-r2-soft")
2249 .flag("+EL")
2250 .flag("+msoft-float")
2251 .flag("-mnan=2008")
2252 .flag("-mmicromips");
2253 auto BeHardNan = makeMultilib("/mips-r2-hard-nan2008")
2254 .flag("+EB")
2255 .flag("-msoft-float")
2256 .flag("+mnan=2008")
2257 .flag("-muclibc");
2258 auto ElHardNan = makeMultilib("/mipsel-r2-hard-nan2008")
2259 .flag("+EL")
2260 .flag("-msoft-float")
2261 .flag("+mnan=2008")
2262 .flag("-muclibc")
2263 .flag("-mmicromips");
2264 auto BeHardNanUclibc = makeMultilib("/mips-r2-hard-nan2008-uclibc")
2265 .flag("+EB")
2266 .flag("-msoft-float")
2267 .flag("+mnan=2008")
2268 .flag("+muclibc");
2269 auto ElHardNanUclibc = makeMultilib("/mipsel-r2-hard-nan2008-uclibc")
2270 .flag("+EL")
2271 .flag("-msoft-float")
2272 .flag("+mnan=2008")
2273 .flag("+muclibc");
2274 auto BeHardUclibc = makeMultilib("/mips-r2-hard-uclibc")
2275 .flag("+EB")
2276 .flag("-msoft-float")
2277 .flag("-mnan=2008")
2278 .flag("+muclibc");
2279 auto ElHardUclibc = makeMultilib("/mipsel-r2-hard-uclibc")
2280 .flag("+EL")
2281 .flag("-msoft-float")
2282 .flag("-mnan=2008")
2283 .flag("+muclibc");
2284 auto ElMicroHardNan = makeMultilib("/micromipsel-r2-hard-nan2008")
2285 .flag("+EL")
2286 .flag("-msoft-float")
2287 .flag("+mnan=2008")
2288 .flag("+mmicromips");
2289 auto ElMicroSoft = makeMultilib("/micromipsel-r2-soft")
2290 .flag("+EL")
2291 .flag("+msoft-float")
2292 .flag("-mnan=2008")
2293 .flag("+mmicromips");
2294
2295 auto O32 =
2296 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2297 auto N32 =
2298 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2299 auto N64 =
2300 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2301
2302 MtiMipsMultilibsV2 =
2303 MultilibSet()
2304 .Either({BeHard, BeSoft, ElHard, ElSoft, BeHardNan, ElHardNan,
2305 BeHardNanUclibc, ElHardNanUclibc, BeHardUclibc,
2306 ElHardUclibc, ElMicroHardNan, ElMicroSoft})
2307 .Either(O32, N32, N64)
2308 .FilterOut(NonExistent)
2309 .setIncludeDirsCallback([](const Multilib &M) {
2310 return std::vector<std::string>({"/../../../../sysroot" +
2311 M.includeSuffix() +
2312 "/../usr/include"});
2313 })
2314 .setFilePathsCallback([](const Multilib &M) {
2315 return std::vector<std::string>(
2316 {"/../../../../mips-mti-linux-gnu/lib" + M.gccSuffix()});
2317 });
2318 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002319 for (auto Candidate : {&MtiMipsMultilibsV1, &MtiMipsMultilibsV2}) {
2320 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2321 Result.Multilibs = *Candidate;
2322 return true;
2323 }
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002324 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002325 return false;
2326}
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002327
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002328static bool findMipsImgMultilibs(const Multilib::flags_list &Flags,
2329 FilterNonExistent &NonExistent,
2330 DetectedMultilibs &Result) {
2331 // CodeScape IMG toolchain v1.2 and early.
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002332 MultilibSet ImgMultilibsV1;
Daniel Sanders2bf13662014-07-10 14:40:57 +00002333 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002334 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002335
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002336 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002338 auto MAbi64 =
2339 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002340
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002341 ImgMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002342 MultilibSet()
2343 .Maybe(Mips64r6)
2344 .Maybe(MAbi64)
2345 .Maybe(LittleEndian)
2346 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002347 .setIncludeDirsCallback([](const Multilib &M) {
2348 return std::vector<std::string>(
2349 {"/include", "/../../../../sysroot/usr/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002350 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002351 }
2352
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002353 // CodeScape IMG toolchain starting from v1.3.
Simon Atanasyan2834a222016-05-22 18:18:07 +00002354 MultilibSet ImgMultilibsV2;
2355 {
2356 auto BeHard = makeMultilib("/mips-r6-hard")
2357 .flag("+EB")
2358 .flag("-msoft-float")
2359 .flag("-mmicromips");
2360 auto BeSoft = makeMultilib("/mips-r6-soft")
2361 .flag("+EB")
2362 .flag("+msoft-float")
2363 .flag("-mmicromips");
2364 auto ElHard = makeMultilib("/mipsel-r6-hard")
2365 .flag("+EL")
2366 .flag("-msoft-float")
2367 .flag("-mmicromips");
2368 auto ElSoft = makeMultilib("/mipsel-r6-soft")
2369 .flag("+EL")
2370 .flag("+msoft-float")
2371 .flag("-mmicromips");
2372 auto BeMicroHard = makeMultilib("/micromips-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002373 .flag("+EB")
2374 .flag("-msoft-float")
2375 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002376 auto BeMicroSoft = makeMultilib("/micromips-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002377 .flag("+EB")
2378 .flag("+msoft-float")
2379 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002380 auto ElMicroHard = makeMultilib("/micromipsel-r6-hard")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002381 .flag("+EL")
2382 .flag("-msoft-float")
2383 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002384 auto ElMicroSoft = makeMultilib("/micromipsel-r6-soft")
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002385 .flag("+EL")
2386 .flag("+msoft-float")
2387 .flag("+mmicromips");
Simon Atanasyan2834a222016-05-22 18:18:07 +00002388
2389 auto O32 =
2390 makeMultilib("/lib").osSuffix("").flag("-mabi=n32").flag("-mabi=n64");
2391 auto N32 =
2392 makeMultilib("/lib32").osSuffix("").flag("+mabi=n32").flag("-mabi=n64");
2393 auto N64 =
2394 makeMultilib("/lib64").osSuffix("").flag("-mabi=n32").flag("+mabi=n64");
2395
Simon Atanasyan6c51f5a2016-05-22 18:18:41 +00002396 ImgMultilibsV2 =
2397 MultilibSet()
2398 .Either({BeHard, BeSoft, ElHard, ElSoft, BeMicroHard, BeMicroSoft,
2399 ElMicroHard, ElMicroSoft})
2400 .Either(O32, N32, N64)
2401 .FilterOut(NonExistent)
2402 .setIncludeDirsCallback([](const Multilib &M) {
2403 return std::vector<std::string>({"/../../../../sysroot" +
2404 M.includeSuffix() +
2405 "/../usr/include"});
2406 })
2407 .setFilePathsCallback([](const Multilib &M) {
2408 return std::vector<std::string>(
2409 {"/../../../../mips-img-linux-gnu/lib" + M.gccSuffix()});
2410 });
Simon Atanasyan2834a222016-05-22 18:18:07 +00002411 }
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002412 for (auto Candidate : {&ImgMultilibsV1, &ImgMultilibsV2}) {
2413 if (Candidate->select(Flags, Result.SelectedMultilib)) {
2414 Result.Multilibs = *Candidate;
2415 return true;
2416 }
2417 }
2418 return false;
2419}
2420
2421static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
2422 StringRef Path, const ArgList &Args,
2423 DetectedMultilibs &Result) {
2424 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Simon Atanasyan2834a222016-05-22 18:18:07 +00002425
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002426 StringRef CPUName;
2427 StringRef ABIName;
2428 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2429
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002430 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2431
2432 Multilib::flags_list Flags;
2433 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2434 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2435 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002436 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002437 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002438 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002439 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002440 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002441 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002442 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2443 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002444 "march=mips64r2", Flags);
Simon Atanasyan603018a2016-07-19 07:09:48 +00002445 addMultilibFlag(CPUName == "mips64r6", "march=mips64r6", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002446 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002447 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002448 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2449 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002450 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2451 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002452 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002453 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002454 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002455 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002456
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002457 if (TargetTriple.isAndroid())
Simon Atanasyan603018a2016-07-19 07:09:48 +00002458 return findMipsAndroidMultilibs(D.getVFS(), Path, Flags, NonExistent,
2459 Result);
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002460
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002461 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2462 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002463 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2464 return findMipsMuslMultilibs(Flags, NonExistent, Result);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002465
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002466 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2467 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002468 TargetTriple.getEnvironment() == llvm::Triple::GNU)
2469 return findMipsMtiMultilibs(Flags, NonExistent, Result);
Simon Atanasyan4f3fe5b2016-05-22 15:28:34 +00002470
Daniel Sanders2bf13662014-07-10 14:40:57 +00002471 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2472 TargetTriple.getOS() == llvm::Triple::Linux &&
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002473 TargetTriple.getEnvironment() == llvm::Triple::GNU)
2474 return findMipsImgMultilibs(Flags, NonExistent, Result);
Daniel Sanders2bf13662014-07-10 14:40:57 +00002475
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002476 if (findMipsCsMultilibs(Flags, NonExistent, Result))
2477 return true;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002478
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002479 // Fallback to the regular toolchain-tree structure.
2480 Multilib Default;
2481 Result.Multilibs.push_back(Default);
2482 Result.Multilibs.FilterOut(NonExistent);
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002483
Simon Atanasyanb4abcc52016-06-22 20:00:50 +00002484 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2485 Result.BiarchSibling = Multilib();
2486 return true;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002487 }
2488
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002489 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002490}
2491
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002492static void findAndroidArmMultilibs(const Driver &D,
2493 const llvm::Triple &TargetTriple,
2494 StringRef Path, const ArgList &Args,
2495 DetectedMultilibs &Result) {
2496 // Find multilibs with subdirectories like armv7-a, thumb, armv7-a/thumb.
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002497 FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002498 Multilib ArmV7Multilib = makeMultilib("/armv7-a")
2499 .flag("+armv7")
2500 .flag("-thumb");
2501 Multilib ThumbMultilib = makeMultilib("/thumb")
2502 .flag("-armv7")
2503 .flag("+thumb");
2504 Multilib ArmV7ThumbMultilib = makeMultilib("/armv7-a/thumb")
2505 .flag("+armv7")
2506 .flag("+thumb");
2507 Multilib DefaultMultilib = makeMultilib("")
2508 .flag("-armv7")
2509 .flag("-thumb");
2510 MultilibSet AndroidArmMultilibs =
2511 MultilibSet()
2512 .Either(ThumbMultilib, ArmV7Multilib,
2513 ArmV7ThumbMultilib, DefaultMultilib)
2514 .FilterOut(NonExistent);
2515
2516 Multilib::flags_list Flags;
2517 llvm::StringRef Arch = Args.getLastArgValue(options::OPT_march_EQ);
2518 bool IsArmArch = TargetTriple.getArch() == llvm::Triple::arm;
2519 bool IsThumbArch = TargetTriple.getArch() == llvm::Triple::thumb;
2520 bool IsV7SubArch = TargetTriple.getSubArch() == llvm::Triple::ARMSubArch_v7;
2521 bool IsThumbMode = IsThumbArch ||
2522 Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, false) ||
2523 (IsArmArch && llvm::ARM::parseArchISA(Arch) == llvm::ARM::IK_THUMB);
2524 bool IsArmV7Mode = (IsArmArch || IsThumbArch) &&
2525 (llvm::ARM::parseArchVersion(Arch) == 7 ||
2526 (IsArmArch && Arch == "" && IsV7SubArch));
2527 addMultilibFlag(IsArmV7Mode, "armv7", Flags);
2528 addMultilibFlag(IsThumbMode, "thumb", Flags);
2529
2530 if (AndroidArmMultilibs.select(Flags, Result.SelectedMultilib))
2531 Result.Multilibs = AndroidArmMultilibs;
2532}
2533
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002534static bool findBiarchMultilibs(const Driver &D,
2535 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002536 StringRef Path, const ArgList &Args,
2537 bool NeedsBiarchSuffix,
2538 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002539 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2540 // in what would normally be GCCInstallPath and put the 64-bit
2541 // libs in a subdirectory named 64. The simple logic we follow is that
2542 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2543 // we use that. If not, and if not a biarch triple alias, we look for
2544 // crtbegin.o without the subdirectory.
2545
2546 Multilib Default;
2547 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002548 .gccSuffix("/64")
2549 .includeSuffix("/64")
2550 .flag("-m32")
2551 .flag("+m64")
2552 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002553 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002554 .gccSuffix("/32")
2555 .includeSuffix("/32")
2556 .flag("+m32")
2557 .flag("-m64")
2558 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002559 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002560 .gccSuffix("/x32")
2561 .includeSuffix("/x32")
2562 .flag("-m32")
2563 .flag("-m64")
2564 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002565
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00002566 // GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a.
2567 FilterNonExistent NonExistent(
2568 Path, TargetTriple.isOSIAMCU() ? "/libgcc.a" : "/crtbegin.o", D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002569
Zinovy Nis1db95732014-07-10 15:27:19 +00002570 // Determine default multilib from: 32, 64, x32
2571 // Also handle cases such as 64 on 32, 32 on 64, etc.
2572 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002573 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002574 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002575 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002576 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002577 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002578 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002579 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002580 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002581 if (TargetTriple.isArch32Bit())
2582 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002583 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002584 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002585 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002586 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002587 }
2588
Zinovy Nis1db95732014-07-10 15:27:19 +00002589 if (Want == WANT32)
2590 Default.flag("+m32").flag("-m64").flag("-mx32");
2591 else if (Want == WANT64)
2592 Default.flag("-m32").flag("+m64").flag("-mx32");
2593 else if (Want == WANTX32)
2594 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002595 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002596 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002597
Simon Atanasyan60280b42014-05-12 07:37:51 +00002598 Result.Multilibs.push_back(Default);
2599 Result.Multilibs.push_back(Alt64);
2600 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002601 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002602
Simon Atanasyan60280b42014-05-12 07:37:51 +00002603 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002604
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002605 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002606 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002607 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002608 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002609
Simon Atanasyan60280b42014-05-12 07:37:51 +00002610 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002611 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002612
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002613 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002614 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002615 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002616
2617 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002618}
2619
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002620void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2621 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2622 const std::string &LibDir, StringRef CandidateTriple,
2623 bool NeedsBiarchSuffix) {
2624 // Solaris is a special case. The GCC installation is under
2625 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2626 // need to iterate twice.
2627 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002628 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2629 !EC && LI != LE; LI = LI.increment(EC)) {
2630 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002631 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2632
2633 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002634 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002635 continue; // Saw this path before; no need to look at it again.
2636 if (CandidateVersion.isOlderThan(4, 1, 1))
2637 continue;
2638 if (CandidateVersion <= Version)
2639 continue;
2640
2641 GCCInstallPath =
2642 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002643 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002644 continue;
2645
2646 // If we make it here there has to be at least one GCC version, let's just
2647 // use the latest one.
2648 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002649 for (vfs::directory_iterator
2650 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2651 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002652 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2653
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002654 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002655 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2656
2657 if (CandidateSubVersion > Version)
2658 Version = CandidateSubVersion;
2659 }
2660
2661 GCCTriple.setTriple(CandidateTriple);
2662
2663 GCCInstallPath += "/" + Version.Text;
2664 GCCParentLibPath = GCCInstallPath + "/../../../../";
2665
2666 IsValid = true;
2667 }
2668}
2669
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002670void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002671 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002672 const std::string &LibDir, StringRef CandidateTriple,
2673 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002674 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002675 // There are various different suffixes involving the triple we
2676 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002677 // up to the lib directory. Specifically, the number of "up" steps
2678 // in the second half of each row is 1 + the number of path separators
2679 // in the first half.
2680 const std::string LibAndInstallSuffixes[][2] = {
2681 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2682
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002683 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002684 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2685
2686 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2687 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002688
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002689 // The Freescale PPC SDK has the gcc libraries in
2690 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002691 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002692
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002693 // Ubuntu has a strange mis-matched pair of triples that this happens to
2694 // match.
2695 // FIXME: It may be worthwhile to generalize this and look for a second
2696 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002697 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2698
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002699 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2700 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2701 NeedsBiarchSuffix);
2702 return;
2703 }
2704
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002705 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002706 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2707 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002708 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002709 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002710 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002711 for (vfs::directory_iterator
2712 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2713 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002714 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002715 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002716 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002717 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002718 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002719 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002720 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002721 continue;
2722 if (CandidateVersion <= Version)
2723 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002724
Simon Atanasyan60280b42014-05-12 07:37:51 +00002725 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002726
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002727 // Android standalone toolchain could have multilibs for ARM and Thumb.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002728 // Debian mips multilibs behave more like the rest of the biarch ones,
2729 // so handle them there
Chih-Hung Hsiehb4d3bf72016-06-01 20:48:46 +00002730 if (isArmOrThumbArch(TargetArch) && TargetTriple.isAndroid()) {
2731 // It should also work without multilibs in a simplified toolchain.
2732 findAndroidArmMultilibs(D, TargetTriple, LI->getName(), Args, Detected);
2733 } else if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002734 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002735 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002736 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002737 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002738 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002739 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002740
Simon Atanasyan60280b42014-05-12 07:37:51 +00002741 Multilibs = Detected.Multilibs;
2742 SelectedMultilib = Detected.SelectedMultilib;
2743 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002744 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002745 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002746 // FIXME: We hack together the directory name here instead of
2747 // using LI to ensure stable path separators across Windows and
2748 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002749 GCCInstallPath =
2750 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2751 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002752 IsValid = true;
2753 }
2754 }
2755}
2756
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002757Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002758 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002759 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002760 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002761 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002762 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002763}
2764
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002765Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002766
Rafael Espindola7cf32212013-03-20 03:05:54 +00002767Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002768 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002769 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002770 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002771 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002772 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002773 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002774 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002775 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002776 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002777 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002778 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002779 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002780}
2781
Rafael Espindola7cf32212013-03-20 03:05:54 +00002782Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002783 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002784}
2785
Douglas Katzman95354292015-06-23 20:42:09 +00002786Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002787
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002788void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2789 // Print the information about how we detected the GCC installation.
2790 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002791 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002792}
2793
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002794bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002795 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002796}
2797
David Majnemer17f448b2015-06-28 04:23:33 +00002798bool Generic_GCC::isPICDefault() const {
2799 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2800}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002801
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002802bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002803
David Majnemer17f448b2015-06-28 04:23:33 +00002804bool Generic_GCC::isPICDefaultForced() const {
2805 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2806}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002807
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002808bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002809 switch (getTriple().getArch()) {
2810 case llvm::Triple::x86:
2811 case llvm::Triple::x86_64:
2812 case llvm::Triple::aarch64:
2813 case llvm::Triple::aarch64_be:
2814 case llvm::Triple::arm:
2815 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002816 case llvm::Triple::bpfel:
2817 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002818 case llvm::Triple::thumb:
2819 case llvm::Triple::thumbeb:
2820 case llvm::Triple::ppc:
2821 case llvm::Triple::ppc64:
2822 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002823 case llvm::Triple::systemz:
Daniel Sanderse160f832016-05-14 12:43:08 +00002824 case llvm::Triple::mips:
2825 case llvm::Triple::mipsel:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002826 return true;
Simon Dardis9edf96e2016-09-15 14:01:55 +00002827 case llvm::Triple::mips64:
2828 case llvm::Triple::mips64el:
2829 // Enabled for Debian mips64/mips64el only. Other targets are unable to
2830 // distinguish N32 from N64.
2831 if (getTriple().getEnvironment() == llvm::Triple::GNUABI64)
2832 return true;
2833 return false;
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002834 default:
2835 return false;
2836 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002837}
2838
Richard Smith2680bc92016-10-29 17:28:48 +00002839void Generic_GCC::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2840 ArgStringList &CC1Args) const {
2841 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2842 DriverArgs.hasArg(options::OPT_nostdincxx))
2843 return;
2844
2845 switch (GetCXXStdlibType(DriverArgs)) {
2846 case ToolChain::CST_Libcxx: {
2847 std::string Path = findLibCxxIncludePath();
2848 if (!Path.empty())
2849 addSystemInclude(DriverArgs, CC1Args, Path);
2850 break;
2851 }
2852
2853 case ToolChain::CST_Libstdcxx:
2854 addLibStdCxxIncludePaths(DriverArgs, CC1Args);
2855 break;
2856 }
2857}
2858
2859std::string Generic_GCC::findLibCxxIncludePath() const {
2860 // FIXME: The Linux behavior would probaby be a better approach here.
2861 return getDriver().SysRoot + "/usr/include/c++/v1";
2862}
2863
2864void
2865Generic_GCC::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
2866 llvm::opt::ArgStringList &CC1Args) const {
2867 // By default, we don't assume we know where libstdc++ might be installed.
2868 // FIXME: If we have a valid GCCInstallation, use it.
2869}
2870
James Y Knighta6c9ee72015-10-16 18:46:26 +00002871/// \brief Helper to add the variant paths of a libstdc++ installation.
2872bool Generic_GCC::addLibStdCXXIncludePaths(
2873 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2874 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2875 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2876 if (!getVFS().exists(Base + Suffix))
2877 return false;
2878
2879 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2880
2881 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2882 // that path exists or we have neither a GCC nor target multiarch triple, use
2883 // this vanilla search path.
2884 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2885 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2886 addSystemInclude(DriverArgs, CC1Args,
2887 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2888 } else {
2889 // Otherwise try to use multiarch naming schemes which have normalized the
2890 // triples and put the triple before the suffix.
2891 //
2892 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2893 // the target triple, so we support that here.
2894 addSystemInclude(DriverArgs, CC1Args,
2895 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2896 addSystemInclude(DriverArgs, CC1Args,
2897 Base + "/" + TargetMultiarchTriple + Suffix);
2898 }
2899
2900 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2901 return true;
2902}
2903
Samuel Antao31fef982016-10-27 17:39:44 +00002904llvm::opt::DerivedArgList *
2905Generic_GCC::TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef,
2906 Action::OffloadKind DeviceOffloadKind) const {
2907
2908 // If this tool chain is used for an OpenMP offloading device we have to make
2909 // sure we always generate a shared library regardless of the commands the
2910 // user passed to the host. This is required because the runtime library
2911 // is required to load the device image dynamically at run time.
2912 if (DeviceOffloadKind == Action::OFK_OpenMP) {
2913 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
2914 const OptTable &Opts = getDriver().getOpts();
2915
2916 // Request the shared library. Given that these options are decided
2917 // implicitly, they do not refer to any base argument.
2918 DAL->AddFlagArg(/*BaseArg=*/nullptr, Opts.getOption(options::OPT_shared));
2919 DAL->AddFlagArg(/*BaseArg=*/nullptr, Opts.getOption(options::OPT_fPIC));
2920
2921 // Filter all the arguments we don't care passing to the offloading
2922 // toolchain as they can mess up with the creation of a shared library.
2923 for (auto *A : Args) {
2924 switch ((options::ID)A->getOption().getID()) {
2925 default:
2926 DAL->append(A);
2927 break;
2928 case options::OPT_shared:
2929 case options::OPT_dynamic:
2930 case options::OPT_static:
2931 case options::OPT_fPIC:
2932 case options::OPT_fno_PIC:
2933 case options::OPT_fpic:
2934 case options::OPT_fno_pic:
2935 case options::OPT_fPIE:
2936 case options::OPT_fno_PIE:
2937 case options::OPT_fpie:
2938 case options::OPT_fno_pie:
2939 break;
2940 }
2941 }
2942 return DAL;
2943 }
2944 return nullptr;
2945}
2946
Kristof Beylsfb387292014-01-10 13:44:34 +00002947void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2948 ArgStringList &CC1Args) const {
2949 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002950 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002951 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002952 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002953 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002954 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002955 getTriple().getOS() == llvm::Triple::NaCl ||
2956 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2957 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002958
2959 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002960 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002961 CC1Args.push_back("-fuse-init-array");
2962}
2963
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002964/// Mips Toolchain
2965MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2966 const llvm::Triple &Triple,
2967 const ArgList &Args)
2968 : Linux(D, Triple, Args) {
2969 // Select the correct multilib according to the given arguments.
2970 DetectedMultilibs Result;
2971 findMIPSMultilibs(D, Triple, "", Args, Result);
2972 Multilibs = Result.Multilibs;
2973 SelectedMultilib = Result.SelectedMultilib;
2974
2975 // Find out the library suffix based on the ABI.
2976 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2977 getFilePaths().clear();
2978 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2979
2980 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002981 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002982}
2983
2984void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2985 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2986 if (DriverArgs.hasArg(options::OPT_nostdinc))
2987 return;
2988
2989 const Driver &D = getDriver();
2990
2991 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2992 SmallString<128> P(D.ResourceDir);
2993 llvm::sys::path::append(P, "include");
2994 addSystemInclude(DriverArgs, CC1Args, P);
2995 }
2996
2997 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2998 return;
2999
3000 const auto &Callback = Multilibs.includeDirsCallback();
3001 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00003002 for (const auto &Path : Callback(SelectedMultilib))
3003 addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
3004 D.getInstalledDir() + Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00003005 }
3006}
3007
3008Tool *MipsLLVMToolChain::buildLinker() const {
3009 return new tools::gnutools::Linker(*this);
3010}
3011
3012std::string MipsLLVMToolChain::computeSysRoot() const {
3013 if (!getDriver().SysRoot.empty())
3014 return getDriver().SysRoot + SelectedMultilib.osSuffix();
3015
3016 const std::string InstalledDir(getDriver().getInstalledDir());
3017 std::string SysRootPath =
3018 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
3019 if (llvm::sys::fs::exists(SysRootPath))
3020 return SysRootPath;
3021
3022 return std::string();
3023}
3024
3025ToolChain::CXXStdlibType
3026MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
3027 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
3028 if (A) {
3029 StringRef Value = A->getValue();
3030 if (Value != "libc++")
3031 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
3032 << A->getAsString(Args);
3033 }
3034
3035 return ToolChain::CST_Libcxx;
3036}
3037
Richard Smith2680bc92016-10-29 17:28:48 +00003038std::string MipsLLVMToolChain::findLibCxxIncludePath() const {
3039 if (const auto &Callback = Multilibs.includeDirsCallback()) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00003040 for (std::string Path : Callback(SelectedMultilib)) {
3041 Path = getDriver().getInstalledDir() + Path + "/c++/v1";
3042 if (llvm::sys::fs::exists(Path)) {
Richard Smith2680bc92016-10-29 17:28:48 +00003043 return Path;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00003044 }
3045 }
3046 }
Richard Smith2680bc92016-10-29 17:28:48 +00003047 return "";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00003048}
3049
3050void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3051 ArgStringList &CmdArgs) const {
3052 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
3053 "Only -lc++ (aka libxx) is suported in this toolchain.");
3054
3055 CmdArgs.push_back("-lc++");
3056 CmdArgs.push_back("-lc++abi");
3057 CmdArgs.push_back("-lunwind");
3058}
3059
Vedant Kumar5fb00e42016-07-27 23:01:55 +00003060std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
3061 StringRef Component,
3062 bool Shared) const {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00003063 SmallString<128> Path(getDriver().ResourceDir);
3064 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
3065 getOS());
3066 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00003067 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00003068 return Path.str();
3069}
3070
Tony Linthicum76329bf2011-12-12 21:14:55 +00003071/// Hexagon Toolchain
3072
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003073std::string HexagonToolChain::getHexagonTargetDir(
3074 const std::string &InstalledDir,
3075 const SmallVectorImpl<std::string> &PrefixDirs) const {
3076 std::string InstallRelDir;
3077 const Driver &D = getDriver();
3078
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003079 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003080 for (auto &I : PrefixDirs)
3081 if (D.getVFS().exists(I))
3082 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00003083
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003084 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003085 return InstallRelDir;
3086
Krzysztof Parzyszek50fd6152016-10-17 15:30:10 +00003087 return InstalledDir;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003088}
3089
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003090Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
3091 const ArgList &Args) {
3092 StringRef Gn = "";
3093 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
3094 options::OPT_msmall_data_threshold_EQ)) {
3095 Gn = A->getValue();
3096 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
3097 options::OPT_fPIC)) {
3098 Gn = "0";
3099 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00003100
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003101 unsigned G;
3102 if (!Gn.getAsInteger(10, G))
3103 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00003104
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003105 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00003106}
3107
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003108void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
3109 ToolChain::path_list &LibPaths) const {
3110 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00003111
3112 //----------------------------------------------------------------------------
3113 // -L Args
3114 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003115 for (Arg *A : Args.filtered(options::OPT_L))
3116 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003117 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00003118
3119 //----------------------------------------------------------------------------
3120 // Other standard paths
3121 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003122 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00003123 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
3124 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00003125
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003126 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
3127 D.PrefixDirs);
3128 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
3129 RootDirs.push_back(TargetDir);
3130
3131 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
3132 // Assume G0 with -shared.
3133 bool HasG0 = Args.hasArg(options::OPT_shared);
3134 if (auto G = getSmallDataThreshold(Args))
3135 HasG0 = G.getValue() == 0;
3136
3137 const std::string CpuVer = GetTargetCPUVersion(Args).str();
3138 for (auto &Dir : RootDirs) {
3139 std::string LibDir = Dir + "/hexagon/lib";
3140 std::string LibDirCpu = LibDir + '/' + CpuVer;
3141 if (HasG0) {
3142 if (HasPIC)
3143 LibPaths.push_back(LibDirCpu + "/G0/pic");
3144 LibPaths.push_back(LibDirCpu + "/G0");
3145 }
3146 LibPaths.push_back(LibDirCpu);
3147 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00003148 }
Matthew Curtise689b052012-12-06 15:46:07 +00003149}
3150
Douglas Katzman54366072015-07-27 16:53:08 +00003151HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003152 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003153 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003154 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
3155 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003156
3157 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
3158 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003159 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003160 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003161 getProgramPaths().push_back(BinDir);
3162
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003163 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00003164
3165 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
3166 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
3167 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003168 LibPaths.clear();
3169 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003170}
3171
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00003172HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00003173
Douglas Katzman54366072015-07-27 16:53:08 +00003174Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003175 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003176}
3177
Douglas Katzman54366072015-07-27 16:53:08 +00003178Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003179 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00003180}
3181
Douglas Katzman54366072015-07-27 16:53:08 +00003182void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3183 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003184 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3185 DriverArgs.hasArg(options::OPT_nostdlibinc))
3186 return;
3187
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003188 const Driver &D = getDriver();
3189 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
3190 D.PrefixDirs);
3191 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00003192}
3193
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003194
Richard Smith2680bc92016-10-29 17:28:48 +00003195void HexagonToolChain::addLibStdCxxIncludePaths(
3196 const llvm::opt::ArgList &DriverArgs,
3197 llvm::opt::ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003198 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003199 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
Richard Smith2680bc92016-10-29 17:28:48 +00003200 addLibStdCXXIncludePaths(TargetDir, "/hexagon/include/c++", "", "", "", "",
3201 DriverArgs, CC1Args);
Chandler Carruth76a943b2012-11-19 03:52:03 +00003202}
Matthew Curtisf10a5952012-12-06 14:16:43 +00003203
Matthew Curtise689b052012-12-06 15:46:07 +00003204ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00003205HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00003206 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
3207 if (!A)
3208 return ToolChain::CST_Libstdcxx;
3209
3210 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003211 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003212 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00003213
3214 return ToolChain::CST_Libstdcxx;
3215}
3216
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003217//
3218// Returns the default CPU for Hexagon. This is the default compilation target
3219// if no Hexagon processor is selected at the command-line.
3220//
3221const StringRef HexagonToolChain::GetDefaultCPU() {
3222 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00003223}
3224
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003225const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
3226 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00003227 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
3228 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00003229
3230 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
3231 if (CPU.startswith("hexagon"))
3232 return CPU.substr(sizeof("hexagon") - 1);
3233 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00003234}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00003235// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00003236
Tom Stellard8fa33092015-07-18 01:49:05 +00003237/// AMDGPU Toolchain
3238AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
3239 const ArgList &Args)
3240 : Generic_ELF(D, Triple, Args) { }
3241
3242Tool *AMDGPUToolChain::buildLinker() const {
3243 return new tools::amdgpu::Linker(*this);
3244}
3245// End AMDGPU
3246
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003247/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00003248NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
3249 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003250 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003251
3252 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
3253 // default paths, and must instead only use the paths provided
3254 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003255 path_list &file_paths = getFilePaths();
3256 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003257
3258 file_paths.clear();
3259 prog_paths.clear();
3260
3261 // Path for library files (libc.a, ...)
3262 std::string FilePath(getDriver().Dir + "/../");
3263
3264 // Path for tools (clang, ld, etc..)
3265 std::string ProgPath(getDriver().Dir + "/../");
3266
3267 // Path for toolchain libraries (libgcc.a, ...)
3268 std::string ToolPath(getDriver().ResourceDir + "/lib/");
3269
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003270 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00003271 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003272 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00003273 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003274 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3275 file_paths.push_back(ToolPath + "i686-nacl");
3276 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003277 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003278 file_paths.push_back(FilePath + "x86_64-nacl/lib");
3279 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
3280 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
3281 file_paths.push_back(ToolPath + "x86_64-nacl");
3282 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003283 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003284 file_paths.push_back(FilePath + "arm-nacl/lib");
3285 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
3286 prog_paths.push_back(ProgPath + "arm-nacl/bin");
3287 file_paths.push_back(ToolPath + "arm-nacl");
3288 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00003289 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003290 file_paths.push_back(FilePath + "mipsel-nacl/lib");
3291 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
3292 prog_paths.push_back(ProgPath + "bin");
3293 file_paths.push_back(ToolPath + "mipsel-nacl");
3294 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003295 default:
3296 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003297 }
3298
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003299 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
3300}
3301
Douglas Katzman54366072015-07-27 16:53:08 +00003302void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3303 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003304 const Driver &D = getDriver();
3305 if (DriverArgs.hasArg(options::OPT_nostdinc))
3306 return;
3307
3308 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
3309 SmallString<128> P(D.ResourceDir);
3310 llvm::sys::path::append(P, "include");
3311 addSystemInclude(DriverArgs, CC1Args, P.str());
3312 }
3313
3314 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3315 return;
3316
3317 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003318 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00003319 case llvm::Triple::x86:
3320 // x86 is special because multilib style uses x86_64-nacl/include for libc
3321 // headers but the SDK wants i686-nacl/usr/include. The other architectures
3322 // have the same substring.
3323 llvm::sys::path::append(P, "i686-nacl/usr/include");
3324 addSystemInclude(DriverArgs, CC1Args, P.str());
3325 llvm::sys::path::remove_filename(P);
3326 llvm::sys::path::remove_filename(P);
3327 llvm::sys::path::remove_filename(P);
3328 llvm::sys::path::append(P, "x86_64-nacl/include");
3329 addSystemInclude(DriverArgs, CC1Args, P.str());
3330 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003331 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003332 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003333 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003334 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003335 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003336 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003337 case llvm::Triple::mipsel:
3338 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
3339 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003340 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003341 return;
3342 }
3343
3344 addSystemInclude(DriverArgs, CC1Args, P.str());
3345 llvm::sys::path::remove_filename(P);
3346 llvm::sys::path::remove_filename(P);
3347 llvm::sys::path::append(P, "include");
3348 addSystemInclude(DriverArgs, CC1Args, P.str());
3349}
3350
Douglas Katzman54366072015-07-27 16:53:08 +00003351void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3352 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003353 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
3354 // if the value is libc++, and emits an error for other values.
3355 GetCXXStdlibType(Args);
3356 CmdArgs.push_back("-lc++");
3357}
3358
Richard Smith2680bc92016-10-29 17:28:48 +00003359std::string NaClToolChain::findLibCxxIncludePath() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003360 const Driver &D = getDriver();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003361
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003362 SmallString<128> P(D.Dir + "/../");
3363 switch (getTriple().getArch()) {
3364 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003365 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
Richard Smith2680bc92016-10-29 17:28:48 +00003366 return P.str();
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003367 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003368 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
Richard Smith2680bc92016-10-29 17:28:48 +00003369 return P.str();
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003370 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003371 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
Richard Smith2680bc92016-10-29 17:28:48 +00003372 return P.str();
Petar Jovanovic26a4a402015-07-08 13:07:31 +00003373 case llvm::Triple::mipsel:
3374 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
Richard Smith2680bc92016-10-29 17:28:48 +00003375 return P.str();
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00003376 default:
Richard Smith2680bc92016-10-29 17:28:48 +00003377 return "";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003378 }
3379}
3380
Douglas Katzman54366072015-07-27 16:53:08 +00003381ToolChain::CXXStdlibType
3382NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003383 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3384 StringRef Value = A->getValue();
3385 if (Value == "libc++")
3386 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003387 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003388 }
3389
3390 return ToolChain::CST_Libcxx;
3391}
3392
Douglas Katzman54366072015-07-27 16:53:08 +00003393std::string
3394NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
3395 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003396 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
3397 if (TheTriple.getArch() == llvm::Triple::arm &&
3398 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
3399 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
3400 return TheTriple.getTriple();
3401}
3402
Douglas Katzman54366072015-07-27 16:53:08 +00003403Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003404 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003405}
3406
Douglas Katzman54366072015-07-27 16:53:08 +00003407Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003408 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00003409 return new tools::nacltools::AssemblerARM(*this);
3410 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00003411}
3412// End NaCl
3413
Chris Lattner09797542010-03-04 21:07:38 +00003414/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
3415/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
3416/// Currently does not support anything else but compilation.
3417
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003418TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00003419 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003420 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00003421 // Path mangling to find libexec
3422 std::string Path(getDriver().Dir);
3423
3424 Path += "/../libexec";
3425 getProgramPaths().push_back(Path);
3426}
3427
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00003428TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00003429
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003430bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00003431
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003432bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003433
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003434bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003435
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003436bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00003437
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003438// CloudABI - CloudABI tool chain which can call ld(1) directly.
3439
3440CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
3441 const ArgList &Args)
3442 : Generic_ELF(D, Triple, Args) {
3443 SmallString<128> P(getDriver().Dir);
3444 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
3445 getFilePaths().push_back(P.str());
3446}
3447
Richard Smith2680bc92016-10-29 17:28:48 +00003448std::string CloudABI::findLibCxxIncludePath() const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003449 SmallString<128> P(getDriver().Dir);
3450 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
Richard Smith2680bc92016-10-29 17:28:48 +00003451 return P.str();
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003452}
3453
3454void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
3455 ArgStringList &CmdArgs) const {
3456 CmdArgs.push_back("-lc++");
3457 CmdArgs.push_back("-lc++abi");
3458 CmdArgs.push_back("-lunwind");
3459}
3460
Douglas Katzman95354292015-06-23 20:42:09 +00003461Tool *CloudABI::buildLinker() const {
3462 return new tools::cloudabi::Linker(*this);
3463}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003464
Ed Schouten610adae2016-08-11 20:03:22 +00003465bool CloudABI::isPIEDefault() const {
3466 // Only enable PIE on architectures that support PC-relative
3467 // addressing. PC-relative addressing is required, as the process
3468 // startup code must be able to relocate itself.
3469 switch (getTriple().getArch()) {
3470 case llvm::Triple::aarch64:
3471 case llvm::Triple::x86_64:
3472 return true;
3473 default:
3474 return false;
3475 }
3476}
3477
Ed Schouten51bfbe72016-02-17 18:56:20 +00003478SanitizerMask CloudABI::getSupportedSanitizers() const {
3479 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3480 Res |= SanitizerKind::SafeStack;
3481 return Res;
3482}
3483
Ed Schoutenfc79d2c2016-03-29 21:13:53 +00003484SanitizerMask CloudABI::getDefaultSanitizers() const {
3485 return SanitizerKind::SafeStack;
3486}
3487
Reid Kleckner330fb172016-05-11 16:19:05 +00003488/// Haiku - Haiku tool chain which can call as(1) and ld(1) directly.
3489
3490Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
3491 : Generic_ELF(D, Triple, Args) {
3492
3493}
3494
Richard Smith2680bc92016-10-29 17:28:48 +00003495std::string Haiku::findLibCxxIncludePath() const {
3496 return getDriver().SysRoot + "/system/develop/headers/c++/v1";
3497}
Reid Kleckner330fb172016-05-11 16:19:05 +00003498
Richard Smith2680bc92016-10-29 17:28:48 +00003499void Haiku::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
3500 llvm::opt::ArgStringList &CC1Args) const {
3501 addLibStdCXXIncludePaths(getDriver().SysRoot, "/system/develop/headers/c++",
3502 getTriple().str(), "", "", "", DriverArgs, CC1Args);
Reid Kleckner330fb172016-05-11 16:19:05 +00003503}
3504
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003505/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3506
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003507OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3508 const ArgList &Args)
3509 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003510 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003511 getFilePaths().push_back("/usr/lib");
3512}
3513
Rafael Espindola7cf32212013-03-20 03:05:54 +00003514Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003515 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003516}
3517
Douglas Katzman95354292015-06-23 20:42:09 +00003518Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003519
Eli Friedman9fa28852012-08-08 23:57:20 +00003520/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3521
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003522Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3523 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003524 getFilePaths().push_back(getDriver().Dir + "/../lib");
3525 getFilePaths().push_back("/usr/lib");
3526}
3527
Rafael Espindola7cf32212013-03-20 03:05:54 +00003528Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003529 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003530}
3531
Douglas Katzman95354292015-06-23 20:42:09 +00003532Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003533
Jonas Hahnfeldaae83742016-02-12 07:48:37 +00003534ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
Richard Smith51af5192014-05-01 23:24:24 +00003535 return ToolChain::CST_Libcxx;
3536}
3537
Richard Smith2680bc92016-10-29 17:28:48 +00003538void Bitrig::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
3539 llvm::opt::ArgStringList &CC1Args) const {
3540 std::string Triple = getTriple().str();
3541 if (StringRef(Triple).startswith("amd64"))
3542 Triple = "x86_64" + Triple.substr(5);
3543 addLibStdCXXIncludePaths(getDriver().SysRoot, "/usr/include/c++/stdc++",
3544 Triple, "", "", "", DriverArgs, CC1Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00003545}
3546
3547void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3548 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003549 switch (GetCXXStdlibType(Args)) {
3550 case ToolChain::CST_Libcxx:
3551 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003552 CmdArgs.push_back("-lc++abi");
3553 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003554 break;
3555 case ToolChain::CST_Libstdcxx:
3556 CmdArgs.push_back("-lstdc++");
3557 break;
3558 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003559}
3560
Daniel Dunbare24297c2009-03-30 21:06:03 +00003561/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3562
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003563FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3564 const ArgList &Args)
3565 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003566
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003567 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3568 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003569 if ((Triple.getArch() == llvm::Triple::x86 ||
3570 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003571 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003572 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3573 else
3574 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003575}
3576
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003577ToolChain::CXXStdlibType FreeBSD::GetDefaultCXXStdlibType() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003578 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003579 return ToolChain::CST_Libcxx;
3580 return ToolChain::CST_Libstdcxx;
3581}
3582
Richard Smith2680bc92016-10-29 17:28:48 +00003583void FreeBSD::addLibStdCxxIncludePaths(
3584 const llvm::opt::ArgList &DriverArgs,
3585 llvm::opt::ArgStringList &CC1Args) const {
3586 addLibStdCXXIncludePaths(getDriver().SysRoot, "/usr/include/c++/4.2", "", "",
3587 "", "", DriverArgs, CC1Args);
David Chisnall867ccd82013-11-09 15:10:56 +00003588}
3589
Dimitry Andric60907392016-02-14 16:08:20 +00003590void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3591 ArgStringList &CmdArgs) const {
3592 CXXStdlibType Type = GetCXXStdlibType(Args);
3593 bool Profiling = Args.hasArg(options::OPT_pg);
3594
3595 switch (Type) {
3596 case ToolChain::CST_Libcxx:
3597 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3598 break;
3599
3600 case ToolChain::CST_Libstdcxx:
3601 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3602 break;
3603 }
3604}
3605
Rafael Espindola7cf32212013-03-20 03:05:54 +00003606Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003607 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003608}
3609
Douglas Katzman95354292015-06-23 20:42:09 +00003610Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003611
Tim Northovere931f9f2015-10-30 16:30:41 +00003612bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003613 // FreeBSD uses SjLj exceptions on ARM oabi.
3614 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003615 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003616 case llvm::Triple::GNUEABI:
3617 case llvm::Triple::EABI:
3618 return false;
3619
3620 default:
3621 return (getTriple().getArch() == llvm::Triple::arm ||
3622 getTriple().getArch() == llvm::Triple::thumb);
3623 }
3624}
3625
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003626bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003627
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003628bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003629
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003630SanitizerMask FreeBSD::getSupportedSanitizers() const {
3631 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3632 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3633 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3634 getTriple().getArch() == llvm::Triple::mips64el;
3635 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3636 Res |= SanitizerKind::Address;
3637 Res |= SanitizerKind::Vptr;
3638 if (IsX86_64 || IsMIPS64) {
3639 Res |= SanitizerKind::Leak;
3640 Res |= SanitizerKind::Thread;
3641 }
3642 if (IsX86 || IsX86_64) {
3643 Res |= SanitizerKind::SafeStack;
3644 }
3645 return Res;
3646}
3647
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003648/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3649
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003650NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3651 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003652 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003653 // When targeting a 32-bit platform, try the special directory used on
3654 // 64-bit hosts, and only fall back to the main library directory if that
3655 // doesn't work.
3656 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3657 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003658 switch (Triple.getArch()) {
3659 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003660 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003661 break;
3662 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003663 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003664 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003665 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003666 switch (Triple.getEnvironment()) {
3667 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003668 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003669 getFilePaths().push_back("=/usr/lib/eabi");
3670 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003671 case llvm::Triple::EABIHF:
3672 case llvm::Triple::GNUEABIHF:
3673 getFilePaths().push_back("=/usr/lib/eabihf");
3674 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003675 default:
3676 getFilePaths().push_back("=/usr/lib/oabi");
3677 break;
3678 }
3679 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003680 case llvm::Triple::mips64:
3681 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003682 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003683 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003684 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003685 getFilePaths().push_back("=/usr/lib/64");
3686 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003687 case llvm::Triple::ppc:
3688 getFilePaths().push_back("=/usr/lib/powerpc");
3689 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003690 case llvm::Triple::sparc:
3691 getFilePaths().push_back("=/usr/lib/sparc");
3692 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003693 default:
3694 break;
3695 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003696
3697 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003698 }
3699}
3700
Rafael Espindola7cf32212013-03-20 03:05:54 +00003701Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003702 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003703}
3704
Douglas Katzman95354292015-06-23 20:42:09 +00003705Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003706
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003707ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const {
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003708 unsigned Major, Minor, Micro;
3709 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003710 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003711 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003712 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003713 case llvm::Triple::arm:
3714 case llvm::Triple::armeb:
3715 case llvm::Triple::thumb:
3716 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003717 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003718 case llvm::Triple::ppc64:
3719 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003720 case llvm::Triple::sparc:
3721 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003722 case llvm::Triple::x86:
3723 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003724 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003725 default:
3726 break;
3727 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003728 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003729 return ToolChain::CST_Libstdcxx;
3730}
3731
Richard Smith2680bc92016-10-29 17:28:48 +00003732std::string NetBSD::findLibCxxIncludePath() const {
3733 return getDriver().SysRoot + "/usr/include/c++/";
3734}
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003735
Richard Smith2680bc92016-10-29 17:28:48 +00003736void NetBSD::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
3737 llvm::opt::ArgStringList &CC1Args) const {
3738 addLibStdCXXIncludePaths(getDriver().SysRoot, "/usr/include/g++", "", "", "",
3739 "", DriverArgs, CC1Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003740}
3741
Chris Lattner3e2ee142010-07-07 16:01:42 +00003742/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3743
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003744Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3745 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003746 getFilePaths().push_back(getDriver().Dir + "/../lib");
3747 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003748}
3749
Rafael Espindola7cf32212013-03-20 03:05:54 +00003750Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003751 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003752}
3753
Douglas Katzman95354292015-06-23 20:42:09 +00003754Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003755
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003756static void addPathIfExists(const Driver &D, const Twine &Path,
3757 ToolChain::path_list &Paths) {
3758 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003759 Paths.push_back(Path.str());
3760}
3761
David Chisnallf571cde2012-02-15 13:39:01 +00003762/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3763
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003764Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003765 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003766 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003767
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003768 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003769
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003770 path_list &Paths = getFilePaths();
3771 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003772 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003773
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003774 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003775 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003776 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003777
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003778 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003779
3780 std::string LibPath = "/usr/lib/";
3781 switch (Triple.getArch()) {
3782 case llvm::Triple::x86:
3783 case llvm::Triple::sparc:
3784 break;
3785 case llvm::Triple::x86_64:
3786 LibPath += "amd64/";
3787 break;
3788 case llvm::Triple::sparcv9:
3789 LibPath += "sparcv9/";
3790 break;
3791 default:
3792 llvm_unreachable("Unsupported architecture");
3793 }
3794
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003795 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003796}
3797
Rafael Espindola7cf32212013-03-20 03:05:54 +00003798Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003799 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003800}
3801
Douglas Katzman95354292015-06-23 20:42:09 +00003802Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003803
Rafael Espindolad5117262015-09-09 13:36:00 +00003804void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3805 ArgStringList &CC1Args) const {
3806 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3807 DriverArgs.hasArg(options::OPT_nostdincxx))
3808 return;
3809
3810 // Include the support directory for things like xlocale and fudged system
3811 // headers.
Richard Smith2680bc92016-10-29 17:28:48 +00003812 // FIXME: This is a weird mix of libc++ and libstdc++. We should also be
3813 // checking the value of -stdlib= here and adding the includes for libc++
3814 // rather than libstdc++ if it's requested.
Rafael Espindolad5117262015-09-09 13:36:00 +00003815 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3816
3817 if (GCCInstallation.isValid()) {
3818 GCCVersion Version = GCCInstallation.getVersion();
3819 addSystemInclude(DriverArgs, CC1Args,
3820 getDriver().SysRoot + "/usr/gcc/" +
3821 Version.MajorStr + "." +
3822 Version.MinorStr +
3823 "/include/c++/" + Version.Text);
3824 addSystemInclude(DriverArgs, CC1Args,
3825 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3826 "." + Version.MinorStr + "/include/c++/" +
3827 Version.Text + "/" +
3828 GCCInstallation.getTriple().str());
3829 }
3830}
3831
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003832/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003833
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003834enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003835 // NB: Releases of a particular Linux distro should be kept together
3836 // in this enum, because some tests are done by integer comparison against
3837 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003838 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003839 DebianLenny,
3840 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003841 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003842 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003843 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003844 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003845 RHEL5,
3846 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003847 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003848 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003849 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003850 UbuntuHardy,
3851 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003852 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003853 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003854 UbuntuLucid,
3855 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003856 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003857 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003858 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003859 UbuntuQuantal,
3860 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003861 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003862 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003863 UbuntuUtopic,
3864 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003865 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003866 UbuntuXenial,
Sylvestre Ledrud3078e72016-07-19 14:00:57 +00003867 UbuntuYakkety,
Sylvestre Ledruf0174512016-11-12 09:26:30 +00003868 UbuntuZesty,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003869 UnknownDistro
3870};
3871
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003872static bool IsRedhat(enum Distro Distro) {
Rafael Espindola52fe8962016-05-09 13:13:50 +00003873 return Distro == Fedora || (Distro >= RHEL5 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003874}
3875
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003876static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003877
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003878static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003879 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003880}
3881
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003882static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledruf0174512016-11-12 09:26:30 +00003883 return Distro >= UbuntuHardy && Distro <= UbuntuZesty;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003884}
3885
Michal Gorny16f37c32016-10-20 20:45:40 +00003886static Distro DetectDistro(vfs::FileSystem &VFS) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003887 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
Michal Gorny16f37c32016-10-20 20:45:40 +00003888 VFS.getBufferForFile("/etc/lsb-release");
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003889 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003890 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003891 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003892 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003893 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003894 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003895 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3896 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3897 .Case("hardy", UbuntuHardy)
3898 .Case("intrepid", UbuntuIntrepid)
3899 .Case("jaunty", UbuntuJaunty)
3900 .Case("karmic", UbuntuKarmic)
3901 .Case("lucid", UbuntuLucid)
3902 .Case("maverick", UbuntuMaverick)
3903 .Case("natty", UbuntuNatty)
3904 .Case("oneiric", UbuntuOneiric)
3905 .Case("precise", UbuntuPrecise)
3906 .Case("quantal", UbuntuQuantal)
3907 .Case("raring", UbuntuRaring)
3908 .Case("saucy", UbuntuSaucy)
3909 .Case("trusty", UbuntuTrusty)
3910 .Case("utopic", UbuntuUtopic)
3911 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003912 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003913 .Case("xenial", UbuntuXenial)
Sylvestre Ledrud3078e72016-07-19 14:00:57 +00003914 .Case("yakkety", UbuntuYakkety)
Sylvestre Ledruf0174512016-11-12 09:26:30 +00003915 .Case("zesty", UbuntuZesty)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003916 .Default(UnknownDistro);
Rafael Espindola52fe8962016-05-09 13:13:50 +00003917 if (Version != UnknownDistro)
3918 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003919 }
3920
Michal Gorny16f37c32016-10-20 20:45:40 +00003921 File = VFS.getBufferForFile("/etc/redhat-release");
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003922 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003923 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003924 if (Data.startswith("Fedora release"))
3925 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003926 if (Data.startswith("Red Hat Enterprise Linux") ||
Rafael Espindola52fe8962016-05-09 13:13:50 +00003927 Data.startswith("CentOS") ||
3928 Data.startswith("Scientific Linux")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003929 if (Data.find("release 7") != StringRef::npos)
3930 return RHEL7;
3931 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003932 return RHEL6;
3933 else if (Data.find("release 5") != StringRef::npos)
3934 return RHEL5;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003935 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003936 return UnknownDistro;
3937 }
3938
Michal Gorny16f37c32016-10-20 20:45:40 +00003939 File = VFS.getBufferForFile("/etc/debian_version");
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003940 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003941 StringRef Data = File.get()->getBuffer();
Michal Gorny0a2cd962016-10-20 20:13:35 +00003942 // Contents: < major.minor > or < codename/sid >
3943 int MajorVersion;
3944 if (!Data.split('.').first.getAsInteger(10, MajorVersion)) {
3945 switch (MajorVersion) {
3946 case 5:
3947 return DebianLenny;
3948 case 6:
3949 return DebianSqueeze;
3950 case 7:
3951 return DebianWheezy;
3952 case 8:
3953 return DebianJessie;
3954 case 9:
3955 return DebianStretch;
3956 default:
3957 return UnknownDistro;
3958 }
3959 }
3960 return llvm::StringSwitch<Distro>(Data.split("\n").first)
3961 .Case("squeeze/sid", DebianSqueeze)
3962 .Case("wheezy/sid", DebianWheezy)
3963 .Case("jessie/sid", DebianJessie)
3964 .Case("stretch/sid", DebianStretch)
3965 .Default(UnknownDistro);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003966 }
3967
Michal Gorny91cc4a62016-10-25 15:33:32 +00003968 File = VFS.getBufferForFile("/etc/SuSE-release");
3969 if (File) {
3970 StringRef Data = File.get()->getBuffer();
3971 SmallVector<StringRef, 8> Lines;
3972 Data.split(Lines, "\n");
3973 for (const StringRef& Line : Lines) {
3974 if (!Line.trim().startswith("VERSION"))
3975 continue;
3976 std::pair<StringRef, StringRef> SplitLine = Line.split('=');
3977 int Version;
3978 // OpenSUSE/SLES 10 and older are not supported and not compatible
3979 // with our rules, so just treat them as UnknownDistro.
3980 if (!SplitLine.second.trim().getAsInteger(10, Version) &&
3981 Version > 10)
3982 return OpenSUSE;
3983 return UnknownDistro;
3984 }
3985 return UnknownDistro;
3986 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003987
Michal Gorny16f37c32016-10-20 20:45:40 +00003988 if (VFS.exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003989 return Exherbo;
3990
Michal Gorny16f37c32016-10-20 20:45:40 +00003991 if (VFS.exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003992 return ArchLinux;
3993
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003994 return UnknownDistro;
3995}
3996
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003997/// \brief Get our best guess at the multiarch triple for a target.
3998///
3999/// Debian-based systems are starting to use a multiarch setup where they use
4000/// a target-triple directory in the library and header search paths.
4001/// Unfortunately, this triple does not align with the vanilla target triple,
4002/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004003static std::string getMultiarchTriple(const Driver &D,
4004 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004005 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00004006 llvm::Triple::EnvironmentType TargetEnvironment =
4007 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004008
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004009 // For most architectures, just use whatever we have rather than trying to be
4010 // clever.
4011 switch (TargetTriple.getArch()) {
4012 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004013 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004014
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004015 // We use the existence of '/lib/<triple>' as a directory to detect some
4016 // common linux triples that don't quite match the Clang triple for both
4017 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
4018 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00004019 case llvm::Triple::arm:
4020 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004021 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004022 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004023 return "arm-linux-gnueabihf";
4024 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004025 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004026 return "arm-linux-gnueabi";
4027 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004028 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004029 case llvm::Triple::armeb:
4030 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004031 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004032 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004033 return "armeb-linux-gnueabihf";
4034 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004035 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004036 return "armeb-linux-gnueabi";
4037 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004038 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004039 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004040 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004041 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004042 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004043 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00004044 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004045 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004046 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004047 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004048 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00004049 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004050 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00004051 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004052 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00004053 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004054 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00004055 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004056 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00004057 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004058 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00004059 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004060 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00004061 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004062 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00004063 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004064 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004065 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004066 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004067 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004068 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004069 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004070 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004071 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004072 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004073 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004074 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004075 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004076 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004077 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004078 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00004079 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004080 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004081 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004082 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004083 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004084 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00004085 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004086 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00004087 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004088 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00004089 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004090 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00004091 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004092 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00004093 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004094 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00004095 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004096 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00004097 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004098 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004099 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004100 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004101 return "s390x-linux-gnu";
4102 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004103 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00004104 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00004105}
4106
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004107static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00004108 if (isMipsArch(Triple.getArch())) {
Simon Atanasyan603018a2016-07-19 07:09:48 +00004109 if (Triple.isAndroid()) {
4110 StringRef CPUName;
4111 StringRef ABIName;
4112 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
4113 if (CPUName == "mips32r6")
4114 return "libr6";
4115 if (CPUName == "mips32r2")
4116 return "libr2";
4117 }
Chandler Carruthda797042013-10-29 10:27:30 +00004118 // lib32 directory has a special meaning on MIPS targets.
4119 // It contains N32 ABI binaries. Use this folder if produce
4120 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004121 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00004122 return "lib32";
4123 return Triple.isArch32Bit() ? "lib" : "lib64";
4124 }
Simon Atanasyand4413882012-09-14 11:27:24 +00004125
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004126 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00004127 // using that variant while targeting other architectures causes problems
4128 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004129 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00004130 // them when we know we may need it.
4131 //
4132 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004133 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00004134 // GCCInstallationDetector, but that is a more significant refactoring.
4135 if (Triple.getArch() == llvm::Triple::x86 ||
4136 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00004137 return "lib32";
4138
Zinovy Nis1db95732014-07-10 15:27:19 +00004139 if (Triple.getArch() == llvm::Triple::x86_64 &&
4140 Triple.getEnvironment() == llvm::Triple::GNUX32)
4141 return "libx32";
4142
Simon Atanasyand4413882012-09-14 11:27:24 +00004143 return Triple.isArch32Bit() ? "lib" : "lib64";
4144}
4145
Simon Atanasyan2834a222016-05-22 18:18:07 +00004146static void addMultilibsFilePaths(const Driver &D, const MultilibSet &Multilibs,
4147 const Multilib &Multilib,
4148 StringRef InstallPath,
4149 ToolChain::path_list &Paths) {
4150 if (const auto &PathsCallback = Multilibs.filePathsCallback())
4151 for (const auto &Path : PathsCallback(Multilib))
4152 addPathIfExists(D, InstallPath + Path, Paths);
4153}
4154
Rafael Espindola1af7c212012-02-19 01:38:32 +00004155Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004156 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004157 GCCInstallation.init(Triple, Args);
4158 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004159 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00004160 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00004161 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004162
Rafael Espindola10a63c22013-07-03 14:14:00 +00004163 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00004164 // least) put various tools in a triple-prefixed directory off of the parent
4165 // of the GCC installation. We use the GCC triple here to ensure that we end
4166 // up with tools that support the same amount of cross compiling as the
4167 // detected GCC installation. For example, if we find a GCC installation
4168 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
4169 // used to target i386.
4170 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00004171 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00004172 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004173 GCCInstallation.getTriple().str() + "/bin")
4174 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00004175
Michal Gorny16f37c32016-10-20 20:45:40 +00004176 Distro Distro = DetectDistro(D.getVFS());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004177
Rafael Espindola10a63c22013-07-03 14:14:00 +00004178 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00004179 ExtraOpts.push_back("-z");
4180 ExtraOpts.push_back("relro");
4181 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004182
Douglas Gregord9bb1522011-03-06 19:11:49 +00004183 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004184 ExtraOpts.push_back("-X");
4185
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004186 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004187 const bool IsMips = isMipsArch(Arch);
4188
4189 if (IsMips && !SysRoot.empty())
4190 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00004191
Chandler Carruth0b842912011-12-09 04:45:18 +00004192 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
4193 // and the MIPS ABI require .dynsym to be sorted in different ways.
4194 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
4195 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00004196 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004197 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00004198 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00004199 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00004200 ExtraOpts.push_back("--hash-style=gnu");
4201
Rafael Espindola10a63c22013-07-03 14:14:00 +00004202 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00004203 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
4204 ExtraOpts.push_back("--hash-style=both");
4205 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004206
Rafael Espindola52fe8962016-05-09 13:13:50 +00004207 if (IsRedhat(Distro) && Distro != RHEL5 && Distro != RHEL6)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004208 ExtraOpts.push_back("--no-add-needed");
4209
Rafael Espindola5ed89d42016-06-03 17:26:16 +00004210#ifdef ENABLE_LINKER_BUILD_ID
4211 ExtraOpts.push_back("--build-id");
4212#endif
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004213
Rafael Espindola10a63c22013-07-03 14:14:00 +00004214 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00004215 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00004216
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004217 // The selection of paths to try here is designed to match the patterns which
4218 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
4219 // This was determined by running GCC in a fake filesystem, creating all
4220 // possible permutations of these directories, and seeing which ones it added
4221 // to the link paths.
4222 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00004223
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004224 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004225 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004226
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004227 // Add the multilib suffixed paths where they are available.
4228 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00004229 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00004230 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004231 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan2834a222016-05-22 18:18:07 +00004232 const MultilibSet &Multilibs = GCCInstallation.getMultilibs();
4233
4234 // Add toolchain / multilib specific file paths.
4235 addMultilibsFilePaths(D, Multilibs, Multilib,
4236 GCCInstallation.getInstallPath(), Paths);
Simon Atanasyan53fefd12012-10-03 17:46:38 +00004237
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004238 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00004239 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004240 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004241 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004242
4243 // GCC cross compiling toolchains will install target libraries which ship
4244 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
4245 // any part of the GCC installation in
4246 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
4247 // debatable, but is the reality today. We need to search this tree even
4248 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00004249 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004250 // installation that is *not* within the system root to ensure two things:
4251 //
4252 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00004253 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004254 // appropriate rpath.
4255 // 2) There must not be libraries installed into
4256 // <prefix>/<triple>/<libdir> unless they should be preferred over
4257 // those within the system root.
4258 //
4259 // Note that this matches the GCC behavior. See the below comment for where
4260 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004261 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
4262 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004263 Paths);
4264
Chandler Carruth69a125b2012-04-06 16:32:06 +00004265 // If the GCC installation we found is inside of the sysroot, we want to
4266 // prefer libraries installed in the parent prefix of the GCC installation.
4267 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00004268 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004269 // This usually happens when there is an external cross compiler on the
4270 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004271 // the cross. Note that GCC does include some of these directories in some
4272 // configurations but this seems somewhere between questionable and simply
4273 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00004274 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004275 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
4276 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00004277 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004278 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004279
4280 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004281 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00004282 // those searched.
4283 // FIXME: It's not clear whether we should use the driver's installed
4284 // directory ('Dir' below) or the ResourceDir.
4285 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004286 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
4287 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004288 }
4289
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004290 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
4291 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
4292 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
4293 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004294
Chandler Carruthb427c562013-06-22 11:35:51 +00004295 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00004296 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00004297 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004298 addPathIfExists(D,
4299 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004300 "/../../" + OSLibDir,
4301 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00004302
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004303 // Add the 'other' biarch variant path
4304 Multilib BiarchSibling;
4305 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004306 addPathIfExists(D, GCCInstallation.getInstallPath() +
4307 BiarchSibling.gccSuffix(),
4308 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004309 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00004310
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004311 // See comments above on the multilib variant for details of why this is
4312 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004313 const std::string &LibPath = GCCInstallation.getParentLibPath();
4314 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
4315 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004316 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
4317 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004318 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00004319
4320 // See comments above on the multilib variant for details of why this is
4321 // only included from within the sysroot.
4322 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004323 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00004324 }
Chandler Carruth902efc62014-01-21 22:49:05 +00004325
4326 // Similar to the logic for GCC above, if we are currently running Clang
4327 // inside of the requested system root, add its parent library path to those
4328 // searched.
4329 // FIXME: It's not clear whether we should use the driver's installed
4330 // directory ('Dir' below) or the ResourceDir.
4331 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004332 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00004333
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004334 addPathIfExists(D, SysRoot + "/lib", Paths);
4335 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00004336}
4337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004338bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00004339
Douglas Katzman95354292015-06-23 20:42:09 +00004340Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00004341
4342Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004343 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00004344}
4345
Simon Atanasyana0d89572013-10-05 14:37:55 +00004346std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004347 if (!getDriver().SysRoot.empty())
4348 return getDriver().SysRoot;
4349
4350 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
4351 return std::string();
4352
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004353 // Standalone MIPS toolchains use different names for sysroot folder
4354 // and put it into different places. Here we try to check some known
4355 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004356
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004357 const StringRef InstallDir = GCCInstallation.getInstallPath();
4358 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004359 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004360
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004361 std::string Path =
4362 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
4363 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004364
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004365 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004366 return Path;
4367
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004368 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004369
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004370 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00004371 return Path;
4372
4373 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004374}
4375
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004376std::string Linux::getDynamicLinker(const ArgList &Args) const {
4377 const llvm::Triple::ArchType Arch = getArch();
4378 const llvm::Triple &Triple = getTriple();
4379
Michal Gorny16f37c32016-10-20 20:45:40 +00004380 const enum Distro Distro = DetectDistro(getDriver().getVFS());
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004381
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004382 if (Triple.isAndroid())
4383 return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker";
Diana Picus86db9e72016-08-08 08:27:36 +00004384
4385 if (Triple.isMusl()) {
Rafael Espindola0fa66802016-06-24 21:35:06 +00004386 std::string ArchName;
Diana Picus86db9e72016-08-08 08:27:36 +00004387 bool IsArm = false;
4388
Rafael Espindola0fa66802016-06-24 21:35:06 +00004389 switch (Arch) {
Diana Picus86db9e72016-08-08 08:27:36 +00004390 case llvm::Triple::arm:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004391 case llvm::Triple::thumb:
4392 ArchName = "arm";
Diana Picus86db9e72016-08-08 08:27:36 +00004393 IsArm = true;
Rafael Espindola0fa66802016-06-24 21:35:06 +00004394 break;
Diana Picus86db9e72016-08-08 08:27:36 +00004395 case llvm::Triple::armeb:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004396 case llvm::Triple::thumbeb:
4397 ArchName = "armeb";
Diana Picus86db9e72016-08-08 08:27:36 +00004398 IsArm = true;
Rafael Espindola0fa66802016-06-24 21:35:06 +00004399 break;
4400 default:
4401 ArchName = Triple.getArchName().str();
4402 }
Diana Picus86db9e72016-08-08 08:27:36 +00004403 if (IsArm &&
4404 (Triple.getEnvironment() == llvm::Triple::MuslEABIHF ||
4405 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard))
Rafael Espindola0fa66802016-06-24 21:35:06 +00004406 ArchName += "hf";
4407
4408 return "/lib/ld-musl-" + ArchName + ".so.1";
4409 }
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004410
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004411 std::string LibDir;
4412 std::string Loader;
4413
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004414 switch (Arch) {
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004415 default:
4416 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004417
4418 case llvm::Triple::aarch64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004419 LibDir = "lib";
4420 Loader = "ld-linux-aarch64.so.1";
4421 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004422 case llvm::Triple::aarch64_be:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004423 LibDir = "lib";
4424 Loader = "ld-linux-aarch64_be.so.1";
4425 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004426 case llvm::Triple::arm:
4427 case llvm::Triple::thumb:
4428 case llvm::Triple::armeb:
4429 case llvm::Triple::thumbeb: {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004430 const bool HF =
4431 Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
4432 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004433
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004434 LibDir = "lib";
4435 Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3";
4436 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004437 }
4438 case llvm::Triple::mips:
4439 case llvm::Triple::mipsel:
4440 case llvm::Triple::mips64:
4441 case llvm::Triple::mips64el: {
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004442 bool LE = (Triple.getArch() == llvm::Triple::mipsel) ||
4443 (Triple.getArch() == llvm::Triple::mips64el);
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004444 bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple);
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004445
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004446 LibDir = "lib" + tools::mips::getMipsABILibSuffix(Args, Triple);
4447
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004448 if (tools::mips::isUCLibc(Args))
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004449 Loader = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004450 else if (!Triple.hasEnvironment() &&
4451 Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies)
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004452 Loader = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004453 else
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004454 Loader = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004455
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004456 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004457 }
4458 case llvm::Triple::ppc:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004459 LibDir = "lib";
4460 Loader = "ld.so.1";
4461 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004462 case llvm::Triple::ppc64:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004463 LibDir = "lib64";
4464 Loader =
4465 (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "ld64.so.2" : "ld64.so.1";
4466 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004467 case llvm::Triple::ppc64le:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004468 LibDir = "lib64";
4469 Loader =
4470 (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2";
4471 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004472 case llvm::Triple::sparc:
4473 case llvm::Triple::sparcel:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004474 LibDir = "lib";
4475 Loader = "ld-linux.so.2";
4476 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004477 case llvm::Triple::sparcv9:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004478 LibDir = "lib64";
4479 Loader = "ld-linux.so.2";
4480 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004481 case llvm::Triple::systemz:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004482 LibDir = "lib";
4483 Loader = "ld64.so.1";
4484 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004485 case llvm::Triple::x86:
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004486 LibDir = "lib";
4487 Loader = "ld-linux.so.2";
4488 break;
4489 case llvm::Triple::x86_64: {
4490 bool X32 = Triple.getEnvironment() == llvm::Triple::GNUX32;
4491
4492 LibDir = X32 ? "libx32" : "lib64";
4493 Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2";
4494 break;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004495 }
Saleem Abdulrasool6f8442b2016-05-23 02:17:28 +00004496 }
4497
4498 if (Distro == Exherbo && (Triple.getVendor() == llvm::Triple::UnknownVendor ||
4499 Triple.getVendor() == llvm::Triple::PC))
4500 return "/usr/" + Triple.str() + "/lib/" + Loader;
4501 return "/" + LibDir + "/" + Loader;
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00004502}
4503
Chandler Carrutha796f532011-11-05 20:17:13 +00004504void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4505 ArgStringList &CC1Args) const {
4506 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00004507 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00004508
4509 if (DriverArgs.hasArg(options::OPT_nostdinc))
4510 return;
4511
4512 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004513 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004514
4515 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00004516 SmallString<128> P(D.ResourceDir);
4517 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00004518 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00004519 }
4520
4521 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
4522 return;
4523
4524 // Check for configure-time C include directories.
4525 StringRef CIncludeDirs(C_INCLUDE_DIRS);
4526 if (CIncludeDirs != "") {
4527 SmallVector<StringRef, 5> dirs;
4528 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004529 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00004530 StringRef Prefix =
4531 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004532 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00004533 }
4534 return;
4535 }
4536
4537 // Lacking those, try to detect the correct set of system includes for the
4538 // target triple.
4539
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004540 // Add include directories specific to the selected multilib set and multilib.
4541 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00004542 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004543 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00004544 for (const auto &Path : Callback(GCCInstallation.getMultilib()))
4545 addExternCSystemIncludeIfExists(
4546 DriverArgs, CC1Args, GCCInstallation.getInstallPath() + Path);
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004547 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004548 }
4549
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004550 // Implement generic Debian multiarch support.
4551 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004552 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004553
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004554 // FIXME: These are older forms of multiarch. It's not clear that they're
4555 // in use in any released version of Debian, so we should consider
4556 // removing them.
4557 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004558 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004559 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004560
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004561 // FIXME: These are older forms of multiarch. It's not clear that they're
4562 // in use in any released version of Debian, so we should consider
4563 // removing them.
4564 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
4565 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00004566 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004567 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004568 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004569 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004570 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004571 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004572 const StringRef ARMEBMultiarchIncludeDirs[] = {
4573 "/usr/include/armeb-linux-gnueabi"};
4574 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
4575 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004576 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00004577 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004578 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004579 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004580 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004581 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004582 "/usr/include/mips64el-linux-gnu",
4583 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004584 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004585 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004586 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004587 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004588 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004589 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004590 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004591 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004592 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004593 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004594 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
4595 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004596 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004597 switch (getTriple().getArch()) {
4598 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004599 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004600 break;
4601 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004602 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004603 break;
4604 case llvm::Triple::aarch64:
4605 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00004606 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004607 break;
4608 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004609 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004610 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4611 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
4612 else
4613 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004614 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004615 case llvm::Triple::armeb:
4616 case llvm::Triple::thumbeb:
4617 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4618 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
4619 else
4620 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
4621 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004622 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00004623 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004624 break;
4625 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00004626 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004627 break;
4628 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004629 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004630 break;
4631 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004632 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004633 break;
4634 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004635 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004636 break;
4637 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004638 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004639 break;
4640 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004641 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004642 break;
4643 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004644 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004645 break;
4646 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004647 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004648 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004649 case llvm::Triple::systemz:
4650 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4651 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004652 default:
4653 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004654 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004655 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004656 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004657 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004658 break;
4659 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004660 }
4661
4662 if (getTriple().getOS() == llvm::Triple::RTEMS)
4663 return;
4664
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004665 // Add an include of '/include' directly. This isn't provided by default by
4666 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4667 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004668 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004669
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004670 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004671}
4672
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004673static std::string DetectLibcxxIncludePath(StringRef base) {
4674 std::error_code EC;
4675 int MaxVersion = 0;
4676 std::string MaxVersionString = "";
4677 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4678 LI = LI.increment(EC)) {
4679 StringRef VersionText = llvm::sys::path::filename(LI->path());
4680 int Version;
4681 if (VersionText[0] == 'v' &&
4682 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4683 if (Version > MaxVersion) {
4684 MaxVersion = Version;
4685 MaxVersionString = VersionText;
4686 }
4687 }
4688 }
4689 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4690}
4691
Richard Smith2680bc92016-10-29 17:28:48 +00004692std::string Linux::findLibCxxIncludePath() const {
4693 const std::string LibCXXIncludePathCandidates[] = {
4694 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
4695 // If this is a development, non-installed, clang, libcxx will
4696 // not be found at ../include/c++ but it likely to be found at
4697 // one of the following two locations:
4698 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/local/include/c++"),
4699 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++") };
4700 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
4701 if (IncludePath.empty() || !getVFS().exists(IncludePath))
4702 continue;
4703 // Use the first candidate that exists.
4704 return IncludePath;
Chandler Carruthf4701732011-11-07 09:01:17 +00004705 }
Richard Smith2680bc92016-10-29 17:28:48 +00004706 return "";
4707}
Chandler Carruthf4701732011-11-07 09:01:17 +00004708
Richard Smith2680bc92016-10-29 17:28:48 +00004709void Linux::addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
4710 llvm::opt::ArgStringList &CC1Args) const {
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004711 // We need a detected GCC installation on Linux to provide libstdc++'s
Richard Smith2680bc92016-10-29 17:28:48 +00004712 // headers.
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004713 if (!GCCInstallation.isValid())
4714 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004715
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004716 // By default, look for the C++ headers in an include directory adjacent to
4717 // the lib directory of the GCC installation. Note that this is expect to be
4718 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4719 StringRef LibDir = GCCInstallation.getParentLibPath();
4720 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004721 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004722 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004723 const std::string GCCMultiarchTriple = getMultiarchTriple(
4724 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004725 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004726 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004727 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004728
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004729 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004730 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004731 "/c++/" + Version.Text, TripleStr,
4732 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004733 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004734 return;
4735
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004736 // Otherwise, fall back on a bunch of options which don't use multiarch
4737 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004738 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004739 // Gentoo is weird and places its headers inside the GCC install,
4740 // so if the first attempt to find the headers fails, try these patterns.
Chandler Carruth81296fb2016-05-08 07:59:56 +00004741 InstallDir.str() + "/include/g++-v" + Version.Text,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004742 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4743 Version.MinorStr,
4744 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4745 // Android standalone toolchain has C++ headers in yet another place.
4746 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4747 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4748 // without a subdirectory corresponding to the gcc version.
4749 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004750 };
4751
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004752 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004753 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4754 /*GCCMultiarchTriple*/ "",
4755 /*TargetMultiarchTriple*/ "",
4756 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004757 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004758 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004759}
4760
Artem Belevichfa11ab52015-11-17 22:28:46 +00004761void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4762 ArgStringList &CC1Args) const {
Justin Lebar49ec1462016-10-11 17:36:03 +00004763 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
4764 // Add cuda_wrappers/* to our system include path. This lets us wrap
4765 // standard library headers.
4766 SmallString<128> P(getDriver().ResourceDir);
4767 llvm::sys::path::append(P, "include");
4768 llvm::sys::path::append(P, "cuda_wrappers");
4769 addSystemInclude(DriverArgs, CC1Args, P);
4770 }
4771
Artem Belevichfa11ab52015-11-17 22:28:46 +00004772 if (DriverArgs.hasArg(options::OPT_nocudainc))
4773 return;
4774
Justin Lebar423019d2016-04-16 00:11:11 +00004775 if (!CudaInstallation.isValid()) {
4776 getDriver().Diag(diag::err_drv_no_cuda_installation);
4777 return;
Artem Belevich86017332015-11-17 22:28:55 +00004778 }
Justin Lebar423019d2016-04-16 00:11:11 +00004779
4780 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
4781 CC1Args.push_back("-include");
4782 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevichfa11ab52015-11-17 22:28:46 +00004783}
4784
Andrey Turetskiy4798eb62016-06-16 10:36:09 +00004785void Linux::AddIAMCUIncludeArgs(const ArgList &DriverArgs,
4786 ArgStringList &CC1Args) const {
4787 if (GCCInstallation.isValid()) {
4788 CC1Args.push_back("-isystem");
4789 CC1Args.push_back(DriverArgs.MakeArgString(
4790 GCCInstallation.getParentLibPath() + "/../" +
4791 GCCInstallation.getTriple().str() + "/include"));
4792 }
4793}
4794
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004795bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004796
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004797SanitizerMask Linux::getSupportedSanitizers() const {
4798 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4799 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4800 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4801 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004802 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4803 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004804 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4805 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004806 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4807 Res |= SanitizerKind::Address;
4808 Res |= SanitizerKind::KernelAddress;
4809 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004810 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004811 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004812 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004813 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004814 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004815 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004816 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004817 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004818 Res |= SanitizerKind::Memory;
Sagar Thakurc9113e42016-09-07 12:23:15 +00004819 if (IsX86_64 || IsMIPS64)
Derek Bruening256c2e12016-04-21 21:32:04 +00004820 Res |= SanitizerKind::Efficiency;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004821 if (IsX86 || IsX86_64) {
4822 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004823 }
4824 return Res;
4825}
4826
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004827void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
Xinliang David Li170cd102015-10-27 05:15:35 +00004828 llvm::opt::ArgStringList &CmdArgs) const {
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004829 if (!needsProfileRT(Args)) return;
Xinliang David Li170cd102015-10-27 05:15:35 +00004830
4831 // Add linker option -u__llvm_runtime_variable to cause runtime
4832 // initialization module to be linked in.
4833 if (!Args.hasArg(options::OPT_coverage))
4834 CmdArgs.push_back(Args.MakeArgString(
4835 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
Vedant Kumar5fb00e42016-07-27 23:01:55 +00004836 ToolChain::addProfileRTLibs(Args, CmdArgs);
Xinliang David Li170cd102015-10-27 05:15:35 +00004837}
4838
Petr Hosek62e1d232016-10-06 06:08:09 +00004839/// Fuchsia - Fuchsia tool chain which can call as(1) and ld(1) directly.
4840
4841Fuchsia::Fuchsia(const Driver &D, const llvm::Triple &Triple,
4842 const ArgList &Args)
4843 : Generic_ELF(D, Triple, Args) {
4844
4845 getFilePaths().push_back(D.SysRoot + "/lib");
4846 getFilePaths().push_back(D.ResourceDir + "/lib/fuchsia");
4847
4848 // Use LLD by default.
4849 DefaultLinker = "lld";
4850}
4851
4852Tool *Fuchsia::buildAssembler() const {
4853 return new tools::gnutools::Assembler(*this);
4854}
4855
4856Tool *Fuchsia::buildLinker() const {
4857 return new tools::fuchsia::Linker(*this);
4858}
4859
4860ToolChain::RuntimeLibType Fuchsia::GetRuntimeLibType(
4861 const ArgList &Args) const {
4862 if (Arg *A = Args.getLastArg(options::OPT_rtlib_EQ)) {
4863 StringRef Value = A->getValue();
4864 if (Value != "compiler-rt")
4865 getDriver().Diag(diag::err_drv_invalid_rtlib_name)
4866 << A->getAsString(Args);
4867 }
4868
4869 return ToolChain::RLT_CompilerRT;
4870}
4871
4872ToolChain::CXXStdlibType
4873Fuchsia::GetCXXStdlibType(const ArgList &Args) const {
4874 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
4875 StringRef Value = A->getValue();
4876 if (Value != "libc++")
4877 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
4878 << A->getAsString(Args);
4879 }
4880
4881 return ToolChain::CST_Libcxx;
4882}
4883
4884void Fuchsia::addClangTargetOptions(const ArgList &DriverArgs,
4885 ArgStringList &CC1Args) const {
4886 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4887 options::OPT_fno_use_init_array, true))
4888 CC1Args.push_back("-fuse-init-array");
4889}
4890
4891void Fuchsia::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4892 ArgStringList &CC1Args) const {
4893 const Driver &D = getDriver();
4894
4895 if (DriverArgs.hasArg(options::OPT_nostdinc))
4896 return;
4897
4898 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
4899 SmallString<128> P(D.ResourceDir);
4900 llvm::sys::path::append(P, "include");
4901 addSystemInclude(DriverArgs, CC1Args, P);
4902 }
4903
4904 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
4905 return;
4906
4907 // Check for configure-time C include directories.
4908 StringRef CIncludeDirs(C_INCLUDE_DIRS);
4909 if (CIncludeDirs != "") {
4910 SmallVector<StringRef, 5> dirs;
4911 CIncludeDirs.split(dirs, ":");
4912 for (StringRef dir : dirs) {
4913 StringRef Prefix =
4914 llvm::sys::path::is_absolute(dir) ? StringRef(D.SysRoot) : "";
4915 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
4916 }
4917 return;
4918 }
4919
4920 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
4921}
4922
Richard Smith2680bc92016-10-29 17:28:48 +00004923std::string Fuchsia::findLibCxxIncludePath() const {
4924 return getDriver().SysRoot + "/include/c++/v1";
Petr Hosek62e1d232016-10-06 06:08:09 +00004925}
4926
4927void Fuchsia::AddCXXStdlibLibArgs(const ArgList &Args,
4928 ArgStringList &CmdArgs) const {
4929 (void) GetCXXStdlibType(Args);
4930 CmdArgs.push_back("-lc++");
4931 CmdArgs.push_back("-lc++abi");
4932 CmdArgs.push_back("-lunwind");
4933}
4934
Daniel Dunbarcc912342009-05-02 18:28:39 +00004935/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4936
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004937DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4938 const ArgList &Args)
4939 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004940
4941 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004942 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004943 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004944 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004945
Daniel Dunbar083edf72009-12-21 18:54:17 +00004946 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004947 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004948 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004949}
4950
Rafael Espindola7cf32212013-03-20 03:05:54 +00004951Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004952 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004953}
4954
4955Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004956 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004957}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004958
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004959/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4960/// which isn't properly a linker but nonetheless performs the step of stitching
4961/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004962
4963CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4964 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004965 : Linux(D, Triple, Args) {
4966 if (CudaInstallation.isValid())
4967 getProgramPaths().push_back(CudaInstallation.getBinPath());
4968}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004969
4970void
4971CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4972 llvm::opt::ArgStringList &CC1Args) const {
4973 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4974 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004975
Justin Lebard3a44f62016-04-05 18:26:20 +00004976 if (DriverArgs.hasFlag(options::OPT_fcuda_flush_denormals_to_zero,
4977 options::OPT_fno_cuda_flush_denormals_to_zero, false))
4978 CC1Args.push_back("-fcuda-flush-denormals-to-zero");
4979
Justin Lebar91f6f072016-05-23 20:19:56 +00004980 if (DriverArgs.hasFlag(options::OPT_fcuda_approx_transcendentals,
4981 options::OPT_fno_cuda_approx_transcendentals, false))
4982 CC1Args.push_back("-fcuda-approx-transcendentals");
4983
Artem Belevich34f481a2015-11-17 22:28:50 +00004984 if (DriverArgs.hasArg(options::OPT_nocudalib))
4985 return;
4986
Artem Belevich02a1e972016-08-02 23:12:51 +00004987 StringRef GpuArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
4988 assert(!GpuArch.empty() && "Must have an explicit GPU arch.");
4989 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(GpuArch);
Artem Belevich34f481a2015-11-17 22:28:50 +00004990
Artem Belevich02a1e972016-08-02 23:12:51 +00004991 if (LibDeviceFile.empty()) {
4992 getDriver().Diag(diag::err_drv_no_cuda_libdevice) << GpuArch;
4993 return;
Artem Belevich34f481a2015-11-17 22:28:50 +00004994 }
Artem Belevich02a1e972016-08-02 23:12:51 +00004995
4996 CC1Args.push_back("-mlink-cuda-bitcode");
4997 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4998
4999 // Libdevice in CUDA-7.0 requires PTX version that's more recent
5000 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
5001 // came with CUDA-7.0.
5002 CC1Args.push_back("-target-feature");
5003 CC1Args.push_back("+ptx42");
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005004}
5005
Justin Lebarc43ad9e2016-07-07 18:17:52 +00005006void CudaToolChain::AddCudaIncludeArgs(const ArgList &DriverArgs,
5007 ArgStringList &CC1Args) const {
5008 // Check our CUDA version if we're going to include the CUDA headers.
5009 if (!DriverArgs.hasArg(options::OPT_nocudainc) &&
Justin Lebarf3997712016-07-07 18:24:28 +00005010 !DriverArgs.hasArg(options::OPT_no_cuda_version_check)) {
Justin Lebarc43ad9e2016-07-07 18:17:52 +00005011 StringRef Arch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
5012 assert(!Arch.empty() && "Must have an explicit GPU arch.");
5013 CudaInstallation.CheckCudaVersionSupportsArch(StringToCudaArch(Arch));
5014 }
5015 Linux::AddCudaIncludeArgs(DriverArgs, CC1Args);
5016}
5017
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005018llvm::opt::DerivedArgList *
5019CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
Samuel Antao31fef982016-10-27 17:39:44 +00005020 StringRef BoundArch, Action::OffloadKind) const {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005021 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
5022 const OptTable &Opts = getDriver().getOpts();
5023
5024 for (Arg *A : Args) {
5025 if (A->getOption().matches(options::OPT_Xarch__)) {
5026 // Skip this argument unless the architecture matches BoundArch
Mehdi Aminic50b1a22016-10-07 21:27:26 +00005027 if (BoundArch.empty() || A->getValue(0) != BoundArch)
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005028 continue;
5029
5030 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
5031 unsigned Prev = Index;
5032 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
5033
5034 // If the argument parsing failed or more than one argument was
5035 // consumed, the -Xarch_ argument's parameter tried to consume
5036 // extra arguments. Emit an error and ignore.
5037 //
5038 // We also want to disallow any options which would alter the
5039 // driver behavior; that isn't going to work in our model. We
5040 // use isDriverOption() as an approximation, although things
5041 // like -O4 are going to slip through.
5042 if (!XarchArg || Index > Prev + 1) {
5043 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
5044 << A->getAsString(Args);
5045 continue;
5046 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
5047 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
5048 << A->getAsString(Args);
5049 continue;
5050 }
5051 XarchArg->setBaseArg(A);
5052 A = XarchArg.release();
5053 DAL->AddSynthesizedArg(A);
5054 }
5055 DAL->append(A);
5056 }
5057
Mehdi Aminic50b1a22016-10-07 21:27:26 +00005058 if (!BoundArch.empty()) {
Justin Lebar4db224e2016-06-15 23:46:11 +00005059 DAL->eraseArg(options::OPT_march_EQ);
Justin Lebar21e5d4f2016-01-14 21:41:27 +00005060 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Justin Lebar4db224e2016-06-15 23:46:11 +00005061 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005062 return DAL;
5063}
5064
Justin Lebar21e5d4f2016-01-14 21:41:27 +00005065Tool *CudaToolChain::buildAssembler() const {
5066 return new tools::NVPTX::Assembler(*this);
5067}
5068
5069Tool *CudaToolChain::buildLinker() const {
5070 return new tools::NVPTX::Linker(*this);
5071}
5072
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005073/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00005074XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
5075 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005076 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005077 // ProgramPaths are found via 'PATH' environment variable.
5078}
5079
Douglas Katzman54366072015-07-27 16:53:08 +00005080Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00005081 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005082}
5083
Douglas Katzman54366072015-07-27 16:53:08 +00005084Tool *XCoreToolChain::buildLinker() const {
5085 return new tools::XCore::Linker(*this);
5086}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005087
Douglas Katzman54366072015-07-27 16:53:08 +00005088bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005089
Douglas Katzman54366072015-07-27 16:53:08 +00005090bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005091
Douglas Katzman54366072015-07-27 16:53:08 +00005092bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005093
Douglas Katzman54366072015-07-27 16:53:08 +00005094bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005095
Douglas Katzman54366072015-07-27 16:53:08 +00005096bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005097
Douglas Katzman54366072015-07-27 16:53:08 +00005098void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
5099 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005100 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
5101 DriverArgs.hasArg(options::OPT_nostdlibinc))
5102 return;
5103 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
5104 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005105 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005106 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
5107 ArrayRef<StringRef> DirVec(Dirs);
5108 addSystemIncludes(DriverArgs, CC1Args, DirVec);
5109 }
5110}
5111
Douglas Katzman54366072015-07-27 16:53:08 +00005112void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
5113 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005114 CC1Args.push_back("-nostdsysteminc");
5115}
5116
Douglas Katzman54366072015-07-27 16:53:08 +00005117void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
5118 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005119 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00005120 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
5121 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005122 return;
5123 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
5124 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005125 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005126 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
5127 ArrayRef<StringRef> DirVec(Dirs);
5128 addSystemIncludes(DriverArgs, CC1Args, DirVec);
5129 }
5130}
5131
Douglas Katzman54366072015-07-27 16:53:08 +00005132void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
5133 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00005134 // We don't output any lib args. This is handled by xcc.
5135}
Douglas Katzman84a75642015-06-19 14:55:19 +00005136
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005137MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
5138 const ArgList &Args)
Douglas Katzman5eddc232016-05-09 19:09:59 +00005139 : Generic_ELF(D, Triple, Args) {
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005140 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
5141 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
5142 // This won't work to find gcc. Instead we give the installation detector an
5143 // extra triple, which is preferable to further hacks of the logic that at
5144 // present is based solely on getArch(). In particular, it would be wrong to
5145 // choose the myriad installation when targeting a non-myriad sparc install.
5146 switch (Triple.getArch()) {
5147 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00005148 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
5149 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005150 case llvm::Triple::sparc:
5151 case llvm::Triple::sparcel:
5152 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00005153 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005154 }
Douglas Katzman674a3122015-11-18 16:24:46 +00005155
5156 if (GCCInstallation.isValid()) {
Douglas Katzman674a3122015-11-18 16:24:46 +00005157 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
5158 // These files are tied to a particular version of gcc.
5159 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
Douglas Katzman674a3122015-11-18 16:24:46 +00005160 addPathIfExists(D, CompilerSupportDir, getFilePaths());
5161 }
Douglas Katzman1e04e462016-10-25 23:02:30 +00005162 // libstd++ and libc++ must both be found in this one place.
5163 addPathIfExists(D, D.Dir + "/../sparc-myriad-elf/lib", getFilePaths());
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005164}
5165
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00005166MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005167
Douglas Katzmanb1278f32015-09-17 21:20:16 +00005168void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
5169 ArgStringList &CC1Args) const {
5170 if (!DriverArgs.hasArg(options::OPT_nostdinc))
5171 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
5172}
5173
Richard Smith2680bc92016-10-29 17:28:48 +00005174std::string MyriadToolChain::findLibCxxIncludePath() const {
5175 std::string Path(getDriver().getInstalledDir());
5176 return Path + "/../include/c++/v1";
5177}
James Y Knighta6c9ee72015-10-16 18:46:26 +00005178
Richard Smith2680bc92016-10-29 17:28:48 +00005179void MyriadToolChain::addLibStdCxxIncludePaths(
5180 const llvm::opt::ArgList &DriverArgs,
5181 llvm::opt::ArgStringList &CC1Args) const {
5182 StringRef LibDir = GCCInstallation.getParentLibPath();
5183 const GCCVersion &Version = GCCInstallation.getVersion();
5184 StringRef TripleStr = GCCInstallation.getTriple().str();
5185 const Multilib &Multilib = GCCInstallation.getMultilib();
5186 addLibStdCXXIncludePaths(
5187 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
5188 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00005189}
5190
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005191// MyriadToolChain handles several triples:
5192// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
5193Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
5194 // The inherited method works fine if not targeting the SHAVE.
5195 if (!isShaveCompilation(getTriple()))
5196 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00005197 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00005198 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00005199 case Action::CompileJobClass:
5200 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00005201 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00005202 return Compiler.get();
5203 case Action::AssembleJobClass:
5204 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00005205 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00005206 return Assembler.get();
5207 default:
5208 return ToolChain::getTool(JA.getKind());
5209 }
5210}
5211
Douglas Katzmand6e597c2015-09-17 19:56:40 +00005212Tool *MyriadToolChain::buildLinker() const {
5213 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00005214}
Dan Gohmanc2853072015-09-03 22:51:53 +00005215
Douglas Katzman3972f9e2016-09-09 18:20:49 +00005216SanitizerMask MyriadToolChain::getSupportedSanitizers() const {
5217 return SanitizerKind::Address;
5218}
5219
Dan Gohman52816862015-12-16 23:30:41 +00005220WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
5221 const llvm::opt::ArgList &Args)
5222 : ToolChain(D, Triple, Args) {
Dan Gohman57b62c52016-02-22 19:26:15 +00005223
5224 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
5225 getFilePaths().push_back(
5226 getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64"));
5227
Dan Gohman52816862015-12-16 23:30:41 +00005228 // Use LLD by default.
5229 DefaultLinker = "lld";
5230}
5231
Dan Gohmanc2853072015-09-03 22:51:53 +00005232bool WebAssembly::IsMathErrnoDefault() const { return false; }
5233
5234bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
5235
5236bool WebAssembly::UseObjCMixedDispatch() const { return true; }
5237
5238bool WebAssembly::isPICDefault() const { return false; }
5239
5240bool WebAssembly::isPIEDefault() const { return false; }
5241
5242bool WebAssembly::isPICDefaultForced() const { return false; }
5243
5244bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
5245
5246// TODO: Support Objective C stuff.
5247bool WebAssembly::SupportsObjCGC() const { return false; }
5248
5249bool WebAssembly::hasBlocksRuntime() const { return false; }
5250
5251// TODO: Support profiling.
5252bool WebAssembly::SupportsProfiling() const { return false; }
5253
Dan Gohman52816862015-12-16 23:30:41 +00005254bool WebAssembly::HasNativeLLVMSupport() const { return true; }
5255
Dan Gohmanc2853072015-09-03 22:51:53 +00005256void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
5257 ArgStringList &CC1Args) const {
5258 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
5259 options::OPT_fno_use_init_array, true))
5260 CC1Args.push_back("-fuse-init-array");
5261}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005262
Dan Gohman6ad8f612016-01-14 16:00:13 +00005263ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
5264 return ToolChain::RLT_CompilerRT;
5265}
5266
5267ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
5268 return ToolChain::CST_Libcxx;
5269}
5270
5271void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
5272 ArgStringList &CC1Args) const {
5273 if (!DriverArgs.hasArg(options::OPT_nostdinc))
5274 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
5275}
5276
Richard Smith2680bc92016-10-29 17:28:48 +00005277void WebAssembly::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
5278 ArgStringList &CC1Args) const {
Dan Gohman6ad8f612016-01-14 16:00:13 +00005279 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
5280 !DriverArgs.hasArg(options::OPT_nostdincxx))
5281 addSystemInclude(DriverArgs, CC1Args,
5282 getDriver().SysRoot + "/include/c++/v1");
5283}
5284
Dan Gohman52816862015-12-16 23:30:41 +00005285Tool *WebAssembly::buildLinker() const {
5286 return new tools::wasm::Linker(*this);
5287}
5288
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005289PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
5290 : Generic_ELF(D, Triple, Args) {
5291 if (Args.hasArg(options::OPT_static))
5292 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
5293
Paul Robinson9d613612016-05-16 17:22:25 +00005294 // Determine where to find the PS4 libraries. We use SCE_ORBIS_SDK_DIR
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005295 // if it exists; otherwise use the driver's installation path, which
5296 // should be <SDK_DIR>/host_tools/bin.
5297
5298 SmallString<512> PS4SDKDir;
Paul Robinson9d613612016-05-16 17:22:25 +00005299 if (const char *EnvValue = getenv("SCE_ORBIS_SDK_DIR")) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005300 if (!llvm::sys::fs::exists(EnvValue))
5301 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
5302 PS4SDKDir = EnvValue;
5303 } else {
5304 PS4SDKDir = getDriver().Dir;
5305 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00005306 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005307
Eric Christopherefef8ef2015-12-07 22:43:05 +00005308 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005309 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00005310 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00005311 // If -isysroot was passed, use that as the SDK base path.
5312 std::string PrefixDir;
5313 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5314 PrefixDir = A->getValue();
5315 if (!llvm::sys::fs::exists(PrefixDir))
5316 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
5317 } else
5318 PrefixDir = PS4SDKDir.str();
5319
5320 SmallString<512> PS4SDKIncludeDir(PrefixDir);
5321 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
5322 if (!Args.hasArg(options::OPT_nostdinc) &&
5323 !Args.hasArg(options::OPT_nostdlibinc) &&
5324 !Args.hasArg(options::OPT_isysroot) &&
5325 !Args.hasArg(options::OPT__sysroot_EQ) &&
5326 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
5327 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
5328 << "PS4 system headers" << PS4SDKIncludeDir;
5329 }
5330
5331 SmallString<512> PS4SDKLibDir(PS4SDKDir);
5332 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
5333 if (!Args.hasArg(options::OPT_nostdlib) &&
5334 !Args.hasArg(options::OPT_nodefaultlibs) &&
5335 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
5336 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
5337 !Args.hasArg(options::OPT_emit_ast) &&
5338 !llvm::sys::fs::exists(PS4SDKLibDir)) {
5339 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
5340 << "PS4 system libraries" << PS4SDKLibDir;
5341 return;
5342 }
5343 getFilePaths().push_back(PS4SDKLibDir.str());
5344}
5345
5346Tool *PS4CPU::buildAssembler() const {
5347 return new tools::PS4cpu::Assemble(*this);
5348}
5349
5350Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
5351
5352bool PS4CPU::isPICDefault() const { return true; }
5353
5354bool PS4CPU::HasNativeLLVMSupport() const { return true; }
5355
5356SanitizerMask PS4CPU::getSupportedSanitizers() const {
5357 SanitizerMask Res = ToolChain::getSupportedSanitizers();
5358 Res |= SanitizerKind::Address;
5359 Res |= SanitizerKind::Vptr;
5360 return Res;
5361}
David L Kreitzerd397ea42016-10-14 20:44:33 +00005362
5363Contiki::Contiki(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
5364 : Generic_ELF(D, Triple, Args) {}
5365
5366SanitizerMask Contiki::getSupportedSanitizers() const {
5367 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
5368 SanitizerMask Res = ToolChain::getSupportedSanitizers();
5369 if (IsX86)
5370 Res |= SanitizerKind::SafeStack;
5371 return Res;
5372}