blob: ce0f2bdefa9104732165c6d012d516cdf180ca37 [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
John McCall24fc0de2011-07-06 00:26:06 +000068/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000069ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover6f3ff222015-10-30 16:30:27 +000070 if (isTargetWatchOSBased())
Tim Northover756447a2015-10-30 16:30:36 +000071 return ObjCRuntime(ObjCRuntime::WatchOS, TargetVersion);
Tim Northover9c7e0352013-12-12 11:55:52 +000072 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000073 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000074 if (isNonFragile)
75 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
76 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000077}
78
John McCall7959fee2011-09-09 20:41:01 +000079/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
80bool Darwin::hasBlocksRuntime() const {
Tim Northover6f3ff222015-10-30 16:30:27 +000081 if (isTargetWatchOSBased())
82 return true;
83 else if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000084 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000085 else {
Tim Northover157d9112014-01-16 08:48:16 +000086 assert(isTargetMacOS() && "unexpected darwin target");
87 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000088 }
John McCall7959fee2011-09-09 20:41:01 +000089}
90
Renato Golin33e1f822015-05-28 15:49:28 +000091// This is just a MachO name translation routine and there's no
92// way to join this into ARMTargetParser without breaking all
93// other assumptions. Maybe MachO should consider standardising
94// their nomenclature.
95static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000096 return llvm::StringSwitch<const char *>(Arch)
97 .Case("armv6k", "armv6")
98 .Case("armv6m", "armv6m")
99 .Case("armv5tej", "armv5")
100 .Case("xscale", "xscale")
101 .Case("armv4t", "armv4t")
102 .Case("armv7", "armv7")
103 .Cases("armv7a", "armv7-a", "armv7")
104 .Cases("armv7r", "armv7-r", "armv7")
105 .Cases("armv7em", "armv7e-m", "armv7em")
106 .Cases("armv7k", "armv7-k", "armv7k")
107 .Cases("armv7m", "armv7-m", "armv7m")
108 .Cases("armv7s", "armv7-s", "armv7s")
109 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000110}
111
Renato Golin33e1f822015-05-28 15:49:28 +0000112static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000113 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000114 if (ArchKind == llvm::ARM::AK_INVALID)
115 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000116 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000117
118 // FIXME: Make sure this MachO triple mangling is really necessary.
119 // ARMv5* normalises to ARMv5.
120 if (Arch.startswith("armv5"))
121 Arch = Arch.substr(0, 5);
122 // ARMv6*, except ARMv6M, normalises to ARMv6.
123 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
124 Arch = Arch.substr(0, 5);
125 // ARMv7A normalises to ARMv7.
126 else if (Arch.endswith("v7a"))
127 Arch = Arch.substr(0, 5);
128 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000129}
130
Tim Northover9c7e0352013-12-12 11:55:52 +0000131static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000132 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000133 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000134 if (!A)
135 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000136
Tim Northover9c7e0352013-12-12 11:55:52 +0000137 return A->getOption().matches(options::OPT_msoft_float) ||
138 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
139 A->getValue() == StringRef("soft"));
140}
141
Tim Northover157d9112014-01-16 08:48:16 +0000142StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000143 switch (getTriple().getArch()) {
144 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000145 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000146
Tim Northover40956e62014-07-23 12:32:58 +0000147 case llvm::Triple::aarch64:
148 return "arm64";
149
Douglas Gregord9bb1522011-03-06 19:11:49 +0000150 case llvm::Triple::thumb:
Hans Wennborgdcfba332015-10-06 23:40:43 +0000151 case llvm::Triple::arm:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000152 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000153 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000154 return Arch;
155
156 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000157 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000158 return Arch;
159
160 return "arm";
161 }
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000162}
163
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000164Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000165
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +0000166MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000167
168std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000169 types::ID InputType) const {
Tim Northover157d9112014-01-16 08:48:16 +0000170 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
171
172 return Triple.getTriple();
173}
174
Chad Rosierd3a0f952011-09-20 20:44:06 +0000175std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
176 types::ID InputType) const {
177 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000178
179 // If the target isn't initialized (e.g., an unknown Darwin platform, return
180 // the default triple).
181 if (!isTargetInitialized())
182 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000183
Tim Northover157d9112014-01-16 08:48:16 +0000184 SmallString<16> Str;
Tim Northover6f3ff222015-10-30 16:30:27 +0000185 if (isTargetWatchOSBased())
186 Str += "watchos";
187 else if (isTargetTvOSBased())
188 Str += "tvos";
189 else if (isTargetIOSBased())
190 Str += "ios";
191 else
192 Str += "macosx";
Tim Northover157d9112014-01-16 08:48:16 +0000193 Str += getTargetVersion().getAsString();
194 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000195
196 return Triple.getTriple();
197}
198
David Blaikie68e081d2011-12-20 02:48:34 +0000199void Generic_ELF::anchor() {}
200
Tim Northover157d9112014-01-16 08:48:16 +0000201Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000202 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000203 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000204 if (!Lipo)
205 Lipo.reset(new tools::darwin::Lipo(*this));
206 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000207 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000208 if (!Dsymutil)
209 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
210 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000211 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000212 if (!VerifyDebug)
213 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
214 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000215 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000216 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000217 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000218}
219
Douglas Katzman95354292015-06-23 20:42:09 +0000220Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000221
Tim Northover157d9112014-01-16 08:48:16 +0000222Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000223 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000224}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000225
Douglas Katzman95354292015-06-23 20:42:09 +0000226DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000227 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000228 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000229
Tim Northover336f1892014-03-29 13:16:12 +0000230void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
Tim Northover6f3ff222015-10-30 16:30:27 +0000231 // For modern targets, promote certain warnings to errors.
232 if (isTargetWatchOSBased() || getTriple().isArch64Bit()) {
Tim Northover336f1892014-03-29 13:16:12 +0000233 // Always enable -Wdeprecated-objc-isa-usage and promote it
234 // to an error.
235 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
236 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
237
Tim Northover6f3ff222015-10-30 16:30:27 +0000238 // For iOS and watchOS, also error about implicit function declarations,
239 // as that can impact calling conventions.
240 if (!isTargetMacOS())
241 CC1Args.push_back("-Werror=implicit-function-declaration");
Tim Northover336f1892014-03-29 13:16:12 +0000242 }
243}
244
Tim Northover157d9112014-01-16 08:48:16 +0000245/// \brief Determine whether Objective-C automated reference counting is
246/// enabled.
247static bool isObjCAutoRefCount(const ArgList &Args) {
248 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
249}
250
John McCall31168b02011-06-15 23:02:42 +0000251void DarwinClang::AddLinkARCArgs(const ArgList &Args,
252 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000253 // Avoid linking compatibility stubs on i386 mac.
254 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
255 return;
256
257 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
258
259 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
260 runtime.hasSubscripting())
261 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000262
263 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000264 SmallString<128> P(getDriver().ClangExecutable);
265 llvm::sys::path::remove_filename(P); // 'clang'
266 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000267 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000268 // Mash in the platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000269 if (isTargetWatchOSSimulator())
270 P += "watchsimulator";
271 else if (isTargetWatchOS())
272 P += "watchos";
273 else if (isTargetTvOSSimulator())
274 P += "appletvsimulator";
275 else if (isTargetTvOS())
276 P += "appletvos";
277 else if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000278 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000279 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000280 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000281 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000282 P += "macosx";
283 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000284
Rafael Espindola358256c2013-06-26 02:13:00 +0000285 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000286}
287
Tim Northover157d9112014-01-16 08:48:16 +0000288void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000289 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000290 bool IsEmbedded, bool AddRPath) const {
291 SmallString<128> Dir(getDriver().ResourceDir);
292 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
293
294 SmallString<128> P(Dir);
295 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000296
Eric Christopherc235d0c62011-06-22 17:41:40 +0000297 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000298 // not have compiler-rt checked out or integrated into their build (unless
299 // we explicitly force linking with this library).
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000300 if (AlwaysLink || getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000301 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000302
303 // Adding the rpaths might negatively interact when other rpaths are involved,
304 // so we should make sure we add the rpaths last, after all user-specified
305 // rpaths. This is currently true from this place, but we need to be
306 // careful if this function is ever called before user's rpaths are emitted.
307 if (AddRPath) {
308 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
309
310 // Add @executable_path to rpath to support having the dylib copied with
311 // the executable.
312 CmdArgs.push_back("-rpath");
313 CmdArgs.push_back("@executable_path");
314
315 // Add the path to the resource dir to rpath to support using the dylib
316 // from the default location without copying.
317 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000318 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000319 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000320}
321
Justin Bogner2fd95f62015-05-12 06:30:48 +0000322void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000323 ArgStringList &CmdArgs) const {
Xinliang David Li69306c02015-10-22 06:15:31 +0000324 if (!needsProfileRT(Args)) return;
Justin Bognerc7701242015-05-12 05:44:36 +0000325
Chris Bieneman586d24b2015-11-20 00:19:21 +0000326 // TODO: Clean this up once autoconf is gone
327 SmallString<128> P(getDriver().ResourceDir);
328 llvm::sys::path::append(P, "lib", "darwin");
329 const char *Library = "libclang_rt.profile_osx.a";
330
Justin Bognerc7701242015-05-12 05:44:36 +0000331 // Select the appropriate runtime library for the target.
Chris Bieneman586d24b2015-11-20 00:19:21 +0000332 if (isTargetWatchOS()) {
333 Library = "libclang_rt.profile_watchos.a";
334 } else if (isTargetWatchOSSimulator()) {
335 llvm::sys::path::append(P, "libclang_rt.profile_watchossim.a");
336 Library = getVFS().exists(P) ? "libclang_rt.profile_watchossim.a"
337 : "libclang_rt.profile_watchos.a";
338 } else if (isTargetTvOS()) {
339 Library = "libclang_rt.profile_tvos.a";
340 } else if (isTargetTvOSSimulator()) {
341 llvm::sys::path::append(P, "libclang_rt.profile_tvossim.a");
342 Library = getVFS().exists(P) ? "libclang_rt.profile_tvossim.a"
343 : "libclang_rt.profile_tvos.a";
344 } else if (isTargetIPhoneOS()) {
345 Library = "libclang_rt.profile_ios.a";
346 } else if (isTargetIOSSimulator()) {
347 llvm::sys::path::append(P, "libclang_rt.profile_iossim.a");
348 Library = getVFS().exists(P) ? "libclang_rt.profile_iossim.a"
349 : "libclang_rt.profile_ios.a";
Vedant Kumar0affb932015-11-10 00:20:34 +0000350 } else {
351 assert(isTargetMacOS() && "unexpected non MacOS platform");
Vedant Kumar0affb932015-11-10 00:20:34 +0000352 }
Chris Bieneman586d24b2015-11-20 00:19:21 +0000353 AddLinkRuntimeLib(Args, CmdArgs, Library,
354 /*AlwaysLink*/ true);
Xinliang David Li69306c02015-10-22 06:15:31 +0000355 return;
Justin Bognerc7701242015-05-12 05:44:36 +0000356}
357
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000358void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
359 ArgStringList &CmdArgs,
360 StringRef Sanitizer) const {
361 if (!Args.hasArg(options::OPT_dynamiclib) &&
362 !Args.hasArg(options::OPT_bundle)) {
363 // Sanitizer runtime libraries requires C++.
364 AddCXXStdlibLibArgs(Args, CmdArgs);
365 }
Tim Northover6f3ff222015-10-30 16:30:27 +0000366 // ASan is not supported on watchOS.
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000367 assert(isTargetMacOS() || isTargetIOSSimulator());
368 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000369 AddLinkRuntimeLib(
370 Args, CmdArgs,
371 (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
372 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
373 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000374
375 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
376 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
377 // all RTTI-related symbols that UBSan uses.
378 CmdArgs.push_back("-lc++abi");
379 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000380}
381
Daniel Dunbar6276f992009-09-18 08:15:13 +0000382void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
383 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000384 // Darwin only supports the compiler-rt based runtime libraries.
385 switch (GetRuntimeLibType(Args)) {
386 case ToolChain::RLT_CompilerRT:
387 break;
388 default:
389 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000390 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000391 return;
392 }
393
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000394 // Darwin doesn't support real static executables, don't link any runtime
395 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000396 if (Args.hasArg(options::OPT_static) ||
397 Args.hasArg(options::OPT_fapple_kext) ||
398 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000399 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000400
401 // Reject -static-libgcc for now, we can deal with this when and if someone
402 // cares. This is useful in situations where someone wants to statically link
403 // something like libstdc++, and needs its runtime support routines.
404 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000405 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000406 return;
407 }
408
Peter Collingbourne32701642013-11-01 18:16:25 +0000409 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000410 if (Sanitize.needsAsanRt())
411 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
412 if (Sanitize.needsUbsanRt())
413 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000414 if (Sanitize.needsTsanRt())
415 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000416
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000417 // Otherwise link libSystem, then the dynamic runtime library, and finally any
418 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000419 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000420
421 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000422 if (isTargetWatchOSBased()) {
423 // We currently always need a static runtime library for watchOS.
424 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
425 } else if (isTargetTvOSBased()) {
426 // We currently always need a static runtime library for tvOS.
427 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
428 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000429 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
430 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000431 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000432 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000433 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000434 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000435
Daniel Dunbard1076382011-04-18 23:48:36 +0000436 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000437 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000438 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000439 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000440 // The dynamic runtime library was merged with libSystem for 10.6 and
441 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000442 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000443 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000444 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000445 CmdArgs.push_back("-lgcc_s.10.5");
446
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000447 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000448 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000449 // omitted from 10.4.dylib.
450 //
451 // Unfortunately, that turned out to not be true, because Darwin system
452 // headers can still use eprintf on i386, and it is not exported from
453 // libSystem. Therefore, we still must provide a runtime library just for
454 // the tiny tiny handful of projects that *might* use that symbol.
455 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000456 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000457 } else {
458 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000459 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
460 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000461 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000462 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000463}
464
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000465void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000466 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000467
Daniel Dunbar455a0492012-08-17 18:43:50 +0000468 // Support allowing the SDKROOT environment variable used by xcrun and other
469 // Xcode tools to define the default sysroot, by making it the default for
470 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000471 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
472 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000473 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000474 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
475 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000476 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000477 // We only use this value as the default if it is an absolute path,
478 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000479 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000480 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000481 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000482 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000483 }
484 }
485 }
486
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000487 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000488 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000489 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
490 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000491
Tim Northover6f3ff222015-10-30 16:30:27 +0000492 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000493 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000494 << OSXVersion->getAsString(Args)
495 << (iOSVersion ? iOSVersion :
496 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
497 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
498 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
499 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
500 << iOSVersion->getAsString(Args)
501 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
502 TvOSVersion = WatchOSVersion = nullptr;
503 } else if (TvOSVersion && WatchOSVersion) {
504 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
505 << TvOSVersion->getAsString(Args)
506 << WatchOSVersion->getAsString(Args);
507 WatchOSVersion = nullptr;
508 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000509 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000510 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000511 std::string OSXTarget;
512 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000513 std::string TvOSTarget;
514 std::string WatchOSTarget;
515
Chad Rosier64707fe2011-08-31 20:56:25 +0000516 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
517 OSXTarget = env;
518 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
519 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000520 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
521 TvOSTarget = env;
522 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
523 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000524
Steven Wu7a1372c2015-06-25 01:59:35 +0000525 // If there is no command-line argument to specify the Target version and
526 // no environment variable defined, see if we can set the default based
527 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000528 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Steven Wu7a1372c2015-06-25 01:59:35 +0000529 Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000530 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000531 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000532 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
533 size_t BeginSDK = isysroot.rfind("SDKs/");
534 size_t EndSDK = isysroot.rfind(".sdk");
535 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
536 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
537 // Slice the version number out.
538 // Version number is between the first and the last number.
539 size_t StartVer = SDK.find_first_of("0123456789");
540 size_t EndVer = SDK.find_last_of("0123456789");
541 if (StartVer != StringRef::npos && EndVer > StartVer) {
542 StringRef Version = SDK.slice(StartVer, EndVer + 1);
543 if (SDK.startswith("iPhoneOS") ||
544 SDK.startswith("iPhoneSimulator"))
545 iOSTarget = Version;
546 else if (SDK.startswith("MacOSX"))
547 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000548 else if (SDK.startswith("WatchOS") ||
549 SDK.startswith("WatchSimulator"))
550 WatchOSTarget = Version;
551 else if (SDK.startswith("AppleTVOS") ||
552 SDK.startswith("AppleTVSimulator"))
553 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000554 }
555 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000556 }
557 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000558
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000559 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000560 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000561 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
562 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000563 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000564 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000565 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000566 MachOArchName == "arm64") {
567 getTriple().getiOSVersion(Major, Minor, Micro);
568 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
569 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000570 } else if (MachOArchName == "armv7k") {
571 getTriple().getWatchOSVersion(Major, Minor, Micro);
572 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
573 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000574 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
575 MachOArchName != "armv7em") {
576 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
577 getDriver().Diag(diag::err_drv_invalid_darwin_version)
578 << getTriple().getOSName();
579 }
580 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
581 << Micro;
582 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000583 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000584
Tim Northover6f3ff222015-10-30 16:30:27 +0000585 // Do not allow conflicts with the watchOS target.
586 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
587 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
588 << "WATCHOS_DEPLOYMENT_TARGET"
589 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
590 "TVOS_DEPLOYMENT_TARGET");
591 }
592
593 // Do not allow conflicts with the tvOS target.
594 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
595 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
596 << "TVOS_DEPLOYMENT_TARGET"
597 << "IPHONEOS_DEPLOYMENT_TARGET";
598 }
599
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000600 // Allow conflicts among OSX and iOS for historical reasons, but choose the
601 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000602 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
603 !WatchOSTarget.empty() ||
604 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000605 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000606 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000607 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000608 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000609 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000610 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000611 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000612
Chad Rosier64707fe2011-08-31 20:56:25 +0000613 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000614 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000615 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000616 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000617 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000618 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000619 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000620 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000621 } else if (!TvOSTarget.empty()) {
622 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
623 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
624 Args.append(TvOSVersion);
625 } else if (!WatchOSTarget.empty()) {
626 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
627 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
628 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000629 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000630 }
Mike Stump11289f42009-09-09 15:08:12 +0000631
Tim Northover9c7e0352013-12-12 11:55:52 +0000632 DarwinPlatformKind Platform;
633 if (OSXVersion)
634 Platform = MacOS;
635 else if (iOSVersion)
636 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000637 else if (TvOSVersion)
638 Platform = TvOS;
639 else if (WatchOSVersion)
640 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000641 else
Tim Northover157d9112014-01-16 08:48:16 +0000642 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000643
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000644 // Set the tool chain target information.
645 unsigned Major, Minor, Micro;
646 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000647 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000648 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
649 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000650 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
651 HadExtra) ||
652 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000653 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000654 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000655 } else if (Platform == IPhoneOS) {
656 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000657 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
658 HadExtra) ||
659 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000660 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000661 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000662 } else if (Platform == TvOS) {
663 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
664 Micro, HadExtra) || HadExtra ||
665 Major >= 10 || Minor >= 100 || Micro >= 100)
666 getDriver().Diag(diag::err_drv_invalid_version_number)
667 << TvOSVersion->getAsString(Args);
668 } else if (Platform == WatchOS) {
669 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
670 Micro, HadExtra) || HadExtra ||
671 Major >= 10 || Minor >= 100 || Micro >= 100)
672 getDriver().Diag(diag::err_drv_invalid_version_number)
673 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000674 } else
675 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000676
Bob Wilson7f294b52014-10-10 23:10:10 +0000677 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000678 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
679 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000680 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000681 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
682 getTriple().getArch() == llvm::Triple::x86_64))
683 Platform = TvOSSimulator;
684 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
685 getTriple().getArch() == llvm::Triple::x86_64))
686 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000687
Tim Northover9c7e0352013-12-12 11:55:52 +0000688 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000689}
690
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000691void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000692 ArgStringList &CmdArgs) const {
693 CXXStdlibType Type = GetCXXStdlibType(Args);
694
695 switch (Type) {
696 case ToolChain::CST_Libcxx:
697 CmdArgs.push_back("-lc++");
698 break;
699
Hans Wennborgdcfba332015-10-06 23:40:43 +0000700 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000701 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
702 // it was previously found in the gcc lib dir. However, for all the Darwin
703 // platforms we care about it was -lstdc++.6, so we search for that
704 // explicitly if we can't see an obvious -lstdc++ candidate.
705
706 // Check in the sysroot first.
707 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000708 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000709 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000710
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000711 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000712 llvm::sys::path::remove_filename(P);
713 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000714 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000715 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000716 return;
717 }
718 }
719 }
720
721 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000722 // FIXME: This should be removed someday when we don't have to care about
723 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000724 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
725 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000726 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
727 return;
728 }
729
730 // Otherwise, let the linker search.
731 CmdArgs.push_back("-lstdc++");
732 break;
733 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000734}
735
Shantonu Senafeb03b2010-09-17 18:39:08 +0000736void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
737 ArgStringList &CmdArgs) const {
738
739 // For Darwin platforms, use the compiler-rt-based support library
740 // instead of the gcc-provided one (which is also incidentally
741 // only present in the gcc lib dir, which makes it hard to find).
742
Rafael Espindola358256c2013-06-26 02:13:00 +0000743 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000744 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000745
746 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000747 if (isTargetWatchOS()) {
748 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
749 } else if (isTargetTvOS()) {
750 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
751 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000752 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000753 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000754 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000755 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000756
Shantonu Senafeb03b2010-09-17 18:39:08 +0000757 // For now, allow missing resource libraries to support developers who may
758 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000759 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000760 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000761}
762
Tim Northover157d9112014-01-16 08:48:16 +0000763DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
764 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000765 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
766 const OptTable &Opts = getDriver().getOpts();
767
768 // FIXME: We really want to get out of the tool chain level argument
769 // translation business, as it makes the driver functionality much
770 // more opaque. For now, we follow gcc closely solely for the
771 // purpose of easily achieving feature parity & testability. Once we
772 // have something that works, we should reevaluate each translation
773 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000774
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000775 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000776 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000777 // Skip this argument unless the architecture matches either the toolchain
778 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000779 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000780 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
781 if (!(XarchArch == getArch() ||
782 (BoundArch &&
783 XarchArch ==
784 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000785 continue;
786
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000787 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000788 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000789 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000790 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000791
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000792 // If the argument parsing failed or more than one argument was
793 // consumed, the -Xarch_ argument's parameter tried to consume
794 // extra arguments. Emit an error and ignore.
795 //
796 // We also want to disallow any options which would alter the
797 // driver behavior; that isn't going to work in our model. We
798 // use isDriverOption() as an approximation, although things
799 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000800 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000801 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000802 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000803 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000804 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000805 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000806 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000807 continue;
808 }
809
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000810 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000811
Nico Webera04d5f82014-05-11 17:27:13 +0000812 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000813 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000814
815 // Linker input arguments require custom handling. The problem is that we
816 // have already constructed the phase actions, so we can not treat them as
817 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000818 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000819 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000820 for (const char *Value : A->getValues()) {
821 DAL->AddSeparateArg(
822 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000823 }
824 continue;
825 }
Mike Stump11289f42009-09-09 15:08:12 +0000826 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000827
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000828 // Sob. These is strictly gcc compatible for the time being. Apple
829 // gcc translates options twice, which means that self-expanding
830 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000831 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000832 default:
833 DAL->append(A);
834 break;
835
836 case options::OPT_mkernel:
837 case options::OPT_fapple_kext:
838 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000839 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000840 break;
Mike Stump11289f42009-09-09 15:08:12 +0000841
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000842 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000843 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000844 break;
845
846 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000847 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000848 DAL->AddFlagArg(
849 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000850 break;
851
852 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000853 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000854 DAL->AddFlagArg(
855 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000856 break;
857
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000858 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000859 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000860 break;
861
862 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000863 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000864 break;
865
866 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000867 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000868 break;
869
870 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000871 DAL->AddFlagArg(A,
872 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000873 break;
874
875 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000876 DAL->AddFlagArg(
877 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000878 break;
879
880 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000881 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000882 break;
883
884 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000885 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000886 break;
887 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000888 }
889
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000890 if (getTriple().getArch() == llvm::Triple::x86 ||
891 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000892 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000893 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
894 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000895
896 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000897 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000898 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000899 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000900 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
901 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000902
903 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
904 // which defines the list of which architectures we accept.
905 if (Name == "ppc")
906 ;
907 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000908 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000909 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000910 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000911 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000912 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000913 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000914 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000915 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000916 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000917 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000918 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000919 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000920 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000921 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000922 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000923
Bill Schmidt778d3872013-07-26 01:36:11 +0000924 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000925 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000926
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000927 else if (Name == "i386")
928 ;
929 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000930 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000931 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000932 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000933 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000934 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000935 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000936 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000937 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000938 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000939 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000940 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000941 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000942 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000943
944 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000945 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000946 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000947 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
948 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000949 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000950
951 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000952 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000953 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000954 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000955 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000956 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000957 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000958 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000959 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000960 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000961 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000962 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000963 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000964 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000965 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +0000966 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000967 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +0000968 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +0000969 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000970 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000971 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +0000972 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000973 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000974
Tim Northover157d9112014-01-16 08:48:16 +0000975 return DAL;
976}
977
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000978void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
979 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000980 // Embedded targets are simple at the moment, not supporting sanitizers and
981 // with different libraries for each member of the product { static, PIC } x
982 // { hard-float, soft-float }
983 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000984 CompilerRT +=
985 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
986 ? "hard"
987 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +0000988 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
989
990 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
991}
992
Tim Northover157d9112014-01-16 08:48:16 +0000993DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
994 const char *BoundArch) const {
995 // First get the generic Apple args, before moving onto Darwin-specific ones.
996 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
997 const OptTable &Opts = getDriver().getOpts();
998
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000999 // If no architecture is bound, none of the translations here are relevant.
1000 if (!BoundArch)
1001 return DAL;
1002
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001003 // Add an explicit version min argument for the deployment target. We do this
1004 // after argument translation because -Xarch_ arguments may add a version min
1005 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +00001006 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +00001007
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001008 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
1009 // FIXME: It would be far better to avoid inserting those -static arguments,
1010 // but we can't check the deployment target in the translation code until
1011 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +00001012 if (isTargetWatchOSBased() ||
1013 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1014 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001015 Arg *A = *it;
1016 ++it;
1017 if (A->getOption().getID() != options::OPT_mkernel &&
1018 A->getOption().getID() != options::OPT_fapple_kext)
1019 continue;
1020 assert(it != ie && "unexpected argument translation");
1021 A = *it;
1022 assert(A->getOption().getID() == options::OPT_static &&
1023 "missing expected -static argument");
1024 it = DAL->getArgs().erase(it);
1025 }
1026 }
1027
Bob Wilson0f7445b2013-11-02 23:19:53 +00001028 // Default to use libc++ on OS X 10.9+ and iOS 7+.
1029 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
Tim Northover6f3ff222015-10-30 16:30:27 +00001030 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) ||
1031 isTargetWatchOSBased()) &&
Bob Wilson0f7445b2013-11-02 23:19:53 +00001032 !Args.getLastArg(options::OPT_stdlib_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +00001033 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1034 "libc++");
Bob Wilson0f7445b2013-11-02 23:19:53 +00001035
Bob Wilson102be442011-10-07 17:54:41 +00001036 // Validate the C++ standard library choice.
1037 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1038 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001039 // Check whether the target provides libc++.
1040 StringRef where;
1041
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001042 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001043 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001044 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001045
1046 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001047 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001048 }
1049 }
1050
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001051 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001052}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001053
Tim Northover157d9112014-01-16 08:48:16 +00001054bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001055 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001056}
1057
Tim Northover157d9112014-01-16 08:48:16 +00001058bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001059 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1060 return S[0] != '\0';
1061 return false;
1062}
1063
Tim Northovere931f9f2015-10-30 16:30:41 +00001064bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001065 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001066 if (getTriple().getArch() != llvm::Triple::arm &&
1067 getTriple().getArch() != llvm::Triple::thumb)
1068 return false;
1069
Tim Northoverc741b042015-11-17 18:27:27 +00001070 // Only watchOS uses the new DWARF/Compact unwinding method.
1071 return !isTargetWatchOS();
Daniel Dunbar3241d402010-02-10 18:49:11 +00001072}
1073
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001074bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001075
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001076bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001077
Tim Northover157d9112014-01-16 08:48:16 +00001078bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001079 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001080 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001081}
1082
Tim Northover157d9112014-01-16 08:48:16 +00001083bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001084 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001085 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001086}
1087
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001088void Darwin::addMinVersionArgs(const ArgList &Args,
1089 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001090 VersionTuple TargetVersion = getTargetVersion();
1091
Tim Northover6f3ff222015-10-30 16:30:27 +00001092 if (isTargetWatchOS())
1093 CmdArgs.push_back("-watchos_version_min");
1094 else if (isTargetWatchOSSimulator())
1095 CmdArgs.push_back("-watchos_simulator_version_min");
1096 else if (isTargetTvOS())
1097 CmdArgs.push_back("-tvos_version_min");
1098 else if (isTargetTvOSSimulator())
1099 CmdArgs.push_back("-tvos_simulator_version_min");
1100 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001101 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001102 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001103 CmdArgs.push_back("-iphoneos_version_min");
1104 else {
1105 assert(isTargetMacOS() && "unexpected target");
1106 CmdArgs.push_back("-macosx_version_min");
1107 }
1108
1109 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1110}
1111
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001112void Darwin::addStartObjectFileArgs(const ArgList &Args,
1113 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001114 // Derived from startfile spec.
1115 if (Args.hasArg(options::OPT_dynamiclib)) {
1116 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001117 if (isTargetWatchOSBased()) {
1118 ; // watchOS does not need dylib1.o.
1119 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001120 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001121 } else if (isTargetIPhoneOS()) {
1122 if (isIPhoneOSVersionLT(3, 1))
1123 CmdArgs.push_back("-ldylib1.o");
1124 } else {
1125 if (isMacosxVersionLT(10, 5))
1126 CmdArgs.push_back("-ldylib1.o");
1127 else if (isMacosxVersionLT(10, 6))
1128 CmdArgs.push_back("-ldylib1.10.5.o");
1129 }
1130 } else {
1131 if (Args.hasArg(options::OPT_bundle)) {
1132 if (!Args.hasArg(options::OPT_static)) {
1133 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001134 if (isTargetWatchOSBased()) {
1135 ; // watchOS does not need bundle1.o.
1136 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001137 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001138 } else if (isTargetIPhoneOS()) {
1139 if (isIPhoneOSVersionLT(3, 1))
1140 CmdArgs.push_back("-lbundle1.o");
1141 } else {
1142 if (isMacosxVersionLT(10, 6))
1143 CmdArgs.push_back("-lbundle1.o");
1144 }
1145 }
1146 } else {
1147 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1148 if (Args.hasArg(options::OPT_static) ||
1149 Args.hasArg(options::OPT_object) ||
1150 Args.hasArg(options::OPT_preload)) {
1151 CmdArgs.push_back("-lgcrt0.o");
1152 } else {
1153 CmdArgs.push_back("-lgcrt1.o");
1154
1155 // darwin_crt2 spec is empty.
1156 }
1157 // By default on OS X 10.8 and later, we don't link with a crt1.o
1158 // file and the linker knows to use _main as the entry point. But,
1159 // when compiling with -pg, we need to link with the gcrt1.o file,
1160 // so pass the -no_new_main option to tell the linker to use the
1161 // "start" symbol as the entry point.
1162 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1163 CmdArgs.push_back("-no_new_main");
1164 } else {
1165 if (Args.hasArg(options::OPT_static) ||
1166 Args.hasArg(options::OPT_object) ||
1167 Args.hasArg(options::OPT_preload)) {
1168 CmdArgs.push_back("-lcrt0.o");
1169 } else {
1170 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001171 if (isTargetWatchOSBased()) {
1172 ; // watchOS does not need crt1.o.
1173 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001174 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001175 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001176 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001177 ; // iOS does not need any crt1 files for arm64
1178 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001179 CmdArgs.push_back("-lcrt1.o");
1180 else if (isIPhoneOSVersionLT(6, 0))
1181 CmdArgs.push_back("-lcrt1.3.1.o");
1182 } else {
1183 if (isMacosxVersionLT(10, 5))
1184 CmdArgs.push_back("-lcrt1.o");
1185 else if (isMacosxVersionLT(10, 6))
1186 CmdArgs.push_back("-lcrt1.10.5.o");
1187 else if (isMacosxVersionLT(10, 8))
1188 CmdArgs.push_back("-lcrt1.10.6.o");
1189
1190 // darwin_crt2 spec is empty.
1191 }
1192 }
1193 }
1194 }
1195 }
1196
1197 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001198 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001199 isMacosxVersionLT(10, 5)) {
1200 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1201 CmdArgs.push_back(Str);
1202 }
1203}
1204
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001205bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001206
John McCall3deb1ad2012-08-21 02:47:43 +00001207void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001208 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1209 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001210 return;
John McCall93207072012-08-27 01:56:21 +00001211 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001212}
1213
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001214SanitizerMask Darwin::getSupportedSanitizers() const {
1215 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001216 if (isTargetMacOS() || isTargetIOSSimulator())
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001217 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001218 if (isTargetMacOS()) {
1219 if (!isMacosxVersionLT(10, 9))
1220 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001221 Res |= SanitizerKind::SafeStack;
Kuba Brecka85e01c02015-11-06 15:09:20 +00001222 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001223 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001224 return Res;
1225}
1226
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001227/// Generic_GCC - A tool chain using the 'gcc' command to perform
1228/// all subcommands; this relies on gcc translating the majority of
1229/// command line options.
1230
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001231/// \brief Parse a GCCVersion object out of a string of text.
1232///
1233/// This is the primary means of forming GCCVersion objects.
1234/*static*/
1235Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001236 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001237 std::pair<StringRef, StringRef> First = VersionText.split('.');
1238 std::pair<StringRef, StringRef> Second = First.second.split('.');
1239
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001240 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1241 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001242 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001243 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001244 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001245 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001246 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001247
1248 // First look for a number prefix and parse that if present. Otherwise just
1249 // stash the entire patch string in the suffix, and leave the number
1250 // unspecified. This covers versions strings such as:
1251 // 4.4
1252 // 4.4.0
1253 // 4.4.x
1254 // 4.4.2-rc4
1255 // 4.4.x-patched
1256 // And retains any patch number it finds.
1257 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1258 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001259 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001260 // Try to parse the number and any suffix.
1261 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1262 GoodVersion.Patch < 0)
1263 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001264 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001265 }
1266 }
1267
1268 return GoodVersion;
1269}
1270
1271/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001272bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1273 int RHSPatch,
1274 StringRef RHSPatchSuffix) const {
1275 if (Major != RHSMajor)
1276 return Major < RHSMajor;
1277 if (Minor != RHSMinor)
1278 return Minor < RHSMinor;
1279 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001280 // Note that versions without a specified patch sort higher than those with
1281 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001282 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001283 return true;
1284 if (Patch == -1)
1285 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001286
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001287 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001288 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001289 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001290 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001291 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001292 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001293 return true;
1294 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001295 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001296
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001297 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001298 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001299 }
1300
1301 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001302 return false;
1303}
1304
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001305static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001306 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1307 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001308 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001309 return GCC_INSTALL_PREFIX;
1310}
1311
Roman Divacky326d9982013-12-06 18:32:18 +00001312/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001313///
1314/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001315/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001316///
1317/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1318/// should instead pull the target out of the driver. This is currently
1319/// necessary because the driver doesn't store the final version of the target
1320/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001321void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001322 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001323 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001324 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1325 ? TargetTriple.get64BitArchVariant()
1326 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001327 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001328 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001329 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001330 SmallVector<StringRef, 16> CandidateTripleAliases;
1331 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001332 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1333 CandidateTripleAliases, CandidateBiarchLibDirs,
1334 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001335
1336 // Compute the set of prefixes for our search.
1337 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1338 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001339
Rafael Espindola1af7c212012-02-19 01:38:32 +00001340 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1341 if (GCCToolchainDir != "") {
1342 if (GCCToolchainDir.back() == '/')
1343 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001344
Rafael Espindola1af7c212012-02-19 01:38:32 +00001345 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001346 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001347 // If we have a SysRoot, try that first.
1348 if (!D.SysRoot.empty()) {
1349 Prefixes.push_back(D.SysRoot);
1350 Prefixes.push_back(D.SysRoot + "/usr");
1351 }
1352
1353 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001354 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001355
1356 // And finally in /usr.
1357 if (D.SysRoot.empty())
1358 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001359 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001360
1361 // Loop over the various components which exist and select the best GCC
1362 // installation available. GCC installs are ranked by version number.
1363 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001364 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001365 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001366 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001367 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001368 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001369 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001370 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001371 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001372 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001373 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001374 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001375 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001376 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001377 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001378 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001379 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001380 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001381 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001382 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001383 }
1384 }
1385}
1386
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001387void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001388 for (const auto &InstallPath : CandidateGCCInstallPaths)
1389 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001390
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001391 if (!GCCInstallPath.empty())
1392 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1393
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001394 for (const auto &Multilib : Multilibs)
1395 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001396
1397 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1398 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001399}
1400
1401bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1402 if (BiarchSibling.hasValue()) {
1403 M = BiarchSibling.getValue();
1404 return true;
1405 }
1406 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001407}
1408
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001409/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001410 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001411 SmallVectorImpl<StringRef> &LibDirs,
1412 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001413 SmallVectorImpl<StringRef> &BiarchLibDirs,
1414 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001415 // Declare a bunch of static data sets that we'll select between below. These
1416 // are specifically designed to always refer to string literals to avoid any
1417 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001418 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1419 static const char *const AArch64Triples[] = {
1420 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1421 "aarch64-redhat-linux"};
1422 static const char *const AArch64beLibDirs[] = {"/lib"};
1423 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1424 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001425
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001426 static const char *const ARMLibDirs[] = {"/lib"};
1427 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1428 "arm-linux-androideabi"};
1429 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1430 "armv7hl-redhat-linux-gnueabi"};
1431 static const char *const ARMebLibDirs[] = {"/lib"};
1432 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1433 "armeb-linux-androideabi"};
1434 static const char *const ARMebHFTriples[] = {
1435 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001436
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001437 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001438 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001439 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1440 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1441 "x86_64-redhat-linux", "x86_64-suse-linux",
1442 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1443 "x86_64-slackware-linux", "x86_64-linux-android",
1444 "x86_64-unknown-linux"};
1445 static const char *const X32LibDirs[] = {"/libx32"};
1446 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001447 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001448 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1449 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1450 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1451 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1452 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001453
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001454 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001455 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1456 "mips-mti-linux-gnu",
1457 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001458 static const char *const MIPSELLibDirs[] = {"/lib"};
1459 static const char *const MIPSELTriples[] = {
1460 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001461
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001462 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1463 static const char *const MIPS64Triples[] = {
1464 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1465 "mips64-linux-gnuabi64"};
1466 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1467 static const char *const MIPS64ELTriples[] = {
1468 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1469 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001470
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001471 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001472 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001473 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1474 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1475 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1476 static const char *const PPC64Triples[] = {
1477 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1478 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1479 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1480 static const char *const PPC64LETriples[] = {
1481 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1482 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001483
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001484 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1485 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1486 "sparcv8-linux-gnu"};
1487 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1488 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1489 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001490
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001491 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001492 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001493 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1494 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001495
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001496 // Solaris.
1497 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1498 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1499 "i386-pc-solaris2.11"};
1500
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001501 using std::begin;
1502 using std::end;
1503
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001504 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1505 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1506 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001507 return;
1508 }
1509
Chandler Carruth866faab2012-01-25 07:21:38 +00001510 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001511 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001512 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1513 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1514 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1515 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001516 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001517 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001518 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1519 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1520 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1521 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001522 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001523 case llvm::Triple::arm:
1524 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001525 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001526 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001527 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001528 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001529 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001530 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001531 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001532 case llvm::Triple::armeb:
1533 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001534 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001535 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001536 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001537 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001538 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001539 }
1540 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001541 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001542 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1543 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1544 // x32 is always available when x86_64 is available, so adding it as
1545 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001546 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001547 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1548 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001549 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001550 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1551 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001552 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001553 break;
1554 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001555 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1556 TripleAliases.append(begin(X86Triples), end(X86Triples));
1557 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1558 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001559 break;
1560 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001561 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1562 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1563 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1564 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001565 break;
1566 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001567 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1568 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1569 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1570 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1571 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001572 break;
1573 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001574 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1575 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1576 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1577 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001578 break;
1579 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001580 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1581 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1582 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1583 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1584 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001585 break;
1586 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001587 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1588 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1589 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1590 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001591 break;
1592 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001593 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1594 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1595 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1596 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001597 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001598 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001599 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1600 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001601 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001602 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001603 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001604 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1605 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1606 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1607 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001608 break;
1609 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001610 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1611 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1612 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1613 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001614 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001615 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001616 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1617 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001618 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001619 default:
1620 // By default, just rely on the standard lib directories and the original
1621 // triple.
1622 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001623 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001624
1625 // Always append the drivers target triple to the end, in case it doesn't
1626 // match any of our aliases.
1627 TripleAliases.push_back(TargetTriple.str());
1628
1629 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001630 if (TargetTriple.str() != BiarchTriple.str())
1631 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001632}
1633
Artem Belevich98607b62015-09-23 21:49:39 +00001634// \brief -- try common CUDA installation paths looking for files we need for
1635// CUDA compilation.
1636
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001637void Generic_GCC::CudaInstallationDetector::init(
1638 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001639 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001640
1641 if (Args.hasArg(options::OPT_cuda_path_EQ))
1642 CudaPathCandidates.push_back(
1643 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1644 else {
1645 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
Artem Belevich86017332015-11-17 22:28:55 +00001646 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001647 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1648 }
1649
Benjamin Kramere8b76412015-09-24 14:48:37 +00001650 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001651 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001652 continue;
1653
1654 CudaInstallPath = CudaPath;
1655 CudaIncludePath = CudaInstallPath + "/include";
1656 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1657 CudaLibPath =
1658 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1659
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001660 if (!(D.getVFS().exists(CudaIncludePath) &&
1661 D.getVFS().exists(CudaLibPath) &&
1662 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001663 continue;
1664
Artem Belevich34f481a2015-11-17 22:28:50 +00001665 std::error_code EC;
1666 for (llvm::sys::fs::directory_iterator LI(CudaLibDevicePath, EC), LE;
1667 !EC && LI != LE; LI = LI.increment(EC)) {
1668 StringRef FilePath = LI->path();
1669 StringRef FileName = llvm::sys::path::filename(FilePath);
1670 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1671 const StringRef LibDeviceName = "libdevice.";
1672 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1673 continue;
1674 StringRef GpuArch = FileName.slice(
1675 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
1676 CudaLibDeviceMap[GpuArch] = FilePath.str();
1677 // Insert map entries for specifc devices with this compute capability.
1678 if (GpuArch == "compute_20") {
1679 CudaLibDeviceMap["sm_20"] = FilePath;
1680 CudaLibDeviceMap["sm_21"] = FilePath;
1681 } else if (GpuArch == "compute_30") {
1682 CudaLibDeviceMap["sm_30"] = FilePath;
1683 CudaLibDeviceMap["sm_32"] = FilePath;
1684 } else if (GpuArch == "compute_35") {
1685 CudaLibDeviceMap["sm_35"] = FilePath;
1686 CudaLibDeviceMap["sm_37"] = FilePath;
1687 }
1688 }
1689
Artem Belevich98607b62015-09-23 21:49:39 +00001690 IsValid = true;
1691 break;
1692 }
1693}
1694
1695void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1696 if (isValid())
1697 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1698}
1699
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001700namespace {
1701// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001702class FilterNonExistent {
1703 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001704 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001705
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001706public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001707 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1708 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001709 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001710 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001711 }
1712};
1713} // end anonymous namespace
1714
1715static void addMultilibFlag(bool Enabled, const char *const Flag,
1716 std::vector<std::string> &Flags) {
1717 if (Enabled)
1718 Flags.push_back(std::string("+") + Flag);
1719 else
1720 Flags.push_back(std::string("-") + Flag);
1721}
1722
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001723static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001724 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1725 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1726}
1727
1728static bool isMips32(llvm::Triple::ArchType Arch) {
1729 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1730}
1731
1732static bool isMips64(llvm::Triple::ArchType Arch) {
1733 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1734}
1735
1736static bool isMipsEL(llvm::Triple::ArchType Arch) {
1737 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1738}
1739
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001740static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001741 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001742 return A && A->getOption().matches(options::OPT_mips16);
1743}
1744
1745static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001746 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001747 return A && A->getOption().matches(options::OPT_mmicromips);
1748}
1749
Benjamin Kramere003ca22015-10-28 13:54:16 +00001750namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001751struct DetectedMultilibs {
1752 /// The set of multilibs that the detected installation supports.
1753 MultilibSet Multilibs;
1754
1755 /// The primary multilib appropriate for the given flags.
1756 Multilib SelectedMultilib;
1757
1758 /// On Biarch systems, this corresponds to the default multilib when
1759 /// targeting the non-default multilib. Otherwise, it is empty.
1760 llvm::Optional<Multilib> BiarchSibling;
1761};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001762} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001763
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001764static Multilib makeMultilib(StringRef commonSuffix) {
1765 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1766}
1767
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001768static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1769 StringRef Path, const ArgList &Args,
1770 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001771 // Some MIPS toolchains put libraries and object files compiled
1772 // using different options in to the sub-directoris which names
1773 // reflects the flags used for compilation. For example sysroot
1774 // directory might looks like the following examples:
1775 //
1776 // /usr
1777 // /lib <= crt*.o files compiled with '-mips32'
1778 // /mips16
1779 // /usr
1780 // /lib <= crt*.o files compiled with '-mips16'
1781 // /el
1782 // /usr
1783 // /lib <= crt*.o files compiled with '-mips16 -EL'
1784 //
1785 // or
1786 //
1787 // /usr
1788 // /lib <= crt*.o files compiled with '-mips32r2'
1789 // /mips16
1790 // /usr
1791 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1792 // /mips32
1793 // /usr
1794 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001795
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001796 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001797
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001798 // Check for FSF toolchain multilibs
1799 MultilibSet FSFMipsMultilibs;
1800 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001801 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001802 .flag("+m32")
1803 .flag("-m64")
1804 .flag("-mmicromips")
1805 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001806
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001807 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001808 .flag("+m32")
1809 .flag("-m64")
1810 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001811
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001812 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001813 .flag("-m32")
1814 .flag("+m64")
1815 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001816
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001817 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1818 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001819
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001820 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001821 .flag("+m32")
1822 .flag("-m64")
1823 .flag("-mmicromips")
1824 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001825
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001826 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001827
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001828 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001829
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001830 auto MAbi64 =
1831 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001832
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001833 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001834
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001835 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001836
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001837 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001838
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001839 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001840
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001841 FSFMipsMultilibs =
1842 MultilibSet()
1843 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1844 MArchDefault)
1845 .Maybe(UCLibc)
1846 .Maybe(Mips16)
1847 .FilterOut("/mips64/mips16")
1848 .FilterOut("/mips64r2/mips16")
1849 .FilterOut("/micromips/mips16")
1850 .Maybe(MAbi64)
1851 .FilterOut("/micromips/64")
1852 .FilterOut("/mips32/64")
1853 .FilterOut("^/64")
1854 .FilterOut("/mips16/64")
1855 .Either(BigEndian, LittleEndian)
1856 .Maybe(SoftFloat)
1857 .Maybe(Nan2008)
1858 .FilterOut(".*sof/nan2008")
1859 .FilterOut(NonExistent)
1860 .setIncludeDirsCallback([](StringRef InstallDir,
1861 StringRef TripleStr, const Multilib &M) {
1862 std::vector<std::string> Dirs;
1863 Dirs.push_back((InstallDir + "/include").str());
1864 std::string SysRootInc =
1865 InstallDir.str() + "/../../../../sysroot";
1866 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1867 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1868 else
1869 Dirs.push_back(SysRootInc + "/usr/include");
1870 return Dirs;
1871 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001872 }
1873
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001874 // Check for Musl toolchain multilibs
1875 MultilibSet MuslMipsMultilibs;
1876 {
1877 auto MArchMipsR2 = makeMultilib("")
1878 .osSuffix("/mips-r2-hard-musl")
1879 .flag("+EB")
1880 .flag("-EL")
1881 .flag("+march=mips32r2");
1882
1883 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1884 .flag("-EB")
1885 .flag("+EL")
1886 .flag("+march=mips32r2");
1887
1888 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1889
1890 // Specify the callback that computes the include directories.
1891 MuslMipsMultilibs.setIncludeDirsCallback([](
1892 StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1893 std::vector<std::string> Dirs;
1894 Dirs.push_back(
1895 (InstallDir + "/../sysroot" + M.osSuffix() + "/usr/include").str());
1896 return Dirs;
1897 });
1898 }
1899
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001900 // Check for Code Sourcery toolchain multilibs
1901 MultilibSet CSMipsMultilibs;
1902 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001903 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001904
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001905 auto MArchMicroMips =
1906 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001907
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001908 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001909
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001910 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001911
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001912 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001913
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001914 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001915
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001916 auto DefaultFloat =
1917 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001918
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001919 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001920
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001921 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001922
1923 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001924 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001925 .gccSuffix("/64")
1926 .includeSuffix("/64")
1927 .flag("+mabi=n64")
1928 .flag("-mabi=n32")
1929 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001930
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001931 CSMipsMultilibs =
1932 MultilibSet()
1933 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1934 .Maybe(UCLibc)
1935 .Either(SoftFloat, Nan2008, DefaultFloat)
1936 .FilterOut("/micromips/nan2008")
1937 .FilterOut("/mips16/nan2008")
1938 .Either(BigEndian, LittleEndian)
1939 .Maybe(MAbi64)
1940 .FilterOut("/mips16.*/64")
1941 .FilterOut("/micromips.*/64")
1942 .FilterOut(NonExistent)
1943 .setIncludeDirsCallback([](StringRef InstallDir,
1944 StringRef TripleStr, const Multilib &M) {
1945 std::vector<std::string> Dirs;
1946 Dirs.push_back((InstallDir + "/include").str());
1947 std::string SysRootInc =
1948 InstallDir.str() + "/../../../../" + TripleStr.str();
1949 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1950 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1951 else
1952 Dirs.push_back(SysRootInc + "/libc/usr/include");
1953 return Dirs;
1954 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001955 }
1956
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001957 MultilibSet AndroidMipsMultilibs =
1958 MultilibSet()
1959 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1960 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1961 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001962
1963 MultilibSet DebianMipsMultilibs;
1964 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001965 Multilib MAbiN32 =
1966 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001967
1968 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001969 .gccSuffix("/64")
1970 .includeSuffix("/64")
1971 .flag("+m64")
1972 .flag("-m32")
1973 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001974
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001975 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001976
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001977 DebianMipsMultilibs =
1978 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001979 }
1980
Daniel Sanders2bf13662014-07-10 14:40:57 +00001981 MultilibSet ImgMultilibs;
1982 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001983 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001984
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001985 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001986
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001987 auto MAbi64 =
1988 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001989
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001990 ImgMultilibs =
1991 MultilibSet()
1992 .Maybe(Mips64r6)
1993 .Maybe(MAbi64)
1994 .Maybe(LittleEndian)
1995 .FilterOut(NonExistent)
1996 .setIncludeDirsCallback([](StringRef InstallDir,
1997 StringRef TripleStr, const Multilib &M) {
1998 std::vector<std::string> Dirs;
1999 Dirs.push_back((InstallDir + "/include").str());
2000 Dirs.push_back(
2001 (InstallDir + "/../../../../sysroot/usr/include").str());
2002 return Dirs;
2003 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00002004 }
2005
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002006 StringRef CPUName;
2007 StringRef ABIName;
2008 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
2009
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002010 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
2011
2012 Multilib::flags_list Flags;
2013 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2014 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2015 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002016 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002017 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002018 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002019 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002020 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002021 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002022 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2023 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002024 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002025 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002026 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002027 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2028 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002029 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2030 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002031 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002032 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002033 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002034 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002035
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002036 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002037 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00002038 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2039 Result.Multilibs = AndroidMipsMultilibs;
2040 return true;
2041 }
2042 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002043 }
2044
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002045 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2046 TargetTriple.getOS() == llvm::Triple::Linux &&
2047 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2048 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2049 Result.Multilibs = MuslMipsMultilibs;
2050 return true;
2051 }
2052 return false;
2053 }
2054
Daniel Sanders2bf13662014-07-10 14:40:57 +00002055 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2056 TargetTriple.getOS() == llvm::Triple::Linux &&
2057 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2058 // Select mips-img-linux-gnu toolchain.
2059 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
2060 Result.Multilibs = ImgMultilibs;
2061 return true;
2062 }
2063 return false;
2064 }
2065
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002066 // Sort candidates. Toolchain that best meets the directories goes first.
2067 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002068 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
2069 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002070 std::sort(
2071 std::begin(candidates), std::end(candidates),
2072 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2073 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002074 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002075 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002076 Result.BiarchSibling = Multilib();
2077 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002078 return true;
2079 }
2080 }
2081
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002082 {
2083 // Fallback to the regular toolchain-tree structure.
2084 Multilib Default;
2085 Result.Multilibs.push_back(Default);
2086 Result.Multilibs.FilterOut(NonExistent);
2087
2088 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2089 Result.BiarchSibling = Multilib();
2090 return true;
2091 }
2092 }
2093
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002094 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002095}
2096
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002097static bool findBiarchMultilibs(const Driver &D,
2098 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002099 StringRef Path, const ArgList &Args,
2100 bool NeedsBiarchSuffix,
2101 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002102 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2103 // in what would normally be GCCInstallPath and put the 64-bit
2104 // libs in a subdirectory named 64. The simple logic we follow is that
2105 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2106 // we use that. If not, and if not a biarch triple alias, we look for
2107 // crtbegin.o without the subdirectory.
2108
2109 Multilib Default;
2110 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002111 .gccSuffix("/64")
2112 .includeSuffix("/64")
2113 .flag("-m32")
2114 .flag("+m64")
2115 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002116 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002117 .gccSuffix("/32")
2118 .includeSuffix("/32")
2119 .flag("+m32")
2120 .flag("-m64")
2121 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002122 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002123 .gccSuffix("/x32")
2124 .includeSuffix("/x32")
2125 .flag("-m32")
2126 .flag("-m64")
2127 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002128
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002129 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002130
Zinovy Nis1db95732014-07-10 15:27:19 +00002131 // Determine default multilib from: 32, 64, x32
2132 // Also handle cases such as 64 on 32, 32 on 64, etc.
2133 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002134 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002135 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002136 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002137 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002138 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002139 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002140 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002141 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002142 if (TargetTriple.isArch32Bit())
2143 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002144 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002145 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002146 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002147 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002148 }
2149
Zinovy Nis1db95732014-07-10 15:27:19 +00002150 if (Want == WANT32)
2151 Default.flag("+m32").flag("-m64").flag("-mx32");
2152 else if (Want == WANT64)
2153 Default.flag("-m32").flag("+m64").flag("-mx32");
2154 else if (Want == WANTX32)
2155 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002156 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002157 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002158
Simon Atanasyan60280b42014-05-12 07:37:51 +00002159 Result.Multilibs.push_back(Default);
2160 Result.Multilibs.push_back(Alt64);
2161 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002162 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002163
Simon Atanasyan60280b42014-05-12 07:37:51 +00002164 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002165
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002166 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002167 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002168 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002169 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002170
Simon Atanasyan60280b42014-05-12 07:37:51 +00002171 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002172 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002173
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002174 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002175 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002176 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002177
2178 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002179}
2180
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002181void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2182 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2183 const std::string &LibDir, StringRef CandidateTriple,
2184 bool NeedsBiarchSuffix) {
2185 // Solaris is a special case. The GCC installation is under
2186 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2187 // need to iterate twice.
2188 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002189 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2190 !EC && LI != LE; LI = LI.increment(EC)) {
2191 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002192 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2193
2194 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002195 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002196 continue; // Saw this path before; no need to look at it again.
2197 if (CandidateVersion.isOlderThan(4, 1, 1))
2198 continue;
2199 if (CandidateVersion <= Version)
2200 continue;
2201
2202 GCCInstallPath =
2203 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002204 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002205 continue;
2206
2207 // If we make it here there has to be at least one GCC version, let's just
2208 // use the latest one.
2209 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002210 for (vfs::directory_iterator
2211 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2212 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002213 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2214
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002215 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002216 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2217
2218 if (CandidateSubVersion > Version)
2219 Version = CandidateSubVersion;
2220 }
2221
2222 GCCTriple.setTriple(CandidateTriple);
2223
2224 GCCInstallPath += "/" + Version.Text;
2225 GCCParentLibPath = GCCInstallPath + "/../../../../";
2226
2227 IsValid = true;
2228 }
2229}
2230
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002231void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002232 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002233 const std::string &LibDir, StringRef CandidateTriple,
2234 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002235 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002236 // There are various different suffixes involving the triple we
2237 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002238 // up to the lib directory. Specifically, the number of "up" steps
2239 // in the second half of each row is 1 + the number of path separators
2240 // in the first half.
2241 const std::string LibAndInstallSuffixes[][2] = {
2242 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2243
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002244 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002245 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2246
2247 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2248 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002249
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002250 // The Freescale PPC SDK has the gcc libraries in
2251 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002252 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002253
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002254 // Ubuntu has a strange mis-matched pair of triples that this happens to
2255 // match.
2256 // FIXME: It may be worthwhile to generalize this and look for a second
2257 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002258 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2259
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002260 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2261 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2262 NeedsBiarchSuffix);
2263 return;
2264 }
2265
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002266 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002267 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2268 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002269 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002270 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002271 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002272 for (vfs::directory_iterator
2273 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2274 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002275 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002276 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002277 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002278 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002279 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002280 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002281 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002282 continue;
2283 if (CandidateVersion <= Version)
2284 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002285
Simon Atanasyan60280b42014-05-12 07:37:51 +00002286 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002287
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002288 // Debian mips multilibs behave more like the rest of the biarch ones,
2289 // so handle them there
2290 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002291 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002292 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002293 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002294 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002295 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002296 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002297
Simon Atanasyan60280b42014-05-12 07:37:51 +00002298 Multilibs = Detected.Multilibs;
2299 SelectedMultilib = Detected.SelectedMultilib;
2300 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002301 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002302 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002303 // FIXME: We hack together the directory name here instead of
2304 // using LI to ensure stable path separators across Windows and
2305 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002306 GCCInstallPath =
2307 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2308 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002309 IsValid = true;
2310 }
2311 }
2312}
2313
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002314Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002315 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002316 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002317 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002318 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002319 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002320}
2321
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002322Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002323
Rafael Espindola7cf32212013-03-20 03:05:54 +00002324Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002325 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002326 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002327 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002328 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002329 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002330 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002331 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002332 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002333 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002334 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002335 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002336 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002337}
2338
Rafael Espindola7cf32212013-03-20 03:05:54 +00002339Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002340 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002341}
2342
Douglas Katzman95354292015-06-23 20:42:09 +00002343Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002344
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002345void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2346 // Print the information about how we detected the GCC installation.
2347 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002348 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002349}
2350
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002351bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002352 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002353}
2354
David Majnemer17f448b2015-06-28 04:23:33 +00002355bool Generic_GCC::isPICDefault() const {
2356 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2357}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002358
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002359bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002360
David Majnemer17f448b2015-06-28 04:23:33 +00002361bool Generic_GCC::isPICDefaultForced() const {
2362 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2363}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002364
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002365bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002366 switch (getTriple().getArch()) {
2367 case llvm::Triple::x86:
2368 case llvm::Triple::x86_64:
2369 case llvm::Triple::aarch64:
2370 case llvm::Triple::aarch64_be:
2371 case llvm::Triple::arm:
2372 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002373 case llvm::Triple::bpfel:
2374 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002375 case llvm::Triple::thumb:
2376 case llvm::Triple::thumbeb:
2377 case llvm::Triple::ppc:
2378 case llvm::Triple::ppc64:
2379 case llvm::Triple::ppc64le:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002380 case llvm::Triple::systemz:
2381 return true;
2382 default:
2383 return false;
2384 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002385}
2386
James Y Knighta6c9ee72015-10-16 18:46:26 +00002387/// \brief Helper to add the variant paths of a libstdc++ installation.
2388bool Generic_GCC::addLibStdCXXIncludePaths(
2389 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2390 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2391 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2392 if (!getVFS().exists(Base + Suffix))
2393 return false;
2394
2395 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2396
2397 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2398 // that path exists or we have neither a GCC nor target multiarch triple, use
2399 // this vanilla search path.
2400 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2401 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2402 addSystemInclude(DriverArgs, CC1Args,
2403 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2404 } else {
2405 // Otherwise try to use multiarch naming schemes which have normalized the
2406 // triples and put the triple before the suffix.
2407 //
2408 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2409 // the target triple, so we support that here.
2410 addSystemInclude(DriverArgs, CC1Args,
2411 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2412 addSystemInclude(DriverArgs, CC1Args,
2413 Base + "/" + TargetMultiarchTriple + Suffix);
2414 }
2415
2416 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2417 return true;
2418}
2419
2420
Kristof Beylsfb387292014-01-10 13:44:34 +00002421void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2422 ArgStringList &CC1Args) const {
2423 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002424 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002425 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002426 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002427 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002428 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002429 getTriple().getOS() == llvm::Triple::NaCl ||
2430 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2431 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002432
2433 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002434 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002435 CC1Args.push_back("-fuse-init-array");
2436}
2437
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002438/// Mips Toolchain
2439MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2440 const llvm::Triple &Triple,
2441 const ArgList &Args)
2442 : Linux(D, Triple, Args) {
2443 // Select the correct multilib according to the given arguments.
2444 DetectedMultilibs Result;
2445 findMIPSMultilibs(D, Triple, "", Args, Result);
2446 Multilibs = Result.Multilibs;
2447 SelectedMultilib = Result.SelectedMultilib;
2448
2449 // Find out the library suffix based on the ABI.
2450 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2451 getFilePaths().clear();
2452 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2453
2454 // Use LLD by default.
Peter Collingbourne39719a72015-11-20 20:49:39 +00002455 DefaultLinker = "lld";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002456}
2457
2458void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2459 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2460 if (DriverArgs.hasArg(options::OPT_nostdinc))
2461 return;
2462
2463 const Driver &D = getDriver();
2464
2465 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2466 SmallString<128> P(D.ResourceDir);
2467 llvm::sys::path::append(P, "include");
2468 addSystemInclude(DriverArgs, CC1Args, P);
2469 }
2470
2471 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2472 return;
2473
2474 const auto &Callback = Multilibs.includeDirsCallback();
2475 if (Callback) {
2476 const auto IncludePaths =
2477 Callback(D.getInstalledDir(), getTripleString(), SelectedMultilib);
2478 for (const auto &Path : IncludePaths)
2479 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
2480 }
2481}
2482
2483Tool *MipsLLVMToolChain::buildLinker() const {
2484 return new tools::gnutools::Linker(*this);
2485}
2486
2487std::string MipsLLVMToolChain::computeSysRoot() const {
2488 if (!getDriver().SysRoot.empty())
2489 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2490
2491 const std::string InstalledDir(getDriver().getInstalledDir());
2492 std::string SysRootPath =
2493 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2494 if (llvm::sys::fs::exists(SysRootPath))
2495 return SysRootPath;
2496
2497 return std::string();
2498}
2499
2500ToolChain::CXXStdlibType
2501MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2502 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2503 if (A) {
2504 StringRef Value = A->getValue();
2505 if (Value != "libc++")
2506 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2507 << A->getAsString(Args);
2508 }
2509
2510 return ToolChain::CST_Libcxx;
2511}
2512
2513void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2514 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2515 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2516 DriverArgs.hasArg(options::OPT_nostdincxx))
2517 return;
2518
2519 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2520 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2521
2522 const auto &Callback = Multilibs.includeDirsCallback();
2523 if (Callback) {
2524 const auto IncludePaths = Callback(getDriver().getInstalledDir(),
2525 getTripleString(), SelectedMultilib);
2526 for (const auto &Path : IncludePaths) {
2527 if (llvm::sys::fs::exists(Path + "/c++/v1")) {
2528 addSystemInclude(DriverArgs, CC1Args, Path + "/c++/v1");
2529 break;
2530 }
2531 }
2532 }
2533}
2534
2535void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2536 ArgStringList &CmdArgs) const {
2537 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2538 "Only -lc++ (aka libxx) is suported in this toolchain.");
2539
2540 CmdArgs.push_back("-lc++");
2541 CmdArgs.push_back("-lc++abi");
2542 CmdArgs.push_back("-lunwind");
2543}
2544
2545std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2546 StringRef Component,
2547 bool Shared) const {
2548 SmallString<128> Path(getDriver().ResourceDir);
2549 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2550 getOS());
2551 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002552 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002553 return Path.str();
2554}
2555
Tony Linthicum76329bf2011-12-12 21:14:55 +00002556/// Hexagon Toolchain
2557
Douglas Katzman54366072015-07-27 16:53:08 +00002558std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002559 const ArgList &Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002560 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002561 std::string GccToolchain = getGCCToolchainDir(Args);
2562
2563 if (!GccToolchain.empty())
2564 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002565
2566 std::string InstallRelDir = InstalledDir + "/../../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002567 if (getVFS().exists(InstallRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002568 return InstallRelDir;
2569
2570 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002571 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002572 return PrefixRelDir;
2573
2574 return InstallRelDir;
2575}
2576
Douglas Katzman54366072015-07-27 16:53:08 +00002577const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002578 Arg *A;
2579
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002580 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002581 options::OPT_msmall_data_threshold_EQ);
2582 if (A)
2583 return A->getValue();
2584
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002585 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002586 options::OPT_fPIC);
2587 if (A)
2588 return "0";
2589
Hans Wennborgdcfba332015-10-06 23:40:43 +00002590 return nullptr;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002591}
2592
Douglas Katzman54366072015-07-27 16:53:08 +00002593bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002594 return smallDataThreshold && smallDataThreshold[0] == '0';
2595}
2596
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002597static void GetHexagonLibraryPaths(const HexagonToolChain &TC,
2598 const ArgList &Args, const std::string &Ver,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002599 const std::string &MarchString,
2600 const std::string &InstalledDir,
2601 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002602 bool buildingLib = Args.hasArg(options::OPT_shared);
2603
2604 //----------------------------------------------------------------------------
2605 // -L Args
2606 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002607 for (Arg *A : Args.filtered(options::OPT_L))
2608 for (const char *Value : A->getValues())
2609 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002610
2611 //----------------------------------------------------------------------------
2612 // Other standard paths
2613 //----------------------------------------------------------------------------
2614 const std::string MarchSuffix = "/" + MarchString;
2615 const std::string G0Suffix = "/G0";
2616 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002617 const std::string RootDir = TC.GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002618
2619 // lib/gcc/hexagon/...
2620 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2621 if (buildingLib) {
2622 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2623 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2624 }
2625 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2626 LibPaths->push_back(LibGCCHexagonDir + Ver);
2627
2628 // lib/gcc/...
2629 LibPaths->push_back(RootDir + "lib/gcc");
2630
2631 // hexagon/lib/...
2632 std::string HexagonLibDir = RootDir + "hexagon/lib";
2633 if (buildingLib) {
2634 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2635 LibPaths->push_back(HexagonLibDir + G0Suffix);
2636 }
2637 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2638 LibPaths->push_back(HexagonLibDir);
2639}
2640
Douglas Katzman54366072015-07-27 16:53:08 +00002641HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2642 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002643 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002644 const std::string InstalledDir(getDriver().getInstalledDir());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002645 const std::string GnuDir = GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002646
2647 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2648 // program paths
2649 const std::string BinDir(GnuDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002650 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002651 getProgramPaths().push_back(BinDir);
2652
2653 // Determine version of GCC libraries and headers to use.
2654 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002655 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002656 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002657 for (vfs::directory_iterator di = D.getVFS().dir_begin(HexagonDir, ec), de;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002658 !ec && di != de; di = di.increment(ec)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002659 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->getName()));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002660 if (MaxVersion < cv)
2661 MaxVersion = cv;
2662 }
2663 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002664
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002665 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002666
2667 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2668 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2669 // support 'linux' we'll need to fix this up
2670 LibPaths->clear();
2671
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002672 GetHexagonLibraryPaths(*this, Args, GetGCCLibAndIncVersion(),
2673 GetTargetCPU(Args), InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002674}
2675
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002676HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002677
Douglas Katzman54366072015-07-27 16:53:08 +00002678Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002679 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002680}
2681
Douglas Katzman54366072015-07-27 16:53:08 +00002682Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002683 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002684}
2685
Douglas Katzman54366072015-07-27 16:53:08 +00002686void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2687 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002688 const Driver &D = getDriver();
2689
2690 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2691 DriverArgs.hasArg(options::OPT_nostdlibinc))
2692 return;
2693
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002694 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002695 std::string GnuDir = GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002696 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2697 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2698 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2699 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002700}
2701
Douglas Katzman54366072015-07-27 16:53:08 +00002702void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2703 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002704 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2705 DriverArgs.hasArg(options::OPT_nostdincxx))
2706 return;
2707
2708 const Driver &D = getDriver();
2709 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002710 SmallString<128> IncludeDir(GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002711
Rafael Espindola358256c2013-06-26 02:13:00 +00002712 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2713 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002714 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002715}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002716
Matthew Curtise689b052012-12-06 15:46:07 +00002717ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002718HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002719 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2720 if (!A)
2721 return ToolChain::CST_Libstdcxx;
2722
2723 StringRef Value = A->getValue();
2724 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002725 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002726 }
2727
2728 return ToolChain::CST_Libstdcxx;
2729}
2730
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002731static int getHexagonVersion(const ArgList &Args) {
2732 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2733 // Select the default CPU (v4) if none was given.
2734 if (!A)
2735 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002736
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002737 // FIXME: produce errors if we cannot parse the version.
2738 StringRef WhichHexagon = A->getValue();
2739 if (WhichHexagon.startswith("hexagonv")) {
2740 int Val;
2741 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2742 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002743 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002744 if (WhichHexagon.startswith("v")) {
2745 int Val;
2746 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2747 return Val;
2748 }
2749
2750 // FIXME: should probably be an error.
2751 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002752}
2753
Douglas Katzman54366072015-07-27 16:53:08 +00002754StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002755 int V = getHexagonVersion(Args);
2756 // FIXME: We don't support versions < 4. We should error on them.
2757 switch (V) {
2758 default:
2759 llvm_unreachable("Unexpected version");
2760 case 5:
2761 return "v5";
2762 case 4:
2763 return "v4";
2764 case 3:
2765 return "v3";
2766 case 2:
2767 return "v2";
2768 case 1:
2769 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002770 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002771}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002772// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002773
Tom Stellard8fa33092015-07-18 01:49:05 +00002774/// AMDGPU Toolchain
2775AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2776 const ArgList &Args)
2777 : Generic_ELF(D, Triple, Args) { }
2778
2779Tool *AMDGPUToolChain::buildLinker() const {
2780 return new tools::amdgpu::Linker(*this);
2781}
2782// End AMDGPU
2783
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002784/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002785NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2786 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002787 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002788
2789 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2790 // default paths, and must instead only use the paths provided
2791 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002792 path_list &file_paths = getFilePaths();
2793 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002794
2795 file_paths.clear();
2796 prog_paths.clear();
2797
2798 // Path for library files (libc.a, ...)
2799 std::string FilePath(getDriver().Dir + "/../");
2800
2801 // Path for tools (clang, ld, etc..)
2802 std::string ProgPath(getDriver().Dir + "/../");
2803
2804 // Path for toolchain libraries (libgcc.a, ...)
2805 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2806
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002807 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002808 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002809 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002810 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002811 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2812 file_paths.push_back(ToolPath + "i686-nacl");
2813 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002814 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002815 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2816 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2817 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2818 file_paths.push_back(ToolPath + "x86_64-nacl");
2819 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002820 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002821 file_paths.push_back(FilePath + "arm-nacl/lib");
2822 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2823 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2824 file_paths.push_back(ToolPath + "arm-nacl");
2825 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002826 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002827 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2828 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2829 prog_paths.push_back(ProgPath + "bin");
2830 file_paths.push_back(ToolPath + "mipsel-nacl");
2831 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002832 default:
2833 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002834 }
2835
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002836 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2837}
2838
Douglas Katzman54366072015-07-27 16:53:08 +00002839void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2840 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002841 const Driver &D = getDriver();
2842 if (DriverArgs.hasArg(options::OPT_nostdinc))
2843 return;
2844
2845 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2846 SmallString<128> P(D.ResourceDir);
2847 llvm::sys::path::append(P, "include");
2848 addSystemInclude(DriverArgs, CC1Args, P.str());
2849 }
2850
2851 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2852 return;
2853
2854 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002855 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002856 case llvm::Triple::x86:
2857 // x86 is special because multilib style uses x86_64-nacl/include for libc
2858 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2859 // have the same substring.
2860 llvm::sys::path::append(P, "i686-nacl/usr/include");
2861 addSystemInclude(DriverArgs, CC1Args, P.str());
2862 llvm::sys::path::remove_filename(P);
2863 llvm::sys::path::remove_filename(P);
2864 llvm::sys::path::remove_filename(P);
2865 llvm::sys::path::append(P, "x86_64-nacl/include");
2866 addSystemInclude(DriverArgs, CC1Args, P.str());
2867 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002868 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002869 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002870 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002871 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002872 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002873 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002874 case llvm::Triple::mipsel:
2875 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2876 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002877 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002878 return;
2879 }
2880
2881 addSystemInclude(DriverArgs, CC1Args, P.str());
2882 llvm::sys::path::remove_filename(P);
2883 llvm::sys::path::remove_filename(P);
2884 llvm::sys::path::append(P, "include");
2885 addSystemInclude(DriverArgs, CC1Args, P.str());
2886}
2887
Douglas Katzman54366072015-07-27 16:53:08 +00002888void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2889 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002890 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2891 // if the value is libc++, and emits an error for other values.
2892 GetCXXStdlibType(Args);
2893 CmdArgs.push_back("-lc++");
2894}
2895
Douglas Katzman54366072015-07-27 16:53:08 +00002896void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2897 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002898 const Driver &D = getDriver();
2899 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2900 DriverArgs.hasArg(options::OPT_nostdincxx))
2901 return;
2902
2903 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2904 // if the value is libc++, and emits an error for other values.
2905 GetCXXStdlibType(DriverArgs);
2906
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002907 SmallString<128> P(D.Dir + "/../");
2908 switch (getTriple().getArch()) {
2909 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002910 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2911 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002912 break;
2913 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002914 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2915 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002916 break;
2917 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002918 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2919 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002920 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002921 case llvm::Triple::mipsel:
2922 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2923 addSystemInclude(DriverArgs, CC1Args, P.str());
2924 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002925 default:
2926 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002927 }
2928}
2929
Douglas Katzman54366072015-07-27 16:53:08 +00002930ToolChain::CXXStdlibType
2931NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002932 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2933 StringRef Value = A->getValue();
2934 if (Value == "libc++")
2935 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002936 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002937 }
2938
2939 return ToolChain::CST_Libcxx;
2940}
2941
Douglas Katzman54366072015-07-27 16:53:08 +00002942std::string
2943NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2944 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002945 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2946 if (TheTriple.getArch() == llvm::Triple::arm &&
2947 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2948 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2949 return TheTriple.getTriple();
2950}
2951
Douglas Katzman54366072015-07-27 16:53:08 +00002952Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002953 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002954}
2955
Douglas Katzman54366072015-07-27 16:53:08 +00002956Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002957 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002958 return new tools::nacltools::AssemblerARM(*this);
2959 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002960}
2961// End NaCl
2962
Chris Lattner09797542010-03-04 21:07:38 +00002963/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2964/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2965/// Currently does not support anything else but compilation.
2966
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002967TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002968 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002969 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002970 // Path mangling to find libexec
2971 std::string Path(getDriver().Dir);
2972
2973 Path += "/../libexec";
2974 getProgramPaths().push_back(Path);
2975}
2976
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002977TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002978
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002979bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002980
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002981bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002982
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002983bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002984
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002985bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002986
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002987// CloudABI - CloudABI tool chain which can call ld(1) directly.
2988
2989CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2990 const ArgList &Args)
2991 : Generic_ELF(D, Triple, Args) {
2992 SmallString<128> P(getDriver().Dir);
2993 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2994 getFilePaths().push_back(P.str());
2995}
2996
2997void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2998 ArgStringList &CC1Args) const {
2999 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
3000 DriverArgs.hasArg(options::OPT_nostdincxx))
3001 return;
3002
3003 SmallString<128> P(getDriver().Dir);
3004 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
3005 addSystemInclude(DriverArgs, CC1Args, P.str());
3006}
3007
3008void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
3009 ArgStringList &CmdArgs) const {
3010 CmdArgs.push_back("-lc++");
3011 CmdArgs.push_back("-lc++abi");
3012 CmdArgs.push_back("-lunwind");
3013}
3014
Douglas Katzman95354292015-06-23 20:42:09 +00003015Tool *CloudABI::buildLinker() const {
3016 return new tools::cloudabi::Linker(*this);
3017}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003018
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003019/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3020
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003021OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3022 const ArgList &Args)
3023 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003024 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003025 getFilePaths().push_back("/usr/lib");
3026}
3027
Rafael Espindola7cf32212013-03-20 03:05:54 +00003028Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003029 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003030}
3031
Douglas Katzman95354292015-06-23 20:42:09 +00003032Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003033
Eli Friedman9fa28852012-08-08 23:57:20 +00003034/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3035
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003036Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3037 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003038 getFilePaths().push_back(getDriver().Dir + "/../lib");
3039 getFilePaths().push_back("/usr/lib");
3040}
3041
Rafael Espindola7cf32212013-03-20 03:05:54 +00003042Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003043 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003044}
3045
Douglas Katzman95354292015-06-23 20:42:09 +00003046Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003047
Douglas Katzman95354292015-06-23 20:42:09 +00003048ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00003049 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3050 StringRef Value = A->getValue();
3051 if (Value == "libstdc++")
3052 return ToolChain::CST_Libstdcxx;
3053 if (Value == "libc++")
3054 return ToolChain::CST_Libcxx;
3055
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003056 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00003057 }
3058 return ToolChain::CST_Libcxx;
3059}
3060
Eli Friedman9fa28852012-08-08 23:57:20 +00003061void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3062 ArgStringList &CC1Args) const {
3063 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3064 DriverArgs.hasArg(options::OPT_nostdincxx))
3065 return;
3066
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003067 switch (GetCXXStdlibType(DriverArgs)) {
3068 case ToolChain::CST_Libcxx:
3069 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003070 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003071 break;
3072 case ToolChain::CST_Libstdcxx:
3073 addSystemInclude(DriverArgs, CC1Args,
3074 getDriver().SysRoot + "/usr/include/c++/stdc++");
3075 addSystemInclude(DriverArgs, CC1Args,
3076 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003077
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003078 StringRef Triple = getTriple().str();
3079 if (Triple.startswith("amd64"))
3080 addSystemInclude(DriverArgs, CC1Args,
3081 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003082 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003083 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003084 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3085 "/usr/include/c++/stdc++/" +
3086 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003087 break;
3088 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003089}
3090
3091void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3092 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003093 switch (GetCXXStdlibType(Args)) {
3094 case ToolChain::CST_Libcxx:
3095 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003096 CmdArgs.push_back("-lc++abi");
3097 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003098 break;
3099 case ToolChain::CST_Libstdcxx:
3100 CmdArgs.push_back("-lstdc++");
3101 break;
3102 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003103}
3104
Daniel Dunbare24297c2009-03-30 21:06:03 +00003105/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3106
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003107FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3108 const ArgList &Args)
3109 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003110
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003111 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3112 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003113 if ((Triple.getArch() == llvm::Triple::x86 ||
3114 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003115 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003116 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3117 else
3118 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003119}
3120
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003121ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00003122 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3123 StringRef Value = A->getValue();
3124 if (Value == "libstdc++")
3125 return ToolChain::CST_Libstdcxx;
3126 if (Value == "libc++")
3127 return ToolChain::CST_Libcxx;
3128
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003129 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00003130 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003131 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003132 return ToolChain::CST_Libcxx;
3133 return ToolChain::CST_Libstdcxx;
3134}
3135
3136void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3137 ArgStringList &CC1Args) const {
3138 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3139 DriverArgs.hasArg(options::OPT_nostdincxx))
3140 return;
3141
3142 switch (GetCXXStdlibType(DriverArgs)) {
3143 case ToolChain::CST_Libcxx:
3144 addSystemInclude(DriverArgs, CC1Args,
3145 getDriver().SysRoot + "/usr/include/c++/v1");
3146 break;
3147 case ToolChain::CST_Libstdcxx:
3148 addSystemInclude(DriverArgs, CC1Args,
3149 getDriver().SysRoot + "/usr/include/c++/4.2");
3150 addSystemInclude(DriverArgs, CC1Args,
3151 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3152 break;
3153 }
3154}
3155
Rafael Espindola7cf32212013-03-20 03:05:54 +00003156Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003157 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003158}
3159
Douglas Katzman95354292015-06-23 20:42:09 +00003160Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003161
Tim Northovere931f9f2015-10-30 16:30:41 +00003162bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003163 // FreeBSD uses SjLj exceptions on ARM oabi.
3164 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003165 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003166 case llvm::Triple::GNUEABI:
3167 case llvm::Triple::EABI:
3168 return false;
3169
3170 default:
3171 return (getTriple().getArch() == llvm::Triple::arm ||
3172 getTriple().getArch() == llvm::Triple::thumb);
3173 }
3174}
3175
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003176bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003177
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003178bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003179
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003180SanitizerMask FreeBSD::getSupportedSanitizers() const {
3181 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3182 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3183 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3184 getTriple().getArch() == llvm::Triple::mips64el;
3185 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3186 Res |= SanitizerKind::Address;
3187 Res |= SanitizerKind::Vptr;
3188 if (IsX86_64 || IsMIPS64) {
3189 Res |= SanitizerKind::Leak;
3190 Res |= SanitizerKind::Thread;
3191 }
3192 if (IsX86 || IsX86_64) {
3193 Res |= SanitizerKind::SafeStack;
3194 }
3195 return Res;
3196}
3197
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003198/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3199
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003200NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3201 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003202
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003203 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003204 // When targeting a 32-bit platform, try the special directory used on
3205 // 64-bit hosts, and only fall back to the main library directory if that
3206 // doesn't work.
3207 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3208 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003209 switch (Triple.getArch()) {
3210 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003211 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003212 break;
3213 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003214 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003215 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003216 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003217 switch (Triple.getEnvironment()) {
3218 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003219 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003220 getFilePaths().push_back("=/usr/lib/eabi");
3221 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003222 case llvm::Triple::EABIHF:
3223 case llvm::Triple::GNUEABIHF:
3224 getFilePaths().push_back("=/usr/lib/eabihf");
3225 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003226 default:
3227 getFilePaths().push_back("=/usr/lib/oabi");
3228 break;
3229 }
3230 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003231 case llvm::Triple::mips64:
3232 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003233 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003234 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003235 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003236 getFilePaths().push_back("=/usr/lib/64");
3237 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003238 case llvm::Triple::ppc:
3239 getFilePaths().push_back("=/usr/lib/powerpc");
3240 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003241 case llvm::Triple::sparc:
3242 getFilePaths().push_back("=/usr/lib/sparc");
3243 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003244 default:
3245 break;
3246 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003247
3248 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003249 }
3250}
3251
Rafael Espindola7cf32212013-03-20 03:05:54 +00003252Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003253 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003254}
3255
Douglas Katzman95354292015-06-23 20:42:09 +00003256Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003257
Douglas Katzman95354292015-06-23 20:42:09 +00003258ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003259 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3260 StringRef Value = A->getValue();
3261 if (Value == "libstdc++")
3262 return ToolChain::CST_Libstdcxx;
3263 if (Value == "libc++")
3264 return ToolChain::CST_Libcxx;
3265
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003266 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003267 }
3268
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003269 unsigned Major, Minor, Micro;
3270 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003271 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003272 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003273 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003274 case llvm::Triple::arm:
3275 case llvm::Triple::armeb:
3276 case llvm::Triple::thumb:
3277 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003278 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003279 case llvm::Triple::ppc64:
3280 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003281 case llvm::Triple::x86:
3282 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003283 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003284 default:
3285 break;
3286 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003287 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003288 return ToolChain::CST_Libstdcxx;
3289}
3290
3291void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3292 ArgStringList &CC1Args) const {
3293 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3294 DriverArgs.hasArg(options::OPT_nostdincxx))
3295 return;
3296
3297 switch (GetCXXStdlibType(DriverArgs)) {
3298 case ToolChain::CST_Libcxx:
3299 addSystemInclude(DriverArgs, CC1Args,
3300 getDriver().SysRoot + "/usr/include/c++/");
3301 break;
3302 case ToolChain::CST_Libstdcxx:
3303 addSystemInclude(DriverArgs, CC1Args,
3304 getDriver().SysRoot + "/usr/include/g++");
3305 addSystemInclude(DriverArgs, CC1Args,
3306 getDriver().SysRoot + "/usr/include/g++/backward");
3307 break;
3308 }
3309}
3310
Chris Lattner3e2ee142010-07-07 16:01:42 +00003311/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3312
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003313Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3314 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003315 getFilePaths().push_back(getDriver().Dir + "/../lib");
3316 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003317}
3318
Rafael Espindola7cf32212013-03-20 03:05:54 +00003319Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003320 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003321}
3322
Douglas Katzman95354292015-06-23 20:42:09 +00003323Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003324
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003325static void addPathIfExists(const Driver &D, const Twine &Path,
3326 ToolChain::path_list &Paths) {
3327 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003328 Paths.push_back(Path.str());
3329}
3330
David Chisnallf571cde2012-02-15 13:39:01 +00003331/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3332
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003333Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003334 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003335 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003336
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003337 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003338
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003339 path_list &Paths = getFilePaths();
3340 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003341 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003342
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003343 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003344 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003345 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003346
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003347 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003348
3349 std::string LibPath = "/usr/lib/";
3350 switch (Triple.getArch()) {
3351 case llvm::Triple::x86:
3352 case llvm::Triple::sparc:
3353 break;
3354 case llvm::Triple::x86_64:
3355 LibPath += "amd64/";
3356 break;
3357 case llvm::Triple::sparcv9:
3358 LibPath += "sparcv9/";
3359 break;
3360 default:
3361 llvm_unreachable("Unsupported architecture");
3362 }
3363
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003364 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003365}
3366
Rafael Espindola7cf32212013-03-20 03:05:54 +00003367Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003368 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003369}
3370
Douglas Katzman95354292015-06-23 20:42:09 +00003371Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003372
Rafael Espindolad5117262015-09-09 13:36:00 +00003373void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3374 ArgStringList &CC1Args) const {
3375 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3376 DriverArgs.hasArg(options::OPT_nostdincxx))
3377 return;
3378
3379 // Include the support directory for things like xlocale and fudged system
3380 // headers.
3381 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3382
3383 if (GCCInstallation.isValid()) {
3384 GCCVersion Version = GCCInstallation.getVersion();
3385 addSystemInclude(DriverArgs, CC1Args,
3386 getDriver().SysRoot + "/usr/gcc/" +
3387 Version.MajorStr + "." +
3388 Version.MinorStr +
3389 "/include/c++/" + Version.Text);
3390 addSystemInclude(DriverArgs, CC1Args,
3391 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3392 "." + Version.MinorStr + "/include/c++/" +
3393 Version.Text + "/" +
3394 GCCInstallation.getTriple().str());
3395 }
3396}
3397
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003398/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003399
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003400enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003401 // NB: Releases of a particular Linux distro should be kept together
3402 // in this enum, because some tests are done by integer comparison against
3403 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003404 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003405 DebianLenny,
3406 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003407 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003408 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003409 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003410 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003411 RHEL4,
3412 RHEL5,
3413 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003414 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003415 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003416 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003417 UbuntuHardy,
3418 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003419 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003420 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003421 UbuntuLucid,
3422 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003423 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003424 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003425 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003426 UbuntuQuantal,
3427 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003428 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003429 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003430 UbuntuUtopic,
3431 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003432 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003433 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003434 UnknownDistro
3435};
3436
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003437static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003438 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003439}
3440
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003441static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003442
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003443static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003444 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003445}
3446
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003447static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003448 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003449}
3450
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003451static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003452 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3453 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3454 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003455 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003456 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003457 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003458 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003459 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003460 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3461 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3462 .Case("hardy", UbuntuHardy)
3463 .Case("intrepid", UbuntuIntrepid)
3464 .Case("jaunty", UbuntuJaunty)
3465 .Case("karmic", UbuntuKarmic)
3466 .Case("lucid", UbuntuLucid)
3467 .Case("maverick", UbuntuMaverick)
3468 .Case("natty", UbuntuNatty)
3469 .Case("oneiric", UbuntuOneiric)
3470 .Case("precise", UbuntuPrecise)
3471 .Case("quantal", UbuntuQuantal)
3472 .Case("raring", UbuntuRaring)
3473 .Case("saucy", UbuntuSaucy)
3474 .Case("trusty", UbuntuTrusty)
3475 .Case("utopic", UbuntuUtopic)
3476 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003477 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003478 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003479 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003480 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003481 }
3482
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003483 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3484 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003485 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003486 if (Data.startswith("Fedora release"))
3487 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003488 if (Data.startswith("Red Hat Enterprise Linux") ||
3489 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003490 if (Data.find("release 7") != StringRef::npos)
3491 return RHEL7;
3492 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003493 return RHEL6;
3494 else if (Data.find("release 5") != StringRef::npos)
3495 return RHEL5;
3496 else if (Data.find("release 4") != StringRef::npos)
3497 return RHEL4;
3498 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003499 return UnknownDistro;
3500 }
3501
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003502 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3503 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003504 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003505 if (Data[0] == '5')
3506 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003507 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003508 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003509 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003510 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003511 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003512 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003513 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3514 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003515 return UnknownDistro;
3516 }
3517
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003518 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003519 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003520
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003521 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003522 return Exherbo;
3523
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003524 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003525 return ArchLinux;
3526
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003527 return UnknownDistro;
3528}
3529
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003530/// \brief Get our best guess at the multiarch triple for a target.
3531///
3532/// Debian-based systems are starting to use a multiarch setup where they use
3533/// a target-triple directory in the library and header search paths.
3534/// Unfortunately, this triple does not align with the vanilla target triple,
3535/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003536static std::string getMultiarchTriple(const Driver &D,
3537 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003538 StringRef SysRoot) {
Eric Christopherefef8ef2015-12-07 22:43:05 +00003539 llvm::Triple::EnvironmentType TargetEnvironment =
3540 TargetTriple.getEnvironment();
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003541
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003542 // For most architectures, just use whatever we have rather than trying to be
3543 // clever.
3544 switch (TargetTriple.getArch()) {
3545 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003546 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003547
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003548 // We use the existence of '/lib/<triple>' as a directory to detect some
3549 // common linux triples that don't quite match the Clang triple for both
3550 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3551 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003552 case llvm::Triple::arm:
3553 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003554 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003555 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003556 return "arm-linux-gnueabihf";
3557 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003558 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003559 return "arm-linux-gnueabi";
3560 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003561 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003562 case llvm::Triple::armeb:
3563 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003564 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003565 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003566 return "armeb-linux-gnueabihf";
3567 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003568 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003569 return "armeb-linux-gnueabi";
3570 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003571 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003572 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003573 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003574 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003575 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003576 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003577 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003578 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003579 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003580 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003581 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003582 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003583 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003584 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003585 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003586 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003587 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003588 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003589 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003590 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003591 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003592 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003593 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003594 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003595 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003596 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003597 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003598 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003599 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003600 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003601 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003602 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003603 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003604 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003605 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003606 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003607 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003608 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003609 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003610 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003611 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003612 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003613 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003614 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003615 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003616 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003617 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003618 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003619 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003620 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003621 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003622 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003623 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003624 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003625 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003626 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003627 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003628 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003629 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003630 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003631 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003632 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003633 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003634 return "s390x-linux-gnu";
3635 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003636 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003637 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003638}
3639
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003640static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003641 if (isMipsArch(Triple.getArch())) {
3642 // lib32 directory has a special meaning on MIPS targets.
3643 // It contains N32 ABI binaries. Use this folder if produce
3644 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003645 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003646 return "lib32";
3647 return Triple.isArch32Bit() ? "lib" : "lib64";
3648 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003649
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003650 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003651 // using that variant while targeting other architectures causes problems
3652 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003653 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003654 // them when we know we may need it.
3655 //
3656 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003657 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003658 // GCCInstallationDetector, but that is a more significant refactoring.
3659 if (Triple.getArch() == llvm::Triple::x86 ||
3660 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003661 return "lib32";
3662
Zinovy Nis1db95732014-07-10 15:27:19 +00003663 if (Triple.getArch() == llvm::Triple::x86_64 &&
3664 Triple.getEnvironment() == llvm::Triple::GNUX32)
3665 return "libx32";
3666
Simon Atanasyand4413882012-09-14 11:27:24 +00003667 return Triple.isArch32Bit() ? "lib" : "lib64";
3668}
3669
Rafael Espindola1af7c212012-02-19 01:38:32 +00003670Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003671 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003672 GCCInstallation.init(Triple, Args);
3673 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003674 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003675 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003676 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003677
Rafael Espindola10a63c22013-07-03 14:14:00 +00003678 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003679 // least) put various tools in a triple-prefixed directory off of the parent
3680 // of the GCC installation. We use the GCC triple here to ensure that we end
3681 // up with tools that support the same amount of cross compiling as the
3682 // detected GCC installation. For example, if we find a GCC installation
3683 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3684 // used to target i386.
3685 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003686 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003687 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003688 GCCInstallation.getTriple().str() + "/bin")
3689 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003690
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003691 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003692
Rafael Espindola10a63c22013-07-03 14:14:00 +00003693 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003694 ExtraOpts.push_back("-z");
3695 ExtraOpts.push_back("relro");
3696 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003697
Douglas Gregord9bb1522011-03-06 19:11:49 +00003698 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003699 ExtraOpts.push_back("-X");
3700
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003701 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003702 const bool IsMips = isMipsArch(Arch);
3703
3704 if (IsMips && !SysRoot.empty())
3705 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003706
Chandler Carruth0b842912011-12-09 04:45:18 +00003707 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3708 // and the MIPS ABI require .dynsym to be sorted in different ways.
3709 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3710 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003711 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003712 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003713 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003714 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003715 ExtraOpts.push_back("--hash-style=gnu");
3716
Rafael Espindola10a63c22013-07-03 14:14:00 +00003717 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003718 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3719 ExtraOpts.push_back("--hash-style=both");
3720 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003721
Chris Lattner84e38552011-05-22 05:36:06 +00003722 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003723 ExtraOpts.push_back("--no-add-needed");
3724
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003725 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003726 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003727 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003728 ExtraOpts.push_back("--build-id");
3729
Rafael Espindola10a63c22013-07-03 14:14:00 +00003730 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003731 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003732
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003733 // The selection of paths to try here is designed to match the patterns which
3734 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3735 // This was determined by running GCC in a fake filesystem, creating all
3736 // possible permutations of these directories, and seeing which ones it added
3737 // to the link paths.
3738 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003739
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003740 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003741 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003742
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003743 // Add the multilib suffixed paths where they are available.
3744 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003745 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003746 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003747 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003748
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003749 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003750 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003751 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003752 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003753
3754 // GCC cross compiling toolchains will install target libraries which ship
3755 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3756 // any part of the GCC installation in
3757 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3758 // debatable, but is the reality today. We need to search this tree even
3759 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003760 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003761 // installation that is *not* within the system root to ensure two things:
3762 //
3763 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003764 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003765 // appropriate rpath.
3766 // 2) There must not be libraries installed into
3767 // <prefix>/<triple>/<libdir> unless they should be preferred over
3768 // those within the system root.
3769 //
3770 // Note that this matches the GCC behavior. See the below comment for where
3771 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003772 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3773 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003774 Paths);
3775
Chandler Carruth69a125b2012-04-06 16:32:06 +00003776 // If the GCC installation we found is inside of the sysroot, we want to
3777 // prefer libraries installed in the parent prefix of the GCC installation.
3778 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003779 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003780 // This usually happens when there is an external cross compiler on the
3781 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003782 // the cross. Note that GCC does include some of these directories in some
3783 // configurations but this seems somewhere between questionable and simply
3784 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003785 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003786 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3787 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003788 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003789 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003790
3791 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003792 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003793 // those searched.
3794 // FIXME: It's not clear whether we should use the driver's installed
3795 // directory ('Dir' below) or the ResourceDir.
3796 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003797 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3798 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003799 }
3800
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003801 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3802 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3803 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3804 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003805
Chandler Carruthb427c562013-06-22 11:35:51 +00003806 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003807 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003808 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003809 addPathIfExists(D,
3810 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003811 "/../../" + OSLibDir,
3812 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003813
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003814 // Add the 'other' biarch variant path
3815 Multilib BiarchSibling;
3816 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003817 addPathIfExists(D, GCCInstallation.getInstallPath() +
3818 BiarchSibling.gccSuffix(),
3819 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003820 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003821
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003822 // See comments above on the multilib variant for details of why this is
3823 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003824 const std::string &LibPath = GCCInstallation.getParentLibPath();
3825 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3826 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003827 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3828 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003829 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003830
3831 // See comments above on the multilib variant for details of why this is
3832 // only included from within the sysroot.
3833 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003834 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003835 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003836
3837 // Similar to the logic for GCC above, if we are currently running Clang
3838 // inside of the requested system root, add its parent library path to those
3839 // searched.
3840 // FIXME: It's not clear whether we should use the driver's installed
3841 // directory ('Dir' below) or the ResourceDir.
3842 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003843 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003844
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003845 addPathIfExists(D, SysRoot + "/lib", Paths);
3846 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003847}
3848
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003849bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003850
Douglas Katzman95354292015-06-23 20:42:09 +00003851Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003852
3853Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003854 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003855}
3856
Simon Atanasyana0d89572013-10-05 14:37:55 +00003857std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003858 if (!getDriver().SysRoot.empty())
3859 return getDriver().SysRoot;
3860
3861 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3862 return std::string();
3863
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003864 // Standalone MIPS toolchains use different names for sysroot folder
3865 // and put it into different places. Here we try to check some known
3866 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003867
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003868 const StringRef InstallDir = GCCInstallation.getInstallPath();
3869 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003870 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003871
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003872 std::string Path =
3873 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3874 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003875
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003876 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003877 return Path;
3878
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003879 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003880
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003881 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003882 return Path;
3883
3884 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003885}
3886
Chandler Carrutha796f532011-11-05 20:17:13 +00003887void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3888 ArgStringList &CC1Args) const {
3889 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003890 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003891
3892 if (DriverArgs.hasArg(options::OPT_nostdinc))
3893 return;
3894
3895 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003896 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003897
3898 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003899 SmallString<128> P(D.ResourceDir);
3900 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003901 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003902 }
3903
3904 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3905 return;
3906
3907 // Check for configure-time C include directories.
3908 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3909 if (CIncludeDirs != "") {
3910 SmallVector<StringRef, 5> dirs;
3911 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003912 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003913 StringRef Prefix =
3914 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003915 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003916 }
3917 return;
3918 }
3919
3920 // Lacking those, try to detect the correct set of system includes for the
3921 // target triple.
3922
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003923 // Add include directories specific to the selected multilib set and multilib.
3924 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003925 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003926 if (Callback) {
3927 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3928 GCCInstallation.getTriple().str(),
3929 GCCInstallation.getMultilib());
3930 for (const auto &Path : IncludePaths)
3931 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3932 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003933 }
3934
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003935 // Implement generic Debian multiarch support.
3936 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003938
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003939 // FIXME: These are older forms of multiarch. It's not clear that they're
3940 // in use in any released version of Debian, so we should consider
3941 // removing them.
3942 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003943 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003944 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003945
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003946 // FIXME: These are older forms of multiarch. It's not clear that they're
3947 // in use in any released version of Debian, so we should consider
3948 // removing them.
3949 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3950 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003951 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003952 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003953 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003954 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003955 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003956 "/usr/include/arm-linux-gnueabihf"};
3957 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003958 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003959 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003960 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003961 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003962 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003963 "/usr/include/mips64el-linux-gnu",
3964 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003965 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003966 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003967 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003968 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003969 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003970 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003971 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003972 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003973 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003974 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003975 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3976 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003977 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003978 switch (getTriple().getArch()) {
3979 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003980 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003981 break;
3982 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003983 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003984 break;
3985 case llvm::Triple::aarch64:
3986 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003987 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003988 break;
3989 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003990 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3991 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3992 else
3993 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003994 break;
3995 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003996 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003997 break;
3998 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003999 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004000 break;
4001 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004002 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004003 break;
4004 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00004005 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004006 break;
4007 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004008 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004009 break;
4010 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004011 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004012 break;
4013 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004014 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004015 break;
4016 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004017 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004018 break;
4019 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004020 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004021 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004022 case llvm::Triple::systemz:
4023 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4024 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004025 default:
4026 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004027 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004028 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004029 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004030 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004031 break;
4032 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004033 }
4034
4035 if (getTriple().getOS() == llvm::Triple::RTEMS)
4036 return;
4037
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004038 // Add an include of '/include' directly. This isn't provided by default by
4039 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4040 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004041 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004042
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004043 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004044}
4045
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004046
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004047static std::string DetectLibcxxIncludePath(StringRef base) {
4048 std::error_code EC;
4049 int MaxVersion = 0;
4050 std::string MaxVersionString = "";
4051 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4052 LI = LI.increment(EC)) {
4053 StringRef VersionText = llvm::sys::path::filename(LI->path());
4054 int Version;
4055 if (VersionText[0] == 'v' &&
4056 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4057 if (Version > MaxVersion) {
4058 MaxVersion = Version;
4059 MaxVersionString = VersionText;
4060 }
4061 }
4062 }
4063 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4064}
4065
Chandler Carrutha796f532011-11-05 20:17:13 +00004066void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4067 ArgStringList &CC1Args) const {
4068 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4069 DriverArgs.hasArg(options::OPT_nostdincxx))
4070 return;
4071
Chandler Carruthf4701732011-11-07 09:01:17 +00004072 // Check if libc++ has been enabled and provide its include paths if so.
4073 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004074 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004075 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004076
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004077 // We also check the system as for a long time this is the only place
4078 // Clang looked.
4079 // FIXME: We should really remove this. It doesn't make any sense.
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004080 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004081 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004082 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004083 continue;
4084 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004085 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004086 break;
4087 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004088 return;
4089 }
4090
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004091 // We need a detected GCC installation on Linux to provide libstdc++'s
4092 // headers. We handled the libc++ case above.
4093 if (!GCCInstallation.isValid())
4094 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004095
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004096 // By default, look for the C++ headers in an include directory adjacent to
4097 // the lib directory of the GCC installation. Note that this is expect to be
4098 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4099 StringRef LibDir = GCCInstallation.getParentLibPath();
4100 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004101 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004102 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004103 const std::string GCCMultiarchTriple = getMultiarchTriple(
4104 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004105 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004106 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004107 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004108
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004109 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004110 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004111 "/c++/" + Version.Text, TripleStr,
4112 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004113 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004114 return;
4115
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004116 // Otherwise, fall back on a bunch of options which don't use multiarch
4117 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004118 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004119 // Gentoo is weird and places its headers inside the GCC install,
4120 // so if the first attempt to find the headers fails, try these patterns.
4121 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4122 Version.MinorStr,
4123 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4124 // Android standalone toolchain has C++ headers in yet another place.
4125 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4126 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4127 // without a subdirectory corresponding to the gcc version.
4128 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004129 };
4130
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004131 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004132 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4133 /*GCCMultiarchTriple*/ "",
4134 /*TargetMultiarchTriple*/ "",
4135 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004136 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004137 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004138}
4139
Artem Belevichfa11ab52015-11-17 22:28:46 +00004140void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4141 ArgStringList &CC1Args) const {
4142 if (DriverArgs.hasArg(options::OPT_nocudainc))
4143 return;
4144
Artem Belevich86017332015-11-17 22:28:55 +00004145 if (CudaInstallation.isValid()) {
Artem Belevichfa11ab52015-11-17 22:28:46 +00004146 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
Artem Belevich86017332015-11-17 22:28:55 +00004147 CC1Args.push_back("-include");
4148 CC1Args.push_back("cuda_runtime.h");
4149 }
Artem Belevichfa11ab52015-11-17 22:28:46 +00004150}
4151
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004152bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004153
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004154SanitizerMask Linux::getSupportedSanitizers() const {
4155 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4156 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4157 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4158 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004159 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4160 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004161 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4162 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004163 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4164 Res |= SanitizerKind::Address;
4165 Res |= SanitizerKind::KernelAddress;
4166 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004167 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004168 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004169 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004170 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004171 Res |= SanitizerKind::Leak;
Bill Schmidt4b8841a2015-12-08 22:48:02 +00004172 if (IsX86_64 || IsMIPS64 || IsAArch64 || IsPowerPC64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004173 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004174 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004175 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004176 if (IsX86 || IsX86_64) {
4177 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004178 }
4179 return Res;
4180}
4181
Xinliang David Li170cd102015-10-27 05:15:35 +00004182void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4183 llvm::opt::ArgStringList &CmdArgs) const {
4184 if (!needsProfileRT(Args)) return;
4185
4186 // Add linker option -u__llvm_runtime_variable to cause runtime
4187 // initialization module to be linked in.
4188 if (!Args.hasArg(options::OPT_coverage))
4189 CmdArgs.push_back(Args.MakeArgString(
4190 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4191 ToolChain::addProfileRTLibs(Args, CmdArgs);
4192}
4193
Daniel Dunbarcc912342009-05-02 18:28:39 +00004194/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4195
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004196DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4197 const ArgList &Args)
4198 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004199
4200 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004201 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004202 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004203 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004204
Daniel Dunbar083edf72009-12-21 18:54:17 +00004205 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004206 getFilePaths().push_back("/usr/lib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004207 if (D.getVFS().exists("/usr/lib/gcc47"))
John McCall65b8da02013-04-11 22:55:55 +00004208 getFilePaths().push_back("/usr/lib/gcc47");
4209 else
4210 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004211}
4212
Rafael Espindola7cf32212013-03-20 03:05:54 +00004213Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004214 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004215}
4216
4217Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004218 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004219}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004220
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004221/// Stub for CUDA toolchain. At the moment we don't have assembler or
4222/// linker and need toolchain mainly to propagate device-side options
4223/// to CC1.
4224
4225CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4226 const ArgList &Args)
4227 : Linux(D, Triple, Args) {}
4228
4229void
4230CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4231 llvm::opt::ArgStringList &CC1Args) const {
4232 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4233 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004234
4235 if (DriverArgs.hasArg(options::OPT_nocudalib))
4236 return;
4237
4238 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4239 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4240 if (!LibDeviceFile.empty()) {
4241 CC1Args.push_back("-mlink-cuda-bitcode");
4242 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4243
4244 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4245 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4246 // came with CUDA-7.0.
4247 CC1Args.push_back("-target-feature");
4248 CC1Args.push_back("+ptx42");
4249 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004250}
4251
4252llvm::opt::DerivedArgList *
4253CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4254 const char *BoundArch) const {
4255 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4256 const OptTable &Opts = getDriver().getOpts();
4257
4258 for (Arg *A : Args) {
4259 if (A->getOption().matches(options::OPT_Xarch__)) {
4260 // Skip this argument unless the architecture matches BoundArch
4261 if (A->getValue(0) != StringRef(BoundArch))
4262 continue;
4263
4264 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4265 unsigned Prev = Index;
4266 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4267
4268 // If the argument parsing failed or more than one argument was
4269 // consumed, the -Xarch_ argument's parameter tried to consume
4270 // extra arguments. Emit an error and ignore.
4271 //
4272 // We also want to disallow any options which would alter the
4273 // driver behavior; that isn't going to work in our model. We
4274 // use isDriverOption() as an approximation, although things
4275 // like -O4 are going to slip through.
4276 if (!XarchArg || Index > Prev + 1) {
4277 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4278 << A->getAsString(Args);
4279 continue;
4280 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4281 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4282 << A->getAsString(Args);
4283 continue;
4284 }
4285 XarchArg->setBaseArg(A);
4286 A = XarchArg.release();
4287 DAL->AddSynthesizedArg(A);
4288 }
4289 DAL->append(A);
4290 }
4291
4292 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
4293 return DAL;
4294}
4295
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004296/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004297XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4298 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004299 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004300 // ProgramPaths are found via 'PATH' environment variable.
4301}
4302
Douglas Katzman54366072015-07-27 16:53:08 +00004303Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004304 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004305}
4306
Douglas Katzman54366072015-07-27 16:53:08 +00004307Tool *XCoreToolChain::buildLinker() const {
4308 return new tools::XCore::Linker(*this);
4309}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004310
Douglas Katzman54366072015-07-27 16:53:08 +00004311bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004312
Douglas Katzman54366072015-07-27 16:53:08 +00004313bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004314
Douglas Katzman54366072015-07-27 16:53:08 +00004315bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004316
Douglas Katzman54366072015-07-27 16:53:08 +00004317bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004318
Douglas Katzman54366072015-07-27 16:53:08 +00004319bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004320
Douglas Katzman54366072015-07-27 16:53:08 +00004321void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4322 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004323 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4324 DriverArgs.hasArg(options::OPT_nostdlibinc))
4325 return;
4326 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4327 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004328 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004329 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4330 ArrayRef<StringRef> DirVec(Dirs);
4331 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4332 }
4333}
4334
Douglas Katzman54366072015-07-27 16:53:08 +00004335void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4336 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004337 CC1Args.push_back("-nostdsysteminc");
4338}
4339
Douglas Katzman54366072015-07-27 16:53:08 +00004340void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4341 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004342 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004343 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4344 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004345 return;
4346 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4347 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004348 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004349 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4350 ArrayRef<StringRef> DirVec(Dirs);
4351 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4352 }
4353}
4354
Douglas Katzman54366072015-07-27 16:53:08 +00004355void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4356 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004357 // We don't output any lib args. This is handled by xcc.
4358}
Douglas Katzman84a75642015-06-19 14:55:19 +00004359
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004360MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4361 const ArgList &Args)
4362 : Generic_GCC(D, Triple, Args) {
4363 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4364 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4365 // This won't work to find gcc. Instead we give the installation detector an
4366 // extra triple, which is preferable to further hacks of the logic that at
4367 // present is based solely on getArch(). In particular, it would be wrong to
4368 // choose the myriad installation when targeting a non-myriad sparc install.
4369 switch (Triple.getArch()) {
4370 default:
Eric Christopherefef8ef2015-12-07 22:43:05 +00004371 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
4372 << "myriad";
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004373 case llvm::Triple::sparc:
4374 case llvm::Triple::sparcel:
4375 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004376 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004377 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004378
4379 if (GCCInstallation.isValid()) {
4380 // The contents of LibDir are independent of the version of gcc.
4381 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4382 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4383 if (Triple.getArch() == llvm::Triple::sparcel)
4384 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4385 else
4386 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4387 addPathIfExists(D, LibDir, getFilePaths());
4388
4389 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4390 // These files are tied to a particular version of gcc.
4391 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4392 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4393 // but as this toolchain is for LEON sparc, it can assume FPU.
4394 if (Triple.getArch() == llvm::Triple::sparcel)
4395 llvm::sys::path::append(CompilerSupportDir, "le");
4396 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4397 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004398}
4399
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004400MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004401
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004402void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4403 ArgStringList &CC1Args) const {
4404 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4405 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4406}
4407
Eric Christopherefef8ef2015-12-07 22:43:05 +00004408void MyriadToolChain::AddClangCXXStdlibIncludeArgs(
4409 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
James Y Knighta6c9ee72015-10-16 18:46:26 +00004410 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4411 DriverArgs.hasArg(options::OPT_nostdincxx))
4412 return;
4413
4414 // Only libstdc++, for now.
4415 StringRef LibDir = GCCInstallation.getParentLibPath();
4416 const GCCVersion &Version = GCCInstallation.getVersion();
4417 StringRef TripleStr = GCCInstallation.getTriple().str();
4418 const Multilib &Multilib = GCCInstallation.getMultilib();
4419
Eric Christopherefef8ef2015-12-07 22:43:05 +00004420 addLibStdCXXIncludePaths(
4421 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4422 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
James Y Knighta6c9ee72015-10-16 18:46:26 +00004423}
4424
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004425// MyriadToolChain handles several triples:
4426// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4427Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4428 // The inherited method works fine if not targeting the SHAVE.
4429 if (!isShaveCompilation(getTriple()))
4430 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004431 switch (JA.getKind()) {
Douglas Katzman9dc4c622015-11-20 04:58:12 +00004432 case Action::PreprocessJobClass:
Douglas Katzman84a75642015-06-19 14:55:19 +00004433 case Action::CompileJobClass:
4434 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004435 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004436 return Compiler.get();
4437 case Action::AssembleJobClass:
4438 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004439 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004440 return Assembler.get();
4441 default:
4442 return ToolChain::getTool(JA.getKind());
4443 }
4444}
4445
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004446Tool *MyriadToolChain::buildLinker() const {
4447 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004448}
Dan Gohmanc2853072015-09-03 22:51:53 +00004449
4450bool WebAssembly::IsMathErrnoDefault() const { return false; }
4451
4452bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4453
4454bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4455
4456bool WebAssembly::isPICDefault() const { return false; }
4457
4458bool WebAssembly::isPIEDefault() const { return false; }
4459
4460bool WebAssembly::isPICDefaultForced() const { return false; }
4461
4462bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4463
4464// TODO: Support Objective C stuff.
4465bool WebAssembly::SupportsObjCGC() const { return false; }
4466
4467bool WebAssembly::hasBlocksRuntime() const { return false; }
4468
4469// TODO: Support profiling.
4470bool WebAssembly::SupportsProfiling() const { return false; }
4471
4472void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4473 ArgStringList &CC1Args) const {
4474 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4475 options::OPT_fno_use_init_array, true))
4476 CC1Args.push_back("-fuse-init-array");
4477}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004478
4479PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4480 : Generic_ELF(D, Triple, Args) {
4481 if (Args.hasArg(options::OPT_static))
4482 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4483
4484 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4485 // if it exists; otherwise use the driver's installation path, which
4486 // should be <SDK_DIR>/host_tools/bin.
4487
4488 SmallString<512> PS4SDKDir;
4489 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4490 if (!llvm::sys::fs::exists(EnvValue))
4491 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4492 PS4SDKDir = EnvValue;
4493 } else {
4494 PS4SDKDir = getDriver().Dir;
4495 llvm::sys::path::append(PS4SDKDir, "/../../");
Eric Christopherefef8ef2015-12-07 22:43:05 +00004496 }
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004497
Eric Christopherefef8ef2015-12-07 22:43:05 +00004498 // By default, the driver won't report a warning if it can't find
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004499 // PS4's include or lib directories. This behavior could be changed if
Eric Christopherefef8ef2015-12-07 22:43:05 +00004500 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004501 // If -isysroot was passed, use that as the SDK base path.
4502 std::string PrefixDir;
4503 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4504 PrefixDir = A->getValue();
4505 if (!llvm::sys::fs::exists(PrefixDir))
4506 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4507 } else
4508 PrefixDir = PS4SDKDir.str();
4509
4510 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4511 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4512 if (!Args.hasArg(options::OPT_nostdinc) &&
4513 !Args.hasArg(options::OPT_nostdlibinc) &&
4514 !Args.hasArg(options::OPT_isysroot) &&
4515 !Args.hasArg(options::OPT__sysroot_EQ) &&
4516 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4517 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4518 << "PS4 system headers" << PS4SDKIncludeDir;
4519 }
4520
4521 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4522 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4523 if (!Args.hasArg(options::OPT_nostdlib) &&
4524 !Args.hasArg(options::OPT_nodefaultlibs) &&
4525 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4526 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4527 !Args.hasArg(options::OPT_emit_ast) &&
4528 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4529 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4530 << "PS4 system libraries" << PS4SDKLibDir;
4531 return;
4532 }
4533 getFilePaths().push_back(PS4SDKLibDir.str());
4534}
4535
4536Tool *PS4CPU::buildAssembler() const {
4537 return new tools::PS4cpu::Assemble(*this);
4538}
4539
4540Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4541
4542bool PS4CPU::isPICDefault() const { return true; }
4543
4544bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4545
4546SanitizerMask PS4CPU::getSupportedSanitizers() const {
4547 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4548 Res |= SanitizerKind::Address;
4549 Res |= SanitizerKind::Vptr;
4550 return Res;
4551}