blob: 3988c726b2de6f86e12202a6d216938df4c51b14 [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
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001868 // Check for FSF toolchain multilibs
1869 MultilibSet FSFMipsMultilibs;
1870 {
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
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001911 FSFMipsMultilibs =
1912 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
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001963 // Check for Code Sourcery toolchain multilibs
1964 MultilibSet CSMipsMultilibs;
1965 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001966 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001967
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001968 auto MArchMicroMips =
1969 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001970
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001971 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001972
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001973 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001974
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001975 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001976
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001977 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001978
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001979 auto DefaultFloat =
1980 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001981
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001982 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001983
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001984 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001985
1986 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001987 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001988 .gccSuffix("/64")
1989 .includeSuffix("/64")
1990 .flag("+mabi=n64")
1991 .flag("-mabi=n32")
1992 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001993
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001994 CSMipsMultilibs =
1995 MultilibSet()
1996 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1997 .Maybe(UCLibc)
1998 .Either(SoftFloat, Nan2008, DefaultFloat)
1999 .FilterOut("/micromips/nan2008")
2000 .FilterOut("/mips16/nan2008")
2001 .Either(BigEndian, LittleEndian)
2002 .Maybe(MAbi64)
2003 .FilterOut("/mips16.*/64")
2004 .FilterOut("/micromips.*/64")
2005 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002006 .setIncludeDirsCallback([](const Multilib &M) {
2007 std::vector<std::string> Dirs({"/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002008 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
Simon Atanasyana45502d2016-05-19 15:07:21 +00002009 Dirs.push_back(
2010 "/../../../../mips-linux-gnu/libc/uclibc/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002011 else
Simon Atanasyana45502d2016-05-19 15:07:21 +00002012 Dirs.push_back("/../../../../mips-linux-gnu/libc/usr/include");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002013 return Dirs;
2014 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002015 }
2016
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002017 MultilibSet AndroidMipsMultilibs =
2018 MultilibSet()
2019 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
2020 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
2021 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002022
2023 MultilibSet DebianMipsMultilibs;
2024 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002025 Multilib MAbiN32 =
2026 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002027
2028 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002029 .gccSuffix("/64")
2030 .includeSuffix("/64")
2031 .flag("+m64")
2032 .flag("-m32")
2033 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002034
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002035 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002036
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002037 DebianMipsMultilibs =
2038 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002039 }
2040
Daniel Sanders2bf13662014-07-10 14:40:57 +00002041 MultilibSet ImgMultilibs;
2042 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002043 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002044
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002045 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002046
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002047 auto MAbi64 =
2048 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002049
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002050 ImgMultilibs =
2051 MultilibSet()
2052 .Maybe(Mips64r6)
2053 .Maybe(MAbi64)
2054 .Maybe(LittleEndian)
2055 .FilterOut(NonExistent)
Simon Atanasyana45502d2016-05-19 15:07:21 +00002056 .setIncludeDirsCallback([](const Multilib &M) {
2057 return std::vector<std::string>(
2058 {"/include", "/../../../../sysroot/usr/include"});
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002059 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002060 }
2061
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002062 StringRef CPUName;
2063 StringRef ABIName;
2064 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2065
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002066 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2067
2068 Multilib::flags_list Flags;
2069 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2070 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2071 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002072 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002073 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002074 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002075 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002076 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002077 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002078 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2079 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002080 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002081 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002082 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002083 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2084 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002085 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2086 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002087 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002088 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002089 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002090 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002091
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002092 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002093 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00002094 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2095 Result.Multilibs = AndroidMipsMultilibs;
2096 return true;
2097 }
2098 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002099 }
2100
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002101 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2102 TargetTriple.getOS() == llvm::Triple::Linux &&
2103 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2104 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2105 Result.Multilibs = MuslMipsMultilibs;
2106 return true;
2107 }
2108 return false;
2109 }
2110
Daniel Sanders2bf13662014-07-10 14:40:57 +00002111 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2112 TargetTriple.getOS() == llvm::Triple::Linux &&
2113 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2114 // Select mips-img-linux-gnu toolchain.
2115 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
2116 Result.Multilibs = ImgMultilibs;
2117 return true;
2118 }
2119 return false;
2120 }
2121
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002122 // Sort candidates. Toolchain that best meets the directories goes first.
2123 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002124 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
2125 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002126 std::sort(
2127 std::begin(candidates), std::end(candidates),
2128 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2129 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002130 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002131 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002132 Result.BiarchSibling = Multilib();
2133 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002134 return true;
2135 }
2136 }
2137
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002138 {
2139 // Fallback to the regular toolchain-tree structure.
2140 Multilib Default;
2141 Result.Multilibs.push_back(Default);
2142 Result.Multilibs.FilterOut(NonExistent);
2143
2144 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2145 Result.BiarchSibling = Multilib();
2146 return true;
2147 }
2148 }
2149
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002150 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002151}
2152
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002153static bool findBiarchMultilibs(const Driver &D,
2154 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002155 StringRef Path, const ArgList &Args,
2156 bool NeedsBiarchSuffix,
2157 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002158 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2159 // in what would normally be GCCInstallPath and put the 64-bit
2160 // libs in a subdirectory named 64. The simple logic we follow is that
2161 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2162 // we use that. If not, and if not a biarch triple alias, we look for
2163 // crtbegin.o without the subdirectory.
2164
2165 Multilib Default;
2166 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002167 .gccSuffix("/64")
2168 .includeSuffix("/64")
2169 .flag("-m32")
2170 .flag("+m64")
2171 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002172 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002173 .gccSuffix("/32")
2174 .includeSuffix("/32")
2175 .flag("+m32")
2176 .flag("-m64")
2177 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002178 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002179 .gccSuffix("/x32")
2180 .includeSuffix("/x32")
2181 .flag("-m32")
2182 .flag("-m64")
2183 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002184
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002185 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002186
Zinovy Nis1db95732014-07-10 15:27:19 +00002187 // Determine default multilib from: 32, 64, x32
2188 // Also handle cases such as 64 on 32, 32 on 64, etc.
2189 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002190 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002191 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002192 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002193 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002194 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002195 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002196 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002197 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002198 if (TargetTriple.isArch32Bit())
2199 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002200 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002201 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002202 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002203 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002204 }
2205
Zinovy Nis1db95732014-07-10 15:27:19 +00002206 if (Want == WANT32)
2207 Default.flag("+m32").flag("-m64").flag("-mx32");
2208 else if (Want == WANT64)
2209 Default.flag("-m32").flag("+m64").flag("-mx32");
2210 else if (Want == WANTX32)
2211 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002212 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002213 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002214
Simon Atanasyan60280b42014-05-12 07:37:51 +00002215 Result.Multilibs.push_back(Default);
2216 Result.Multilibs.push_back(Alt64);
2217 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002218 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002219
Simon Atanasyan60280b42014-05-12 07:37:51 +00002220 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002221
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002222 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002223 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002224 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002225 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002226
Simon Atanasyan60280b42014-05-12 07:37:51 +00002227 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002228 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002229
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002230 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002231 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002232 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002233
2234 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002235}
2236
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002237void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2238 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2239 const std::string &LibDir, StringRef CandidateTriple,
2240 bool NeedsBiarchSuffix) {
2241 // Solaris is a special case. The GCC installation is under
2242 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2243 // need to iterate twice.
2244 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002245 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2246 !EC && LI != LE; LI = LI.increment(EC)) {
2247 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002248 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2249
2250 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002251 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002252 continue; // Saw this path before; no need to look at it again.
2253 if (CandidateVersion.isOlderThan(4, 1, 1))
2254 continue;
2255 if (CandidateVersion <= Version)
2256 continue;
2257
2258 GCCInstallPath =
2259 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002260 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002261 continue;
2262
2263 // If we make it here there has to be at least one GCC version, let's just
2264 // use the latest one.
2265 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002266 for (vfs::directory_iterator
2267 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2268 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002269 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2270
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002271 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002272 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2273
2274 if (CandidateSubVersion > Version)
2275 Version = CandidateSubVersion;
2276 }
2277
2278 GCCTriple.setTriple(CandidateTriple);
2279
2280 GCCInstallPath += "/" + Version.Text;
2281 GCCParentLibPath = GCCInstallPath + "/../../../../";
2282
2283 IsValid = true;
2284 }
2285}
2286
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002287void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002288 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002289 const std::string &LibDir, StringRef CandidateTriple,
2290 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002291 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002292 // There are various different suffixes involving the triple we
2293 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002294 // up to the lib directory. Specifically, the number of "up" steps
2295 // in the second half of each row is 1 + the number of path separators
2296 // in the first half.
2297 const std::string LibAndInstallSuffixes[][2] = {
2298 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2299
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002300 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002301 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2302
2303 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2304 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002305
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002306 // The Freescale PPC SDK has the gcc libraries in
2307 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002308 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002309
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002310 // Ubuntu has a strange mis-matched pair of triples that this happens to
2311 // match.
2312 // FIXME: It may be worthwhile to generalize this and look for a second
2313 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002314 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2315
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002316 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2317 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2318 NeedsBiarchSuffix);
2319 return;
2320 }
2321
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002322 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002323 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2324 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002325 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002326 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002327 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002328 for (vfs::directory_iterator
2329 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2330 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002331 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002332 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002333 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002334 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002335 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002336 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002337 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002338 continue;
2339 if (CandidateVersion <= Version)
2340 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002341
Simon Atanasyan60280b42014-05-12 07:37:51 +00002342 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002343
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002344 // Debian mips multilibs behave more like the rest of the biarch ones,
2345 // so handle them there
2346 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002347 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002348 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002349 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002350 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002351 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002352 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002353
Simon Atanasyan60280b42014-05-12 07:37:51 +00002354 Multilibs = Detected.Multilibs;
2355 SelectedMultilib = Detected.SelectedMultilib;
2356 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002357 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002358 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002359 // FIXME: We hack together the directory name here instead of
2360 // using LI to ensure stable path separators across Windows and
2361 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002362 GCCInstallPath =
2363 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2364 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002365 IsValid = true;
2366 }
2367 }
2368}
2369
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002370Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002371 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002372 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002373 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002374 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002375 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002376}
2377
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002378Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002379
Rafael Espindola7cf32212013-03-20 03:05:54 +00002380Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002381 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002382 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002383 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002384 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002385 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002386 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002387 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002388 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002389 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002390 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002391 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002392 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002393}
2394
Rafael Espindola7cf32212013-03-20 03:05:54 +00002395Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002396 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002397}
2398
Douglas Katzman95354292015-06-23 20:42:09 +00002399Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002400
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002401void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2402 // Print the information about how we detected the GCC installation.
2403 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002404 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002405}
2406
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002407bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002408 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002409}
2410
David Majnemer17f448b2015-06-28 04:23:33 +00002411bool Generic_GCC::isPICDefault() const {
2412 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2413}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002414
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002415bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002416
David Majnemer17f448b2015-06-28 04:23:33 +00002417bool Generic_GCC::isPICDefaultForced() const {
2418 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2419}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002420
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002421bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002422 switch (getTriple().getArch()) {
2423 case llvm::Triple::x86:
2424 case llvm::Triple::x86_64:
2425 case llvm::Triple::aarch64:
2426 case llvm::Triple::aarch64_be:
2427 case llvm::Triple::arm:
2428 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002429 case llvm::Triple::bpfel:
2430 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002431 case llvm::Triple::thumb:
2432 case llvm::Triple::thumbeb:
2433 case llvm::Triple::ppc:
2434 case llvm::Triple::ppc64:
2435 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002436 case llvm::Triple::systemz:
Daniel Sanderse160f832016-05-14 12:43:08 +00002437 case llvm::Triple::mips:
2438 case llvm::Triple::mipsel:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002439 return true;
2440 default:
2441 return false;
2442 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002443}
2444
James Y Knighta6c9ee72015-10-16 18:46:26 +00002445/// \brief Helper to add the variant paths of a libstdc++ installation.
2446bool Generic_GCC::addLibStdCXXIncludePaths(
2447 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2448 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2449 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2450 if (!getVFS().exists(Base + Suffix))
2451 return false;
2452
2453 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2454
2455 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2456 // that path exists or we have neither a GCC nor target multiarch triple, use
2457 // this vanilla search path.
2458 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2459 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2460 addSystemInclude(DriverArgs, CC1Args,
2461 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2462 } else {
2463 // Otherwise try to use multiarch naming schemes which have normalized the
2464 // triples and put the triple before the suffix.
2465 //
2466 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2467 // the target triple, so we support that here.
2468 addSystemInclude(DriverArgs, CC1Args,
2469 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2470 addSystemInclude(DriverArgs, CC1Args,
2471 Base + "/" + TargetMultiarchTriple + Suffix);
2472 }
2473
2474 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2475 return true;
2476}
2477
Kristof Beylsfb387292014-01-10 13:44:34 +00002478void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2479 ArgStringList &CC1Args) const {
2480 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002481 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002482 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002483 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002484 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002485 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002486 getTriple().getOS() == llvm::Triple::NaCl ||
2487 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2488 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002489
2490 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002491 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002492 CC1Args.push_back("-fuse-init-array");
2493}
2494
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002495/// Mips Toolchain
2496MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2497 const llvm::Triple &Triple,
2498 const ArgList &Args)
2499 : Linux(D, Triple, Args) {
2500 // Select the correct multilib according to the given arguments.
2501 DetectedMultilibs Result;
2502 findMIPSMultilibs(D, Triple, "", Args, Result);
2503 Multilibs = Result.Multilibs;
2504 SelectedMultilib = Result.SelectedMultilib;
2505
2506 // Find out the library suffix based on the ABI.
2507 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2508 getFilePaths().clear();
2509 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2510
2511 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002512 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002513}
2514
2515void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2516 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2517 if (DriverArgs.hasArg(options::OPT_nostdinc))
2518 return;
2519
2520 const Driver &D = getDriver();
2521
2522 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2523 SmallString<128> P(D.ResourceDir);
2524 llvm::sys::path::append(P, "include");
2525 addSystemInclude(DriverArgs, CC1Args, P);
2526 }
2527
2528 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2529 return;
2530
2531 const auto &Callback = Multilibs.includeDirsCallback();
2532 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002533 for (const auto &Path : Callback(SelectedMultilib))
2534 addExternCSystemIncludeIfExists(DriverArgs, CC1Args,
2535 D.getInstalledDir() + Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002536 }
2537}
2538
2539Tool *MipsLLVMToolChain::buildLinker() const {
2540 return new tools::gnutools::Linker(*this);
2541}
2542
2543std::string MipsLLVMToolChain::computeSysRoot() const {
2544 if (!getDriver().SysRoot.empty())
2545 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2546
2547 const std::string InstalledDir(getDriver().getInstalledDir());
2548 std::string SysRootPath =
2549 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2550 if (llvm::sys::fs::exists(SysRootPath))
2551 return SysRootPath;
2552
2553 return std::string();
2554}
2555
2556ToolChain::CXXStdlibType
2557MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2558 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2559 if (A) {
2560 StringRef Value = A->getValue();
2561 if (Value != "libc++")
2562 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2563 << A->getAsString(Args);
2564 }
2565
2566 return ToolChain::CST_Libcxx;
2567}
2568
2569void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2570 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2571 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2572 DriverArgs.hasArg(options::OPT_nostdincxx))
2573 return;
2574
2575 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2576 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2577
2578 const auto &Callback = Multilibs.includeDirsCallback();
2579 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00002580 for (std::string Path : Callback(SelectedMultilib)) {
2581 Path = getDriver().getInstalledDir() + Path + "/c++/v1";
2582 if (llvm::sys::fs::exists(Path)) {
2583 addSystemInclude(DriverArgs, CC1Args, Path);
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002584 break;
2585 }
2586 }
2587 }
2588}
2589
2590void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2591 ArgStringList &CmdArgs) const {
2592 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2593 "Only -lc++ (aka libxx) is suported in this toolchain.");
2594
2595 CmdArgs.push_back("-lc++");
2596 CmdArgs.push_back("-lc++abi");
2597 CmdArgs.push_back("-lunwind");
2598}
2599
2600std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2601 StringRef Component,
2602 bool Shared) const {
2603 SmallString<128> Path(getDriver().ResourceDir);
2604 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2605 getOS());
2606 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002607 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002608 return Path.str();
2609}
2610
Tony Linthicum76329bf2011-12-12 21:14:55 +00002611/// Hexagon Toolchain
2612
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002613std::string HexagonToolChain::getHexagonTargetDir(
2614 const std::string &InstalledDir,
2615 const SmallVectorImpl<std::string> &PrefixDirs) const {
2616 std::string InstallRelDir;
2617 const Driver &D = getDriver();
2618
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002619 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002620 for (auto &I : PrefixDirs)
2621 if (D.getVFS().exists(I))
2622 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00002623
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002624 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002625 return InstallRelDir;
2626
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002627 return InstallRelDir;
2628}
2629
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002630Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
2631 const ArgList &Args) {
2632 StringRef Gn = "";
2633 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
2634 options::OPT_msmall_data_threshold_EQ)) {
2635 Gn = A->getValue();
2636 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
2637 options::OPT_fPIC)) {
2638 Gn = "0";
2639 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002640
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002641 unsigned G;
2642 if (!Gn.getAsInteger(10, G))
2643 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002644
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002645 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002646}
2647
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002648void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
2649 ToolChain::path_list &LibPaths) const {
2650 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00002651
2652 //----------------------------------------------------------------------------
2653 // -L Args
2654 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002655 for (Arg *A : Args.filtered(options::OPT_L))
2656 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002657 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002658
2659 //----------------------------------------------------------------------------
2660 // Other standard paths
2661 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002662 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00002663 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
2664 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00002665
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002666 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2667 D.PrefixDirs);
2668 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
2669 RootDirs.push_back(TargetDir);
2670
2671 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
2672 // Assume G0 with -shared.
2673 bool HasG0 = Args.hasArg(options::OPT_shared);
2674 if (auto G = getSmallDataThreshold(Args))
2675 HasG0 = G.getValue() == 0;
2676
2677 const std::string CpuVer = GetTargetCPUVersion(Args).str();
2678 for (auto &Dir : RootDirs) {
2679 std::string LibDir = Dir + "/hexagon/lib";
2680 std::string LibDirCpu = LibDir + '/' + CpuVer;
2681 if (HasG0) {
2682 if (HasPIC)
2683 LibPaths.push_back(LibDirCpu + "/G0/pic");
2684 LibPaths.push_back(LibDirCpu + "/G0");
2685 }
2686 LibPaths.push_back(LibDirCpu);
2687 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00002688 }
Matthew Curtise689b052012-12-06 15:46:07 +00002689}
2690
Douglas Katzman54366072015-07-27 16:53:08 +00002691HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002692 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002693 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002694 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2695 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002696
2697 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2698 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002699 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002700 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002701 getProgramPaths().push_back(BinDir);
2702
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002703 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002704
2705 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2706 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2707 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002708 LibPaths.clear();
2709 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002710}
2711
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002712HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002713
Douglas Katzman54366072015-07-27 16:53:08 +00002714Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002715 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002716}
2717
Douglas Katzman54366072015-07-27 16:53:08 +00002718Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002719 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002720}
2721
Douglas Katzman54366072015-07-27 16:53:08 +00002722void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2723 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002724 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2725 DriverArgs.hasArg(options::OPT_nostdlibinc))
2726 return;
2727
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002728 const Driver &D = getDriver();
2729 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2730 D.PrefixDirs);
2731 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002732}
2733
Douglas Katzman54366072015-07-27 16:53:08 +00002734void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2735 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002736 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2737 DriverArgs.hasArg(options::OPT_nostdincxx))
2738 return;
2739
2740 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002741 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
2742 addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002743}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002744
Matthew Curtise689b052012-12-06 15:46:07 +00002745ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002746HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002747 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2748 if (!A)
2749 return ToolChain::CST_Libstdcxx;
2750
2751 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002752 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002753 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002754
2755 return ToolChain::CST_Libstdcxx;
2756}
2757
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002758//
2759// Returns the default CPU for Hexagon. This is the default compilation target
2760// if no Hexagon processor is selected at the command-line.
2761//
2762const StringRef HexagonToolChain::GetDefaultCPU() {
2763 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002764}
2765
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002766const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
2767 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00002768 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
2769 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002770
2771 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
2772 if (CPU.startswith("hexagon"))
2773 return CPU.substr(sizeof("hexagon") - 1);
2774 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002775}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002776// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002777
Tom Stellard8fa33092015-07-18 01:49:05 +00002778/// AMDGPU Toolchain
2779AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2780 const ArgList &Args)
2781 : Generic_ELF(D, Triple, Args) { }
2782
2783Tool *AMDGPUToolChain::buildLinker() const {
2784 return new tools::amdgpu::Linker(*this);
2785}
2786// End AMDGPU
2787
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002788/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002789NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2790 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002791 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002792
2793 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2794 // default paths, and must instead only use the paths provided
2795 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002796 path_list &file_paths = getFilePaths();
2797 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002798
2799 file_paths.clear();
2800 prog_paths.clear();
2801
2802 // Path for library files (libc.a, ...)
2803 std::string FilePath(getDriver().Dir + "/../");
2804
2805 // Path for tools (clang, ld, etc..)
2806 std::string ProgPath(getDriver().Dir + "/../");
2807
2808 // Path for toolchain libraries (libgcc.a, ...)
2809 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2810
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002811 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002812 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002813 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002814 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002815 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2816 file_paths.push_back(ToolPath + "i686-nacl");
2817 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002818 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002819 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2820 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2821 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2822 file_paths.push_back(ToolPath + "x86_64-nacl");
2823 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002824 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002825 file_paths.push_back(FilePath + "arm-nacl/lib");
2826 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2827 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2828 file_paths.push_back(ToolPath + "arm-nacl");
2829 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002830 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002831 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2832 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2833 prog_paths.push_back(ProgPath + "bin");
2834 file_paths.push_back(ToolPath + "mipsel-nacl");
2835 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002836 default:
2837 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002838 }
2839
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002840 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2841}
2842
Douglas Katzman54366072015-07-27 16:53:08 +00002843void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2844 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002845 const Driver &D = getDriver();
2846 if (DriverArgs.hasArg(options::OPT_nostdinc))
2847 return;
2848
2849 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2850 SmallString<128> P(D.ResourceDir);
2851 llvm::sys::path::append(P, "include");
2852 addSystemInclude(DriverArgs, CC1Args, P.str());
2853 }
2854
2855 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2856 return;
2857
2858 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002859 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002860 case llvm::Triple::x86:
2861 // x86 is special because multilib style uses x86_64-nacl/include for libc
2862 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2863 // have the same substring.
2864 llvm::sys::path::append(P, "i686-nacl/usr/include");
2865 addSystemInclude(DriverArgs, CC1Args, P.str());
2866 llvm::sys::path::remove_filename(P);
2867 llvm::sys::path::remove_filename(P);
2868 llvm::sys::path::remove_filename(P);
2869 llvm::sys::path::append(P, "x86_64-nacl/include");
2870 addSystemInclude(DriverArgs, CC1Args, P.str());
2871 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002872 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002873 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002874 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002875 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002876 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002877 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002878 case llvm::Triple::mipsel:
2879 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2880 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002881 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002882 return;
2883 }
2884
2885 addSystemInclude(DriverArgs, CC1Args, P.str());
2886 llvm::sys::path::remove_filename(P);
2887 llvm::sys::path::remove_filename(P);
2888 llvm::sys::path::append(P, "include");
2889 addSystemInclude(DriverArgs, CC1Args, P.str());
2890}
2891
Douglas Katzman54366072015-07-27 16:53:08 +00002892void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2893 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002894 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2895 // if the value is libc++, and emits an error for other values.
2896 GetCXXStdlibType(Args);
2897 CmdArgs.push_back("-lc++");
2898}
2899
Douglas Katzman54366072015-07-27 16:53:08 +00002900void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2901 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002902 const Driver &D = getDriver();
2903 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2904 DriverArgs.hasArg(options::OPT_nostdincxx))
2905 return;
2906
2907 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2908 // if the value is libc++, and emits an error for other values.
2909 GetCXXStdlibType(DriverArgs);
2910
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002911 SmallString<128> P(D.Dir + "/../");
2912 switch (getTriple().getArch()) {
2913 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002914 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2915 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002916 break;
2917 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002918 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2919 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002920 break;
2921 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002922 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2923 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002924 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002925 case llvm::Triple::mipsel:
2926 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2927 addSystemInclude(DriverArgs, CC1Args, P.str());
2928 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002929 default:
2930 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002931 }
2932}
2933
Douglas Katzman54366072015-07-27 16:53:08 +00002934ToolChain::CXXStdlibType
2935NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002936 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2937 StringRef Value = A->getValue();
2938 if (Value == "libc++")
2939 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002940 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002941 }
2942
2943 return ToolChain::CST_Libcxx;
2944}
2945
Douglas Katzman54366072015-07-27 16:53:08 +00002946std::string
2947NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2948 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002949 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2950 if (TheTriple.getArch() == llvm::Triple::arm &&
2951 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2952 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2953 return TheTriple.getTriple();
2954}
2955
Douglas Katzman54366072015-07-27 16:53:08 +00002956Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002957 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002958}
2959
Douglas Katzman54366072015-07-27 16:53:08 +00002960Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002961 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002962 return new tools::nacltools::AssemblerARM(*this);
2963 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002964}
2965// End NaCl
2966
Chris Lattner09797542010-03-04 21:07:38 +00002967/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2968/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2969/// Currently does not support anything else but compilation.
2970
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002971TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002972 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002973 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002974 // Path mangling to find libexec
2975 std::string Path(getDriver().Dir);
2976
2977 Path += "/../libexec";
2978 getProgramPaths().push_back(Path);
2979}
2980
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002981TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002982
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002983bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002984
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002985bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002986
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002987bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002988
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002989bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002990
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002991// CloudABI - CloudABI tool chain which can call ld(1) directly.
2992
2993CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2994 const ArgList &Args)
2995 : Generic_ELF(D, Triple, Args) {
2996 SmallString<128> P(getDriver().Dir);
2997 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2998 getFilePaths().push_back(P.str());
2999}
3000
3001void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3002 ArgStringList &CC1Args) const {
3003 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
3004 DriverArgs.hasArg(options::OPT_nostdincxx))
3005 return;
3006
3007 SmallString<128> P(getDriver().Dir);
3008 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
3009 addSystemInclude(DriverArgs, CC1Args, P.str());
3010}
3011
3012void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
3013 ArgStringList &CmdArgs) const {
3014 CmdArgs.push_back("-lc++");
3015 CmdArgs.push_back("-lc++abi");
3016 CmdArgs.push_back("-lunwind");
3017}
3018
Douglas Katzman95354292015-06-23 20:42:09 +00003019Tool *CloudABI::buildLinker() const {
3020 return new tools::cloudabi::Linker(*this);
3021}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003022
Ed Schouten51bfbe72016-02-17 18:56:20 +00003023SanitizerMask CloudABI::getSupportedSanitizers() const {
3024 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3025 Res |= SanitizerKind::SafeStack;
3026 return Res;
3027}
3028
Ed Schoutenfc79d2c2016-03-29 21:13:53 +00003029SanitizerMask CloudABI::getDefaultSanitizers() const {
3030 return SanitizerKind::SafeStack;
3031}
3032
Reid Kleckner330fb172016-05-11 16:19:05 +00003033/// Haiku - Haiku tool chain which can call as(1) and ld(1) directly.
3034
3035Haiku::Haiku(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
3036 : Generic_ELF(D, Triple, Args) {
3037
3038}
3039
3040void Haiku::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3041 ArgStringList &CC1Args) const {
3042 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3043 DriverArgs.hasArg(options::OPT_nostdincxx))
3044 return;
3045
3046 switch (GetCXXStdlibType(DriverArgs)) {
3047 case ToolChain::CST_Libcxx:
3048 addSystemInclude(DriverArgs, CC1Args,
3049 getDriver().SysRoot + "/system/develop/headers/c++/v1");
3050 break;
3051 case ToolChain::CST_Libstdcxx:
3052 addSystemInclude(DriverArgs, CC1Args,
3053 getDriver().SysRoot + "/system/develop/headers/c++");
3054 addSystemInclude(DriverArgs, CC1Args,
3055 getDriver().SysRoot + "/system/develop/headers/c++/backward");
3056
3057 StringRef Triple = getTriple().str();
3058 addSystemInclude(DriverArgs, CC1Args,
3059 getDriver().SysRoot + "/system/develop/headers/c++/" +
3060 Triple);
3061 break;
3062 }
3063}
3064
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003065/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3066
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003067OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3068 const ArgList &Args)
3069 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003070 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003071 getFilePaths().push_back("/usr/lib");
3072}
3073
Rafael Espindola7cf32212013-03-20 03:05:54 +00003074Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003075 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003076}
3077
Douglas Katzman95354292015-06-23 20:42:09 +00003078Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003079
Eli Friedman9fa28852012-08-08 23:57:20 +00003080/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3081
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003082Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3083 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003084 getFilePaths().push_back(getDriver().Dir + "/../lib");
3085 getFilePaths().push_back("/usr/lib");
3086}
3087
Rafael Espindola7cf32212013-03-20 03:05:54 +00003088Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003089 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003090}
3091
Douglas Katzman95354292015-06-23 20:42:09 +00003092Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003093
Jonas Hahnfeldaae83742016-02-12 07:48:37 +00003094ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
Richard Smith51af5192014-05-01 23:24:24 +00003095 return ToolChain::CST_Libcxx;
3096}
3097
Eli Friedman9fa28852012-08-08 23:57:20 +00003098void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3099 ArgStringList &CC1Args) const {
3100 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3101 DriverArgs.hasArg(options::OPT_nostdincxx))
3102 return;
3103
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003104 switch (GetCXXStdlibType(DriverArgs)) {
3105 case ToolChain::CST_Libcxx:
3106 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003107 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003108 break;
3109 case ToolChain::CST_Libstdcxx:
3110 addSystemInclude(DriverArgs, CC1Args,
3111 getDriver().SysRoot + "/usr/include/c++/stdc++");
3112 addSystemInclude(DriverArgs, CC1Args,
3113 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003114
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003115 StringRef Triple = getTriple().str();
3116 if (Triple.startswith("amd64"))
3117 addSystemInclude(DriverArgs, CC1Args,
3118 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003119 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003120 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003121 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3122 "/usr/include/c++/stdc++/" +
3123 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003124 break;
3125 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003126}
3127
3128void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3129 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003130 switch (GetCXXStdlibType(Args)) {
3131 case ToolChain::CST_Libcxx:
3132 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003133 CmdArgs.push_back("-lc++abi");
3134 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003135 break;
3136 case ToolChain::CST_Libstdcxx:
3137 CmdArgs.push_back("-lstdc++");
3138 break;
3139 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003140}
3141
Daniel Dunbare24297c2009-03-30 21:06:03 +00003142/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3143
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003144FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3145 const ArgList &Args)
3146 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003147
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003148 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3149 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003150 if ((Triple.getArch() == llvm::Triple::x86 ||
3151 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003152 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003153 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3154 else
3155 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003156}
3157
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003158ToolChain::CXXStdlibType FreeBSD::GetDefaultCXXStdlibType() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003159 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003160 return ToolChain::CST_Libcxx;
3161 return ToolChain::CST_Libstdcxx;
3162}
3163
3164void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3165 ArgStringList &CC1Args) const {
3166 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3167 DriverArgs.hasArg(options::OPT_nostdincxx))
3168 return;
3169
3170 switch (GetCXXStdlibType(DriverArgs)) {
3171 case ToolChain::CST_Libcxx:
3172 addSystemInclude(DriverArgs, CC1Args,
3173 getDriver().SysRoot + "/usr/include/c++/v1");
3174 break;
3175 case ToolChain::CST_Libstdcxx:
3176 addSystemInclude(DriverArgs, CC1Args,
3177 getDriver().SysRoot + "/usr/include/c++/4.2");
3178 addSystemInclude(DriverArgs, CC1Args,
3179 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3180 break;
3181 }
3182}
3183
Dimitry Andric60907392016-02-14 16:08:20 +00003184void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3185 ArgStringList &CmdArgs) const {
3186 CXXStdlibType Type = GetCXXStdlibType(Args);
3187 bool Profiling = Args.hasArg(options::OPT_pg);
3188
3189 switch (Type) {
3190 case ToolChain::CST_Libcxx:
3191 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3192 break;
3193
3194 case ToolChain::CST_Libstdcxx:
3195 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3196 break;
3197 }
3198}
3199
Rafael Espindola7cf32212013-03-20 03:05:54 +00003200Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003201 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003202}
3203
Douglas Katzman95354292015-06-23 20:42:09 +00003204Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003205
Tim Northovere931f9f2015-10-30 16:30:41 +00003206bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003207 // FreeBSD uses SjLj exceptions on ARM oabi.
3208 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003209 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003210 case llvm::Triple::GNUEABI:
3211 case llvm::Triple::EABI:
3212 return false;
3213
3214 default:
3215 return (getTriple().getArch() == llvm::Triple::arm ||
3216 getTriple().getArch() == llvm::Triple::thumb);
3217 }
3218}
3219
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003220bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003221
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003222bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003223
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003224SanitizerMask FreeBSD::getSupportedSanitizers() const {
3225 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3226 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3227 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3228 getTriple().getArch() == llvm::Triple::mips64el;
3229 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3230 Res |= SanitizerKind::Address;
3231 Res |= SanitizerKind::Vptr;
3232 if (IsX86_64 || IsMIPS64) {
3233 Res |= SanitizerKind::Leak;
3234 Res |= SanitizerKind::Thread;
3235 }
3236 if (IsX86 || IsX86_64) {
3237 Res |= SanitizerKind::SafeStack;
3238 }
3239 return Res;
3240}
3241
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003242/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3243
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003244NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3245 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003246 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003247 // When targeting a 32-bit platform, try the special directory used on
3248 // 64-bit hosts, and only fall back to the main library directory if that
3249 // doesn't work.
3250 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3251 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003252 switch (Triple.getArch()) {
3253 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003254 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003255 break;
3256 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003257 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003258 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003259 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003260 switch (Triple.getEnvironment()) {
3261 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003262 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003263 getFilePaths().push_back("=/usr/lib/eabi");
3264 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003265 case llvm::Triple::EABIHF:
3266 case llvm::Triple::GNUEABIHF:
3267 getFilePaths().push_back("=/usr/lib/eabihf");
3268 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003269 default:
3270 getFilePaths().push_back("=/usr/lib/oabi");
3271 break;
3272 }
3273 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003274 case llvm::Triple::mips64:
3275 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003276 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003277 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003278 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003279 getFilePaths().push_back("=/usr/lib/64");
3280 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003281 case llvm::Triple::ppc:
3282 getFilePaths().push_back("=/usr/lib/powerpc");
3283 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003284 case llvm::Triple::sparc:
3285 getFilePaths().push_back("=/usr/lib/sparc");
3286 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003287 default:
3288 break;
3289 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003290
3291 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003292 }
3293}
3294
Rafael Espindola7cf32212013-03-20 03:05:54 +00003295Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003296 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003297}
3298
Douglas Katzman95354292015-06-23 20:42:09 +00003299Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003300
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003301ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const {
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003302 unsigned Major, Minor, Micro;
3303 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003304 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003305 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003306 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003307 case llvm::Triple::arm:
3308 case llvm::Triple::armeb:
3309 case llvm::Triple::thumb:
3310 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003311 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003312 case llvm::Triple::ppc64:
3313 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003314 case llvm::Triple::sparc:
3315 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003316 case llvm::Triple::x86:
3317 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003318 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003319 default:
3320 break;
3321 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003322 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003323 return ToolChain::CST_Libstdcxx;
3324}
3325
3326void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3327 ArgStringList &CC1Args) const {
3328 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3329 DriverArgs.hasArg(options::OPT_nostdincxx))
3330 return;
3331
3332 switch (GetCXXStdlibType(DriverArgs)) {
3333 case ToolChain::CST_Libcxx:
3334 addSystemInclude(DriverArgs, CC1Args,
3335 getDriver().SysRoot + "/usr/include/c++/");
3336 break;
3337 case ToolChain::CST_Libstdcxx:
3338 addSystemInclude(DriverArgs, CC1Args,
3339 getDriver().SysRoot + "/usr/include/g++");
3340 addSystemInclude(DriverArgs, CC1Args,
3341 getDriver().SysRoot + "/usr/include/g++/backward");
3342 break;
3343 }
3344}
3345
Chris Lattner3e2ee142010-07-07 16:01:42 +00003346/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3347
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003348Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3349 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003350 getFilePaths().push_back(getDriver().Dir + "/../lib");
3351 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003352}
3353
Rafael Espindola7cf32212013-03-20 03:05:54 +00003354Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003355 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003356}
3357
Douglas Katzman95354292015-06-23 20:42:09 +00003358Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003359
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003360static void addPathIfExists(const Driver &D, const Twine &Path,
3361 ToolChain::path_list &Paths) {
3362 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003363 Paths.push_back(Path.str());
3364}
3365
David Chisnallf571cde2012-02-15 13:39:01 +00003366/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3367
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003368Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003369 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003370 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003371
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003372 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003373
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003374 path_list &Paths = getFilePaths();
3375 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003376 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003377
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003378 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003379 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003380 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003381
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003382 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003383
3384 std::string LibPath = "/usr/lib/";
3385 switch (Triple.getArch()) {
3386 case llvm::Triple::x86:
3387 case llvm::Triple::sparc:
3388 break;
3389 case llvm::Triple::x86_64:
3390 LibPath += "amd64/";
3391 break;
3392 case llvm::Triple::sparcv9:
3393 LibPath += "sparcv9/";
3394 break;
3395 default:
3396 llvm_unreachable("Unsupported architecture");
3397 }
3398
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003399 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003400}
3401
Rafael Espindola7cf32212013-03-20 03:05:54 +00003402Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003403 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003404}
3405
Douglas Katzman95354292015-06-23 20:42:09 +00003406Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003407
Rafael Espindolad5117262015-09-09 13:36:00 +00003408void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3409 ArgStringList &CC1Args) const {
3410 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3411 DriverArgs.hasArg(options::OPT_nostdincxx))
3412 return;
3413
3414 // Include the support directory for things like xlocale and fudged system
3415 // headers.
3416 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3417
3418 if (GCCInstallation.isValid()) {
3419 GCCVersion Version = GCCInstallation.getVersion();
3420 addSystemInclude(DriverArgs, CC1Args,
3421 getDriver().SysRoot + "/usr/gcc/" +
3422 Version.MajorStr + "." +
3423 Version.MinorStr +
3424 "/include/c++/" + Version.Text);
3425 addSystemInclude(DriverArgs, CC1Args,
3426 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3427 "." + Version.MinorStr + "/include/c++/" +
3428 Version.Text + "/" +
3429 GCCInstallation.getTriple().str());
3430 }
3431}
3432
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003433/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003434
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003435enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003436 // NB: Releases of a particular Linux distro should be kept together
3437 // in this enum, because some tests are done by integer comparison against
3438 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003439 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003440 DebianLenny,
3441 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003442 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003443 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003444 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003445 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003446 RHEL5,
3447 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003448 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003449 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003450 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003451 UbuntuHardy,
3452 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003453 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003454 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003455 UbuntuLucid,
3456 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003457 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003458 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003459 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003460 UbuntuQuantal,
3461 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003462 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003463 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003464 UbuntuUtopic,
3465 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003466 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003467 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003468 UnknownDistro
3469};
3470
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003471static bool IsRedhat(enum Distro Distro) {
Rafael Espindola52fe8962016-05-09 13:13:50 +00003472 return Distro == Fedora || (Distro >= RHEL5 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003473}
3474
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003475static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003476
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003477static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003478 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003479}
3480
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003481static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003482 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003483}
3484
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003485static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003486 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3487 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3488 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003489 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003490 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003491 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003492 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003493 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003494 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3495 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3496 .Case("hardy", UbuntuHardy)
3497 .Case("intrepid", UbuntuIntrepid)
3498 .Case("jaunty", UbuntuJaunty)
3499 .Case("karmic", UbuntuKarmic)
3500 .Case("lucid", UbuntuLucid)
3501 .Case("maverick", UbuntuMaverick)
3502 .Case("natty", UbuntuNatty)
3503 .Case("oneiric", UbuntuOneiric)
3504 .Case("precise", UbuntuPrecise)
3505 .Case("quantal", UbuntuQuantal)
3506 .Case("raring", UbuntuRaring)
3507 .Case("saucy", UbuntuSaucy)
3508 .Case("trusty", UbuntuTrusty)
3509 .Case("utopic", UbuntuUtopic)
3510 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003511 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003512 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003513 .Default(UnknownDistro);
Rafael Espindola52fe8962016-05-09 13:13:50 +00003514 if (Version != UnknownDistro)
3515 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003516 }
3517
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003518 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3519 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003520 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003521 if (Data.startswith("Fedora release"))
3522 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003523 if (Data.startswith("Red Hat Enterprise Linux") ||
Rafael Espindola52fe8962016-05-09 13:13:50 +00003524 Data.startswith("CentOS") ||
3525 Data.startswith("Scientific Linux")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003526 if (Data.find("release 7") != StringRef::npos)
3527 return RHEL7;
3528 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003529 return RHEL6;
3530 else if (Data.find("release 5") != StringRef::npos)
3531 return RHEL5;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003532 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003533 return UnknownDistro;
3534 }
3535
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003536 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3537 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003538 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003539 if (Data[0] == '5')
3540 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003541 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003542 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003543 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003544 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003545 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003546 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003547 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3548 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003549 return UnknownDistro;
3550 }
3551
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003552 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003553 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003554
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003555 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003556 return Exherbo;
3557
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003558 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003559 return ArchLinux;
3560
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003561 return UnknownDistro;
3562}
3563
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003564/// \brief Get our best guess at the multiarch triple for a target.
3565///
3566/// Debian-based systems are starting to use a multiarch setup where they use
3567/// a target-triple directory in the library and header search paths.
3568/// Unfortunately, this triple does not align with the vanilla target triple,
3569/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003570static std::string getMultiarchTriple(const Driver &D,
3571 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003572 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003573 llvm::Triple::EnvironmentType TargetEnvironment =
3574 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003575
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003576 // For most architectures, just use whatever we have rather than trying to be
3577 // clever.
3578 switch (TargetTriple.getArch()) {
3579 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003580 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003581
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003582 // We use the existence of '/lib/<triple>' as a directory to detect some
3583 // common linux triples that don't quite match the Clang triple for both
3584 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3585 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003586 case llvm::Triple::arm:
3587 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003588 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003589 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003590 return "arm-linux-gnueabihf";
3591 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003592 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003593 return "arm-linux-gnueabi";
3594 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003595 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003596 case llvm::Triple::armeb:
3597 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003598 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003599 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003600 return "armeb-linux-gnueabihf";
3601 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003602 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003603 return "armeb-linux-gnueabi";
3604 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003605 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003606 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003607 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003608 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003609 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003610 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003611 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003612 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003613 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003614 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003615 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003616 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003617 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003618 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003619 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003620 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003621 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003622 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003623 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003624 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003625 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003626 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003627 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003628 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003629 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003630 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003631 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003632 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003633 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003634 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003635 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003636 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003637 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003638 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003639 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003640 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003641 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003642 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003643 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003644 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003645 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003646 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003647 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003648 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003649 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003650 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003651 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003652 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003653 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003654 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003655 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003656 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003657 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003658 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003659 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003660 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003661 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003662 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003663 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003664 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003665 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003666 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003667 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003668 return "s390x-linux-gnu";
3669 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003670 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003671 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003672}
3673
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003674static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003675 if (isMipsArch(Triple.getArch())) {
3676 // lib32 directory has a special meaning on MIPS targets.
3677 // It contains N32 ABI binaries. Use this folder if produce
3678 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003679 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003680 return "lib32";
3681 return Triple.isArch32Bit() ? "lib" : "lib64";
3682 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003683
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003684 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003685 // using that variant while targeting other architectures causes problems
3686 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003687 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003688 // them when we know we may need it.
3689 //
3690 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003691 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003692 // GCCInstallationDetector, but that is a more significant refactoring.
3693 if (Triple.getArch() == llvm::Triple::x86 ||
3694 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003695 return "lib32";
3696
Zinovy Nis1db95732014-07-10 15:27:19 +00003697 if (Triple.getArch() == llvm::Triple::x86_64 &&
3698 Triple.getEnvironment() == llvm::Triple::GNUX32)
3699 return "libx32";
3700
Simon Atanasyand4413882012-09-14 11:27:24 +00003701 return Triple.isArch32Bit() ? "lib" : "lib64";
3702}
3703
Rafael Espindola1af7c212012-02-19 01:38:32 +00003704Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003705 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003706 GCCInstallation.init(Triple, Args);
3707 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003708 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003709 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003710 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003711
Rafael Espindola10a63c22013-07-03 14:14:00 +00003712 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003713 // least) put various tools in a triple-prefixed directory off of the parent
3714 // of the GCC installation. We use the GCC triple here to ensure that we end
3715 // up with tools that support the same amount of cross compiling as the
3716 // detected GCC installation. For example, if we find a GCC installation
3717 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3718 // used to target i386.
3719 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003720 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003721 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003722 GCCInstallation.getTriple().str() + "/bin")
3723 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003724
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003725 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003726
Rafael Espindola10a63c22013-07-03 14:14:00 +00003727 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003728 ExtraOpts.push_back("-z");
3729 ExtraOpts.push_back("relro");
3730 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003731
Douglas Gregord9bb1522011-03-06 19:11:49 +00003732 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003733 ExtraOpts.push_back("-X");
3734
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003735 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003736 const bool IsMips = isMipsArch(Arch);
3737
3738 if (IsMips && !SysRoot.empty())
3739 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003740
Chandler Carruth0b842912011-12-09 04:45:18 +00003741 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3742 // and the MIPS ABI require .dynsym to be sorted in different ways.
3743 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3744 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003745 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003746 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003747 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003748 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003749 ExtraOpts.push_back("--hash-style=gnu");
3750
Rafael Espindola10a63c22013-07-03 14:14:00 +00003751 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003752 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3753 ExtraOpts.push_back("--hash-style=both");
3754 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003755
Rafael Espindola52fe8962016-05-09 13:13:50 +00003756 if (IsRedhat(Distro) && Distro != RHEL5 && Distro != RHEL6)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003757 ExtraOpts.push_back("--no-add-needed");
3758
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003759 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindola52fe8962016-05-09 13:13:50 +00003760 (IsRedhat(Distro) && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003761 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003762 ExtraOpts.push_back("--build-id");
3763
Rafael Espindola10a63c22013-07-03 14:14:00 +00003764 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003765 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003766
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003767 // The selection of paths to try here is designed to match the patterns which
3768 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3769 // This was determined by running GCC in a fake filesystem, creating all
3770 // possible permutations of these directories, and seeing which ones it added
3771 // to the link paths.
3772 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003773
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003774 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003775 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003776
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003777 // Add the multilib suffixed paths where they are available.
3778 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003779 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003780 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003781 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003782
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003783 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003784 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003785 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003786 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003787
3788 // GCC cross compiling toolchains will install target libraries which ship
3789 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3790 // any part of the GCC installation in
3791 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3792 // debatable, but is the reality today. We need to search this tree even
3793 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003794 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003795 // installation that is *not* within the system root to ensure two things:
3796 //
3797 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003798 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003799 // appropriate rpath.
3800 // 2) There must not be libraries installed into
3801 // <prefix>/<triple>/<libdir> unless they should be preferred over
3802 // those within the system root.
3803 //
3804 // Note that this matches the GCC behavior. See the below comment for where
3805 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003806 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3807 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003808 Paths);
3809
Chandler Carruth69a125b2012-04-06 16:32:06 +00003810 // If the GCC installation we found is inside of the sysroot, we want to
3811 // prefer libraries installed in the parent prefix of the GCC installation.
3812 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003813 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003814 // This usually happens when there is an external cross compiler on the
3815 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003816 // the cross. Note that GCC does include some of these directories in some
3817 // configurations but this seems somewhere between questionable and simply
3818 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003819 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003820 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3821 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003822 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003823 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003824
3825 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003826 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003827 // those searched.
3828 // FIXME: It's not clear whether we should use the driver's installed
3829 // directory ('Dir' below) or the ResourceDir.
3830 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003831 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3832 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003833 }
3834
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003835 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3836 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3837 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3838 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003839
Chandler Carruthb427c562013-06-22 11:35:51 +00003840 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003841 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003842 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003843 addPathIfExists(D,
3844 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003845 "/../../" + OSLibDir,
3846 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003847
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003848 // Add the 'other' biarch variant path
3849 Multilib BiarchSibling;
3850 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003851 addPathIfExists(D, GCCInstallation.getInstallPath() +
3852 BiarchSibling.gccSuffix(),
3853 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003854 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003855
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003856 // See comments above on the multilib variant for details of why this is
3857 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003858 const std::string &LibPath = GCCInstallation.getParentLibPath();
3859 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3860 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003861 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3862 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003863 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003864
3865 // See comments above on the multilib variant for details of why this is
3866 // only included from within the sysroot.
3867 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003868 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003869 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003870
3871 // Similar to the logic for GCC above, if we are currently running Clang
3872 // inside of the requested system root, add its parent library path to those
3873 // searched.
3874 // FIXME: It's not clear whether we should use the driver's installed
3875 // directory ('Dir' below) or the ResourceDir.
3876 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003877 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003878
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003879 addPathIfExists(D, SysRoot + "/lib", Paths);
3880 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003881}
3882
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003883bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003884
Douglas Katzman95354292015-06-23 20:42:09 +00003885Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003886
3887Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003888 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003889}
3890
Simon Atanasyana0d89572013-10-05 14:37:55 +00003891std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003892 if (!getDriver().SysRoot.empty())
3893 return getDriver().SysRoot;
3894
3895 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3896 return std::string();
3897
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003898 // Standalone MIPS toolchains use different names for sysroot folder
3899 // and put it into different places. Here we try to check some known
3900 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003901
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003902 const StringRef InstallDir = GCCInstallation.getInstallPath();
3903 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003904 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003905
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003906 std::string Path =
3907 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3908 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003909
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003910 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003911 return Path;
3912
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003913 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003914
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003915 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003916 return Path;
3917
3918 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003919}
3920
Saleem Abdulrasool783fc632016-05-22 03:12:19 +00003921std::string Linux::getDynamicLinker(const ArgList &Args) const {
3922 const llvm::Triple::ArchType Arch = getArch();
3923 const llvm::Triple &Triple = getTriple();
3924
3925 if (Triple.isAndroid())
3926 return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker";
3927
3928 switch (Arch) {
3929 default: llvm_unreachable("unsupported architecture");
3930
3931 case llvm::Triple::aarch64:
3932 return "/lib/ld-linux-aarch64.so.1";
3933 case llvm::Triple::aarch64_be:
3934 return "/lib/ld-linux-aarch64_be.so.1";
3935 case llvm::Triple::arm:
3936 case llvm::Triple::thumb:
3937 case llvm::Triple::armeb:
3938 case llvm::Triple::thumbeb: {
3939 const bool IsHardFloat =
3940 Triple.getEnvironment() == llvm::Triple::GNUEABIHF ||
3941 tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard;
3942
3943 return IsHardFloat ? "/lib/ld-linux-armhf.so.3" : "/lib/ld-linux.so.3";
3944 }
3945 case llvm::Triple::mips:
3946 case llvm::Triple::mipsel:
3947 case llvm::Triple::mips64:
3948 case llvm::Triple::mips64el: {
3949 bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple);
3950 bool LE = (Triple.getArch() == llvm::Triple::mipsel) ||
3951 (Triple.getArch() == llvm::Triple::mips64el);
3952
3953 std::string LibDir =
3954 "/lib" + tools::mips::getMipsABILibSuffix(Args, Triple);
3955 StringRef LibName;
3956 if (tools::mips::isUCLibc(Args))
3957 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
3958 else if (!Triple.hasEnvironment() &&
3959 Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies)
3960 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
3961 else
3962 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
3963
3964 return (LibDir + "/" + LibName).str();
3965 }
3966 case llvm::Triple::ppc:
3967 return "/lib/ld.so.1";
3968 case llvm::Triple::ppc64:
3969 return (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "/lib64/ld64.so.2"
3970 : "/lib64/ld64.so.1";
3971 case llvm::Triple::ppc64le:
3972 return (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "/lib64/ld64.so.1"
3973 : "/lib64/ld64.so.2";
3974 case llvm::Triple::sparc:
3975 case llvm::Triple::sparcel:
3976 return "/lib/ld-linux.so.2";
3977 case llvm::Triple::sparcv9:
3978 return "/lib64/ld-linux.so.2";
3979 case llvm::Triple::systemz:
3980 return "/lib/ld64.so.1";
3981 case llvm::Triple::x86:
3982 return "/lib/ld-linux.so.2";
3983 case llvm::Triple::x86_64:
3984 return (Triple.getEnvironment() == llvm::Triple::GNUX32)
3985 ? "/libx32/ld-linux-x32.so.2"
3986 : "/lib64/ld-linux-x86-64.so.2";
3987 }
3988}
3989
Chandler Carrutha796f532011-11-05 20:17:13 +00003990void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3991 ArgStringList &CC1Args) const {
3992 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003993 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003994
3995 if (DriverArgs.hasArg(options::OPT_nostdinc))
3996 return;
3997
3998 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003999 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004000
4001 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00004002 SmallString<128> P(D.ResourceDir);
4003 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00004004 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00004005 }
4006
4007 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
4008 return;
4009
4010 // Check for configure-time C include directories.
4011 StringRef CIncludeDirs(C_INCLUDE_DIRS);
4012 if (CIncludeDirs != "") {
4013 SmallVector<StringRef, 5> dirs;
4014 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004015 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00004016 StringRef Prefix =
4017 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004018 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00004019 }
4020 return;
4021 }
4022
4023 // Lacking those, try to detect the correct set of system includes for the
4024 // target triple.
4025
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004026 // Add include directories specific to the selected multilib set and multilib.
4027 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00004028 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004029 if (Callback) {
Simon Atanasyana45502d2016-05-19 15:07:21 +00004030 for (const auto &Path : Callback(GCCInstallation.getMultilib()))
4031 addExternCSystemIncludeIfExists(
4032 DriverArgs, CC1Args, GCCInstallation.getInstallPath() + Path);
Simon Atanasyan9e49e142014-08-06 05:44:47 +00004033 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004034 }
4035
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004036 // Implement generic Debian multiarch support.
4037 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004038 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004039
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004040 // FIXME: These are older forms of multiarch. It's not clear that they're
4041 // in use in any released version of Debian, so we should consider
4042 // removing them.
4043 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004044 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004045 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004046
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004047 // FIXME: These are older forms of multiarch. It's not clear that they're
4048 // in use in any released version of Debian, so we should consider
4049 // removing them.
4050 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
4051 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00004052 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004053 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004054 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004055 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004056 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004057 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004058 const StringRef ARMEBMultiarchIncludeDirs[] = {
4059 "/usr/include/armeb-linux-gnueabi"};
4060 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
4061 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004062 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00004063 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004064 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004065 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004066 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004067 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004068 "/usr/include/mips64el-linux-gnu",
4069 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004070 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004071 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004072 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004073 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004074 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004075 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004076 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004077 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00004078 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004079 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004080 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
4081 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004082 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004083 switch (getTriple().getArch()) {
4084 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004085 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004086 break;
4087 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004088 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004089 break;
4090 case llvm::Triple::aarch64:
4091 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00004092 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004093 break;
4094 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004095 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004096 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4097 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
4098 else
4099 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004100 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004101 case llvm::Triple::armeb:
4102 case llvm::Triple::thumbeb:
4103 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4104 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
4105 else
4106 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
4107 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004108 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00004109 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004110 break;
4111 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00004112 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004113 break;
4114 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004115 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004116 break;
4117 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004118 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004119 break;
4120 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004121 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004122 break;
4123 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004124 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004125 break;
4126 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004127 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004128 break;
4129 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004130 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004131 break;
4132 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004133 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004134 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004135 case llvm::Triple::systemz:
4136 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4137 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004138 default:
4139 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004140 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004141 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004142 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004143 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004144 break;
4145 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004146 }
4147
4148 if (getTriple().getOS() == llvm::Triple::RTEMS)
4149 return;
4150
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004151 // Add an include of '/include' directly. This isn't provided by default by
4152 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4153 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004154 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004155
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004156 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004157}
4158
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004159static std::string DetectLibcxxIncludePath(StringRef base) {
4160 std::error_code EC;
4161 int MaxVersion = 0;
4162 std::string MaxVersionString = "";
4163 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4164 LI = LI.increment(EC)) {
4165 StringRef VersionText = llvm::sys::path::filename(LI->path());
4166 int Version;
4167 if (VersionText[0] == 'v' &&
4168 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4169 if (Version > MaxVersion) {
4170 MaxVersion = Version;
4171 MaxVersionString = VersionText;
4172 }
4173 }
4174 }
4175 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4176}
4177
Chandler Carrutha796f532011-11-05 20:17:13 +00004178void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4179 ArgStringList &CC1Args) const {
4180 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4181 DriverArgs.hasArg(options::OPT_nostdincxx))
4182 return;
4183
Chandler Carruthf4701732011-11-07 09:01:17 +00004184 // Check if libc++ has been enabled and provide its include paths if so.
4185 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004186 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004187 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Yaron Keren5439b642016-05-17 19:01:16 +00004188 // If this is a development, non-installed, clang, libcxx will
4189 // not be found at ../include/c++ but it likely to be found at
4190 // one of the following two locations:
4191 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/local/include/c++"),
4192 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++") };
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004193 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004194 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004195 continue;
4196 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004197 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004198 break;
4199 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004200 return;
4201 }
4202
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004203 // We need a detected GCC installation on Linux to provide libstdc++'s
4204 // headers. We handled the libc++ case above.
4205 if (!GCCInstallation.isValid())
4206 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004207
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004208 // By default, look for the C++ headers in an include directory adjacent to
4209 // the lib directory of the GCC installation. Note that this is expect to be
4210 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4211 StringRef LibDir = GCCInstallation.getParentLibPath();
4212 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004213 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004214 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004215 const std::string GCCMultiarchTriple = getMultiarchTriple(
4216 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004217 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004218 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004219 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004220
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004221 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004222 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004223 "/c++/" + Version.Text, TripleStr,
4224 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004225 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004226 return;
4227
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004228 // Otherwise, fall back on a bunch of options which don't use multiarch
4229 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004230 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004231 // Gentoo is weird and places its headers inside the GCC install,
4232 // so if the first attempt to find the headers fails, try these patterns.
Chandler Carruth81296fb2016-05-08 07:59:56 +00004233 InstallDir.str() + "/include/g++-v" + Version.Text,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004234 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4235 Version.MinorStr,
4236 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4237 // Android standalone toolchain has C++ headers in yet another place.
4238 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4239 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4240 // without a subdirectory corresponding to the gcc version.
4241 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004242 };
4243
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004244 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004245 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4246 /*GCCMultiarchTriple*/ "",
4247 /*TargetMultiarchTriple*/ "",
4248 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004249 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004250 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004251}
4252
Artem Belevichfa11ab52015-11-17 22:28:46 +00004253void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4254 ArgStringList &CC1Args) const {
4255 if (DriverArgs.hasArg(options::OPT_nocudainc))
4256 return;
4257
Justin Lebar423019d2016-04-16 00:11:11 +00004258 if (!CudaInstallation.isValid()) {
4259 getDriver().Diag(diag::err_drv_no_cuda_installation);
4260 return;
Artem Belevich86017332015-11-17 22:28:55 +00004261 }
Justin Lebar423019d2016-04-16 00:11:11 +00004262
4263 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
4264 CC1Args.push_back("-include");
4265 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevichfa11ab52015-11-17 22:28:46 +00004266}
4267
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004268bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004269
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004270SanitizerMask Linux::getSupportedSanitizers() const {
4271 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4272 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4273 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4274 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004275 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4276 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004277 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4278 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004279 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4280 Res |= SanitizerKind::Address;
4281 Res |= SanitizerKind::KernelAddress;
4282 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004283 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004284 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004285 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004286 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004287 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004288 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004289 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004290 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004291 Res |= SanitizerKind::Memory;
Derek Bruening256c2e12016-04-21 21:32:04 +00004292 if (IsX86_64)
4293 Res |= SanitizerKind::Efficiency;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004294 if (IsX86 || IsX86_64) {
4295 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004296 }
4297 return Res;
4298}
4299
Xinliang David Li170cd102015-10-27 05:15:35 +00004300void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4301 llvm::opt::ArgStringList &CmdArgs) const {
4302 if (!needsProfileRT(Args)) return;
4303
4304 // Add linker option -u__llvm_runtime_variable to cause runtime
4305 // initialization module to be linked in.
4306 if (!Args.hasArg(options::OPT_coverage))
4307 CmdArgs.push_back(Args.MakeArgString(
4308 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4309 ToolChain::addProfileRTLibs(Args, CmdArgs);
4310}
4311
Daniel Dunbarcc912342009-05-02 18:28:39 +00004312/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4313
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004314DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4315 const ArgList &Args)
4316 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004317
4318 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004319 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004320 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004321 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004322
Daniel Dunbar083edf72009-12-21 18:54:17 +00004323 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004324 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004325 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004326}
4327
Rafael Espindola7cf32212013-03-20 03:05:54 +00004328Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004329 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004330}
4331
4332Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004333 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004334}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004335
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004336/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4337/// which isn't properly a linker but nonetheless performs the step of stitching
4338/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004339
4340CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4341 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004342 : Linux(D, Triple, Args) {
4343 if (CudaInstallation.isValid())
4344 getProgramPaths().push_back(CudaInstallation.getBinPath());
4345}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004346
4347void
4348CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4349 llvm::opt::ArgStringList &CC1Args) const {
4350 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4351 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004352
Justin Lebard3a44f62016-04-05 18:26:20 +00004353 if (DriverArgs.hasFlag(options::OPT_fcuda_flush_denormals_to_zero,
4354 options::OPT_fno_cuda_flush_denormals_to_zero, false))
4355 CC1Args.push_back("-fcuda-flush-denormals-to-zero");
4356
Artem Belevich34f481a2015-11-17 22:28:50 +00004357 if (DriverArgs.hasArg(options::OPT_nocudalib))
4358 return;
4359
4360 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4361 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4362 if (!LibDeviceFile.empty()) {
4363 CC1Args.push_back("-mlink-cuda-bitcode");
4364 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4365
4366 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4367 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4368 // came with CUDA-7.0.
4369 CC1Args.push_back("-target-feature");
4370 CC1Args.push_back("+ptx42");
4371 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004372}
4373
4374llvm::opt::DerivedArgList *
4375CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4376 const char *BoundArch) const {
4377 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4378 const OptTable &Opts = getDriver().getOpts();
4379
4380 for (Arg *A : Args) {
4381 if (A->getOption().matches(options::OPT_Xarch__)) {
4382 // Skip this argument unless the architecture matches BoundArch
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004383 if (!BoundArch || A->getValue(0) != StringRef(BoundArch))
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004384 continue;
4385
4386 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4387 unsigned Prev = Index;
4388 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4389
4390 // If the argument parsing failed or more than one argument was
4391 // consumed, the -Xarch_ argument's parameter tried to consume
4392 // extra arguments. Emit an error and ignore.
4393 //
4394 // We also want to disallow any options which would alter the
4395 // driver behavior; that isn't going to work in our model. We
4396 // use isDriverOption() as an approximation, although things
4397 // like -O4 are going to slip through.
4398 if (!XarchArg || Index > Prev + 1) {
4399 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4400 << A->getAsString(Args);
4401 continue;
4402 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4403 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4404 << A->getAsString(Args);
4405 continue;
4406 }
4407 XarchArg->setBaseArg(A);
4408 A = XarchArg.release();
4409 DAL->AddSynthesizedArg(A);
4410 }
4411 DAL->append(A);
4412 }
4413
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004414 if (BoundArch)
4415 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004416 return DAL;
4417}
4418
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004419Tool *CudaToolChain::buildAssembler() const {
4420 return new tools::NVPTX::Assembler(*this);
4421}
4422
4423Tool *CudaToolChain::buildLinker() const {
4424 return new tools::NVPTX::Linker(*this);
4425}
4426
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004427/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004428XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4429 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004430 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004431 // ProgramPaths are found via 'PATH' environment variable.
4432}
4433
Douglas Katzman54366072015-07-27 16:53:08 +00004434Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004435 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004436}
4437
Douglas Katzman54366072015-07-27 16:53:08 +00004438Tool *XCoreToolChain::buildLinker() const {
4439 return new tools::XCore::Linker(*this);
4440}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004441
Douglas Katzman54366072015-07-27 16:53:08 +00004442bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004443
Douglas Katzman54366072015-07-27 16:53:08 +00004444bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004445
Douglas Katzman54366072015-07-27 16:53:08 +00004446bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004447
Douglas Katzman54366072015-07-27 16:53:08 +00004448bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004449
Douglas Katzman54366072015-07-27 16:53:08 +00004450bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004451
Douglas Katzman54366072015-07-27 16:53:08 +00004452void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4453 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004454 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4455 DriverArgs.hasArg(options::OPT_nostdlibinc))
4456 return;
4457 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4458 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004459 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004460 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4461 ArrayRef<StringRef> DirVec(Dirs);
4462 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4463 }
4464}
4465
Douglas Katzman54366072015-07-27 16:53:08 +00004466void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4467 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004468 CC1Args.push_back("-nostdsysteminc");
4469}
4470
Douglas Katzman54366072015-07-27 16:53:08 +00004471void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4472 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004473 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004474 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4475 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004476 return;
4477 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4478 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004479 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004480 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4481 ArrayRef<StringRef> DirVec(Dirs);
4482 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4483 }
4484}
4485
Douglas Katzman54366072015-07-27 16:53:08 +00004486void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4487 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004488 // We don't output any lib args. This is handled by xcc.
4489}
Douglas Katzman84a75642015-06-19 14:55:19 +00004490
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004491MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4492 const ArgList &Args)
Douglas Katzman5eddc232016-05-09 19:09:59 +00004493 : Generic_ELF(D, Triple, Args) {
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004494 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4495 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4496 // This won't work to find gcc. Instead we give the installation detector an
4497 // extra triple, which is preferable to further hacks of the logic that at
4498 // present is based solely on getArch(). In particular, it would be wrong to
4499 // choose the myriad installation when targeting a non-myriad sparc install.
4500 switch (Triple.getArch()) {
4501 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00004502 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4503 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004504 case llvm::Triple::sparc:
4505 case llvm::Triple::sparcel:
4506 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004507 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004508 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004509
4510 if (GCCInstallation.isValid()) {
4511 // The contents of LibDir are independent of the version of gcc.
4512 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4513 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4514 if (Triple.getArch() == llvm::Triple::sparcel)
4515 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4516 else
4517 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4518 addPathIfExists(D, LibDir, getFilePaths());
4519
4520 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4521 // These files are tied to a particular version of gcc.
4522 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4523 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4524 // but as this toolchain is for LEON sparc, it can assume FPU.
4525 if (Triple.getArch() == llvm::Triple::sparcel)
4526 llvm::sys::path::append(CompilerSupportDir, "le");
4527 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4528 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004529}
4530
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004531MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004532
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004533void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4534 ArgStringList &CC1Args) const {
4535 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4536 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4537}
4538
Eric Christopherefef8ef2015-12-07 22:43:05 +00004539void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4540 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00004541 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4542 DriverArgs.hasArg(options::OPT_nostdincxx))
4543 return;
4544
4545 // Only libstdc++, for now.
4546 StringRef LibDir = GCCInstallation.getParentLibPath();
4547 const GCCVersion &Version = GCCInstallation.getVersion();
4548 StringRef TripleStr = GCCInstallation.getTriple().str();
4549 const Multilib &Multilib = GCCInstallation.getMultilib();
4550
Eric Christopherefef8ef2015-12-07 22:43:05 +00004551 addLibStdCXXIncludePaths(
4552 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4553 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00004554}
4555
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004556// MyriadToolChain handles several triples:
4557// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4558Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4559 // The inherited method works fine if not targeting the SHAVE.
4560 if (!isShaveCompilation(getTriple()))
4561 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004562 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00004563 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00004564 case Action::CompileJobClass:
4565 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004566 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004567 return Compiler.get();
4568 case Action::AssembleJobClass:
4569 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004570 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004571 return Assembler.get();
4572 default:
4573 return ToolChain::getTool(JA.getKind());
4574 }
4575}
4576
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004577Tool *MyriadToolChain::buildLinker() const {
4578 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004579}
Dan Gohmanc2853072015-09-03 22:51:53 +00004580
Dan Gohman52816862015-12-16 23:30:41 +00004581WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
4582 const llvm::opt::ArgList &Args)
4583 : ToolChain(D, Triple, Args) {
Dan Gohman57b62c52016-02-22 19:26:15 +00004584
4585 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
4586 getFilePaths().push_back(
4587 getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64"));
4588
Dan Gohman52816862015-12-16 23:30:41 +00004589 // Use LLD by default.
4590 DefaultLinker = "lld";
4591}
4592
Dan Gohmanc2853072015-09-03 22:51:53 +00004593bool WebAssembly::IsMathErrnoDefault() const { return false; }
4594
4595bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4596
4597bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4598
4599bool WebAssembly::isPICDefault() const { return false; }
4600
4601bool WebAssembly::isPIEDefault() const { return false; }
4602
4603bool WebAssembly::isPICDefaultForced() const { return false; }
4604
4605bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4606
4607// TODO: Support Objective C stuff.
4608bool WebAssembly::SupportsObjCGC() const { return false; }
4609
4610bool WebAssembly::hasBlocksRuntime() const { return false; }
4611
4612// TODO: Support profiling.
4613bool WebAssembly::SupportsProfiling() const { return false; }
4614
Dan Gohman52816862015-12-16 23:30:41 +00004615bool WebAssembly::HasNativeLLVMSupport() const { return true; }
4616
Dan Gohmanc2853072015-09-03 22:51:53 +00004617void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4618 ArgStringList &CC1Args) const {
4619 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4620 options::OPT_fno_use_init_array, true))
4621 CC1Args.push_back("-fuse-init-array");
4622}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004623
Dan Gohman6ad8f612016-01-14 16:00:13 +00004624ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
4625 return ToolChain::RLT_CompilerRT;
4626}
4627
4628ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
4629 return ToolChain::CST_Libcxx;
4630}
4631
4632void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4633 ArgStringList &CC1Args) const {
4634 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4635 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4636}
4637
4638void WebAssembly::AddClangCXXStdlibIncludeArgs(
4639 const llvm::opt::ArgList &DriverArgs,
4640 llvm::opt::ArgStringList &CC1Args) const {
4641 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
4642 !DriverArgs.hasArg(options::OPT_nostdincxx))
4643 addSystemInclude(DriverArgs, CC1Args,
4644 getDriver().SysRoot + "/include/c++/v1");
4645}
4646
Dan Gohman52816862015-12-16 23:30:41 +00004647Tool *WebAssembly::buildLinker() const {
4648 return new tools::wasm::Linker(*this);
4649}
4650
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004651PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4652 : Generic_ELF(D, Triple, Args) {
4653 if (Args.hasArg(options::OPT_static))
4654 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4655
Paul Robinson9d613612016-05-16 17:22:25 +00004656 // Determine where to find the PS4 libraries. We use SCE_ORBIS_SDK_DIR
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004657 // if it exists; otherwise use the driver's installation path, which
4658 // should be <SDK_DIR>/host_tools/bin.
4659
4660 SmallString<512> PS4SDKDir;
Paul Robinson9d613612016-05-16 17:22:25 +00004661 if (const char *EnvValue = getenv("SCE_ORBIS_SDK_DIR")) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004662 if (!llvm::sys::fs::exists(EnvValue))
4663 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4664 PS4SDKDir = EnvValue;
4665 } else {
4666 PS4SDKDir = getDriver().Dir;
4667 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00004668 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004669
Eric Christopherefef8ef2015-12-07 22:43:05 +00004670 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004671 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00004672 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004673 // If -isysroot was passed, use that as the SDK base path.
4674 std::string PrefixDir;
4675 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4676 PrefixDir = A->getValue();
4677 if (!llvm::sys::fs::exists(PrefixDir))
4678 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4679 } else
4680 PrefixDir = PS4SDKDir.str();
4681
4682 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4683 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4684 if (!Args.hasArg(options::OPT_nostdinc) &&
4685 !Args.hasArg(options::OPT_nostdlibinc) &&
4686 !Args.hasArg(options::OPT_isysroot) &&
4687 !Args.hasArg(options::OPT__sysroot_EQ) &&
4688 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4689 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4690 << "PS4 system headers" << PS4SDKIncludeDir;
4691 }
4692
4693 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4694 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4695 if (!Args.hasArg(options::OPT_nostdlib) &&
4696 !Args.hasArg(options::OPT_nodefaultlibs) &&
4697 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4698 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4699 !Args.hasArg(options::OPT_emit_ast) &&
4700 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4701 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4702 << "PS4 system libraries" << PS4SDKLibDir;
4703 return;
4704 }
4705 getFilePaths().push_back(PS4SDKLibDir.str());
4706}
4707
4708Tool *PS4CPU::buildAssembler() const {
4709 return new tools::PS4cpu::Assemble(*this);
4710}
4711
4712Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4713
4714bool PS4CPU::isPICDefault() const { return true; }
4715
4716bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4717
4718SanitizerMask PS4CPU::getSupportedSanitizers() const {
4719 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4720 Res |= SanitizerKind::Address;
4721 Res |= SanitizerKind::Vptr;
4722 return Res;
4723}