blob: 03421d6739cc9aa1d096dcf6a2c0c59a3e33128f [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
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003109ToolChain::CXXStdlibType FreeBSD::GetDefaultCXXStdlibType() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003110 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003111 return ToolChain::CST_Libcxx;
3112 return ToolChain::CST_Libstdcxx;
3113}
3114
3115void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3116 ArgStringList &CC1Args) const {
3117 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3118 DriverArgs.hasArg(options::OPT_nostdincxx))
3119 return;
3120
3121 switch (GetCXXStdlibType(DriverArgs)) {
3122 case ToolChain::CST_Libcxx:
3123 addSystemInclude(DriverArgs, CC1Args,
3124 getDriver().SysRoot + "/usr/include/c++/v1");
3125 break;
3126 case ToolChain::CST_Libstdcxx:
3127 addSystemInclude(DriverArgs, CC1Args,
3128 getDriver().SysRoot + "/usr/include/c++/4.2");
3129 addSystemInclude(DriverArgs, CC1Args,
3130 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3131 break;
3132 }
3133}
3134
Dimitry Andric60907392016-02-14 16:08:20 +00003135void FreeBSD::AddCXXStdlibLibArgs(const ArgList &Args,
3136 ArgStringList &CmdArgs) const {
3137 CXXStdlibType Type = GetCXXStdlibType(Args);
3138 bool Profiling = Args.hasArg(options::OPT_pg);
3139
3140 switch (Type) {
3141 case ToolChain::CST_Libcxx:
3142 CmdArgs.push_back(Profiling ? "-lc++_p" : "-lc++");
3143 break;
3144
3145 case ToolChain::CST_Libstdcxx:
3146 CmdArgs.push_back(Profiling ? "-lstdc++_p" : "-lstdc++");
3147 break;
3148 }
3149}
3150
Rafael Espindola7cf32212013-03-20 03:05:54 +00003151Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003152 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003153}
3154
Douglas Katzman95354292015-06-23 20:42:09 +00003155Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003156
Tim Northovere931f9f2015-10-30 16:30:41 +00003157bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003158 // FreeBSD uses SjLj exceptions on ARM oabi.
3159 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003160 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003161 case llvm::Triple::GNUEABI:
3162 case llvm::Triple::EABI:
3163 return false;
3164
3165 default:
3166 return (getTriple().getArch() == llvm::Triple::arm ||
3167 getTriple().getArch() == llvm::Triple::thumb);
3168 }
3169}
3170
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003171bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003172
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003173bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003174
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003175SanitizerMask FreeBSD::getSupportedSanitizers() const {
3176 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3177 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3178 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3179 getTriple().getArch() == llvm::Triple::mips64el;
3180 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3181 Res |= SanitizerKind::Address;
3182 Res |= SanitizerKind::Vptr;
3183 if (IsX86_64 || IsMIPS64) {
3184 Res |= SanitizerKind::Leak;
3185 Res |= SanitizerKind::Thread;
3186 }
3187 if (IsX86 || IsX86_64) {
3188 Res |= SanitizerKind::SafeStack;
3189 }
3190 return Res;
3191}
3192
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003193/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3194
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003195NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3196 : Generic_ELF(D, Triple, Args) {
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003197 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003198 // When targeting a 32-bit platform, try the special directory used on
3199 // 64-bit hosts, and only fall back to the main library directory if that
3200 // doesn't work.
3201 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3202 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003203 switch (Triple.getArch()) {
3204 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003205 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003206 break;
3207 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003208 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003209 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003210 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003211 switch (Triple.getEnvironment()) {
3212 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003213 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003214 getFilePaths().push_back("=/usr/lib/eabi");
3215 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003216 case llvm::Triple::EABIHF:
3217 case llvm::Triple::GNUEABIHF:
3218 getFilePaths().push_back("=/usr/lib/eabihf");
3219 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003220 default:
3221 getFilePaths().push_back("=/usr/lib/oabi");
3222 break;
3223 }
3224 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003225 case llvm::Triple::mips64:
3226 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003227 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003228 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003229 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003230 getFilePaths().push_back("=/usr/lib/64");
3231 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003232 case llvm::Triple::ppc:
3233 getFilePaths().push_back("=/usr/lib/powerpc");
3234 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003235 case llvm::Triple::sparc:
3236 getFilePaths().push_back("=/usr/lib/sparc");
3237 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003238 default:
3239 break;
3240 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003241
3242 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003243 }
3244}
3245
Rafael Espindola7cf32212013-03-20 03:05:54 +00003246Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003247 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003248}
3249
Douglas Katzman95354292015-06-23 20:42:09 +00003250Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003251
Jonas Hahnfeld09954192016-03-14 14:34:04 +00003252ToolChain::CXXStdlibType NetBSD::GetDefaultCXXStdlibType() const {
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003253 unsigned Major, Minor, Micro;
3254 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00003255 if (Major >= 7 || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003256 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003257 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003258 case llvm::Triple::arm:
3259 case llvm::Triple::armeb:
3260 case llvm::Triple::thumb:
3261 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003262 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003263 case llvm::Triple::ppc64:
3264 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00003265 case llvm::Triple::sparc:
3266 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003267 case llvm::Triple::x86:
3268 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003269 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003270 default:
3271 break;
3272 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003273 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003274 return ToolChain::CST_Libstdcxx;
3275}
3276
3277void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3278 ArgStringList &CC1Args) const {
3279 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3280 DriverArgs.hasArg(options::OPT_nostdincxx))
3281 return;
3282
3283 switch (GetCXXStdlibType(DriverArgs)) {
3284 case ToolChain::CST_Libcxx:
3285 addSystemInclude(DriverArgs, CC1Args,
3286 getDriver().SysRoot + "/usr/include/c++/");
3287 break;
3288 case ToolChain::CST_Libstdcxx:
3289 addSystemInclude(DriverArgs, CC1Args,
3290 getDriver().SysRoot + "/usr/include/g++");
3291 addSystemInclude(DriverArgs, CC1Args,
3292 getDriver().SysRoot + "/usr/include/g++/backward");
3293 break;
3294 }
3295}
3296
Chris Lattner3e2ee142010-07-07 16:01:42 +00003297/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3298
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003299Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3300 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003301 getFilePaths().push_back(getDriver().Dir + "/../lib");
3302 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003303}
3304
Rafael Espindola7cf32212013-03-20 03:05:54 +00003305Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003306 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003307}
3308
Douglas Katzman95354292015-06-23 20:42:09 +00003309Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003310
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003311static void addPathIfExists(const Driver &D, const Twine &Path,
3312 ToolChain::path_list &Paths) {
3313 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003314 Paths.push_back(Path.str());
3315}
3316
David Chisnallf571cde2012-02-15 13:39:01 +00003317/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3318
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003319Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003320 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003321 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003322
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003323 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003324
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003325 path_list &Paths = getFilePaths();
3326 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003327 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003328
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003329 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003330 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003331 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003332
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003333 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003334
3335 std::string LibPath = "/usr/lib/";
3336 switch (Triple.getArch()) {
3337 case llvm::Triple::x86:
3338 case llvm::Triple::sparc:
3339 break;
3340 case llvm::Triple::x86_64:
3341 LibPath += "amd64/";
3342 break;
3343 case llvm::Triple::sparcv9:
3344 LibPath += "sparcv9/";
3345 break;
3346 default:
3347 llvm_unreachable("Unsupported architecture");
3348 }
3349
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003350 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003351}
3352
Rafael Espindola7cf32212013-03-20 03:05:54 +00003353Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003354 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003355}
3356
Douglas Katzman95354292015-06-23 20:42:09 +00003357Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003358
Rafael Espindolad5117262015-09-09 13:36:00 +00003359void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3360 ArgStringList &CC1Args) const {
3361 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3362 DriverArgs.hasArg(options::OPT_nostdincxx))
3363 return;
3364
3365 // Include the support directory for things like xlocale and fudged system
3366 // headers.
3367 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3368
3369 if (GCCInstallation.isValid()) {
3370 GCCVersion Version = GCCInstallation.getVersion();
3371 addSystemInclude(DriverArgs, CC1Args,
3372 getDriver().SysRoot + "/usr/gcc/" +
3373 Version.MajorStr + "." +
3374 Version.MinorStr +
3375 "/include/c++/" + Version.Text);
3376 addSystemInclude(DriverArgs, CC1Args,
3377 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3378 "." + Version.MinorStr + "/include/c++/" +
3379 Version.Text + "/" +
3380 GCCInstallation.getTriple().str());
3381 }
3382}
3383
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003384/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003385
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003386enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003387 // NB: Releases of a particular Linux distro should be kept together
3388 // in this enum, because some tests are done by integer comparison against
3389 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003390 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003391 DebianLenny,
3392 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003393 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003394 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003395 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003396 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003397 RHEL4,
3398 RHEL5,
3399 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003400 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003401 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003402 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003403 UbuntuHardy,
3404 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003405 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003406 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003407 UbuntuLucid,
3408 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003409 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003410 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003411 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003412 UbuntuQuantal,
3413 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003414 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003415 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003416 UbuntuUtopic,
3417 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003418 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003419 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003420 UnknownDistro
3421};
3422
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003423static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003424 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003425}
3426
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003427static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003428
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003429static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003430 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003431}
3432
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003433static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003434 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003435}
3436
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003437static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003438 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3439 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3440 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003441 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003442 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003443 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003444 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003445 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003446 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3447 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3448 .Case("hardy", UbuntuHardy)
3449 .Case("intrepid", UbuntuIntrepid)
3450 .Case("jaunty", UbuntuJaunty)
3451 .Case("karmic", UbuntuKarmic)
3452 .Case("lucid", UbuntuLucid)
3453 .Case("maverick", UbuntuMaverick)
3454 .Case("natty", UbuntuNatty)
3455 .Case("oneiric", UbuntuOneiric)
3456 .Case("precise", UbuntuPrecise)
3457 .Case("quantal", UbuntuQuantal)
3458 .Case("raring", UbuntuRaring)
3459 .Case("saucy", UbuntuSaucy)
3460 .Case("trusty", UbuntuTrusty)
3461 .Case("utopic", UbuntuUtopic)
3462 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003463 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003464 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003465 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003466 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003467 }
3468
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003469 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3470 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003471 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003472 if (Data.startswith("Fedora release"))
3473 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003474 if (Data.startswith("Red Hat Enterprise Linux") ||
3475 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003476 if (Data.find("release 7") != StringRef::npos)
3477 return RHEL7;
3478 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003479 return RHEL6;
3480 else if (Data.find("release 5") != StringRef::npos)
3481 return RHEL5;
3482 else if (Data.find("release 4") != StringRef::npos)
3483 return RHEL4;
3484 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003485 return UnknownDistro;
3486 }
3487
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003488 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3489 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003490 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003491 if (Data[0] == '5')
3492 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003493 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003494 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003495 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003496 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003497 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003498 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003499 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3500 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003501 return UnknownDistro;
3502 }
3503
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003504 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003505 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003506
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003507 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003508 return Exherbo;
3509
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003510 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003511 return ArchLinux;
3512
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003513 return UnknownDistro;
3514}
3515
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003516/// \brief Get our best guess at the multiarch triple for a target.
3517///
3518/// Debian-based systems are starting to use a multiarch setup where they use
3519/// a target-triple directory in the library and header search paths.
3520/// Unfortunately, this triple does not align with the vanilla target triple,
3521/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003522static std::string getMultiarchTriple(const Driver &D,
3523 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003524 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003525 llvm::Triple::EnvironmentType TargetEnvironment =
3526 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003527
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003528 // For most architectures, just use whatever we have rather than trying to be
3529 // clever.
3530 switch (TargetTriple.getArch()) {
3531 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003532 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003533
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003534 // We use the existence of '/lib/<triple>' as a directory to detect some
3535 // common linux triples that don't quite match the Clang triple for both
3536 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3537 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003538 case llvm::Triple::arm:
3539 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003540 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003541 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003542 return "arm-linux-gnueabihf";
3543 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003544 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003545 return "arm-linux-gnueabi";
3546 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003547 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003548 case llvm::Triple::armeb:
3549 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003550 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003551 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003552 return "armeb-linux-gnueabihf";
3553 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003554 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003555 return "armeb-linux-gnueabi";
3556 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003557 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003558 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003559 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003560 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003561 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003562 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003563 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003564 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003565 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003566 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003567 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003568 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003569 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003570 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003571 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003572 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003573 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003574 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003575 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003576 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003577 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003578 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003579 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003580 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003581 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003582 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003583 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003584 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003585 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003586 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003587 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003588 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003589 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003590 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003591 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003592 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003593 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003594 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003595 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003596 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003597 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003598 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003599 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003600 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003601 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003602 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003603 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003604 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003605 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003606 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003607 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003608 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003609 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003610 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003611 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003612 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003613 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003614 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003615 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003616 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003617 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003618 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003619 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003620 return "s390x-linux-gnu";
3621 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003622 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003623 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003624}
3625
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003626static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003627 if (isMipsArch(Triple.getArch())) {
3628 // lib32 directory has a special meaning on MIPS targets.
3629 // It contains N32 ABI binaries. Use this folder if produce
3630 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003631 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003632 return "lib32";
3633 return Triple.isArch32Bit() ? "lib" : "lib64";
3634 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003635
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003636 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003637 // using that variant while targeting other architectures causes problems
3638 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003639 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003640 // them when we know we may need it.
3641 //
3642 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003643 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003644 // GCCInstallationDetector, but that is a more significant refactoring.
3645 if (Triple.getArch() == llvm::Triple::x86 ||
3646 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003647 return "lib32";
3648
Zinovy Nis1db95732014-07-10 15:27:19 +00003649 if (Triple.getArch() == llvm::Triple::x86_64 &&
3650 Triple.getEnvironment() == llvm::Triple::GNUX32)
3651 return "libx32";
3652
Simon Atanasyand4413882012-09-14 11:27:24 +00003653 return Triple.isArch32Bit() ? "lib" : "lib64";
3654}
3655
Rafael Espindola1af7c212012-02-19 01:38:32 +00003656Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003657 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003658 GCCInstallation.init(Triple, Args);
3659 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003660 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003661 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003662 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003663
Rafael Espindola10a63c22013-07-03 14:14:00 +00003664 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003665 // least) put various tools in a triple-prefixed directory off of the parent
3666 // of the GCC installation. We use the GCC triple here to ensure that we end
3667 // up with tools that support the same amount of cross compiling as the
3668 // detected GCC installation. For example, if we find a GCC installation
3669 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3670 // used to target i386.
3671 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003672 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003673 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003674 GCCInstallation.getTriple().str() + "/bin")
3675 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003676
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003677 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003678
Rafael Espindola10a63c22013-07-03 14:14:00 +00003679 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003680 ExtraOpts.push_back("-z");
3681 ExtraOpts.push_back("relro");
3682 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003683
Douglas Gregord9bb1522011-03-06 19:11:49 +00003684 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003685 ExtraOpts.push_back("-X");
3686
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003687 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003688 const bool IsMips = isMipsArch(Arch);
3689
3690 if (IsMips && !SysRoot.empty())
3691 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003692
Chandler Carruth0b842912011-12-09 04:45:18 +00003693 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3694 // and the MIPS ABI require .dynsym to be sorted in different ways.
3695 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3696 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003697 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003698 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003699 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003700 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003701 ExtraOpts.push_back("--hash-style=gnu");
3702
Rafael Espindola10a63c22013-07-03 14:14:00 +00003703 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003704 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3705 ExtraOpts.push_back("--hash-style=both");
3706 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003707
Chris Lattner84e38552011-05-22 05:36:06 +00003708 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003709 ExtraOpts.push_back("--no-add-needed");
3710
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003711 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003712 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003713 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003714 ExtraOpts.push_back("--build-id");
3715
Rafael Espindola10a63c22013-07-03 14:14:00 +00003716 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003717 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003718
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003719 // The selection of paths to try here is designed to match the patterns which
3720 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3721 // This was determined by running GCC in a fake filesystem, creating all
3722 // possible permutations of these directories, and seeing which ones it added
3723 // to the link paths.
3724 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003725
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003726 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003727 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003728
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003729 // Add the multilib suffixed paths where they are available.
3730 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003731 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003732 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003733 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003734
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003735 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003736 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003737 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003738 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003739
3740 // GCC cross compiling toolchains will install target libraries which ship
3741 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3742 // any part of the GCC installation in
3743 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3744 // debatable, but is the reality today. We need to search this tree even
3745 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003746 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003747 // installation that is *not* within the system root to ensure two things:
3748 //
3749 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003750 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003751 // appropriate rpath.
3752 // 2) There must not be libraries installed into
3753 // <prefix>/<triple>/<libdir> unless they should be preferred over
3754 // those within the system root.
3755 //
3756 // Note that this matches the GCC behavior. See the below comment for where
3757 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003758 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3759 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003760 Paths);
3761
Chandler Carruth69a125b2012-04-06 16:32:06 +00003762 // If the GCC installation we found is inside of the sysroot, we want to
3763 // prefer libraries installed in the parent prefix of the GCC installation.
3764 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003765 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003766 // This usually happens when there is an external cross compiler on the
3767 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003768 // the cross. Note that GCC does include some of these directories in some
3769 // configurations but this seems somewhere between questionable and simply
3770 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003771 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003772 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3773 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003774 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003775 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003776
3777 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003778 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003779 // those searched.
3780 // FIXME: It's not clear whether we should use the driver's installed
3781 // directory ('Dir' below) or the ResourceDir.
3782 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003783 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3784 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003785 }
3786
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003787 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3788 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3789 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3790 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003791
Chandler Carruthb427c562013-06-22 11:35:51 +00003792 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003793 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003794 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003795 addPathIfExists(D,
3796 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003797 "/../../" + OSLibDir,
3798 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003799
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003800 // Add the 'other' biarch variant path
3801 Multilib BiarchSibling;
3802 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003803 addPathIfExists(D, GCCInstallation.getInstallPath() +
3804 BiarchSibling.gccSuffix(),
3805 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003806 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003807
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003808 // See comments above on the multilib variant for details of why this is
3809 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003810 const std::string &LibPath = GCCInstallation.getParentLibPath();
3811 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3812 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003813 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3814 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003815 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003816
3817 // See comments above on the multilib variant for details of why this is
3818 // only included from within the sysroot.
3819 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003820 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003821 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003822
3823 // Similar to the logic for GCC above, if we are currently running Clang
3824 // inside of the requested system root, add its parent library path to those
3825 // searched.
3826 // FIXME: It's not clear whether we should use the driver's installed
3827 // directory ('Dir' below) or the ResourceDir.
3828 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003829 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003830
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003831 addPathIfExists(D, SysRoot + "/lib", Paths);
3832 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003833}
3834
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003835bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003836
Douglas Katzman95354292015-06-23 20:42:09 +00003837Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003838
3839Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003840 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003841}
3842
Simon Atanasyana0d89572013-10-05 14:37:55 +00003843std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003844 if (!getDriver().SysRoot.empty())
3845 return getDriver().SysRoot;
3846
3847 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3848 return std::string();
3849
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003850 // Standalone MIPS toolchains use different names for sysroot folder
3851 // and put it into different places. Here we try to check some known
3852 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003853
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003854 const StringRef InstallDir = GCCInstallation.getInstallPath();
3855 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003856 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003857
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003858 std::string Path =
3859 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3860 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003861
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003862 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003863 return Path;
3864
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003865 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003866
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003867 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003868 return Path;
3869
3870 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003871}
3872
Chandler Carrutha796f532011-11-05 20:17:13 +00003873void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3874 ArgStringList &CC1Args) const {
3875 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003876 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003877
3878 if (DriverArgs.hasArg(options::OPT_nostdinc))
3879 return;
3880
3881 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003882 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003883
3884 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003885 SmallString<128> P(D.ResourceDir);
3886 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003887 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003888 }
3889
3890 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3891 return;
3892
3893 // Check for configure-time C include directories.
3894 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3895 if (CIncludeDirs != "") {
3896 SmallVector<StringRef, 5> dirs;
3897 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003898 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003899 StringRef Prefix =
3900 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003901 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003902 }
3903 return;
3904 }
3905
3906 // Lacking those, try to detect the correct set of system includes for the
3907 // target triple.
3908
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003909 // Add include directories specific to the selected multilib set and multilib.
3910 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003911 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003912 if (Callback) {
3913 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3914 GCCInstallation.getTriple().str(),
3915 GCCInstallation.getMultilib());
3916 for (const auto &Path : IncludePaths)
3917 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3918 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003919 }
3920
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003921 // Implement generic Debian multiarch support.
3922 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003923 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003924
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003925 // FIXME: These are older forms of multiarch. It's not clear that they're
3926 // in use in any released version of Debian, so we should consider
3927 // removing them.
3928 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003929 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003930 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003931
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003932 // FIXME: These are older forms of multiarch. It's not clear that they're
3933 // in use in any released version of Debian, so we should consider
3934 // removing them.
3935 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3936 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003937 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003938 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003939 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003940 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003941 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003942 "/usr/include/arm-linux-gnueabihf"};
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003943 const StringRef ARMEBMultiarchIncludeDirs[] = {
3944 "/usr/include/armeb-linux-gnueabi"};
3945 const StringRef ARMEBHFMultiarchIncludeDirs[] = {
3946 "/usr/include/armeb-linux-gnueabihf"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003947 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003948 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003949 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003950 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003951 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003952 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003953 "/usr/include/mips64el-linux-gnu",
3954 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003955 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003956 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003957 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003958 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003959 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003960 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003961 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003962 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003963 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003964 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003965 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3966 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003967 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003968 switch (getTriple().getArch()) {
3969 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003970 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003971 break;
3972 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003973 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003974 break;
3975 case llvm::Triple::aarch64:
3976 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003977 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003978 break;
3979 case llvm::Triple::arm:
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003980 case llvm::Triple::thumb:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003981 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3982 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3983 else
3984 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003985 break;
Saleem Abdulrasool20f733a2015-12-11 06:20:59 +00003986 case llvm::Triple::armeb:
3987 case llvm::Triple::thumbeb:
3988 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3989 MultiarchIncludeDirs = ARMEBHFMultiarchIncludeDirs;
3990 else
3991 MultiarchIncludeDirs = ARMEBMultiarchIncludeDirs;
3992 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003993 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003994 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003995 break;
3996 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003997 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003998 break;
3999 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004000 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004001 break;
4002 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004003 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004004 break;
4005 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004006 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004007 break;
4008 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004009 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004010 break;
4011 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004012 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004013 break;
4014 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004015 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004016 break;
4017 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004018 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004019 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004020 case llvm::Triple::systemz:
4021 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4022 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004023 default:
4024 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004025 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004026 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004027 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004028 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004029 break;
4030 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004031 }
4032
4033 if (getTriple().getOS() == llvm::Triple::RTEMS)
4034 return;
4035
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004036 // Add an include of '/include' directly. This isn't provided by default by
4037 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4038 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004039 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004040
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004041 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004042}
4043
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004044static std::string DetectLibcxxIncludePath(StringRef base) {
4045 std::error_code EC;
4046 int MaxVersion = 0;
4047 std::string MaxVersionString = "";
4048 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4049 LI = LI.increment(EC)) {
4050 StringRef VersionText = llvm::sys::path::filename(LI->path());
4051 int Version;
4052 if (VersionText[0] == 'v' &&
4053 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4054 if (Version > MaxVersion) {
4055 MaxVersion = Version;
4056 MaxVersionString = VersionText;
4057 }
4058 }
4059 }
4060 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4061}
4062
Chandler Carrutha796f532011-11-05 20:17:13 +00004063void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4064 ArgStringList &CC1Args) const {
4065 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4066 DriverArgs.hasArg(options::OPT_nostdincxx))
4067 return;
4068
Chandler Carruthf4701732011-11-07 09:01:17 +00004069 // Check if libc++ has been enabled and provide its include paths if so.
4070 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004071 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004072 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004073
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004074 // We also check the system as for a long time this is the only place
4075 // Clang looked.
4076 // FIXME: We should really remove this. It doesn't make any sense.
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004077 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004078 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004079 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004080 continue;
4081 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004082 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004083 break;
4084 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004085 return;
4086 }
4087
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004088 // We need a detected GCC installation on Linux to provide libstdc++'s
4089 // headers. We handled the libc++ case above.
4090 if (!GCCInstallation.isValid())
4091 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004092
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004093 // By default, look for the C++ headers in an include directory adjacent to
4094 // the lib directory of the GCC installation. Note that this is expect to be
4095 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4096 StringRef LibDir = GCCInstallation.getParentLibPath();
4097 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004098 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004099 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004100 const std::string GCCMultiarchTriple = getMultiarchTriple(
4101 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004102 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004103 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004104 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004105
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004106 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004107 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004108 "/c++/" + Version.Text, TripleStr,
4109 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004110 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004111 return;
4112
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004113 // Otherwise, fall back on a bunch of options which don't use multiarch
4114 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004115 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004116 // Gentoo is weird and places its headers inside the GCC install,
4117 // so if the first attempt to find the headers fails, try these patterns.
4118 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4119 Version.MinorStr,
4120 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4121 // Android standalone toolchain has C++ headers in yet another place.
4122 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4123 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4124 // without a subdirectory corresponding to the gcc version.
4125 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004126 };
4127
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004128 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004129 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4130 /*GCCMultiarchTriple*/ "",
4131 /*TargetMultiarchTriple*/ "",
4132 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004133 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004134 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004135}
4136
Artem Belevichfa11ab52015-11-17 22:28:46 +00004137void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4138 ArgStringList &CC1Args) const {
4139 if (DriverArgs.hasArg(options::OPT_nocudainc))
4140 return;
4141
Artem Belevich86017332015-11-17 22:28:55 +00004142 if (CudaInstallation.isValid()) {
Artem Belevichfa11ab52015-11-17 22:28:46 +00004143 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
Artem Belevich86017332015-11-17 22:28:55 +00004144 CC1Args.push_back("-include");
Artem Belevich7fda3c92015-12-16 18:51:59 +00004145 CC1Args.push_back("__clang_cuda_runtime_wrapper.h");
Artem Belevich86017332015-11-17 22:28:55 +00004146 }
Artem Belevichfa11ab52015-11-17 22:28:46 +00004147}
4148
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004149bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004150
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004151SanitizerMask Linux::getSupportedSanitizers() const {
4152 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4153 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4154 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4155 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004156 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4157 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004158 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4159 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004160 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4161 Res |= SanitizerKind::Address;
4162 Res |= SanitizerKind::KernelAddress;
4163 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004164 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004165 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004166 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004167 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004168 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004169 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004170 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004171 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004172 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004173 if (IsX86 || IsX86_64) {
4174 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004175 }
4176 return Res;
4177}
4178
Xinliang David Li170cd102015-10-27 05:15:35 +00004179void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4180 llvm::opt::ArgStringList &CmdArgs) const {
4181 if (!needsProfileRT(Args)) return;
4182
4183 // Add linker option -u__llvm_runtime_variable to cause runtime
4184 // initialization module to be linked in.
4185 if (!Args.hasArg(options::OPT_coverage))
4186 CmdArgs.push_back(Args.MakeArgString(
4187 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4188 ToolChain::addProfileRTLibs(Args, CmdArgs);
4189}
4190
Daniel Dunbarcc912342009-05-02 18:28:39 +00004191/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4192
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004193DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4194 const ArgList &Args)
4195 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004196
4197 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004198 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004199 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004200 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004201
Daniel Dunbar083edf72009-12-21 18:54:17 +00004202 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004203 getFilePaths().push_back("/usr/lib");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00004204 getFilePaths().push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004205}
4206
Rafael Espindola7cf32212013-03-20 03:05:54 +00004207Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004208 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004209}
4210
4211Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004212 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004213}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004214
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004215/// CUDA toolchain. Our assembler is ptxas, and our "linker" is fatbinary,
4216/// which isn't properly a linker but nonetheless performs the step of stitching
4217/// together object files from the assembler into a single blob.
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004218
4219CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4220 const ArgList &Args)
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004221 : Linux(D, Triple, Args) {
4222 if (CudaInstallation.isValid())
4223 getProgramPaths().push_back(CudaInstallation.getBinPath());
4224}
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004225
4226void
4227CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4228 llvm::opt::ArgStringList &CC1Args) const {
4229 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4230 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004231
4232 if (DriverArgs.hasArg(options::OPT_nocudalib))
4233 return;
4234
4235 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4236 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4237 if (!LibDeviceFile.empty()) {
4238 CC1Args.push_back("-mlink-cuda-bitcode");
4239 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4240
4241 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4242 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4243 // came with CUDA-7.0.
4244 CC1Args.push_back("-target-feature");
4245 CC1Args.push_back("+ptx42");
4246 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004247}
4248
4249llvm::opt::DerivedArgList *
4250CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4251 const char *BoundArch) const {
4252 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4253 const OptTable &Opts = getDriver().getOpts();
4254
4255 for (Arg *A : Args) {
4256 if (A->getOption().matches(options::OPT_Xarch__)) {
4257 // Skip this argument unless the architecture matches BoundArch
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004258 if (!BoundArch || A->getValue(0) != StringRef(BoundArch))
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004259 continue;
4260
4261 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4262 unsigned Prev = Index;
4263 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4264
4265 // If the argument parsing failed or more than one argument was
4266 // consumed, the -Xarch_ argument's parameter tried to consume
4267 // extra arguments. Emit an error and ignore.
4268 //
4269 // We also want to disallow any options which would alter the
4270 // driver behavior; that isn't going to work in our model. We
4271 // use isDriverOption() as an approximation, although things
4272 // like -O4 are going to slip through.
4273 if (!XarchArg || Index > Prev + 1) {
4274 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4275 << A->getAsString(Args);
4276 continue;
4277 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4278 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4279 << A->getAsString(Args);
4280 continue;
4281 }
4282 XarchArg->setBaseArg(A);
4283 A = XarchArg.release();
4284 DAL->AddSynthesizedArg(A);
4285 }
4286 DAL->append(A);
4287 }
4288
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004289 if (BoundArch)
4290 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004291 return DAL;
4292}
4293
Justin Lebar21e5d4f2016-01-14 21:41:27 +00004294Tool *CudaToolChain::buildAssembler() const {
4295 return new tools::NVPTX::Assembler(*this);
4296}
4297
4298Tool *CudaToolChain::buildLinker() const {
4299 return new tools::NVPTX::Linker(*this);
4300}
4301
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004302/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004303XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4304 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004305 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004306 // ProgramPaths are found via 'PATH' environment variable.
4307}
4308
Douglas Katzman54366072015-07-27 16:53:08 +00004309Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004310 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004311}
4312
Douglas Katzman54366072015-07-27 16:53:08 +00004313Tool *XCoreToolChain::buildLinker() const {
4314 return new tools::XCore::Linker(*this);
4315}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004316
Douglas Katzman54366072015-07-27 16:53:08 +00004317bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004318
Douglas Katzman54366072015-07-27 16:53:08 +00004319bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004320
Douglas Katzman54366072015-07-27 16:53:08 +00004321bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004322
Douglas Katzman54366072015-07-27 16:53:08 +00004323bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004324
Douglas Katzman54366072015-07-27 16:53:08 +00004325bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004326
Douglas Katzman54366072015-07-27 16:53:08 +00004327void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4328 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004329 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4330 DriverArgs.hasArg(options::OPT_nostdlibinc))
4331 return;
4332 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4333 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004334 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004335 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4336 ArrayRef<StringRef> DirVec(Dirs);
4337 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4338 }
4339}
4340
Douglas Katzman54366072015-07-27 16:53:08 +00004341void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4342 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004343 CC1Args.push_back("-nostdsysteminc");
4344}
4345
Douglas Katzman54366072015-07-27 16:53:08 +00004346void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4347 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004348 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004349 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4350 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004351 return;
4352 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4353 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004354 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004355 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4356 ArrayRef<StringRef> DirVec(Dirs);
4357 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4358 }
4359}
4360
Douglas Katzman54366072015-07-27 16:53:08 +00004361void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4362 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004363 // We don't output any lib args. This is handled by xcc.
4364}
Douglas Katzman84a75642015-06-19 14:55:19 +00004365
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004366MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4367 const ArgList &Args)
4368 : Generic_GCC(D, Triple, Args) {
4369 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4370 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4371 // This won't work to find gcc. Instead we give the installation detector an
4372 // extra triple, which is preferable to further hacks of the logic that at
4373 // present is based solely on getArch(). In particular, it would be wrong to
4374 // choose the myriad installation when targeting a non-myriad sparc install.
4375 switch (Triple.getArch()) {
4376 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00004377 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4378 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004379 case llvm::Triple::sparc:
4380 case llvm::Triple::sparcel:
4381 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004382 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004383 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004384
4385 if (GCCInstallation.isValid()) {
4386 // The contents of LibDir are independent of the version of gcc.
4387 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4388 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4389 if (Triple.getArch() == llvm::Triple::sparcel)
4390 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4391 else
4392 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4393 addPathIfExists(D, LibDir, getFilePaths());
4394
4395 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4396 // These files are tied to a particular version of gcc.
4397 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4398 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4399 // but as this toolchain is for LEON sparc, it can assume FPU.
4400 if (Triple.getArch() == llvm::Triple::sparcel)
4401 llvm::sys::path::append(CompilerSupportDir, "le");
4402 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4403 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004404}
4405
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004406MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004407
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004408void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4409 ArgStringList &CC1Args) const {
4410 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4411 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4412}
4413
Eric Christopherefef8ef2015-12-07 22:43:05 +00004414void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4415 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00004416 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4417 DriverArgs.hasArg(options::OPT_nostdincxx))
4418 return;
4419
4420 // Only libstdc++, for now.
4421 StringRef LibDir = GCCInstallation.getParentLibPath();
4422 const GCCVersion &Version = GCCInstallation.getVersion();
4423 StringRef TripleStr = GCCInstallation.getTriple().str();
4424 const Multilib &Multilib = GCCInstallation.getMultilib();
4425
Eric Christopherefef8ef2015-12-07 22:43:05 +00004426 addLibStdCXXIncludePaths(
4427 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4428 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00004429}
4430
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004431// MyriadToolChain handles several triples:
4432// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4433Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4434 // The inherited method works fine if not targeting the SHAVE.
4435 if (!isShaveCompilation(getTriple()))
4436 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004437 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00004438 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00004439 case Action::CompileJobClass:
4440 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004441 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004442 return Compiler.get();
4443 case Action::AssembleJobClass:
4444 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004445 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004446 return Assembler.get();
4447 default:
4448 return ToolChain::getTool(JA.getKind());
4449 }
4450}
4451
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004452Tool *MyriadToolChain::buildLinker() const {
4453 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004454}
Dan Gohmanc2853072015-09-03 22:51:53 +00004455
Dan Gohman52816862015-12-16 23:30:41 +00004456WebAssembly::WebAssembly(const Driver &D, const llvm::Triple &Triple,
4457 const llvm::opt::ArgList &Args)
4458 : ToolChain(D, Triple, Args) {
Dan Gohman57b62c52016-02-22 19:26:15 +00004459
4460 assert(Triple.isArch32Bit() != Triple.isArch64Bit());
4461 getFilePaths().push_back(
4462 getDriver().SysRoot + "/lib" + (Triple.isArch32Bit() ? "32" : "64"));
4463
Dan Gohman52816862015-12-16 23:30:41 +00004464 // Use LLD by default.
4465 DefaultLinker = "lld";
4466}
4467
Dan Gohmanc2853072015-09-03 22:51:53 +00004468bool WebAssembly::IsMathErrnoDefault() const { return false; }
4469
4470bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4471
4472bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4473
4474bool WebAssembly::isPICDefault() const { return false; }
4475
4476bool WebAssembly::isPIEDefault() const { return false; }
4477
4478bool WebAssembly::isPICDefaultForced() const { return false; }
4479
4480bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4481
4482// TODO: Support Objective C stuff.
4483bool WebAssembly::SupportsObjCGC() const { return false; }
4484
4485bool WebAssembly::hasBlocksRuntime() const { return false; }
4486
4487// TODO: Support profiling.
4488bool WebAssembly::SupportsProfiling() const { return false; }
4489
Dan Gohman52816862015-12-16 23:30:41 +00004490bool WebAssembly::HasNativeLLVMSupport() const { return true; }
4491
Dan Gohmanc2853072015-09-03 22:51:53 +00004492void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4493 ArgStringList &CC1Args) const {
4494 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4495 options::OPT_fno_use_init_array, true))
4496 CC1Args.push_back("-fuse-init-array");
4497}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004498
Dan Gohman6ad8f612016-01-14 16:00:13 +00004499ToolChain::RuntimeLibType WebAssembly::GetDefaultRuntimeLibType() const {
4500 return ToolChain::RLT_CompilerRT;
4501}
4502
4503ToolChain::CXXStdlibType WebAssembly::GetCXXStdlibType(const ArgList &Args) const {
4504 return ToolChain::CST_Libcxx;
4505}
4506
4507void WebAssembly::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4508 ArgStringList &CC1Args) const {
4509 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4510 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4511}
4512
4513void WebAssembly::AddClangCXXStdlibIncludeArgs(
4514 const llvm::opt::ArgList &DriverArgs,
4515 llvm::opt::ArgStringList &CC1Args) const {
4516 if (!DriverArgs.hasArg(options::OPT_nostdlibinc) &&
4517 !DriverArgs.hasArg(options::OPT_nostdincxx))
4518 addSystemInclude(DriverArgs, CC1Args,
4519 getDriver().SysRoot + "/include/c++/v1");
4520}
4521
Dan Gohman52816862015-12-16 23:30:41 +00004522Tool *WebAssembly::buildLinker() const {
4523 return new tools::wasm::Linker(*this);
4524}
4525
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004526PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4527 : Generic_ELF(D, Triple, Args) {
4528 if (Args.hasArg(options::OPT_static))
4529 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4530
4531 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4532 // if it exists; otherwise use the driver's installation path, which
4533 // should be <SDK_DIR>/host_tools/bin.
4534
4535 SmallString<512> PS4SDKDir;
4536 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4537 if (!llvm::sys::fs::exists(EnvValue))
4538 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4539 PS4SDKDir = EnvValue;
4540 } else {
4541 PS4SDKDir = getDriver().Dir;
4542 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00004543 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004544
Eric Christopherefef8ef2015-12-07 22:43:05 +00004545 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004546 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00004547 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004548 // If -isysroot was passed, use that as the SDK base path.
4549 std::string PrefixDir;
4550 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4551 PrefixDir = A->getValue();
4552 if (!llvm::sys::fs::exists(PrefixDir))
4553 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4554 } else
4555 PrefixDir = PS4SDKDir.str();
4556
4557 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4558 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4559 if (!Args.hasArg(options::OPT_nostdinc) &&
4560 !Args.hasArg(options::OPT_nostdlibinc) &&
4561 !Args.hasArg(options::OPT_isysroot) &&
4562 !Args.hasArg(options::OPT__sysroot_EQ) &&
4563 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4564 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4565 << "PS4 system headers" << PS4SDKIncludeDir;
4566 }
4567
4568 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4569 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4570 if (!Args.hasArg(options::OPT_nostdlib) &&
4571 !Args.hasArg(options::OPT_nodefaultlibs) &&
4572 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4573 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4574 !Args.hasArg(options::OPT_emit_ast) &&
4575 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4576 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4577 << "PS4 system libraries" << PS4SDKLibDir;
4578 return;
4579 }
4580 getFilePaths().push_back(PS4SDKLibDir.str());
4581}
4582
4583Tool *PS4CPU::buildAssembler() const {
4584 return new tools::PS4cpu::Assemble(*this);
4585}
4586
4587Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4588
4589bool PS4CPU::isPICDefault() const { return true; }
4590
4591bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4592
4593SanitizerMask PS4CPU::getSupportedSanitizers() const {
4594 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4595 Res |= SanitizerKind::Address;
4596 Res |= SanitizerKind::Vptr;
4597 return Res;
4598}