blob: 6cc512b6a16a5a0d99e4bcb4e13fa161d206b067 [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
Anna Zakse67b4022016-02-02 02:04:48 +0000332StringRef Darwin::getOSLibraryNameSuffix() const {
333 switch(TargetPlatform) {
334 case DarwinPlatformKind::MacOS:
335 return "osx";
336 case DarwinPlatformKind::IPhoneOS:
337 return "ios";
338 case DarwinPlatformKind::IPhoneOSSimulator:
339 return "iossim";
340 case DarwinPlatformKind::TvOS:
341 return "tvos";
342 case DarwinPlatformKind::TvOSSimulator:
343 return "tvossim";
344 case DarwinPlatformKind::WatchOS:
345 return "watchos";
346 case DarwinPlatformKind::WatchOSSimulator:
347 return "watchossim";
348 }
349 llvm_unreachable("Unsupported platform");
350}
351
Justin Bogner2fd95f62015-05-12 06:30:48 +0000352void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000353 ArgStringList &CmdArgs) const {
Xinliang David Li69306c02015-10-22 06:15:31 +0000354 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000355
Chris Bieneman586d24b2015-11-20 00:19:21 +0000356 // TODO: Clean this up once autoconf is gone
357 SmallString<128> P(getDriver().ResourceDir);
358 llvm::sys::path::append(P, "lib", "darwin");
359 const char *Library = "libclang_rt.profile_osx.a";
360
Justin Bognerc7701242015-05-12 05:44:36 +0000361 // Select the appropriate runtime library for the target.
Chris Bieneman586d24b2015-11-20 00:19:21 +0000362 if (isTargetWatchOS()) {
363 Library = "libclang_rt.profile_watchos.a";
364 } else if (isTargetWatchOSSimulator()) {
365 llvm::sys::path::append(P, "libclang_rt.profile_watchossim.a");
366 Library = getVFS().exists(P) ? "libclang_rt.profile_watchossim.a"
367 : "libclang_rt.profile_watchos.a";
368 } else if (isTargetTvOS()) {
369 Library = "libclang_rt.profile_tvos.a";
370 } else if (isTargetTvOSSimulator()) {
371 llvm::sys::path::append(P, "libclang_rt.profile_tvossim.a");
372 Library = getVFS().exists(P) ? "libclang_rt.profile_tvossim.a"
373 : "libclang_rt.profile_tvos.a";
374 } else if (isTargetIPhoneOS()) {
375 Library = "libclang_rt.profile_ios.a";
376 } else if (isTargetIOSSimulator()) {
377 llvm::sys::path::append(P, "libclang_rt.profile_iossim.a");
378 Library = getVFS().exists(P) ? "libclang_rt.profile_iossim.a"
379 : "libclang_rt.profile_ios.a";
Vedant Kumar0affb932015-11-10 00:20:34 +0000380 } else {
381 assert(isTargetMacOS() && "unexpected non MacOS platform");
Vedant Kumar0affb932015-11-10 00:20:34 +0000382 }
Chris Bieneman586d24b2015-11-20 00:19:21 +0000383 AddLinkRuntimeLib(Args, CmdArgs, Library,
384 /*AlwaysLink*/ true);
Justin Bognerc7701242015-05-12 05:44:36 +0000385}
386
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000387void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
388 ArgStringList &CmdArgs,
389 StringRef Sanitizer) const {
390 if (!Args.hasArg(options::OPT_dynamiclib) &&
391 !Args.hasArg(options::OPT_bundle)) {
392 // Sanitizer runtime libraries requires C++.
393 AddCXXStdlibLibArgs(Args, CmdArgs);
394 }
Anna Zakse67b4022016-02-02 02:04:48 +0000395
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000396 AddLinkRuntimeLib(
397 Args, CmdArgs,
Anna Zakse67b4022016-02-02 02:04:48 +0000398 (Twine("libclang_rt.") + Sanitizer + "_" +
399 getOSLibraryNameSuffix() + "_dynamic.dylib").str(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000400 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
401 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000402
403 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
404 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
405 // all RTTI-related symbols that UBSan uses.
406 CmdArgs.push_back("-lc++abi");
407 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000408}
409
Daniel Dunbar6276f992009-09-18 08:15:13 +0000410void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
411 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000412 // Darwin only supports the compiler-rt based runtime libraries.
413 switch (GetRuntimeLibType(Args)) {
414 case ToolChain::RLT_CompilerRT:
415 break;
416 default:
417 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000418 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000419 return;
420 }
421
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000422 // Darwin doesn't support real static executables, don't link any runtime
423 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000424 if (Args.hasArg(options::OPT_static) ||
425 Args.hasArg(options::OPT_fapple_kext) ||
426 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000427 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000428
429 // Reject -static-libgcc for now, we can deal with this when and if someone
430 // cares. This is useful in situations where someone wants to statically link
431 // something like libstdc++, and needs its runtime support routines.
432 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000433 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000434 return;
435 }
436
Peter Collingbourne32701642013-11-01 18:16:25 +0000437 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000438 if (Sanitize.needsAsanRt())
439 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
440 if (Sanitize.needsUbsanRt())
441 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000442 if (Sanitize.needsTsanRt())
443 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Peter Collingbournedc134532016-01-16 00:31:22 +0000444 if (Sanitize.needsStatsRt()) {
445 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
446 AddLinkRuntimeLib(Args, CmdArgs,
447 (Twine("libclang_rt.stats_client_") + OS + ".a").str(),
448 /*AlwaysLink=*/true);
449 AddLinkSanitizerLibArgs(Args, CmdArgs, "stats");
450 }
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000451
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000452 // Otherwise link libSystem, then the dynamic runtime library, and finally any
453 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000454 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000455
456 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000457 if (isTargetWatchOSBased()) {
458 // We currently always need a static runtime library for watchOS.
459 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
460 } else if (isTargetTvOSBased()) {
461 // We currently always need a static runtime library for tvOS.
462 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
463 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000464 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
465 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000466 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000467 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000468 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000469 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000470
Daniel Dunbard1076382011-04-18 23:48:36 +0000471 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000472 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000473 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000474 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000475 // The dynamic runtime library was merged with libSystem for 10.6 and
476 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000477 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000478 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000479 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000480 CmdArgs.push_back("-lgcc_s.10.5");
481
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000482 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000483 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000484 // omitted from 10.4.dylib.
485 //
486 // Unfortunately, that turned out to not be true, because Darwin system
487 // headers can still use eprintf on i386, and it is not exported from
488 // libSystem. Therefore, we still must provide a runtime library just for
489 // the tiny tiny handful of projects that *might* use that symbol.
490 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000491 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000492 } else {
493 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000494 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
495 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000496 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000497 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000498}
499
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000500void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000501 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000502
Daniel Dunbar455a0492012-08-17 18:43:50 +0000503 // Support allowing the SDKROOT environment variable used by xcrun and other
504 // Xcode tools to define the default sysroot, by making it the default for
505 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000506 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
507 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000508 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000509 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
510 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000511 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000512 // We only use this value as the default if it is an absolute path,
513 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000514 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000515 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000516 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000517 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000518 }
519 }
520 }
521
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000522 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000523 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000524 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
525 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000526
Tim Northover6f3ff222015-10-30 16:30:27 +0000527 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000528 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000529 << OSXVersion->getAsString(Args)
530 << (iOSVersion ? iOSVersion :
531 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
532 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
533 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
534 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
535 << iOSVersion->getAsString(Args)
536 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
537 TvOSVersion = WatchOSVersion = nullptr;
538 } else if (TvOSVersion && WatchOSVersion) {
539 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
540 << TvOSVersion->getAsString(Args)
541 << WatchOSVersion->getAsString(Args);
542 WatchOSVersion = nullptr;
543 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000544 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000545 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000546 std::string OSXTarget;
547 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000548 std::string TvOSTarget;
549 std::string WatchOSTarget;
550
Chad Rosier64707fe2011-08-31 20:56:25 +0000551 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
552 OSXTarget = env;
553 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
554 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000555 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
556 TvOSTarget = env;
557 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
558 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000559
Steven Wu7a1372c2015-06-25 01:59:35 +0000560 // If there is no command-line argument to specify the Target version and
561 // no environment variable defined, see if we can set the default based
562 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000563 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Frederic Riss3ad83bd2016-01-12 23:47:59 +0000564 TvOSTarget.empty() && Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000565 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000566 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000567 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
568 size_t BeginSDK = isysroot.rfind("SDKs/");
569 size_t EndSDK = isysroot.rfind(".sdk");
570 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
571 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
572 // Slice the version number out.
573 // Version number is between the first and the last number.
574 size_t StartVer = SDK.find_first_of("0123456789");
575 size_t EndVer = SDK.find_last_of("0123456789");
576 if (StartVer != StringRef::npos && EndVer > StartVer) {
577 StringRef Version = SDK.slice(StartVer, EndVer + 1);
578 if (SDK.startswith("iPhoneOS") ||
579 SDK.startswith("iPhoneSimulator"))
580 iOSTarget = Version;
581 else if (SDK.startswith("MacOSX"))
582 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000583 else if (SDK.startswith("WatchOS") ||
584 SDK.startswith("WatchSimulator"))
585 WatchOSTarget = Version;
586 else if (SDK.startswith("AppleTVOS") ||
587 SDK.startswith("AppleTVSimulator"))
588 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000589 }
590 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000591 }
592 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000593
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000594 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000595 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000596 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
597 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000598 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000599 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000600 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000601 MachOArchName == "arm64") {
602 getTriple().getiOSVersion(Major, Minor, Micro);
603 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
604 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000605 } else if (MachOArchName == "armv7k") {
606 getTriple().getWatchOSVersion(Major, Minor, Micro);
607 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
608 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000609 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
610 MachOArchName != "armv7em") {
611 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
612 getDriver().Diag(diag::err_drv_invalid_darwin_version)
613 << getTriple().getOSName();
614 }
615 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
616 << Micro;
617 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000618 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000619
Tim Northover6f3ff222015-10-30 16:30:27 +0000620 // Do not allow conflicts with the watchOS target.
621 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
622 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
623 << "WATCHOS_DEPLOYMENT_TARGET"
624 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
625 "TVOS_DEPLOYMENT_TARGET");
626 }
627
628 // Do not allow conflicts with the tvOS target.
629 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
630 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
631 << "TVOS_DEPLOYMENT_TARGET"
632 << "IPHONEOS_DEPLOYMENT_TARGET";
633 }
634
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000635 // Allow conflicts among OSX and iOS for historical reasons, but choose the
636 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000637 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
638 !WatchOSTarget.empty() ||
639 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000640 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000641 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000642 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000643 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000644 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000645 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000646 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000647
Chad Rosier64707fe2011-08-31 20:56:25 +0000648 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000649 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000650 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000651 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000652 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000653 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000654 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000655 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000656 } else if (!TvOSTarget.empty()) {
657 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
658 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
659 Args.append(TvOSVersion);
660 } else if (!WatchOSTarget.empty()) {
661 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
662 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
663 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000664 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000665 }
Mike Stump11289f42009-09-09 15:08:12 +0000666
Tim Northover9c7e0352013-12-12 11:55:52 +0000667 DarwinPlatformKind Platform;
668 if (OSXVersion)
669 Platform = MacOS;
670 else if (iOSVersion)
671 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000672 else if (TvOSVersion)
673 Platform = TvOS;
674 else if (WatchOSVersion)
675 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000676 else
Tim Northover157d9112014-01-16 08:48:16 +0000677 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000678
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000679 // Set the tool chain target information.
680 unsigned Major, Minor, Micro;
681 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000682 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000683 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
684 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000685 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
686 HadExtra) ||
687 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000688 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000689 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000690 } else if (Platform == IPhoneOS) {
691 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000692 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
693 HadExtra) ||
694 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000695 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000696 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000697 } else if (Platform == TvOS) {
698 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
699 Micro, HadExtra) || HadExtra ||
700 Major >= 10 || Minor >= 100 || Micro >= 100)
701 getDriver().Diag(diag::err_drv_invalid_version_number)
702 << TvOSVersion->getAsString(Args);
703 } else if (Platform == WatchOS) {
704 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
705 Micro, HadExtra) || HadExtra ||
706 Major >= 10 || Minor >= 100 || Micro >= 100)
707 getDriver().Diag(diag::err_drv_invalid_version_number)
708 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000709 } else
710 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000711
Bob Wilson7f294b52014-10-10 23:10:10 +0000712 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000713 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
714 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000715 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000716 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
717 getTriple().getArch() == llvm::Triple::x86_64))
718 Platform = TvOSSimulator;
719 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
720 getTriple().getArch() == llvm::Triple::x86_64))
721 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000722
Tim Northover9c7e0352013-12-12 11:55:52 +0000723 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000724}
725
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000726void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000727 ArgStringList &CmdArgs) const {
728 CXXStdlibType Type = GetCXXStdlibType(Args);
729
730 switch (Type) {
731 case ToolChain::CST_Libcxx:
732 CmdArgs.push_back("-lc++");
733 break;
734
Hans Wennborgdcfba332015-10-06 23:40:43 +0000735 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000736 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
737 // it was previously found in the gcc lib dir. However, for all the Darwin
738 // platforms we care about it was -lstdc++.6, so we search for that
739 // explicitly if we can't see an obvious -lstdc++ candidate.
740
741 // Check in the sysroot first.
742 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000743 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000744 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000745
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000746 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000747 llvm::sys::path::remove_filename(P);
748 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000749 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000750 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000751 return;
752 }
753 }
754 }
755
756 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000757 // FIXME: This should be removed someday when we don't have to care about
758 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000759 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
760 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000761 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
762 return;
763 }
764
765 // Otherwise, let the linker search.
766 CmdArgs.push_back("-lstdc++");
767 break;
768 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000769}
770
Shantonu Senafeb03b2010-09-17 18:39:08 +0000771void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
772 ArgStringList &CmdArgs) const {
Shantonu Senafeb03b2010-09-17 18:39:08 +0000773 // For Darwin platforms, use the compiler-rt-based support library
774 // instead of the gcc-provided one (which is also incidentally
775 // only present in the gcc lib dir, which makes it hard to find).
776
Rafael Espindola358256c2013-06-26 02:13:00 +0000777 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000778 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000779
780 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000781 if (isTargetWatchOS()) {
782 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
783 } else if (isTargetTvOS()) {
784 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
785 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000786 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000787 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000788 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000789 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000790
Shantonu Senafeb03b2010-09-17 18:39:08 +0000791 // For now, allow missing resource libraries to support developers who may
792 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000793 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000794 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000795}
796
Tim Northover157d9112014-01-16 08:48:16 +0000797DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
798 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000799 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
800 const OptTable &Opts = getDriver().getOpts();
801
802 // FIXME: We really want to get out of the tool chain level argument
803 // translation business, as it makes the driver functionality much
804 // more opaque. For now, we follow gcc closely solely for the
805 // purpose of easily achieving feature parity & testability. Once we
806 // have something that works, we should reevaluate each translation
807 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000808
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000809 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000810 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000811 // Skip this argument unless the architecture matches either the toolchain
812 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000813 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000814 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
815 if (!(XarchArch == getArch() ||
816 (BoundArch &&
817 XarchArch ==
818 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000819 continue;
820
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000821 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000822 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000823 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000824 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000825
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000826 // If the argument parsing failed or more than one argument was
827 // consumed, the -Xarch_ argument's parameter tried to consume
828 // extra arguments. Emit an error and ignore.
829 //
830 // We also want to disallow any options which would alter the
831 // driver behavior; that isn't going to work in our model. We
832 // use isDriverOption() as an approximation, although things
833 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000834 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000835 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000836 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000837 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000838 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000839 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000840 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000841 continue;
842 }
843
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000844 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000845
Nico Webera04d5f82014-05-11 17:27:13 +0000846 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000847 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000848
849 // Linker input arguments require custom handling. The problem is that we
850 // have already constructed the phase actions, so we can not treat them as
851 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000852 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000853 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000854 for (const char *Value : A->getValues()) {
855 DAL->AddSeparateArg(
856 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000857 }
858 continue;
859 }
Mike Stump11289f42009-09-09 15:08:12 +0000860 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000861
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000862 // Sob. These is strictly gcc compatible for the time being. Apple
863 // gcc translates options twice, which means that self-expanding
864 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000865 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000866 default:
867 DAL->append(A);
868 break;
869
870 case options::OPT_mkernel:
871 case options::OPT_fapple_kext:
872 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000873 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000874 break;
Mike Stump11289f42009-09-09 15:08:12 +0000875
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000876 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000877 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000878 break;
879
880 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000881 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000882 DAL->AddFlagArg(
883 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000884 break;
885
886 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000887 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000888 DAL->AddFlagArg(
889 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000890 break;
891
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000892 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000893 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000894 break;
895
896 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000897 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000898 break;
899
900 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000901 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000902 break;
903
904 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000905 DAL->AddFlagArg(A,
906 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000907 break;
908
909 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000910 DAL->AddFlagArg(
911 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000912 break;
913
914 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000915 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000916 break;
917
918 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000919 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000920 break;
921 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000922 }
923
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000924 if (getTriple().getArch() == llvm::Triple::x86 ||
925 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000926 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000927 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
928 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000929
930 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000931 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000932 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000933 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000934 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
935 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000936
937 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
938 // which defines the list of which architectures we accept.
939 if (Name == "ppc")
940 ;
941 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000942 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000943 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000944 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000945 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000946 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000947 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000948 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000949 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000950 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000951 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000952 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000953 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000954 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000955 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000956 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000957
Bill Schmidt778d3872013-07-26 01:36:11 +0000958 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000959 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000960
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000961 else if (Name == "i386")
962 ;
963 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000964 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000965 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000966 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000967 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000968 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000969 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000970 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000971 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000972 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000973 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000974 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000975 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000976 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000977
978 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000979 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000980 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000981 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
982 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000983 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000984
985 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000986 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000987 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000988 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000989 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000990 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000991 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000992 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000993 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000994 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000995 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000996 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000997 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000998 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000999 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +00001000 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001001 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +00001002 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +00001003 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +00001004 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +00001005 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +00001006 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +00001007 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +00001008
Tim Northover157d9112014-01-16 08:48:16 +00001009 return DAL;
1010}
1011
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001012void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
1013 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001014 // Embedded targets are simple at the moment, not supporting sanitizers and
1015 // with different libraries for each member of the product { static, PIC } x
1016 // { hard-float, soft-float }
1017 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00001018 CompilerRT +=
1019 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
1020 ? "hard"
1021 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +00001022 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
1023
1024 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
1025}
1026
Tim Northover157d9112014-01-16 08:48:16 +00001027DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
1028 const char *BoundArch) const {
1029 // First get the generic Apple args, before moving onto Darwin-specific ones.
1030 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
Tim Northoverb534ce42016-02-12 22:30:42 +00001031 const OptTable &Opts = getDriver().getOpts();
Tim Northover157d9112014-01-16 08:48:16 +00001032
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001033 // If no architecture is bound, none of the translations here are relevant.
1034 if (!BoundArch)
1035 return DAL;
1036
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001037 // Add an explicit version min argument for the deployment target. We do this
1038 // after argument translation because -Xarch_ arguments may add a version min
1039 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001040 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001041
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001042 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
1043 // FIXME: It would be far better to avoid inserting those -static arguments,
1044 // but we can't check the deployment target in the translation code until
1045 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +00001046 if (isTargetWatchOSBased() ||
1047 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1048 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001049 Arg *A = *it;
1050 ++it;
1051 if (A->getOption().getID() != options::OPT_mkernel &&
1052 A->getOption().getID() != options::OPT_fapple_kext)
1053 continue;
1054 assert(it != ie && "unexpected argument translation");
1055 A = *it;
1056 assert(A->getOption().getID() == options::OPT_static &&
1057 "missing expected -static argument");
1058 it = DAL->getArgs().erase(it);
1059 }
1060 }
1061
Tim Northoverb534ce42016-02-12 22:30:42 +00001062 if (!Args.getLastArg(options::OPT_stdlib_EQ) &&
Tim Northover3a098c12016-02-15 16:38:10 +00001063 GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
Tim Northoverb534ce42016-02-12 22:30:42 +00001064 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1065 "libc++");
1066
Bob Wilson102be442011-10-07 17:54:41 +00001067 // Validate the C++ standard library choice.
1068 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1069 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001070 // Check whether the target provides libc++.
1071 StringRef where;
1072
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001073 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001074 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001075 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001076
1077 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001078 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001079 }
1080 }
1081
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001082 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001083}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001084
Tim Northover157d9112014-01-16 08:48:16 +00001085bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001086 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001087}
1088
Tim Northover157d9112014-01-16 08:48:16 +00001089bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001090 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1091 return S[0] != '\0';
1092 return false;
1093}
1094
Tim Northovere931f9f2015-10-30 16:30:41 +00001095bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001096 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001097 if (getTriple().getArch() != llvm::Triple::arm &&
1098 getTriple().getArch() != llvm::Triple::thumb)
1099 return false;
1100
Tim Northoverc741b042015-11-17 18:27:27 +00001101 // Only watchOS uses the new DWARF/Compact unwinding method.
Tim Northoverd88ecb32016-01-27 19:32:40 +00001102 llvm::Triple Triple(ComputeLLVMTriple(Args));
Tim Northover4c9ac7d2016-01-27 22:14:02 +00001103 return !Triple.isWatchABI();
Daniel Dunbar3241d402010-02-10 18:49:11 +00001104}
1105
Steven Wu574b0f22016-03-01 01:07:58 +00001106bool Darwin::SupportsEmbeddedBitcode() const {
1107 assert(TargetInitialized && "Target not initialized!");
1108 if (isTargetIPhoneOS() && isIPhoneOSVersionLT(6, 0))
1109 return false;
1110 return true;
1111}
1112
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001113bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001114
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001115bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001116
Tim Northover157d9112014-01-16 08:48:16 +00001117bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001118 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001119 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001120}
1121
Tim Northover157d9112014-01-16 08:48:16 +00001122bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001123 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001124 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001125}
1126
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001127void Darwin::addMinVersionArgs(const ArgList &Args,
1128 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001129 VersionTuple TargetVersion = getTargetVersion();
1130
Tim Northover6f3ff222015-10-30 16:30:27 +00001131 if (isTargetWatchOS())
1132 CmdArgs.push_back("-watchos_version_min");
1133 else if (isTargetWatchOSSimulator())
1134 CmdArgs.push_back("-watchos_simulator_version_min");
1135 else if (isTargetTvOS())
1136 CmdArgs.push_back("-tvos_version_min");
1137 else if (isTargetTvOSSimulator())
1138 CmdArgs.push_back("-tvos_simulator_version_min");
1139 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001140 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001141 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001142 CmdArgs.push_back("-iphoneos_version_min");
1143 else {
1144 assert(isTargetMacOS() && "unexpected target");
1145 CmdArgs.push_back("-macosx_version_min");
1146 }
1147
1148 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1149}
1150
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001151void Darwin::addStartObjectFileArgs(const ArgList &Args,
1152 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001153 // Derived from startfile spec.
1154 if (Args.hasArg(options::OPT_dynamiclib)) {
1155 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001156 if (isTargetWatchOSBased()) {
1157 ; // watchOS does not need dylib1.o.
1158 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001159 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001160 } else if (isTargetIPhoneOS()) {
1161 if (isIPhoneOSVersionLT(3, 1))
1162 CmdArgs.push_back("-ldylib1.o");
1163 } else {
1164 if (isMacosxVersionLT(10, 5))
1165 CmdArgs.push_back("-ldylib1.o");
1166 else if (isMacosxVersionLT(10, 6))
1167 CmdArgs.push_back("-ldylib1.10.5.o");
1168 }
1169 } else {
1170 if (Args.hasArg(options::OPT_bundle)) {
1171 if (!Args.hasArg(options::OPT_static)) {
1172 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001173 if (isTargetWatchOSBased()) {
1174 ; // watchOS does not need bundle1.o.
1175 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001176 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001177 } else if (isTargetIPhoneOS()) {
1178 if (isIPhoneOSVersionLT(3, 1))
1179 CmdArgs.push_back("-lbundle1.o");
1180 } else {
1181 if (isMacosxVersionLT(10, 6))
1182 CmdArgs.push_back("-lbundle1.o");
1183 }
1184 }
1185 } else {
1186 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1187 if (Args.hasArg(options::OPT_static) ||
1188 Args.hasArg(options::OPT_object) ||
1189 Args.hasArg(options::OPT_preload)) {
1190 CmdArgs.push_back("-lgcrt0.o");
1191 } else {
1192 CmdArgs.push_back("-lgcrt1.o");
1193
1194 // darwin_crt2 spec is empty.
1195 }
1196 // By default on OS X 10.8 and later, we don't link with a crt1.o
1197 // file and the linker knows to use _main as the entry point. But,
1198 // when compiling with -pg, we need to link with the gcrt1.o file,
1199 // so pass the -no_new_main option to tell the linker to use the
1200 // "start" symbol as the entry point.
1201 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1202 CmdArgs.push_back("-no_new_main");
1203 } else {
1204 if (Args.hasArg(options::OPT_static) ||
1205 Args.hasArg(options::OPT_object) ||
1206 Args.hasArg(options::OPT_preload)) {
1207 CmdArgs.push_back("-lcrt0.o");
1208 } else {
1209 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001210 if (isTargetWatchOSBased()) {
1211 ; // watchOS does not need crt1.o.
1212 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001213 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001214 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001215 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001216 ; // iOS does not need any crt1 files for arm64
1217 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001218 CmdArgs.push_back("-lcrt1.o");
1219 else if (isIPhoneOSVersionLT(6, 0))
1220 CmdArgs.push_back("-lcrt1.3.1.o");
1221 } else {
1222 if (isMacosxVersionLT(10, 5))
1223 CmdArgs.push_back("-lcrt1.o");
1224 else if (isMacosxVersionLT(10, 6))
1225 CmdArgs.push_back("-lcrt1.10.5.o");
1226 else if (isMacosxVersionLT(10, 8))
1227 CmdArgs.push_back("-lcrt1.10.6.o");
1228
1229 // darwin_crt2 spec is empty.
1230 }
1231 }
1232 }
1233 }
1234 }
1235
1236 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001237 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001238 isMacosxVersionLT(10, 5)) {
1239 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1240 CmdArgs.push_back(Str);
1241 }
1242}
1243
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001244bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001245
John McCall3deb1ad2012-08-21 02:47:43 +00001246void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001247 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1248 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001249 return;
John McCall93207072012-08-27 01:56:21 +00001250 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001251}
1252
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001253SanitizerMask Darwin::getSupportedSanitizers() const {
1254 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Anna Zakse67b4022016-02-02 02:04:48 +00001255 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001256 if (isTargetMacOS()) {
1257 if (!isMacosxVersionLT(10, 9))
1258 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001259 Res |= SanitizerKind::SafeStack;
Kuba Brecka85e01c02015-11-06 15:09:20 +00001260 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001261 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001262 return Res;
1263}
1264
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001265/// Generic_GCC - A tool chain using the 'gcc' command to perform
1266/// all subcommands; this relies on gcc translating the majority of
1267/// command line options.
1268
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001269/// \brief Parse a GCCVersion object out of a string of text.
1270///
1271/// This is the primary means of forming GCCVersion objects.
1272/*static*/
1273Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001274 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001275 std::pair<StringRef, StringRef> First = VersionText.split('.');
1276 std::pair<StringRef, StringRef> Second = First.second.split('.');
1277
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001278 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1279 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001280 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001281 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001282 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001283 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001284 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001285
1286 // First look for a number prefix and parse that if present. Otherwise just
1287 // stash the entire patch string in the suffix, and leave the number
1288 // unspecified. This covers versions strings such as:
1289 // 4.4
1290 // 4.4.0
1291 // 4.4.x
1292 // 4.4.2-rc4
1293 // 4.4.x-patched
1294 // And retains any patch number it finds.
1295 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1296 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001297 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001298 // Try to parse the number and any suffix.
1299 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1300 GoodVersion.Patch < 0)
1301 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001302 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001303 }
1304 }
1305
1306 return GoodVersion;
1307}
1308
1309/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001310bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1311 int RHSPatch,
1312 StringRef RHSPatchSuffix) const {
1313 if (Major != RHSMajor)
1314 return Major < RHSMajor;
1315 if (Minor != RHSMinor)
1316 return Minor < RHSMinor;
1317 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001318 // Note that versions without a specified patch sort higher than those with
1319 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001320 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001321 return true;
1322 if (Patch == -1)
1323 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001324
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001325 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001326 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001327 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001328 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001329 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001330 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001331 return true;
1332 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001333 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001334
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001335 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001336 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001337 }
1338
1339 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001340 return false;
1341}
1342
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001343static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001344 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1345 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001346 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001347 return GCC_INSTALL_PREFIX;
1348}
1349
Roman Divacky326d9982013-12-06 18:32:18 +00001350/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001351///
1352/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001353/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001354///
1355/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1356/// should instead pull the target out of the driver. This is currently
1357/// necessary because the driver doesn't store the final version of the target
1358/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001359void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001360 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001361 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001362 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1363 ? TargetTriple.get64BitArchVariant()
1364 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001365 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001366 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001367 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001368 SmallVector<StringRef, 16> CandidateTripleAliases;
1369 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001370 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1371 CandidateTripleAliases, CandidateBiarchLibDirs,
1372 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001373
1374 // Compute the set of prefixes for our search.
1375 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1376 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001377
Rafael Espindola1af7c212012-02-19 01:38:32 +00001378 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1379 if (GCCToolchainDir != "") {
1380 if (GCCToolchainDir.back() == '/')
1381 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001382
Rafael Espindola1af7c212012-02-19 01:38:32 +00001383 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001384 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001385 // If we have a SysRoot, try that first.
1386 if (!D.SysRoot.empty()) {
1387 Prefixes.push_back(D.SysRoot);
1388 Prefixes.push_back(D.SysRoot + "/usr");
1389 }
1390
1391 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001392 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001393
1394 // And finally in /usr.
1395 if (D.SysRoot.empty())
1396 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001397 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001398
1399 // Loop over the various components which exist and select the best GCC
1400 // installation available. GCC installs are ranked by version number.
1401 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001402 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001403 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001404 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001405 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001406 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001407 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001408 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001409 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001410 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001411 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001412 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001413 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001414 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001415 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001416 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001417 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001418 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001419 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001420 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001421 }
1422 }
1423}
1424
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001425void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001426 for (const auto &InstallPath : CandidateGCCInstallPaths)
1427 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001428
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001429 if (!GCCInstallPath.empty())
1430 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1431
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001432 for (const auto &Multilib : Multilibs)
1433 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001434
1435 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1436 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001437}
1438
1439bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1440 if (BiarchSibling.hasValue()) {
1441 M = BiarchSibling.getValue();
1442 return true;
1443 }
1444 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001445}
1446
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001447/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001448 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001449 SmallVectorImpl<StringRef> &LibDirs,
1450 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001451 SmallVectorImpl<StringRef> &BiarchLibDirs,
1452 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001453 // Declare a bunch of static data sets that we'll select between below. These
1454 // are specifically designed to always refer to string literals to avoid any
1455 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001456 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1457 static const char *const AArch64Triples[] = {
1458 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1459 "aarch64-redhat-linux"};
1460 static const char *const AArch64beLibDirs[] = {"/lib"};
1461 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1462 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001463
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001464 static const char *const ARMLibDirs[] = {"/lib"};
1465 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1466 "arm-linux-androideabi"};
1467 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1468 "armv7hl-redhat-linux-gnueabi"};
1469 static const char *const ARMebLibDirs[] = {"/lib"};
1470 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1471 "armeb-linux-androideabi"};
1472 static const char *const ARMebHFTriples[] = {
1473 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001474
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001475 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001476 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001477 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1478 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1479 "x86_64-redhat-linux", "x86_64-suse-linux",
1480 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1481 "x86_64-slackware-linux", "x86_64-linux-android",
1482 "x86_64-unknown-linux"};
1483 static const char *const X32LibDirs[] = {"/libx32"};
1484 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001485 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001486 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1487 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1488 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1489 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1490 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001491
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001492 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001493 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1494 "mips-mti-linux-gnu",
1495 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001496 static const char *const MIPSELLibDirs[] = {"/lib"};
1497 static const char *const MIPSELTriples[] = {
1498 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001499
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001500 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1501 static const char *const MIPS64Triples[] = {
1502 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1503 "mips64-linux-gnuabi64"};
1504 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1505 static const char *const MIPS64ELTriples[] = {
1506 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1507 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001508
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001509 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001510 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001511 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1512 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1513 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1514 static const char *const PPC64Triples[] = {
1515 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1516 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1517 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1518 static const char *const PPC64LETriples[] = {
1519 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1520 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001521
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001522 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1523 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1524 "sparcv8-linux-gnu"};
1525 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1526 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1527 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001528
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001529 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001530 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001531 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1532 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001533
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001534 // Solaris.
1535 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1536 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1537 "i386-pc-solaris2.11"};
1538
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001539 using std::begin;
1540 using std::end;
1541
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001542 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1543 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1544 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001545 return;
1546 }
1547
Chandler Carruth866faab2012-01-25 07:21:38 +00001548 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001549 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001550 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1551 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1552 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1553 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001554 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001555 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001556 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1557 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1558 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1559 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001560 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001561 case llvm::Triple::arm:
1562 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001563 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001564 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001565 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001566 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001567 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001568 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001569 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001570 case llvm::Triple::armeb:
1571 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001572 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001573 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001574 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001575 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001576 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001577 }
1578 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001579 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001580 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1581 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1582 // x32 is always available when x86_64 is available, so adding it as
1583 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001584 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001585 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1586 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001587 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001588 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1589 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001590 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001591 break;
1592 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001593 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1594 TripleAliases.append(begin(X86Triples), end(X86Triples));
1595 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1596 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001597 break;
1598 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001599 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1600 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1601 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1602 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001603 break;
1604 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001605 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1606 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1607 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1608 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1609 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001610 break;
1611 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001612 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1613 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1614 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1615 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001616 break;
1617 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001618 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1619 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1620 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1621 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1622 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001623 break;
1624 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001625 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1626 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1627 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1628 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001629 break;
1630 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001631 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1632 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1633 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1634 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001635 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001636 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001637 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1638 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001639 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001640 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001641 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001642 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1643 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1644 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1645 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001646 break;
1647 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001648 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1649 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1650 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1651 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001652 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001653 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001654 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1655 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001656 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001657 default:
1658 // By default, just rely on the standard lib directories and the original
1659 // triple.
1660 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001661 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001662
1663 // Always append the drivers target triple to the end, in case it doesn't
1664 // match any of our aliases.
1665 TripleAliases.push_back(TargetTriple.str());
1666
1667 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001668 if (TargetTriple.str() != BiarchTriple.str())
1669 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001670}
1671
Artem Belevich98607b62015-09-23 21:49:39 +00001672// \brief -- try common CUDA installation paths looking for files we need for
1673// CUDA compilation.
1674
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001675void Generic_GCC::CudaInstallationDetector::init(
1676 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001677 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001678
1679 if (Args.hasArg(options::OPT_cuda_path_EQ))
1680 CudaPathCandidates.push_back(
1681 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1682 else {
1683 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
Artem Belevich86017332015-11-17 22:28:55 +00001684 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001685 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1686 }
1687
Benjamin Kramere8b76412015-09-24 14:48:37 +00001688 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001689 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001690 continue;
1691
1692 CudaInstallPath = CudaPath;
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001693 CudaBinPath = CudaPath + "/bin";
Artem Belevich98607b62015-09-23 21:49:39 +00001694 CudaIncludePath = CudaInstallPath + "/include";
1695 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1696 CudaLibPath =
1697 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1698
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001699 if (!(D.getVFS().exists(CudaIncludePath) &&
Justin Lebar21e5d4f2016-01-14 21:41:27 +00001700 D.getVFS().exists(CudaBinPath) && D.getVFS().exists(CudaLibPath) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001701 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001702 continue;
1703
Artem Belevich34f481a2015-11-17 22:28:50 +00001704 std::error_code EC;
1705 for (llvm::sys::fs::directory_iterator LI(CudaLibDevicePath, EC), LE;
1706 !EC && LI != LE; LI = LI.increment(EC)) {
1707 StringRef FilePath = LI->path();
1708 StringRef FileName = llvm::sys::path::filename(FilePath);
1709 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1710 const StringRef LibDeviceName = "libdevice.";
1711 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1712 continue;
1713 StringRef GpuArch = FileName.slice(
1714 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
1715 CudaLibDeviceMap[GpuArch] = FilePath.str();
1716 // Insert map entries for specifc devices with this compute capability.
1717 if (GpuArch == "compute_20") {
1718 CudaLibDeviceMap["sm_20"] = FilePath;
1719 CudaLibDeviceMap["sm_21"] = FilePath;
1720 } else if (GpuArch == "compute_30") {
1721 CudaLibDeviceMap["sm_30"] = FilePath;
1722 CudaLibDeviceMap["sm_32"] = FilePath;
1723 } else if (GpuArch == "compute_35") {
1724 CudaLibDeviceMap["sm_35"] = FilePath;
1725 CudaLibDeviceMap["sm_37"] = FilePath;
1726 }
1727 }
1728
Artem Belevich98607b62015-09-23 21:49:39 +00001729 IsValid = true;
1730 break;
1731 }
1732}
1733
1734void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1735 if (isValid())
1736 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1737}
1738
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001739namespace {
1740// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001741class FilterNonExistent {
1742 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001743 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001744
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001745public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001746 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1747 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001748 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001749 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001750 }
1751};
1752} // end anonymous namespace
1753
1754static void addMultilibFlag(bool Enabled, const char *const Flag,
1755 std::vector<std::string> &Flags) {
1756 if (Enabled)
1757 Flags.push_back(std::string("+") + Flag);
1758 else
1759 Flags.push_back(std::string("-") + Flag);
1760}
1761
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001762static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001763 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1764 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1765}
1766
1767static bool isMips32(llvm::Triple::ArchType Arch) {
1768 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1769}
1770
1771static bool isMips64(llvm::Triple::ArchType Arch) {
1772 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1773}
1774
1775static bool isMipsEL(llvm::Triple::ArchType Arch) {
1776 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1777}
1778
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001779static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001780 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001781 return A && A->getOption().matches(options::OPT_mips16);
1782}
1783
1784static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001785 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001786 return A && A->getOption().matches(options::OPT_mmicromips);
1787}
1788
Benjamin Kramere003ca22015-10-28 13:54:16 +00001789namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001790struct DetectedMultilibs {
1791 /// The set of multilibs that the detected installation supports.
1792 MultilibSet Multilibs;
1793
1794 /// The primary multilib appropriate for the given flags.
1795 Multilib SelectedMultilib;
1796
1797 /// On Biarch systems, this corresponds to the default multilib when
1798 /// targeting the non-default multilib. Otherwise, it is empty.
1799 llvm::Optional<Multilib> BiarchSibling;
1800};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001801} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001802
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001803static Multilib makeMultilib(StringRef commonSuffix) {
1804 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1805}
1806
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001807static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1808 StringRef Path, const ArgList &Args,
1809 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001810 // Some MIPS toolchains put libraries and object files compiled
1811 // using different options in to the sub-directoris which names
1812 // reflects the flags used for compilation. For example sysroot
1813 // directory might looks like the following examples:
1814 //
1815 // /usr
1816 // /lib <= crt*.o files compiled with '-mips32'
1817 // /mips16
1818 // /usr
1819 // /lib <= crt*.o files compiled with '-mips16'
1820 // /el
1821 // /usr
1822 // /lib <= crt*.o files compiled with '-mips16 -EL'
1823 //
1824 // or
1825 //
1826 // /usr
1827 // /lib <= crt*.o files compiled with '-mips32r2'
1828 // /mips16
1829 // /usr
1830 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1831 // /mips32
1832 // /usr
1833 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001834
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001835 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001836
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001837 // Check for FSF toolchain multilibs
1838 MultilibSet FSFMipsMultilibs;
1839 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001840 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001841 .flag("+m32")
1842 .flag("-m64")
1843 .flag("-mmicromips")
1844 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001845
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001846 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001847 .flag("+m32")
1848 .flag("-m64")
1849 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001850
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001851 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001852 .flag("-m32")
1853 .flag("+m64")
1854 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001855
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001856 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1857 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001858
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001859 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001860 .flag("+m32")
1861 .flag("-m64")
1862 .flag("-mmicromips")
1863 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001864
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001865 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001866
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001867 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001868
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001869 auto MAbi64 =
1870 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001871
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001872 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001873
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001874 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001875
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001876 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001877
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001878 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001879
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001880 FSFMipsMultilibs =
1881 MultilibSet()
1882 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1883 MArchDefault)
1884 .Maybe(UCLibc)
1885 .Maybe(Mips16)
1886 .FilterOut("/mips64/mips16")
1887 .FilterOut("/mips64r2/mips16")
1888 .FilterOut("/micromips/mips16")
1889 .Maybe(MAbi64)
1890 .FilterOut("/micromips/64")
1891 .FilterOut("/mips32/64")
1892 .FilterOut("^/64")
1893 .FilterOut("/mips16/64")
1894 .Either(BigEndian, LittleEndian)
1895 .Maybe(SoftFloat)
1896 .Maybe(Nan2008)
1897 .FilterOut(".*sof/nan2008")
1898 .FilterOut(NonExistent)
1899 .setIncludeDirsCallback([](StringRef InstallDir,
1900 StringRef TripleStr, const Multilib &M) {
1901 std::vector<std::string> Dirs;
1902 Dirs.push_back((InstallDir + "/include").str());
1903 std::string SysRootInc =
1904 InstallDir.str() + "/../../../../sysroot";
1905 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1906 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1907 else
1908 Dirs.push_back(SysRootInc + "/usr/include");
1909 return Dirs;
1910 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001911 }
1912
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001913 // Check for Musl toolchain multilibs
1914 MultilibSet MuslMipsMultilibs;
1915 {
1916 auto MArchMipsR2 = makeMultilib("")
1917 .osSuffix("/mips-r2-hard-musl")
1918 .flag("+EB")
1919 .flag("-EL")
1920 .flag("+march=mips32r2");
1921
1922 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1923 .flag("-EB")
1924 .flag("+EL")
1925 .flag("+march=mips32r2");
1926
1927 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1928
1929 // Specify the callback that computes the include directories.
1930 MuslMipsMultilibs.setIncludeDirsCallback([](
1931 StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1932 std::vector<std::string> Dirs;
1933 Dirs.push_back(
1934 (InstallDir + "/../sysroot" + M.osSuffix() + "/usr/include").str());
1935 return Dirs;
1936 });
1937 }
1938
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001939 // Check for Code Sourcery toolchain multilibs
1940 MultilibSet CSMipsMultilibs;
1941 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001942 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001943
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001944 auto MArchMicroMips =
1945 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001946
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001947 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001948
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001949 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001950
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001951 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001952
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001953 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001954
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001955 auto DefaultFloat =
1956 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001957
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001958 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001959
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001960 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001961
1962 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001963 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001964 .gccSuffix("/64")
1965 .includeSuffix("/64")
1966 .flag("+mabi=n64")
1967 .flag("-mabi=n32")
1968 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001969
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001970 CSMipsMultilibs =
1971 MultilibSet()
1972 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1973 .Maybe(UCLibc)
1974 .Either(SoftFloat, Nan2008, DefaultFloat)
1975 .FilterOut("/micromips/nan2008")
1976 .FilterOut("/mips16/nan2008")
1977 .Either(BigEndian, LittleEndian)
1978 .Maybe(MAbi64)
1979 .FilterOut("/mips16.*/64")
1980 .FilterOut("/micromips.*/64")
1981 .FilterOut(NonExistent)
1982 .setIncludeDirsCallback([](StringRef InstallDir,
1983 StringRef TripleStr, const Multilib &M) {
1984 std::vector<std::string> Dirs;
1985 Dirs.push_back((InstallDir + "/include").str());
1986 std::string SysRootInc =
1987 InstallDir.str() + "/../../../../" + TripleStr.str();
1988 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1989 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1990 else
1991 Dirs.push_back(SysRootInc + "/libc/usr/include");
1992 return Dirs;
1993 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001994 }
1995
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001996 MultilibSet AndroidMipsMultilibs =
1997 MultilibSet()
1998 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1999 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
2000 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002001
2002 MultilibSet DebianMipsMultilibs;
2003 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002004 Multilib MAbiN32 =
2005 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002006
2007 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002008 .gccSuffix("/64")
2009 .includeSuffix("/64")
2010 .flag("+m64")
2011 .flag("-m32")
2012 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002013
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002014 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002015
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002016 DebianMipsMultilibs =
2017 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002018 }
2019
Daniel Sanders2bf13662014-07-10 14:40:57 +00002020 MultilibSet ImgMultilibs;
2021 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002022 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002023
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002024 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002025
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002026 auto MAbi64 =
2027 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00002028
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002029 ImgMultilibs =
2030 MultilibSet()
2031 .Maybe(Mips64r6)
2032 .Maybe(MAbi64)
2033 .Maybe(LittleEndian)
2034 .FilterOut(NonExistent)
2035 .setIncludeDirsCallback([](StringRef InstallDir,
2036 StringRef TripleStr, const Multilib &M) {
2037 std::vector<std::string> Dirs;
2038 Dirs.push_back((InstallDir + "/include").str());
2039 Dirs.push_back(
2040 (InstallDir + "/../../../../sysroot/usr/include").str());
2041 return Dirs;
2042 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002043 }
2044
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002045 StringRef CPUName;
2046 StringRef ABIName;
2047 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2048
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002049 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2050
2051 Multilib::flags_list Flags;
2052 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2053 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2054 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002055 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002056 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002057 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002058 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002059 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002060 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002061 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2062 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002063 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002064 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002065 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002066 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2067 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002068 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2069 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002070 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002071 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002072 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002073 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002074
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002075 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002076 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00002077 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2078 Result.Multilibs = AndroidMipsMultilibs;
2079 return true;
2080 }
2081 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002082 }
2083
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002084 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2085 TargetTriple.getOS() == llvm::Triple::Linux &&
2086 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2087 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2088 Result.Multilibs = MuslMipsMultilibs;
2089 return true;
2090 }
2091 return false;
2092 }
2093
Daniel Sanders2bf13662014-07-10 14:40:57 +00002094 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2095 TargetTriple.getOS() == llvm::Triple::Linux &&
2096 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2097 // Select mips-img-linux-gnu toolchain.
2098 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
2099 Result.Multilibs = ImgMultilibs;
2100 return true;
2101 }
2102 return false;
2103 }
2104
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002105 // Sort candidates. Toolchain that best meets the directories goes first.
2106 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002107 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
2108 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002109 std::sort(
2110 std::begin(candidates), std::end(candidates),
2111 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2112 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002113 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002114 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002115 Result.BiarchSibling = Multilib();
2116 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002117 return true;
2118 }
2119 }
2120
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002121 {
2122 // Fallback to the regular toolchain-tree structure.
2123 Multilib Default;
2124 Result.Multilibs.push_back(Default);
2125 Result.Multilibs.FilterOut(NonExistent);
2126
2127 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2128 Result.BiarchSibling = Multilib();
2129 return true;
2130 }
2131 }
2132
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002133 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002134}
2135
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002136static bool findBiarchMultilibs(const Driver &D,
2137 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002138 StringRef Path, const ArgList &Args,
2139 bool NeedsBiarchSuffix,
2140 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002141 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2142 // in what would normally be GCCInstallPath and put the 64-bit
2143 // libs in a subdirectory named 64. The simple logic we follow is that
2144 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2145 // we use that. If not, and if not a biarch triple alias, we look for
2146 // crtbegin.o without the subdirectory.
2147
2148 Multilib Default;
2149 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002150 .gccSuffix("/64")
2151 .includeSuffix("/64")
2152 .flag("-m32")
2153 .flag("+m64")
2154 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002155 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002156 .gccSuffix("/32")
2157 .includeSuffix("/32")
2158 .flag("+m32")
2159 .flag("-m64")
2160 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002161 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002162 .gccSuffix("/x32")
2163 .includeSuffix("/x32")
2164 .flag("-m32")
2165 .flag("-m64")
2166 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002167
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002168 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002169
Zinovy Nis1db95732014-07-10 15:27:19 +00002170 // Determine default multilib from: 32, 64, x32
2171 // Also handle cases such as 64 on 32, 32 on 64, etc.
2172 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002173 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002174 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002175 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002176 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002177 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002178 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002179 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002180 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002181 if (TargetTriple.isArch32Bit())
2182 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002183 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002184 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002185 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002186 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002187 }
2188
Zinovy Nis1db95732014-07-10 15:27:19 +00002189 if (Want == WANT32)
2190 Default.flag("+m32").flag("-m64").flag("-mx32");
2191 else if (Want == WANT64)
2192 Default.flag("-m32").flag("+m64").flag("-mx32");
2193 else if (Want == WANTX32)
2194 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002195 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002196 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002197
Simon Atanasyan60280b42014-05-12 07:37:51 +00002198 Result.Multilibs.push_back(Default);
2199 Result.Multilibs.push_back(Alt64);
2200 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002201 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002202
Simon Atanasyan60280b42014-05-12 07:37:51 +00002203 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002204
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002205 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002206 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002207 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002208 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002209
Simon Atanasyan60280b42014-05-12 07:37:51 +00002210 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002211 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002212
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002213 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002214 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002215 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002216
2217 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002218}
2219
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002220void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2221 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2222 const std::string &LibDir, StringRef CandidateTriple,
2223 bool NeedsBiarchSuffix) {
2224 // Solaris is a special case. The GCC installation is under
2225 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2226 // need to iterate twice.
2227 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002228 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2229 !EC && LI != LE; LI = LI.increment(EC)) {
2230 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002231 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2232
2233 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002234 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002235 continue; // Saw this path before; no need to look at it again.
2236 if (CandidateVersion.isOlderThan(4, 1, 1))
2237 continue;
2238 if (CandidateVersion <= Version)
2239 continue;
2240
2241 GCCInstallPath =
2242 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002243 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002244 continue;
2245
2246 // If we make it here there has to be at least one GCC version, let's just
2247 // use the latest one.
2248 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002249 for (vfs::directory_iterator
2250 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2251 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002252 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2253
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002254 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002255 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2256
2257 if (CandidateSubVersion > Version)
2258 Version = CandidateSubVersion;
2259 }
2260
2261 GCCTriple.setTriple(CandidateTriple);
2262
2263 GCCInstallPath += "/" + Version.Text;
2264 GCCParentLibPath = GCCInstallPath + "/../../../../";
2265
2266 IsValid = true;
2267 }
2268}
2269
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002270void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002271 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002272 const std::string &LibDir, StringRef CandidateTriple,
2273 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002274 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002275 // There are various different suffixes involving the triple we
2276 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002277 // up to the lib directory. Specifically, the number of "up" steps
2278 // in the second half of each row is 1 + the number of path separators
2279 // in the first half.
2280 const std::string LibAndInstallSuffixes[][2] = {
2281 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2282
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002283 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002284 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2285
2286 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2287 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002288
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002289 // The Freescale PPC SDK has the gcc libraries in
2290 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002291 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002292
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002293 // Ubuntu has a strange mis-matched pair of triples that this happens to
2294 // match.
2295 // FIXME: It may be worthwhile to generalize this and look for a second
2296 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002297 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2298
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002299 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2300 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2301 NeedsBiarchSuffix);
2302 return;
2303 }
2304
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002305 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002306 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2307 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002308 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002309 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002310 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002311 for (vfs::directory_iterator
2312 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2313 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002314 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002315 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002316 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002317 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002318 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002319 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002320 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002321 continue;
2322 if (CandidateVersion <= Version)
2323 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002324
Simon Atanasyan60280b42014-05-12 07:37:51 +00002325 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002326
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002327 // Debian mips multilibs behave more like the rest of the biarch ones,
2328 // so handle them there
2329 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002330 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002331 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002332 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002333 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002334 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002335 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002336
Simon Atanasyan60280b42014-05-12 07:37:51 +00002337 Multilibs = Detected.Multilibs;
2338 SelectedMultilib = Detected.SelectedMultilib;
2339 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002340 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002341 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002342 // FIXME: We hack together the directory name here instead of
2343 // using LI to ensure stable path separators across Windows and
2344 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002345 GCCInstallPath =
2346 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2347 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002348 IsValid = true;
2349 }
2350 }
2351}
2352
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002353Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002354 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002355 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002356 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002357 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002358 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002359}
2360
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002361Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002362
Rafael Espindola7cf32212013-03-20 03:05:54 +00002363Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002364 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002365 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002366 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002367 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002368 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002369 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002370 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002371 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002372 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002373 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002374 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002375 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002376}
2377
Rafael Espindola7cf32212013-03-20 03:05:54 +00002378Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002379 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002380}
2381
Douglas Katzman95354292015-06-23 20:42:09 +00002382Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002383
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002384void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2385 // Print the information about how we detected the GCC installation.
2386 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002387 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002388}
2389
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002390bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002391 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002392}
2393
David Majnemer17f448b2015-06-28 04:23:33 +00002394bool Generic_GCC::isPICDefault() const {
2395 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2396}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002397
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002398bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002399
David Majnemer17f448b2015-06-28 04:23:33 +00002400bool Generic_GCC::isPICDefaultForced() const {
2401 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2402}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002403
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002404bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002405 switch (getTriple().getArch()) {
2406 case llvm::Triple::x86:
2407 case llvm::Triple::x86_64:
2408 case llvm::Triple::aarch64:
2409 case llvm::Triple::aarch64_be:
2410 case llvm::Triple::arm:
2411 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002412 case llvm::Triple::bpfel:
2413 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002414 case llvm::Triple::thumb:
2415 case llvm::Triple::thumbeb:
2416 case llvm::Triple::ppc:
2417 case llvm::Triple::ppc64:
2418 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002419 case llvm::Triple::systemz:
2420 return true;
2421 default:
2422 return false;
2423 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002424}
2425
James Y Knighta6c9ee72015-10-16 18:46:26 +00002426/// \brief Helper to add the variant paths of a libstdc++ installation.
2427bool Generic_GCC::addLibStdCXXIncludePaths(
2428 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2429 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2430 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2431 if (!getVFS().exists(Base + Suffix))
2432 return false;
2433
2434 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2435
2436 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2437 // that path exists or we have neither a GCC nor target multiarch triple, use
2438 // this vanilla search path.
2439 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2440 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2441 addSystemInclude(DriverArgs, CC1Args,
2442 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2443 } else {
2444 // Otherwise try to use multiarch naming schemes which have normalized the
2445 // triples and put the triple before the suffix.
2446 //
2447 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2448 // the target triple, so we support that here.
2449 addSystemInclude(DriverArgs, CC1Args,
2450 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2451 addSystemInclude(DriverArgs, CC1Args,
2452 Base + "/" + TargetMultiarchTriple + Suffix);
2453 }
2454
2455 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2456 return true;
2457}
2458
Kristof Beylsfb387292014-01-10 13:44:34 +00002459void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2460 ArgStringList &CC1Args) const {
2461 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002462 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002463 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002464 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002465 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002466 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002467 getTriple().getOS() == llvm::Triple::NaCl ||
2468 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2469 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002470
2471 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002472 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002473 CC1Args.push_back("-fuse-init-array");
2474}
2475
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002476/// Mips Toolchain
2477MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2478 const llvm::Triple &Triple,
2479 const ArgList &Args)
2480 : Linux(D, Triple, Args) {
2481 // Select the correct multilib according to the given arguments.
2482 DetectedMultilibs Result;
2483 findMIPSMultilibs(D, Triple, "", Args, Result);
2484 Multilibs = Result.Multilibs;
2485 SelectedMultilib = Result.SelectedMultilib;
2486
2487 // Find out the library suffix based on the ABI.
2488 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2489 getFilePaths().clear();
2490 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2491
2492 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002493 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002494}
2495
2496void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2497 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2498 if (DriverArgs.hasArg(options::OPT_nostdinc))
2499 return;
2500
2501 const Driver &D = getDriver();
2502
2503 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2504 SmallString<128> P(D.ResourceDir);
2505 llvm::sys::path::append(P, "include");
2506 addSystemInclude(DriverArgs, CC1Args, P);
2507 }
2508
2509 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2510 return;
2511
2512 const auto &Callback = Multilibs.includeDirsCallback();
2513 if (Callback) {
2514 const auto IncludePaths =
2515 Callback(D.getInstalledDir(), getTripleString(), SelectedMultilib);
2516 for (const auto &Path : IncludePaths)
2517 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
2518 }
2519}
2520
2521Tool *MipsLLVMToolChain::buildLinker() const {
2522 return new tools::gnutools::Linker(*this);
2523}
2524
2525std::string MipsLLVMToolChain::computeSysRoot() const {
2526 if (!getDriver().SysRoot.empty())
2527 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2528
2529 const std::string InstalledDir(getDriver().getInstalledDir());
2530 std::string SysRootPath =
2531 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2532 if (llvm::sys::fs::exists(SysRootPath))
2533 return SysRootPath;
2534
2535 return std::string();
2536}
2537
2538ToolChain::CXXStdlibType
2539MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2540 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2541 if (A) {
2542 StringRef Value = A->getValue();
2543 if (Value != "libc++")
2544 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2545 << A->getAsString(Args);
2546 }
2547
2548 return ToolChain::CST_Libcxx;
2549}
2550
2551void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2552 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2553 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2554 DriverArgs.hasArg(options::OPT_nostdincxx))
2555 return;
2556
2557 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2558 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2559
2560 const auto &Callback = Multilibs.includeDirsCallback();
2561 if (Callback) {
2562 const auto IncludePaths = Callback(getDriver().getInstalledDir(),
2563 getTripleString(), SelectedMultilib);
2564 for (const auto &Path : IncludePaths) {
2565 if (llvm::sys::fs::exists(Path + "/c++/v1")) {
2566 addSystemInclude(DriverArgs, CC1Args, Path + "/c++/v1");
2567 break;
2568 }
2569 }
2570 }
2571}
2572
2573void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2574 ArgStringList &CmdArgs) const {
2575 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2576 "Only -lc++ (aka libxx) is suported in this toolchain.");
2577
2578 CmdArgs.push_back("-lc++");
2579 CmdArgs.push_back("-lc++abi");
2580 CmdArgs.push_back("-lunwind");
2581}
2582
2583std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2584 StringRef Component,
2585 bool Shared) const {
2586 SmallString<128> Path(getDriver().ResourceDir);
2587 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2588 getOS());
2589 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002590 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002591 return Path.str();
2592}
2593
Tony Linthicum76329bf2011-12-12 21:14:55 +00002594/// Hexagon Toolchain
2595
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002596std::string HexagonToolChain::getHexagonTargetDir(
2597 const std::string &InstalledDir,
2598 const SmallVectorImpl<std::string> &PrefixDirs) const {
2599 std::string InstallRelDir;
2600 const Driver &D = getDriver();
2601
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002602 // Locate the rest of the toolchain ...
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002603 for (auto &I : PrefixDirs)
2604 if (D.getVFS().exists(I))
2605 return I;
Samuel Antaoc909c992014-11-07 17:48:03 +00002606
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002607 if (getVFS().exists(InstallRelDir = InstalledDir + "/../target"))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002608 return InstallRelDir;
2609
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002610 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/target";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002611 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002612 return PrefixRelDir;
2613
2614 return InstallRelDir;
2615}
2616
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002617Optional<unsigned> HexagonToolChain::getSmallDataThreshold(
2618 const ArgList &Args) {
2619 StringRef Gn = "";
2620 if (Arg *A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
2621 options::OPT_msmall_data_threshold_EQ)) {
2622 Gn = A->getValue();
2623 } else if (Args.getLastArg(options::OPT_shared, options::OPT_fpic,
2624 options::OPT_fPIC)) {
2625 Gn = "0";
2626 }
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002627
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002628 unsigned G;
2629 if (!Gn.getAsInteger(10, G))
2630 return G;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002631
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002632 return None;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002633}
2634
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002635void HexagonToolChain::getHexagonLibraryPaths(const ArgList &Args,
2636 ToolChain::path_list &LibPaths) const {
2637 const Driver &D = getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00002638
2639 //----------------------------------------------------------------------------
2640 // -L Args
2641 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002642 for (Arg *A : Args.filtered(options::OPT_L))
2643 for (const char *Value : A->getValues())
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002644 LibPaths.push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002645
2646 //----------------------------------------------------------------------------
2647 // Other standard paths
2648 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002649 std::vector<std::string> RootDirs;
Krzysztof Parzyszekf4467cd2016-01-06 14:13:11 +00002650 std::copy(D.PrefixDirs.begin(), D.PrefixDirs.end(),
2651 std::back_inserter(RootDirs));
Matthew Curtise689b052012-12-06 15:46:07 +00002652
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002653 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2654 D.PrefixDirs);
2655 if (std::find(RootDirs.begin(), RootDirs.end(), TargetDir) == RootDirs.end())
2656 RootDirs.push_back(TargetDir);
2657
2658 bool HasPIC = Args.hasArg(options::OPT_fpic, options::OPT_fPIC);
2659 // Assume G0 with -shared.
2660 bool HasG0 = Args.hasArg(options::OPT_shared);
2661 if (auto G = getSmallDataThreshold(Args))
2662 HasG0 = G.getValue() == 0;
2663
2664 const std::string CpuVer = GetTargetCPUVersion(Args).str();
2665 for (auto &Dir : RootDirs) {
2666 std::string LibDir = Dir + "/hexagon/lib";
2667 std::string LibDirCpu = LibDir + '/' + CpuVer;
2668 if (HasG0) {
2669 if (HasPIC)
2670 LibPaths.push_back(LibDirCpu + "/G0/pic");
2671 LibPaths.push_back(LibDirCpu + "/G0");
2672 }
2673 LibPaths.push_back(LibDirCpu);
2674 LibPaths.push_back(LibDir);
Matthew Curtise689b052012-12-06 15:46:07 +00002675 }
Matthew Curtise689b052012-12-06 15:46:07 +00002676}
2677
Douglas Katzman54366072015-07-27 16:53:08 +00002678HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002679 const llvm::opt::ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002680 : Linux(D, Triple, Args) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002681 const std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2682 D.PrefixDirs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002683
2684 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2685 // program paths
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002686 const std::string BinDir(TargetDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002687 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002688 getProgramPaths().push_back(BinDir);
2689
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002690 ToolChain::path_list &LibPaths = getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002691
2692 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2693 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2694 // support 'linux' we'll need to fix this up
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002695 LibPaths.clear();
2696 getHexagonLibraryPaths(Args, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002697}
2698
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002699HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002700
Douglas Katzman54366072015-07-27 16:53:08 +00002701Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002702 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002703}
2704
Douglas Katzman54366072015-07-27 16:53:08 +00002705Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002706 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002707}
2708
Douglas Katzman54366072015-07-27 16:53:08 +00002709void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2710 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002711 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2712 DriverArgs.hasArg(options::OPT_nostdlibinc))
2713 return;
2714
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002715 const Driver &D = getDriver();
2716 std::string TargetDir = getHexagonTargetDir(D.getInstalledDir(),
2717 D.PrefixDirs);
2718 addExternCSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002719}
2720
Douglas Katzman54366072015-07-27 16:53:08 +00002721void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2722 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002723 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2724 DriverArgs.hasArg(options::OPT_nostdincxx))
2725 return;
2726
2727 const Driver &D = getDriver();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002728 std::string TargetDir = getHexagonTargetDir(D.InstalledDir, D.PrefixDirs);
2729 addSystemInclude(DriverArgs, CC1Args, TargetDir + "/hexagon/include/c++");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002730}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002731
Matthew Curtise689b052012-12-06 15:46:07 +00002732ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002733HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002734 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2735 if (!A)
2736 return ToolChain::CST_Libstdcxx;
2737
2738 StringRef Value = A->getValue();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002739 if (Value != "libstdc++")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002740 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002741
2742 return ToolChain::CST_Libstdcxx;
2743}
2744
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002745//
2746// Returns the default CPU for Hexagon. This is the default compilation target
2747// if no Hexagon processor is selected at the command-line.
2748//
2749const StringRef HexagonToolChain::GetDefaultCPU() {
2750 return "hexagonv60";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002751}
2752
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002753const StringRef HexagonToolChain::GetTargetCPUVersion(const ArgList &Args) {
2754 Arg *CpuArg = nullptr;
Krzysztof Parzyszek972f72c2016-01-06 21:12:03 +00002755 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ, options::OPT_march_EQ))
2756 CpuArg = A;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002757
2758 StringRef CPU = CpuArg ? CpuArg->getValue() : GetDefaultCPU();
2759 if (CPU.startswith("hexagon"))
2760 return CPU.substr(sizeof("hexagon") - 1);
2761 return CPU;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002762}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002763// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002764
Tom Stellard8fa33092015-07-18 01:49:05 +00002765/// AMDGPU Toolchain
2766AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2767 const ArgList &Args)
2768 : Generic_ELF(D, Triple, Args) { }
2769
2770Tool *AMDGPUToolChain::buildLinker() const {
2771 return new tools::amdgpu::Linker(*this);
2772}
2773// End AMDGPU
2774
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002775/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002776NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2777 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002778 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002779
2780 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2781 // default paths, and must instead only use the paths provided
2782 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002783 path_list &file_paths = getFilePaths();
2784 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002785
2786 file_paths.clear();
2787 prog_paths.clear();
2788
2789 // Path for library files (libc.a, ...)
2790 std::string FilePath(getDriver().Dir + "/../");
2791
2792 // Path for tools (clang, ld, etc..)
2793 std::string ProgPath(getDriver().Dir + "/../");
2794
2795 // Path for toolchain libraries (libgcc.a, ...)
2796 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2797
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002798 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002799 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002800 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002801 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002802 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2803 file_paths.push_back(ToolPath + "i686-nacl");
2804 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002805 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002806 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2807 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2808 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2809 file_paths.push_back(ToolPath + "x86_64-nacl");
2810 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002811 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002812 file_paths.push_back(FilePath + "arm-nacl/lib");
2813 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2814 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2815 file_paths.push_back(ToolPath + "arm-nacl");
2816 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002817 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002818 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2819 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2820 prog_paths.push_back(ProgPath + "bin");
2821 file_paths.push_back(ToolPath + "mipsel-nacl");
2822 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002823 default:
2824 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002825 }
2826
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002827 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2828}
2829
Douglas Katzman54366072015-07-27 16:53:08 +00002830void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2831 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002832 const Driver &D = getDriver();
2833 if (DriverArgs.hasArg(options::OPT_nostdinc))
2834 return;
2835
2836 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2837 SmallString<128> P(D.ResourceDir);
2838 llvm::sys::path::append(P, "include");
2839 addSystemInclude(DriverArgs, CC1Args, P.str());
2840 }
2841
2842 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2843 return;
2844
2845 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002846 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002847 case llvm::Triple::x86:
2848 // x86 is special because multilib style uses x86_64-nacl/include for libc
2849 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2850 // have the same substring.
2851 llvm::sys::path::append(P, "i686-nacl/usr/include");
2852 addSystemInclude(DriverArgs, CC1Args, P.str());
2853 llvm::sys::path::remove_filename(P);
2854 llvm::sys::path::remove_filename(P);
2855 llvm::sys::path::remove_filename(P);
2856 llvm::sys::path::append(P, "x86_64-nacl/include");
2857 addSystemInclude(DriverArgs, CC1Args, P.str());
2858 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002859 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002860 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002861 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002862 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002863 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002864 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002865 case llvm::Triple::mipsel:
2866 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2867 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002868 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002869 return;
2870 }
2871
2872 addSystemInclude(DriverArgs, CC1Args, P.str());
2873 llvm::sys::path::remove_filename(P);
2874 llvm::sys::path::remove_filename(P);
2875 llvm::sys::path::append(P, "include");
2876 addSystemInclude(DriverArgs, CC1Args, P.str());
2877}
2878
Douglas Katzman54366072015-07-27 16:53:08 +00002879void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2880 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002881 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2882 // if the value is libc++, and emits an error for other values.
2883 GetCXXStdlibType(Args);
2884 CmdArgs.push_back("-lc++");
2885}
2886
Douglas Katzman54366072015-07-27 16:53:08 +00002887void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2888 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002889 const Driver &D = getDriver();
2890 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2891 DriverArgs.hasArg(options::OPT_nostdincxx))
2892 return;
2893
2894 // 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(DriverArgs);
2897
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002898 SmallString<128> P(D.Dir + "/../");
2899 switch (getTriple().getArch()) {
2900 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002901 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2902 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002903 break;
2904 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002905 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2906 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002907 break;
2908 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002909 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2910 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002911 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002912 case llvm::Triple::mipsel:
2913 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2914 addSystemInclude(DriverArgs, CC1Args, P.str());
2915 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002916 default:
2917 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002918 }
2919}
2920
Douglas Katzman54366072015-07-27 16:53:08 +00002921ToolChain::CXXStdlibType
2922NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002923 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2924 StringRef Value = A->getValue();
2925 if (Value == "libc++")
2926 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002927 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002928 }
2929
2930 return ToolChain::CST_Libcxx;
2931}
2932
Douglas Katzman54366072015-07-27 16:53:08 +00002933std::string
2934NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2935 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002936 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2937 if (TheTriple.getArch() == llvm::Triple::arm &&
2938 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2939 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2940 return TheTriple.getTriple();
2941}
2942
Douglas Katzman54366072015-07-27 16:53:08 +00002943Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002944 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002945}
2946
Douglas Katzman54366072015-07-27 16:53:08 +00002947Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002948 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002949 return new tools::nacltools::AssemblerARM(*this);
2950 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002951}
2952// End NaCl
2953
Chris Lattner09797542010-03-04 21:07:38 +00002954/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2955/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2956/// Currently does not support anything else but compilation.
2957
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002958TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002959 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002960 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002961 // Path mangling to find libexec
2962 std::string Path(getDriver().Dir);
2963
2964 Path += "/../libexec";
2965 getProgramPaths().push_back(Path);
2966}
2967
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002968TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002969
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002970bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002971
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002972bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002973
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002974bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002975
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002976bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002977
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002978// CloudABI - CloudABI tool chain which can call ld(1) directly.
2979
2980CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2981 const ArgList &Args)
2982 : Generic_ELF(D, Triple, Args) {
2983 SmallString<128> P(getDriver().Dir);
2984 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2985 getFilePaths().push_back(P.str());
2986}
2987
2988void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2989 ArgStringList &CC1Args) const {
2990 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2991 DriverArgs.hasArg(options::OPT_nostdincxx))
2992 return;
2993
2994 SmallString<128> P(getDriver().Dir);
2995 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2996 addSystemInclude(DriverArgs, CC1Args, P.str());
2997}
2998
2999void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
3000 ArgStringList &CmdArgs) const {
3001 CmdArgs.push_back("-lc++");
3002 CmdArgs.push_back("-lc++abi");
3003 CmdArgs.push_back("-lunwind");
3004}
3005
Douglas Katzman95354292015-06-23 20:42:09 +00003006Tool *CloudABI::buildLinker() const {
3007 return new tools::cloudabi::Linker(*this);
3008}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003009
Ed Schouten51bfbe72016-02-17 18:56:20 +00003010SanitizerMask CloudABI::getSupportedSanitizers() const {
3011 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3012 Res |= SanitizerKind::SafeStack;
3013 return Res;
3014}
3015
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003016/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3017
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003018OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3019 const ArgList &Args)
3020 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003021 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003022 getFilePaths().push_back("/usr/lib");
3023}
3024
Rafael Espindola7cf32212013-03-20 03:05:54 +00003025Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003026 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003027}
3028
Douglas Katzman95354292015-06-23 20:42:09 +00003029Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003030
Eli Friedman9fa28852012-08-08 23:57:20 +00003031/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3032
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003033Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3034 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003035 getFilePaths().push_back(getDriver().Dir + "/../lib");
3036 getFilePaths().push_back("/usr/lib");
3037}
3038
Rafael Espindola7cf32212013-03-20 03:05:54 +00003039Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003040 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003041}
3042
Douglas Katzman95354292015-06-23 20:42:09 +00003043Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003044
Jonas Hahnfeldaae83742016-02-12 07:48:37 +00003045ToolChain::CXXStdlibType Bitrig::GetDefaultCXXStdlibType() const {
Richard Smith51af5192014-05-01 23:24:24 +00003046 return ToolChain::CST_Libcxx;
3047}
3048
Eli Friedman9fa28852012-08-08 23:57:20 +00003049void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3050 ArgStringList &CC1Args) const {
3051 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3052 DriverArgs.hasArg(options::OPT_nostdincxx))
3053 return;
3054
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003055 switch (GetCXXStdlibType(DriverArgs)) {
3056 case ToolChain::CST_Libcxx:
3057 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003058 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003059 break;
3060 case ToolChain::CST_Libstdcxx:
3061 addSystemInclude(DriverArgs, CC1Args,
3062 getDriver().SysRoot + "/usr/include/c++/stdc++");
3063 addSystemInclude(DriverArgs, CC1Args,
3064 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003065
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003066 StringRef Triple = getTriple().str();
3067 if (Triple.startswith("amd64"))
3068 addSystemInclude(DriverArgs, CC1Args,
3069 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003070 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003071 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003072 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3073 "/usr/include/c++/stdc++/" +
3074 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003075 break;
3076 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003077}
3078
3079void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3080 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003081 switch (GetCXXStdlibType(Args)) {
3082 case ToolChain::CST_Libcxx:
3083 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003084 CmdArgs.push_back("-lc++abi");
3085 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003086 break;
3087 case ToolChain::CST_Libstdcxx:
3088 CmdArgs.push_back("-lstdc++");
3089 break;
3090 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003091}
3092
Daniel Dunbare24297c2009-03-30 21:06:03 +00003093/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3094
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003095FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3096 const ArgList &Args)
3097 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003098
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003099 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3100 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003101 if ((Triple.getArch() == llvm::Triple::x86 ||
3102 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003103 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003104 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3105 else
3106 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003107}
3108
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003109ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00003110 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3111 StringRef Value = A->getValue();
3112 if (Value == "libstdc++")
3113 return ToolChain::CST_Libstdcxx;
3114 if (Value == "libc++")
3115 return ToolChain::CST_Libcxx;
3116
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003117 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00003118 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003119 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003120 return ToolChain::CST_Libcxx;
3121 return ToolChain::CST_Libstdcxx;
3122}
3123
3124void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3125 ArgStringList &CC1Args) const {
3126 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3127 DriverArgs.hasArg(options::OPT_nostdincxx))
3128 return;
3129
3130 switch (GetCXXStdlibType(DriverArgs)) {
3131 case ToolChain::CST_Libcxx:
3132 addSystemInclude(DriverArgs, CC1Args,
3133 getDriver().SysRoot + "/usr/include/c++/v1");
3134 break;
3135 case ToolChain::CST_Libstdcxx:
3136 addSystemInclude(DriverArgs, CC1Args,
3137 getDriver().SysRoot + "/usr/include/c++/4.2");
3138 addSystemInclude(DriverArgs, CC1Args,
3139 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3140 break;
3141 }
3142}
3143
Dimitry Andric60907392016-02-14 16:08:20 +00003144void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3145 ArgStringList &CmdArgs) const {
3146 CXXStdlibType Type = GetCXXStdlibType(Args);
3147 bool Profiling = Args.hasArg(options::OPT_pg);
3148
3149 switch (Type) {
3150 case ToolChain::CST_Libcxx:
3151 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3152 break;
3153
3154 case ToolChain::CST_Libstdcxx:
3155 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3156 break;
3157 }
3158}
3159
Rafael Espindola7cf32212013-03-20 03:05:54 +00003160Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003161 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003162}
3163
Douglas Katzman95354292015-06-23 20:42:09 +00003164Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003165
Tim Northovere931f9f2015-10-30 16:30:41 +00003166bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003167 // FreeBSD uses SjLj exceptions on ARM oabi.
3168 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003169 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003170 case llvm::Triple::GNUEABI:
3171 case llvm::Triple::EABI:
3172 return false;
3173
3174 default:
3175 return (getTriple().getArch() == llvm::Triple::arm ||
3176 getTriple().getArch() == llvm::Triple::thumb);
3177 }
3178}
3179
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003180bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003181
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003182bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003183
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003184SanitizerMask FreeBSD::getSupportedSanitizers() const {
3185 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3186 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3187 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3188 getTriple().getArch() == llvm::Triple::mips64el;
3189 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3190 Res |= SanitizerKind::Address;
3191 Res |= SanitizerKind::Vptr;
3192 if (IsX86_64 || IsMIPS64) {
3193 Res |= SanitizerKind::Leak;
3194 Res |= SanitizerKind::Thread;
3195 }
3196 if (IsX86 || IsX86_64) {
3197 Res |= SanitizerKind::SafeStack;
3198 }
3199 return Res;
3200}
3201
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003202/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3203
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003204NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3205 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003206 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003207 // When targeting a 32-bit platform, try the special directory used on
3208 // 64-bit hosts, and only fall back to the main library directory if that
3209 // doesn't work.
3210 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3211 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003212 switch (Triple.getArch()) {
3213 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003214 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003215 break;
3216 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003217 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003218 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003219 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003220 switch (Triple.getEnvironment()) {
3221 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003222 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003223 getFilePaths().push_back("=/usr/lib/eabi");
3224 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003225 case llvm::Triple::EABIHF:
3226 case llvm::Triple::GNUEABIHF:
3227 getFilePaths().push_back("=/usr/lib/eabihf");
3228 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003229 default:
3230 getFilePaths().push_back("=/usr/lib/oabi");
3231 break;
3232 }
3233 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003234 case llvm::Triple::mips64:
3235 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003236 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003237 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003238 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003239 getFilePaths().push_back("=/usr/lib/64");
3240 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003241 case llvm::Triple::ppc:
3242 getFilePaths().push_back("=/usr/lib/powerpc");
3243 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003244 case llvm::Triple::sparc:
3245 getFilePaths().push_back("=/usr/lib/sparc");
3246 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003247 default:
3248 break;
3249 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003250
3251 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003252 }
3253}
3254
Rafael Espindola7cf32212013-03-20 03:05:54 +00003255Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003256 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003257}
3258
Douglas Katzman95354292015-06-23 20:42:09 +00003259Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003260
Douglas Katzman95354292015-06-23 20:42:09 +00003261ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003262 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3263 StringRef Value = A->getValue();
3264 if (Value == "libstdc++")
3265 return ToolChain::CST_Libstdcxx;
3266 if (Value == "libc++")
3267 return ToolChain::CST_Libcxx;
3268
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003269 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003270 }
3271
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003272 unsigned Major, Minor, Micro;
3273 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003274 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003275 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003276 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003277 case llvm::Triple::arm:
3278 case llvm::Triple::armeb:
3279 case llvm::Triple::thumb:
3280 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003281 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003282 case llvm::Triple::ppc64:
3283 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003284 case llvm::Triple::sparc:
3285 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003286 case llvm::Triple::x86:
3287 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003288 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003289 default:
3290 break;
3291 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003292 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003293 return ToolChain::CST_Libstdcxx;
3294}
3295
3296void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3297 ArgStringList &CC1Args) const {
3298 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3299 DriverArgs.hasArg(options::OPT_nostdincxx))
3300 return;
3301
3302 switch (GetCXXStdlibType(DriverArgs)) {
3303 case ToolChain::CST_Libcxx:
3304 addSystemInclude(DriverArgs, CC1Args,
3305 getDriver().SysRoot + "/usr/include/c++/");
3306 break;
3307 case ToolChain::CST_Libstdcxx:
3308 addSystemInclude(DriverArgs, CC1Args,
3309 getDriver().SysRoot + "/usr/include/g++");
3310 addSystemInclude(DriverArgs, CC1Args,
3311 getDriver().SysRoot + "/usr/include/g++/backward");
3312 break;
3313 }
3314}
3315
Chris Lattner3e2ee142010-07-07 16:01:42 +00003316/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3317
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003318Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3319 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003320 getFilePaths().push_back(getDriver().Dir + "/../lib");
3321 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003322}
3323
Rafael Espindola7cf32212013-03-20 03:05:54 +00003324Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003325 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003326}
3327
Douglas Katzman95354292015-06-23 20:42:09 +00003328Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003329
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003330static void addPathIfExists(const Driver &D, const Twine &Path,
3331 ToolChain::path_list &Paths) {
3332 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003333 Paths.push_back(Path.str());
3334}
3335
David Chisnallf571cde2012-02-15 13:39:01 +00003336/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003338Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003339 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003340 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003341
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003342 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003343
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003344 path_list &Paths = getFilePaths();
3345 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003346 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003347
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003348 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003349 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003350 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003351
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003352 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003353
3354 std::string LibPath = "/usr/lib/";
3355 switch (Triple.getArch()) {
3356 case llvm::Triple::x86:
3357 case llvm::Triple::sparc:
3358 break;
3359 case llvm::Triple::x86_64:
3360 LibPath += "amd64/";
3361 break;
3362 case llvm::Triple::sparcv9:
3363 LibPath += "sparcv9/";
3364 break;
3365 default:
3366 llvm_unreachable("Unsupported architecture");
3367 }
3368
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003369 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003370}
3371
Rafael Espindola7cf32212013-03-20 03:05:54 +00003372Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003373 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003374}
3375
Douglas Katzman95354292015-06-23 20:42:09 +00003376Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003377
Rafael Espindolad5117262015-09-09 13:36:00 +00003378void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3379 ArgStringList &CC1Args) const {
3380 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3381 DriverArgs.hasArg(options::OPT_nostdincxx))
3382 return;
3383
3384 // Include the support directory for things like xlocale and fudged system
3385 // headers.
3386 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3387
3388 if (GCCInstallation.isValid()) {
3389 GCCVersion Version = GCCInstallation.getVersion();
3390 addSystemInclude(DriverArgs, CC1Args,
3391 getDriver().SysRoot + "/usr/gcc/" +
3392 Version.MajorStr + "." +
3393 Version.MinorStr +
3394 "/include/c++/" + Version.Text);
3395 addSystemInclude(DriverArgs, CC1Args,
3396 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3397 "." + Version.MinorStr + "/include/c++/" +
3398 Version.Text + "/" +
3399 GCCInstallation.getTriple().str());
3400 }
3401}
3402
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003403/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003404
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003405enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003406 // NB: Releases of a particular Linux distro should be kept together
3407 // in this enum, because some tests are done by integer comparison against
3408 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003409 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003410 DebianLenny,
3411 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003412 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003413 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003414 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003415 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003416 RHEL4,
3417 RHEL5,
3418 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003419 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003420 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003421 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003422 UbuntuHardy,
3423 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003424 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003425 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003426 UbuntuLucid,
3427 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003428 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003429 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003430 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003431 UbuntuQuantal,
3432 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003433 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003434 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003435 UbuntuUtopic,
3436 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003437 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003438 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003439 UnknownDistro
3440};
3441
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003442static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003443 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003444}
3445
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003446static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003447
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003448static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003449 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003450}
3451
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003452static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003453 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003454}
3455
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003456static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003457 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3458 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3459 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003460 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003461 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003462 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003463 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003464 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003465 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3466 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3467 .Case("hardy", UbuntuHardy)
3468 .Case("intrepid", UbuntuIntrepid)
3469 .Case("jaunty", UbuntuJaunty)
3470 .Case("karmic", UbuntuKarmic)
3471 .Case("lucid", UbuntuLucid)
3472 .Case("maverick", UbuntuMaverick)
3473 .Case("natty", UbuntuNatty)
3474 .Case("oneiric", UbuntuOneiric)
3475 .Case("precise", UbuntuPrecise)
3476 .Case("quantal", UbuntuQuantal)
3477 .Case("raring", UbuntuRaring)
3478 .Case("saucy", UbuntuSaucy)
3479 .Case("trusty", UbuntuTrusty)
3480 .Case("utopic", UbuntuUtopic)
3481 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003482 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003483 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003484 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003485 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003486 }
3487
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003488 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3489 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003490 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003491 if (Data.startswith("Fedora release"))
3492 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003493 if (Data.startswith("Red Hat Enterprise Linux") ||
3494 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003495 if (Data.find("release 7") != StringRef::npos)
3496 return RHEL7;
3497 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003498 return RHEL6;
3499 else if (Data.find("release 5") != StringRef::npos)
3500 return RHEL5;
3501 else if (Data.find("release 4") != StringRef::npos)
3502 return RHEL4;
3503 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003504 return UnknownDistro;
3505 }
3506
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003507 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3508 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003509 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003510 if (Data[0] == '5')
3511 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003512 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003513 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003514 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003515 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003516 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003517 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003518 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3519 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003520 return UnknownDistro;
3521 }
3522
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003523 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003524 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003525
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003526 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003527 return Exherbo;
3528
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003529 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003530 return ArchLinux;
3531
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003532 return UnknownDistro;
3533}
3534
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003535/// \brief Get our best guess at the multiarch triple for a target.
3536///
3537/// Debian-based systems are starting to use a multiarch setup where they use
3538/// a target-triple directory in the library and header search paths.
3539/// Unfortunately, this triple does not align with the vanilla target triple,
3540/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003541static std::string getMultiarchTriple(const Driver &D,
3542 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003543 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003544 llvm::Triple::EnvironmentType TargetEnvironment =
3545 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003546
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003547 // For most architectures, just use whatever we have rather than trying to be
3548 // clever.
3549 switch (TargetTriple.getArch()) {
3550 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003551 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003552
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003553 // We use the existence of '/lib/<triple>' as a directory to detect some
3554 // common linux triples that don't quite match the Clang triple for both
3555 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3556 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003557 case llvm::Triple::arm:
3558 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003559 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003560 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003561 return "arm-linux-gnueabihf";
3562 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003563 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003564 return "arm-linux-gnueabi";
3565 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003566 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003567 case llvm::Triple::armeb:
3568 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003569 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003570 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003571 return "armeb-linux-gnueabihf";
3572 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003573 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003574 return "armeb-linux-gnueabi";
3575 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003576 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003577 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003578 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003579 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003580 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003581 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003582 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003583 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003584 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003585 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003586 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003587 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003588 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003589 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003590 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003591 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003592 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003593 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003594 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003595 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003596 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003597 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003598 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003599 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003600 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003601 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003602 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003603 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003604 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003605 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003606 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003607 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003608 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003609 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003610 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003611 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003612 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003613 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003614 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003615 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003616 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003617 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003618 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003619 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003620 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003621 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003622 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003623 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003624 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003625 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003626 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003627 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003628 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003629 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003630 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003631 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003632 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003633 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003634 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003635 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003636 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003637 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003638 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003639 return "s390x-linux-gnu";
3640 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003641 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003642 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003643}
3644
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003645static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003646 if (isMipsArch(Triple.getArch())) {
3647 // lib32 directory has a special meaning on MIPS targets.
3648 // It contains N32 ABI binaries. Use this folder if produce
3649 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003650 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003651 return "lib32";
3652 return Triple.isArch32Bit() ? "lib" : "lib64";
3653 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003654
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003655 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003656 // using that variant while targeting other architectures causes problems
3657 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003658 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003659 // them when we know we may need it.
3660 //
3661 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003662 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003663 // GCCInstallationDetector, but that is a more significant refactoring.
3664 if (Triple.getArch() == llvm::Triple::x86 ||
3665 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003666 return "lib32";
3667
Zinovy Nis1db95732014-07-10 15:27:19 +00003668 if (Triple.getArch() == llvm::Triple::x86_64 &&
3669 Triple.getEnvironment() == llvm::Triple::GNUX32)
3670 return "libx32";
3671
Simon Atanasyand4413882012-09-14 11:27:24 +00003672 return Triple.isArch32Bit() ? "lib" : "lib64";
3673}
3674
Rafael Espindola1af7c212012-02-19 01:38:32 +00003675Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003676 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003677 GCCInstallation.init(Triple, Args);
3678 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003679 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003680 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003681 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003682
Rafael Espindola10a63c22013-07-03 14:14:00 +00003683 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003684 // least) put various tools in a triple-prefixed directory off of the parent
3685 // of the GCC installation. We use the GCC triple here to ensure that we end
3686 // up with tools that support the same amount of cross compiling as the
3687 // detected GCC installation. For example, if we find a GCC installation
3688 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3689 // used to target i386.
3690 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003691 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003692 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003693 GCCInstallation.getTriple().str() + "/bin")
3694 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003695
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003696 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003697
Rafael Espindola10a63c22013-07-03 14:14:00 +00003698 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003699 ExtraOpts.push_back("-z");
3700 ExtraOpts.push_back("relro");
3701 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003702
Douglas Gregord9bb1522011-03-06 19:11:49 +00003703 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003704 ExtraOpts.push_back("-X");
3705
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003706 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003707 const bool IsMips = isMipsArch(Arch);
3708
3709 if (IsMips && !SysRoot.empty())
3710 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003711
Chandler Carruth0b842912011-12-09 04:45:18 +00003712 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3713 // and the MIPS ABI require .dynsym to be sorted in different ways.
3714 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3715 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003716 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003717 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003718 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003719 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003720 ExtraOpts.push_back("--hash-style=gnu");
3721
Rafael Espindola10a63c22013-07-03 14:14:00 +00003722 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003723 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3724 ExtraOpts.push_back("--hash-style=both");
3725 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003726
Chris Lattner84e38552011-05-22 05:36:06 +00003727 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003728 ExtraOpts.push_back("--no-add-needed");
3729
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003730 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003731 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003732 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003733 ExtraOpts.push_back("--build-id");
3734
Rafael Espindola10a63c22013-07-03 14:14:00 +00003735 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003736 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003737
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003738 // The selection of paths to try here is designed to match the patterns which
3739 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3740 // This was determined by running GCC in a fake filesystem, creating all
3741 // possible permutations of these directories, and seeing which ones it added
3742 // to the link paths.
3743 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003744
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003745 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003746 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003747
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003748 // Add the multilib suffixed paths where they are available.
3749 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003750 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003751 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003752 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003753
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003754 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003755 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003756 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003757 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003758
3759 // GCC cross compiling toolchains will install target libraries which ship
3760 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3761 // any part of the GCC installation in
3762 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3763 // debatable, but is the reality today. We need to search this tree even
3764 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003765 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003766 // installation that is *not* within the system root to ensure two things:
3767 //
3768 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003769 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003770 // appropriate rpath.
3771 // 2) There must not be libraries installed into
3772 // <prefix>/<triple>/<libdir> unless they should be preferred over
3773 // those within the system root.
3774 //
3775 // Note that this matches the GCC behavior. See the below comment for where
3776 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003777 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3778 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003779 Paths);
3780
Chandler Carruth69a125b2012-04-06 16:32:06 +00003781 // If the GCC installation we found is inside of the sysroot, we want to
3782 // prefer libraries installed in the parent prefix of the GCC installation.
3783 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003784 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003785 // This usually happens when there is an external cross compiler on the
3786 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003787 // the cross. Note that GCC does include some of these directories in some
3788 // configurations but this seems somewhere between questionable and simply
3789 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003790 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003791 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3792 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003793 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003794 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003795
3796 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003797 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003798 // those searched.
3799 // FIXME: It's not clear whether we should use the driver's installed
3800 // directory ('Dir' below) or the ResourceDir.
3801 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003802 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3803 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003804 }
3805
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003806 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3807 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3808 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3809 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003810
Chandler Carruthb427c562013-06-22 11:35:51 +00003811 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003812 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003813 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003814 addPathIfExists(D,
3815 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003816 "/../../" + OSLibDir,
3817 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003818
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003819 // Add the 'other' biarch variant path
3820 Multilib BiarchSibling;
3821 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003822 addPathIfExists(D, GCCInstallation.getInstallPath() +
3823 BiarchSibling.gccSuffix(),
3824 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003825 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003826
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003827 // See comments above on the multilib variant for details of why this is
3828 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003829 const std::string &LibPath = GCCInstallation.getParentLibPath();
3830 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3831 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003832 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3833 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003834 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003835
3836 // See comments above on the multilib variant for details of why this is
3837 // only included from within the sysroot.
3838 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003839 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003840 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003841
3842 // Similar to the logic for GCC above, if we are currently running Clang
3843 // inside of the requested system root, add its parent library path to those
3844 // searched.
3845 // FIXME: It's not clear whether we should use the driver's installed
3846 // directory ('Dir' below) or the ResourceDir.
3847 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003848 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003849
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003850 addPathIfExists(D, SysRoot + "/lib", Paths);
3851 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003852}
3853
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003854bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003855
Douglas Katzman95354292015-06-23 20:42:09 +00003856Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003857
3858Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003859 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003860}
3861
Simon Atanasyana0d89572013-10-05 14:37:55 +00003862std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003863 if (!getDriver().SysRoot.empty())
3864 return getDriver().SysRoot;
3865
3866 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3867 return std::string();
3868
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003869 // Standalone MIPS toolchains use different names for sysroot folder
3870 // and put it into different places. Here we try to check some known
3871 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003872
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003873 const StringRef InstallDir = GCCInstallation.getInstallPath();
3874 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003875 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003876
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003877 std::string Path =
3878 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3879 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003880
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003881 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003882 return Path;
3883
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003884 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003885
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003886 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003887 return Path;
3888
3889 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003890}
3891
Chandler Carrutha796f532011-11-05 20:17:13 +00003892void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3893 ArgStringList &CC1Args) const {
3894 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003895 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003896
3897 if (DriverArgs.hasArg(options::OPT_nostdinc))
3898 return;
3899
3900 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003901 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003902
3903 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003904 SmallString<128> P(D.ResourceDir);
3905 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003906 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003907 }
3908
3909 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3910 return;
3911
3912 // Check for configure-time C include directories.
3913 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3914 if (CIncludeDirs != "") {
3915 SmallVector<StringRef, 5> dirs;
3916 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003917 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003918 StringRef Prefix =
3919 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003920 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003921 }
3922 return;
3923 }
3924
3925 // Lacking those, try to detect the correct set of system includes for the
3926 // target triple.
3927
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003928 // Add include directories specific to the selected multilib set and multilib.
3929 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003930 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003931 if (Callback) {
3932 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3933 GCCInstallation.getTriple().str(),
3934 GCCInstallation.getMultilib());
3935 for (const auto &Path : IncludePaths)
3936 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3937 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003938 }
3939
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003940 // Implement generic Debian multiarch support.
3941 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003942 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003943
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003944 // FIXME: These are older forms of multiarch. It's not clear that they're
3945 // in use in any released version of Debian, so we should consider
3946 // removing them.
3947 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003948 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003949 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003950
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003951 // FIXME: These are older forms of multiarch. It's not clear that they're
3952 // in use in any released version of Debian, so we should consider
3953 // removing them.
3954 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3955 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003956 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003957 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003958 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003959 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003960 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003961 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003962 const StringRef ARMEBMultiarchIncludeDirs[] = {
3963 "/usr/include/armeb-linux-gnueabi"};
3964 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
3965 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003966 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003967 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003968 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003969 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003970 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003971 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003972 "/usr/include/mips64el-linux-gnu",
3973 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003974 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003975 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003976 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003977 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003978 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003979 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003980 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003981 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003982 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003983 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003984 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3985 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003986 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003987 switch (getTriple().getArch()) {
3988 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003989 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003990 break;
3991 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003992 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003993 break;
3994 case llvm::Triple::aarch64:
3995 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003996 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003997 break;
3998 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003999 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00004000 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4001 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
4002 else
4003 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004004 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00004005 case llvm::Triple::armeb:
4006 case llvm::Triple::thumbeb:
4007 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
4008 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
4009 else
4010 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
4011 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004012 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00004013 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004014 break;
4015 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00004016 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004017 break;
4018 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004019 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004020 break;
4021 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004022 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004023 break;
4024 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004025 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004026 break;
4027 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004028 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004029 break;
4030 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004031 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004032 break;
4033 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004034 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004035 break;
4036 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004037 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004038 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004039 case llvm::Triple::systemz:
4040 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4041 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004042 default:
4043 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004044 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004045 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004046 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004047 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004048 break;
4049 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004050 }
4051
4052 if (getTriple().getOS() == llvm::Triple::RTEMS)
4053 return;
4054
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004055 // Add an include of '/include' directly. This isn't provided by default by
4056 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4057 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004058 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004059
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004060 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004061}
4062
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004063static std::string DetectLibcxxIncludePath(StringRef base) {
4064 std::error_code EC;
4065 int MaxVersion = 0;
4066 std::string MaxVersionString = "";
4067 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4068 LI = LI.increment(EC)) {
4069 StringRef VersionText = llvm::sys::path::filename(LI->path());
4070 int Version;
4071 if (VersionText[0] == 'v' &&
4072 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4073 if (Version > MaxVersion) {
4074 MaxVersion = Version;
4075 MaxVersionString = VersionText;
4076 }
4077 }
4078 }
4079 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4080}
4081
Chandler Carrutha796f532011-11-05 20:17:13 +00004082void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4083 ArgStringList &CC1Args) const {
4084 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4085 DriverArgs.hasArg(options::OPT_nostdincxx))
4086 return;
4087
Chandler Carruthf4701732011-11-07 09:01:17 +00004088 // Check if libc++ has been enabled and provide its include paths if so.
4089 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004090 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004091 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004092
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004093 // We also check the system as for a long time this is the only place
4094 // Clang looked.
4095 // FIXME: We should really remove this. It doesn't make any sense.
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004096 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004097 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004098 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004099 continue;
4100 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004101 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004102 break;
4103 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004104 return;
4105 }
4106
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004107 // We need a detected GCC installation on Linux to provide libstdc++'s
4108 // headers. We handled the libc++ case above.
4109 if (!GCCInstallation.isValid())
4110 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004111
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004112 // By default, look for the C++ headers in an include directory adjacent to
4113 // the lib directory of the GCC installation. Note that this is expect to be
4114 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4115 StringRef LibDir = GCCInstallation.getParentLibPath();
4116 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004117 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004118 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004119 const std::string GCCMultiarchTriple = getMultiarchTriple(
4120 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004121 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004122 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004123 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004124
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004125 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004126 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004127 "/c++/" + Version.Text, TripleStr,
4128 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004129 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004130 return;
4131
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004132 // Otherwise, fall back on a bunch of options which don't use multiarch
4133 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004134 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004135 // Gentoo is weird and places its headers inside the GCC install,
4136 // so if the first attempt to find the headers fails, try these patterns.
4137 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4138 Version.MinorStr,
4139 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4140 // Android standalone toolchain has C++ headers in yet another place.
4141 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4142 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4143 // without a subdirectory corresponding to the gcc version.
4144 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004145 };
4146
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004147 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004148 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4149 /*GCCMultiarchTriple*/ "",
4150 /*TargetMultiarchTriple*/ "",
4151 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004152 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004153 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004154}
4155
Artem Belevichfa11ab52015-11-17 22:28:46 +00004156void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4157 ArgStringList &CC1Args) const {
4158 if (DriverArgs.hasArg(options::OPT_nocudainc))
4159 return;
4160
Artem Belevich86017332015-11-17 22:28:55 +00004161 if (CudaInstallation.isValid()) {
Artem Belevichfa11ab52015-11-17 22:28:46 +00004162 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
Artem Belevich86017332015-11-17 22:28:55 +00004163 CC1Args.push_back("-include");
Artem Belevich7fda3c92015-12-16 18:51:59 +00004164 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevich86017332015-11-17 22:28:55 +00004165 }
Artem Belevichfa11ab52015-11-17 22:28:46 +00004166}
4167
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004168bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004169
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004170SanitizerMask Linux::getSupportedSanitizers() const {
4171 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4172 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4173 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4174 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004175 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4176 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004177 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4178 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004179 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4180 Res |= SanitizerKind::Address;
4181 Res |= SanitizerKind::KernelAddress;
4182 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004183 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004184 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004185 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004186 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004187 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004188 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004189 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004190 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004191 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004192 if (IsX86 || IsX86_64) {
4193 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004194 }
4195 return Res;
4196}
4197
Xinliang David Li170cd102015-10-27 05:15:35 +00004198void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4199 llvm::opt::ArgStringList &CmdArgs) const {
4200 if (!needsProfileRT(Args)) return;
4201
4202 // Add linker option -u__llvm_runtime_variable to cause runtime
4203 // initialization module to be linked in.
4204 if (!Args.hasArg(options::OPT_coverage))
4205 CmdArgs.push_back(Args.MakeArgString(
4206 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4207 ToolChain::addProfileRTLibs(Args, CmdArgs);
4208}
4209
Daniel Dunbarcc912342009-05-02 18:28:39 +00004210/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4211
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004212DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4213 const ArgList &Args)
4214 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004215
4216 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004217 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004218 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004219 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004220
Daniel Dunbar083edf72009-12-21 18:54:17 +00004221 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004222 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004223 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004224}
4225
Rafael Espindola7cf32212013-03-20 03:05:54 +00004226Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004227 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004228}
4229
4230Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004231 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004232}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004233
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004234/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4235/// which isn't properly a linker but nonetheless performs the step of stitching
4236/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004237
4238CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4239 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004240 : Linux(D, Triple, Args) {
4241 if (CudaInstallation.isValid())
4242 getProgramPaths().push_back(CudaInstallation.getBinPath());
4243}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004244
4245void
4246CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4247 llvm::opt::ArgStringList &CC1Args) const {
4248 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4249 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004250
4251 if (DriverArgs.hasArg(options::OPT_nocudalib))
4252 return;
4253
4254 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4255 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4256 if (!LibDeviceFile.empty()) {
4257 CC1Args.push_back("-mlink-cuda-bitcode");
4258 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4259
4260 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4261 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4262 // came with CUDA-7.0.
4263 CC1Args.push_back("-target-feature");
4264 CC1Args.push_back("+ptx42");
4265 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004266}
4267
4268llvm::opt::DerivedArgList *
4269CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4270 const char *BoundArch) const {
4271 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4272 const OptTable &Opts = getDriver().getOpts();
4273
4274 for (Arg *A : Args) {
4275 if (A->getOption().matches(options::OPT_Xarch__)) {
4276 // Skip this argument unless the architecture matches BoundArch
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004277 if (!BoundArch || A->getValue(0) != StringRef(BoundArch))
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004278 continue;
4279
4280 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4281 unsigned Prev = Index;
4282 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4283
4284 // If the argument parsing failed or more than one argument was
4285 // consumed, the -Xarch_ argument's parameter tried to consume
4286 // extra arguments. Emit an error and ignore.
4287 //
4288 // We also want to disallow any options which would alter the
4289 // driver behavior; that isn't going to work in our model. We
4290 // use isDriverOption() as an approximation, although things
4291 // like -O4 are going to slip through.
4292 if (!XarchArg || Index > Prev + 1) {
4293 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4294 << A->getAsString(Args);
4295 continue;
4296 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4297 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4298 << A->getAsString(Args);
4299 continue;
4300 }
4301 XarchArg->setBaseArg(A);
4302 A = XarchArg.release();
4303 DAL->AddSynthesizedArg(A);
4304 }
4305 DAL->append(A);
4306 }
4307
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004308 if (BoundArch)
4309 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004310 return DAL;
4311}
4312
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004313Tool *CudaToolChain::buildAssembler() const {
4314 return new tools::NVPTX::Assembler(*this);
4315}
4316
4317Tool *CudaToolChain::buildLinker() const {
4318 return new tools::NVPTX::Linker(*this);
4319}
4320
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004321/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004322XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4323 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004324 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004325 // ProgramPaths are found via 'PATH' environment variable.
4326}
4327
Douglas Katzman54366072015-07-27 16:53:08 +00004328Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004329 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004330}
4331
Douglas Katzman54366072015-07-27 16:53:08 +00004332Tool *XCoreToolChain::buildLinker() const {
4333 return new tools::XCore::Linker(*this);
4334}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004335
Douglas Katzman54366072015-07-27 16:53:08 +00004336bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004337
Douglas Katzman54366072015-07-27 16:53:08 +00004338bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004339
Douglas Katzman54366072015-07-27 16:53:08 +00004340bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004341
Douglas Katzman54366072015-07-27 16:53:08 +00004342bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004343
Douglas Katzman54366072015-07-27 16:53:08 +00004344bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004345
Douglas Katzman54366072015-07-27 16:53:08 +00004346void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4347 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004348 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4349 DriverArgs.hasArg(options::OPT_nostdlibinc))
4350 return;
4351 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4352 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004353 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004354 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4355 ArrayRef<StringRef> DirVec(Dirs);
4356 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4357 }
4358}
4359
Douglas Katzman54366072015-07-27 16:53:08 +00004360void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4361 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004362 CC1Args.push_back("-nostdsysteminc");
4363}
4364
Douglas Katzman54366072015-07-27 16:53:08 +00004365void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4366 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004367 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004368 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4369 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004370 return;
4371 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4372 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004373 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004374 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4375 ArrayRef<StringRef> DirVec(Dirs);
4376 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4377 }
4378}
4379
Douglas Katzman54366072015-07-27 16:53:08 +00004380void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4381 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004382 // We don't output any lib args. This is handled by xcc.
4383}
Douglas Katzman84a75642015-06-19 14:55:19 +00004384
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004385MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4386 const ArgList &Args)
4387 : Generic_GCC(D, Triple, Args) {
4388 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4389 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4390 // This won't work to find gcc. Instead we give the installation detector an
4391 // extra triple, which is preferable to further hacks of the logic that at
4392 // present is based solely on getArch(). In particular, it would be wrong to
4393 // choose the myriad installation when targeting a non-myriad sparc install.
4394 switch (Triple.getArch()) {
4395 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00004396 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4397 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004398 case llvm::Triple::sparc:
4399 case llvm::Triple::sparcel:
4400 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004401 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004402 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004403
4404 if (GCCInstallation.isValid()) {
4405 // The contents of LibDir are independent of the version of gcc.
4406 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4407 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4408 if (Triple.getArch() == llvm::Triple::sparcel)
4409 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4410 else
4411 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4412 addPathIfExists(D, LibDir, getFilePaths());
4413
4414 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4415 // These files are tied to a particular version of gcc.
4416 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4417 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4418 // but as this toolchain is for LEON sparc, it can assume FPU.
4419 if (Triple.getArch() == llvm::Triple::sparcel)
4420 llvm::sys::path::append(CompilerSupportDir, "le");
4421 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4422 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004423}
4424
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004425MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004426
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004427void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4428 ArgStringList &CC1Args) const {
4429 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4430 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4431}
4432
Eric Christopherefef8ef2015-12-07 22:43:05 +00004433void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4434 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00004435 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4436 DriverArgs.hasArg(options::OPT_nostdincxx))
4437 return;
4438
4439 // Only libstdc++, for now.
4440 StringRef LibDir = GCCInstallation.getParentLibPath();
4441 const GCCVersion &Version = GCCInstallation.getVersion();
4442 StringRef TripleStr = GCCInstallation.getTriple().str();
4443 const Multilib &Multilib = GCCInstallation.getMultilib();
4444
Eric Christopherefef8ef2015-12-07 22:43:05 +00004445 addLibStdCXXIncludePaths(
4446 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4447 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00004448}
4449
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004450// MyriadToolChain handles several triples:
4451// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4452Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4453 // The inherited method works fine if not targeting the SHAVE.
4454 if (!isShaveCompilation(getTriple()))
4455 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004456 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00004457 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00004458 case Action::CompileJobClass:
4459 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004460 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004461 return Compiler.get();
4462 case Action::AssembleJobClass:
4463 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004464 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004465 return Assembler.get();
4466 default:
4467 return ToolChain::getTool(JA.getKind());
4468 }
4469}
4470
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004471Tool *MyriadToolChain::buildLinker() const {
4472 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004473}
Dan Gohmanc2853072015-09-03 22:51:53 +00004474
Dan Gohman52816862015-12-16 23:30:41 +00004475WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
4476 const llvm::opt::ArgList &Args)
4477 : ToolChain(D, Triple, Args) {
Dan Gohman57b62c52016-02-22 19:26:15 +00004478
4479 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
4480 getFilePaths().push_back(
4481 getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64"));
4482
Dan Gohman52816862015-12-16 23:30:41 +00004483 // Use LLD by default.
4484 DefaultLinker = "lld";
4485}
4486
Dan Gohmanc2853072015-09-03 22:51:53 +00004487bool WebAssembly::IsMathErrnoDefault() const { return false; }
4488
4489bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4490
4491bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4492
4493bool WebAssembly::isPICDefault() const { return false; }
4494
4495bool WebAssembly::isPIEDefault() const { return false; }
4496
4497bool WebAssembly::isPICDefaultForced() const { return false; }
4498
4499bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4500
4501// TODO: Support Objective C stuff.
4502bool WebAssembly::SupportsObjCGC() const { return false; }
4503
4504bool WebAssembly::hasBlocksRuntime() const { return false; }
4505
4506// TODO: Support profiling.
4507bool WebAssembly::SupportsProfiling() const { return false; }
4508
Dan Gohman52816862015-12-16 23:30:41 +00004509bool WebAssembly::HasNativeLLVMSupport() const { return true; }
4510
Dan Gohmanc2853072015-09-03 22:51:53 +00004511void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4512 ArgStringList &CC1Args) const {
4513 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4514 options::OPT_fno_use_init_array, true))
4515 CC1Args.push_back("-fuse-init-array");
4516}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004517
Dan Gohman6ad8f612016-01-14 16:00:13 +00004518ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
4519 return ToolChain::RLT_CompilerRT;
4520}
4521
4522ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
4523 return ToolChain::CST_Libcxx;
4524}
4525
4526void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4527 ArgStringList &CC1Args) const {
4528 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4529 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4530}
4531
4532void WebAssembly::AddClangCXXStdlibIncludeArgs(
4533 const llvm::opt::ArgList &DriverArgs,
4534 llvm::opt::ArgStringList &CC1Args) const {
4535 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
4536 !DriverArgs.hasArg(options::OPT_nostdincxx))
4537 addSystemInclude(DriverArgs, CC1Args,
4538 getDriver().SysRoot + "/include/c++/v1");
4539}
4540
Dan Gohman52816862015-12-16 23:30:41 +00004541Tool *WebAssembly::buildLinker() const {
4542 return new tools::wasm::Linker(*this);
4543}
4544
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004545PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4546 : Generic_ELF(D, Triple, Args) {
4547 if (Args.hasArg(options::OPT_static))
4548 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4549
4550 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4551 // if it exists; otherwise use the driver's installation path, which
4552 // should be <SDK_DIR>/host_tools/bin.
4553
4554 SmallString<512> PS4SDKDir;
4555 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4556 if (!llvm::sys::fs::exists(EnvValue))
4557 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4558 PS4SDKDir = EnvValue;
4559 } else {
4560 PS4SDKDir = getDriver().Dir;
4561 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00004562 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004563
Eric Christopherefef8ef2015-12-07 22:43:05 +00004564 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004565 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00004566 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004567 // If -isysroot was passed, use that as the SDK base path.
4568 std::string PrefixDir;
4569 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4570 PrefixDir = A->getValue();
4571 if (!llvm::sys::fs::exists(PrefixDir))
4572 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4573 } else
4574 PrefixDir = PS4SDKDir.str();
4575
4576 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4577 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4578 if (!Args.hasArg(options::OPT_nostdinc) &&
4579 !Args.hasArg(options::OPT_nostdlibinc) &&
4580 !Args.hasArg(options::OPT_isysroot) &&
4581 !Args.hasArg(options::OPT__sysroot_EQ) &&
4582 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4583 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4584 << "PS4 system headers" << PS4SDKIncludeDir;
4585 }
4586
4587 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4588 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4589 if (!Args.hasArg(options::OPT_nostdlib) &&
4590 !Args.hasArg(options::OPT_nodefaultlibs) &&
4591 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4592 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4593 !Args.hasArg(options::OPT_emit_ast) &&
4594 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4595 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4596 << "PS4 system libraries" << PS4SDKLibDir;
4597 return;
4598 }
4599 getFilePaths().push_back(PS4SDKLibDir.str());
4600}
4601
4602Tool *PS4CPU::buildAssembler() const {
4603 return new tools::PS4cpu::Assemble(*this);
4604}
4605
4606Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4607
4608bool PS4CPU::isPICDefault() const { return true; }
4609
4610bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4611
4612SanitizerMask PS4CPU::getSupportedSanitizers() const {
4613 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4614 Res |= SanitizerKind::Address;
4615 Res |= SanitizerKind::Vptr;
4616 return Res;
4617}