blob: 2871249e89631f89631e47bf7a44b20f0131c849 [file] [log] [blame]
Hans Wennborgdcfba332015-10-06 23:40:43 +00001//===--- ToolChains.cpp - ToolChain Implementations -------------*- C++ -*-===//
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ToolChains.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "clang/Basic/ObjCRuntime.h"
12#include "clang/Basic/Version.h"
Benjamin Kramerd45b2052015-10-07 15:48:01 +000013#include "clang/Basic/VirtualFileSystem.h"
Alp Toker1d257e12014-06-04 03:28:55 +000014#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
Daniel Dunbar6232d342010-05-20 21:48:38 +000015#include "clang/Driver/Compilation.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000016#include "clang/Driver/Driver.h"
Daniel Dunbaraabb0b12009-03-25 06:12:34 +000017#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000018#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000019#include "clang/Driver/SanitizerArgs.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000020#include "llvm/ADT/STLExtras.h"
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +000021#include "llvm/ADT/SmallString.h"
Daniel Dunbar76ce7412009-03-23 16:15:50 +000022#include "llvm/ADT/StringExtras.h"
Bob Wilson997a97f2011-10-07 00:37:57 +000023#include "llvm/ADT/StringSwitch.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000024#include "llvm/Option/Arg.h"
25#include "llvm/Option/ArgList.h"
26#include "llvm/Option/OptTable.h"
27#include "llvm/Option/Option.h"
Xinliang David Li170cd102015-10-27 05:15:35 +000028#include "llvm/ProfileData/InstrProf.h"
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +000029#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000030#include "llvm/Support/FileSystem.h"
Rafael Espindolac8f008f2010-11-07 20:14:31 +000031#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000032#include "llvm/Support/Path.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000033#include "llvm/Support/Program.h"
Renato Golin33e1f822015-05-28 15:49:28 +000034#include "llvm/Support/TargetParser.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000035#include "llvm/Support/raw_ostream.h"
Daniel Dunbarb5023e92009-04-10 21:00:07 +000036#include <cstdlib> // ::getenv
Rafael Espindola8a8e5542014-06-12 17:19:42 +000037#include <system_error>
Daniel Dunbarb5023e92009-04-10 21:00:07 +000038
Daniel Dunbar59e5e882009-03-20 00:20:03 +000039using namespace clang::driver;
40using namespace clang::driver::toolchains;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000041using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000042using namespace llvm::opt;
Daniel Dunbar59e5e882009-03-20 00:20:03 +000043
Douglas Katzmana67e50c2015-06-26 15:47:46 +000044MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
45 : ToolChain(D, Triple, Args) {
Tim Northover15ff71d2014-05-22 13:12:14 +000046 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
47 getProgramPaths().push_back(getDriver().getInstalledDir());
48 if (getDriver().getInstalledDir() != getDriver().Dir)
49 getProgramPaths().push_back(getDriver().Dir);
Tim Northover157d9112014-01-16 08:48:16 +000050}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +000051
Tim Northover157d9112014-01-16 08:48:16 +000052/// Darwin - Darwin tool chain for i386 and x86_64.
Alexey Samsonov905c8022015-06-18 21:46:05 +000053Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
54 : MachO(D, Triple, Args), TargetInitialized(false) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +000055
Tim Northover157d9112014-01-16 08:48:16 +000056types::ID MachO::LookupTypeForExtension(const char *Ext) const {
Daniel Dunbarcc7df6c2010-08-02 05:43:56 +000057 types::ID Ty = types::lookupTypeForExtension(Ext);
58
59 // Darwin always preprocesses assembly files (unless -x is used explicitly).
60 if (Ty == types::TY_PP_Asm)
61 return types::TY_Asm;
62
63 return Ty;
64}
65
Douglas Katzmana67e50c2015-06-26 15:47:46 +000066bool MachO::HasNativeLLVMSupport() const { return true; }
Daniel Dunbar62123a12010-09-17 00:24:52 +000067
Jonas Hahnfeldaae83742016-02-12 07:48:37 +000068ToolChain::CXXStdlibType Darwin::GetDefaultCXXStdlibType() const {
69 // Default to use libc++ on OS X 10.9+ and iOS 7+.
70 if ((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
71 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) ||
72 isTargetWatchOSBased())
73 return ToolChain::CST_Libcxx;
74
75 return ToolChain::CST_Libstdcxx;
76}
77
John McCall24fc0de2011-07-06 00:26:06 +000078/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000079ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover6f3ff222015-10-30 16:30:27 +000080 if (isTargetWatchOSBased())
Tim Northover756447a2015-10-30 16:30:36 +000081 return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion);
Tim Northover9c7e0352013-12-12 11:55:52 +000082 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000083 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000084 if (isNonFragile)
85 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
86 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000087}
88
John McCall7959fee2011-09-09 20:41:01 +000089/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
90bool Darwin::hasBlocksRuntime() const {
Tim Northover6f3ff222015-10-30 16:30:27 +000091 if (isTargetWatchOSBased())
92 return true;
93 else if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000094 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000095 else {
Tim Northover157d9112014-01-16 08:48:16 +000096 assert(isTargetMacOS() && "unexpected darwin target");
97 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000098 }
John McCall7959fee2011-09-09 20:41:01 +000099}
100
Renato Golin33e1f822015-05-28 15:49:28 +0000101// This is just a MachO name translation routine and there's no
102// way to join this into ARMTargetParser without breaking all
103// other assumptions. Maybe MachO should consider standardising
104// their nomenclature.
105static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000106 return llvm::StringSwitch<const char *>(Arch)
107 .Case("armv6k", "armv6")
108 .Case("armv6m", "armv6m")
109 .Case("armv5tej", "armv5")
110 .Case("xscale", "xscale")
111 .Case("armv4t", "armv4t")
112 .Case("armv7", "armv7")
113 .Cases("armv7a", "armv7-a", "armv7")
114 .Cases("armv7r", "armv7-r", "armv7")
115 .Cases("armv7em", "armv7e-m", "armv7em")
116 .Cases("armv7k", "armv7-k", "armv7k")
117 .Cases("armv7m", "armv7-m", "armv7m")
118 .Cases("armv7s", "armv7-s", "armv7s")
119 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000120}
121
Renato Golin33e1f822015-05-28 15:49:28 +0000122static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000123 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000124 if (ArchKind == llvm::ARM::AK_INVALID)
125 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000126 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000127
128 // FIXME: Make sure this MachO triple mangling is really necessary.
129 // ARMv5* normalises to ARMv5.
130 if (Arch.startswith("armv5"))
131 Arch = Arch.substr(0, 5);
132 // ARMv6*, except ARMv6M, normalises to ARMv6.
133 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
134 Arch = Arch.substr(0, 5);
135 // ARMv7A normalises to ARMv7.
136 else if (Arch.endswith("v7a"))
137 Arch = Arch.substr(0, 5);
138 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000139}
140
Tim Northover9c7e0352013-12-12 11:55:52 +0000141static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000142 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000143 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000144 if (!A)
145 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000146
Tim Northover9c7e0352013-12-12 11:55:52 +0000147 return A->getOption().matches(options::OPT_msoft_float) ||
148 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
149 A->getValue() == StringRef("soft"));
150}
151
Tim Northover157d9112014-01-16 08:48:16 +0000152StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000153 switch (getTriple().getArch()) {
154 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000155 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000156
Tim Northover40956e62014-07-23 12:32:58 +0000157 case llvm::Triple::aarch64:
158 return "arm64";
159
Douglas Gregord9bb1522011-03-06 19:11:49 +0000160 case llvm::Triple::thumb:
Hans Wennborgdcfba332015-10-06 23:40:43 +0000161 case llvm::Triple::arm:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000162 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000163 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000164 return Arch;
165
166 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000167 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000168 return Arch;
169
170 return "arm";
171 }
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000172}
173
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000174Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000175
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000176MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000177
178std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000179 types::ID InputType) const {
Tim Northover157d9112014-01-16 08:48:16 +0000180 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
181
182 return Triple.getTriple();
183}
184
Chad Rosierd3a0f952011-09-20 20:44:06 +0000185std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
186 types::ID InputType) const {
187 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000188
189 // If the target isn't initialized (e.g., an unknown Darwin platform, return
190 // the default triple).
191 if (!isTargetInitialized())
192 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000193
Tim Northover157d9112014-01-16 08:48:16 +0000194 SmallString<16> Str;
Tim Northover6f3ff222015-10-30 16:30:27 +0000195 if (isTargetWatchOSBased())
196 Str += "watchos";
197 else if (isTargetTvOSBased())
198 Str += "tvos";
199 else if (isTargetIOSBased())
200 Str += "ios";
201 else
202 Str += "macosx";
Tim Northover157d9112014-01-16 08:48:16 +0000203 Str += getTargetVersion().getAsString();
204 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000205
206 return Triple.getTriple();
207}
208
David Blaikie68e081d2011-12-20 02:48:34 +0000209void Generic_ELF::anchor() {}
210
Tim Northover157d9112014-01-16 08:48:16 +0000211Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000212 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000213 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000214 if (!Lipo)
215 Lipo.reset(new tools::darwin::Lipo(*this));
216 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000217 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000218 if (!Dsymutil)
219 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
220 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000221 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000222 if (!VerifyDebug)
223 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
224 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000225 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000226 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000227 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000228}
229
Douglas Katzman95354292015-06-23 20:42:09 +0000230Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000231
Tim Northover157d9112014-01-16 08:48:16 +0000232Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000233 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000234}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000235
Douglas Katzman95354292015-06-23 20:42:09 +0000236DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000237 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000238 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000239
Tim Northover336f1892014-03-29 13:16:12 +0000240void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
Tim Northover6f3ff222015-10-30 16:30:27 +0000241 // For modern targets, promote certain warnings to errors.
242 if (isTargetWatchOSBased() || getTriple().isArch64Bit()) {
Tim Northover336f1892014-03-29 13:16:12 +0000243 // Always enable -Wdeprecated-objc-isa-usage and promote it
244 // to an error.
245 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
246 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
247
Tim Northover6f3ff222015-10-30 16:30:27 +0000248 // For iOS and watchOS, also error about implicit function declarations,
249 // as that can impact calling conventions.
250 if (!isTargetMacOS())
251 CC1Args.push_back("-Werror=implicit-function-declaration");
Tim Northover336f1892014-03-29 13:16:12 +0000252 }
253}
254
Tim Northover157d9112014-01-16 08:48:16 +0000255/// \brief Determine whether Objective-C automated reference counting is
256/// enabled.
257static bool isObjCAutoRefCount(const ArgList &Args) {
258 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
259}
260
John McCall31168b02011-06-15 23:02:42 +0000261void DarwinClang::AddLinkARCArgs(const ArgList &Args,
262 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000263 // Avoid linking compatibility stubs on i386 mac.
264 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
265 return;
266
267 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
268
269 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
270 runtime.hasSubscripting())
271 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000272
273 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000274 SmallString<128> P(getDriver().ClangExecutable);
275 llvm::sys::path::remove_filename(P); // 'clang'
276 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000277 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000278 // Mash in the platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000279 if (isTargetWatchOSSimulator())
280 P += "watchsimulator";
281 else if (isTargetWatchOS())
282 P += "watchos";
283 else if (isTargetTvOSSimulator())
284 P += "appletvsimulator";
285 else if (isTargetTvOS())
286 P += "appletvos";
287 else if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000288 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000289 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000290 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000291 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000292 P += "macosx";
293 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000294
Rafael Espindola358256c2013-06-26 02:13:00 +0000295 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000296}
297
Tim Northover157d9112014-01-16 08:48:16 +0000298void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000299 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000300 bool IsEmbedded, bool AddRPath) const {
301 SmallString<128> Dir(getDriver().ResourceDir);
302 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
303
304 SmallString<128> P(Dir);
305 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000306
Eric Christopherc235d0c62011-06-22 17:41:40 +0000307 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000308 // not have compiler-rt checked out or integrated into their build (unless
309 // we explicitly force linking with this library).
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000310 if (AlwaysLink || getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000311 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000312
313 // Adding the rpaths might negatively interact when other rpaths are involved,
314 // so we should make sure we add the rpaths last, after all user-specified
315 // rpaths. This is currently true from this place, but we need to be
316 // careful if this function is ever called before user's rpaths are emitted.
317 if (AddRPath) {
318 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
319
320 // Add @executable_path to rpath to support having the dylib copied with
321 // the executable.
322 CmdArgs.push_back("-rpath");
323 CmdArgs.push_back("@executable_path");
324
325 // Add the path to the resource dir to rpath to support using the dylib
326 // from the default location without copying.
327 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000328 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000329 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000330}
331
Chris Bienemane60e7c22016-04-29 22:28:34 +0000332StringRef Darwin::getPlatformFamily() const {
333 switch (TargetPlatform) {
334 case DarwinPlatformKind::MacOS:
335 return "MacOSX";
336 case DarwinPlatformKind::IPhoneOS:
337 case DarwinPlatformKind::IPhoneOSSimulator:
338 return "iPhone";
339 case DarwinPlatformKind::TvOS:
340 case DarwinPlatformKind::TvOSSimulator:
341 return "AppleTV";
342 case DarwinPlatformKind::WatchOS:
343 case DarwinPlatformKind::WatchOSSimulator:
344 return "Watch";
345 }
346 llvm_unreachable("Unsupported platform");
347}
348
349StringRef Darwin::getSDKName(StringRef isysroot) {
350 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
351 llvm::sys::path::const_iterator SDKDir;
352 auto BeginSDK = llvm::sys::path::begin(isysroot);
353 auto EndSDK = llvm::sys::path::end(isysroot);
354 for (auto IT = BeginSDK; IT != EndSDK; ++IT) {
355 StringRef SDK = *IT;
356 if (SDK.endswith(".sdk"))
357 return SDK.slice(0, SDK.size() - 4);
358 }
359 return "";
360}
361
Anna Zakse67b4022016-02-02 02:04:48 +0000362StringRef Darwin::getOSLibraryNameSuffix() const {
363 switch(TargetPlatform) {
364 case DarwinPlatformKind::MacOS:
365 return "osx";
366 case DarwinPlatformKind::IPhoneOS:
367 return "ios";
368 case DarwinPlatformKind::IPhoneOSSimulator:
369 return "iossim";
370 case DarwinPlatformKind::TvOS:
371 return "tvos";
372 case DarwinPlatformKind::TvOSSimulator:
373 return "tvossim";
374 case DarwinPlatformKind::WatchOS:
375 return "watchos";
376 case DarwinPlatformKind::WatchOSSimulator:
377 return "watchossim";
378 }
379 llvm_unreachable("Unsupported platform");
380}
381
Justin Bogner2fd95f62015-05-12 06:30:48 +0000382void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000383 ArgStringList &CmdArgs) const {
Xinliang David Li69306c02015-10-22 06:15:31 +0000384 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000385
Chris Bieneman7f2844f2016-03-15 18:08:20 +0000386 AddLinkRuntimeLib(Args, CmdArgs, (Twine("libclang_rt.profile_") +
387 getOSLibraryNameSuffix() + ".a").str(),
Chris Bieneman586d24b2015-11-20 00:19:21 +0000388 /*AlwaysLink*/ true);
Justin Bognerc7701242015-05-12 05:44:36 +0000389}
390
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000391void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
392 ArgStringList &CmdArgs,
393 StringRef Sanitizer) const {
394 if (!Args.hasArg(options::OPT_dynamiclib) &&
395 !Args.hasArg(options::OPT_bundle)) {
396 // Sanitizer runtime libraries requires C++.
397 AddCXXStdlibLibArgs(Args, CmdArgs);
398 }
Anna Zakse67b4022016-02-02 02:04:48 +0000399
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000400 AddLinkRuntimeLib(
401 Args, CmdArgs,
Anna Zakse67b4022016-02-02 02:04:48 +0000402 (Twine("libclang_rt.") + Sanitizer + "_" +
403 getOSLibraryNameSuffix() + "_dynamic.dylib").str(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000404 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
405 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000406
407 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
408 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
409 // all RTTI-related symbols that UBSan uses.
410 CmdArgs.push_back("-lc++abi");
411 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000412}
413
Daniel Dunbar6276f992009-09-18 08:15:13 +0000414void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
415 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000416 // Darwin only supports the compiler-rt based runtime libraries.
417 switch (GetRuntimeLibType(Args)) {
418 case ToolChain::RLT_CompilerRT:
419 break;
420 default:
421 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000422 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000423 return;
424 }
425
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000426 // Darwin doesn't support real static executables, don't link any runtime
427 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000428 if (Args.hasArg(options::OPT_static) ||
429 Args.hasArg(options::OPT_fapple_kext) ||
430 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000431 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000432
433 // Reject -static-libgcc for now, we can deal with this when and if someone
434 // cares. This is useful in situations where someone wants to statically link
435 // something like libstdc++, and needs its runtime support routines.
436 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000437 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000438 return;
439 }
440
Peter Collingbourne32701642013-11-01 18:16:25 +0000441 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000442 if (Sanitize.needsAsanRt())
443 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
444 if (Sanitize.needsUbsanRt())
445 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000446 if (Sanitize.needsTsanRt())
447 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Peter Collingbournedc134532016-01-16 00:31:22 +0000448 if (Sanitize.needsStatsRt()) {
449 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
450 AddLinkRuntimeLib(Args, CmdArgs,
451 (Twine("libclang_rt.stats_client_") + OS + ".a").str(),
452 /*AlwaysLink=*/true);
453 AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");
454 }
Derek Bruening256c2e12016-04-21 21:32:04 +0000455 if (Sanitize.needsEsanRt())
456 AddLinkSanitizerLibArgs(Args, CmdArgs, "esan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000457
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000458 // Otherwise link libSystem, then the dynamic runtime library, and finally any
459 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000460 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000461
462 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000463 if (isTargetWatchOSBased()) {
464 // We currently always need a static runtime library for watchOS.
465 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
466 } else if (isTargetTvOSBased()) {
467 // We currently always need a static runtime library for tvOS.
468 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
469 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000470 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
471 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000472 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000473 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000474 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000475 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000476
Daniel Dunbard1076382011-04-18 23:48:36 +0000477 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000478 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000479 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000480 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000481 // The dynamic runtime library was merged with libSystem for 10.6 and
482 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000483 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000484 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000485 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000486 CmdArgs.push_back("-lgcc_s.10.5");
487
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000488 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000489 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000490 // omitted from 10.4.dylib.
491 //
492 // Unfortunately, that turned out to not be true, because Darwin system
493 // headers can still use eprintf on i386, and it is not exported from
494 // libSystem. Therefore, we still must provide a runtime library just for
495 // the tiny tiny handful of projects that *might* use that symbol.
496 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000497 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000498 } else {
499 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000500 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
501 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000502 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000503 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000504}
505
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000506void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000507 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000508
Daniel Dunbar455a0492012-08-17 18:43:50 +0000509 // Support allowing the SDKROOT environment variable used by xcrun and other
510 // Xcode tools to define the default sysroot, by making it the default for
511 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000512 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
513 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000514 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000515 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
516 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000517 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000518 // We only use this value as the default if it is an absolute path,
519 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000520 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000521 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000522 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000523 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000524 }
525 }
526 }
527
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000528 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000529 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000530 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
531 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000532
Tim Northover6f3ff222015-10-30 16:30:27 +0000533 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000534 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000535 << OSXVersion->getAsString(Args)
536 << (iOSVersion ? iOSVersion :
537 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
538 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
539 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
540 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
541 << iOSVersion->getAsString(Args)
542 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
543 TvOSVersion = WatchOSVersion = nullptr;
544 } else if (TvOSVersion && WatchOSVersion) {
545 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
546 << TvOSVersion->getAsString(Args)
547 << WatchOSVersion->getAsString(Args);
548 WatchOSVersion = nullptr;
549 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000550 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000551 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000552 std::string OSXTarget;
553 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000554 std::string TvOSTarget;
555 std::string WatchOSTarget;
556
Chad Rosier64707fe2011-08-31 20:56:25 +0000557 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
558 OSXTarget = env;
559 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
560 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000561 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
562 TvOSTarget = env;
563 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
564 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000565
Steven Wu7a1372c2015-06-25 01:59:35 +0000566 // If there is no command-line argument to specify the Target version and
567 // no environment variable defined, see if we can set the default based
568 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000569 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Frederic Riss3ad83bd2016-01-12 23:47:59 +0000570 TvOSTarget.empty() && Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000571 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000572 StringRef isysroot = A->getValue();
Chris Bienemane60e7c22016-04-29 22:28:34 +0000573 StringRef SDK = getSDKName(isysroot);
574 if (SDK.size() > 0) {
Steven Wu7a1372c2015-06-25 01:59:35 +0000575 // Slice the version number out.
576 // Version number is between the first and the last number.
577 size_t StartVer = SDK.find_first_of("0123456789");
578 size_t EndVer = SDK.find_last_of("0123456789");
579 if (StartVer != StringRef::npos && EndVer > StartVer) {
580 StringRef Version = SDK.slice(StartVer, EndVer + 1);
581 if (SDK.startswith("iPhoneOS") ||
582 SDK.startswith("iPhoneSimulator"))
583 iOSTarget = Version;
584 else if (SDK.startswith("MacOSX"))
585 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000586 else if (SDK.startswith("WatchOS") ||
587 SDK.startswith("WatchSimulator"))
588 WatchOSTarget = Version;
589 else if (SDK.startswith("AppleTVOS") ||
590 SDK.startswith("AppleTVSimulator"))
591 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000592 }
593 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000594 }
595 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000596
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000597 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000598 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000599 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
600 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000601 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000602 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000603 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000604 MachOArchName == "arm64") {
605 getTriple().getiOSVersion(Major, Minor, Micro);
606 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
607 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000608 } else if (MachOArchName == "armv7k") {
609 getTriple().getWatchOSVersion(Major, Minor, Micro);
610 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
611 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000612 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
613 MachOArchName != "armv7em") {
614 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
615 getDriver().Diag(diag::err_drv_invalid_darwin_version)
616 << getTriple().getOSName();
617 }
618 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
619 << Micro;
620 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000621 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000622
Tim Northover6f3ff222015-10-30 16:30:27 +0000623 // Do not allow conflicts with the watchOS target.
624 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
625 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
626 << "WATCHOS_DEPLOYMENT_TARGET"
627 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
628 "TVOS_DEPLOYMENT_TARGET");
629 }
630
631 // Do not allow conflicts with the tvOS target.
632 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
633 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
634 << "TVOS_DEPLOYMENT_TARGET"
635 << "IPHONEOS_DEPLOYMENT_TARGET";
636 }
637
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000638 // Allow conflicts among OSX and iOS for historical reasons, but choose the
639 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000640 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
641 !WatchOSTarget.empty() ||
642 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000643 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000644 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000645 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000646 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000647 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000648 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000649 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000650
Chad Rosier64707fe2011-08-31 20:56:25 +0000651 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000652 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000653 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000654 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000655 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000656 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000657 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000658 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000659 } else if (!TvOSTarget.empty()) {
660 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
661 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
662 Args.append(TvOSVersion);
663 } else if (!WatchOSTarget.empty()) {
664 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
665 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
666 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000667 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000668 }
Mike Stump11289f42009-09-09 15:08:12 +0000669
Tim Northover9c7e0352013-12-12 11:55:52 +0000670 DarwinPlatformKind Platform;
671 if (OSXVersion)
672 Platform = MacOS;
673 else if (iOSVersion)
674 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000675 else if (TvOSVersion)
676 Platform = TvOS;
677 else if (WatchOSVersion)
678 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000679 else
Tim Northover157d9112014-01-16 08:48:16 +0000680 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000681
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000682 // Set the tool chain target information.
683 unsigned Major, Minor, Micro;
684 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000685 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000686 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
687 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000688 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
689 HadExtra) ||
690 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000691 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000692 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000693 } else if (Platform == IPhoneOS) {
694 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000695 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
696 HadExtra) ||
697 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000698 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000699 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000700 } else if (Platform == TvOS) {
701 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
702 Micro, HadExtra) || HadExtra ||
703 Major >= 10 || Minor >= 100 || Micro >= 100)
704 getDriver().Diag(diag::err_drv_invalid_version_number)
705 << TvOSVersion->getAsString(Args);
706 } else if (Platform == WatchOS) {
707 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
708 Micro, HadExtra) || HadExtra ||
709 Major >= 10 || Minor >= 100 || Micro >= 100)
710 getDriver().Diag(diag::err_drv_invalid_version_number)
711 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000712 } else
713 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000714
Bob Wilson7f294b52014-10-10 23:10:10 +0000715 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000716 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
717 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000718 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000719 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
720 getTriple().getArch() == llvm::Triple::x86_64))
721 Platform = TvOSSimulator;
722 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
723 getTriple().getArch() == llvm::Triple::x86_64))
724 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000725
Tim Northover9c7e0352013-12-12 11:55:52 +0000726 setTarget(Platform, Major, Minor, Micro);
Chris Bienemane60e7c22016-04-29 22:28:34 +0000727
728 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
729 StringRef SDK = getSDKName(A->getValue());
730 if (SDK.size() > 0) {
731 size_t StartVer = SDK.find_first_of("0123456789");
732 StringRef SDKName = SDK.slice(0, StartVer);
733 if (!SDKName.startswith(getPlatformFamily()))
734 getDriver().Diag(diag::warn_incompatible_sysroot)
735 << SDKName << getPlatformFamily();
736 }
737 }
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000738}
739
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000740void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000741 ArgStringList &CmdArgs) const {
742 CXXStdlibType Type = GetCXXStdlibType(Args);
743
744 switch (Type) {
745 case ToolChain::CST_Libcxx:
746 CmdArgs.push_back("-lc++");
747 break;
748
Hans Wennborgdcfba332015-10-06 23:40:43 +0000749 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000750 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
751 // it was previously found in the gcc lib dir. However, for all the Darwin
752 // platforms we care about it was -lstdc++.6, so we search for that
753 // explicitly if we can't see an obvious -lstdc++ candidate.
754
755 // Check in the sysroot first.
756 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000757 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000758 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000759
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000760 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000761 llvm::sys::path::remove_filename(P);
762 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000763 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000764 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000765 return;
766 }
767 }
768 }
769
770 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000771 // FIXME: This should be removed someday when we don't have to care about
772 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000773 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
774 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000775 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
776 return;
777 }
778
779 // Otherwise, let the linker search.
780 CmdArgs.push_back("-lstdc++");
781 break;
782 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000783}
784
Shantonu Senafeb03b2010-09-17 18:39:08 +0000785void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
786 ArgStringList &CmdArgs) const {
Shantonu Senafeb03b2010-09-17 18:39:08 +0000787 // For Darwin platforms, use the compiler-rt-based support library
788 // instead of the gcc-provided one (which is also incidentally
789 // only present in the gcc lib dir, which makes it hard to find).
790
Rafael Espindola358256c2013-06-26 02:13:00 +0000791 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000792 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000793
794 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000795 if (isTargetWatchOS()) {
796 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
797 } else if (isTargetTvOS()) {
798 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
799 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000800 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000801 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000802 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000803 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000804
Shantonu Senafeb03b2010-09-17 18:39:08 +0000805 // For now, allow missing resource libraries to support developers who may
806 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000807 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000808 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000809}
810
Tim Northover157d9112014-01-16 08:48:16 +0000811DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
812 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000813 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
814 const OptTable &Opts = getDriver().getOpts();
815
816 // FIXME: We really want to get out of the tool chain level argument
817 // translation business, as it makes the driver functionality much
818 // more opaque. For now, we follow gcc closely solely for the
819 // purpose of easily achieving feature parity & testability. Once we
820 // have something that works, we should reevaluate each translation
821 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000822
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000823 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000824 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000825 // Skip this argument unless the architecture matches either the toolchain
826 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000827 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000828 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
829 if (!(XarchArch == getArch() ||
830 (BoundArch &&
831 XarchArch ==
832 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000833 continue;
834
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000835 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000836 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000837 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000838 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000839
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000840 // If the argument parsing failed or more than one argument was
841 // consumed, the -Xarch_ argument's parameter tried to consume
842 // extra arguments. Emit an error and ignore.
843 //
844 // We also want to disallow any options which would alter the
845 // driver behavior; that isn't going to work in our model. We
846 // use isDriverOption() as an approximation, although things
847 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000848 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000849 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000850 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000851 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000852 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000853 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000854 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000855 continue;
856 }
857
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000858 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000859
Nico Webera04d5f82014-05-11 17:27:13 +0000860 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000861 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000862
863 // Linker input arguments require custom handling. The problem is that we
864 // have already constructed the phase actions, so we can not treat them as
865 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000866 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000867 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000868 for (const char *Value : A->getValues()) {
869 DAL->AddSeparateArg(
870 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000871 }
872 continue;
873 }
Mike Stump11289f42009-09-09 15:08:12 +0000874 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000875
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000876 // Sob. These is strictly gcc compatible for the time being. Apple
877 // gcc translates options twice, which means that self-expanding
878 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000879 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000880 default:
881 DAL->append(A);
882 break;
883
884 case options::OPT_mkernel:
885 case options::OPT_fapple_kext:
886 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000887 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000888 break;
Mike Stump11289f42009-09-09 15:08:12 +0000889
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000890 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000891 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000892 break;
893
894 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000895 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000896 DAL->AddFlagArg(
897 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000898 break;
899
900 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000901 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000902 DAL->AddFlagArg(
903 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000904 break;
905
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000906 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000907 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000908 break;
909
910 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000911 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000912 break;
913
914 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000915 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000916 break;
917
918 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000919 DAL->AddFlagArg(A,
920 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000921 break;
922
923 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000924 DAL->AddFlagArg(
925 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000926 break;
927
928 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000929 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000930 break;
931
932 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000933 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000934 break;
935 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000936 }
937
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000938 if (getTriple().getArch() == llvm::Triple::x86 ||
939 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000940 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000941 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
942 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000943
944 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000945 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000946 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000947 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000948 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
949 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000950
951 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
952 // which defines the list of which architectures we accept.
953 if (Name == "ppc")
954 ;
955 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000956 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000957 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000958 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000959 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000960 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000961 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000962 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000963 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000964 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000965 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000966 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000967 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000968 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000969 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000970 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000971
Bill Schmidt778d3872013-07-26 01:36:11 +0000972 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000973 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000974
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000975 else if (Name == "i386")
976 ;
977 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000978 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000979 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000980 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000981 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000982 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000983 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000984 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000985 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000986 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000987 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000988 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000989 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000990 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000991
992 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000993 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000994 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000995 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
996 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000997 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000998
999 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +00001000 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001001 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +00001002 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001003 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +00001004 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001005 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +00001006 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001007 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +00001008 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +00001009 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +00001010 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001011 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +00001012 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +00001013 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +00001014 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001015 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +00001016 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +00001017 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +00001018 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001019 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +00001020 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001021 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +00001022
Tim Northover157d9112014-01-16 08:48:16 +00001023 return DAL;
1024}
1025
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001026void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
1027 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001028 // Embedded targets are simple at the moment, not supporting sanitizers and
1029 // with different libraries for each member of the product { static, PIC } x
1030 // { hard-float, soft-float }
1031 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001032 CompilerRT +=
1033 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
1034 ? "hard"
1035 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +00001036 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
1037
1038 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
1039}
1040
Tim Northover157d9112014-01-16 08:48:16 +00001041DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
1042 const char *BoundArch) const {
1043 // First get the generic Apple args, before moving onto Darwin-specific ones.
1044 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
Tim Northoverb534ce42016-02-12 22:30:42 +00001045 const OptTable &Opts = getDriver().getOpts();
Tim Northover157d9112014-01-16 08:48:16 +00001046
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001047 // If no architecture is bound, none of the translations here are relevant.
1048 if (!BoundArch)
1049 return DAL;
1050
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001051 // Add an explicit version min argument for the deployment target. We do this
1052 // after argument translation because -Xarch_ arguments may add a version min
1053 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001054 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001055
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001056 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
1057 // FIXME: It would be far better to avoid inserting those -static arguments,
1058 // but we can't check the deployment target in the translation code until
1059 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +00001060 if (isTargetWatchOSBased() ||
1061 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1062 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001063 Arg *A = *it;
1064 ++it;
1065 if (A->getOption().getID() != options::OPT_mkernel &&
1066 A->getOption().getID() != options::OPT_fapple_kext)
1067 continue;
1068 assert(it != ie && "unexpected argument translation");
1069 A = *it;
1070 assert(A->getOption().getID() == options::OPT_static &&
1071 "missing expected -static argument");
1072 it = DAL->getArgs().erase(it);
1073 }
1074 }
1075
Tim Northoverb534ce42016-02-12 22:30:42 +00001076 if (!Args.getLastArg(options::OPT_stdlib_EQ) &&
Tim Northover3a098c12016-02-15 16:38:10 +00001077 GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
Tim Northoverb534ce42016-02-12 22:30:42 +00001078 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1079 "libc++");
1080
Bob Wilson102be442011-10-07 17:54:41 +00001081 // Validate the C++ standard library choice.
1082 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1083 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001084 // Check whether the target provides libc++.
1085 StringRef where;
1086
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001087 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001088 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001089 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001090
1091 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001092 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001093 }
1094 }
1095
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001096 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001097}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001098
Tim Northover157d9112014-01-16 08:48:16 +00001099bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001100 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001101}
1102
Tim Northover157d9112014-01-16 08:48:16 +00001103bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001104 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1105 return S[0] != '\0';
1106 return false;
1107}
1108
Tim Northovere931f9f2015-10-30 16:30:41 +00001109bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001110 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001111 if (getTriple().getArch() != llvm::Triple::arm &&
1112 getTriple().getArch() != llvm::Triple::thumb)
1113 return false;
1114
Tim Northoverc741b042015-11-17 18:27:27 +00001115 // Only watchOS uses the new DWARF/Compact unwinding method.
Tim Northoverd88ecb32016-01-27 19:32:40 +00001116 llvm::Triple Triple(ComputeLLVMTriple(Args));
Tim Northover4c9ac7d2016-01-27 22:14:02 +00001117 return !Triple.isWatchABI();
Daniel Dunbar3241d402010-02-10 18:49:11 +00001118}
1119
Steven Wu574b0f22016-03-01 01:07:58 +00001120bool Darwin::SupportsEmbeddedBitcode() const {
1121 assert(TargetInitialized && "Target not initialized!");
1122 if (isTargetIPhoneOS() && isIPhoneOSVersionLT(6, 0))
1123 return false;
1124 return true;
1125}
1126
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001127bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001128
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001129bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001130
Tim Northover157d9112014-01-16 08:48:16 +00001131bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001132 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001133 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001134}
1135
Tim Northover157d9112014-01-16 08:48:16 +00001136bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001137 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001138 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001139}
1140
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001141void Darwin::addMinVersionArgs(const ArgList &Args,
1142 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001143 VersionTuple TargetVersion = getTargetVersion();
1144
Tim Northover6f3ff222015-10-30 16:30:27 +00001145 if (isTargetWatchOS())
1146 CmdArgs.push_back("-watchos_version_min");
1147 else if (isTargetWatchOSSimulator())
1148 CmdArgs.push_back("-watchos_simulator_version_min");
1149 else if (isTargetTvOS())
1150 CmdArgs.push_back("-tvos_version_min");
1151 else if (isTargetTvOSSimulator())
1152 CmdArgs.push_back("-tvos_simulator_version_min");
1153 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001154 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001155 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001156 CmdArgs.push_back("-iphoneos_version_min");
1157 else {
1158 assert(isTargetMacOS() && "unexpected target");
1159 CmdArgs.push_back("-macosx_version_min");
1160 }
1161
1162 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1163}
1164
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001165void Darwin::addStartObjectFileArgs(const ArgList &Args,
1166 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001167 // Derived from startfile spec.
1168 if (Args.hasArg(options::OPT_dynamiclib)) {
1169 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001170 if (isTargetWatchOSBased()) {
1171 ; // watchOS does not need dylib1.o.
1172 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001173 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001174 } else if (isTargetIPhoneOS()) {
1175 if (isIPhoneOSVersionLT(3, 1))
1176 CmdArgs.push_back("-ldylib1.o");
1177 } else {
1178 if (isMacosxVersionLT(10, 5))
1179 CmdArgs.push_back("-ldylib1.o");
1180 else if (isMacosxVersionLT(10, 6))
1181 CmdArgs.push_back("-ldylib1.10.5.o");
1182 }
1183 } else {
1184 if (Args.hasArg(options::OPT_bundle)) {
1185 if (!Args.hasArg(options::OPT_static)) {
1186 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001187 if (isTargetWatchOSBased()) {
1188 ; // watchOS does not need bundle1.o.
1189 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001190 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001191 } else if (isTargetIPhoneOS()) {
1192 if (isIPhoneOSVersionLT(3, 1))
1193 CmdArgs.push_back("-lbundle1.o");
1194 } else {
1195 if (isMacosxVersionLT(10, 6))
1196 CmdArgs.push_back("-lbundle1.o");
1197 }
1198 }
1199 } else {
1200 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1201 if (Args.hasArg(options::OPT_static) ||
1202 Args.hasArg(options::OPT_object) ||
1203 Args.hasArg(options::OPT_preload)) {
1204 CmdArgs.push_back("-lgcrt0.o");
1205 } else {
1206 CmdArgs.push_back("-lgcrt1.o");
1207
1208 // darwin_crt2 spec is empty.
1209 }
1210 // By default on OS X 10.8 and later, we don't link with a crt1.o
1211 // file and the linker knows to use _main as the entry point. But,
1212 // when compiling with -pg, we need to link with the gcrt1.o file,
1213 // so pass the -no_new_main option to tell the linker to use the
1214 // "start" symbol as the entry point.
1215 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1216 CmdArgs.push_back("-no_new_main");
1217 } else {
1218 if (Args.hasArg(options::OPT_static) ||
1219 Args.hasArg(options::OPT_object) ||
1220 Args.hasArg(options::OPT_preload)) {
1221 CmdArgs.push_back("-lcrt0.o");
1222 } else {
1223 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001224 if (isTargetWatchOSBased()) {
1225 ; // watchOS does not need crt1.o.
1226 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001227 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001228 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001229 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001230 ; // iOS does not need any crt1 files for arm64
1231 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001232 CmdArgs.push_back("-lcrt1.o");
1233 else if (isIPhoneOSVersionLT(6, 0))
1234 CmdArgs.push_back("-lcrt1.3.1.o");
1235 } else {
1236 if (isMacosxVersionLT(10, 5))
1237 CmdArgs.push_back("-lcrt1.o");
1238 else if (isMacosxVersionLT(10, 6))
1239 CmdArgs.push_back("-lcrt1.10.5.o");
1240 else if (isMacosxVersionLT(10, 8))
1241 CmdArgs.push_back("-lcrt1.10.6.o");
1242
1243 // darwin_crt2 spec is empty.
1244 }
1245 }
1246 }
1247 }
1248 }
1249
1250 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001251 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001252 isMacosxVersionLT(10, 5)) {
1253 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1254 CmdArgs.push_back(Str);
1255 }
1256}
1257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001258bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001259
John McCall3deb1ad2012-08-21 02:47:43 +00001260void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001261 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1262 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001263 return;
John McCall93207072012-08-27 01:56:21 +00001264 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001265}
1266
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001267SanitizerMask Darwin::getSupportedSanitizers() const {
Devin Coughlinfcfa38c2016-03-20 18:24:33 +00001268 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001269 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Anna Zakse67b4022016-02-02 02:04:48 +00001270 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001271 if (isTargetMacOS()) {
1272 if (!isMacosxVersionLT(10, 9))
1273 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001274 Res |= SanitizerKind::SafeStack;
Devin Coughlinfcfa38c2016-03-20 18:24:33 +00001275 if (IsX86_64)
1276 Res |= SanitizerKind::Thread;
1277 } else if (isTargetIOSSimulator() || isTargetTvOSSimulator()) {
1278 if (IsX86_64)
1279 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001280 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001281 return Res;
1282}
1283
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001284/// Generic_GCC - A tool chain using the 'gcc' command to perform
1285/// all subcommands; this relies on gcc translating the majority of
1286/// command line options.
1287
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001288/// \brief Parse a GCCVersion object out of a string of text.
1289///
1290/// This is the primary means of forming GCCVersion objects.
1291/*static*/
1292Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001293 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001294 std::pair<StringRef, StringRef> First = VersionText.split('.');
1295 std::pair<StringRef, StringRef> Second = First.second.split('.');
1296
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001297 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1298 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001299 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001300 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001301 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001302 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001303 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001304
1305 // First look for a number prefix and parse that if present. Otherwise just
1306 // stash the entire patch string in the suffix, and leave the number
1307 // unspecified. This covers versions strings such as:
1308 // 4.4
1309 // 4.4.0
1310 // 4.4.x
1311 // 4.4.2-rc4
1312 // 4.4.x-patched
1313 // And retains any patch number it finds.
1314 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1315 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001316 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001317 // Try to parse the number and any suffix.
1318 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1319 GoodVersion.Patch < 0)
1320 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001321 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001322 }
1323 }
1324
1325 return GoodVersion;
1326}
1327
1328/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001329bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1330 int RHSPatch,
1331 StringRef RHSPatchSuffix) const {
1332 if (Major != RHSMajor)
1333 return Major < RHSMajor;
1334 if (Minor != RHSMinor)
1335 return Minor < RHSMinor;
1336 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001337 // Note that versions without a specified patch sort higher than those with
1338 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001339 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001340 return true;
1341 if (Patch == -1)
1342 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001343
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001344 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001345 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001346 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001347 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001348 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001349 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001350 return true;
1351 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001352 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001353
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001354 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001355 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001356 }
1357
1358 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001359 return false;
1360}
1361
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001362static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001363 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1364 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001365 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001366 return GCC_INSTALL_PREFIX;
1367}
1368
Roman Divacky326d9982013-12-06 18:32:18 +00001369/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001370///
1371/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001372/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001373///
1374/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1375/// should instead pull the target out of the driver. This is currently
1376/// necessary because the driver doesn't store the final version of the target
1377/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001378void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001379 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001380 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001381 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1382 ? TargetTriple.get64BitArchVariant()
1383 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001384 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001385 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001386 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001387 SmallVector<StringRef, 16> CandidateTripleAliases;
1388 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001389 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1390 CandidateTripleAliases, CandidateBiarchLibDirs,
1391 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001392
1393 // Compute the set of prefixes for our search.
1394 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1395 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001396
Rafael Espindola1af7c212012-02-19 01:38:32 +00001397 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1398 if (GCCToolchainDir != "") {
1399 if (GCCToolchainDir.back() == '/')
1400 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001401
Rafael Espindola1af7c212012-02-19 01:38:32 +00001402 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001403 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001404 // If we have a SysRoot, try that first.
1405 if (!D.SysRoot.empty()) {
1406 Prefixes.push_back(D.SysRoot);
1407 Prefixes.push_back(D.SysRoot + "/usr");
1408 }
1409
1410 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001411 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001412
Rafael Espindola2edca412016-05-09 13:03:10 +00001413 // Then look for distribution supplied gcc installations.
1414 if (D.SysRoot.empty()) {
1415 // Look for RHEL devtoolsets.
1416 Prefixes.push_back("/opt/rh/devtoolset-4/root/usr");
1417 Prefixes.push_back("/opt/rh/devtoolset-3/root/usr");
1418 Prefixes.push_back("/opt/rh/devtoolset-2/root/usr");
1419 Prefixes.push_back("/opt/rh/devtoolset-1.1/root/usr");
1420 Prefixes.push_back("/opt/rh/devtoolset-1.0/root/usr");
1421 // And finally in /usr.
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001422 Prefixes.push_back("/usr");
Rafael Espindola2edca412016-05-09 13:03:10 +00001423 }
Rafael Espindolac29af942012-02-03 01:01:20 +00001424 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001425
1426 // Loop over the various components which exist and select the best GCC
1427 // installation available. GCC installs are ranked by version number.
1428 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001429 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001430 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001431 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001432 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001433 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001434 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001435 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001436 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001437 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001438 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001439 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001440 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001441 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001442 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001443 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001444 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001445 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001446 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001447 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001448 }
1449 }
1450}
1451
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001452void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001453 for (const auto &InstallPath : CandidateGCCInstallPaths)
1454 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001455
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001456 if (!GCCInstallPath.empty())
1457 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1458
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001459 for (const auto &Multilib : Multilibs)
1460 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001461
1462 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1463 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001464}
1465
1466bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1467 if (BiarchSibling.hasValue()) {
1468 M = BiarchSibling.getValue();
1469 return true;
1470 }
1471 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001472}
1473
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001474/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001475 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001476 SmallVectorImpl<StringRef> &LibDirs,
1477 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001478 SmallVectorImpl<StringRef> &BiarchLibDirs,
1479 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001480 // Declare a bunch of static data sets that we'll select between below. These
1481 // are specifically designed to always refer to string literals to avoid any
1482 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001483 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1484 static const char *const AArch64Triples[] = {
1485 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1486 "aarch64-redhat-linux"};
1487 static const char *const AArch64beLibDirs[] = {"/lib"};
1488 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1489 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001490
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001491 static const char *const ARMLibDirs[] = {"/lib"};
1492 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1493 "arm-linux-androideabi"};
1494 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1495 "armv7hl-redhat-linux-gnueabi"};
1496 static const char *const ARMebLibDirs[] = {"/lib"};
1497 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1498 "armeb-linux-androideabi"};
1499 static const char *const ARMebHFTriples[] = {
1500 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001501
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001502 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001503 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001504 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1505 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1506 "x86_64-redhat-linux", "x86_64-suse-linux",
1507 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1508 "x86_64-slackware-linux", "x86_64-linux-android",
1509 "x86_64-unknown-linux"};
1510 static const char *const X32LibDirs[] = {"/libx32"};
1511 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001512 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001513 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1514 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1515 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1516 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1517 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001518
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001519 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001520 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1521 "mips-mti-linux-gnu",
1522 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001523 static const char *const MIPSELLibDirs[] = {"/lib"};
1524 static const char *const MIPSELTriples[] = {
1525 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001526
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001527 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1528 static const char *const MIPS64Triples[] = {
1529 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1530 "mips64-linux-gnuabi64"};
1531 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1532 static const char *const MIPS64ELTriples[] = {
1533 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1534 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001535
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001536 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001537 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001538 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1539 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1540 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1541 static const char *const PPC64Triples[] = {
1542 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1543 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1544 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1545 static const char *const PPC64LETriples[] = {
1546 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1547 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001548
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001549 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1550 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1551 "sparcv8-linux-gnu"};
1552 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1553 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1554 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001555
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001556 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001557 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001558 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1559 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001560
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001561 // Solaris.
1562 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1563 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1564 "i386-pc-solaris2.11"};
1565
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001566 using std::begin;
1567 using std::end;
1568
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001569 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1570 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1571 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001572 return;
1573 }
1574
Chandler Carruth866faab2012-01-25 07:21:38 +00001575 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001576 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001577 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1578 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1579 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1580 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001581 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001582 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001583 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1584 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1585 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1586 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001587 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001588 case llvm::Triple::arm:
1589 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001590 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001591 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001592 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001593 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001594 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001595 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001596 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001597 case llvm::Triple::armeb:
1598 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001599 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001600 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001601 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001602 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001603 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001604 }
1605 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001606 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001607 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1608 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1609 // x32 is always available when x86_64 is available, so adding it as
1610 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001611 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001612 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1613 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001614 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001615 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1616 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001617 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001618 break;
1619 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001620 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1621 TripleAliases.append(begin(X86Triples), end(X86Triples));
1622 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1623 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001624 break;
1625 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001626 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1627 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1628 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1629 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001630 break;
1631 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001632 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1633 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1634 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1635 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1636 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001637 break;
1638 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001639 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1640 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1641 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1642 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001643 break;
1644 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001645 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1646 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1647 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1648 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1649 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001650 break;
1651 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001652 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1653 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1654 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1655 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001656 break;
1657 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001658 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1659 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1660 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1661 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001662 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001663 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001664 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1665 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001666 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001667 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001668 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001669 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1670 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1671 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1672 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001673 break;
1674 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001675 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1676 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1677 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1678 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001679 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001680 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001681 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1682 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001683 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001684 default:
1685 // By default, just rely on the standard lib directories and the original
1686 // triple.
1687 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001688 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001689
1690 // Always append the drivers target triple to the end, in case it doesn't
1691 // match any of our aliases.
1692 TripleAliases.push_back(TargetTriple.str());
1693
1694 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001695 if (TargetTriple.str() != BiarchTriple.str())
1696 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001697}
1698
Artem Belevich98607b62015-09-23 21:49:39 +00001699// \brief -- try common CUDA installation paths looking for files we need for
1700// CUDA compilation.
1701
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001702void Generic_GCC::CudaInstallationDetector::init(
1703 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001704 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001705
1706 if (Args.hasArg(options::OPT_cuda_path_EQ))
1707 CudaPathCandidates.push_back(
1708 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1709 else {
1710 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
Artem Belevich86017332015-11-17 22:28:55 +00001711 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001712 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1713 }
1714
Benjamin Kramere8b76412015-09-24 14:48:37 +00001715 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001716 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001717 continue;
1718
1719 CudaInstallPath = CudaPath;
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001720 CudaBinPath = CudaPath + "/bin";
Artem Belevich98607b62015-09-23 21:49:39 +00001721 CudaIncludePath = CudaInstallPath + "/include";
1722 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1723 CudaLibPath =
1724 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1725
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001726 if (!(D.getVFS().exists(CudaIncludePath) &&
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001727 D.getVFS().exists(CudaBinPath) && D.getVFS().exists(CudaLibPath) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001728 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001729 continue;
1730
Artem Belevich34f481a2015-11-17 22:28:50 +00001731 std::error_code EC;
1732 for (llvm::sys::fs::directory_iterator LI(CudaLibDevicePath, EC), LE;
1733 !EC && LI != LE; LI = LI.increment(EC)) {
1734 StringRef FilePath = LI->path();
1735 StringRef FileName = llvm::sys::path::filename(FilePath);
1736 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1737 const StringRef LibDeviceName = "libdevice.";
1738 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1739 continue;
1740 StringRef GpuArch = FileName.slice(
1741 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
1742 CudaLibDeviceMap[GpuArch] = FilePath.str();
1743 // Insert map entries for specifc devices with this compute capability.
1744 if (GpuArch == "compute_20") {
1745 CudaLibDeviceMap["sm_20"] = FilePath;
1746 CudaLibDeviceMap["sm_21"] = FilePath;
1747 } else if (GpuArch == "compute_30") {
1748 CudaLibDeviceMap["sm_30"] = FilePath;
1749 CudaLibDeviceMap["sm_32"] = FilePath;
1750 } else if (GpuArch == "compute_35") {
1751 CudaLibDeviceMap["sm_35"] = FilePath;
1752 CudaLibDeviceMap["sm_37"] = FilePath;
Artem Belevichffa5fc52016-05-19 17:47:47 +00001753 } else if (GpuArch == "compute_50") {
1754 CudaLibDeviceMap["sm_50"] = FilePath;
1755 CudaLibDeviceMap["sm_52"] = FilePath;
1756 CudaLibDeviceMap["sm_53"] = FilePath;
Artem Belevich34f481a2015-11-17 22:28:50 +00001757 }
1758 }
1759
Artem Belevich98607b62015-09-23 21:49:39 +00001760 IsValid = true;
1761 break;
1762 }
1763}
1764
1765void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1766 if (isValid())
1767 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1768}
1769
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001770namespace {
1771// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001772class FilterNonExistent {
1773 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001774 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001775
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001776public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001777 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1778 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001779 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001780 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001781 }
1782};
1783} // end anonymous namespace
1784
1785static void addMultilibFlag(bool Enabled, const char *const Flag,
1786 std::vector<std::string> &Flags) {
1787 if (Enabled)
1788 Flags.push_back(std::string("+") + Flag);
1789 else
1790 Flags.push_back(std::string("-") + Flag);
1791}
1792
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001793static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001794 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1795 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1796}
1797
1798static bool isMips32(llvm::Triple::ArchType Arch) {
1799 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1800}
1801
1802static bool isMips64(llvm::Triple::ArchType Arch) {
1803 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1804}
1805
1806static bool isMipsEL(llvm::Triple::ArchType Arch) {
1807 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1808}
1809
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001810static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001811 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001812 return A && A->getOption().matches(options::OPT_mips16);
1813}
1814
1815static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001816 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001817 return A && A->getOption().matches(options::OPT_mmicromips);
1818}
1819
Benjamin Kramere003ca22015-10-28 13:54:16 +00001820namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001821struct DetectedMultilibs {
1822 /// The set of multilibs that the detected installation supports.
1823 MultilibSet Multilibs;
1824
1825 /// The primary multilib appropriate for the given flags.
1826 Multilib SelectedMultilib;
1827
1828 /// On Biarch systems, this corresponds to the default multilib when
1829 /// targeting the non-default multilib. Otherwise, it is empty.
1830 llvm::Optional<Multilib> BiarchSibling;
1831};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001832} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001833
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001834static Multilib makeMultilib(StringRef commonSuffix) {
1835 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1836}
1837
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001838static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1839 StringRef Path, const ArgList &Args,
1840 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001841 // Some MIPS toolchains put libraries and object files compiled
1842 // using different options in to the sub-directoris which names
1843 // reflects the flags used for compilation. For example sysroot
1844 // directory might looks like the following examples:
1845 //
1846 // /usr
1847 // /lib <= crt*.o files compiled with '-mips32'
1848 // /mips16
1849 // /usr
1850 // /lib <= crt*.o files compiled with '-mips16'
1851 // /el
1852 // /usr
1853 // /lib <= crt*.o files compiled with '-mips16 -EL'
1854 //
1855 // or
1856 //
1857 // /usr
1858 // /lib <= crt*.o files compiled with '-mips32r2'
1859 // /mips16
1860 // /usr
1861 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1862 // /mips32
1863 // /usr
1864 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001865
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001866 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001867
Simon Atanasyancf7ac672016-05-22 15:27:58 +00001868 // Check for CodeScape MTI toolchain v1.2 and early.
1869 MultilibSet MtiMipsMultilibsV1;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001870 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001871 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001872 .flag("+m32")
1873 .flag("-m64")
1874 .flag("-mmicromips")
1875 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001876
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001877 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001878 .flag("+m32")
1879 .flag("-m64")
1880 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001881
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001882 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001883 .flag("-m32")
1884 .flag("+m64")
1885 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001886
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001887 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1888 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001889
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001890 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001891 .flag("+m32")
1892 .flag("-m64")
1893 .flag("-mmicromips")
1894 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001895
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001896 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001897
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001899
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001900 auto MAbi64 =
1901 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001902
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001903 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001904
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001905 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001906
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001907 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001908
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001909 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001910
Simon Atanasyancf7ac672016-05-22 15:27:58 +00001911 MtiMipsMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001912 MultilibSet()
1913 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1914 MArchDefault)
1915 .Maybe(UCLibc)
1916 .Maybe(Mips16)
1917 .FilterOut("/mips64/mips16")
1918 .FilterOut("/mips64r2/mips16")
1919 .FilterOut("/micromips/mips16")
1920 .Maybe(MAbi64)
1921 .FilterOut("/micromips/64")
1922 .FilterOut("/mips32/64")
1923 .FilterOut("^/64")
1924 .FilterOut("/mips16/64")
1925 .Either(BigEndian, LittleEndian)
1926 .Maybe(SoftFloat)
1927 .Maybe(Nan2008)
1928 .FilterOut(".*sof/nan2008")
1929 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00001930 .setIncludeDirsCallback([](const Multilib &M) {
1931 std::vector<std::string> Dirs({"/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001932 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
Simon Atanasyana45502d2016-05-19 15:07:21 +00001933 Dirs.push_back("/../../../../sysroot/uclibc/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001934 else
Simon Atanasyana45502d2016-05-19 15:07:21 +00001935 Dirs.push_back("/../../../../sysroot/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001936 return Dirs;
1937 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001938 }
1939
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001940 // Check for Musl toolchain multilibs
1941 MultilibSet MuslMipsMultilibs;
1942 {
1943 auto MArchMipsR2 = makeMultilib("")
1944 .osSuffix("/mips-r2-hard-musl")
1945 .flag("+EB")
1946 .flag("-EL")
1947 .flag("+march=mips32r2");
1948
1949 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1950 .flag("-EB")
1951 .flag("+EL")
1952 .flag("+march=mips32r2");
1953
1954 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1955
1956 // Specify the callback that computes the include directories.
Simon Atanasyana45502d2016-05-19 15:07:21 +00001957 MuslMipsMultilibs.setIncludeDirsCallback([](const Multilib &M) {
1958 return std::vector<std::string>(
1959 {"/../sysroot" + M.osSuffix() + "/usr/include"});
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001960 });
1961 }
1962
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001963 MultilibSet AndroidMipsMultilibs =
1964 MultilibSet()
1965 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1966 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1967 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001968
1969 MultilibSet DebianMipsMultilibs;
1970 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001971 Multilib MAbiN32 =
1972 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001973
1974 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001975 .gccSuffix("/64")
1976 .includeSuffix("/64")
1977 .flag("+m64")
1978 .flag("-m32")
1979 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001980
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001981 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001982
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001983 DebianMipsMultilibs =
1984 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001985 }
1986
Simon Atanasyancf7ac672016-05-22 15:27:58 +00001987 // Check for CodeScape IMG toolchain v1.2 and early.
1988 MultilibSet ImgMultilibsV1;
Daniel Sanders2bf13662014-07-10 14:40:57 +00001989 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001990 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001991
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001992 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001993
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001994 auto MAbi64 =
1995 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001996
Simon Atanasyancf7ac672016-05-22 15:27:58 +00001997 ImgMultilibsV1 =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001998 MultilibSet()
1999 .Maybe(Mips64r6)
2000 .Maybe(MAbi64)
2001 .Maybe(LittleEndian)
2002 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002003 .setIncludeDirsCallback([](const Multilib &M) {
2004 return std::vector<std::string>(
2005 {"/include", "/../../../../sysroot/usr/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002006 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002007 }
2008
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002009 StringRef CPUName;
2010 StringRef ABIName;
2011 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2012
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002013 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2014
2015 Multilib::flags_list Flags;
2016 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2017 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2018 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002019 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002020 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002021 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002022 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002023 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002024 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002025 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2026 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002027 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002028 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002029 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002030 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2031 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002032 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2033 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002034 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002035 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002036 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002037 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002038
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002039 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002040 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00002041 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2042 Result.Multilibs = AndroidMipsMultilibs;
2043 return true;
2044 }
2045 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002046 }
2047
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002048 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2049 TargetTriple.getOS() == llvm::Triple::Linux &&
2050 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2051 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2052 Result.Multilibs = MuslMipsMultilibs;
2053 return true;
2054 }
2055 return false;
2056 }
2057
Daniel Sanders2bf13662014-07-10 14:40:57 +00002058 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2059 TargetTriple.getOS() == llvm::Triple::Linux &&
2060 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2061 // Select mips-img-linux-gnu toolchain.
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002062 if (ImgMultilibsV1.select(Flags, Result.SelectedMultilib)) {
2063 Result.Multilibs = ImgMultilibsV1;
Daniel Sanders2bf13662014-07-10 14:40:57 +00002064 return true;
2065 }
2066 return false;
2067 }
2068
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002069 // Sort candidates. Toolchain that best meets the directories goes first.
2070 // Then select the first toolchains matches command line flags.
Simon Atanasyancf7ac672016-05-22 15:27:58 +00002071 MultilibSet *candidates[] = {&DebianMipsMultilibs, &MtiMipsMultilibsV1};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002072 std::sort(
2073 std::begin(candidates), std::end(candidates),
2074 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2075 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002076 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002077 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002078 Result.BiarchSibling = Multilib();
2079 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002080 return true;
2081 }
2082 }
2083
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002084 {
2085 // Fallback to the regular toolchain-tree structure.
2086 Multilib Default;
2087 Result.Multilibs.push_back(Default);
2088 Result.Multilibs.FilterOut(NonExistent);
2089
2090 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2091 Result.BiarchSibling = Multilib();
2092 return true;
2093 }
2094 }
2095
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002096 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002097}
2098
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002099static bool findBiarchMultilibs(const Driver &D,
2100 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002101 StringRef Path, const ArgList &Args,
2102 bool NeedsBiarchSuffix,
2103 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002104 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2105 // in what would normally be GCCInstallPath and put the 64-bit
2106 // libs in a subdirectory named 64. The simple logic we follow is that
2107 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2108 // we use that. If not, and if not a biarch triple alias, we look for
2109 // crtbegin.o without the subdirectory.
2110
2111 Multilib Default;
2112 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002113 .gccSuffix("/64")
2114 .includeSuffix("/64")
2115 .flag("-m32")
2116 .flag("+m64")
2117 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002118 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002119 .gccSuffix("/32")
2120 .includeSuffix("/32")
2121 .flag("+m32")
2122 .flag("-m64")
2123 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002124 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002125 .gccSuffix("/x32")
2126 .includeSuffix("/x32")
2127 .flag("-m32")
2128 .flag("-m64")
2129 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002130
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002131 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002132
Zinovy Nis1db95732014-07-10 15:27:19 +00002133 // Determine default multilib from: 32, 64, x32
2134 // Also handle cases such as 64 on 32, 32 on 64, etc.
2135 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002136 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002137 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002138 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002139 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002140 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002141 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002142 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002143 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002144 if (TargetTriple.isArch32Bit())
2145 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002146 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002147 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002148 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002149 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002150 }
2151
Zinovy Nis1db95732014-07-10 15:27:19 +00002152 if (Want == WANT32)
2153 Default.flag("+m32").flag("-m64").flag("-mx32");
2154 else if (Want == WANT64)
2155 Default.flag("-m32").flag("+m64").flag("-mx32");
2156 else if (Want == WANTX32)
2157 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002158 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002159 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002160
Simon Atanasyan60280b42014-05-12 07:37:51 +00002161 Result.Multilibs.push_back(Default);
2162 Result.Multilibs.push_back(Alt64);
2163 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002164 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002165
Simon Atanasyan60280b42014-05-12 07:37:51 +00002166 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002167
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002168 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002169 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002170 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002171 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002172
Simon Atanasyan60280b42014-05-12 07:37:51 +00002173 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002174 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002175
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002176 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002177 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002178 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002179
2180 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002181}
2182
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002183void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2184 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2185 const std::string &LibDir, StringRef CandidateTriple,
2186 bool NeedsBiarchSuffix) {
2187 // Solaris is a special case. The GCC installation is under
2188 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2189 // need to iterate twice.
2190 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002191 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2192 !EC && LI != LE; LI = LI.increment(EC)) {
2193 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002194 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2195
2196 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002197 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002198 continue; // Saw this path before; no need to look at it again.
2199 if (CandidateVersion.isOlderThan(4, 1, 1))
2200 continue;
2201 if (CandidateVersion <= Version)
2202 continue;
2203
2204 GCCInstallPath =
2205 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002206 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002207 continue;
2208
2209 // If we make it here there has to be at least one GCC version, let's just
2210 // use the latest one.
2211 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002212 for (vfs::directory_iterator
2213 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2214 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002215 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2216
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002217 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002218 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2219
2220 if (CandidateSubVersion > Version)
2221 Version = CandidateSubVersion;
2222 }
2223
2224 GCCTriple.setTriple(CandidateTriple);
2225
2226 GCCInstallPath += "/" + Version.Text;
2227 GCCParentLibPath = GCCInstallPath + "/../../../../";
2228
2229 IsValid = true;
2230 }
2231}
2232
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002233void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002234 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002235 const std::string &LibDir, StringRef CandidateTriple,
2236 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002237 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002238 // There are various different suffixes involving the triple we
2239 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002240 // up to the lib directory. Specifically, the number of "up" steps
2241 // in the second half of each row is 1 + the number of path separators
2242 // in the first half.
2243 const std::string LibAndInstallSuffixes[][2] = {
2244 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2245
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002246 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002247 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2248
2249 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2250 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002251
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002252 // The Freescale PPC SDK has the gcc libraries in
2253 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002254 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002255
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002256 // Ubuntu has a strange mis-matched pair of triples that this happens to
2257 // match.
2258 // FIXME: It may be worthwhile to generalize this and look for a second
2259 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002260 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2261
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002262 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2263 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2264 NeedsBiarchSuffix);
2265 return;
2266 }
2267
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002268 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002269 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2270 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002271 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002272 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002273 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002274 for (vfs::directory_iterator
2275 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2276 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002277 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002278 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002279 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002280 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002281 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002282 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002283 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002284 continue;
2285 if (CandidateVersion <= Version)
2286 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002287
Simon Atanasyan60280b42014-05-12 07:37:51 +00002288 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002289
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002290 // Debian mips multilibs behave more like the rest of the biarch ones,
2291 // so handle them there
2292 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002293 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002294 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002295 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002296 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002297 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002298 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002299
Simon Atanasyan60280b42014-05-12 07:37:51 +00002300 Multilibs = Detected.Multilibs;
2301 SelectedMultilib = Detected.SelectedMultilib;
2302 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002303 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002304 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002305 // FIXME: We hack together the directory name here instead of
2306 // using LI to ensure stable path separators across Windows and
2307 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002308 GCCInstallPath =
2309 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2310 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002311 IsValid = true;
2312 }
2313 }
2314}
2315
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002316Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002317 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002318 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002319 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002320 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002321 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002322}
2323
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002324Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002325
Rafael Espindola7cf32212013-03-20 03:05:54 +00002326Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002327 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002328 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002329 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002330 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002331 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002332 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002333 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002334 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002335 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002336 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002337 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002338 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002339}
2340
Rafael Espindola7cf32212013-03-20 03:05:54 +00002341Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002342 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002343}
2344
Douglas Katzman95354292015-06-23 20:42:09 +00002345Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002346
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002347void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2348 // Print the information about how we detected the GCC installation.
2349 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002350 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002351}
2352
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002353bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002354 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002355}
2356
David Majnemer17f448b2015-06-28 04:23:33 +00002357bool Generic_GCC::isPICDefault() const {
2358 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2359}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002360
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002361bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002362
David Majnemer17f448b2015-06-28 04:23:33 +00002363bool Generic_GCC::isPICDefaultForced() const {
2364 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2365}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002366
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002367bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002368 switch (getTriple().getArch()) {
2369 case llvm::Triple::x86:
2370 case llvm::Triple::x86_64:
2371 case llvm::Triple::aarch64:
2372 case llvm::Triple::aarch64_be:
2373 case llvm::Triple::arm:
2374 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002375 case llvm::Triple::bpfel:
2376 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002377 case llvm::Triple::thumb:
2378 case llvm::Triple::thumbeb:
2379 case llvm::Triple::ppc:
2380 case llvm::Triple::ppc64:
2381 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002382 case llvm::Triple::systemz:
Daniel Sanderse160f832016-05-14 12:43:08 +00002383 case llvm::Triple::mips:
2384 case llvm::Triple::mipsel:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002385 return true;
2386 default:
2387 return false;
2388 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002389}
2390
James Y Knighta6c9ee72015-10-16 18:46:26 +00002391/// \brief Helper to add the variant paths of a libstdc++ installation.
2392bool Generic_GCC::addLibStdCXXIncludePaths(
2393 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2394 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2395 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2396 if (!getVFS().exists(Base + Suffix))
2397 return false;
2398
2399 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2400
2401 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2402 // that path exists or we have neither a GCC nor target multiarch triple, use
2403 // this vanilla search path.
2404 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2405 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2406 addSystemInclude(DriverArgs, CC1Args,
2407 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2408 } else {
2409 // Otherwise try to use multiarch naming schemes which have normalized the
2410 // triples and put the triple before the suffix.
2411 //
2412 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2413 // the target triple, so we support that here.
2414 addSystemInclude(DriverArgs, CC1Args,
2415 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2416 addSystemInclude(DriverArgs, CC1Args,
2417 Base + "/" + TargetMultiarchTriple + Suffix);
2418 }
2419
2420 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2421 return true;
2422}
2423
Kristof Beylsfb387292014-01-10 13:44:34 +00002424void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2425 ArgStringList &CC1Args) const {
2426 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002427 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002428 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002429 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002430 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002431 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002432 getTriple().getOS() == llvm::Triple::NaCl ||
2433 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2434 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002435
2436 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002437 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002438 CC1Args.push_back("-fuse-init-array");
2439}
2440
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002441/// Mips Toolchain
2442MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2443 const llvm::Triple &Triple,
2444 const ArgList &Args)
2445 : Linux(D, Triple, Args) {
2446 // Select the correct multilib according to the given arguments.
2447 DetectedMultilibs Result;
2448 findMIPSMultilibs(D, Triple, "", Args, Result);
2449 Multilibs = Result.Multilibs;
2450 SelectedMultilib = Result.SelectedMultilib;
2451
2452 // Find out the library suffix based on the ABI.
2453 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2454 getFilePaths().clear();
2455 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2456
2457 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002458 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002459}
2460
2461void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2462 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2463 if (DriverArgs.hasArg(options::OPT_nostdinc))
2464 return;
2465
2466 const Driver &D = getDriver();
2467
2468 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2469 SmallString<128> P(D.ResourceDir);
2470 llvm::sys::path::append(P, "include");
2471 addSystemInclude(DriverArgs, CC1Args, P);
2472 }
2473
2474 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2475 return;
2476
2477 const auto &Callback = Multilibs.includeDirsCallback();
2478 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002479 for (const auto &Path : Callback(SelectedMultilib))
2480 addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
2481 D.getInstalledDir() + Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002482 }
2483}
2484
2485Tool *MipsLLVMToolChain::buildLinker() const {
2486 return new tools::gnutools::Linker(*this);
2487}
2488
2489std::string MipsLLVMToolChain::computeSysRoot() const {
2490 if (!getDriver().SysRoot.empty())
2491 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2492
2493 const std::string InstalledDir(getDriver().getInstalledDir());
2494 std::string SysRootPath =
2495 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2496 if (llvm::sys::fs::exists(SysRootPath))
2497 return SysRootPath;
2498
2499 return std::string();
2500}
2501
2502ToolChain::CXXStdlibType
2503MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2504 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2505 if (A) {
2506 StringRef Value = A->getValue();
2507 if (Value != "libc++")
2508 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2509 << A->getAsString(Args);
2510 }
2511
2512 return ToolChain::CST_Libcxx;
2513}
2514
2515void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2516 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2517 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2518 DriverArgs.hasArg(options::OPT_nostdincxx))
2519 return;
2520
2521 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2522 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2523
2524 const auto &Callback = Multilibs.includeDirsCallback();
2525 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002526 for (std::string Path : Callback(SelectedMultilib)) {
2527 Path = getDriver().getInstalledDir() + Path + "/c++/v1";
2528 if (llvm::sys::fs::exists(Path)) {
2529 addSystemInclude(DriverArgs, CC1Args, Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002530 break;
2531 }
2532 }
2533 }
2534}
2535
2536void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2537 ArgStringList &CmdArgs) const {
2538 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2539 "Only -lc++ (aka libxx) is suported in this toolchain.");
2540
2541 CmdArgs.push_back("-lc++");
2542 CmdArgs.push_back("-lc++abi");
2543 CmdArgs.push_back("-lunwind");
2544}
2545
2546std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2547 StringRef Component,
2548 bool Shared) const {
2549 SmallString<128> Path(getDriver().ResourceDir);
2550 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2551 getOS());
2552 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002553 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002554 return Path.str();
2555}
2556
Tony Linthicum76329bf2011-12-12 21:14:55 +00002557/// Hexagon Toolchain
2558
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002559std::string HexagonToolChain::getHexagonTargetDir(
2560 const std::string &InstalledDir,
2561 const SmallVectorImpl<std::string> &PrefixDirs) const {
2562 std::string InstallRelDir;
2563 const Driver &D = getDriver();
2564
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002565 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002566 for (auto &I : PrefixDirs)
2567 if (D.getVFS().exists(I))
2568 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00002569
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002570 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002571 return InstallRelDir;
2572
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002573 return InstallRelDir;
2574}
2575
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002576Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
2577 const ArgList &Args) {
2578 StringRef Gn = "";
2579 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
2580 options::OPT_msmall_data_threshold_EQ)) {
2581 Gn = A->getValue();
2582 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
2583 options::OPT_fPIC)) {
2584 Gn = "0";
2585 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002586
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002587 unsigned G;
2588 if (!Gn.getAsInteger(10, G))
2589 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002590
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002591 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002592}
2593
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002594void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
2595 ToolChain::path_list &LibPaths) const {
2596 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00002597
2598 //----------------------------------------------------------------------------
2599 // -L Args
2600 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002601 for (Arg *A : Args.filtered(options::OPT_L))
2602 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002603 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002604
2605 //----------------------------------------------------------------------------
2606 // Other standard paths
2607 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002608 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00002609 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
2610 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00002611
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002612 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2613 D.PrefixDirs);
2614 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
2615 RootDirs.push_back(TargetDir);
2616
2617 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
2618 // Assume G0 with -shared.
2619 bool HasG0 = Args.hasArg(options::OPT_shared);
2620 if (auto G = getSmallDataThreshold(Args))
2621 HasG0 = G.getValue() == 0;
2622
2623 const std::string CpuVer = GetTargetCPUVersion(Args).str();
2624 for (auto &Dir : RootDirs) {
2625 std::string LibDir = Dir + "/hexagon/lib";
2626 std::string LibDirCpu = LibDir + '/' + CpuVer;
2627 if (HasG0) {
2628 if (HasPIC)
2629 LibPaths.push_back(LibDirCpu + "/G0/pic");
2630 LibPaths.push_back(LibDirCpu + "/G0");
2631 }
2632 LibPaths.push_back(LibDirCpu);
2633 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00002634 }
Matthew Curtise689b052012-12-06 15:46:07 +00002635}
2636
Douglas Katzman54366072015-07-27 16:53:08 +00002637HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002638 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002639 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002640 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2641 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002642
2643 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2644 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002645 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002646 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002647 getProgramPaths().push_back(BinDir);
2648
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002649 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002650
2651 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2652 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2653 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002654 LibPaths.clear();
2655 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002656}
2657
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002658HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002659
Douglas Katzman54366072015-07-27 16:53:08 +00002660Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002661 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002662}
2663
Douglas Katzman54366072015-07-27 16:53:08 +00002664Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002665 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002666}
2667
Douglas Katzman54366072015-07-27 16:53:08 +00002668void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2669 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002670 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2671 DriverArgs.hasArg(options::OPT_nostdlibinc))
2672 return;
2673
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002674 const Driver &D = getDriver();
2675 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2676 D.PrefixDirs);
2677 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002678}
2679
Douglas Katzman54366072015-07-27 16:53:08 +00002680void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2681 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002682 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2683 DriverArgs.hasArg(options::OPT_nostdincxx))
2684 return;
2685
2686 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002687 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
2688 addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002689}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002690
Matthew Curtise689b052012-12-06 15:46:07 +00002691ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002692HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002693 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2694 if (!A)
2695 return ToolChain::CST_Libstdcxx;
2696
2697 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002698 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002699 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002700
2701 return ToolChain::CST_Libstdcxx;
2702}
2703
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002704//
2705// Returns the default CPU for Hexagon. This is the default compilation target
2706// if no Hexagon processor is selected at the command-line.
2707//
2708const StringRef HexagonToolChain::GetDefaultCPU() {
2709 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002710}
2711
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002712const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
2713 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00002714 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
2715 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002716
2717 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
2718 if (CPU.startswith("hexagon"))
2719 return CPU.substr(sizeof("hexagon") - 1);
2720 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002721}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002722// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002723
Tom Stellard8fa33092015-07-18 01:49:05 +00002724/// AMDGPU Toolchain
2725AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2726 const ArgList &Args)
2727 : Generic_ELF(D, Triple, Args) { }
2728
2729Tool *AMDGPUToolChain::buildLinker() const {
2730 return new tools::amdgpu::Linker(*this);
2731}
2732// End AMDGPU
2733
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002734/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002735NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2736 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002737 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002738
2739 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2740 // default paths, and must instead only use the paths provided
2741 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002742 path_list &file_paths = getFilePaths();
2743 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002744
2745 file_paths.clear();
2746 prog_paths.clear();
2747
2748 // Path for library files (libc.a, ...)
2749 std::string FilePath(getDriver().Dir + "/../");
2750
2751 // Path for tools (clang, ld, etc..)
2752 std::string ProgPath(getDriver().Dir + "/../");
2753
2754 // Path for toolchain libraries (libgcc.a, ...)
2755 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2756
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002757 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002758 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002759 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002760 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002761 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2762 file_paths.push_back(ToolPath + "i686-nacl");
2763 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002764 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002765 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2766 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2767 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2768 file_paths.push_back(ToolPath + "x86_64-nacl");
2769 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002770 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002771 file_paths.push_back(FilePath + "arm-nacl/lib");
2772 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2773 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2774 file_paths.push_back(ToolPath + "arm-nacl");
2775 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002776 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002777 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2778 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2779 prog_paths.push_back(ProgPath + "bin");
2780 file_paths.push_back(ToolPath + "mipsel-nacl");
2781 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002782 default:
2783 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002784 }
2785
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002786 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2787}
2788
Douglas Katzman54366072015-07-27 16:53:08 +00002789void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2790 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002791 const Driver &D = getDriver();
2792 if (DriverArgs.hasArg(options::OPT_nostdinc))
2793 return;
2794
2795 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2796 SmallString<128> P(D.ResourceDir);
2797 llvm::sys::path::append(P, "include");
2798 addSystemInclude(DriverArgs, CC1Args, P.str());
2799 }
2800
2801 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2802 return;
2803
2804 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002805 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002806 case llvm::Triple::x86:
2807 // x86 is special because multilib style uses x86_64-nacl/include for libc
2808 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2809 // have the same substring.
2810 llvm::sys::path::append(P, "i686-nacl/usr/include");
2811 addSystemInclude(DriverArgs, CC1Args, P.str());
2812 llvm::sys::path::remove_filename(P);
2813 llvm::sys::path::remove_filename(P);
2814 llvm::sys::path::remove_filename(P);
2815 llvm::sys::path::append(P, "x86_64-nacl/include");
2816 addSystemInclude(DriverArgs, CC1Args, P.str());
2817 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002818 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002819 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002820 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002821 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002822 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002823 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002824 case llvm::Triple::mipsel:
2825 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2826 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002827 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002828 return;
2829 }
2830
2831 addSystemInclude(DriverArgs, CC1Args, P.str());
2832 llvm::sys::path::remove_filename(P);
2833 llvm::sys::path::remove_filename(P);
2834 llvm::sys::path::append(P, "include");
2835 addSystemInclude(DriverArgs, CC1Args, P.str());
2836}
2837
Douglas Katzman54366072015-07-27 16:53:08 +00002838void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2839 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002840 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2841 // if the value is libc++, and emits an error for other values.
2842 GetCXXStdlibType(Args);
2843 CmdArgs.push_back("-lc++");
2844}
2845
Douglas Katzman54366072015-07-27 16:53:08 +00002846void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2847 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002848 const Driver &D = getDriver();
2849 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2850 DriverArgs.hasArg(options::OPT_nostdincxx))
2851 return;
2852
2853 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2854 // if the value is libc++, and emits an error for other values.
2855 GetCXXStdlibType(DriverArgs);
2856
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002857 SmallString<128> P(D.Dir + "/../");
2858 switch (getTriple().getArch()) {
2859 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002860 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2861 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002862 break;
2863 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002864 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2865 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002866 break;
2867 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002868 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2869 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002870 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002871 case llvm::Triple::mipsel:
2872 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2873 addSystemInclude(DriverArgs, CC1Args, P.str());
2874 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002875 default:
2876 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002877 }
2878}
2879
Douglas Katzman54366072015-07-27 16:53:08 +00002880ToolChain::CXXStdlibType
2881NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002882 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2883 StringRef Value = A->getValue();
2884 if (Value == "libc++")
2885 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002886 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002887 }
2888
2889 return ToolChain::CST_Libcxx;
2890}
2891
Douglas Katzman54366072015-07-27 16:53:08 +00002892std::string
2893NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2894 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002895 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2896 if (TheTriple.getArch() == llvm::Triple::arm &&
2897 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2898 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2899 return TheTriple.getTriple();
2900}
2901
Douglas Katzman54366072015-07-27 16:53:08 +00002902Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002903 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002904}
2905
Douglas Katzman54366072015-07-27 16:53:08 +00002906Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002907 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002908 return new tools::nacltools::AssemblerARM(*this);
2909 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002910}
2911// End NaCl
2912
Chris Lattner09797542010-03-04 21:07:38 +00002913/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2914/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2915/// Currently does not support anything else but compilation.
2916
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002917TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002918 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002919 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002920 // Path mangling to find libexec
2921 std::string Path(getDriver().Dir);
2922
2923 Path += "/../libexec";
2924 getProgramPaths().push_back(Path);
2925}
2926
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002927TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002928
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002929bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002930
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002931bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002932
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002933bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002934
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002935bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002936
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002937// CloudABI - CloudABI tool chain which can call ld(1) directly.
2938
2939CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2940 const ArgList &Args)
2941 : Generic_ELF(D, Triple, Args) {
2942 SmallString<128> P(getDriver().Dir);
2943 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2944 getFilePaths().push_back(P.str());
2945}
2946
2947void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2948 ArgStringList &CC1Args) const {
2949 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2950 DriverArgs.hasArg(options::OPT_nostdincxx))
2951 return;
2952
2953 SmallString<128> P(getDriver().Dir);
2954 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2955 addSystemInclude(DriverArgs, CC1Args, P.str());
2956}
2957
2958void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2959 ArgStringList &CmdArgs) const {
2960 CmdArgs.push_back("-lc++");
2961 CmdArgs.push_back("-lc++abi");
2962 CmdArgs.push_back("-lunwind");
2963}
2964
Douglas Katzman95354292015-06-23 20:42:09 +00002965Tool *CloudABI::buildLinker() const {
2966 return new tools::cloudabi::Linker(*this);
2967}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002968
Ed Schouten51bfbe72016-02-17 18:56:20 +00002969SanitizerMask CloudABI::getSupportedSanitizers() const {
2970 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2971 Res |= SanitizerKind::SafeStack;
2972 return Res;
2973}
2974
Ed Schoutenfc79d2c2016-03-29 21:13:53 +00002975SanitizerMask CloudABI::getDefaultSanitizers() const {
2976 return SanitizerKind::SafeStack;
2977}
2978
Reid Kleckner330fb172016-05-11 16:19:05 +00002979/// Haiku - Haiku tool chain which can call as(1) and ld(1) directly.
2980
2981Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2982 : Generic_ELF(D, Triple, Args) {
2983
2984}
2985
2986void Haiku::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2987 ArgStringList &CC1Args) const {
2988 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2989 DriverArgs.hasArg(options::OPT_nostdincxx))
2990 return;
2991
2992 switch (GetCXXStdlibType(DriverArgs)) {
2993 case ToolChain::CST_Libcxx:
2994 addSystemInclude(DriverArgs, CC1Args,
2995 getDriver().SysRoot + "/system/develop/headers/c++/v1");
2996 break;
2997 case ToolChain::CST_Libstdcxx:
2998 addSystemInclude(DriverArgs, CC1Args,
2999 getDriver().SysRoot + "/system/develop/headers/c++");
3000 addSystemInclude(DriverArgs, CC1Args,
3001 getDriver().SysRoot + "/system/develop/headers/c++/backward");
3002
3003 StringRef Triple = getTriple().str();
3004 addSystemInclude(DriverArgs, CC1Args,
3005 getDriver().SysRoot + "/system/develop/headers/c++/" +
3006 Triple);
3007 break;
3008 }
3009}
3010
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003011/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3012
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003013OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3014 const ArgList &Args)
3015 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003016 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003017 getFilePaths().push_back("/usr/lib");
3018}
3019
Rafael Espindola7cf32212013-03-20 03:05:54 +00003020Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003021 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003022}
3023
Douglas Katzman95354292015-06-23 20:42:09 +00003024Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003025
Eli Friedman9fa28852012-08-08 23:57:20 +00003026/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3027
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003028Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3029 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003030 getFilePaths().push_back(getDriver().Dir + "/../lib");
3031 getFilePaths().push_back("/usr/lib");
3032}
3033
Rafael Espindola7cf32212013-03-20 03:05:54 +00003034Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003035 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003036}
3037
Douglas Katzman95354292015-06-23 20:42:09 +00003038Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003039
Jonas Hahnfeldaae83742016-02-12 07:48:37 +00003040ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
Richard Smith51af5192014-05-01 23:24:24 +00003041 return ToolChain::CST_Libcxx;
3042}
3043
Eli Friedman9fa28852012-08-08 23:57:20 +00003044void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3045 ArgStringList &CC1Args) const {
3046 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3047 DriverArgs.hasArg(options::OPT_nostdincxx))
3048 return;
3049
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003050 switch (GetCXXStdlibType(DriverArgs)) {
3051 case ToolChain::CST_Libcxx:
3052 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003053 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003054 break;
3055 case ToolChain::CST_Libstdcxx:
3056 addSystemInclude(DriverArgs, CC1Args,
3057 getDriver().SysRoot + "/usr/include/c++/stdc++");
3058 addSystemInclude(DriverArgs, CC1Args,
3059 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003060
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003061 StringRef Triple = getTriple().str();
3062 if (Triple.startswith("amd64"))
3063 addSystemInclude(DriverArgs, CC1Args,
3064 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003065 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003066 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003067 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3068 "/usr/include/c++/stdc++/" +
3069 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003070 break;
3071 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003072}
3073
3074void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3075 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003076 switch (GetCXXStdlibType(Args)) {
3077 case ToolChain::CST_Libcxx:
3078 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003079 CmdArgs.push_back("-lc++abi");
3080 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003081 break;
3082 case ToolChain::CST_Libstdcxx:
3083 CmdArgs.push_back("-lstdc++");
3084 break;
3085 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003086}
3087
Daniel Dunbare24297c2009-03-30 21:06:03 +00003088/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3089
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003090FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3091 const ArgList &Args)
3092 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003093
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003094 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3095 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003096 if ((Triple.getArch() == llvm::Triple::x86 ||
3097 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003098 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003099 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3100 else
3101 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003102}
3103
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003104ToolChain::CXXStdlibType FreeBSD::GetDefaultCXXStdlibType() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003105 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003106 return ToolChain::CST_Libcxx;
3107 return ToolChain::CST_Libstdcxx;
3108}
3109
3110void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3111 ArgStringList &CC1Args) const {
3112 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3113 DriverArgs.hasArg(options::OPT_nostdincxx))
3114 return;
3115
3116 switch (GetCXXStdlibType(DriverArgs)) {
3117 case ToolChain::CST_Libcxx:
3118 addSystemInclude(DriverArgs, CC1Args,
3119 getDriver().SysRoot + "/usr/include/c++/v1");
3120 break;
3121 case ToolChain::CST_Libstdcxx:
3122 addSystemInclude(DriverArgs, CC1Args,
3123 getDriver().SysRoot + "/usr/include/c++/4.2");
3124 addSystemInclude(DriverArgs, CC1Args,
3125 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3126 break;
3127 }
3128}
3129
Dimitry Andric60907392016-02-14 16:08:20 +00003130void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3131 ArgStringList &CmdArgs) const {
3132 CXXStdlibType Type = GetCXXStdlibType(Args);
3133 bool Profiling = Args.hasArg(options::OPT_pg);
3134
3135 switch (Type) {
3136 case ToolChain::CST_Libcxx:
3137 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3138 break;
3139
3140 case ToolChain::CST_Libstdcxx:
3141 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3142 break;
3143 }
3144}
3145
Rafael Espindola7cf32212013-03-20 03:05:54 +00003146Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003147 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003148}
3149
Douglas Katzman95354292015-06-23 20:42:09 +00003150Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003151
Tim Northovere931f9f2015-10-30 16:30:41 +00003152bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003153 // FreeBSD uses SjLj exceptions on ARM oabi.
3154 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003155 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003156 case llvm::Triple::GNUEABI:
3157 case llvm::Triple::EABI:
3158 return false;
3159
3160 default:
3161 return (getTriple().getArch() == llvm::Triple::arm ||
3162 getTriple().getArch() == llvm::Triple::thumb);
3163 }
3164}
3165
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003166bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003167
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003168bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003169
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003170SanitizerMask FreeBSD::getSupportedSanitizers() const {
3171 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3172 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3173 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3174 getTriple().getArch() == llvm::Triple::mips64el;
3175 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3176 Res |= SanitizerKind::Address;
3177 Res |= SanitizerKind::Vptr;
3178 if (IsX86_64 || IsMIPS64) {
3179 Res |= SanitizerKind::Leak;
3180 Res |= SanitizerKind::Thread;
3181 }
3182 if (IsX86 || IsX86_64) {
3183 Res |= SanitizerKind::SafeStack;
3184 }
3185 return Res;
3186}
3187
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003188/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3189
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003190NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3191 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003192 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003193 // When targeting a 32-bit platform, try the special directory used on
3194 // 64-bit hosts, and only fall back to the main library directory if that
3195 // doesn't work.
3196 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3197 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003198 switch (Triple.getArch()) {
3199 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003200 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003201 break;
3202 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003203 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003204 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003205 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003206 switch (Triple.getEnvironment()) {
3207 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003208 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003209 getFilePaths().push_back("=/usr/lib/eabi");
3210 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003211 case llvm::Triple::EABIHF:
3212 case llvm::Triple::GNUEABIHF:
3213 getFilePaths().push_back("=/usr/lib/eabihf");
3214 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003215 default:
3216 getFilePaths().push_back("=/usr/lib/oabi");
3217 break;
3218 }
3219 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003220 case llvm::Triple::mips64:
3221 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003222 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003223 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003224 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003225 getFilePaths().push_back("=/usr/lib/64");
3226 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003227 case llvm::Triple::ppc:
3228 getFilePaths().push_back("=/usr/lib/powerpc");
3229 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003230 case llvm::Triple::sparc:
3231 getFilePaths().push_back("=/usr/lib/sparc");
3232 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003233 default:
3234 break;
3235 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003236
3237 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003238 }
3239}
3240
Rafael Espindola7cf32212013-03-20 03:05:54 +00003241Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003242 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003243}
3244
Douglas Katzman95354292015-06-23 20:42:09 +00003245Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003246
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003247ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const {
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003248 unsigned Major, Minor, Micro;
3249 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003250 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003251 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003252 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003253 case llvm::Triple::arm:
3254 case llvm::Triple::armeb:
3255 case llvm::Triple::thumb:
3256 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003257 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003258 case llvm::Triple::ppc64:
3259 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003260 case llvm::Triple::sparc:
3261 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003262 case llvm::Triple::x86:
3263 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003264 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003265 default:
3266 break;
3267 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003268 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003269 return ToolChain::CST_Libstdcxx;
3270}
3271
3272void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3273 ArgStringList &CC1Args) const {
3274 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3275 DriverArgs.hasArg(options::OPT_nostdincxx))
3276 return;
3277
3278 switch (GetCXXStdlibType(DriverArgs)) {
3279 case ToolChain::CST_Libcxx:
3280 addSystemInclude(DriverArgs, CC1Args,
3281 getDriver().SysRoot + "/usr/include/c++/");
3282 break;
3283 case ToolChain::CST_Libstdcxx:
3284 addSystemInclude(DriverArgs, CC1Args,
3285 getDriver().SysRoot + "/usr/include/g++");
3286 addSystemInclude(DriverArgs, CC1Args,
3287 getDriver().SysRoot + "/usr/include/g++/backward");
3288 break;
3289 }
3290}
3291
Chris Lattner3e2ee142010-07-07 16:01:42 +00003292/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3293
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003294Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3295 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003296 getFilePaths().push_back(getDriver().Dir + "/../lib");
3297 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003298}
3299
Rafael Espindola7cf32212013-03-20 03:05:54 +00003300Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003301 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003302}
3303
Douglas Katzman95354292015-06-23 20:42:09 +00003304Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003305
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003306static void addPathIfExists(const Driver &D, const Twine &Path,
3307 ToolChain::path_list &Paths) {
3308 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003309 Paths.push_back(Path.str());
3310}
3311
David Chisnallf571cde2012-02-15 13:39:01 +00003312/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3313
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003314Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003315 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003316 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003317
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003318 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003319
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003320 path_list &Paths = getFilePaths();
3321 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003322 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003323
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003324 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003325 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003326 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003327
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003328 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003329
3330 std::string LibPath = "/usr/lib/";
3331 switch (Triple.getArch()) {
3332 case llvm::Triple::x86:
3333 case llvm::Triple::sparc:
3334 break;
3335 case llvm::Triple::x86_64:
3336 LibPath += "amd64/";
3337 break;
3338 case llvm::Triple::sparcv9:
3339 LibPath += "sparcv9/";
3340 break;
3341 default:
3342 llvm_unreachable("Unsupported architecture");
3343 }
3344
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003345 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003346}
3347
Rafael Espindola7cf32212013-03-20 03:05:54 +00003348Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003349 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003350}
3351
Douglas Katzman95354292015-06-23 20:42:09 +00003352Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003353
Rafael Espindolad5117262015-09-09 13:36:00 +00003354void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3355 ArgStringList &CC1Args) const {
3356 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3357 DriverArgs.hasArg(options::OPT_nostdincxx))
3358 return;
3359
3360 // Include the support directory for things like xlocale and fudged system
3361 // headers.
3362 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3363
3364 if (GCCInstallation.isValid()) {
3365 GCCVersion Version = GCCInstallation.getVersion();
3366 addSystemInclude(DriverArgs, CC1Args,
3367 getDriver().SysRoot + "/usr/gcc/" +
3368 Version.MajorStr + "." +
3369 Version.MinorStr +
3370 "/include/c++/" + Version.Text);
3371 addSystemInclude(DriverArgs, CC1Args,
3372 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3373 "." + Version.MinorStr + "/include/c++/" +
3374 Version.Text + "/" +
3375 GCCInstallation.getTriple().str());
3376 }
3377}
3378
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003379/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003380
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003381enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003382 // NB: Releases of a particular Linux distro should be kept together
3383 // in this enum, because some tests are done by integer comparison against
3384 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003385 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003386 DebianLenny,
3387 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003388 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003389 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003390 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003391 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003392 RHEL5,
3393 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003394 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003395 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003396 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003397 UbuntuHardy,
3398 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003399 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003400 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003401 UbuntuLucid,
3402 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003403 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003404 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003405 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003406 UbuntuQuantal,
3407 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003408 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003409 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003410 UbuntuUtopic,
3411 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003412 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003413 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003414 UnknownDistro
3415};
3416
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003417static bool IsRedhat(enum Distro Distro) {
Rafael Espindola52fe8962016-05-09 13:13:50 +00003418 return Distro == Fedora || (Distro >= RHEL5 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003419}
3420
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003421static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003422
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003423static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003424 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003425}
3426
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003427static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003428 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003429}
3430
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003431static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003432 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3433 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3434 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003435 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003436 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003437 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003438 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003439 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003440 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3441 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3442 .Case("hardy", UbuntuHardy)
3443 .Case("intrepid", UbuntuIntrepid)
3444 .Case("jaunty", UbuntuJaunty)
3445 .Case("karmic", UbuntuKarmic)
3446 .Case("lucid", UbuntuLucid)
3447 .Case("maverick", UbuntuMaverick)
3448 .Case("natty", UbuntuNatty)
3449 .Case("oneiric", UbuntuOneiric)
3450 .Case("precise", UbuntuPrecise)
3451 .Case("quantal", UbuntuQuantal)
3452 .Case("raring", UbuntuRaring)
3453 .Case("saucy", UbuntuSaucy)
3454 .Case("trusty", UbuntuTrusty)
3455 .Case("utopic", UbuntuUtopic)
3456 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003457 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003458 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003459 .Default(UnknownDistro);
Rafael Espindola52fe8962016-05-09 13:13:50 +00003460 if (Version != UnknownDistro)
3461 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003462 }
3463
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003464 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3465 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003466 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003467 if (Data.startswith("Fedora release"))
3468 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003469 if (Data.startswith("Red Hat Enterprise Linux") ||
Rafael Espindola52fe8962016-05-09 13:13:50 +00003470 Data.startswith("CentOS") ||
3471 Data.startswith("Scientific Linux")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003472 if (Data.find("release 7") != StringRef::npos)
3473 return RHEL7;
3474 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003475 return RHEL6;
3476 else if (Data.find("release 5") != StringRef::npos)
3477 return RHEL5;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003478 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003479 return UnknownDistro;
3480 }
3481
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003482 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3483 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003484 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003485 if (Data[0] == '5')
3486 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003487 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003488 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003489 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003490 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003491 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003492 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003493 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3494 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003495 return UnknownDistro;
3496 }
3497
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003498 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003499 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003500
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003501 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003502 return Exherbo;
3503
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003504 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003505 return ArchLinux;
3506
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003507 return UnknownDistro;
3508}
3509
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003510/// \brief Get our best guess at the multiarch triple for a target.
3511///
3512/// Debian-based systems are starting to use a multiarch setup where they use
3513/// a target-triple directory in the library and header search paths.
3514/// Unfortunately, this triple does not align with the vanilla target triple,
3515/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003516static std::string getMultiarchTriple(const Driver &D,
3517 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003518 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003519 llvm::Triple::EnvironmentType TargetEnvironment =
3520 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003521
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003522 // For most architectures, just use whatever we have rather than trying to be
3523 // clever.
3524 switch (TargetTriple.getArch()) {
3525 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003526 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003527
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003528 // We use the existence of '/lib/<triple>' as a directory to detect some
3529 // common linux triples that don't quite match the Clang triple for both
3530 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3531 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003532 case llvm::Triple::arm:
3533 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003534 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003535 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003536 return "arm-linux-gnueabihf";
3537 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003538 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003539 return "arm-linux-gnueabi";
3540 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003541 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003542 case llvm::Triple::armeb:
3543 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003544 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003545 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003546 return "armeb-linux-gnueabihf";
3547 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003548 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003549 return "armeb-linux-gnueabi";
3550 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003551 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003552 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003553 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003554 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003555 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003556 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003557 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003558 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003559 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003560 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003561 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003562 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003563 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003564 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003565 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003566 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003567 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003568 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003569 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003570 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003571 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003572 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003573 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003574 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003575 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003576 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003577 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003578 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003579 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003580 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003581 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003582 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003583 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003584 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003585 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003586 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003587 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003588 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003589 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003590 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003591 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003592 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003593 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003594 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003595 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003596 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003597 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003598 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003599 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003600 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003601 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003602 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003603 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003604 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003605 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003606 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003607 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003608 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003609 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003610 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003611 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003612 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003613 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003614 return "s390x-linux-gnu";
3615 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003616 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003617 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003618}
3619
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003620static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003621 if (isMipsArch(Triple.getArch())) {
3622 // lib32 directory has a special meaning on MIPS targets.
3623 // It contains N32 ABI binaries. Use this folder if produce
3624 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003625 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003626 return "lib32";
3627 return Triple.isArch32Bit() ? "lib" : "lib64";
3628 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003629
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003630 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003631 // using that variant while targeting other architectures causes problems
3632 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003633 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003634 // them when we know we may need it.
3635 //
3636 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003637 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003638 // GCCInstallationDetector, but that is a more significant refactoring.
3639 if (Triple.getArch() == llvm::Triple::x86 ||
3640 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003641 return "lib32";
3642
Zinovy Nis1db95732014-07-10 15:27:19 +00003643 if (Triple.getArch() == llvm::Triple::x86_64 &&
3644 Triple.getEnvironment() == llvm::Triple::GNUX32)
3645 return "libx32";
3646
Simon Atanasyand4413882012-09-14 11:27:24 +00003647 return Triple.isArch32Bit() ? "lib" : "lib64";
3648}
3649
Rafael Espindola1af7c212012-02-19 01:38:32 +00003650Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003651 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003652 GCCInstallation.init(Triple, Args);
3653 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003654 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003655 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003656 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003657
Rafael Espindola10a63c22013-07-03 14:14:00 +00003658 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003659 // least) put various tools in a triple-prefixed directory off of the parent
3660 // of the GCC installation. We use the GCC triple here to ensure that we end
3661 // up with tools that support the same amount of cross compiling as the
3662 // detected GCC installation. For example, if we find a GCC installation
3663 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3664 // used to target i386.
3665 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003666 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003667 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003668 GCCInstallation.getTriple().str() + "/bin")
3669 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003670
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003671 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003672
Rafael Espindola10a63c22013-07-03 14:14:00 +00003673 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003674 ExtraOpts.push_back("-z");
3675 ExtraOpts.push_back("relro");
3676 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003677
Douglas Gregord9bb1522011-03-06 19:11:49 +00003678 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003679 ExtraOpts.push_back("-X");
3680
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003681 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003682 const bool IsMips = isMipsArch(Arch);
3683
3684 if (IsMips && !SysRoot.empty())
3685 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003686
Chandler Carruth0b842912011-12-09 04:45:18 +00003687 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3688 // and the MIPS ABI require .dynsym to be sorted in different ways.
3689 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3690 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003691 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003692 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003693 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003694 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003695 ExtraOpts.push_back("--hash-style=gnu");
3696
Rafael Espindola10a63c22013-07-03 14:14:00 +00003697 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003698 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3699 ExtraOpts.push_back("--hash-style=both");
3700 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003701
Rafael Espindola52fe8962016-05-09 13:13:50 +00003702 if (IsRedhat(Distro) && Distro != RHEL5 && Distro != RHEL6)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003703 ExtraOpts.push_back("--no-add-needed");
3704
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003705 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindola52fe8962016-05-09 13:13:50 +00003706 (IsRedhat(Distro) && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003707 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003708 ExtraOpts.push_back("--build-id");
3709
Rafael Espindola10a63c22013-07-03 14:14:00 +00003710 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003711 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003712
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003713 // The selection of paths to try here is designed to match the patterns which
3714 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3715 // This was determined by running GCC in a fake filesystem, creating all
3716 // possible permutations of these directories, and seeing which ones it added
3717 // to the link paths.
3718 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003719
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003720 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003721 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003722
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003723 // Add the multilib suffixed paths where they are available.
3724 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003725 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003726 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003727 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003728
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003729 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003730 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003731 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003732 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003733
3734 // GCC cross compiling toolchains will install target libraries which ship
3735 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3736 // any part of the GCC installation in
3737 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3738 // debatable, but is the reality today. We need to search this tree even
3739 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003740 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003741 // installation that is *not* within the system root to ensure two things:
3742 //
3743 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003744 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003745 // appropriate rpath.
3746 // 2) There must not be libraries installed into
3747 // <prefix>/<triple>/<libdir> unless they should be preferred over
3748 // those within the system root.
3749 //
3750 // Note that this matches the GCC behavior. See the below comment for where
3751 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003752 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3753 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003754 Paths);
3755
Chandler Carruth69a125b2012-04-06 16:32:06 +00003756 // If the GCC installation we found is inside of the sysroot, we want to
3757 // prefer libraries installed in the parent prefix of the GCC installation.
3758 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003759 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003760 // This usually happens when there is an external cross compiler on the
3761 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003762 // the cross. Note that GCC does include some of these directories in some
3763 // configurations but this seems somewhere between questionable and simply
3764 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003765 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003766 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3767 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003768 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003769 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003770
3771 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003772 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003773 // those searched.
3774 // FIXME: It's not clear whether we should use the driver's installed
3775 // directory ('Dir' below) or the ResourceDir.
3776 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003777 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3778 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003779 }
3780
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003781 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3782 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3783 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3784 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003785
Chandler Carruthb427c562013-06-22 11:35:51 +00003786 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003787 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003788 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003789 addPathIfExists(D,
3790 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003791 "/../../" + OSLibDir,
3792 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003793
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003794 // Add the 'other' biarch variant path
3795 Multilib BiarchSibling;
3796 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003797 addPathIfExists(D, GCCInstallation.getInstallPath() +
3798 BiarchSibling.gccSuffix(),
3799 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003800 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003801
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003802 // See comments above on the multilib variant for details of why this is
3803 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003804 const std::string &LibPath = GCCInstallation.getParentLibPath();
3805 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3806 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003807 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3808 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003809 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003810
3811 // See comments above on the multilib variant for details of why this is
3812 // only included from within the sysroot.
3813 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003814 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003815 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003816
3817 // Similar to the logic for GCC above, if we are currently running Clang
3818 // inside of the requested system root, add its parent library path to those
3819 // searched.
3820 // FIXME: It's not clear whether we should use the driver's installed
3821 // directory ('Dir' below) or the ResourceDir.
3822 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003823 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003824
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003825 addPathIfExists(D, SysRoot + "/lib", Paths);
3826 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003827}
3828
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003829bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003830
Douglas Katzman95354292015-06-23 20:42:09 +00003831Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003832
3833Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003834 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003835}
3836
Simon Atanasyana0d89572013-10-05 14:37:55 +00003837std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003838 if (!getDriver().SysRoot.empty())
3839 return getDriver().SysRoot;
3840
3841 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3842 return std::string();
3843
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003844 // Standalone MIPS toolchains use different names for sysroot folder
3845 // and put it into different places. Here we try to check some known
3846 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003847
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003848 const StringRef InstallDir = GCCInstallation.getInstallPath();
3849 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003850 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003851
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003852 std::string Path =
3853 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3854 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003855
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003856 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003857 return Path;
3858
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003859 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003860
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003861 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003862 return Path;
3863
3864 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003865}
3866
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00003867std::string Linux::getDynamicLinker(const ArgList &Args) const {
3868 const llvm::Triple::ArchType Arch = getArch();
3869 const llvm::Triple &Triple = getTriple();
3870
3871 if (Triple.isAndroid())
3872 return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker";
3873
3874 switch (Arch) {
3875 default: llvm_unreachable("unsupported architecture");
3876
3877 case llvm::Triple::aarch64:
3878 return "/lib/ld-linux-aarch64.so.1";
3879 case llvm::Triple::aarch64_be:
3880 return "/lib/ld-linux-aarch64_be.so.1";
3881 case llvm::Triple::arm:
3882 case llvm::Triple::thumb:
3883 case llvm::Triple::armeb:
3884 case llvm::Triple::thumbeb: {
3885 const bool IsHardFloat =
3886 Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
3887 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
3888
3889 return IsHardFloat ? "/lib/ld-linux-armhf.so.3" : "/lib/ld-linux.so.3";
3890 }
3891 case llvm::Triple::mips:
3892 case llvm::Triple::mipsel:
3893 case llvm::Triple::mips64:
3894 case llvm::Triple::mips64el: {
3895 bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple);
3896 bool LE = (Triple.getArch() == llvm::Triple::mipsel) ||
3897 (Triple.getArch() == llvm::Triple::mips64el);
3898
3899 std::string LibDir =
3900 "/lib" + tools::mips::getMipsABILibSuffix(Args, Triple);
3901 StringRef LibName;
3902 if (tools::mips::isUCLibc(Args))
3903 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
3904 else if (!Triple.hasEnvironment() &&
3905 Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies)
3906 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
3907 else
3908 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
3909
3910 return (LibDir + "/" + LibName).str();
3911 }
3912 case llvm::Triple::ppc:
3913 return "/lib/ld.so.1";
3914 case llvm::Triple::ppc64:
3915 return (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "/lib64/ld64.so.2"
3916 : "/lib64/ld64.so.1";
3917 case llvm::Triple::ppc64le:
3918 return (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "/lib64/ld64.so.1"
3919 : "/lib64/ld64.so.2";
3920 case llvm::Triple::sparc:
3921 case llvm::Triple::sparcel:
3922 return "/lib/ld-linux.so.2";
3923 case llvm::Triple::sparcv9:
3924 return "/lib64/ld-linux.so.2";
3925 case llvm::Triple::systemz:
3926 return "/lib/ld64.so.1";
3927 case llvm::Triple::x86:
3928 return "/lib/ld-linux.so.2";
3929 case llvm::Triple::x86_64:
3930 return (Triple.getEnvironment() == llvm::Triple::GNUX32)
3931 ? "/libx32/ld-linux-x32.so.2"
3932 : "/lib64/ld-linux-x86-64.so.2";
3933 }
3934}
3935
Chandler Carrutha796f532011-11-05 20:17:13 +00003936void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3937 ArgStringList &CC1Args) const {
3938 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003939 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003940
3941 if (DriverArgs.hasArg(options::OPT_nostdinc))
3942 return;
3943
3944 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003945 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003946
3947 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003948 SmallString<128> P(D.ResourceDir);
3949 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003950 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003951 }
3952
3953 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3954 return;
3955
3956 // Check for configure-time C include directories.
3957 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3958 if (CIncludeDirs != "") {
3959 SmallVector<StringRef, 5> dirs;
3960 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003961 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003962 StringRef Prefix =
3963 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003964 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003965 }
3966 return;
3967 }
3968
3969 // Lacking those, try to detect the correct set of system includes for the
3970 // target triple.
3971
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003972 // Add include directories specific to the selected multilib set and multilib.
3973 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003974 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003975 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00003976 for (const auto &Path : Callback(GCCInstallation.getMultilib()))
3977 addExternCSystemIncludeIfExists(
3978 DriverArgs, CC1Args, GCCInstallation.getInstallPath() + Path);
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003979 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003980 }
3981
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003982 // Implement generic Debian multiarch support.
3983 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003984 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003985
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003986 // FIXME: These are older forms of multiarch. It's not clear that they're
3987 // in use in any released version of Debian, so we should consider
3988 // removing them.
3989 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003990 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003991 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003992
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003993 // FIXME: These are older forms of multiarch. It's not clear that they're
3994 // in use in any released version of Debian, so we should consider
3995 // removing them.
3996 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3997 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003998 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003999 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004000 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004001 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004002 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004003 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004004 const StringRef ARMEBMultiarchIncludeDirs[] = {
4005 "/usr/include/armeb-linux-gnueabi"};
4006 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
4007 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004008 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00004009 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004010 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004011 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004012 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004013 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004014 "/usr/include/mips64el-linux-gnu",
4015 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004016 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004017 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004018 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004019 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004020 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004021 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004022 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004023 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004024 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004025 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004026 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
4027 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004028 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004029 switch (getTriple().getArch()) {
4030 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004031 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004032 break;
4033 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004034 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004035 break;
4036 case llvm::Triple::aarch64:
4037 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00004038 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004039 break;
4040 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004041 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004042 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4043 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
4044 else
4045 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004046 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004047 case llvm::Triple::armeb:
4048 case llvm::Triple::thumbeb:
4049 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4050 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
4051 else
4052 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
4053 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004054 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00004055 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004056 break;
4057 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00004058 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004059 break;
4060 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004061 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004062 break;
4063 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004064 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004065 break;
4066 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004067 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004068 break;
4069 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004070 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004071 break;
4072 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004073 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004074 break;
4075 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004076 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004077 break;
4078 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004079 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004080 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004081 case llvm::Triple::systemz:
4082 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4083 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004084 default:
4085 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004086 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004087 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004088 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004089 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004090 break;
4091 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004092 }
4093
4094 if (getTriple().getOS() == llvm::Triple::RTEMS)
4095 return;
4096
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004097 // Add an include of '/include' directly. This isn't provided by default by
4098 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4099 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004100 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004101
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004102 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004103}
4104
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004105static std::string DetectLibcxxIncludePath(StringRef base) {
4106 std::error_code EC;
4107 int MaxVersion = 0;
4108 std::string MaxVersionString = "";
4109 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4110 LI = LI.increment(EC)) {
4111 StringRef VersionText = llvm::sys::path::filename(LI->path());
4112 int Version;
4113 if (VersionText[0] == 'v' &&
4114 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4115 if (Version > MaxVersion) {
4116 MaxVersion = Version;
4117 MaxVersionString = VersionText;
4118 }
4119 }
4120 }
4121 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4122}
4123
Chandler Carrutha796f532011-11-05 20:17:13 +00004124void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4125 ArgStringList &CC1Args) const {
4126 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4127 DriverArgs.hasArg(options::OPT_nostdincxx))
4128 return;
4129
Chandler Carruthf4701732011-11-07 09:01:17 +00004130 // Check if libc++ has been enabled and provide its include paths if so.
4131 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004132 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004133 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Yaron Keren5439b642016-05-17 19:01:16 +00004134 // If this is a development, non-installed, clang, libcxx will
4135 // not be found at ../include/c++ but it likely to be found at
4136 // one of the following two locations:
4137 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/local/include/c++"),
4138 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++") };
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004139 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004140 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004141 continue;
4142 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004143 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004144 break;
4145 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004146 return;
4147 }
4148
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004149 // We need a detected GCC installation on Linux to provide libstdc++'s
4150 // headers. We handled the libc++ case above.
4151 if (!GCCInstallation.isValid())
4152 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004153
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004154 // By default, look for the C++ headers in an include directory adjacent to
4155 // the lib directory of the GCC installation. Note that this is expect to be
4156 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4157 StringRef LibDir = GCCInstallation.getParentLibPath();
4158 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004159 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004160 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004161 const std::string GCCMultiarchTriple = getMultiarchTriple(
4162 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004163 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004164 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004165 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004166
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004167 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004168 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004169 "/c++/" + Version.Text, TripleStr,
4170 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004171 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004172 return;
4173
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004174 // Otherwise, fall back on a bunch of options which don't use multiarch
4175 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004176 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004177 // Gentoo is weird and places its headers inside the GCC install,
4178 // so if the first attempt to find the headers fails, try these patterns.
Chandler Carruth81296fb2016-05-08 07:59:56 +00004179 InstallDir.str() + "/include/g++-v" + Version.Text,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004180 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4181 Version.MinorStr,
4182 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4183 // Android standalone toolchain has C++ headers in yet another place.
4184 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4185 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4186 // without a subdirectory corresponding to the gcc version.
4187 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004188 };
4189
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004190 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004191 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4192 /*GCCMultiarchTriple*/ "",
4193 /*TargetMultiarchTriple*/ "",
4194 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004195 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004196 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004197}
4198
Artem Belevichfa11ab52015-11-17 22:28:46 +00004199void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4200 ArgStringList &CC1Args) const {
4201 if (DriverArgs.hasArg(options::OPT_nocudainc))
4202 return;
4203
Justin Lebar423019d2016-04-16 00:11:11 +00004204 if (!CudaInstallation.isValid()) {
4205 getDriver().Diag(diag::err_drv_no_cuda_installation);
4206 return;
Artem Belevich86017332015-11-17 22:28:55 +00004207 }
Justin Lebar423019d2016-04-16 00:11:11 +00004208
4209 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
4210 CC1Args.push_back("-include");
4211 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevichfa11ab52015-11-17 22:28:46 +00004212}
4213
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004214bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004215
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004216SanitizerMask Linux::getSupportedSanitizers() const {
4217 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4218 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4219 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4220 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004221 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4222 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004223 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4224 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004225 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4226 Res |= SanitizerKind::Address;
4227 Res |= SanitizerKind::KernelAddress;
4228 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004229 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004230 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004231 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004232 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004233 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004234 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004235 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004236 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004237 Res |= SanitizerKind::Memory;
Derek Bruening256c2e12016-04-21 21:32:04 +00004238 if (IsX86_64)
4239 Res |= SanitizerKind::Efficiency;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004240 if (IsX86 || IsX86_64) {
4241 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004242 }
4243 return Res;
4244}
4245
Xinliang David Li170cd102015-10-27 05:15:35 +00004246void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4247 llvm::opt::ArgStringList &CmdArgs) const {
4248 if (!needsProfileRT(Args)) return;
4249
4250 // Add linker option -u__llvm_runtime_variable to cause runtime
4251 // initialization module to be linked in.
4252 if (!Args.hasArg(options::OPT_coverage))
4253 CmdArgs.push_back(Args.MakeArgString(
4254 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4255 ToolChain::addProfileRTLibs(Args, CmdArgs);
4256}
4257
Daniel Dunbarcc912342009-05-02 18:28:39 +00004258/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4259
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004260DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4261 const ArgList &Args)
4262 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004263
4264 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004265 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004266 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004267 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004268
Daniel Dunbar083edf72009-12-21 18:54:17 +00004269 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004270 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004271 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004272}
4273
Rafael Espindola7cf32212013-03-20 03:05:54 +00004274Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004275 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004276}
4277
4278Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004279 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004280}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004281
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004282/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4283/// which isn't properly a linker but nonetheless performs the step of stitching
4284/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004285
4286CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4287 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004288 : Linux(D, Triple, Args) {
4289 if (CudaInstallation.isValid())
4290 getProgramPaths().push_back(CudaInstallation.getBinPath());
4291}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004292
4293void
4294CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4295 llvm::opt::ArgStringList &CC1Args) const {
4296 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4297 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004298
Justin Lebard3a44f62016-04-05 18:26:20 +00004299 if (DriverArgs.hasFlag(options::OPT_fcuda_flush_denormals_to_zero,
4300 options::OPT_fno_cuda_flush_denormals_to_zero, false))
4301 CC1Args.push_back("-fcuda-flush-denormals-to-zero");
4302
Artem Belevich34f481a2015-11-17 22:28:50 +00004303 if (DriverArgs.hasArg(options::OPT_nocudalib))
4304 return;
4305
4306 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4307 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4308 if (!LibDeviceFile.empty()) {
4309 CC1Args.push_back("-mlink-cuda-bitcode");
4310 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4311
4312 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4313 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4314 // came with CUDA-7.0.
4315 CC1Args.push_back("-target-feature");
4316 CC1Args.push_back("+ptx42");
4317 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004318}
4319
4320llvm::opt::DerivedArgList *
4321CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4322 const char *BoundArch) const {
4323 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4324 const OptTable &Opts = getDriver().getOpts();
4325
4326 for (Arg *A : Args) {
4327 if (A->getOption().matches(options::OPT_Xarch__)) {
4328 // Skip this argument unless the architecture matches BoundArch
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004329 if (!BoundArch || A->getValue(0) != StringRef(BoundArch))
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004330 continue;
4331
4332 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4333 unsigned Prev = Index;
4334 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4335
4336 // If the argument parsing failed or more than one argument was
4337 // consumed, the -Xarch_ argument's parameter tried to consume
4338 // extra arguments. Emit an error and ignore.
4339 //
4340 // We also want to disallow any options which would alter the
4341 // driver behavior; that isn't going to work in our model. We
4342 // use isDriverOption() as an approximation, although things
4343 // like -O4 are going to slip through.
4344 if (!XarchArg || Index > Prev + 1) {
4345 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4346 << A->getAsString(Args);
4347 continue;
4348 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4349 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4350 << A->getAsString(Args);
4351 continue;
4352 }
4353 XarchArg->setBaseArg(A);
4354 A = XarchArg.release();
4355 DAL->AddSynthesizedArg(A);
4356 }
4357 DAL->append(A);
4358 }
4359
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004360 if (BoundArch)
4361 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004362 return DAL;
4363}
4364
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004365Tool *CudaToolChain::buildAssembler() const {
4366 return new tools::NVPTX::Assembler(*this);
4367}
4368
4369Tool *CudaToolChain::buildLinker() const {
4370 return new tools::NVPTX::Linker(*this);
4371}
4372
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004373/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004374XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4375 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004376 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004377 // ProgramPaths are found via 'PATH' environment variable.
4378}
4379
Douglas Katzman54366072015-07-27 16:53:08 +00004380Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004381 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004382}
4383
Douglas Katzman54366072015-07-27 16:53:08 +00004384Tool *XCoreToolChain::buildLinker() const {
4385 return new tools::XCore::Linker(*this);
4386}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004387
Douglas Katzman54366072015-07-27 16:53:08 +00004388bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004389
Douglas Katzman54366072015-07-27 16:53:08 +00004390bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004391
Douglas Katzman54366072015-07-27 16:53:08 +00004392bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004393
Douglas Katzman54366072015-07-27 16:53:08 +00004394bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004395
Douglas Katzman54366072015-07-27 16:53:08 +00004396bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004397
Douglas Katzman54366072015-07-27 16:53:08 +00004398void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4399 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004400 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4401 DriverArgs.hasArg(options::OPT_nostdlibinc))
4402 return;
4403 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4404 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004405 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004406 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4407 ArrayRef<StringRef> DirVec(Dirs);
4408 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4409 }
4410}
4411
Douglas Katzman54366072015-07-27 16:53:08 +00004412void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4413 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004414 CC1Args.push_back("-nostdsysteminc");
4415}
4416
Douglas Katzman54366072015-07-27 16:53:08 +00004417void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4418 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004419 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004420 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4421 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004422 return;
4423 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4424 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004425 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004426 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4427 ArrayRef<StringRef> DirVec(Dirs);
4428 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4429 }
4430}
4431
Douglas Katzman54366072015-07-27 16:53:08 +00004432void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4433 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004434 // We don't output any lib args. This is handled by xcc.
4435}
Douglas Katzman84a75642015-06-19 14:55:19 +00004436
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004437MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4438 const ArgList &Args)
Douglas Katzman5eddc232016-05-09 19:09:59 +00004439 : Generic_ELF(D, Triple, Args) {
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004440 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4441 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4442 // This won't work to find gcc. Instead we give the installation detector an
4443 // extra triple, which is preferable to further hacks of the logic that at
4444 // present is based solely on getArch(). In particular, it would be wrong to
4445 // choose the myriad installation when targeting a non-myriad sparc install.
4446 switch (Triple.getArch()) {
4447 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00004448 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4449 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004450 case llvm::Triple::sparc:
4451 case llvm::Triple::sparcel:
4452 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004453 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004454 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004455
4456 if (GCCInstallation.isValid()) {
4457 // The contents of LibDir are independent of the version of gcc.
4458 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4459 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4460 if (Triple.getArch() == llvm::Triple::sparcel)
4461 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4462 else
4463 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4464 addPathIfExists(D, LibDir, getFilePaths());
4465
4466 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4467 // These files are tied to a particular version of gcc.
4468 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4469 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4470 // but as this toolchain is for LEON sparc, it can assume FPU.
4471 if (Triple.getArch() == llvm::Triple::sparcel)
4472 llvm::sys::path::append(CompilerSupportDir, "le");
4473 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4474 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004475}
4476
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004477MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004478
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004479void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4480 ArgStringList &CC1Args) const {
4481 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4482 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4483}
4484
Eric Christopherefef8ef2015-12-07 22:43:05 +00004485void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4486 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00004487 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4488 DriverArgs.hasArg(options::OPT_nostdincxx))
4489 return;
4490
4491 // Only libstdc++, for now.
4492 StringRef LibDir = GCCInstallation.getParentLibPath();
4493 const GCCVersion &Version = GCCInstallation.getVersion();
4494 StringRef TripleStr = GCCInstallation.getTriple().str();
4495 const Multilib &Multilib = GCCInstallation.getMultilib();
4496
Eric Christopherefef8ef2015-12-07 22:43:05 +00004497 addLibStdCXXIncludePaths(
4498 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4499 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00004500}
4501
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004502// MyriadToolChain handles several triples:
4503// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4504Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4505 // The inherited method works fine if not targeting the SHAVE.
4506 if (!isShaveCompilation(getTriple()))
4507 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004508 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00004509 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00004510 case Action::CompileJobClass:
4511 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004512 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004513 return Compiler.get();
4514 case Action::AssembleJobClass:
4515 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004516 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004517 return Assembler.get();
4518 default:
4519 return ToolChain::getTool(JA.getKind());
4520 }
4521}
4522
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004523Tool *MyriadToolChain::buildLinker() const {
4524 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004525}
Dan Gohmanc2853072015-09-03 22:51:53 +00004526
Dan Gohman52816862015-12-16 23:30:41 +00004527WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
4528 const llvm::opt::ArgList &Args)
4529 : ToolChain(D, Triple, Args) {
Dan Gohman57b62c52016-02-22 19:26:15 +00004530
4531 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
4532 getFilePaths().push_back(
4533 getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64"));
4534
Dan Gohman52816862015-12-16 23:30:41 +00004535 // Use LLD by default.
4536 DefaultLinker = "lld";
4537}
4538
Dan Gohmanc2853072015-09-03 22:51:53 +00004539bool WebAssembly::IsMathErrnoDefault() const { return false; }
4540
4541bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4542
4543bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4544
4545bool WebAssembly::isPICDefault() const { return false; }
4546
4547bool WebAssembly::isPIEDefault() const { return false; }
4548
4549bool WebAssembly::isPICDefaultForced() const { return false; }
4550
4551bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4552
4553// TODO: Support Objective C stuff.
4554bool WebAssembly::SupportsObjCGC() const { return false; }
4555
4556bool WebAssembly::hasBlocksRuntime() const { return false; }
4557
4558// TODO: Support profiling.
4559bool WebAssembly::SupportsProfiling() const { return false; }
4560
Dan Gohman52816862015-12-16 23:30:41 +00004561bool WebAssembly::HasNativeLLVMSupport() const { return true; }
4562
Dan Gohmanc2853072015-09-03 22:51:53 +00004563void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4564 ArgStringList &CC1Args) const {
4565 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4566 options::OPT_fno_use_init_array, true))
4567 CC1Args.push_back("-fuse-init-array");
4568}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004569
Dan Gohman6ad8f612016-01-14 16:00:13 +00004570ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
4571 return ToolChain::RLT_CompilerRT;
4572}
4573
4574ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
4575 return ToolChain::CST_Libcxx;
4576}
4577
4578void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4579 ArgStringList &CC1Args) const {
4580 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4581 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4582}
4583
4584void WebAssembly::AddClangCXXStdlibIncludeArgs(
4585 const llvm::opt::ArgList &DriverArgs,
4586 llvm::opt::ArgStringList &CC1Args) const {
4587 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
4588 !DriverArgs.hasArg(options::OPT_nostdincxx))
4589 addSystemInclude(DriverArgs, CC1Args,
4590 getDriver().SysRoot + "/include/c++/v1");
4591}
4592
Dan Gohman52816862015-12-16 23:30:41 +00004593Tool *WebAssembly::buildLinker() const {
4594 return new tools::wasm::Linker(*this);
4595}
4596
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004597PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4598 : Generic_ELF(D, Triple, Args) {
4599 if (Args.hasArg(options::OPT_static))
4600 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4601
Paul Robinson9d613612016-05-16 17:22:25 +00004602 // Determine where to find the PS4 libraries. We use SCE_ORBIS_SDK_DIR
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004603 // if it exists; otherwise use the driver's installation path, which
4604 // should be <SDK_DIR>/host_tools/bin.
4605
4606 SmallString<512> PS4SDKDir;
Paul Robinson9d613612016-05-16 17:22:25 +00004607 if (const char *EnvValue = getenv("SCE_ORBIS_SDK_DIR")) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004608 if (!llvm::sys::fs::exists(EnvValue))
4609 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4610 PS4SDKDir = EnvValue;
4611 } else {
4612 PS4SDKDir = getDriver().Dir;
4613 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00004614 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004615
Eric Christopherefef8ef2015-12-07 22:43:05 +00004616 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004617 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00004618 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004619 // If -isysroot was passed, use that as the SDK base path.
4620 std::string PrefixDir;
4621 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4622 PrefixDir = A->getValue();
4623 if (!llvm::sys::fs::exists(PrefixDir))
4624 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4625 } else
4626 PrefixDir = PS4SDKDir.str();
4627
4628 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4629 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4630 if (!Args.hasArg(options::OPT_nostdinc) &&
4631 !Args.hasArg(options::OPT_nostdlibinc) &&
4632 !Args.hasArg(options::OPT_isysroot) &&
4633 !Args.hasArg(options::OPT__sysroot_EQ) &&
4634 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4635 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4636 << "PS4 system headers" << PS4SDKIncludeDir;
4637 }
4638
4639 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4640 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4641 if (!Args.hasArg(options::OPT_nostdlib) &&
4642 !Args.hasArg(options::OPT_nodefaultlibs) &&
4643 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4644 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4645 !Args.hasArg(options::OPT_emit_ast) &&
4646 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4647 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4648 << "PS4 system libraries" << PS4SDKLibDir;
4649 return;
4650 }
4651 getFilePaths().push_back(PS4SDKLibDir.str());
4652}
4653
4654Tool *PS4CPU::buildAssembler() const {
4655 return new tools::PS4cpu::Assemble(*this);
4656}
4657
4658Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4659
4660bool PS4CPU::isPICDefault() const { return true; }
4661
4662bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4663
4664SanitizerMask PS4CPU::getSupportedSanitizers() const {
4665 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4666 Res |= SanitizerKind::Address;
4667 Res |= SanitizerKind::Vptr;
4668 return Res;
4669}