blob: ed223219f65bebe045d17bca88c2b0265ddfd0ef [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
326 // Select the appropriate runtime library for the target.
Vedant Kumar0affb932015-11-10 00:20:34 +0000327 if (isTargetWatchOSBased()) {
328 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_watchos.a",
329 /*AlwaysLink*/ true);
330 } else if (isTargetTvOSBased()) {
331 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_tvos.a",
332 /*AlwaysLink*/ true);
333 } else if (isTargetIOSBased()) {
Justin Bognerc7701242015-05-12 05:44:36 +0000334 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a",
335 /*AlwaysLink*/ true);
Vedant Kumar0affb932015-11-10 00:20:34 +0000336 } else {
337 assert(isTargetMacOS() && "unexpected non MacOS platform");
Justin Bognerc7701242015-05-12 05:44:36 +0000338 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a",
339 /*AlwaysLink*/ true);
Vedant Kumar0affb932015-11-10 00:20:34 +0000340 }
Xinliang David Li69306c02015-10-22 06:15:31 +0000341 return;
Justin Bognerc7701242015-05-12 05:44:36 +0000342}
343
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000344void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
345 ArgStringList &CmdArgs,
346 StringRef Sanitizer) const {
347 if (!Args.hasArg(options::OPT_dynamiclib) &&
348 !Args.hasArg(options::OPT_bundle)) {
349 // Sanitizer runtime libraries requires C++.
350 AddCXXStdlibLibArgs(Args, CmdArgs);
351 }
Tim Northover6f3ff222015-10-30 16:30:27 +0000352 // ASan is not supported on watchOS.
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000353 assert(isTargetMacOS() || isTargetIOSSimulator());
354 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000355 AddLinkRuntimeLib(
356 Args, CmdArgs,
357 (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
358 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
359 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000360
361 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
362 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
363 // all RTTI-related symbols that UBSan uses.
364 CmdArgs.push_back("-lc++abi");
365 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000366}
367
Daniel Dunbar6276f992009-09-18 08:15:13 +0000368void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
369 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000370 // Darwin only supports the compiler-rt based runtime libraries.
371 switch (GetRuntimeLibType(Args)) {
372 case ToolChain::RLT_CompilerRT:
373 break;
374 default:
375 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000376 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000377 return;
378 }
379
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000380 // Darwin doesn't support real static executables, don't link any runtime
381 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000382 if (Args.hasArg(options::OPT_static) ||
383 Args.hasArg(options::OPT_fapple_kext) ||
384 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000385 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000386
387 // Reject -static-libgcc for now, we can deal with this when and if someone
388 // cares. This is useful in situations where someone wants to statically link
389 // something like libstdc++, and needs its runtime support routines.
390 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000391 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000392 return;
393 }
394
Peter Collingbourne32701642013-11-01 18:16:25 +0000395 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000396 if (Sanitize.needsAsanRt())
397 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
398 if (Sanitize.needsUbsanRt())
399 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Kuba Brecka85e01c02015-11-06 15:09:20 +0000400 if (Sanitize.needsTsanRt())
401 AddLinkSanitizerLibArgs(Args, CmdArgs, "tsan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000402
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000403 // Otherwise link libSystem, then the dynamic runtime library, and finally any
404 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000405 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000406
407 // Select the dynamic runtime library and the target specific static library.
Tim Northover6f3ff222015-10-30 16:30:27 +0000408 if (isTargetWatchOSBased()) {
409 // We currently always need a static runtime library for watchOS.
410 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.watchos.a");
411 } else if (isTargetTvOSBased()) {
412 // We currently always need a static runtime library for tvOS.
413 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.tvos.a");
414 } else if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000415 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
416 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000417 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000418 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000419 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000420 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000421
Daniel Dunbard1076382011-04-18 23:48:36 +0000422 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000423 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000424 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000425 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000426 // The dynamic runtime library was merged with libSystem for 10.6 and
427 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000428 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000429 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000430 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000431 CmdArgs.push_back("-lgcc_s.10.5");
432
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000433 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000434 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000435 // omitted from 10.4.dylib.
436 //
437 // Unfortunately, that turned out to not be true, because Darwin system
438 // headers can still use eprintf on i386, and it is not exported from
439 // libSystem. Therefore, we still must provide a runtime library just for
440 // the tiny tiny handful of projects that *might* use that symbol.
441 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000442 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000443 } else {
444 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000445 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
446 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000447 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000448 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000449}
450
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000451void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000452 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000453
Daniel Dunbar455a0492012-08-17 18:43:50 +0000454 // Support allowing the SDKROOT environment variable used by xcrun and other
455 // Xcode tools to define the default sysroot, by making it the default for
456 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000457 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
458 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000459 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000460 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
461 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000462 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000463 // We only use this value as the default if it is an absolute path,
464 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000465 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000466 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000467 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000468 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000469 }
470 }
471 }
472
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000473 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000474 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Tim Northover6f3ff222015-10-30 16:30:27 +0000475 Arg *TvOSVersion = Args.getLastArg(options::OPT_mtvos_version_min_EQ);
476 Arg *WatchOSVersion = Args.getLastArg(options::OPT_mwatchos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000477
Tim Northover6f3ff222015-10-30 16:30:27 +0000478 if (OSXVersion && (iOSVersion || TvOSVersion || WatchOSVersion)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000479 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Tim Northover6f3ff222015-10-30 16:30:27 +0000480 << OSXVersion->getAsString(Args)
481 << (iOSVersion ? iOSVersion :
482 TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
483 iOSVersion = TvOSVersion = WatchOSVersion = nullptr;
484 } else if (iOSVersion && (TvOSVersion || WatchOSVersion)) {
485 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
486 << iOSVersion->getAsString(Args)
487 << (TvOSVersion ? TvOSVersion : WatchOSVersion)->getAsString(Args);
488 TvOSVersion = WatchOSVersion = nullptr;
489 } else if (TvOSVersion && WatchOSVersion) {
490 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
491 << TvOSVersion->getAsString(Args)
492 << WatchOSVersion->getAsString(Args);
493 WatchOSVersion = nullptr;
494 } else if (!OSXVersion && !iOSVersion && !TvOSVersion && !WatchOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000495 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000496 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000497 std::string OSXTarget;
498 std::string iOSTarget;
Tim Northover6f3ff222015-10-30 16:30:27 +0000499 std::string TvOSTarget;
500 std::string WatchOSTarget;
501
Chad Rosier64707fe2011-08-31 20:56:25 +0000502 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
503 OSXTarget = env;
504 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
505 iOSTarget = env;
Tim Northover6f3ff222015-10-30 16:30:27 +0000506 if (char *env = ::getenv("TVOS_DEPLOYMENT_TARGET"))
507 TvOSTarget = env;
508 if (char *env = ::getenv("WATCHOS_DEPLOYMENT_TARGET"))
509 WatchOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000510
Steven Wu7a1372c2015-06-25 01:59:35 +0000511 // If there is no command-line argument to specify the Target version and
512 // no environment variable defined, see if we can set the default based
513 // on -isysroot.
Tim Northover6f3ff222015-10-30 16:30:27 +0000514 if (OSXTarget.empty() && iOSTarget.empty() && WatchOSTarget.empty() &&
Steven Wu7a1372c2015-06-25 01:59:35 +0000515 Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000516 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000517 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000518 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
519 size_t BeginSDK = isysroot.rfind("SDKs/");
520 size_t EndSDK = isysroot.rfind(".sdk");
521 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
522 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
523 // Slice the version number out.
524 // Version number is between the first and the last number.
525 size_t StartVer = SDK.find_first_of("0123456789");
526 size_t EndVer = SDK.find_last_of("0123456789");
527 if (StartVer != StringRef::npos && EndVer > StartVer) {
528 StringRef Version = SDK.slice(StartVer, EndVer + 1);
529 if (SDK.startswith("iPhoneOS") ||
530 SDK.startswith("iPhoneSimulator"))
531 iOSTarget = Version;
532 else if (SDK.startswith("MacOSX"))
533 OSXTarget = Version;
Tim Northover6f3ff222015-10-30 16:30:27 +0000534 else if (SDK.startswith("WatchOS") ||
535 SDK.startswith("WatchSimulator"))
536 WatchOSTarget = Version;
537 else if (SDK.startswith("AppleTVOS") ||
538 SDK.startswith("AppleTVSimulator"))
539 TvOSTarget = Version;
Steven Wu7a1372c2015-06-25 01:59:35 +0000540 }
541 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000542 }
543 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000544
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000545 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000546 // from arch name and compute the version from the triple.
Tim Northover6f3ff222015-10-30 16:30:27 +0000547 if (OSXTarget.empty() && iOSTarget.empty() && TvOSTarget.empty() &&
548 WatchOSTarget.empty()) {
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000549 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000550 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000551 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000552 MachOArchName == "arm64") {
553 getTriple().getiOSVersion(Major, Minor, Micro);
554 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
555 << Micro;
Tim Northover6f3ff222015-10-30 16:30:27 +0000556 } else if (MachOArchName == "armv7k") {
557 getTriple().getWatchOSVersion(Major, Minor, Micro);
558 llvm::raw_string_ostream(WatchOSTarget) << Major << '.' << Minor << '.'
559 << Micro;
Alexey Samsonov905c8022015-06-18 21:46:05 +0000560 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
561 MachOArchName != "armv7em") {
562 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
563 getDriver().Diag(diag::err_drv_invalid_darwin_version)
564 << getTriple().getOSName();
565 }
566 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
567 << Micro;
568 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000569 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000570
Tim Northover6f3ff222015-10-30 16:30:27 +0000571 // Do not allow conflicts with the watchOS target.
572 if (!WatchOSTarget.empty() && (!iOSTarget.empty() || !TvOSTarget.empty())) {
573 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
574 << "WATCHOS_DEPLOYMENT_TARGET"
575 << (!iOSTarget.empty() ? "IPHONEOS_DEPLOYMENT_TARGET" :
576 "TVOS_DEPLOYMENT_TARGET");
577 }
578
579 // Do not allow conflicts with the tvOS target.
580 if (!TvOSTarget.empty() && !iOSTarget.empty()) {
581 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
582 << "TVOS_DEPLOYMENT_TARGET"
583 << "IPHONEOS_DEPLOYMENT_TARGET";
584 }
585
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000586 // Allow conflicts among OSX and iOS for historical reasons, but choose the
587 // default platform.
Tim Northover6f3ff222015-10-30 16:30:27 +0000588 if (!OSXTarget.empty() && (!iOSTarget.empty() ||
589 !WatchOSTarget.empty() ||
590 !TvOSTarget.empty())) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000591 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000592 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000593 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000594 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000595 else
Tim Northover6f3ff222015-10-30 16:30:27 +0000596 iOSTarget = WatchOSTarget = TvOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000597 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000598
Chad Rosier64707fe2011-08-31 20:56:25 +0000599 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000600 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000601 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000602 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000603 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000604 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000605 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000606 Args.append(iOSVersion);
Tim Northover6f3ff222015-10-30 16:30:27 +0000607 } else if (!TvOSTarget.empty()) {
608 const Option O = Opts.getOption(options::OPT_mtvos_version_min_EQ);
609 TvOSVersion = Args.MakeJoinedArg(nullptr, O, TvOSTarget);
610 Args.append(TvOSVersion);
611 } else if (!WatchOSTarget.empty()) {
612 const Option O = Opts.getOption(options::OPT_mwatchos_version_min_EQ);
613 WatchOSVersion = Args.MakeJoinedArg(nullptr, O, WatchOSTarget);
614 Args.append(WatchOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000615 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000616 }
Mike Stump11289f42009-09-09 15:08:12 +0000617
Tim Northover9c7e0352013-12-12 11:55:52 +0000618 DarwinPlatformKind Platform;
619 if (OSXVersion)
620 Platform = MacOS;
621 else if (iOSVersion)
622 Platform = IPhoneOS;
Tim Northover6f3ff222015-10-30 16:30:27 +0000623 else if (TvOSVersion)
624 Platform = TvOS;
625 else if (WatchOSVersion)
626 Platform = WatchOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000627 else
Tim Northover157d9112014-01-16 08:48:16 +0000628 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000629
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000630 // Set the tool chain target information.
631 unsigned Major, Minor, Micro;
632 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000633 if (Platform == MacOS) {
Tim Northover6f3ff222015-10-30 16:30:27 +0000634 assert((!iOSVersion && !TvOSVersion && !WatchOSVersion) &&
635 "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000636 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
637 HadExtra) ||
638 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000639 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000640 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000641 } else if (Platform == IPhoneOS) {
642 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000643 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
644 HadExtra) ||
645 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000646 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000647 << iOSVersion->getAsString(Args);
Tim Northover6f3ff222015-10-30 16:30:27 +0000648 } else if (Platform == TvOS) {
649 if (!Driver::GetReleaseVersion(TvOSVersion->getValue(), Major, Minor,
650 Micro, HadExtra) || HadExtra ||
651 Major >= 10 || Minor >= 100 || Micro >= 100)
652 getDriver().Diag(diag::err_drv_invalid_version_number)
653 << TvOSVersion->getAsString(Args);
654 } else if (Platform == WatchOS) {
655 if (!Driver::GetReleaseVersion(WatchOSVersion->getValue(), Major, Minor,
656 Micro, HadExtra) || HadExtra ||
657 Major >= 10 || Minor >= 100 || Micro >= 100)
658 getDriver().Diag(diag::err_drv_invalid_version_number)
659 << WatchOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000660 } else
661 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000662
Bob Wilson7f294b52014-10-10 23:10:10 +0000663 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000664 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
665 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000666 Platform = IPhoneOSSimulator;
Tim Northover6f3ff222015-10-30 16:30:27 +0000667 if (TvOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
668 getTriple().getArch() == llvm::Triple::x86_64))
669 Platform = TvOSSimulator;
670 if (WatchOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
671 getTriple().getArch() == llvm::Triple::x86_64))
672 Platform = WatchOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000673
Tim Northover9c7e0352013-12-12 11:55:52 +0000674 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000675}
676
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000677void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000678 ArgStringList &CmdArgs) const {
679 CXXStdlibType Type = GetCXXStdlibType(Args);
680
681 switch (Type) {
682 case ToolChain::CST_Libcxx:
683 CmdArgs.push_back("-lc++");
684 break;
685
Hans Wennborgdcfba332015-10-06 23:40:43 +0000686 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000687 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
688 // it was previously found in the gcc lib dir. However, for all the Darwin
689 // platforms we care about it was -lstdc++.6, so we search for that
690 // explicitly if we can't see an obvious -lstdc++ candidate.
691
692 // Check in the sysroot first.
693 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000694 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000695 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000696
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000697 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000698 llvm::sys::path::remove_filename(P);
699 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000700 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000701 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000702 return;
703 }
704 }
705 }
706
707 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000708 // FIXME: This should be removed someday when we don't have to care about
709 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000710 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
711 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000712 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
713 return;
714 }
715
716 // Otherwise, let the linker search.
717 CmdArgs.push_back("-lstdc++");
718 break;
719 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000720}
721
Shantonu Senafeb03b2010-09-17 18:39:08 +0000722void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
723 ArgStringList &CmdArgs) const {
724
725 // For Darwin platforms, use the compiler-rt-based support library
726 // instead of the gcc-provided one (which is also incidentally
727 // only present in the gcc lib dir, which makes it hard to find).
728
Rafael Espindola358256c2013-06-26 02:13:00 +0000729 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000730 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000731
732 // Use the newer cc_kext for iOS ARM after 6.0.
Tim Northover6f3ff222015-10-30 16:30:27 +0000733 if (isTargetWatchOS()) {
734 llvm::sys::path::append(P, "libclang_rt.cc_kext_watchos.a");
735 } else if (isTargetTvOS()) {
736 llvm::sys::path::append(P, "libclang_rt.cc_kext_tvos.a");
737 } else if (isTargetIPhoneOS()) {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000738 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000739 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000740 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000741 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000742
Shantonu Senafeb03b2010-09-17 18:39:08 +0000743 // For now, allow missing resource libraries to support developers who may
744 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000745 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000746 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000747}
748
Tim Northover157d9112014-01-16 08:48:16 +0000749DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
750 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000751 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
752 const OptTable &Opts = getDriver().getOpts();
753
754 // FIXME: We really want to get out of the tool chain level argument
755 // translation business, as it makes the driver functionality much
756 // more opaque. For now, we follow gcc closely solely for the
757 // purpose of easily achieving feature parity & testability. Once we
758 // have something that works, we should reevaluate each translation
759 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000760
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000761 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000762 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000763 // Skip this argument unless the architecture matches either the toolchain
764 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000765 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000766 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
767 if (!(XarchArch == getArch() ||
768 (BoundArch &&
769 XarchArch ==
770 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000771 continue;
772
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000773 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000774 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000775 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000776 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000777
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000778 // If the argument parsing failed or more than one argument was
779 // consumed, the -Xarch_ argument's parameter tried to consume
780 // extra arguments. Emit an error and ignore.
781 //
782 // We also want to disallow any options which would alter the
783 // driver behavior; that isn't going to work in our model. We
784 // use isDriverOption() as an approximation, although things
785 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000786 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000787 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000788 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000789 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000790 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000791 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000792 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000793 continue;
794 }
795
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000796 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000797
Nico Webera04d5f82014-05-11 17:27:13 +0000798 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000799 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000800
801 // Linker input arguments require custom handling. The problem is that we
802 // have already constructed the phase actions, so we can not treat them as
803 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000804 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000805 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000806 for (const char *Value : A->getValues()) {
807 DAL->AddSeparateArg(
808 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000809 }
810 continue;
811 }
Mike Stump11289f42009-09-09 15:08:12 +0000812 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000813
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000814 // Sob. These is strictly gcc compatible for the time being. Apple
815 // gcc translates options twice, which means that self-expanding
816 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000817 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000818 default:
819 DAL->append(A);
820 break;
821
822 case options::OPT_mkernel:
823 case options::OPT_fapple_kext:
824 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000825 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000826 break;
Mike Stump11289f42009-09-09 15:08:12 +0000827
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000828 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000829 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000830 break;
831
832 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000833 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000834 DAL->AddFlagArg(
835 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000836 break;
837
838 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000839 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000840 DAL->AddFlagArg(
841 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000842 break;
843
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000844 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000845 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000846 break;
847
848 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000849 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000850 break;
851
852 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000853 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000854 break;
855
856 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000857 DAL->AddFlagArg(A,
858 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000859 break;
860
861 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000862 DAL->AddFlagArg(
863 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000864 break;
865
866 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000867 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000868 break;
869
870 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000871 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000872 break;
873 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000874 }
875
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000876 if (getTriple().getArch() == llvm::Triple::x86 ||
877 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000878 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000879 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
880 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000881
882 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000883 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000884 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000885 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000886 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
887 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000888
889 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
890 // which defines the list of which architectures we accept.
891 if (Name == "ppc")
892 ;
893 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000894 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000895 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000896 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000897 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000898 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000899 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000900 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000901 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000902 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000903 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000904 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000905 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000906 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000907 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000908 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000909
Bill Schmidt778d3872013-07-26 01:36:11 +0000910 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000911 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000912
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000913 else if (Name == "i386")
914 ;
915 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000916 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000917 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000918 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000919 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000920 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000921 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000922 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000923 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000924 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000925 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000926 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000927 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000928 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000929
930 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000931 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000932 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000933 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
934 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000935 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000936
937 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000938 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000939 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000940 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000941 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000942 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000943 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000944 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000945 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000946 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000947 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000948 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000949 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000950 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000951 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +0000952 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000953 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +0000954 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +0000955 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000956 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000957 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +0000958 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000959 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000960
Tim Northover157d9112014-01-16 08:48:16 +0000961 return DAL;
962}
963
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000964void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
965 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000966 // Embedded targets are simple at the moment, not supporting sanitizers and
967 // with different libraries for each member of the product { static, PIC } x
968 // { hard-float, soft-float }
969 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000970 CompilerRT +=
971 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
972 ? "hard"
973 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +0000974 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
975
976 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
977}
978
Tim Northover157d9112014-01-16 08:48:16 +0000979DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
980 const char *BoundArch) const {
981 // First get the generic Apple args, before moving onto Darwin-specific ones.
982 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
983 const OptTable &Opts = getDriver().getOpts();
984
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000985 // If no architecture is bound, none of the translations here are relevant.
986 if (!BoundArch)
987 return DAL;
988
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000989 // Add an explicit version min argument for the deployment target. We do this
990 // after argument translation because -Xarch_ arguments may add a version min
991 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000992 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000993
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000994 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
995 // FIXME: It would be far better to avoid inserting those -static arguments,
996 // but we can't check the deployment target in the translation code until
997 // it is set here.
Tim Northover6f3ff222015-10-30 16:30:27 +0000998 if (isTargetWatchOSBased() ||
999 (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0))) {
1000 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie; ) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00001001 Arg *A = *it;
1002 ++it;
1003 if (A->getOption().getID() != options::OPT_mkernel &&
1004 A->getOption().getID() != options::OPT_fapple_kext)
1005 continue;
1006 assert(it != ie && "unexpected argument translation");
1007 A = *it;
1008 assert(A->getOption().getID() == options::OPT_static &&
1009 "missing expected -static argument");
1010 it = DAL->getArgs().erase(it);
1011 }
1012 }
1013
Bob Wilson0f7445b2013-11-02 23:19:53 +00001014 // Default to use libc++ on OS X 10.9+ and iOS 7+.
1015 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
Tim Northover6f3ff222015-10-30 16:30:27 +00001016 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0)) ||
1017 isTargetWatchOSBased()) &&
Bob Wilson0f7445b2013-11-02 23:19:53 +00001018 !Args.getLastArg(options::OPT_stdlib_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +00001019 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
1020 "libc++");
Bob Wilson0f7445b2013-11-02 23:19:53 +00001021
Bob Wilson102be442011-10-07 17:54:41 +00001022 // Validate the C++ standard library choice.
1023 CXXStdlibType Type = GetCXXStdlibType(*DAL);
1024 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +00001025 // Check whether the target provides libc++.
1026 StringRef where;
1027
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001028 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +00001029 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +00001030 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +00001031
1032 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001033 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +00001034 }
1035 }
1036
Daniel Dunbaraabb0b12009-03-25 06:12:34 +00001037 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +00001038}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001039
Tim Northover157d9112014-01-16 08:48:16 +00001040bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +00001041 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001042}
1043
Tim Northover157d9112014-01-16 08:48:16 +00001044bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00001045 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
1046 return S[0] != '\0';
1047 return false;
1048}
1049
Tim Northovere931f9f2015-10-30 16:30:41 +00001050bool Darwin::UseSjLjExceptions(const ArgList &Args) const {
Daniel Dunbar3241d402010-02-10 18:49:11 +00001051 // Darwin uses SjLj exceptions on ARM.
Tim Northovere931f9f2015-10-30 16:30:41 +00001052 if (getTriple().getArch() != llvm::Triple::arm &&
1053 getTriple().getArch() != llvm::Triple::thumb)
1054 return false;
1055
Tim Northoverc741b042015-11-17 18:27:27 +00001056 // Only watchOS uses the new DWARF/Compact unwinding method.
1057 return !isTargetWatchOS();
Daniel Dunbar3241d402010-02-10 18:49:11 +00001058}
1059
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001060bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001061
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001062bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00001063
Tim Northover157d9112014-01-16 08:48:16 +00001064bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001065 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +00001066 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +00001067}
1068
Tim Northover157d9112014-01-16 08:48:16 +00001069bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001070 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00001071 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +00001072}
1073
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001074void Darwin::addMinVersionArgs(const ArgList &Args,
1075 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001076 VersionTuple TargetVersion = getTargetVersion();
1077
Tim Northover6f3ff222015-10-30 16:30:27 +00001078 if (isTargetWatchOS())
1079 CmdArgs.push_back("-watchos_version_min");
1080 else if (isTargetWatchOSSimulator())
1081 CmdArgs.push_back("-watchos_simulator_version_min");
1082 else if (isTargetTvOS())
1083 CmdArgs.push_back("-tvos_version_min");
1084 else if (isTargetTvOSSimulator())
1085 CmdArgs.push_back("-tvos_simulator_version_min");
1086 else if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +00001087 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +00001088 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +00001089 CmdArgs.push_back("-iphoneos_version_min");
1090 else {
1091 assert(isTargetMacOS() && "unexpected target");
1092 CmdArgs.push_back("-macosx_version_min");
1093 }
1094
1095 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
1096}
1097
Douglas Katzmanf08fadf2015-06-04 14:40:44 +00001098void Darwin::addStartObjectFileArgs(const ArgList &Args,
1099 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +00001100 // Derived from startfile spec.
1101 if (Args.hasArg(options::OPT_dynamiclib)) {
1102 // Derived from darwin_dylib1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001103 if (isTargetWatchOSBased()) {
1104 ; // watchOS does not need dylib1.o.
1105 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001106 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001107 } else if (isTargetIPhoneOS()) {
1108 if (isIPhoneOSVersionLT(3, 1))
1109 CmdArgs.push_back("-ldylib1.o");
1110 } else {
1111 if (isMacosxVersionLT(10, 5))
1112 CmdArgs.push_back("-ldylib1.o");
1113 else if (isMacosxVersionLT(10, 6))
1114 CmdArgs.push_back("-ldylib1.10.5.o");
1115 }
1116 } else {
1117 if (Args.hasArg(options::OPT_bundle)) {
1118 if (!Args.hasArg(options::OPT_static)) {
1119 // Derived from darwin_bundle1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001120 if (isTargetWatchOSBased()) {
1121 ; // watchOS does not need bundle1.o.
1122 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001123 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001124 } else if (isTargetIPhoneOS()) {
1125 if (isIPhoneOSVersionLT(3, 1))
1126 CmdArgs.push_back("-lbundle1.o");
1127 } else {
1128 if (isMacosxVersionLT(10, 6))
1129 CmdArgs.push_back("-lbundle1.o");
1130 }
1131 }
1132 } else {
1133 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1134 if (Args.hasArg(options::OPT_static) ||
1135 Args.hasArg(options::OPT_object) ||
1136 Args.hasArg(options::OPT_preload)) {
1137 CmdArgs.push_back("-lgcrt0.o");
1138 } else {
1139 CmdArgs.push_back("-lgcrt1.o");
1140
1141 // darwin_crt2 spec is empty.
1142 }
1143 // By default on OS X 10.8 and later, we don't link with a crt1.o
1144 // file and the linker knows to use _main as the entry point. But,
1145 // when compiling with -pg, we need to link with the gcrt1.o file,
1146 // so pass the -no_new_main option to tell the linker to use the
1147 // "start" symbol as the entry point.
1148 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1149 CmdArgs.push_back("-no_new_main");
1150 } else {
1151 if (Args.hasArg(options::OPT_static) ||
1152 Args.hasArg(options::OPT_object) ||
1153 Args.hasArg(options::OPT_preload)) {
1154 CmdArgs.push_back("-lcrt0.o");
1155 } else {
1156 // Derived from darwin_crt1 spec.
Tim Northover6f3ff222015-10-30 16:30:27 +00001157 if (isTargetWatchOSBased()) {
1158 ; // watchOS does not need crt1.o.
1159 } else if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001160 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001161 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001162 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001163 ; // iOS does not need any crt1 files for arm64
1164 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001165 CmdArgs.push_back("-lcrt1.o");
1166 else if (isIPhoneOSVersionLT(6, 0))
1167 CmdArgs.push_back("-lcrt1.3.1.o");
1168 } else {
1169 if (isMacosxVersionLT(10, 5))
1170 CmdArgs.push_back("-lcrt1.o");
1171 else if (isMacosxVersionLT(10, 6))
1172 CmdArgs.push_back("-lcrt1.10.5.o");
1173 else if (isMacosxVersionLT(10, 8))
1174 CmdArgs.push_back("-lcrt1.10.6.o");
1175
1176 // darwin_crt2 spec is empty.
1177 }
1178 }
1179 }
1180 }
1181 }
1182
1183 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
Tim Northover6f3ff222015-10-30 16:30:27 +00001184 !isTargetWatchOS() &&
Tim Northover157d9112014-01-16 08:48:16 +00001185 isMacosxVersionLT(10, 5)) {
1186 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1187 CmdArgs.push_back(Str);
1188 }
1189}
1190
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001191bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001192
John McCall3deb1ad2012-08-21 02:47:43 +00001193void Darwin::CheckObjCARC() const {
Tim Northover6f3ff222015-10-30 16:30:27 +00001194 if (isTargetIOSBased() || isTargetWatchOSBased() ||
1195 (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001196 return;
John McCall93207072012-08-27 01:56:21 +00001197 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001198}
1199
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001200SanitizerMask Darwin::getSupportedSanitizers() const {
1201 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001202 if (isTargetMacOS() || isTargetIOSSimulator())
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001203 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001204 if (isTargetMacOS()) {
1205 if (!isMacosxVersionLT(10, 9))
1206 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001207 Res |= SanitizerKind::SafeStack;
Kuba Brecka85e01c02015-11-06 15:09:20 +00001208 Res |= SanitizerKind::Thread;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001209 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001210 return Res;
1211}
1212
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001213/// Generic_GCC - A tool chain using the 'gcc' command to perform
1214/// all subcommands; this relies on gcc translating the majority of
1215/// command line options.
1216
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001217/// \brief Parse a GCCVersion object out of a string of text.
1218///
1219/// This is the primary means of forming GCCVersion objects.
1220/*static*/
1221Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001222 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001223 std::pair<StringRef, StringRef> First = VersionText.split('.');
1224 std::pair<StringRef, StringRef> Second = First.second.split('.');
1225
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001226 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1227 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001228 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001229 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001230 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001231 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001232 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001233
1234 // First look for a number prefix and parse that if present. Otherwise just
1235 // stash the entire patch string in the suffix, and leave the number
1236 // unspecified. This covers versions strings such as:
1237 // 4.4
1238 // 4.4.0
1239 // 4.4.x
1240 // 4.4.2-rc4
1241 // 4.4.x-patched
1242 // And retains any patch number it finds.
1243 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1244 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001245 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001246 // Try to parse the number and any suffix.
1247 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1248 GoodVersion.Patch < 0)
1249 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001250 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001251 }
1252 }
1253
1254 return GoodVersion;
1255}
1256
1257/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001258bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1259 int RHSPatch,
1260 StringRef RHSPatchSuffix) const {
1261 if (Major != RHSMajor)
1262 return Major < RHSMajor;
1263 if (Minor != RHSMinor)
1264 return Minor < RHSMinor;
1265 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001266 // Note that versions without a specified patch sort higher than those with
1267 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001268 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001269 return true;
1270 if (Patch == -1)
1271 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001272
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001273 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001274 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001275 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001276 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001277 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001278 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001279 return true;
1280 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001281 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001282
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001283 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001284 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001285 }
1286
1287 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001288 return false;
1289}
1290
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001291static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001292 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1293 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001294 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001295 return GCC_INSTALL_PREFIX;
1296}
1297
Roman Divacky326d9982013-12-06 18:32:18 +00001298/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001299///
1300/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001301/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001302///
1303/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1304/// should instead pull the target out of the driver. This is currently
1305/// necessary because the driver doesn't store the final version of the target
1306/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001307void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001308 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001309 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001310 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1311 ? TargetTriple.get64BitArchVariant()
1312 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001313 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001314 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001315 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001316 SmallVector<StringRef, 16> CandidateTripleAliases;
1317 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001318 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1319 CandidateTripleAliases, CandidateBiarchLibDirs,
1320 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001321
1322 // Compute the set of prefixes for our search.
1323 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1324 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001325
Rafael Espindola1af7c212012-02-19 01:38:32 +00001326 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1327 if (GCCToolchainDir != "") {
1328 if (GCCToolchainDir.back() == '/')
1329 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001330
Rafael Espindola1af7c212012-02-19 01:38:32 +00001331 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001332 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001333 // If we have a SysRoot, try that first.
1334 if (!D.SysRoot.empty()) {
1335 Prefixes.push_back(D.SysRoot);
1336 Prefixes.push_back(D.SysRoot + "/usr");
1337 }
1338
1339 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001340 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001341
1342 // And finally in /usr.
1343 if (D.SysRoot.empty())
1344 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001345 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001346
1347 // Loop over the various components which exist and select the best GCC
1348 // installation available. GCC installs are ranked by version number.
1349 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001350 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001351 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001352 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001353 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001354 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001355 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001356 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001357 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001358 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001359 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001360 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001361 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001362 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001363 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001364 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001365 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001366 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001367 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001368 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001369 }
1370 }
1371}
1372
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001373void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001374 for (const auto &InstallPath : CandidateGCCInstallPaths)
1375 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001376
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001377 if (!GCCInstallPath.empty())
1378 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1379
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001380 for (const auto &Multilib : Multilibs)
1381 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001382
1383 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1384 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001385}
1386
1387bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1388 if (BiarchSibling.hasValue()) {
1389 M = BiarchSibling.getValue();
1390 return true;
1391 }
1392 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001393}
1394
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001395/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001396 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001397 SmallVectorImpl<StringRef> &LibDirs,
1398 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001399 SmallVectorImpl<StringRef> &BiarchLibDirs,
1400 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001401 // Declare a bunch of static data sets that we'll select between below. These
1402 // are specifically designed to always refer to string literals to avoid any
1403 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001404 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1405 static const char *const AArch64Triples[] = {
1406 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1407 "aarch64-redhat-linux"};
1408 static const char *const AArch64beLibDirs[] = {"/lib"};
1409 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1410 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001411
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001412 static const char *const ARMLibDirs[] = {"/lib"};
1413 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1414 "arm-linux-androideabi"};
1415 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1416 "armv7hl-redhat-linux-gnueabi"};
1417 static const char *const ARMebLibDirs[] = {"/lib"};
1418 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1419 "armeb-linux-androideabi"};
1420 static const char *const ARMebHFTriples[] = {
1421 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001422
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001423 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001424 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001425 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1426 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1427 "x86_64-redhat-linux", "x86_64-suse-linux",
1428 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1429 "x86_64-slackware-linux", "x86_64-linux-android",
1430 "x86_64-unknown-linux"};
1431 static const char *const X32LibDirs[] = {"/libx32"};
1432 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001433 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001434 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1435 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1436 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1437 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1438 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001439
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001440 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001441 static const char *const MIPSTriples[] = {"mips-linux-gnu", "mips-mti-linux",
1442 "mips-mti-linux-gnu",
1443 "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001444 static const char *const MIPSELLibDirs[] = {"/lib"};
1445 static const char *const MIPSELTriples[] = {
1446 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001447
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001448 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1449 static const char *const MIPS64Triples[] = {
1450 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1451 "mips64-linux-gnuabi64"};
1452 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1453 static const char *const MIPS64ELTriples[] = {
1454 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1455 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001456
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001457 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001458 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001459 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1460 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1461 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1462 static const char *const PPC64Triples[] = {
1463 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1464 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1465 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1466 static const char *const PPC64LETriples[] = {
1467 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1468 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001469
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001470 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1471 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1472 "sparcv8-linux-gnu"};
1473 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1474 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1475 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001476
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001477 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001478 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001479 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1480 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001481
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001482 // Solaris.
1483 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1484 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1485 "i386-pc-solaris2.11"};
1486
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001487 using std::begin;
1488 using std::end;
1489
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001490 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1491 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1492 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001493 return;
1494 }
1495
Chandler Carruth866faab2012-01-25 07:21:38 +00001496 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001497 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001498 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1499 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1500 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1501 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001502 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001503 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001504 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1505 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1506 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1507 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001508 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001509 case llvm::Triple::arm:
1510 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001511 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001512 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001513 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001514 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001515 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001516 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001517 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001518 case llvm::Triple::armeb:
1519 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001520 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001521 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001522 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001523 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001524 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001525 }
1526 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001527 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001528 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1529 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1530 // x32 is always available when x86_64 is available, so adding it as
1531 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001532 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001533 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1534 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001535 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001536 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1537 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001538 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001539 break;
1540 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001541 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1542 TripleAliases.append(begin(X86Triples), end(X86Triples));
1543 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1544 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001545 break;
1546 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001547 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1548 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1549 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1550 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001551 break;
1552 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001553 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1554 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1555 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1556 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1557 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001558 break;
1559 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001560 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1561 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1562 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1563 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001564 break;
1565 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001566 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1567 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1568 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1569 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1570 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001571 break;
1572 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001573 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1574 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1575 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1576 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001577 break;
1578 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001579 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1580 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1581 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1582 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001583 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001584 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001585 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1586 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001587 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001588 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001589 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001590 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1591 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1592 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1593 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001594 break;
1595 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001596 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1597 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1598 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1599 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001600 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001601 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001602 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1603 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001604 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001605 default:
1606 // By default, just rely on the standard lib directories and the original
1607 // triple.
1608 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001609 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001610
1611 // Always append the drivers target triple to the end, in case it doesn't
1612 // match any of our aliases.
1613 TripleAliases.push_back(TargetTriple.str());
1614
1615 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001616 if (TargetTriple.str() != BiarchTriple.str())
1617 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001618}
1619
Artem Belevich98607b62015-09-23 21:49:39 +00001620// \brief -- try common CUDA installation paths looking for files we need for
1621// CUDA compilation.
1622
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001623void Generic_GCC::CudaInstallationDetector::init(
1624 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001625 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001626
1627 if (Args.hasArg(options::OPT_cuda_path_EQ))
1628 CudaPathCandidates.push_back(
1629 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1630 else {
1631 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
1632 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1633 }
1634
Benjamin Kramere8b76412015-09-24 14:48:37 +00001635 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001636 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001637 continue;
1638
1639 CudaInstallPath = CudaPath;
1640 CudaIncludePath = CudaInstallPath + "/include";
1641 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1642 CudaLibPath =
1643 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1644
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001645 if (!(D.getVFS().exists(CudaIncludePath) &&
1646 D.getVFS().exists(CudaLibPath) &&
1647 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001648 continue;
1649
1650 IsValid = true;
1651 break;
1652 }
1653}
1654
1655void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1656 if (isValid())
1657 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1658}
1659
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001660namespace {
1661// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001662class FilterNonExistent {
1663 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001664 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001665
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001666public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001667 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1668 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001669 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001670 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001671 }
1672};
1673} // end anonymous namespace
1674
1675static void addMultilibFlag(bool Enabled, const char *const Flag,
1676 std::vector<std::string> &Flags) {
1677 if (Enabled)
1678 Flags.push_back(std::string("+") + Flag);
1679 else
1680 Flags.push_back(std::string("-") + Flag);
1681}
1682
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001683static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001684 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1685 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1686}
1687
1688static bool isMips32(llvm::Triple::ArchType Arch) {
1689 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1690}
1691
1692static bool isMips64(llvm::Triple::ArchType Arch) {
1693 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1694}
1695
1696static bool isMipsEL(llvm::Triple::ArchType Arch) {
1697 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1698}
1699
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001700static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001701 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001702 return A && A->getOption().matches(options::OPT_mips16);
1703}
1704
1705static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001706 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001707 return A && A->getOption().matches(options::OPT_mmicromips);
1708}
1709
Benjamin Kramere003ca22015-10-28 13:54:16 +00001710namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001711struct DetectedMultilibs {
1712 /// The set of multilibs that the detected installation supports.
1713 MultilibSet Multilibs;
1714
1715 /// The primary multilib appropriate for the given flags.
1716 Multilib SelectedMultilib;
1717
1718 /// On Biarch systems, this corresponds to the default multilib when
1719 /// targeting the non-default multilib. Otherwise, it is empty.
1720 llvm::Optional<Multilib> BiarchSibling;
1721};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001722} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001723
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001724static Multilib makeMultilib(StringRef commonSuffix) {
1725 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1726}
1727
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001728static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1729 StringRef Path, const ArgList &Args,
1730 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001731 // Some MIPS toolchains put libraries and object files compiled
1732 // using different options in to the sub-directoris which names
1733 // reflects the flags used for compilation. For example sysroot
1734 // directory might looks like the following examples:
1735 //
1736 // /usr
1737 // /lib <= crt*.o files compiled with '-mips32'
1738 // /mips16
1739 // /usr
1740 // /lib <= crt*.o files compiled with '-mips16'
1741 // /el
1742 // /usr
1743 // /lib <= crt*.o files compiled with '-mips16 -EL'
1744 //
1745 // or
1746 //
1747 // /usr
1748 // /lib <= crt*.o files compiled with '-mips32r2'
1749 // /mips16
1750 // /usr
1751 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1752 // /mips32
1753 // /usr
1754 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001755
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001756 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001757
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001758 // Check for FSF toolchain multilibs
1759 MultilibSet FSFMipsMultilibs;
1760 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001761 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001762 .flag("+m32")
1763 .flag("-m64")
1764 .flag("-mmicromips")
1765 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001766
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001767 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001768 .flag("+m32")
1769 .flag("-m64")
1770 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001771
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001772 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001773 .flag("-m32")
1774 .flag("+m64")
1775 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001776
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001777 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1778 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001779
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001780 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001781 .flag("+m32")
1782 .flag("-m64")
1783 .flag("-mmicromips")
1784 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001785
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001786 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001787
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001788 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001789
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001790 auto MAbi64 =
1791 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001792
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001793 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001794
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001795 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001796
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001797 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001798
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001799 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001800
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001801 FSFMipsMultilibs =
1802 MultilibSet()
1803 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1804 MArchDefault)
1805 .Maybe(UCLibc)
1806 .Maybe(Mips16)
1807 .FilterOut("/mips64/mips16")
1808 .FilterOut("/mips64r2/mips16")
1809 .FilterOut("/micromips/mips16")
1810 .Maybe(MAbi64)
1811 .FilterOut("/micromips/64")
1812 .FilterOut("/mips32/64")
1813 .FilterOut("^/64")
1814 .FilterOut("/mips16/64")
1815 .Either(BigEndian, LittleEndian)
1816 .Maybe(SoftFloat)
1817 .Maybe(Nan2008)
1818 .FilterOut(".*sof/nan2008")
1819 .FilterOut(NonExistent)
1820 .setIncludeDirsCallback([](StringRef InstallDir,
1821 StringRef TripleStr, const Multilib &M) {
1822 std::vector<std::string> Dirs;
1823 Dirs.push_back((InstallDir + "/include").str());
1824 std::string SysRootInc =
1825 InstallDir.str() + "/../../../../sysroot";
1826 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1827 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1828 else
1829 Dirs.push_back(SysRootInc + "/usr/include");
1830 return Dirs;
1831 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001832 }
1833
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001834 // Check for Musl toolchain multilibs
1835 MultilibSet MuslMipsMultilibs;
1836 {
1837 auto MArchMipsR2 = makeMultilib("")
1838 .osSuffix("/mips-r2-hard-musl")
1839 .flag("+EB")
1840 .flag("-EL")
1841 .flag("+march=mips32r2");
1842
1843 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1844 .flag("-EB")
1845 .flag("+EL")
1846 .flag("+march=mips32r2");
1847
1848 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1849
1850 // Specify the callback that computes the include directories.
1851 MuslMipsMultilibs.setIncludeDirsCallback([](
1852 StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1853 std::vector<std::string> Dirs;
1854 Dirs.push_back(
1855 (InstallDir + "/../sysroot" + M.osSuffix() + "/usr/include").str());
1856 return Dirs;
1857 });
1858 }
1859
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001860 // Check for Code Sourcery toolchain multilibs
1861 MultilibSet CSMipsMultilibs;
1862 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001863 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001864
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001865 auto MArchMicroMips =
1866 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001867
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001868 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001869
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001870 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001871
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001872 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001873
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001874 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001875
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001876 auto DefaultFloat =
1877 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001878
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001879 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001880
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001881 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001882
1883 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001884 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001885 .gccSuffix("/64")
1886 .includeSuffix("/64")
1887 .flag("+mabi=n64")
1888 .flag("-mabi=n32")
1889 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001890
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001891 CSMipsMultilibs =
1892 MultilibSet()
1893 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1894 .Maybe(UCLibc)
1895 .Either(SoftFloat, Nan2008, DefaultFloat)
1896 .FilterOut("/micromips/nan2008")
1897 .FilterOut("/mips16/nan2008")
1898 .Either(BigEndian, LittleEndian)
1899 .Maybe(MAbi64)
1900 .FilterOut("/mips16.*/64")
1901 .FilterOut("/micromips.*/64")
1902 .FilterOut(NonExistent)
1903 .setIncludeDirsCallback([](StringRef InstallDir,
1904 StringRef TripleStr, const Multilib &M) {
1905 std::vector<std::string> Dirs;
1906 Dirs.push_back((InstallDir + "/include").str());
1907 std::string SysRootInc =
1908 InstallDir.str() + "/../../../../" + TripleStr.str();
1909 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1910 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1911 else
1912 Dirs.push_back(SysRootInc + "/libc/usr/include");
1913 return Dirs;
1914 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001915 }
1916
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001917 MultilibSet AndroidMipsMultilibs =
1918 MultilibSet()
1919 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1920 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1921 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001922
1923 MultilibSet DebianMipsMultilibs;
1924 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001925 Multilib MAbiN32 =
1926 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001927
1928 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001929 .gccSuffix("/64")
1930 .includeSuffix("/64")
1931 .flag("+m64")
1932 .flag("-m32")
1933 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001934
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001935 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001936
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001937 DebianMipsMultilibs =
1938 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001939 }
1940
Daniel Sanders2bf13662014-07-10 14:40:57 +00001941 MultilibSet ImgMultilibs;
1942 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001943 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001945 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001946
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001947 auto MAbi64 =
1948 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001949
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001950 ImgMultilibs =
1951 MultilibSet()
1952 .Maybe(Mips64r6)
1953 .Maybe(MAbi64)
1954 .Maybe(LittleEndian)
1955 .FilterOut(NonExistent)
1956 .setIncludeDirsCallback([](StringRef InstallDir,
1957 StringRef TripleStr, const Multilib &M) {
1958 std::vector<std::string> Dirs;
1959 Dirs.push_back((InstallDir + "/include").str());
1960 Dirs.push_back(
1961 (InstallDir + "/../../../../sysroot/usr/include").str());
1962 return Dirs;
1963 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001964 }
1965
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001966 StringRef CPUName;
1967 StringRef ABIName;
1968 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1969
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001970 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1971
1972 Multilib::flags_list Flags;
1973 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1974 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1975 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001976 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001977 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00001978 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001979 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00001980 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001981 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001982 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1983 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001984 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001985 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001986 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00001987 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1988 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001989 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1990 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001991 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001992 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001993 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001994 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001995
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001996 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001997 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00001998 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1999 Result.Multilibs = AndroidMipsMultilibs;
2000 return true;
2001 }
2002 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002003 }
2004
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002005 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2006 TargetTriple.getOS() == llvm::Triple::Linux &&
2007 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2008 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2009 Result.Multilibs = MuslMipsMultilibs;
2010 return true;
2011 }
2012 return false;
2013 }
2014
Daniel Sanders2bf13662014-07-10 14:40:57 +00002015 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2016 TargetTriple.getOS() == llvm::Triple::Linux &&
2017 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2018 // Select mips-img-linux-gnu toolchain.
2019 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
2020 Result.Multilibs = ImgMultilibs;
2021 return true;
2022 }
2023 return false;
2024 }
2025
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002026 // Sort candidates. Toolchain that best meets the directories goes first.
2027 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002028 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
2029 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002030 std::sort(
2031 std::begin(candidates), std::end(candidates),
2032 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2033 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002034 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002035 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002036 Result.BiarchSibling = Multilib();
2037 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002038 return true;
2039 }
2040 }
2041
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002042 {
2043 // Fallback to the regular toolchain-tree structure.
2044 Multilib Default;
2045 Result.Multilibs.push_back(Default);
2046 Result.Multilibs.FilterOut(NonExistent);
2047
2048 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2049 Result.BiarchSibling = Multilib();
2050 return true;
2051 }
2052 }
2053
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002054 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002055}
2056
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002057static bool findBiarchMultilibs(const Driver &D,
2058 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002059 StringRef Path, const ArgList &Args,
2060 bool NeedsBiarchSuffix,
2061 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002062 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2063 // in what would normally be GCCInstallPath and put the 64-bit
2064 // libs in a subdirectory named 64. The simple logic we follow is that
2065 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2066 // we use that. If not, and if not a biarch triple alias, we look for
2067 // crtbegin.o without the subdirectory.
2068
2069 Multilib Default;
2070 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002071 .gccSuffix("/64")
2072 .includeSuffix("/64")
2073 .flag("-m32")
2074 .flag("+m64")
2075 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002076 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002077 .gccSuffix("/32")
2078 .includeSuffix("/32")
2079 .flag("+m32")
2080 .flag("-m64")
2081 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002082 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002083 .gccSuffix("/x32")
2084 .includeSuffix("/x32")
2085 .flag("-m32")
2086 .flag("-m64")
2087 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002088
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002089 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002090
Zinovy Nis1db95732014-07-10 15:27:19 +00002091 // Determine default multilib from: 32, 64, x32
2092 // Also handle cases such as 64 on 32, 32 on 64, etc.
2093 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002094 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002095 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002096 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002097 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002098 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002099 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002100 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002101 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002102 if (TargetTriple.isArch32Bit())
2103 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002104 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002105 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002106 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002107 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002108 }
2109
Zinovy Nis1db95732014-07-10 15:27:19 +00002110 if (Want == WANT32)
2111 Default.flag("+m32").flag("-m64").flag("-mx32");
2112 else if (Want == WANT64)
2113 Default.flag("-m32").flag("+m64").flag("-mx32");
2114 else if (Want == WANTX32)
2115 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002116 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002117 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002118
Simon Atanasyan60280b42014-05-12 07:37:51 +00002119 Result.Multilibs.push_back(Default);
2120 Result.Multilibs.push_back(Alt64);
2121 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002122 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002123
Simon Atanasyan60280b42014-05-12 07:37:51 +00002124 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002125
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002126 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002127 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002128 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002129 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002130
Simon Atanasyan60280b42014-05-12 07:37:51 +00002131 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002132 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002133
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002134 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002135 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002136 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002137
2138 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002139}
2140
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002141void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2142 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2143 const std::string &LibDir, StringRef CandidateTriple,
2144 bool NeedsBiarchSuffix) {
2145 // Solaris is a special case. The GCC installation is under
2146 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2147 // need to iterate twice.
2148 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002149 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2150 !EC && LI != LE; LI = LI.increment(EC)) {
2151 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002152 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2153
2154 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002155 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002156 continue; // Saw this path before; no need to look at it again.
2157 if (CandidateVersion.isOlderThan(4, 1, 1))
2158 continue;
2159 if (CandidateVersion <= Version)
2160 continue;
2161
2162 GCCInstallPath =
2163 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002164 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002165 continue;
2166
2167 // If we make it here there has to be at least one GCC version, let's just
2168 // use the latest one.
2169 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002170 for (vfs::directory_iterator
2171 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2172 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002173 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2174
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002175 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002176 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2177
2178 if (CandidateSubVersion > Version)
2179 Version = CandidateSubVersion;
2180 }
2181
2182 GCCTriple.setTriple(CandidateTriple);
2183
2184 GCCInstallPath += "/" + Version.Text;
2185 GCCParentLibPath = GCCInstallPath + "/../../../../";
2186
2187 IsValid = true;
2188 }
2189}
2190
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002191void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002192 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002193 const std::string &LibDir, StringRef CandidateTriple,
2194 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002195 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002196 // There are various different suffixes involving the triple we
2197 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002198 // up to the lib directory. Specifically, the number of "up" steps
2199 // in the second half of each row is 1 + the number of path separators
2200 // in the first half.
2201 const std::string LibAndInstallSuffixes[][2] = {
2202 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2203
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002204 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002205 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2206
2207 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2208 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002209
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002210 // The Freescale PPC SDK has the gcc libraries in
2211 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002212 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002213
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002214 // Ubuntu has a strange mis-matched pair of triples that this happens to
2215 // match.
2216 // FIXME: It may be worthwhile to generalize this and look for a second
2217 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002218 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2219
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002220 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2221 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2222 NeedsBiarchSuffix);
2223 return;
2224 }
2225
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002226 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002227 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2228 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002229 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002230 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002231 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002232 for (vfs::directory_iterator
2233 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2234 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002235 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002236 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002237 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002238 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002239 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002240 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002241 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002242 continue;
2243 if (CandidateVersion <= Version)
2244 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002245
Simon Atanasyan60280b42014-05-12 07:37:51 +00002246 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002247
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002248 // Debian mips multilibs behave more like the rest of the biarch ones,
2249 // so handle them there
2250 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002251 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002252 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002253 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002254 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002255 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002256 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002257
Simon Atanasyan60280b42014-05-12 07:37:51 +00002258 Multilibs = Detected.Multilibs;
2259 SelectedMultilib = Detected.SelectedMultilib;
2260 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002261 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002262 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002263 // FIXME: We hack together the directory name here instead of
2264 // using LI to ensure stable path separators across Windows and
2265 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002266 GCCInstallPath =
2267 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2268 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002269 IsValid = true;
2270 }
2271 }
2272}
2273
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002274Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002275 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002276 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002277 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002278 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002279 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002280}
2281
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002282Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002283
Rafael Espindola7cf32212013-03-20 03:05:54 +00002284Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002285 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002286 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002287 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002288 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002289 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002290 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002291 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002292 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002293 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002294 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002295 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002296 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002297}
2298
Rafael Espindola7cf32212013-03-20 03:05:54 +00002299Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002300 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002301}
2302
Douglas Katzman95354292015-06-23 20:42:09 +00002303Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002304
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002305void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2306 // Print the information about how we detected the GCC installation.
2307 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002308 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002309}
2310
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002311bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002312 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002313}
2314
David Majnemer17f448b2015-06-28 04:23:33 +00002315bool Generic_GCC::isPICDefault() const {
2316 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2317}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002318
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002319bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002320
David Majnemer17f448b2015-06-28 04:23:33 +00002321bool Generic_GCC::isPICDefaultForced() const {
2322 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2323}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002324
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002325bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002326 switch (getTriple().getArch()) {
2327 case llvm::Triple::x86:
2328 case llvm::Triple::x86_64:
2329 case llvm::Triple::aarch64:
2330 case llvm::Triple::aarch64_be:
2331 case llvm::Triple::arm:
2332 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002333 case llvm::Triple::bpfel:
2334 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002335 case llvm::Triple::thumb:
2336 case llvm::Triple::thumbeb:
2337 case llvm::Triple::ppc:
2338 case llvm::Triple::ppc64:
2339 case llvm::Triple::ppc64le:
2340 case llvm::Triple::sparc:
2341 case llvm::Triple::sparcel:
2342 case llvm::Triple::sparcv9:
2343 case llvm::Triple::systemz:
2344 return true;
2345 default:
2346 return false;
2347 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002348}
2349
James Y Knighta6c9ee72015-10-16 18:46:26 +00002350/// \brief Helper to add the variant paths of a libstdc++ installation.
2351bool Generic_GCC::addLibStdCXXIncludePaths(
2352 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2353 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2354 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2355 if (!getVFS().exists(Base + Suffix))
2356 return false;
2357
2358 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2359
2360 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2361 // that path exists or we have neither a GCC nor target multiarch triple, use
2362 // this vanilla search path.
2363 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2364 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2365 addSystemInclude(DriverArgs, CC1Args,
2366 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2367 } else {
2368 // Otherwise try to use multiarch naming schemes which have normalized the
2369 // triples and put the triple before the suffix.
2370 //
2371 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2372 // the target triple, so we support that here.
2373 addSystemInclude(DriverArgs, CC1Args,
2374 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2375 addSystemInclude(DriverArgs, CC1Args,
2376 Base + "/" + TargetMultiarchTriple + Suffix);
2377 }
2378
2379 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2380 return true;
2381}
2382
2383
Kristof Beylsfb387292014-01-10 13:44:34 +00002384void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2385 ArgStringList &CC1Args) const {
2386 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002387 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002388 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002389 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002390 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002391 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002392 getTriple().getOS() == llvm::Triple::NaCl ||
2393 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2394 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002395
2396 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002397 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002398 CC1Args.push_back("-fuse-init-array");
2399}
2400
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002401/// Mips Toolchain
2402MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2403 const llvm::Triple &Triple,
2404 const ArgList &Args)
2405 : Linux(D, Triple, Args) {
2406 // Select the correct multilib according to the given arguments.
2407 DetectedMultilibs Result;
2408 findMIPSMultilibs(D, Triple, "", Args, Result);
2409 Multilibs = Result.Multilibs;
2410 SelectedMultilib = Result.SelectedMultilib;
2411
2412 // Find out the library suffix based on the ABI.
2413 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2414 getFilePaths().clear();
2415 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2416
2417 // Use LLD by default.
2418 if (!Args.getLastArg(options::OPT_fuse_ld_EQ))
2419 Linker = GetProgramPath("lld");
2420}
2421
2422void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2423 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2424 if (DriverArgs.hasArg(options::OPT_nostdinc))
2425 return;
2426
2427 const Driver &D = getDriver();
2428
2429 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2430 SmallString<128> P(D.ResourceDir);
2431 llvm::sys::path::append(P, "include");
2432 addSystemInclude(DriverArgs, CC1Args, P);
2433 }
2434
2435 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2436 return;
2437
2438 const auto &Callback = Multilibs.includeDirsCallback();
2439 if (Callback) {
2440 const auto IncludePaths =
2441 Callback(D.getInstalledDir(), getTripleString(), SelectedMultilib);
2442 for (const auto &Path : IncludePaths)
2443 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
2444 }
2445}
2446
2447Tool *MipsLLVMToolChain::buildLinker() const {
2448 return new tools::gnutools::Linker(*this);
2449}
2450
2451std::string MipsLLVMToolChain::computeSysRoot() const {
2452 if (!getDriver().SysRoot.empty())
2453 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2454
2455 const std::string InstalledDir(getDriver().getInstalledDir());
2456 std::string SysRootPath =
2457 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2458 if (llvm::sys::fs::exists(SysRootPath))
2459 return SysRootPath;
2460
2461 return std::string();
2462}
2463
2464ToolChain::CXXStdlibType
2465MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2466 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2467 if (A) {
2468 StringRef Value = A->getValue();
2469 if (Value != "libc++")
2470 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2471 << A->getAsString(Args);
2472 }
2473
2474 return ToolChain::CST_Libcxx;
2475}
2476
2477void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2478 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2479 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2480 DriverArgs.hasArg(options::OPT_nostdincxx))
2481 return;
2482
2483 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2484 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2485
2486 const auto &Callback = Multilibs.includeDirsCallback();
2487 if (Callback) {
2488 const auto IncludePaths = Callback(getDriver().getInstalledDir(),
2489 getTripleString(), SelectedMultilib);
2490 for (const auto &Path : IncludePaths) {
2491 if (llvm::sys::fs::exists(Path + "/c++/v1")) {
2492 addSystemInclude(DriverArgs, CC1Args, Path + "/c++/v1");
2493 break;
2494 }
2495 }
2496 }
2497}
2498
2499void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2500 ArgStringList &CmdArgs) const {
2501 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2502 "Only -lc++ (aka libxx) is suported in this toolchain.");
2503
2504 CmdArgs.push_back("-lc++");
2505 CmdArgs.push_back("-lc++abi");
2506 CmdArgs.push_back("-lunwind");
2507}
2508
2509std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2510 StringRef Component,
2511 bool Shared) const {
2512 SmallString<128> Path(getDriver().ResourceDir);
2513 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2514 getOS());
2515 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002516 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002517 return Path.str();
2518}
2519
Tony Linthicum76329bf2011-12-12 21:14:55 +00002520/// Hexagon Toolchain
2521
Douglas Katzman54366072015-07-27 16:53:08 +00002522std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002523 const ArgList &Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002524 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002525 std::string GccToolchain = getGCCToolchainDir(Args);
2526
2527 if (!GccToolchain.empty())
2528 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002529
2530 std::string InstallRelDir = InstalledDir + "/../../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002531 if (getVFS().exists(InstallRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002532 return InstallRelDir;
2533
2534 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002535 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002536 return PrefixRelDir;
2537
2538 return InstallRelDir;
2539}
2540
Douglas Katzman54366072015-07-27 16:53:08 +00002541const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002542 Arg *A;
2543
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002544 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002545 options::OPT_msmall_data_threshold_EQ);
2546 if (A)
2547 return A->getValue();
2548
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002549 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002550 options::OPT_fPIC);
2551 if (A)
2552 return "0";
2553
Hans Wennborgdcfba332015-10-06 23:40:43 +00002554 return nullptr;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002555}
2556
Douglas Katzman54366072015-07-27 16:53:08 +00002557bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002558 return smallDataThreshold && smallDataThreshold[0] == '0';
2559}
2560
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002561static void GetHexagonLibraryPaths(const HexagonToolChain &TC,
2562 const ArgList &Args, const std::string &Ver,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002563 const std::string &MarchString,
2564 const std::string &InstalledDir,
2565 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002566 bool buildingLib = Args.hasArg(options::OPT_shared);
2567
2568 //----------------------------------------------------------------------------
2569 // -L Args
2570 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002571 for (Arg *A : Args.filtered(options::OPT_L))
2572 for (const char *Value : A->getValues())
2573 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002574
2575 //----------------------------------------------------------------------------
2576 // Other standard paths
2577 //----------------------------------------------------------------------------
2578 const std::string MarchSuffix = "/" + MarchString;
2579 const std::string G0Suffix = "/G0";
2580 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002581 const std::string RootDir = TC.GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002582
2583 // lib/gcc/hexagon/...
2584 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2585 if (buildingLib) {
2586 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2587 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2588 }
2589 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2590 LibPaths->push_back(LibGCCHexagonDir + Ver);
2591
2592 // lib/gcc/...
2593 LibPaths->push_back(RootDir + "lib/gcc");
2594
2595 // hexagon/lib/...
2596 std::string HexagonLibDir = RootDir + "hexagon/lib";
2597 if (buildingLib) {
2598 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2599 LibPaths->push_back(HexagonLibDir + G0Suffix);
2600 }
2601 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2602 LibPaths->push_back(HexagonLibDir);
2603}
2604
Douglas Katzman54366072015-07-27 16:53:08 +00002605HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2606 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002607 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002608 const std::string InstalledDir(getDriver().getInstalledDir());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002609 const std::string GnuDir = GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002610
2611 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2612 // program paths
2613 const std::string BinDir(GnuDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002614 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002615 getProgramPaths().push_back(BinDir);
2616
2617 // Determine version of GCC libraries and headers to use.
2618 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002619 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002620 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002621 for (vfs::directory_iterator di = D.getVFS().dir_begin(HexagonDir, ec), de;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002622 !ec && di != de; di = di.increment(ec)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002623 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->getName()));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002624 if (MaxVersion < cv)
2625 MaxVersion = cv;
2626 }
2627 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002628
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002629 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002630
2631 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2632 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2633 // support 'linux' we'll need to fix this up
2634 LibPaths->clear();
2635
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002636 GetHexagonLibraryPaths(*this, Args, GetGCCLibAndIncVersion(),
2637 GetTargetCPU(Args), InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002638}
2639
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002640HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002641
Douglas Katzman54366072015-07-27 16:53:08 +00002642Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002643 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002644}
2645
Douglas Katzman54366072015-07-27 16:53:08 +00002646Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002647 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002648}
2649
Douglas Katzman54366072015-07-27 16:53:08 +00002650void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2651 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002652 const Driver &D = getDriver();
2653
2654 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2655 DriverArgs.hasArg(options::OPT_nostdlibinc))
2656 return;
2657
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002658 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002659 std::string GnuDir = GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002660 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2661 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2662 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2663 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002664}
2665
Douglas Katzman54366072015-07-27 16:53:08 +00002666void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2667 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002668 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2669 DriverArgs.hasArg(options::OPT_nostdincxx))
2670 return;
2671
2672 const Driver &D = getDriver();
2673 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002674 SmallString<128> IncludeDir(GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002675
Rafael Espindola358256c2013-06-26 02:13:00 +00002676 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2677 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002678 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002679}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002680
Matthew Curtise689b052012-12-06 15:46:07 +00002681ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002682HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002683 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2684 if (!A)
2685 return ToolChain::CST_Libstdcxx;
2686
2687 StringRef Value = A->getValue();
2688 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002689 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002690 }
2691
2692 return ToolChain::CST_Libstdcxx;
2693}
2694
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002695static int getHexagonVersion(const ArgList &Args) {
2696 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2697 // Select the default CPU (v4) if none was given.
2698 if (!A)
2699 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002700
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002701 // FIXME: produce errors if we cannot parse the version.
2702 StringRef WhichHexagon = A->getValue();
2703 if (WhichHexagon.startswith("hexagonv")) {
2704 int Val;
2705 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2706 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002707 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002708 if (WhichHexagon.startswith("v")) {
2709 int Val;
2710 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2711 return Val;
2712 }
2713
2714 // FIXME: should probably be an error.
2715 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002716}
2717
Douglas Katzman54366072015-07-27 16:53:08 +00002718StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002719 int V = getHexagonVersion(Args);
2720 // FIXME: We don't support versions < 4. We should error on them.
2721 switch (V) {
2722 default:
2723 llvm_unreachable("Unexpected version");
2724 case 5:
2725 return "v5";
2726 case 4:
2727 return "v4";
2728 case 3:
2729 return "v3";
2730 case 2:
2731 return "v2";
2732 case 1:
2733 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002734 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002735}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002736// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002737
Tom Stellard8fa33092015-07-18 01:49:05 +00002738/// AMDGPU Toolchain
2739AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2740 const ArgList &Args)
2741 : Generic_ELF(D, Triple, Args) { }
2742
2743Tool *AMDGPUToolChain::buildLinker() const {
2744 return new tools::amdgpu::Linker(*this);
2745}
2746// End AMDGPU
2747
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002748/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002749NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2750 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002751 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002752
2753 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2754 // default paths, and must instead only use the paths provided
2755 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002756 path_list &file_paths = getFilePaths();
2757 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002758
2759 file_paths.clear();
2760 prog_paths.clear();
2761
2762 // Path for library files (libc.a, ...)
2763 std::string FilePath(getDriver().Dir + "/../");
2764
2765 // Path for tools (clang, ld, etc..)
2766 std::string ProgPath(getDriver().Dir + "/../");
2767
2768 // Path for toolchain libraries (libgcc.a, ...)
2769 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2770
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002771 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002772 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002773 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002774 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002775 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2776 file_paths.push_back(ToolPath + "i686-nacl");
2777 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002778 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002779 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2780 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2781 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2782 file_paths.push_back(ToolPath + "x86_64-nacl");
2783 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002784 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002785 file_paths.push_back(FilePath + "arm-nacl/lib");
2786 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2787 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2788 file_paths.push_back(ToolPath + "arm-nacl");
2789 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002790 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002791 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2792 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2793 prog_paths.push_back(ProgPath + "bin");
2794 file_paths.push_back(ToolPath + "mipsel-nacl");
2795 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002796 default:
2797 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002798 }
2799
2800 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002801 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002802 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2803}
2804
Douglas Katzman54366072015-07-27 16:53:08 +00002805void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2806 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002807 const Driver &D = getDriver();
2808 if (DriverArgs.hasArg(options::OPT_nostdinc))
2809 return;
2810
2811 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2812 SmallString<128> P(D.ResourceDir);
2813 llvm::sys::path::append(P, "include");
2814 addSystemInclude(DriverArgs, CC1Args, P.str());
2815 }
2816
2817 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2818 return;
2819
2820 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002821 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002822 case llvm::Triple::x86:
2823 // x86 is special because multilib style uses x86_64-nacl/include for libc
2824 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2825 // have the same substring.
2826 llvm::sys::path::append(P, "i686-nacl/usr/include");
2827 addSystemInclude(DriverArgs, CC1Args, P.str());
2828 llvm::sys::path::remove_filename(P);
2829 llvm::sys::path::remove_filename(P);
2830 llvm::sys::path::remove_filename(P);
2831 llvm::sys::path::append(P, "x86_64-nacl/include");
2832 addSystemInclude(DriverArgs, CC1Args, P.str());
2833 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002834 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002835 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002836 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002837 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002838 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002839 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002840 case llvm::Triple::mipsel:
2841 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2842 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002843 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002844 return;
2845 }
2846
2847 addSystemInclude(DriverArgs, CC1Args, P.str());
2848 llvm::sys::path::remove_filename(P);
2849 llvm::sys::path::remove_filename(P);
2850 llvm::sys::path::append(P, "include");
2851 addSystemInclude(DriverArgs, CC1Args, P.str());
2852}
2853
Douglas Katzman54366072015-07-27 16:53:08 +00002854void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2855 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002856 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2857 // if the value is libc++, and emits an error for other values.
2858 GetCXXStdlibType(Args);
2859 CmdArgs.push_back("-lc++");
2860}
2861
Douglas Katzman54366072015-07-27 16:53:08 +00002862void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2863 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002864 const Driver &D = getDriver();
2865 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2866 DriverArgs.hasArg(options::OPT_nostdincxx))
2867 return;
2868
2869 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2870 // if the value is libc++, and emits an error for other values.
2871 GetCXXStdlibType(DriverArgs);
2872
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002873 SmallString<128> P(D.Dir + "/../");
2874 switch (getTriple().getArch()) {
2875 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002876 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2877 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002878 break;
2879 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002880 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2881 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002882 break;
2883 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002884 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2885 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002886 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002887 case llvm::Triple::mipsel:
2888 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2889 addSystemInclude(DriverArgs, CC1Args, P.str());
2890 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002891 default:
2892 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002893 }
2894}
2895
Douglas Katzman54366072015-07-27 16:53:08 +00002896ToolChain::CXXStdlibType
2897NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002898 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2899 StringRef Value = A->getValue();
2900 if (Value == "libc++")
2901 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002902 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002903 }
2904
2905 return ToolChain::CST_Libcxx;
2906}
2907
Douglas Katzman54366072015-07-27 16:53:08 +00002908std::string
2909NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2910 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002911 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2912 if (TheTriple.getArch() == llvm::Triple::arm &&
2913 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2914 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2915 return TheTriple.getTriple();
2916}
2917
Douglas Katzman54366072015-07-27 16:53:08 +00002918Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002919 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002920}
2921
Douglas Katzman54366072015-07-27 16:53:08 +00002922Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002923 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002924 return new tools::nacltools::AssemblerARM(*this);
2925 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002926}
2927// End NaCl
2928
Chris Lattner09797542010-03-04 21:07:38 +00002929/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2930/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2931/// Currently does not support anything else but compilation.
2932
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002933TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002934 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002935 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002936 // Path mangling to find libexec
2937 std::string Path(getDriver().Dir);
2938
2939 Path += "/../libexec";
2940 getProgramPaths().push_back(Path);
2941}
2942
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002943TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002944
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002945bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002946
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002947bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002948
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002949bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002950
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002951bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002952
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002953// CloudABI - CloudABI tool chain which can call ld(1) directly.
2954
2955CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2956 const ArgList &Args)
2957 : Generic_ELF(D, Triple, Args) {
2958 SmallString<128> P(getDriver().Dir);
2959 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2960 getFilePaths().push_back(P.str());
2961}
2962
2963void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2964 ArgStringList &CC1Args) const {
2965 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2966 DriverArgs.hasArg(options::OPT_nostdincxx))
2967 return;
2968
2969 SmallString<128> P(getDriver().Dir);
2970 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2971 addSystemInclude(DriverArgs, CC1Args, P.str());
2972}
2973
2974void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2975 ArgStringList &CmdArgs) const {
2976 CmdArgs.push_back("-lc++");
2977 CmdArgs.push_back("-lc++abi");
2978 CmdArgs.push_back("-lunwind");
2979}
2980
Douglas Katzman95354292015-06-23 20:42:09 +00002981Tool *CloudABI::buildLinker() const {
2982 return new tools::cloudabi::Linker(*this);
2983}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002984
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002985/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2986
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002987OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2988 const ArgList &Args)
2989 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002990 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002991 getFilePaths().push_back("/usr/lib");
2992}
2993
Rafael Espindola7cf32212013-03-20 03:05:54 +00002994Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002995 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002996}
2997
Douglas Katzman95354292015-06-23 20:42:09 +00002998Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002999
Eli Friedman9fa28852012-08-08 23:57:20 +00003000/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3001
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003002Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3003 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003004 getFilePaths().push_back(getDriver().Dir + "/../lib");
3005 getFilePaths().push_back("/usr/lib");
3006}
3007
Rafael Espindola7cf32212013-03-20 03:05:54 +00003008Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003009 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003010}
3011
Douglas Katzman95354292015-06-23 20:42:09 +00003012Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003013
Douglas Katzman95354292015-06-23 20:42:09 +00003014ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00003015 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3016 StringRef Value = A->getValue();
3017 if (Value == "libstdc++")
3018 return ToolChain::CST_Libstdcxx;
3019 if (Value == "libc++")
3020 return ToolChain::CST_Libcxx;
3021
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003022 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00003023 }
3024 return ToolChain::CST_Libcxx;
3025}
3026
Eli Friedman9fa28852012-08-08 23:57:20 +00003027void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3028 ArgStringList &CC1Args) const {
3029 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3030 DriverArgs.hasArg(options::OPT_nostdincxx))
3031 return;
3032
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003033 switch (GetCXXStdlibType(DriverArgs)) {
3034 case ToolChain::CST_Libcxx:
3035 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003036 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003037 break;
3038 case ToolChain::CST_Libstdcxx:
3039 addSystemInclude(DriverArgs, CC1Args,
3040 getDriver().SysRoot + "/usr/include/c++/stdc++");
3041 addSystemInclude(DriverArgs, CC1Args,
3042 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003043
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003044 StringRef Triple = getTriple().str();
3045 if (Triple.startswith("amd64"))
3046 addSystemInclude(DriverArgs, CC1Args,
3047 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003048 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003049 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003050 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3051 "/usr/include/c++/stdc++/" +
3052 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003053 break;
3054 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003055}
3056
3057void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3058 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003059 switch (GetCXXStdlibType(Args)) {
3060 case ToolChain::CST_Libcxx:
3061 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003062 CmdArgs.push_back("-lc++abi");
3063 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003064 break;
3065 case ToolChain::CST_Libstdcxx:
3066 CmdArgs.push_back("-lstdc++");
3067 break;
3068 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003069}
3070
Daniel Dunbare24297c2009-03-30 21:06:03 +00003071/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3072
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003073FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3074 const ArgList &Args)
3075 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003076
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003077 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3078 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003079 if ((Triple.getArch() == llvm::Triple::x86 ||
3080 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003081 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003082 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3083 else
3084 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003085}
3086
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003087ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00003088 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3089 StringRef Value = A->getValue();
3090 if (Value == "libstdc++")
3091 return ToolChain::CST_Libstdcxx;
3092 if (Value == "libc++")
3093 return ToolChain::CST_Libcxx;
3094
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003095 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00003096 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003097 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003098 return ToolChain::CST_Libcxx;
3099 return ToolChain::CST_Libstdcxx;
3100}
3101
3102void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3103 ArgStringList &CC1Args) const {
3104 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3105 DriverArgs.hasArg(options::OPT_nostdincxx))
3106 return;
3107
3108 switch (GetCXXStdlibType(DriverArgs)) {
3109 case ToolChain::CST_Libcxx:
3110 addSystemInclude(DriverArgs, CC1Args,
3111 getDriver().SysRoot + "/usr/include/c++/v1");
3112 break;
3113 case ToolChain::CST_Libstdcxx:
3114 addSystemInclude(DriverArgs, CC1Args,
3115 getDriver().SysRoot + "/usr/include/c++/4.2");
3116 addSystemInclude(DriverArgs, CC1Args,
3117 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3118 break;
3119 }
3120}
3121
Rafael Espindola7cf32212013-03-20 03:05:54 +00003122Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003123 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003124}
3125
Douglas Katzman95354292015-06-23 20:42:09 +00003126Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003127
Tim Northovere931f9f2015-10-30 16:30:41 +00003128bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003129 // FreeBSD uses SjLj exceptions on ARM oabi.
3130 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003131 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003132 case llvm::Triple::GNUEABI:
3133 case llvm::Triple::EABI:
3134 return false;
3135
3136 default:
3137 return (getTriple().getArch() == llvm::Triple::arm ||
3138 getTriple().getArch() == llvm::Triple::thumb);
3139 }
3140}
3141
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003142bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003143
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003144bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003145
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003146SanitizerMask FreeBSD::getSupportedSanitizers() const {
3147 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3148 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3149 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3150 getTriple().getArch() == llvm::Triple::mips64el;
3151 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3152 Res |= SanitizerKind::Address;
3153 Res |= SanitizerKind::Vptr;
3154 if (IsX86_64 || IsMIPS64) {
3155 Res |= SanitizerKind::Leak;
3156 Res |= SanitizerKind::Thread;
3157 }
3158 if (IsX86 || IsX86_64) {
3159 Res |= SanitizerKind::SafeStack;
3160 }
3161 return Res;
3162}
3163
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003164/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3165
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003166NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3167 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003168
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003169 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003170 // When targeting a 32-bit platform, try the special directory used on
3171 // 64-bit hosts, and only fall back to the main library directory if that
3172 // doesn't work.
3173 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3174 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003175 switch (Triple.getArch()) {
3176 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003177 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003178 break;
3179 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003180 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003181 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003182 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003183 switch (Triple.getEnvironment()) {
3184 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003185 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003186 getFilePaths().push_back("=/usr/lib/eabi");
3187 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003188 case llvm::Triple::EABIHF:
3189 case llvm::Triple::GNUEABIHF:
3190 getFilePaths().push_back("=/usr/lib/eabihf");
3191 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003192 default:
3193 getFilePaths().push_back("=/usr/lib/oabi");
3194 break;
3195 }
3196 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003197 case llvm::Triple::mips64:
3198 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003199 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003200 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003201 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003202 getFilePaths().push_back("=/usr/lib/64");
3203 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003204 case llvm::Triple::ppc:
3205 getFilePaths().push_back("=/usr/lib/powerpc");
3206 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003207 case llvm::Triple::sparc:
3208 getFilePaths().push_back("=/usr/lib/sparc");
3209 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003210 default:
3211 break;
3212 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003213
3214 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003215 }
3216}
3217
Rafael Espindola7cf32212013-03-20 03:05:54 +00003218Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003219 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003220}
3221
Douglas Katzman95354292015-06-23 20:42:09 +00003222Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003223
Douglas Katzman95354292015-06-23 20:42:09 +00003224ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003225 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3226 StringRef Value = A->getValue();
3227 if (Value == "libstdc++")
3228 return ToolChain::CST_Libstdcxx;
3229 if (Value == "libc++")
3230 return ToolChain::CST_Libcxx;
3231
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003232 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003233 }
3234
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003235 unsigned Major, Minor, Micro;
3236 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003237 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003238 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003239 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003240 case llvm::Triple::arm:
3241 case llvm::Triple::armeb:
3242 case llvm::Triple::thumb:
3243 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003244 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003245 case llvm::Triple::ppc64:
3246 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003247 case llvm::Triple::x86:
3248 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003249 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003250 default:
3251 break;
3252 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003253 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003254 return ToolChain::CST_Libstdcxx;
3255}
3256
3257void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3258 ArgStringList &CC1Args) const {
3259 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3260 DriverArgs.hasArg(options::OPT_nostdincxx))
3261 return;
3262
3263 switch (GetCXXStdlibType(DriverArgs)) {
3264 case ToolChain::CST_Libcxx:
3265 addSystemInclude(DriverArgs, CC1Args,
3266 getDriver().SysRoot + "/usr/include/c++/");
3267 break;
3268 case ToolChain::CST_Libstdcxx:
3269 addSystemInclude(DriverArgs, CC1Args,
3270 getDriver().SysRoot + "/usr/include/g++");
3271 addSystemInclude(DriverArgs, CC1Args,
3272 getDriver().SysRoot + "/usr/include/g++/backward");
3273 break;
3274 }
3275}
3276
Chris Lattner3e2ee142010-07-07 16:01:42 +00003277/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3278
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003279Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3280 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003281 getFilePaths().push_back(getDriver().Dir + "/../lib");
3282 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003283}
3284
Rafael Espindola7cf32212013-03-20 03:05:54 +00003285Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003286 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003287}
3288
Douglas Katzman95354292015-06-23 20:42:09 +00003289Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003290
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003291static void addPathIfExists(const Driver &D, const Twine &Path,
3292 ToolChain::path_list &Paths) {
3293 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003294 Paths.push_back(Path.str());
3295}
3296
David Chisnallf571cde2012-02-15 13:39:01 +00003297/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3298
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003299Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003300 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003301 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003302
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003303 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003304
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003305 path_list &Paths = getFilePaths();
3306 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003307 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003308
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003309 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003310 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003311 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003312
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003313 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003314
3315 std::string LibPath = "/usr/lib/";
3316 switch (Triple.getArch()) {
3317 case llvm::Triple::x86:
3318 case llvm::Triple::sparc:
3319 break;
3320 case llvm::Triple::x86_64:
3321 LibPath += "amd64/";
3322 break;
3323 case llvm::Triple::sparcv9:
3324 LibPath += "sparcv9/";
3325 break;
3326 default:
3327 llvm_unreachable("Unsupported architecture");
3328 }
3329
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003330 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003331}
3332
Rafael Espindola7cf32212013-03-20 03:05:54 +00003333Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003334 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003335}
3336
Douglas Katzman95354292015-06-23 20:42:09 +00003337Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003338
Rafael Espindolad5117262015-09-09 13:36:00 +00003339void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3340 ArgStringList &CC1Args) const {
3341 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3342 DriverArgs.hasArg(options::OPT_nostdincxx))
3343 return;
3344
3345 // Include the support directory for things like xlocale and fudged system
3346 // headers.
3347 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3348
3349 if (GCCInstallation.isValid()) {
3350 GCCVersion Version = GCCInstallation.getVersion();
3351 addSystemInclude(DriverArgs, CC1Args,
3352 getDriver().SysRoot + "/usr/gcc/" +
3353 Version.MajorStr + "." +
3354 Version.MinorStr +
3355 "/include/c++/" + Version.Text);
3356 addSystemInclude(DriverArgs, CC1Args,
3357 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3358 "." + Version.MinorStr + "/include/c++/" +
3359 Version.Text + "/" +
3360 GCCInstallation.getTriple().str());
3361 }
3362}
3363
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003364/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003365
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003366enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003367 // NB: Releases of a particular Linux distro should be kept together
3368 // in this enum, because some tests are done by integer comparison against
3369 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003370 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003371 DebianLenny,
3372 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003373 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003374 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003375 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003376 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003377 RHEL4,
3378 RHEL5,
3379 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003380 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003381 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003382 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003383 UbuntuHardy,
3384 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003385 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003386 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003387 UbuntuLucid,
3388 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003389 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003390 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003391 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003392 UbuntuQuantal,
3393 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003394 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003395 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003396 UbuntuUtopic,
3397 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003398 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003399 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003400 UnknownDistro
3401};
3402
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003403static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003404 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003405}
3406
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003407static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003408
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003409static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003410 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003411}
3412
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003413static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003414 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003415}
3416
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003417static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003418 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3419 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3420 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003421 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003422 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003423 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003424 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003425 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003426 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3427 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3428 .Case("hardy", UbuntuHardy)
3429 .Case("intrepid", UbuntuIntrepid)
3430 .Case("jaunty", UbuntuJaunty)
3431 .Case("karmic", UbuntuKarmic)
3432 .Case("lucid", UbuntuLucid)
3433 .Case("maverick", UbuntuMaverick)
3434 .Case("natty", UbuntuNatty)
3435 .Case("oneiric", UbuntuOneiric)
3436 .Case("precise", UbuntuPrecise)
3437 .Case("quantal", UbuntuQuantal)
3438 .Case("raring", UbuntuRaring)
3439 .Case("saucy", UbuntuSaucy)
3440 .Case("trusty", UbuntuTrusty)
3441 .Case("utopic", UbuntuUtopic)
3442 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003443 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003444 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003445 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003446 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003447 }
3448
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003449 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3450 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003451 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003452 if (Data.startswith("Fedora release"))
3453 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003454 if (Data.startswith("Red Hat Enterprise Linux") ||
3455 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003456 if (Data.find("release 7") != StringRef::npos)
3457 return RHEL7;
3458 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003459 return RHEL6;
3460 else if (Data.find("release 5") != StringRef::npos)
3461 return RHEL5;
3462 else if (Data.find("release 4") != StringRef::npos)
3463 return RHEL4;
3464 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003465 return UnknownDistro;
3466 }
3467
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003468 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3469 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003470 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003471 if (Data[0] == '5')
3472 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003473 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003474 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003475 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003476 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003477 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003478 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003479 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3480 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003481 return UnknownDistro;
3482 }
3483
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003484 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003485 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003486
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003487 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003488 return Exherbo;
3489
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003490 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003491 return ArchLinux;
3492
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003493 return UnknownDistro;
3494}
3495
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003496/// \brief Get our best guess at the multiarch triple for a target.
3497///
3498/// Debian-based systems are starting to use a multiarch setup where they use
3499/// a target-triple directory in the library and header search paths.
3500/// Unfortunately, this triple does not align with the vanilla target triple,
3501/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003502static std::string getMultiarchTriple(const Driver &D,
3503 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003504 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003505 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3506
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003507 // For most architectures, just use whatever we have rather than trying to be
3508 // clever.
3509 switch (TargetTriple.getArch()) {
3510 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003511 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003512
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003513 // We use the existence of '/lib/<triple>' as a directory to detect some
3514 // common linux triples that don't quite match the Clang triple for both
3515 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3516 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003517 case llvm::Triple::arm:
3518 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003519 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003520 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003521 return "arm-linux-gnueabihf";
3522 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003523 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003524 return "arm-linux-gnueabi";
3525 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003526 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003527 case llvm::Triple::armeb:
3528 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003529 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003530 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003531 return "armeb-linux-gnueabihf";
3532 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003533 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003534 return "armeb-linux-gnueabi";
3535 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003536 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003537 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003538 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003539 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003540 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003541 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003542 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003543 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003544 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003545 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003546 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003547 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003548 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003549 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003550 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003551 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003552 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003553 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003554 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003555 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003556 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003557 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003558 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003559 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003560 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003561 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003562 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003563 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003564 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003565 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003566 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003567 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003568 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003569 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003570 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003571 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003572 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003573 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003574 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003575 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003576 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003577 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003578 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003579 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003580 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003581 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003582 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003583 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003584 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003585 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003586 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003587 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003588 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003589 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003590 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003591 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003592 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003593 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003594 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003595 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003596 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003597 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003598 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003599 return "s390x-linux-gnu";
3600 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003601 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003602 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003603}
3604
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003605static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003606 if (isMipsArch(Triple.getArch())) {
3607 // lib32 directory has a special meaning on MIPS targets.
3608 // It contains N32 ABI binaries. Use this folder if produce
3609 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003610 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003611 return "lib32";
3612 return Triple.isArch32Bit() ? "lib" : "lib64";
3613 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003614
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003615 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003616 // using that variant while targeting other architectures causes problems
3617 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003618 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003619 // them when we know we may need it.
3620 //
3621 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003622 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003623 // GCCInstallationDetector, but that is a more significant refactoring.
3624 if (Triple.getArch() == llvm::Triple::x86 ||
3625 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003626 return "lib32";
3627
Zinovy Nis1db95732014-07-10 15:27:19 +00003628 if (Triple.getArch() == llvm::Triple::x86_64 &&
3629 Triple.getEnvironment() == llvm::Triple::GNUX32)
3630 return "libx32";
3631
Simon Atanasyand4413882012-09-14 11:27:24 +00003632 return Triple.isArch32Bit() ? "lib" : "lib64";
3633}
3634
Rafael Espindola1af7c212012-02-19 01:38:32 +00003635Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003636 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003637 GCCInstallation.init(Triple, Args);
3638 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003639 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003640 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003641 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003642
Rafael Espindola10a63c22013-07-03 14:14:00 +00003643 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003644 // least) put various tools in a triple-prefixed directory off of the parent
3645 // of the GCC installation. We use the GCC triple here to ensure that we end
3646 // up with tools that support the same amount of cross compiling as the
3647 // detected GCC installation. For example, if we find a GCC installation
3648 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3649 // used to target i386.
3650 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003651 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003652 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003653 GCCInstallation.getTriple().str() + "/bin")
3654 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003655
Logan Chieneb9162f2014-06-26 14:23:45 +00003656 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003657
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003658 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003659
Rafael Espindola10a63c22013-07-03 14:14:00 +00003660 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003661 ExtraOpts.push_back("-z");
3662 ExtraOpts.push_back("relro");
3663 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003664
Douglas Gregord9bb1522011-03-06 19:11:49 +00003665 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003666 ExtraOpts.push_back("-X");
3667
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003668 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003669 const bool IsMips = isMipsArch(Arch);
3670
3671 if (IsMips && !SysRoot.empty())
3672 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003673
Chandler Carruth0b842912011-12-09 04:45:18 +00003674 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3675 // and the MIPS ABI require .dynsym to be sorted in different ways.
3676 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3677 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003678 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003679 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003680 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003681 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003682 ExtraOpts.push_back("--hash-style=gnu");
3683
Rafael Espindola10a63c22013-07-03 14:14:00 +00003684 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003685 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3686 ExtraOpts.push_back("--hash-style=both");
3687 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003688
Chris Lattner84e38552011-05-22 05:36:06 +00003689 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003690 ExtraOpts.push_back("--no-add-needed");
3691
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003692 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003693 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003694 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003695 ExtraOpts.push_back("--build-id");
3696
Rafael Espindola10a63c22013-07-03 14:14:00 +00003697 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003698 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003699
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003700 // The selection of paths to try here is designed to match the patterns which
3701 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3702 // This was determined by running GCC in a fake filesystem, creating all
3703 // possible permutations of these directories, and seeing which ones it added
3704 // to the link paths.
3705 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003706
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003707 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003708 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003709
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003710 // Add the multilib suffixed paths where they are available.
3711 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003712 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003713 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003714 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003715
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003716 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003717 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003718 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003719 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003720
3721 // GCC cross compiling toolchains will install target libraries which ship
3722 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3723 // any part of the GCC installation in
3724 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3725 // debatable, but is the reality today. We need to search this tree even
3726 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003727 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003728 // installation that is *not* within the system root to ensure two things:
3729 //
3730 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003731 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003732 // appropriate rpath.
3733 // 2) There must not be libraries installed into
3734 // <prefix>/<triple>/<libdir> unless they should be preferred over
3735 // those within the system root.
3736 //
3737 // Note that this matches the GCC behavior. See the below comment for where
3738 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003739 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3740 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003741 Paths);
3742
Chandler Carruth69a125b2012-04-06 16:32:06 +00003743 // If the GCC installation we found is inside of the sysroot, we want to
3744 // prefer libraries installed in the parent prefix of the GCC installation.
3745 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003746 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003747 // This usually happens when there is an external cross compiler on the
3748 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003749 // the cross. Note that GCC does include some of these directories in some
3750 // configurations but this seems somewhere between questionable and simply
3751 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003752 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003753 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3754 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003755 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003756 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003757
3758 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003759 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003760 // those searched.
3761 // FIXME: It's not clear whether we should use the driver's installed
3762 // directory ('Dir' below) or the ResourceDir.
3763 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003764 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3765 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003766 }
3767
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003768 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3769 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3770 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3771 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003772
Chandler Carruthb427c562013-06-22 11:35:51 +00003773 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003774 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003775 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003776 addPathIfExists(D,
3777 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003778 "/../../" + OSLibDir,
3779 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003780
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003781 // Add the 'other' biarch variant path
3782 Multilib BiarchSibling;
3783 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003784 addPathIfExists(D, GCCInstallation.getInstallPath() +
3785 BiarchSibling.gccSuffix(),
3786 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003787 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003788
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003789 // See comments above on the multilib variant for details of why this is
3790 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003791 const std::string &LibPath = GCCInstallation.getParentLibPath();
3792 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3793 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003794 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3795 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003796 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003797
3798 // See comments above on the multilib variant for details of why this is
3799 // only included from within the sysroot.
3800 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003801 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003802 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003803
3804 // Similar to the logic for GCC above, if we are currently running Clang
3805 // inside of the requested system root, add its parent library path to those
3806 // searched.
3807 // FIXME: It's not clear whether we should use the driver's installed
3808 // directory ('Dir' below) or the ResourceDir.
3809 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003810 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003811
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003812 addPathIfExists(D, SysRoot + "/lib", Paths);
3813 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003814}
3815
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003816bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003817
Douglas Katzman95354292015-06-23 20:42:09 +00003818Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003819
3820Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003821 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003822}
3823
Simon Atanasyana0d89572013-10-05 14:37:55 +00003824std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003825 if (!getDriver().SysRoot.empty())
3826 return getDriver().SysRoot;
3827
3828 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3829 return std::string();
3830
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003831 // Standalone MIPS toolchains use different names for sysroot folder
3832 // and put it into different places. Here we try to check some known
3833 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003834
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003835 const StringRef InstallDir = GCCInstallation.getInstallPath();
3836 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003837 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003838
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003839 std::string Path =
3840 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3841 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003842
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003843 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003844 return Path;
3845
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003846 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003847
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003848 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003849 return Path;
3850
3851 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003852}
3853
Chandler Carrutha796f532011-11-05 20:17:13 +00003854void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3855 ArgStringList &CC1Args) const {
3856 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003857 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003858
3859 if (DriverArgs.hasArg(options::OPT_nostdinc))
3860 return;
3861
3862 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003863 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003864
3865 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003866 SmallString<128> P(D.ResourceDir);
3867 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003868 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003869 }
3870
3871 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3872 return;
3873
3874 // Check for configure-time C include directories.
3875 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3876 if (CIncludeDirs != "") {
3877 SmallVector<StringRef, 5> dirs;
3878 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003879 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003880 StringRef Prefix =
3881 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003882 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003883 }
3884 return;
3885 }
3886
3887 // Lacking those, try to detect the correct set of system includes for the
3888 // target triple.
3889
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003890 // Add include directories specific to the selected multilib set and multilib.
3891 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003892 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003893 if (Callback) {
3894 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3895 GCCInstallation.getTriple().str(),
3896 GCCInstallation.getMultilib());
3897 for (const auto &Path : IncludePaths)
3898 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3899 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003900 }
3901
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003902 // Implement generic Debian multiarch support.
3903 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003904 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003905
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003906 // FIXME: These are older forms of multiarch. It's not clear that they're
3907 // in use in any released version of Debian, so we should consider
3908 // removing them.
3909 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003910 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003911 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003912
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003913 // FIXME: These are older forms of multiarch. It's not clear that they're
3914 // in use in any released version of Debian, so we should consider
3915 // removing them.
3916 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3917 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003918 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003919 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003920 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003921 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003922 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003923 "/usr/include/arm-linux-gnueabihf"};
3924 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003925 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003926 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003927 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003928 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003929 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003930 "/usr/include/mips64el-linux-gnu",
3931 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003932 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003933 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003934 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003935 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003936 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003938 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003939 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003940 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003941 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003942 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3943 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003944 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003945 switch (getTriple().getArch()) {
3946 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003947 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003948 break;
3949 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003950 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003951 break;
3952 case llvm::Triple::aarch64:
3953 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003954 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003955 break;
3956 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003957 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3958 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3959 else
3960 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003961 break;
3962 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003963 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003964 break;
3965 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003966 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003967 break;
3968 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003969 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003970 break;
3971 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003972 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003973 break;
3974 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003975 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003976 break;
3977 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003978 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003979 break;
3980 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003981 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003982 break;
3983 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003984 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003985 break;
3986 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003987 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003988 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003989 case llvm::Triple::systemz:
3990 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3991 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003992 default:
3993 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003994 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003995 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003996 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003997 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003998 break;
3999 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004000 }
4001
4002 if (getTriple().getOS() == llvm::Triple::RTEMS)
4003 return;
4004
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004005 // Add an include of '/include' directly. This isn't provided by default by
4006 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4007 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004008 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004009
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004010 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004011}
4012
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004013
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004014static std::string DetectLibcxxIncludePath(StringRef base) {
4015 std::error_code EC;
4016 int MaxVersion = 0;
4017 std::string MaxVersionString = "";
4018 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4019 LI = LI.increment(EC)) {
4020 StringRef VersionText = llvm::sys::path::filename(LI->path());
4021 int Version;
4022 if (VersionText[0] == 'v' &&
4023 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4024 if (Version > MaxVersion) {
4025 MaxVersion = Version;
4026 MaxVersionString = VersionText;
4027 }
4028 }
4029 }
4030 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4031}
4032
Chandler Carrutha796f532011-11-05 20:17:13 +00004033void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4034 ArgStringList &CC1Args) const {
4035 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4036 DriverArgs.hasArg(options::OPT_nostdincxx))
4037 return;
4038
Chandler Carruthf4701732011-11-07 09:01:17 +00004039 // Check if libc++ has been enabled and provide its include paths if so.
4040 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004041 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004042 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004043
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004044 // We also check the system as for a long time this is the only place
4045 // Clang looked.
4046 // FIXME: We should really remove this. It doesn't make any sense.
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004047 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004048 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004049 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004050 continue;
4051 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004052 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004053 break;
4054 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004055 return;
4056 }
4057
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004058 // We need a detected GCC installation on Linux to provide libstdc++'s
4059 // headers. We handled the libc++ case above.
4060 if (!GCCInstallation.isValid())
4061 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004062
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004063 // By default, look for the C++ headers in an include directory adjacent to
4064 // the lib directory of the GCC installation. Note that this is expect to be
4065 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4066 StringRef LibDir = GCCInstallation.getParentLibPath();
4067 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004068 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004069 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004070 const std::string GCCMultiarchTriple = getMultiarchTriple(
4071 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004072 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004073 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004074 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004075
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004076 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004077 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004078 "/c++/" + Version.Text, TripleStr,
4079 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004080 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004081 return;
4082
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004083 // Otherwise, fall back on a bunch of options which don't use multiarch
4084 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004085 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004086 // Gentoo is weird and places its headers inside the GCC install,
4087 // so if the first attempt to find the headers fails, try these patterns.
4088 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4089 Version.MinorStr,
4090 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4091 // Android standalone toolchain has C++ headers in yet another place.
4092 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4093 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4094 // without a subdirectory corresponding to the gcc version.
4095 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004096 };
4097
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004098 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004099 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4100 /*GCCMultiarchTriple*/ "",
4101 /*TargetMultiarchTriple*/ "",
4102 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004103 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004104 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004105}
4106
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004107bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004108
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004109SanitizerMask Linux::getSupportedSanitizers() const {
4110 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4111 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4112 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4113 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004114 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4115 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004116 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4117 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004118 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4119 Res |= SanitizerKind::Address;
4120 Res |= SanitizerKind::KernelAddress;
4121 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004122 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004123 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004124 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004125 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004126 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00004127 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004128 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004129 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004130 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004131 if (IsX86 || IsX86_64) {
4132 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004133 }
4134 return Res;
4135}
4136
Xinliang David Li170cd102015-10-27 05:15:35 +00004137void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4138 llvm::opt::ArgStringList &CmdArgs) const {
4139 if (!needsProfileRT(Args)) return;
4140
4141 // Add linker option -u__llvm_runtime_variable to cause runtime
4142 // initialization module to be linked in.
4143 if (!Args.hasArg(options::OPT_coverage))
4144 CmdArgs.push_back(Args.MakeArgString(
4145 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4146 ToolChain::addProfileRTLibs(Args, CmdArgs);
4147}
4148
Daniel Dunbarcc912342009-05-02 18:28:39 +00004149/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4150
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004151DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4152 const ArgList &Args)
4153 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004154
4155 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004156 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004157 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004158 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004159
Daniel Dunbar083edf72009-12-21 18:54:17 +00004160 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004161 getFilePaths().push_back("/usr/lib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004162 if (D.getVFS().exists("/usr/lib/gcc47"))
John McCall65b8da02013-04-11 22:55:55 +00004163 getFilePaths().push_back("/usr/lib/gcc47");
4164 else
4165 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004166}
4167
Rafael Espindola7cf32212013-03-20 03:05:54 +00004168Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004169 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004170}
4171
4172Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004173 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004174}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004175
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004176/// Stub for CUDA toolchain. At the moment we don't have assembler or
4177/// linker and need toolchain mainly to propagate device-side options
4178/// to CC1.
4179
4180CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4181 const ArgList &Args)
4182 : Linux(D, Triple, Args) {}
4183
4184void
4185CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4186 llvm::opt::ArgStringList &CC1Args) const {
4187 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4188 CC1Args.push_back("-fcuda-is-device");
4189}
4190
4191llvm::opt::DerivedArgList *
4192CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4193 const char *BoundArch) const {
4194 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4195 const OptTable &Opts = getDriver().getOpts();
4196
4197 for (Arg *A : Args) {
4198 if (A->getOption().matches(options::OPT_Xarch__)) {
4199 // Skip this argument unless the architecture matches BoundArch
4200 if (A->getValue(0) != StringRef(BoundArch))
4201 continue;
4202
4203 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4204 unsigned Prev = Index;
4205 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4206
4207 // If the argument parsing failed or more than one argument was
4208 // consumed, the -Xarch_ argument's parameter tried to consume
4209 // extra arguments. Emit an error and ignore.
4210 //
4211 // We also want to disallow any options which would alter the
4212 // driver behavior; that isn't going to work in our model. We
4213 // use isDriverOption() as an approximation, although things
4214 // like -O4 are going to slip through.
4215 if (!XarchArg || Index > Prev + 1) {
4216 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4217 << A->getAsString(Args);
4218 continue;
4219 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4220 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4221 << A->getAsString(Args);
4222 continue;
4223 }
4224 XarchArg->setBaseArg(A);
4225 A = XarchArg.release();
4226 DAL->AddSynthesizedArg(A);
4227 }
4228 DAL->append(A);
4229 }
4230
4231 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
4232 return DAL;
4233}
4234
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004235/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004236XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4237 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004238 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004239 // ProgramPaths are found via 'PATH' environment variable.
4240}
4241
Douglas Katzman54366072015-07-27 16:53:08 +00004242Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004243 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004244}
4245
Douglas Katzman54366072015-07-27 16:53:08 +00004246Tool *XCoreToolChain::buildLinker() const {
4247 return new tools::XCore::Linker(*this);
4248}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004249
Douglas Katzman54366072015-07-27 16:53:08 +00004250bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004251
Douglas Katzman54366072015-07-27 16:53:08 +00004252bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004253
Douglas Katzman54366072015-07-27 16:53:08 +00004254bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004255
Douglas Katzman54366072015-07-27 16:53:08 +00004256bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004257
Douglas Katzman54366072015-07-27 16:53:08 +00004258bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004259
Douglas Katzman54366072015-07-27 16:53:08 +00004260void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4261 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004262 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4263 DriverArgs.hasArg(options::OPT_nostdlibinc))
4264 return;
4265 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4266 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004267 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004268 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4269 ArrayRef<StringRef> DirVec(Dirs);
4270 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4271 }
4272}
4273
Douglas Katzman54366072015-07-27 16:53:08 +00004274void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4275 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004276 CC1Args.push_back("-nostdsysteminc");
4277}
4278
Douglas Katzman54366072015-07-27 16:53:08 +00004279void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4280 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004281 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004282 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4283 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004284 return;
4285 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4286 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004287 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004288 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4289 ArrayRef<StringRef> DirVec(Dirs);
4290 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4291 }
4292}
4293
Douglas Katzman54366072015-07-27 16:53:08 +00004294void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4295 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004296 // We don't output any lib args. This is handled by xcc.
4297}
Douglas Katzman84a75642015-06-19 14:55:19 +00004298
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004299MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4300 const ArgList &Args)
4301 : Generic_GCC(D, Triple, Args) {
4302 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4303 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4304 // This won't work to find gcc. Instead we give the installation detector an
4305 // extra triple, which is preferable to further hacks of the logic that at
4306 // present is based solely on getArch(). In particular, it would be wrong to
4307 // choose the myriad installation when targeting a non-myriad sparc install.
4308 switch (Triple.getArch()) {
4309 default:
4310 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << "myriad";
4311 case llvm::Triple::sparc:
4312 case llvm::Triple::sparcel:
4313 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004314 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004315 }
4316}
4317
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004318MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004319
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004320void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4321 ArgStringList &CC1Args) const {
4322 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4323 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4324}
4325
James Y Knighta6c9ee72015-10-16 18:46:26 +00004326void MyriadToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4327 ArgStringList &CC1Args) const {
4328 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4329 DriverArgs.hasArg(options::OPT_nostdincxx))
4330 return;
4331
4332 // Only libstdc++, for now.
4333 StringRef LibDir = GCCInstallation.getParentLibPath();
4334 const GCCVersion &Version = GCCInstallation.getVersion();
4335 StringRef TripleStr = GCCInstallation.getTriple().str();
4336 const Multilib &Multilib = GCCInstallation.getMultilib();
4337
4338 addLibStdCXXIncludePaths(LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4339 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
4340}
4341
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004342// MyriadToolChain handles several triples:
4343// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4344Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4345 // The inherited method works fine if not targeting the SHAVE.
4346 if (!isShaveCompilation(getTriple()))
4347 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004348 switch (JA.getKind()) {
4349 case Action::CompileJobClass:
4350 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004351 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004352 return Compiler.get();
4353 case Action::AssembleJobClass:
4354 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004355 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004356 return Assembler.get();
4357 default:
4358 return ToolChain::getTool(JA.getKind());
4359 }
4360}
4361
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004362void MyriadToolChain::getCompilerSupportDir(std::string &Dir) const {
4363 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4364 // These files are tied to a particular version of gcc.
4365 SmallString<128> Result(GCCInstallation.getInstallPath());
4366 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4367 // but as this toolchain is for LEON sparc, it can assume FPU.
4368 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4369 llvm::sys::path::append(Result, "le");
4370 Dir.assign(Result.str());
4371}
4372void MyriadToolChain::getBuiltinLibDir(std::string &Dir) const {
4373 // The contents of LibDir are independent of the version of gcc.
4374 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4375 SmallString<128> Result(GCCInstallation.getParentLibPath());
4376 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4377 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib/le");
4378 else
4379 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib");
4380 Dir.assign(Result.str());
Douglas Katzman84a75642015-06-19 14:55:19 +00004381}
4382
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004383Tool *MyriadToolChain::buildLinker() const {
4384 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004385}
Dan Gohmanc2853072015-09-03 22:51:53 +00004386
4387bool WebAssembly::IsMathErrnoDefault() const { return false; }
4388
4389bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4390
4391bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4392
4393bool WebAssembly::isPICDefault() const { return false; }
4394
4395bool WebAssembly::isPIEDefault() const { return false; }
4396
4397bool WebAssembly::isPICDefaultForced() const { return false; }
4398
4399bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4400
4401// TODO: Support Objective C stuff.
4402bool WebAssembly::SupportsObjCGC() const { return false; }
4403
4404bool WebAssembly::hasBlocksRuntime() const { return false; }
4405
4406// TODO: Support profiling.
4407bool WebAssembly::SupportsProfiling() const { return false; }
4408
4409void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4410 ArgStringList &CC1Args) const {
4411 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4412 options::OPT_fno_use_init_array, true))
4413 CC1Args.push_back("-fuse-init-array");
4414}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004415
4416PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4417 : Generic_ELF(D, Triple, Args) {
4418 if (Args.hasArg(options::OPT_static))
4419 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4420
4421 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4422 // if it exists; otherwise use the driver's installation path, which
4423 // should be <SDK_DIR>/host_tools/bin.
4424
4425 SmallString<512> PS4SDKDir;
4426 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4427 if (!llvm::sys::fs::exists(EnvValue))
4428 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4429 PS4SDKDir = EnvValue;
4430 } else {
4431 PS4SDKDir = getDriver().Dir;
4432 llvm::sys::path::append(PS4SDKDir, "/../../");
4433 }
4434
4435 // By default, the driver won't report a warning if it can't find
4436 // PS4's include or lib directories. This behavior could be changed if
4437 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
4438 // If -isysroot was passed, use that as the SDK base path.
4439 std::string PrefixDir;
4440 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4441 PrefixDir = A->getValue();
4442 if (!llvm::sys::fs::exists(PrefixDir))
4443 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4444 } else
4445 PrefixDir = PS4SDKDir.str();
4446
4447 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4448 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4449 if (!Args.hasArg(options::OPT_nostdinc) &&
4450 !Args.hasArg(options::OPT_nostdlibinc) &&
4451 !Args.hasArg(options::OPT_isysroot) &&
4452 !Args.hasArg(options::OPT__sysroot_EQ) &&
4453 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4454 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4455 << "PS4 system headers" << PS4SDKIncludeDir;
4456 }
4457
4458 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4459 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4460 if (!Args.hasArg(options::OPT_nostdlib) &&
4461 !Args.hasArg(options::OPT_nodefaultlibs) &&
4462 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4463 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4464 !Args.hasArg(options::OPT_emit_ast) &&
4465 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4466 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4467 << "PS4 system libraries" << PS4SDKLibDir;
4468 return;
4469 }
4470 getFilePaths().push_back(PS4SDKLibDir.str());
4471}
4472
4473Tool *PS4CPU::buildAssembler() const {
4474 return new tools::PS4cpu::Assemble(*this);
4475}
4476
4477Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4478
4479bool PS4CPU::isPICDefault() const { return true; }
4480
4481bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4482
4483SanitizerMask PS4CPU::getSupportedSanitizers() const {
4484 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4485 Res |= SanitizerKind::Address;
4486 Res |= SanitizerKind::Vptr;
4487 return Res;
4488}