blob: 8485d0fe94515b41ac9dabc0e4854a2dfe6c3d36 [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");
Artem Belevich86017332015-11-17 22:28:55 +00001632 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.5");
Artem Belevich98607b62015-09-23 21:49:39 +00001633 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1634 }
1635
Benjamin Kramere8b76412015-09-24 14:48:37 +00001636 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001637 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001638 continue;
1639
1640 CudaInstallPath = CudaPath;
1641 CudaIncludePath = CudaInstallPath + "/include";
1642 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1643 CudaLibPath =
1644 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1645
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001646 if (!(D.getVFS().exists(CudaIncludePath) &&
1647 D.getVFS().exists(CudaLibPath) &&
1648 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001649 continue;
1650
Artem Belevich34f481a2015-11-17 22:28:50 +00001651 std::error_code EC;
1652 for (llvm::sys::fs::directory_iterator LI(CudaLibDevicePath, EC), LE;
1653 !EC && LI != LE; LI = LI.increment(EC)) {
1654 StringRef FilePath = LI->path();
1655 StringRef FileName = llvm::sys::path::filename(FilePath);
1656 // Process all bitcode filenames that look like libdevice.compute_XX.YY.bc
1657 const StringRef LibDeviceName = "libdevice.";
1658 if (!(FileName.startswith(LibDeviceName) && FileName.endswith(".bc")))
1659 continue;
1660 StringRef GpuArch = FileName.slice(
1661 LibDeviceName.size(), FileName.find('.', LibDeviceName.size()));
1662 CudaLibDeviceMap[GpuArch] = FilePath.str();
1663 // Insert map entries for specifc devices with this compute capability.
1664 if (GpuArch == "compute_20") {
1665 CudaLibDeviceMap["sm_20"] = FilePath;
1666 CudaLibDeviceMap["sm_21"] = FilePath;
1667 } else if (GpuArch == "compute_30") {
1668 CudaLibDeviceMap["sm_30"] = FilePath;
1669 CudaLibDeviceMap["sm_32"] = FilePath;
1670 } else if (GpuArch == "compute_35") {
1671 CudaLibDeviceMap["sm_35"] = FilePath;
1672 CudaLibDeviceMap["sm_37"] = FilePath;
1673 }
1674 }
1675
Artem Belevich98607b62015-09-23 21:49:39 +00001676 IsValid = true;
1677 break;
1678 }
1679}
1680
1681void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1682 if (isValid())
1683 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1684}
1685
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001686namespace {
1687// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001688class FilterNonExistent {
1689 StringRef Base;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001690 vfs::FileSystem &VFS;
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001691
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001692public:
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001693 FilterNonExistent(StringRef Base, vfs::FileSystem &VFS)
1694 : Base(Base), VFS(VFS) {}
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001695 bool operator()(const Multilib &M) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001696 return !VFS.exists(Base + M.gccSuffix() + "/crtbegin.o");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001697 }
1698};
1699} // end anonymous namespace
1700
1701static void addMultilibFlag(bool Enabled, const char *const Flag,
1702 std::vector<std::string> &Flags) {
1703 if (Enabled)
1704 Flags.push_back(std::string("+") + Flag);
1705 else
1706 Flags.push_back(std::string("-") + Flag);
1707}
1708
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001709static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001710 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1711 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1712}
1713
1714static bool isMips32(llvm::Triple::ArchType Arch) {
1715 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1716}
1717
1718static bool isMips64(llvm::Triple::ArchType Arch) {
1719 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1720}
1721
1722static bool isMipsEL(llvm::Triple::ArchType Arch) {
1723 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1724}
1725
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001726static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001727 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001728 return A && A->getOption().matches(options::OPT_mips16);
1729}
1730
1731static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001732 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001733 return A && A->getOption().matches(options::OPT_mmicromips);
1734}
1735
Benjamin Kramere003ca22015-10-28 13:54:16 +00001736namespace {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001737struct DetectedMultilibs {
1738 /// The set of multilibs that the detected installation supports.
1739 MultilibSet Multilibs;
1740
1741 /// The primary multilib appropriate for the given flags.
1742 Multilib SelectedMultilib;
1743
1744 /// On Biarch systems, this corresponds to the default multilib when
1745 /// targeting the non-default multilib. Otherwise, it is empty.
1746 llvm::Optional<Multilib> BiarchSibling;
1747};
Benjamin Kramere003ca22015-10-28 13:54:16 +00001748} // end anonymous namespace
Simon Atanasyan60280b42014-05-12 07:37:51 +00001749
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001750static Multilib makeMultilib(StringRef commonSuffix) {
1751 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1752}
1753
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001754static bool findMIPSMultilibs(const Driver &D, const llvm::Triple &TargetTriple,
1755 StringRef Path, const ArgList &Args,
1756 DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001757 // Some MIPS toolchains put libraries and object files compiled
1758 // using different options in to the sub-directoris which names
1759 // reflects the flags used for compilation. For example sysroot
1760 // directory might looks like the following examples:
1761 //
1762 // /usr
1763 // /lib <= crt*.o files compiled with '-mips32'
1764 // /mips16
1765 // /usr
1766 // /lib <= crt*.o files compiled with '-mips16'
1767 // /el
1768 // /usr
1769 // /lib <= crt*.o files compiled with '-mips16 -EL'
1770 //
1771 // or
1772 //
1773 // /usr
1774 // /lib <= crt*.o files compiled with '-mips32r2'
1775 // /mips16
1776 // /usr
1777 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1778 // /mips32
1779 // /usr
1780 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001781
Benjamin Kramerc5862f02015-10-09 13:03:18 +00001782 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001783
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001784 // Check for FSF toolchain multilibs
1785 MultilibSet FSFMipsMultilibs;
1786 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001787 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001788 .flag("+m32")
1789 .flag("-m64")
1790 .flag("-mmicromips")
1791 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001792
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001793 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001794 .flag("+m32")
1795 .flag("-m64")
1796 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001797
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001798 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001799 .flag("-m32")
1800 .flag("+m64")
1801 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001802
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001803 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1804 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001805
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001806 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001807 .flag("+m32")
1808 .flag("-m64")
1809 .flag("-mmicromips")
1810 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001811
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001812 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001813
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001814 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001815
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001816 auto MAbi64 =
1817 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001818
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001819 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001820
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001821 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001822
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001823 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001824
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001825 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001826
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001827 FSFMipsMultilibs =
1828 MultilibSet()
1829 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1830 MArchDefault)
1831 .Maybe(UCLibc)
1832 .Maybe(Mips16)
1833 .FilterOut("/mips64/mips16")
1834 .FilterOut("/mips64r2/mips16")
1835 .FilterOut("/micromips/mips16")
1836 .Maybe(MAbi64)
1837 .FilterOut("/micromips/64")
1838 .FilterOut("/mips32/64")
1839 .FilterOut("^/64")
1840 .FilterOut("/mips16/64")
1841 .Either(BigEndian, LittleEndian)
1842 .Maybe(SoftFloat)
1843 .Maybe(Nan2008)
1844 .FilterOut(".*sof/nan2008")
1845 .FilterOut(NonExistent)
1846 .setIncludeDirsCallback([](StringRef InstallDir,
1847 StringRef TripleStr, const Multilib &M) {
1848 std::vector<std::string> Dirs;
1849 Dirs.push_back((InstallDir + "/include").str());
1850 std::string SysRootInc =
1851 InstallDir.str() + "/../../../../sysroot";
1852 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1853 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1854 else
1855 Dirs.push_back(SysRootInc + "/usr/include");
1856 return Dirs;
1857 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001858 }
1859
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001860 // Check for Musl toolchain multilibs
1861 MultilibSet MuslMipsMultilibs;
1862 {
1863 auto MArchMipsR2 = makeMultilib("")
1864 .osSuffix("/mips-r2-hard-musl")
1865 .flag("+EB")
1866 .flag("-EL")
1867 .flag("+march=mips32r2");
1868
1869 auto MArchMipselR2 = makeMultilib("/mipsel-r2-hard-musl")
1870 .flag("-EB")
1871 .flag("+EL")
1872 .flag("+march=mips32r2");
1873
1874 MuslMipsMultilibs = MultilibSet().Either(MArchMipsR2, MArchMipselR2);
1875
1876 // Specify the callback that computes the include directories.
1877 MuslMipsMultilibs.setIncludeDirsCallback([](
1878 StringRef InstallDir, StringRef TripleStr, const Multilib &M) {
1879 std::vector<std::string> Dirs;
1880 Dirs.push_back(
1881 (InstallDir + "/../sysroot" + M.osSuffix() + "/usr/include").str());
1882 return Dirs;
1883 });
1884 }
1885
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001886 // Check for Code Sourcery toolchain multilibs
1887 MultilibSet CSMipsMultilibs;
1888 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001889 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001890
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001891 auto MArchMicroMips =
1892 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001893
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001894 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001895
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001896 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001897
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001899
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001900 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001901
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001902 auto DefaultFloat =
1903 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001904
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001905 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001906
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001907 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001908
1909 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001910 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001911 .gccSuffix("/64")
1912 .includeSuffix("/64")
1913 .flag("+mabi=n64")
1914 .flag("-mabi=n32")
1915 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001916
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001917 CSMipsMultilibs =
1918 MultilibSet()
1919 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1920 .Maybe(UCLibc)
1921 .Either(SoftFloat, Nan2008, DefaultFloat)
1922 .FilterOut("/micromips/nan2008")
1923 .FilterOut("/mips16/nan2008")
1924 .Either(BigEndian, LittleEndian)
1925 .Maybe(MAbi64)
1926 .FilterOut("/mips16.*/64")
1927 .FilterOut("/micromips.*/64")
1928 .FilterOut(NonExistent)
1929 .setIncludeDirsCallback([](StringRef InstallDir,
1930 StringRef TripleStr, const Multilib &M) {
1931 std::vector<std::string> Dirs;
1932 Dirs.push_back((InstallDir + "/include").str());
1933 std::string SysRootInc =
1934 InstallDir.str() + "/../../../../" + TripleStr.str();
1935 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1936 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1937 else
1938 Dirs.push_back(SysRootInc + "/libc/usr/include");
1939 return Dirs;
1940 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001941 }
1942
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001943 MultilibSet AndroidMipsMultilibs =
1944 MultilibSet()
1945 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1946 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1947 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001948
1949 MultilibSet DebianMipsMultilibs;
1950 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001951 Multilib MAbiN32 =
1952 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001953
1954 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001955 .gccSuffix("/64")
1956 .includeSuffix("/64")
1957 .flag("+m64")
1958 .flag("-m32")
1959 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001960
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001961 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001962
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001963 DebianMipsMultilibs =
1964 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001965 }
1966
Daniel Sanders2bf13662014-07-10 14:40:57 +00001967 MultilibSet ImgMultilibs;
1968 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001969 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001970
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001971 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001972
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001973 auto MAbi64 =
1974 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001975
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001976 ImgMultilibs =
1977 MultilibSet()
1978 .Maybe(Mips64r6)
1979 .Maybe(MAbi64)
1980 .Maybe(LittleEndian)
1981 .FilterOut(NonExistent)
1982 .setIncludeDirsCallback([](StringRef InstallDir,
1983 StringRef TripleStr, const Multilib &M) {
1984 std::vector<std::string> Dirs;
1985 Dirs.push_back((InstallDir + "/include").str());
1986 Dirs.push_back(
1987 (InstallDir + "/../../../../sysroot/usr/include").str());
1988 return Dirs;
1989 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001990 }
1991
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001992 StringRef CPUName;
1993 StringRef ABIName;
1994 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1995
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001996 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1997
1998 Multilib::flags_list Flags;
1999 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
2000 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
2001 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002002 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002003 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00002004 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002005 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00002006 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002007 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00002008 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
2009 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00002010 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002011 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00002012 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00002013 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
2014 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002015 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
2016 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002017 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002018 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002019 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00002020 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002021
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002022 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002023 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00002024 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2025 Result.Multilibs = AndroidMipsMultilibs;
2026 return true;
2027 }
2028 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002029 }
2030
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002031 if (TargetTriple.getVendor() == llvm::Triple::MipsTechnologies &&
2032 TargetTriple.getOS() == llvm::Triple::Linux &&
2033 TargetTriple.getEnvironment() == llvm::Triple::UnknownEnvironment) {
2034 if (MuslMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
2035 Result.Multilibs = MuslMipsMultilibs;
2036 return true;
2037 }
2038 return false;
2039 }
2040
Daniel Sanders2bf13662014-07-10 14:40:57 +00002041 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
2042 TargetTriple.getOS() == llvm::Triple::Linux &&
2043 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
2044 // Select mips-img-linux-gnu toolchain.
2045 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
2046 Result.Multilibs = ImgMultilibs;
2047 return true;
2048 }
2049 return false;
2050 }
2051
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002052 // Sort candidates. Toolchain that best meets the directories goes first.
2053 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002054 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
2055 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002056 std::sort(
2057 std::begin(candidates), std::end(candidates),
2058 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
2059 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00002060 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002061 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002062 Result.BiarchSibling = Multilib();
2063 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002064 return true;
2065 }
2066 }
2067
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00002068 {
2069 // Fallback to the regular toolchain-tree structure.
2070 Multilib Default;
2071 Result.Multilibs.push_back(Default);
2072 Result.Multilibs.FilterOut(NonExistent);
2073
2074 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
2075 Result.BiarchSibling = Multilib();
2076 return true;
2077 }
2078 }
2079
Simon Atanasyan738f85a2014-03-04 18:37:28 +00002080 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002081}
2082
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002083static bool findBiarchMultilibs(const Driver &D,
2084 const llvm::Triple &TargetTriple,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002085 StringRef Path, const ArgList &Args,
2086 bool NeedsBiarchSuffix,
2087 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002088 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
2089 // in what would normally be GCCInstallPath and put the 64-bit
2090 // libs in a subdirectory named 64. The simple logic we follow is that
2091 // *if* there is a subdirectory of the right name with crtbegin.o in it,
2092 // we use that. If not, and if not a biarch triple alias, we look for
2093 // crtbegin.o without the subdirectory.
2094
2095 Multilib Default;
2096 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002097 .gccSuffix("/64")
2098 .includeSuffix("/64")
2099 .flag("-m32")
2100 .flag("+m64")
2101 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002102 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002103 .gccSuffix("/32")
2104 .includeSuffix("/32")
2105 .flag("+m32")
2106 .flag("-m64")
2107 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00002108 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002109 .gccSuffix("/x32")
2110 .includeSuffix("/x32")
2111 .flag("-m32")
2112 .flag("-m64")
2113 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002114
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002115 FilterNonExistent NonExistent(Path, D.getVFS());
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002116
Zinovy Nis1db95732014-07-10 15:27:19 +00002117 // Determine default multilib from: 32, 64, x32
2118 // Also handle cases such as 64 on 32, 32 on 64, etc.
2119 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00002120 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00002121 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002122 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002123 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00002124 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002125 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00002126 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002127 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00002128 if (TargetTriple.isArch32Bit())
2129 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002130 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00002131 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002132 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002133 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00002134 }
2135
Zinovy Nis1db95732014-07-10 15:27:19 +00002136 if (Want == WANT32)
2137 Default.flag("+m32").flag("-m64").flag("-mx32");
2138 else if (Want == WANT64)
2139 Default.flag("-m32").flag("+m64").flag("-mx32");
2140 else if (Want == WANTX32)
2141 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002142 else
Zinovy Nis1db95732014-07-10 15:27:19 +00002143 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002144
Simon Atanasyan60280b42014-05-12 07:37:51 +00002145 Result.Multilibs.push_back(Default);
2146 Result.Multilibs.push_back(Alt64);
2147 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00002148 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002149
Simon Atanasyan60280b42014-05-12 07:37:51 +00002150 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002151
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002152 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002153 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002154 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00002155 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002156
Simon Atanasyan60280b42014-05-12 07:37:51 +00002157 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002158 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00002159
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002160 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00002161 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00002162 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002163
2164 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00002165}
2166
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002167void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
2168 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
2169 const std::string &LibDir, StringRef CandidateTriple,
2170 bool NeedsBiarchSuffix) {
2171 // Solaris is a special case. The GCC installation is under
2172 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
2173 // need to iterate twice.
2174 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002175 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
2176 !EC && LI != LE; LI = LI.increment(EC)) {
2177 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002178 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
2179
2180 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002181 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002182 continue; // Saw this path before; no need to look at it again.
2183 if (CandidateVersion.isOlderThan(4, 1, 1))
2184 continue;
2185 if (CandidateVersion <= Version)
2186 continue;
2187
2188 GCCInstallPath =
2189 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002190 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002191 continue;
2192
2193 // If we make it here there has to be at least one GCC version, let's just
2194 // use the latest one.
2195 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002196 for (vfs::directory_iterator
2197 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
2198 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002199 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
2200
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002201 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002202 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
2203
2204 if (CandidateSubVersion > Version)
2205 Version = CandidateSubVersion;
2206 }
2207
2208 GCCTriple.setTriple(CandidateTriple);
2209
2210 GCCInstallPath += "/" + Version.Text;
2211 GCCParentLibPath = GCCInstallPath + "/../../../../";
2212
2213 IsValid = true;
2214 }
2215}
2216
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002217void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002218 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002219 const std::string &LibDir, StringRef CandidateTriple,
2220 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002221 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002222 // There are various different suffixes involving the triple we
2223 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002224 // up to the lib directory. Specifically, the number of "up" steps
2225 // in the second half of each row is 1 + the number of path separators
2226 // in the first half.
2227 const std::string LibAndInstallSuffixes[][2] = {
2228 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2229
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002230 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002231 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2232
2233 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2234 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002235
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002236 // The Freescale PPC SDK has the gcc libraries in
2237 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002238 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002239
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002240 // Ubuntu has a strange mis-matched pair of triples that this happens to
2241 // match.
2242 // FIXME: It may be worthwhile to generalize this and look for a second
2243 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002244 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2245
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002246 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2247 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2248 NeedsBiarchSuffix);
2249 return;
2250 }
2251
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002252 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002253 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2254 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002255 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002256 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002257 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002258 for (vfs::directory_iterator
2259 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2260 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002261 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002262 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002263 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002264 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002265 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002266 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002267 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002268 continue;
2269 if (CandidateVersion <= Version)
2270 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002271
Simon Atanasyan60280b42014-05-12 07:37:51 +00002272 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002273
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002274 // Debian mips multilibs behave more like the rest of the biarch ones,
2275 // so handle them there
2276 if (isMipsArch(TargetArch)) {
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002277 if (!findMIPSMultilibs(D, TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002278 continue;
Benjamin Kramerc5862f02015-10-09 13:03:18 +00002279 } else if (!findBiarchMultilibs(D, TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002280 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002281 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002282 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002283
Simon Atanasyan60280b42014-05-12 07:37:51 +00002284 Multilibs = Detected.Multilibs;
2285 SelectedMultilib = Detected.SelectedMultilib;
2286 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002287 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002288 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002289 // FIXME: We hack together the directory name here instead of
2290 // using LI to ensure stable path separators across Windows and
2291 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002292 GCCInstallPath =
2293 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2294 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002295 IsValid = true;
2296 }
2297 }
2298}
2299
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002300Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002301 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002302 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002303 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002304 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002305 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002306}
2307
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002308Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002309
Rafael Espindola7cf32212013-03-20 03:05:54 +00002310Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002311 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002312 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002313 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002314 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002315 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002316 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002317 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002318 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002319 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002320 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002321 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002322 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002323}
2324
Rafael Espindola7cf32212013-03-20 03:05:54 +00002325Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002326 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002327}
2328
Douglas Katzman95354292015-06-23 20:42:09 +00002329Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002330
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002331void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2332 // Print the information about how we detected the GCC installation.
2333 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002334 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002335}
2336
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002337bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002338 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002339}
2340
David Majnemer17f448b2015-06-28 04:23:33 +00002341bool Generic_GCC::isPICDefault() const {
2342 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2343}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002344
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002345bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002346
David Majnemer17f448b2015-06-28 04:23:33 +00002347bool Generic_GCC::isPICDefaultForced() const {
2348 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2349}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002350
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002351bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002352 switch (getTriple().getArch()) {
2353 case llvm::Triple::x86:
2354 case llvm::Triple::x86_64:
2355 case llvm::Triple::aarch64:
2356 case llvm::Triple::aarch64_be:
2357 case llvm::Triple::arm:
2358 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002359 case llvm::Triple::bpfel:
2360 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002361 case llvm::Triple::thumb:
2362 case llvm::Triple::thumbeb:
2363 case llvm::Triple::ppc:
2364 case llvm::Triple::ppc64:
2365 case llvm::Triple::ppc64le:
2366 case llvm::Triple::sparc:
2367 case llvm::Triple::sparcel:
2368 case llvm::Triple::sparcv9:
2369 case llvm::Triple::systemz:
2370 return true;
2371 default:
2372 return false;
2373 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002374}
2375
James Y Knighta6c9ee72015-10-16 18:46:26 +00002376/// \brief Helper to add the variant paths of a libstdc++ installation.
2377bool Generic_GCC::addLibStdCXXIncludePaths(
2378 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
2379 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
2380 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2381 if (!getVFS().exists(Base + Suffix))
2382 return false;
2383
2384 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
2385
2386 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
2387 // that path exists or we have neither a GCC nor target multiarch triple, use
2388 // this vanilla search path.
2389 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
2390 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
2391 addSystemInclude(DriverArgs, CC1Args,
2392 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
2393 } else {
2394 // Otherwise try to use multiarch naming schemes which have normalized the
2395 // triples and put the triple before the suffix.
2396 //
2397 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
2398 // the target triple, so we support that here.
2399 addSystemInclude(DriverArgs, CC1Args,
2400 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
2401 addSystemInclude(DriverArgs, CC1Args,
2402 Base + "/" + TargetMultiarchTriple + Suffix);
2403 }
2404
2405 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
2406 return true;
2407}
2408
2409
Kristof Beylsfb387292014-01-10 13:44:34 +00002410void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2411 ArgStringList &CC1Args) const {
2412 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002413 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002414 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002415 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002416 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002417 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002418 getTriple().getOS() == llvm::Triple::NaCl ||
2419 (getTriple().getVendor() == llvm::Triple::MipsTechnologies &&
2420 !getTriple().hasEnvironment());
Kristof Beylsfb387292014-01-10 13:44:34 +00002421
2422 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002423 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002424 CC1Args.push_back("-fuse-init-array");
2425}
2426
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002427/// Mips Toolchain
2428MipsLLVMToolChain::MipsLLVMToolChain(const Driver &D,
2429 const llvm::Triple &Triple,
2430 const ArgList &Args)
2431 : Linux(D, Triple, Args) {
2432 // Select the correct multilib according to the given arguments.
2433 DetectedMultilibs Result;
2434 findMIPSMultilibs(D, Triple, "", Args, Result);
2435 Multilibs = Result.Multilibs;
2436 SelectedMultilib = Result.SelectedMultilib;
2437
2438 // Find out the library suffix based on the ABI.
2439 LibSuffix = tools::mips::getMipsABILibSuffix(Args, Triple);
2440 getFilePaths().clear();
2441 getFilePaths().push_back(computeSysRoot() + "/usr/lib" + LibSuffix);
2442
2443 // Use LLD by default.
2444 if (!Args.getLastArg(options::OPT_fuse_ld_EQ))
2445 Linker = GetProgramPath("lld");
2446}
2447
2448void MipsLLVMToolChain::AddClangSystemIncludeArgs(
2449 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2450 if (DriverArgs.hasArg(options::OPT_nostdinc))
2451 return;
2452
2453 const Driver &D = getDriver();
2454
2455 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2456 SmallString<128> P(D.ResourceDir);
2457 llvm::sys::path::append(P, "include");
2458 addSystemInclude(DriverArgs, CC1Args, P);
2459 }
2460
2461 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2462 return;
2463
2464 const auto &Callback = Multilibs.includeDirsCallback();
2465 if (Callback) {
2466 const auto IncludePaths =
2467 Callback(D.getInstalledDir(), getTripleString(), SelectedMultilib);
2468 for (const auto &Path : IncludePaths)
2469 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
2470 }
2471}
2472
2473Tool *MipsLLVMToolChain::buildLinker() const {
2474 return new tools::gnutools::Linker(*this);
2475}
2476
2477std::string MipsLLVMToolChain::computeSysRoot() const {
2478 if (!getDriver().SysRoot.empty())
2479 return getDriver().SysRoot + SelectedMultilib.osSuffix();
2480
2481 const std::string InstalledDir(getDriver().getInstalledDir());
2482 std::string SysRootPath =
2483 InstalledDir + "/../sysroot" + SelectedMultilib.osSuffix();
2484 if (llvm::sys::fs::exists(SysRootPath))
2485 return SysRootPath;
2486
2487 return std::string();
2488}
2489
2490ToolChain::CXXStdlibType
2491MipsLLVMToolChain::GetCXXStdlibType(const ArgList &Args) const {
2492 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2493 if (A) {
2494 StringRef Value = A->getValue();
2495 if (Value != "libc++")
2496 getDriver().Diag(diag::err_drv_invalid_stdlib_name)
2497 << A->getAsString(Args);
2498 }
2499
2500 return ToolChain::CST_Libcxx;
2501}
2502
2503void MipsLLVMToolChain::AddClangCXXStdlibIncludeArgs(
2504 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
2505 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2506 DriverArgs.hasArg(options::OPT_nostdincxx))
2507 return;
2508
2509 assert((GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) &&
2510 "Only -lc++ (aka libcxx) is suported in this toolchain.");
2511
2512 const auto &Callback = Multilibs.includeDirsCallback();
2513 if (Callback) {
2514 const auto IncludePaths = Callback(getDriver().getInstalledDir(),
2515 getTripleString(), SelectedMultilib);
2516 for (const auto &Path : IncludePaths) {
2517 if (llvm::sys::fs::exists(Path + "/c++/v1")) {
2518 addSystemInclude(DriverArgs, CC1Args, Path + "/c++/v1");
2519 break;
2520 }
2521 }
2522 }
2523}
2524
2525void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2526 ArgStringList &CmdArgs) const {
2527 assert((GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) &&
2528 "Only -lc++ (aka libxx) is suported in this toolchain.");
2529
2530 CmdArgs.push_back("-lc++");
2531 CmdArgs.push_back("-lc++abi");
2532 CmdArgs.push_back("-lunwind");
2533}
2534
2535std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
2536 StringRef Component,
2537 bool Shared) const {
2538 SmallString<128> Path(getDriver().ResourceDir);
2539 llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
2540 getOS());
2541 llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
Vasileios Kalintirisbbc99302015-11-16 15:41:30 +00002542 "mips" + (Shared ? ".so" : ".a")));
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00002543 return Path.str();
2544}
2545
Tony Linthicum76329bf2011-12-12 21:14:55 +00002546/// Hexagon Toolchain
2547
Douglas Katzman54366072015-07-27 16:53:08 +00002548std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002549 const ArgList &Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002550 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002551 std::string GccToolchain = getGCCToolchainDir(Args);
2552
2553 if (!GccToolchain.empty())
2554 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002555
2556 std::string InstallRelDir = InstalledDir + "/../../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002557 if (getVFS().exists(InstallRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002558 return InstallRelDir;
2559
2560 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002561 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002562 return PrefixRelDir;
2563
2564 return InstallRelDir;
2565}
2566
Douglas Katzman54366072015-07-27 16:53:08 +00002567const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002568 Arg *A;
2569
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002570 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002571 options::OPT_msmall_data_threshold_EQ);
2572 if (A)
2573 return A->getValue();
2574
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002575 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002576 options::OPT_fPIC);
2577 if (A)
2578 return "0";
2579
Hans Wennborgdcfba332015-10-06 23:40:43 +00002580 return nullptr;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002581}
2582
Douglas Katzman54366072015-07-27 16:53:08 +00002583bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002584 return smallDataThreshold && smallDataThreshold[0] == '0';
2585}
2586
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002587static void GetHexagonLibraryPaths(const HexagonToolChain &TC,
2588 const ArgList &Args, const std::string &Ver,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002589 const std::string &MarchString,
2590 const std::string &InstalledDir,
2591 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002592 bool buildingLib = Args.hasArg(options::OPT_shared);
2593
2594 //----------------------------------------------------------------------------
2595 // -L Args
2596 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002597 for (Arg *A : Args.filtered(options::OPT_L))
2598 for (const char *Value : A->getValues())
2599 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002600
2601 //----------------------------------------------------------------------------
2602 // Other standard paths
2603 //----------------------------------------------------------------------------
2604 const std::string MarchSuffix = "/" + MarchString;
2605 const std::string G0Suffix = "/G0";
2606 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002607 const std::string RootDir = TC.GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002608
2609 // lib/gcc/hexagon/...
2610 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2611 if (buildingLib) {
2612 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2613 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2614 }
2615 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2616 LibPaths->push_back(LibGCCHexagonDir + Ver);
2617
2618 // lib/gcc/...
2619 LibPaths->push_back(RootDir + "lib/gcc");
2620
2621 // hexagon/lib/...
2622 std::string HexagonLibDir = RootDir + "hexagon/lib";
2623 if (buildingLib) {
2624 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2625 LibPaths->push_back(HexagonLibDir + G0Suffix);
2626 }
2627 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2628 LibPaths->push_back(HexagonLibDir);
2629}
2630
Douglas Katzman54366072015-07-27 16:53:08 +00002631HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2632 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002633 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002634 const std::string InstalledDir(getDriver().getInstalledDir());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002635 const std::string GnuDir = GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002636
2637 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2638 // program paths
2639 const std::string BinDir(GnuDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002640 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002641 getProgramPaths().push_back(BinDir);
2642
2643 // Determine version of GCC libraries and headers to use.
2644 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002645 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002646 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002647 for (vfs::directory_iterator di = D.getVFS().dir_begin(HexagonDir, ec), de;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002648 !ec && di != de; di = di.increment(ec)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002649 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->getName()));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002650 if (MaxVersion < cv)
2651 MaxVersion = cv;
2652 }
2653 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002654
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002655 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002656
2657 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2658 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2659 // support 'linux' we'll need to fix this up
2660 LibPaths->clear();
2661
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002662 GetHexagonLibraryPaths(*this, Args, GetGCCLibAndIncVersion(),
2663 GetTargetCPU(Args), InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002664}
2665
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002666HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002667
Douglas Katzman54366072015-07-27 16:53:08 +00002668Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002669 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002670}
2671
Douglas Katzman54366072015-07-27 16:53:08 +00002672Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002673 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002674}
2675
Douglas Katzman54366072015-07-27 16:53:08 +00002676void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2677 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002678 const Driver &D = getDriver();
2679
2680 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2681 DriverArgs.hasArg(options::OPT_nostdlibinc))
2682 return;
2683
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002684 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002685 std::string GnuDir = GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002686 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2687 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2688 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2689 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002690}
2691
Douglas Katzman54366072015-07-27 16:53:08 +00002692void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2693 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002694 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2695 DriverArgs.hasArg(options::OPT_nostdincxx))
2696 return;
2697
2698 const Driver &D = getDriver();
2699 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002700 SmallString<128> IncludeDir(GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002701
Rafael Espindola358256c2013-06-26 02:13:00 +00002702 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2703 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002704 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002705}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002706
Matthew Curtise689b052012-12-06 15:46:07 +00002707ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002708HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002709 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2710 if (!A)
2711 return ToolChain::CST_Libstdcxx;
2712
2713 StringRef Value = A->getValue();
2714 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002715 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002716 }
2717
2718 return ToolChain::CST_Libstdcxx;
2719}
2720
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002721static int getHexagonVersion(const ArgList &Args) {
2722 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2723 // Select the default CPU (v4) if none was given.
2724 if (!A)
2725 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002726
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002727 // FIXME: produce errors if we cannot parse the version.
2728 StringRef WhichHexagon = A->getValue();
2729 if (WhichHexagon.startswith("hexagonv")) {
2730 int Val;
2731 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2732 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002733 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002734 if (WhichHexagon.startswith("v")) {
2735 int Val;
2736 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2737 return Val;
2738 }
2739
2740 // FIXME: should probably be an error.
2741 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002742}
2743
Douglas Katzman54366072015-07-27 16:53:08 +00002744StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002745 int V = getHexagonVersion(Args);
2746 // FIXME: We don't support versions < 4. We should error on them.
2747 switch (V) {
2748 default:
2749 llvm_unreachable("Unexpected version");
2750 case 5:
2751 return "v5";
2752 case 4:
2753 return "v4";
2754 case 3:
2755 return "v3";
2756 case 2:
2757 return "v2";
2758 case 1:
2759 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002760 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002761}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002762// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002763
Tom Stellard8fa33092015-07-18 01:49:05 +00002764/// AMDGPU Toolchain
2765AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2766 const ArgList &Args)
2767 : Generic_ELF(D, Triple, Args) { }
2768
2769Tool *AMDGPUToolChain::buildLinker() const {
2770 return new tools::amdgpu::Linker(*this);
2771}
2772// End AMDGPU
2773
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002774/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002775NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2776 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002777 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002778
2779 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2780 // default paths, and must instead only use the paths provided
2781 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002782 path_list &file_paths = getFilePaths();
2783 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002784
2785 file_paths.clear();
2786 prog_paths.clear();
2787
2788 // Path for library files (libc.a, ...)
2789 std::string FilePath(getDriver().Dir + "/../");
2790
2791 // Path for tools (clang, ld, etc..)
2792 std::string ProgPath(getDriver().Dir + "/../");
2793
2794 // Path for toolchain libraries (libgcc.a, ...)
2795 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2796
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002797 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002798 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002799 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002800 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002801 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2802 file_paths.push_back(ToolPath + "i686-nacl");
2803 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002804 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002805 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2806 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2807 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2808 file_paths.push_back(ToolPath + "x86_64-nacl");
2809 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002810 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002811 file_paths.push_back(FilePath + "arm-nacl/lib");
2812 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2813 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2814 file_paths.push_back(ToolPath + "arm-nacl");
2815 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002816 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002817 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2818 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2819 prog_paths.push_back(ProgPath + "bin");
2820 file_paths.push_back(ToolPath + "mipsel-nacl");
2821 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002822 default:
2823 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002824 }
2825
2826 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002827 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002828 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2829}
2830
Douglas Katzman54366072015-07-27 16:53:08 +00002831void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2832 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002833 const Driver &D = getDriver();
2834 if (DriverArgs.hasArg(options::OPT_nostdinc))
2835 return;
2836
2837 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2838 SmallString<128> P(D.ResourceDir);
2839 llvm::sys::path::append(P, "include");
2840 addSystemInclude(DriverArgs, CC1Args, P.str());
2841 }
2842
2843 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2844 return;
2845
2846 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002847 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002848 case llvm::Triple::x86:
2849 // x86 is special because multilib style uses x86_64-nacl/include for libc
2850 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2851 // have the same substring.
2852 llvm::sys::path::append(P, "i686-nacl/usr/include");
2853 addSystemInclude(DriverArgs, CC1Args, P.str());
2854 llvm::sys::path::remove_filename(P);
2855 llvm::sys::path::remove_filename(P);
2856 llvm::sys::path::remove_filename(P);
2857 llvm::sys::path::append(P, "x86_64-nacl/include");
2858 addSystemInclude(DriverArgs, CC1Args, P.str());
2859 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002860 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002861 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002862 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002863 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002864 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002865 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002866 case llvm::Triple::mipsel:
2867 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2868 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002869 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002870 return;
2871 }
2872
2873 addSystemInclude(DriverArgs, CC1Args, P.str());
2874 llvm::sys::path::remove_filename(P);
2875 llvm::sys::path::remove_filename(P);
2876 llvm::sys::path::append(P, "include");
2877 addSystemInclude(DriverArgs, CC1Args, P.str());
2878}
2879
Douglas Katzman54366072015-07-27 16:53:08 +00002880void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2881 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002882 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2883 // if the value is libc++, and emits an error for other values.
2884 GetCXXStdlibType(Args);
2885 CmdArgs.push_back("-lc++");
2886}
2887
Douglas Katzman54366072015-07-27 16:53:08 +00002888void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2889 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002890 const Driver &D = getDriver();
2891 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2892 DriverArgs.hasArg(options::OPT_nostdincxx))
2893 return;
2894
2895 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2896 // if the value is libc++, and emits an error for other values.
2897 GetCXXStdlibType(DriverArgs);
2898
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002899 SmallString<128> P(D.Dir + "/../");
2900 switch (getTriple().getArch()) {
2901 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002902 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2903 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002904 break;
2905 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002906 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2907 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002908 break;
2909 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002910 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2911 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002912 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002913 case llvm::Triple::mipsel:
2914 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2915 addSystemInclude(DriverArgs, CC1Args, P.str());
2916 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002917 default:
2918 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002919 }
2920}
2921
Douglas Katzman54366072015-07-27 16:53:08 +00002922ToolChain::CXXStdlibType
2923NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002924 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2925 StringRef Value = A->getValue();
2926 if (Value == "libc++")
2927 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002928 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002929 }
2930
2931 return ToolChain::CST_Libcxx;
2932}
2933
Douglas Katzman54366072015-07-27 16:53:08 +00002934std::string
2935NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2936 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002937 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2938 if (TheTriple.getArch() == llvm::Triple::arm &&
2939 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2940 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2941 return TheTriple.getTriple();
2942}
2943
Douglas Katzman54366072015-07-27 16:53:08 +00002944Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002945 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002946}
2947
Douglas Katzman54366072015-07-27 16:53:08 +00002948Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002949 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002950 return new tools::nacltools::AssemblerARM(*this);
2951 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002952}
2953// End NaCl
2954
Chris Lattner09797542010-03-04 21:07:38 +00002955/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2956/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2957/// Currently does not support anything else but compilation.
2958
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002959TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002960 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002961 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002962 // Path mangling to find libexec
2963 std::string Path(getDriver().Dir);
2964
2965 Path += "/../libexec";
2966 getProgramPaths().push_back(Path);
2967}
2968
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00002969TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002970
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002971bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002972
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002973bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002974
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002975bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002976
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002977bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002978
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002979// CloudABI - CloudABI tool chain which can call ld(1) directly.
2980
2981CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2982 const ArgList &Args)
2983 : Generic_ELF(D, Triple, Args) {
2984 SmallString<128> P(getDriver().Dir);
2985 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2986 getFilePaths().push_back(P.str());
2987}
2988
2989void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2990 ArgStringList &CC1Args) const {
2991 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2992 DriverArgs.hasArg(options::OPT_nostdincxx))
2993 return;
2994
2995 SmallString<128> P(getDriver().Dir);
2996 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2997 addSystemInclude(DriverArgs, CC1Args, P.str());
2998}
2999
3000void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
3001 ArgStringList &CmdArgs) const {
3002 CmdArgs.push_back("-lc++");
3003 CmdArgs.push_back("-lc++abi");
3004 CmdArgs.push_back("-lunwind");
3005}
3006
Douglas Katzman95354292015-06-23 20:42:09 +00003007Tool *CloudABI::buildLinker() const {
3008 return new tools::cloudabi::Linker(*this);
3009}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00003010
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003011/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
3012
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003013OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
3014 const ArgList &Args)
3015 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00003016 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003017 getFilePaths().push_back("/usr/lib");
3018}
3019
Rafael Espindola7cf32212013-03-20 03:05:54 +00003020Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003021 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003022}
3023
Douglas Katzman95354292015-06-23 20:42:09 +00003024Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00003025
Eli Friedman9fa28852012-08-08 23:57:20 +00003026/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
3027
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003028Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3029 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00003030 getFilePaths().push_back(getDriver().Dir + "/../lib");
3031 getFilePaths().push_back("/usr/lib");
3032}
3033
Rafael Espindola7cf32212013-03-20 03:05:54 +00003034Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003035 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003036}
3037
Douglas Katzman95354292015-06-23 20:42:09 +00003038Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00003039
Douglas Katzman95354292015-06-23 20:42:09 +00003040ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00003041 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3042 StringRef Value = A->getValue();
3043 if (Value == "libstdc++")
3044 return ToolChain::CST_Libstdcxx;
3045 if (Value == "libc++")
3046 return ToolChain::CST_Libcxx;
3047
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003048 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00003049 }
3050 return ToolChain::CST_Libcxx;
3051}
3052
Eli Friedman9fa28852012-08-08 23:57:20 +00003053void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3054 ArgStringList &CC1Args) const {
3055 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3056 DriverArgs.hasArg(options::OPT_nostdincxx))
3057 return;
3058
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003059 switch (GetCXXStdlibType(DriverArgs)) {
3060 case ToolChain::CST_Libcxx:
3061 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00003062 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003063 break;
3064 case ToolChain::CST_Libstdcxx:
3065 addSystemInclude(DriverArgs, CC1Args,
3066 getDriver().SysRoot + "/usr/include/c++/stdc++");
3067 addSystemInclude(DriverArgs, CC1Args,
3068 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00003069
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003070 StringRef Triple = getTriple().str();
3071 if (Triple.startswith("amd64"))
3072 addSystemInclude(DriverArgs, CC1Args,
3073 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003074 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003075 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003076 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
3077 "/usr/include/c++/stdc++/" +
3078 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003079 break;
3080 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003081}
3082
3083void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
3084 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003085 switch (GetCXXStdlibType(Args)) {
3086 case ToolChain::CST_Libcxx:
3087 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00003088 CmdArgs.push_back("-lc++abi");
3089 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00003090 break;
3091 case ToolChain::CST_Libstdcxx:
3092 CmdArgs.push_back("-lstdc++");
3093 break;
3094 }
Eli Friedman9fa28852012-08-08 23:57:20 +00003095}
3096
Daniel Dunbare24297c2009-03-30 21:06:03 +00003097/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
3098
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003099FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
3100 const ArgList &Args)
3101 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00003102
Chandler Carruth0b1756b2012-01-26 01:35:15 +00003103 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
3104 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003105 if ((Triple.getArch() == llvm::Triple::x86 ||
3106 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003107 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00003108 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
3109 else
3110 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00003111}
3112
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003113ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00003114 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3115 StringRef Value = A->getValue();
3116 if (Value == "libstdc++")
3117 return ToolChain::CST_Libstdcxx;
3118 if (Value == "libc++")
3119 return ToolChain::CST_Libcxx;
3120
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003121 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00003122 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003123 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00003124 return ToolChain::CST_Libcxx;
3125 return ToolChain::CST_Libstdcxx;
3126}
3127
3128void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3129 ArgStringList &CC1Args) const {
3130 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3131 DriverArgs.hasArg(options::OPT_nostdincxx))
3132 return;
3133
3134 switch (GetCXXStdlibType(DriverArgs)) {
3135 case ToolChain::CST_Libcxx:
3136 addSystemInclude(DriverArgs, CC1Args,
3137 getDriver().SysRoot + "/usr/include/c++/v1");
3138 break;
3139 case ToolChain::CST_Libstdcxx:
3140 addSystemInclude(DriverArgs, CC1Args,
3141 getDriver().SysRoot + "/usr/include/c++/4.2");
3142 addSystemInclude(DriverArgs, CC1Args,
3143 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
3144 break;
3145 }
3146}
3147
Rafael Espindola7cf32212013-03-20 03:05:54 +00003148Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003149 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003150}
3151
Douglas Katzman95354292015-06-23 20:42:09 +00003152Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00003153
Tim Northovere931f9f2015-10-30 16:30:41 +00003154bool FreeBSD::UseSjLjExceptions(const ArgList &Args) const {
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003155 // FreeBSD uses SjLj exceptions on ARM oabi.
3156 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00003157 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00003158 case llvm::Triple::GNUEABI:
3159 case llvm::Triple::EABI:
3160 return false;
3161
3162 default:
3163 return (getTriple().getArch() == llvm::Triple::arm ||
3164 getTriple().getArch() == llvm::Triple::thumb);
3165 }
3166}
3167
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003168bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003169
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003170bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00003171
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003172SanitizerMask FreeBSD::getSupportedSanitizers() const {
3173 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3174 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3175 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3176 getTriple().getArch() == llvm::Triple::mips64el;
3177 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3178 Res |= SanitizerKind::Address;
3179 Res |= SanitizerKind::Vptr;
3180 if (IsX86_64 || IsMIPS64) {
3181 Res |= SanitizerKind::Leak;
3182 Res |= SanitizerKind::Thread;
3183 }
3184 if (IsX86 || IsX86_64) {
3185 Res |= SanitizerKind::SafeStack;
3186 }
3187 return Res;
3188}
3189
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003190/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
3191
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003192NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3193 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003194
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003195 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003196 // When targeting a 32-bit platform, try the special directory used on
3197 // 64-bit hosts, and only fall back to the main library directory if that
3198 // doesn't work.
3199 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
3200 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003201 switch (Triple.getArch()) {
3202 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00003203 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003204 break;
3205 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003206 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003207 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00003208 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003209 switch (Triple.getEnvironment()) {
3210 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003211 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003212 getFilePaths().push_back("=/usr/lib/eabi");
3213 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00003214 case llvm::Triple::EABIHF:
3215 case llvm::Triple::GNUEABIHF:
3216 getFilePaths().push_back("=/usr/lib/eabihf");
3217 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003218 default:
3219 getFilePaths().push_back("=/usr/lib/oabi");
3220 break;
3221 }
3222 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003223 case llvm::Triple::mips64:
3224 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003225 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003226 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003227 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00003228 getFilePaths().push_back("=/usr/lib/64");
3229 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003230 case llvm::Triple::ppc:
3231 getFilePaths().push_back("=/usr/lib/powerpc");
3232 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00003233 case llvm::Triple::sparc:
3234 getFilePaths().push_back("=/usr/lib/sparc");
3235 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00003236 default:
3237 break;
3238 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00003239
3240 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003241 }
3242}
3243
Rafael Espindola7cf32212013-03-20 03:05:54 +00003244Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003245 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003246}
3247
Douglas Katzman95354292015-06-23 20:42:09 +00003248Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00003249
Douglas Katzman95354292015-06-23 20:42:09 +00003250ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003251 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
3252 StringRef Value = A->getValue();
3253 if (Value == "libstdc++")
3254 return ToolChain::CST_Libstdcxx;
3255 if (Value == "libc++")
3256 return ToolChain::CST_Libcxx;
3257
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003258 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003259 }
3260
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003261 unsigned Major, Minor, Micro;
3262 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003263 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003264 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00003265 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00003266 case llvm::Triple::arm:
3267 case llvm::Triple::armeb:
3268 case llvm::Triple::thumb:
3269 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00003270 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00003271 case llvm::Triple::ppc64:
3272 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003273 case llvm::Triple::x86:
3274 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003275 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00003276 default:
3277 break;
3278 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00003279 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00003280 return ToolChain::CST_Libstdcxx;
3281}
3282
3283void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3284 ArgStringList &CC1Args) const {
3285 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3286 DriverArgs.hasArg(options::OPT_nostdincxx))
3287 return;
3288
3289 switch (GetCXXStdlibType(DriverArgs)) {
3290 case ToolChain::CST_Libcxx:
3291 addSystemInclude(DriverArgs, CC1Args,
3292 getDriver().SysRoot + "/usr/include/c++/");
3293 break;
3294 case ToolChain::CST_Libstdcxx:
3295 addSystemInclude(DriverArgs, CC1Args,
3296 getDriver().SysRoot + "/usr/include/g++");
3297 addSystemInclude(DriverArgs, CC1Args,
3298 getDriver().SysRoot + "/usr/include/g++/backward");
3299 break;
3300 }
3301}
3302
Chris Lattner3e2ee142010-07-07 16:01:42 +00003303/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
3304
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003305Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
3306 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00003307 getFilePaths().push_back(getDriver().Dir + "/../lib");
3308 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00003309}
3310
Rafael Espindola7cf32212013-03-20 03:05:54 +00003311Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003312 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003313}
3314
Douglas Katzman95354292015-06-23 20:42:09 +00003315Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00003316
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003317static void addPathIfExists(const Driver &D, const Twine &Path,
3318 ToolChain::path_list &Paths) {
3319 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003320 Paths.push_back(Path.str());
3321}
3322
David Chisnallf571cde2012-02-15 13:39:01 +00003323/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
3324
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003325Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00003326 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003327 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00003328
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003329 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00003330
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003331 path_list &Paths = getFilePaths();
3332 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003333 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003334
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003335 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003336 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003337 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003338
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003339 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00003340
3341 std::string LibPath = "/usr/lib/";
3342 switch (Triple.getArch()) {
3343 case llvm::Triple::x86:
3344 case llvm::Triple::sparc:
3345 break;
3346 case llvm::Triple::x86_64:
3347 LibPath += "amd64/";
3348 break;
3349 case llvm::Triple::sparcv9:
3350 LibPath += "sparcv9/";
3351 break;
3352 default:
3353 llvm_unreachable("Unsupported architecture");
3354 }
3355
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003356 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00003357}
3358
Rafael Espindola7cf32212013-03-20 03:05:54 +00003359Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003360 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003361}
3362
Douglas Katzman95354292015-06-23 20:42:09 +00003363Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003364
Rafael Espindolad5117262015-09-09 13:36:00 +00003365void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3366 ArgStringList &CC1Args) const {
3367 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3368 DriverArgs.hasArg(options::OPT_nostdincxx))
3369 return;
3370
3371 // Include the support directory for things like xlocale and fudged system
3372 // headers.
3373 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3374
3375 if (GCCInstallation.isValid()) {
3376 GCCVersion Version = GCCInstallation.getVersion();
3377 addSystemInclude(DriverArgs, CC1Args,
3378 getDriver().SysRoot + "/usr/gcc/" +
3379 Version.MajorStr + "." +
3380 Version.MinorStr +
3381 "/include/c++/" + Version.Text);
3382 addSystemInclude(DriverArgs, CC1Args,
3383 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3384 "." + Version.MinorStr + "/include/c++/" +
3385 Version.Text + "/" +
3386 GCCInstallation.getTriple().str());
3387 }
3388}
3389
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003390/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003391
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003392enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003393 // NB: Releases of a particular Linux distro should be kept together
3394 // in this enum, because some tests are done by integer comparison against
3395 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003396 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003397 DebianLenny,
3398 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003399 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003400 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003401 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003402 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003403 RHEL4,
3404 RHEL5,
3405 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003406 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003407 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003408 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003409 UbuntuHardy,
3410 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003411 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003412 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003413 UbuntuLucid,
3414 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003415 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003416 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003417 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003418 UbuntuQuantal,
3419 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003420 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003421 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003422 UbuntuUtopic,
3423 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003424 UbuntuWily,
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003425 UbuntuXenial,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003426 UnknownDistro
3427};
3428
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003429static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003430 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003431}
3432
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003433static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003434
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003435static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003436 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003437}
3438
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003439static bool IsUbuntu(enum Distro Distro) {
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003440 return Distro >= UbuntuHardy && Distro <= UbuntuXenial;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003441}
3442
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003443static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003444 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3445 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3446 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003447 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003448 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003449 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003450 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003451 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003452 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3453 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3454 .Case("hardy", UbuntuHardy)
3455 .Case("intrepid", UbuntuIntrepid)
3456 .Case("jaunty", UbuntuJaunty)
3457 .Case("karmic", UbuntuKarmic)
3458 .Case("lucid", UbuntuLucid)
3459 .Case("maverick", UbuntuMaverick)
3460 .Case("natty", UbuntuNatty)
3461 .Case("oneiric", UbuntuOneiric)
3462 .Case("precise", UbuntuPrecise)
3463 .Case("quantal", UbuntuQuantal)
3464 .Case("raring", UbuntuRaring)
3465 .Case("saucy", UbuntuSaucy)
3466 .Case("trusty", UbuntuTrusty)
3467 .Case("utopic", UbuntuUtopic)
3468 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003469 .Case("wily", UbuntuWily)
Sylvestre Ledru43b95712015-10-29 17:27:55 +00003470 .Case("xenial", UbuntuXenial)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003471 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003472 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003473 }
3474
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003475 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3476 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003477 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003478 if (Data.startswith("Fedora release"))
3479 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003480 if (Data.startswith("Red Hat Enterprise Linux") ||
3481 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003482 if (Data.find("release 7") != StringRef::npos)
3483 return RHEL7;
3484 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003485 return RHEL6;
3486 else if (Data.find("release 5") != StringRef::npos)
3487 return RHEL5;
3488 else if (Data.find("release 4") != StringRef::npos)
3489 return RHEL4;
3490 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003491 return UnknownDistro;
3492 }
3493
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003494 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3495 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003496 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003497 if (Data[0] == '5')
3498 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003499 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003500 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003501 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003502 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003503 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003504 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003505 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3506 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003507 return UnknownDistro;
3508 }
3509
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003510 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003511 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003512
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003513 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003514 return Exherbo;
3515
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003516 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003517 return ArchLinux;
3518
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003519 return UnknownDistro;
3520}
3521
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003522/// \brief Get our best guess at the multiarch triple for a target.
3523///
3524/// Debian-based systems are starting to use a multiarch setup where they use
3525/// a target-triple directory in the library and header search paths.
3526/// Unfortunately, this triple does not align with the vanilla target triple,
3527/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003528static std::string getMultiarchTriple(const Driver &D,
3529 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003530 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003531 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3532
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003533 // For most architectures, just use whatever we have rather than trying to be
3534 // clever.
3535 switch (TargetTriple.getArch()) {
3536 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003537 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003538
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003539 // We use the existence of '/lib/<triple>' as a directory to detect some
3540 // common linux triples that don't quite match the Clang triple for both
3541 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3542 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003543 case llvm::Triple::arm:
3544 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003545 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003546 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003547 return "arm-linux-gnueabihf";
3548 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003549 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003550 return "arm-linux-gnueabi";
3551 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003552 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003553 case llvm::Triple::armeb:
3554 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003555 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003556 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003557 return "armeb-linux-gnueabihf";
3558 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003559 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003560 return "armeb-linux-gnueabi";
3561 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003562 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003563 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003564 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003565 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003566 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003567 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003568 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003569 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003570 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003571 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003572 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003573 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003574 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003575 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003576 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003577 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003578 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003579 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003580 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003581 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003582 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003583 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003584 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003585 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003586 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003587 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003588 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003589 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003590 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003591 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003592 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003593 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003594 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003595 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003596 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003597 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003598 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003599 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003600 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003601 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003602 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003603 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003604 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003605 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003606 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003607 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003608 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003609 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003610 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003611 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003612 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003613 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003614 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003615 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003616 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003617 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003618 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003619 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003620 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003621 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003622 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003623 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003624 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003625 return "s390x-linux-gnu";
3626 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003627 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003628 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003629}
3630
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003631static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003632 if (isMipsArch(Triple.getArch())) {
3633 // lib32 directory has a special meaning on MIPS targets.
3634 // It contains N32 ABI binaries. Use this folder if produce
3635 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003636 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003637 return "lib32";
3638 return Triple.isArch32Bit() ? "lib" : "lib64";
3639 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003640
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003641 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003642 // using that variant while targeting other architectures causes problems
3643 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003644 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003645 // them when we know we may need it.
3646 //
3647 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003648 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003649 // GCCInstallationDetector, but that is a more significant refactoring.
3650 if (Triple.getArch() == llvm::Triple::x86 ||
3651 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003652 return "lib32";
3653
Zinovy Nis1db95732014-07-10 15:27:19 +00003654 if (Triple.getArch() == llvm::Triple::x86_64 &&
3655 Triple.getEnvironment() == llvm::Triple::GNUX32)
3656 return "libx32";
3657
Simon Atanasyand4413882012-09-14 11:27:24 +00003658 return Triple.isArch32Bit() ? "lib" : "lib64";
3659}
3660
Rafael Espindola1af7c212012-02-19 01:38:32 +00003661Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003662 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003663 GCCInstallation.init(Triple, Args);
3664 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003665 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003666 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003667 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003668
Rafael Espindola10a63c22013-07-03 14:14:00 +00003669 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003670 // least) put various tools in a triple-prefixed directory off of the parent
3671 // of the GCC installation. We use the GCC triple here to ensure that we end
3672 // up with tools that support the same amount of cross compiling as the
3673 // detected GCC installation. For example, if we find a GCC installation
3674 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3675 // used to target i386.
3676 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003677 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003678 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003679 GCCInstallation.getTriple().str() + "/bin")
3680 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003681
Logan Chieneb9162f2014-06-26 14:23:45 +00003682 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003683
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003684 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003685
Rafael Espindola10a63c22013-07-03 14:14:00 +00003686 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003687 ExtraOpts.push_back("-z");
3688 ExtraOpts.push_back("relro");
3689 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003690
Douglas Gregord9bb1522011-03-06 19:11:49 +00003691 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003692 ExtraOpts.push_back("-X");
3693
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003694 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003695 const bool IsMips = isMipsArch(Arch);
3696
3697 if (IsMips && !SysRoot.empty())
3698 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003699
Chandler Carruth0b842912011-12-09 04:45:18 +00003700 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3701 // and the MIPS ABI require .dynsym to be sorted in different ways.
3702 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3703 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003704 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003705 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003706 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003707 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003708 ExtraOpts.push_back("--hash-style=gnu");
3709
Rafael Espindola10a63c22013-07-03 14:14:00 +00003710 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003711 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3712 ExtraOpts.push_back("--hash-style=both");
3713 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003714
Chris Lattner84e38552011-05-22 05:36:06 +00003715 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003716 ExtraOpts.push_back("--no-add-needed");
3717
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003718 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003719 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003720 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003721 ExtraOpts.push_back("--build-id");
3722
Rafael Espindola10a63c22013-07-03 14:14:00 +00003723 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003724 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003725
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003726 // The selection of paths to try here is designed to match the patterns which
3727 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3728 // This was determined by running GCC in a fake filesystem, creating all
3729 // possible permutations of these directories, and seeing which ones it added
3730 // to the link paths.
3731 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003732
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003733 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003734 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003735
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003736 // Add the multilib suffixed paths where they are available.
3737 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003738 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003739 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003740 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003741
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003742 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003743 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003744 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003745 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003746
3747 // GCC cross compiling toolchains will install target libraries which ship
3748 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3749 // any part of the GCC installation in
3750 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3751 // debatable, but is the reality today. We need to search this tree even
3752 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003753 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003754 // installation that is *not* within the system root to ensure two things:
3755 //
3756 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003757 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003758 // appropriate rpath.
3759 // 2) There must not be libraries installed into
3760 // <prefix>/<triple>/<libdir> unless they should be preferred over
3761 // those within the system root.
3762 //
3763 // Note that this matches the GCC behavior. See the below comment for where
3764 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003765 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3766 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003767 Paths);
3768
Chandler Carruth69a125b2012-04-06 16:32:06 +00003769 // If the GCC installation we found is inside of the sysroot, we want to
3770 // prefer libraries installed in the parent prefix of the GCC installation.
3771 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003772 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003773 // This usually happens when there is an external cross compiler on the
3774 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003775 // the cross. Note that GCC does include some of these directories in some
3776 // configurations but this seems somewhere between questionable and simply
3777 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003778 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003779 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3780 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003781 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003782 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003783
3784 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003785 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003786 // those searched.
3787 // FIXME: It's not clear whether we should use the driver's installed
3788 // directory ('Dir' below) or the ResourceDir.
3789 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003790 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3791 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003792 }
3793
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003794 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3795 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3796 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3797 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003798
Chandler Carruthb427c562013-06-22 11:35:51 +00003799 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003800 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003801 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003802 addPathIfExists(D,
3803 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003804 "/../../" + OSLibDir,
3805 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003806
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003807 // Add the 'other' biarch variant path
3808 Multilib BiarchSibling;
3809 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003810 addPathIfExists(D, GCCInstallation.getInstallPath() +
3811 BiarchSibling.gccSuffix(),
3812 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003813 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003814
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003815 // See comments above on the multilib variant for details of why this is
3816 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003817 const std::string &LibPath = GCCInstallation.getParentLibPath();
3818 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3819 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003820 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3821 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003822 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003823
3824 // See comments above on the multilib variant for details of why this is
3825 // only included from within the sysroot.
3826 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003827 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003828 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003829
3830 // Similar to the logic for GCC above, if we are currently running Clang
3831 // inside of the requested system root, add its parent library path to those
3832 // searched.
3833 // FIXME: It's not clear whether we should use the driver's installed
3834 // directory ('Dir' below) or the ResourceDir.
3835 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003836 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003837
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003838 addPathIfExists(D, SysRoot + "/lib", Paths);
3839 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003840}
3841
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003842bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003843
Douglas Katzman95354292015-06-23 20:42:09 +00003844Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003845
3846Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003847 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003848}
3849
Simon Atanasyana0d89572013-10-05 14:37:55 +00003850std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003851 if (!getDriver().SysRoot.empty())
3852 return getDriver().SysRoot;
3853
3854 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3855 return std::string();
3856
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003857 // Standalone MIPS toolchains use different names for sysroot folder
3858 // and put it into different places. Here we try to check some known
3859 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003860
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003861 const StringRef InstallDir = GCCInstallation.getInstallPath();
3862 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003863 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003864
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003865 std::string Path =
3866 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3867 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003868
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003869 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003870 return Path;
3871
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003872 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003873
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003874 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003875 return Path;
3876
3877 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003878}
3879
Chandler Carrutha796f532011-11-05 20:17:13 +00003880void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3881 ArgStringList &CC1Args) const {
3882 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003883 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003884
3885 if (DriverArgs.hasArg(options::OPT_nostdinc))
3886 return;
3887
3888 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003889 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003890
3891 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003892 SmallString<128> P(D.ResourceDir);
3893 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003894 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003895 }
3896
3897 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3898 return;
3899
3900 // Check for configure-time C include directories.
3901 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3902 if (CIncludeDirs != "") {
3903 SmallVector<StringRef, 5> dirs;
3904 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003905 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003906 StringRef Prefix =
3907 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003908 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003909 }
3910 return;
3911 }
3912
3913 // Lacking those, try to detect the correct set of system includes for the
3914 // target triple.
3915
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003916 // Add include directories specific to the selected multilib set and multilib.
3917 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003918 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003919 if (Callback) {
3920 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3921 GCCInstallation.getTriple().str(),
3922 GCCInstallation.getMultilib());
3923 for (const auto &Path : IncludePaths)
3924 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3925 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003926 }
3927
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003928 // Implement generic Debian multiarch support.
3929 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003930 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003931
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003932 // FIXME: These are older forms of multiarch. It's not clear that they're
3933 // in use in any released version of Debian, so we should consider
3934 // removing them.
3935 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003936 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003938
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003939 // FIXME: These are older forms of multiarch. It's not clear that they're
3940 // in use in any released version of Debian, so we should consider
3941 // removing them.
3942 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3943 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003944 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003945 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003946 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003947 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003948 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003949 "/usr/include/arm-linux-gnueabihf"};
3950 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003951 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003952 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003953 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003954 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003955 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003956 "/usr/include/mips64el-linux-gnu",
3957 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003958 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003959 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003960 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003961 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003962 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003963 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003964 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003965 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003966 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003967 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003968 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3969 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003970 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003971 switch (getTriple().getArch()) {
3972 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003973 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003974 break;
3975 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003976 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003977 break;
3978 case llvm::Triple::aarch64:
3979 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003980 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003981 break;
3982 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003983 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3984 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3985 else
3986 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003987 break;
3988 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003989 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003990 break;
3991 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003992 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003993 break;
3994 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003995 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003996 break;
3997 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003998 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003999 break;
4000 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004001 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004002 break;
4003 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00004004 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004005 break;
4006 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00004007 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004008 break;
4009 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00004010 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004011 break;
4012 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00004013 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004014 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00004015 case llvm::Triple::systemz:
4016 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
4017 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00004018 default:
4019 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004020 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004021 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004022 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004023 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00004024 break;
4025 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004026 }
4027
4028 if (getTriple().getOS() == llvm::Triple::RTEMS)
4029 return;
4030
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004031 // Add an include of '/include' directly. This isn't provided by default by
4032 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
4033 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004034 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00004035
Simon Atanasyan08450bd2013-04-20 08:15:03 +00004036 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00004037}
4038
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004039
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004040static std::string DetectLibcxxIncludePath(StringRef base) {
4041 std::error_code EC;
4042 int MaxVersion = 0;
4043 std::string MaxVersionString = "";
4044 for (llvm::sys::fs::directory_iterator LI(base, EC), LE; !EC && LI != LE;
4045 LI = LI.increment(EC)) {
4046 StringRef VersionText = llvm::sys::path::filename(LI->path());
4047 int Version;
4048 if (VersionText[0] == 'v' &&
4049 !VersionText.slice(1, StringRef::npos).getAsInteger(10, Version)) {
4050 if (Version > MaxVersion) {
4051 MaxVersion = Version;
4052 MaxVersionString = VersionText;
4053 }
4054 }
4055 }
4056 return MaxVersion ? (base + "/" + MaxVersionString).str() : "";
4057}
4058
Chandler Carrutha796f532011-11-05 20:17:13 +00004059void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4060 ArgStringList &CC1Args) const {
4061 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4062 DriverArgs.hasArg(options::OPT_nostdincxx))
4063 return;
4064
Chandler Carruthf4701732011-11-07 09:01:17 +00004065 // Check if libc++ has been enabled and provide its include paths if so.
4066 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004067 const std::string LibCXXIncludePathCandidates[] = {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004068 DetectLibcxxIncludePath(getDriver().Dir + "/../include/c++"),
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004069
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004070 // We also check the system as for a long time this is the only place
4071 // Clang looked.
4072 // FIXME: We should really remove this. It doesn't make any sense.
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004073 DetectLibcxxIncludePath(getDriver().SysRoot + "/usr/include/c++")};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004074 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Evgeniy Stepanov65bc2b12015-11-09 21:10:54 +00004075 if (IncludePath.empty() || !getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004076 continue;
4077 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004078 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004079 break;
4080 }
Chandler Carruthf4701732011-11-07 09:01:17 +00004081 return;
4082 }
4083
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00004084 // We need a detected GCC installation on Linux to provide libstdc++'s
4085 // headers. We handled the libc++ case above.
4086 if (!GCCInstallation.isValid())
4087 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00004088
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004089 // By default, look for the C++ headers in an include directory adjacent to
4090 // the lib directory of the GCC installation. Note that this is expect to be
4091 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
4092 StringRef LibDir = GCCInstallation.getParentLibPath();
4093 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004094 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004095 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004096 const std::string GCCMultiarchTriple = getMultiarchTriple(
4097 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004098 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004099 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00004100 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004101
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004102 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00004103 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004104 "/c++/" + Version.Text, TripleStr,
4105 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004106 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00004107 return;
4108
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004109 // Otherwise, fall back on a bunch of options which don't use multiarch
4110 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00004111 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004112 // Gentoo is weird and places its headers inside the GCC install,
4113 // so if the first attempt to find the headers fails, try these patterns.
4114 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
4115 Version.MinorStr,
4116 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
4117 // Android standalone toolchain has C++ headers in yet another place.
4118 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4119 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
4120 // without a subdirectory corresponding to the gcc version.
4121 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004122 };
4123
Simon Atanasyan6f657c42014-05-08 19:32:46 +00004124 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00004125 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
4126 /*GCCMultiarchTriple*/ "",
4127 /*TargetMultiarchTriple*/ "",
4128 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00004129 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00004130 }
Chandler Carrutha796f532011-11-05 20:17:13 +00004131}
4132
Artem Belevichfa11ab52015-11-17 22:28:46 +00004133void Linux::AddCudaIncludeArgs(const ArgList &DriverArgs,
4134 ArgStringList &CC1Args) const {
4135 if (DriverArgs.hasArg(options::OPT_nocudainc))
4136 return;
4137
Artem Belevich86017332015-11-17 22:28:55 +00004138 if (CudaInstallation.isValid()) {
Artem Belevichfa11ab52015-11-17 22:28:46 +00004139 addSystemInclude(DriverArgs, CC1Args, CudaInstallation.getIncludePath());
Artem Belevich86017332015-11-17 22:28:55 +00004140 CC1Args.push_back("-include");
4141 CC1Args.push_back("cuda_runtime.h");
4142 }
Artem Belevichfa11ab52015-11-17 22:28:46 +00004143}
4144
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004145bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00004146
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004147SanitizerMask Linux::getSupportedSanitizers() const {
4148 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
4149 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
4150 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
4151 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00004152 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
4153 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004154 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
4155 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004156 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4157 Res |= SanitizerKind::Address;
4158 Res |= SanitizerKind::KernelAddress;
4159 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00004160 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00004161 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004162 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00004163 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004164 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00004165 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004166 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00004167 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00004168 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004169 if (IsX86 || IsX86_64) {
4170 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00004171 }
4172 return Res;
4173}
4174
Xinliang David Li170cd102015-10-27 05:15:35 +00004175void Linux::addProfileRTLibs(const llvm::opt::ArgList &Args,
4176 llvm::opt::ArgStringList &CmdArgs) const {
4177 if (!needsProfileRT(Args)) return;
4178
4179 // Add linker option -u__llvm_runtime_variable to cause runtime
4180 // initialization module to be linked in.
4181 if (!Args.hasArg(options::OPT_coverage))
4182 CmdArgs.push_back(Args.MakeArgString(
4183 Twine("-u", llvm::getInstrProfRuntimeHookVarName())));
4184 ToolChain::addProfileRTLibs(Args, CmdArgs);
4185}
4186
Daniel Dunbarcc912342009-05-02 18:28:39 +00004187/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
4188
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004189DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
4190 const ArgList &Args)
4191 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00004192
4193 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00004194 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00004195 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00004196 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004197
Daniel Dunbar083edf72009-12-21 18:54:17 +00004198 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004199 getFilePaths().push_back("/usr/lib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004200 if (D.getVFS().exists("/usr/lib/gcc47"))
John McCall65b8da02013-04-11 22:55:55 +00004201 getFilePaths().push_back("/usr/lib/gcc47");
4202 else
4203 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00004204}
4205
Rafael Espindola7cf32212013-03-20 03:05:54 +00004206Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004207 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00004208}
4209
4210Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004211 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00004212}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004213
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004214/// Stub for CUDA toolchain. At the moment we don't have assembler or
4215/// linker and need toolchain mainly to propagate device-side options
4216/// to CC1.
4217
4218CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
4219 const ArgList &Args)
4220 : Linux(D, Triple, Args) {}
4221
4222void
4223CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
4224 llvm::opt::ArgStringList &CC1Args) const {
4225 Linux::addClangTargetOptions(DriverArgs, CC1Args);
4226 CC1Args.push_back("-fcuda-is-device");
Artem Belevich34f481a2015-11-17 22:28:50 +00004227
4228 if (DriverArgs.hasArg(options::OPT_nocudalib))
4229 return;
4230
4231 std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(
4232 DriverArgs.getLastArgValue(options::OPT_march_EQ));
4233 if (!LibDeviceFile.empty()) {
4234 CC1Args.push_back("-mlink-cuda-bitcode");
4235 CC1Args.push_back(DriverArgs.MakeArgString(LibDeviceFile));
4236
4237 // Libdevice in CUDA-7.0 requires PTX version that's more recent
4238 // than LLVM defaults to. Use PTX4.2 which is the PTX version that
4239 // came with CUDA-7.0.
4240 CC1Args.push_back("-target-feature");
4241 CC1Args.push_back("+ptx42");
4242 }
Artem Belevich0ff05cd2015-07-13 23:27:56 +00004243}
4244
4245llvm::opt::DerivedArgList *
4246CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
4247 const char *BoundArch) const {
4248 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
4249 const OptTable &Opts = getDriver().getOpts();
4250
4251 for (Arg *A : Args) {
4252 if (A->getOption().matches(options::OPT_Xarch__)) {
4253 // Skip this argument unless the architecture matches BoundArch
4254 if (A->getValue(0) != StringRef(BoundArch))
4255 continue;
4256
4257 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
4258 unsigned Prev = Index;
4259 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
4260
4261 // If the argument parsing failed or more than one argument was
4262 // consumed, the -Xarch_ argument's parameter tried to consume
4263 // extra arguments. Emit an error and ignore.
4264 //
4265 // We also want to disallow any options which would alter the
4266 // driver behavior; that isn't going to work in our model. We
4267 // use isDriverOption() as an approximation, although things
4268 // like -O4 are going to slip through.
4269 if (!XarchArg || Index > Prev + 1) {
4270 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
4271 << A->getAsString(Args);
4272 continue;
4273 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
4274 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
4275 << A->getAsString(Args);
4276 continue;
4277 }
4278 XarchArg->setBaseArg(A);
4279 A = XarchArg.release();
4280 DAL->AddSynthesizedArg(A);
4281 }
4282 DAL->append(A);
4283 }
4284
4285 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
4286 return DAL;
4287}
4288
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004289/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00004290XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
4291 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004292 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004293 // ProgramPaths are found via 'PATH' environment variable.
4294}
4295
Douglas Katzman54366072015-07-27 16:53:08 +00004296Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00004297 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004298}
4299
Douglas Katzman54366072015-07-27 16:53:08 +00004300Tool *XCoreToolChain::buildLinker() const {
4301 return new tools::XCore::Linker(*this);
4302}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004303
Douglas Katzman54366072015-07-27 16:53:08 +00004304bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004305
Douglas Katzman54366072015-07-27 16:53:08 +00004306bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004307
Douglas Katzman54366072015-07-27 16:53:08 +00004308bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004309
Douglas Katzman54366072015-07-27 16:53:08 +00004310bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004311
Douglas Katzman54366072015-07-27 16:53:08 +00004312bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004313
Douglas Katzman54366072015-07-27 16:53:08 +00004314void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4315 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004316 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
4317 DriverArgs.hasArg(options::OPT_nostdlibinc))
4318 return;
4319 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
4320 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004321 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004322 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4323 ArrayRef<StringRef> DirVec(Dirs);
4324 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4325 }
4326}
4327
Douglas Katzman54366072015-07-27 16:53:08 +00004328void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
4329 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004330 CC1Args.push_back("-nostdsysteminc");
4331}
4332
Douglas Katzman54366072015-07-27 16:53:08 +00004333void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
4334 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004335 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00004336 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4337 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004338 return;
4339 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
4340 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004341 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004342 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
4343 ArrayRef<StringRef> DirVec(Dirs);
4344 addSystemIncludes(DriverArgs, CC1Args, DirVec);
4345 }
4346}
4347
Douglas Katzman54366072015-07-27 16:53:08 +00004348void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
4349 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00004350 // We don't output any lib args. This is handled by xcc.
4351}
Douglas Katzman84a75642015-06-19 14:55:19 +00004352
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004353MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
4354 const ArgList &Args)
4355 : Generic_GCC(D, Triple, Args) {
4356 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
4357 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
4358 // This won't work to find gcc. Instead we give the installation detector an
4359 // extra triple, which is preferable to further hacks of the logic that at
4360 // present is based solely on getArch(). In particular, it would be wrong to
4361 // choose the myriad installation when targeting a non-myriad sparc install.
4362 switch (Triple.getArch()) {
4363 default:
4364 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << "myriad";
4365 case llvm::Triple::sparc:
4366 case llvm::Triple::sparcel:
4367 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00004368 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004369 }
Douglas Katzman674a3122015-11-18 16:24:46 +00004370
4371 if (GCCInstallation.isValid()) {
4372 // The contents of LibDir are independent of the version of gcc.
4373 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4374 SmallString<128> LibDir(GCCInstallation.getParentLibPath());
4375 if (Triple.getArch() == llvm::Triple::sparcel)
4376 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib/le");
4377 else
4378 llvm::sys::path::append(LibDir, "../sparc-myriad-elf/lib");
4379 addPathIfExists(D, LibDir, getFilePaths());
4380
4381 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4382 // These files are tied to a particular version of gcc.
4383 SmallString<128> CompilerSupportDir(GCCInstallation.getInstallPath());
4384 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4385 // but as this toolchain is for LEON sparc, it can assume FPU.
4386 if (Triple.getArch() == llvm::Triple::sparcel)
4387 llvm::sys::path::append(CompilerSupportDir, "le");
4388 addPathIfExists(D, CompilerSupportDir, getFilePaths());
4389 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004390}
4391
Angel Garcia Gomez637d1e62015-10-20 13:23:58 +00004392MyriadToolChain::~MyriadToolChain() {}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004393
Douglas Katzmanb1278f32015-09-17 21:20:16 +00004394void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
4395 ArgStringList &CC1Args) const {
4396 if (!DriverArgs.hasArg(options::OPT_nostdinc))
4397 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
4398}
4399
James Y Knighta6c9ee72015-10-16 18:46:26 +00004400void MyriadToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
4401 ArgStringList &CC1Args) const {
4402 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
4403 DriverArgs.hasArg(options::OPT_nostdincxx))
4404 return;
4405
4406 // Only libstdc++, for now.
4407 StringRef LibDir = GCCInstallation.getParentLibPath();
4408 const GCCVersion &Version = GCCInstallation.getVersion();
4409 StringRef TripleStr = GCCInstallation.getTriple().str();
4410 const Multilib &Multilib = GCCInstallation.getMultilib();
4411
4412 addLibStdCXXIncludePaths(LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
4413 "", TripleStr, "", "", Multilib.includeSuffix(), DriverArgs, CC1Args);
4414}
4415
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004416// MyriadToolChain handles several triples:
4417// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
4418Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
4419 // The inherited method works fine if not targeting the SHAVE.
4420 if (!isShaveCompilation(getTriple()))
4421 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00004422 switch (JA.getKind()) {
4423 case Action::CompileJobClass:
4424 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004425 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004426 return Compiler.get();
4427 case Action::AssembleJobClass:
4428 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004429 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004430 return Assembler.get();
4431 default:
4432 return ToolChain::getTool(JA.getKind());
4433 }
4434}
4435
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004436Tool *MyriadToolChain::buildLinker() const {
4437 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004438}
Dan Gohmanc2853072015-09-03 22:51:53 +00004439
4440bool WebAssembly::IsMathErrnoDefault() const { return false; }
4441
4442bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4443
4444bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4445
4446bool WebAssembly::isPICDefault() const { return false; }
4447
4448bool WebAssembly::isPIEDefault() const { return false; }
4449
4450bool WebAssembly::isPICDefaultForced() const { return false; }
4451
4452bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4453
4454// TODO: Support Objective C stuff.
4455bool WebAssembly::SupportsObjCGC() const { return false; }
4456
4457bool WebAssembly::hasBlocksRuntime() const { return false; }
4458
4459// TODO: Support profiling.
4460bool WebAssembly::SupportsProfiling() const { return false; }
4461
4462void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4463 ArgStringList &CC1Args) const {
4464 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4465 options::OPT_fno_use_init_array, true))
4466 CC1Args.push_back("-fuse-init-array");
4467}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004468
4469PS4CPU::PS4CPU(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
4470 : Generic_ELF(D, Triple, Args) {
4471 if (Args.hasArg(options::OPT_static))
4472 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-static" << "PS4";
4473
4474 // Determine where to find the PS4 libraries. We use SCE_PS4_SDK_DIR
4475 // if it exists; otherwise use the driver's installation path, which
4476 // should be <SDK_DIR>/host_tools/bin.
4477
4478 SmallString<512> PS4SDKDir;
4479 if (const char *EnvValue = getenv("SCE_PS4_SDK_DIR")) {
4480 if (!llvm::sys::fs::exists(EnvValue))
4481 getDriver().Diag(clang::diag::warn_drv_ps4_sdk_dir) << EnvValue;
4482 PS4SDKDir = EnvValue;
4483 } else {
4484 PS4SDKDir = getDriver().Dir;
4485 llvm::sys::path::append(PS4SDKDir, "/../../");
4486 }
4487
4488 // By default, the driver won't report a warning if it can't find
4489 // PS4's include or lib directories. This behavior could be changed if
4490 // -Weverything or -Winvalid-or-nonexistent-directory options are passed.
4491 // If -isysroot was passed, use that as the SDK base path.
4492 std::string PrefixDir;
4493 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
4494 PrefixDir = A->getValue();
4495 if (!llvm::sys::fs::exists(PrefixDir))
4496 getDriver().Diag(clang::diag::warn_missing_sysroot) << PrefixDir;
4497 } else
4498 PrefixDir = PS4SDKDir.str();
4499
4500 SmallString<512> PS4SDKIncludeDir(PrefixDir);
4501 llvm::sys::path::append(PS4SDKIncludeDir, "target/include");
4502 if (!Args.hasArg(options::OPT_nostdinc) &&
4503 !Args.hasArg(options::OPT_nostdlibinc) &&
4504 !Args.hasArg(options::OPT_isysroot) &&
4505 !Args.hasArg(options::OPT__sysroot_EQ) &&
4506 !llvm::sys::fs::exists(PS4SDKIncludeDir)) {
4507 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4508 << "PS4 system headers" << PS4SDKIncludeDir;
4509 }
4510
4511 SmallString<512> PS4SDKLibDir(PS4SDKDir);
4512 llvm::sys::path::append(PS4SDKLibDir, "target/lib");
4513 if (!Args.hasArg(options::OPT_nostdlib) &&
4514 !Args.hasArg(options::OPT_nodefaultlibs) &&
4515 !Args.hasArg(options::OPT__sysroot_EQ) && !Args.hasArg(options::OPT_E) &&
4516 !Args.hasArg(options::OPT_c) && !Args.hasArg(options::OPT_S) &&
4517 !Args.hasArg(options::OPT_emit_ast) &&
4518 !llvm::sys::fs::exists(PS4SDKLibDir)) {
4519 getDriver().Diag(clang::diag::warn_drv_unable_to_find_directory_expected)
4520 << "PS4 system libraries" << PS4SDKLibDir;
4521 return;
4522 }
4523 getFilePaths().push_back(PS4SDKLibDir.str());
4524}
4525
4526Tool *PS4CPU::buildAssembler() const {
4527 return new tools::PS4cpu::Assemble(*this);
4528}
4529
4530Tool *PS4CPU::buildLinker() const { return new tools::PS4cpu::Link(*this); }
4531
4532bool PS4CPU::isPICDefault() const { return true; }
4533
4534bool PS4CPU::HasNativeLLVMSupport() const { return true; }
4535
4536SanitizerMask PS4CPU::getSupportedSanitizers() const {
4537 SanitizerMask Res = ToolChain::getSupportedSanitizers();
4538 Res |= SanitizerKind::Address;
4539 Res |= SanitizerKind::Vptr;
4540 return Res;
4541}