blob: 2f7436f1f04a6cceaa8b0dbf84e83482dad1e4c5 [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"
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +000028#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000029#include "llvm/Support/FileSystem.h"
Rafael Espindolac8f008f2010-11-07 20:14:31 +000030#include "llvm/Support/MemoryBuffer.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000031#include "llvm/Support/Path.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000032#include "llvm/Support/Program.h"
Renato Golin33e1f822015-05-28 15:49:28 +000033#include "llvm/Support/TargetParser.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000034#include "llvm/Support/raw_ostream.h"
Daniel Dunbarb5023e92009-04-10 21:00:07 +000035#include <cstdlib> // ::getenv
Rafael Espindola8a8e5542014-06-12 17:19:42 +000036#include <system_error>
Daniel Dunbarb5023e92009-04-10 21:00:07 +000037
Daniel Dunbar59e5e882009-03-20 00:20:03 +000038using namespace clang::driver;
39using namespace clang::driver::toolchains;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000040using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000041using namespace llvm::opt;
Daniel Dunbar59e5e882009-03-20 00:20:03 +000042
Douglas Katzmana67e50c2015-06-26 15:47:46 +000043MachO::MachO(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
44 : ToolChain(D, Triple, Args) {
Tim Northover15ff71d2014-05-22 13:12:14 +000045 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
46 getProgramPaths().push_back(getDriver().getInstalledDir());
47 if (getDriver().getInstalledDir() != getDriver().Dir)
48 getProgramPaths().push_back(getDriver().Dir);
Tim Northover157d9112014-01-16 08:48:16 +000049}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +000050
Tim Northover157d9112014-01-16 08:48:16 +000051/// Darwin - Darwin tool chain for i386 and x86_64.
Alexey Samsonov905c8022015-06-18 21:46:05 +000052Darwin::Darwin(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
53 : MachO(D, Triple, Args), TargetInitialized(false) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +000054
Tim Northover157d9112014-01-16 08:48:16 +000055types::ID MachO::LookupTypeForExtension(const char *Ext) const {
Daniel Dunbarcc7df6c2010-08-02 05:43:56 +000056 types::ID Ty = types::lookupTypeForExtension(Ext);
57
58 // Darwin always preprocesses assembly files (unless -x is used explicitly).
59 if (Ty == types::TY_PP_Asm)
60 return types::TY_Asm;
61
62 return Ty;
63}
64
Douglas Katzmana67e50c2015-06-26 15:47:46 +000065bool MachO::HasNativeLLVMSupport() const { return true; }
Daniel Dunbar62123a12010-09-17 00:24:52 +000066
John McCall24fc0de2011-07-06 00:26:06 +000067/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
John McCall5fb5df92012-06-20 06:18:46 +000068ObjCRuntime Darwin::getDefaultObjCRuntime(bool isNonFragile) const {
Tim Northover9c7e0352013-12-12 11:55:52 +000069 if (isTargetIOSBased())
John McCall5fb5df92012-06-20 06:18:46 +000070 return ObjCRuntime(ObjCRuntime::iOS, TargetVersion);
Bob Wilson5ad5a952012-11-09 01:59:30 +000071 if (isNonFragile)
72 return ObjCRuntime(ObjCRuntime::MacOSX, TargetVersion);
73 return ObjCRuntime(ObjCRuntime::FragileMacOSX, TargetVersion);
John McCall24fc0de2011-07-06 00:26:06 +000074}
75
John McCall7959fee2011-09-09 20:41:01 +000076/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
77bool Darwin::hasBlocksRuntime() const {
Tim Northover9c7e0352013-12-12 11:55:52 +000078 if (isTargetIOSBased())
John McCall7959fee2011-09-09 20:41:01 +000079 return !isIPhoneOSVersionLT(3, 2);
Tim Northover9c7e0352013-12-12 11:55:52 +000080 else {
Tim Northover157d9112014-01-16 08:48:16 +000081 assert(isTargetMacOS() && "unexpected darwin target");
82 return !isMacosxVersionLT(10, 6);
Tim Northover9c7e0352013-12-12 11:55:52 +000083 }
John McCall7959fee2011-09-09 20:41:01 +000084}
85
Renato Golin33e1f822015-05-28 15:49:28 +000086// This is just a MachO name translation routine and there's no
87// way to join this into ARMTargetParser without breaking all
88// other assumptions. Maybe MachO should consider standardising
89// their nomenclature.
90static const char *ArmMachOArchName(StringRef Arch) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000091 return llvm::StringSwitch<const char *>(Arch)
92 .Case("armv6k", "armv6")
93 .Case("armv6m", "armv6m")
94 .Case("armv5tej", "armv5")
95 .Case("xscale", "xscale")
96 .Case("armv4t", "armv4t")
97 .Case("armv7", "armv7")
98 .Cases("armv7a", "armv7-a", "armv7")
99 .Cases("armv7r", "armv7-r", "armv7")
100 .Cases("armv7em", "armv7e-m", "armv7em")
101 .Cases("armv7k", "armv7-k", "armv7k")
102 .Cases("armv7m", "armv7-m", "armv7m")
103 .Cases("armv7s", "armv7-s", "armv7s")
104 .Default(nullptr);
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000105}
106
Renato Golin33e1f822015-05-28 15:49:28 +0000107static const char *ArmMachOArchNameCPU(StringRef CPU) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000108 unsigned ArchKind = llvm::ARM::parseCPUArch(CPU);
Renato Golin33e1f822015-05-28 15:49:28 +0000109 if (ArchKind == llvm::ARM::AK_INVALID)
110 return nullptr;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000111 StringRef Arch = llvm::ARM::getArchName(ArchKind);
Renato Golin33e1f822015-05-28 15:49:28 +0000112
113 // FIXME: Make sure this MachO triple mangling is really necessary.
114 // ARMv5* normalises to ARMv5.
115 if (Arch.startswith("armv5"))
116 Arch = Arch.substr(0, 5);
117 // ARMv6*, except ARMv6M, normalises to ARMv6.
118 else if (Arch.startswith("armv6") && !Arch.endswith("6m"))
119 Arch = Arch.substr(0, 5);
120 // ARMv7A normalises to ARMv7.
121 else if (Arch.endswith("v7a"))
122 Arch = Arch.substr(0, 5);
123 return Arch.data();
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000124}
125
Tim Northover9c7e0352013-12-12 11:55:52 +0000126static bool isSoftFloatABI(const ArgList &Args) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000127 Arg *A = Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
Tim Northover9c7e0352013-12-12 11:55:52 +0000128 options::OPT_mfloat_abi_EQ);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000129 if (!A)
130 return false;
Rafael Auler3f7abf72014-09-29 21:50:34 +0000131
Tim Northover9c7e0352013-12-12 11:55:52 +0000132 return A->getOption().matches(options::OPT_msoft_float) ||
133 (A->getOption().matches(options::OPT_mfloat_abi_EQ) &&
134 A->getValue() == StringRef("soft"));
135}
136
Tim Northover157d9112014-01-16 08:48:16 +0000137StringRef MachO::getMachOArchName(const ArgList &Args) const {
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000138 switch (getTriple().getArch()) {
139 default:
Rafael Espindolaed1233e2014-08-28 21:23:05 +0000140 return getDefaultUniversalArchName();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000141
Tim Northover40956e62014-07-23 12:32:58 +0000142 case llvm::Triple::aarch64:
143 return "arm64";
144
Douglas Gregord9bb1522011-03-06 19:11:49 +0000145 case llvm::Triple::thumb:
Hans Wennborgdcfba332015-10-06 23:40:43 +0000146 case llvm::Triple::arm:
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000147 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000148 if (const char *Arch = ArmMachOArchName(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000149 return Arch;
150
151 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Renato Golin33e1f822015-05-28 15:49:28 +0000152 if (const char *Arch = ArmMachOArchNameCPU(A->getValue()))
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000153 return Arch;
154
155 return "arm";
156 }
Daniel Dunbardcc3b652010-01-22 02:04:58 +0000157}
158
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000159Darwin::~Darwin() {}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000160
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000161MachO::~MachO() {}
Tim Northover157d9112014-01-16 08:48:16 +0000162
163std::string MachO::ComputeEffectiveClangTriple(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000164 types::ID InputType) const {
Tim Northover157d9112014-01-16 08:48:16 +0000165 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
166
167 return Triple.getTriple();
168}
169
Chad Rosierd3a0f952011-09-20 20:44:06 +0000170std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
171 types::ID InputType) const {
172 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000173
174 // If the target isn't initialized (e.g., an unknown Darwin platform, return
175 // the default triple).
176 if (!isTargetInitialized())
177 return Triple.getTriple();
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000178
Tim Northover157d9112014-01-16 08:48:16 +0000179 SmallString<16> Str;
180 Str += isTargetIOSBased() ? "ios" : "macosx";
181 Str += getTargetVersion().getAsString();
182 Triple.setOSName(Str);
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +0000183
184 return Triple.getTriple();
185}
186
David Blaikie68e081d2011-12-20 02:48:34 +0000187void Generic_ELF::anchor() {}
188
Tim Northover157d9112014-01-16 08:48:16 +0000189Tool *MachO::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +0000190 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000191 case Action::LipoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000192 if (!Lipo)
193 Lipo.reset(new tools::darwin::Lipo(*this));
194 return Lipo.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +0000195 case Action::DsymutilJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000196 if (!Dsymutil)
197 Dsymutil.reset(new tools::darwin::Dsymutil(*this));
198 return Dsymutil.get();
Ben Langmuir9b9a8d32014-02-06 18:53:25 +0000199 case Action::VerifyDebugInfoJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000200 if (!VerifyDebug)
201 VerifyDebug.reset(new tools::darwin::VerifyDebug(*this));
202 return VerifyDebug.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +0000203 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +0000204 return ToolChain::getTool(AC);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000205 }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000206}
207
Douglas Katzman95354292015-06-23 20:42:09 +0000208Tool *MachO::buildLinker() const { return new tools::darwin::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +0000209
Tim Northover157d9112014-01-16 08:48:16 +0000210Tool *MachO::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +0000211 return new tools::darwin::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +0000212}
Daniel Dunbar26d482a2009-09-18 08:15:03 +0000213
Douglas Katzman95354292015-06-23 20:42:09 +0000214DarwinClang::DarwinClang(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +0000215 const ArgList &Args)
Douglas Katzman95354292015-06-23 20:42:09 +0000216 : Darwin(D, Triple, Args) {}
Daniel Dunbar6276f992009-09-18 08:15:13 +0000217
Tim Northover336f1892014-03-29 13:16:12 +0000218void DarwinClang::addClangWarningOptions(ArgStringList &CC1Args) const {
219 // For iOS, 64-bit, promote certain warnings to errors.
220 if (!isTargetMacOS() && getTriple().isArch64Bit()) {
221 // Always enable -Wdeprecated-objc-isa-usage and promote it
222 // to an error.
223 CC1Args.push_back("-Wdeprecated-objc-isa-usage");
224 CC1Args.push_back("-Werror=deprecated-objc-isa-usage");
225
226 // Also error about implicit function declarations, as that
227 // can impact calling conventions.
228 CC1Args.push_back("-Werror=implicit-function-declaration");
229 }
230}
231
Tim Northover157d9112014-01-16 08:48:16 +0000232/// \brief Determine whether Objective-C automated reference counting is
233/// enabled.
234static bool isObjCAutoRefCount(const ArgList &Args) {
235 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
236}
237
John McCall31168b02011-06-15 23:02:42 +0000238void DarwinClang::AddLinkARCArgs(const ArgList &Args,
239 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000240 // Avoid linking compatibility stubs on i386 mac.
241 if (isTargetMacOS() && getArch() == llvm::Triple::x86)
242 return;
243
244 ObjCRuntime runtime = getDefaultObjCRuntime(/*nonfragile*/ true);
245
246 if ((runtime.hasNativeARC() || !isObjCAutoRefCount(Args)) &&
247 runtime.hasSubscripting())
248 return;
Eric Christopher551ef452011-08-23 17:56:55 +0000249
250 CmdArgs.push_back("-force_load");
Rafael Espindola358256c2013-06-26 02:13:00 +0000251 SmallString<128> P(getDriver().ClangExecutable);
252 llvm::sys::path::remove_filename(P); // 'clang'
253 llvm::sys::path::remove_filename(P); // 'bin'
Benjamin Kramer17381a02013-06-28 16:25:46 +0000254 llvm::sys::path::append(P, "lib", "arc", "libarclite_");
John McCall31168b02011-06-15 23:02:42 +0000255 // Mash in the platform.
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000256 if (isTargetIOSSimulator())
Rafael Espindola358256c2013-06-26 02:13:00 +0000257 P += "iphonesimulator";
Argyrios Kyrtzidis058b4512011-10-18 17:40:15 +0000258 else if (isTargetIPhoneOS())
Rafael Espindola358256c2013-06-26 02:13:00 +0000259 P += "iphoneos";
John McCall31168b02011-06-15 23:02:42 +0000260 else
Rafael Espindola358256c2013-06-26 02:13:00 +0000261 P += "macosx";
262 P += ".a";
John McCall31168b02011-06-15 23:02:42 +0000263
Rafael Espindola358256c2013-06-26 02:13:00 +0000264 CmdArgs.push_back(Args.MakeArgString(P));
John McCall31168b02011-06-15 23:02:42 +0000265}
266
Tim Northover157d9112014-01-16 08:48:16 +0000267void MachO::AddLinkRuntimeLib(const ArgList &Args, ArgStringList &CmdArgs,
Kuba Brecka2735a0252014-10-31 00:08:57 +0000268 StringRef DarwinLibName, bool AlwaysLink,
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000269 bool IsEmbedded, bool AddRPath) const {
270 SmallString<128> Dir(getDriver().ResourceDir);
271 llvm::sys::path::append(Dir, "lib", IsEmbedded ? "macho_embedded" : "darwin");
272
273 SmallString<128> P(Dir);
274 llvm::sys::path::append(P, DarwinLibName);
Eric Christopher551ef452011-08-23 17:56:55 +0000275
Eric Christopherc235d0c62011-06-22 17:41:40 +0000276 // For now, allow missing resource libraries to support developers who may
Alexey Samsonov8368b372012-11-21 14:17:42 +0000277 // not have compiler-rt checked out or integrated into their build (unless
278 // we explicitly force linking with this library).
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000279 if (AlwaysLink || getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000280 CmdArgs.push_back(Args.MakeArgString(P));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000281
282 // Adding the rpaths might negatively interact when other rpaths are involved,
283 // so we should make sure we add the rpaths last, after all user-specified
284 // rpaths. This is currently true from this place, but we need to be
285 // careful if this function is ever called before user's rpaths are emitted.
286 if (AddRPath) {
287 assert(DarwinLibName.endswith(".dylib") && "must be a dynamic library");
288
289 // Add @executable_path to rpath to support having the dylib copied with
290 // the executable.
291 CmdArgs.push_back("-rpath");
292 CmdArgs.push_back("@executable_path");
293
294 // Add the path to the resource dir to rpath to support using the dylib
295 // from the default location without copying.
296 CmdArgs.push_back("-rpath");
Yaron Keren92e1b622015-03-18 10:17:07 +0000297 CmdArgs.push_back(Args.MakeArgString(Dir));
Kuba Brecka9ff912d2014-11-04 17:35:17 +0000298 }
Eric Christopherc235d0c62011-06-22 17:41:40 +0000299}
300
Justin Bogner2fd95f62015-05-12 06:30:48 +0000301void Darwin::addProfileRTLibs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000302 ArgStringList &CmdArgs) const {
Justin Bognerc7701242015-05-12 05:44:36 +0000303 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
304 false) ||
305 Args.hasArg(options::OPT_fprofile_generate) ||
Diego Novillo578caf52015-07-09 17:23:53 +0000306 Args.hasArg(options::OPT_fprofile_generate_EQ) ||
Justin Bognerc7701242015-05-12 05:44:36 +0000307 Args.hasArg(options::OPT_fprofile_instr_generate) ||
308 Args.hasArg(options::OPT_fprofile_instr_generate_EQ) ||
309 Args.hasArg(options::OPT_fcreate_profile) ||
310 Args.hasArg(options::OPT_coverage)))
311 return;
312
313 // Select the appropriate runtime library for the target.
314 if (isTargetIOSBased())
315 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a",
316 /*AlwaysLink*/ true);
317 else
318 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a",
319 /*AlwaysLink*/ true);
320}
321
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000322void DarwinClang::AddLinkSanitizerLibArgs(const ArgList &Args,
323 ArgStringList &CmdArgs,
324 StringRef Sanitizer) const {
325 if (!Args.hasArg(options::OPT_dynamiclib) &&
326 !Args.hasArg(options::OPT_bundle)) {
327 // Sanitizer runtime libraries requires C++.
328 AddCXXStdlibLibArgs(Args, CmdArgs);
329 }
330 assert(isTargetMacOS() || isTargetIOSSimulator());
331 StringRef OS = isTargetMacOS() ? "osx" : "iossim";
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000332 AddLinkRuntimeLib(
333 Args, CmdArgs,
334 (Twine("libclang_rt.") + Sanitizer + "_" + OS + "_dynamic.dylib").str(),
335 /*AlwaysLink*/ true, /*IsEmbedded*/ false,
336 /*AddRPath*/ true);
Hans Wennborg10821e52015-04-09 18:47:01 +0000337
338 if (GetCXXStdlibType(Args) == ToolChain::CST_Libcxx) {
339 // Add explicit dependcy on -lc++abi, as -lc++ doesn't re-export
340 // all RTTI-related symbols that UBSan uses.
341 CmdArgs.push_back("-lc++abi");
342 }
Alexey Samsonov498f3c32015-03-23 23:14:05 +0000343}
344
Daniel Dunbar6276f992009-09-18 08:15:13 +0000345void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
346 ArgStringList &CmdArgs) const {
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000347 // Darwin only supports the compiler-rt based runtime libraries.
348 switch (GetRuntimeLibType(Args)) {
349 case ToolChain::RLT_CompilerRT:
350 break;
351 default:
352 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000353 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue() << "darwin";
Daniel Dunbarf4916cd2011-12-07 23:03:15 +0000354 return;
355 }
356
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000357 // Darwin doesn't support real static executables, don't link any runtime
358 // libraries with -static.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000359 if (Args.hasArg(options::OPT_static) ||
360 Args.hasArg(options::OPT_fapple_kext) ||
361 Args.hasArg(options::OPT_mkernel))
Daniel Dunbar6276f992009-09-18 08:15:13 +0000362 return;
Daniel Dunbar6276f992009-09-18 08:15:13 +0000363
364 // Reject -static-libgcc for now, we can deal with this when and if someone
365 // cares. This is useful in situations where someone wants to statically link
366 // something like libstdc++, and needs its runtime support routines.
367 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000368 getDriver().Diag(diag::err_drv_unsupported_opt) << A->getAsString(Args);
Daniel Dunbar6276f992009-09-18 08:15:13 +0000369 return;
370 }
371
Peter Collingbourne32701642013-11-01 18:16:25 +0000372 const SanitizerArgs &Sanitize = getSanitizerArgs();
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +0000373 if (Sanitize.needsAsanRt())
374 AddLinkSanitizerLibArgs(Args, CmdArgs, "asan");
375 if (Sanitize.needsUbsanRt())
376 AddLinkSanitizerLibArgs(Args, CmdArgs, "ubsan");
Daniel Dunbar1d6469f2011-12-01 23:40:18 +0000377
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000378 // Otherwise link libSystem, then the dynamic runtime library, and finally any
379 // target specific static runtime library.
Daniel Dunbar6276f992009-09-18 08:15:13 +0000380 CmdArgs.push_back("-lSystem");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000381
382 // Select the dynamic runtime library and the target specific static library.
Tim Northover9c7e0352013-12-12 11:55:52 +0000383 if (isTargetIOSBased()) {
Daniel Dunbar2f31fb92011-04-30 04:25:16 +0000384 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
385 // it never went into the SDK.
Bob Wilson102be442011-10-07 17:54:41 +0000386 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
Tim Northovera2ee4332014-03-29 15:09:45 +0000387 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator() &&
Tim Northover40956e62014-07-23 12:32:58 +0000388 getTriple().getArch() != llvm::Triple::aarch64)
Bob Wilson102be442011-10-07 17:54:41 +0000389 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000390
Daniel Dunbard1076382011-04-18 23:48:36 +0000391 // We currently always need a static runtime library for iOS.
Eric Christopherc235d0c62011-06-22 17:41:40 +0000392 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000393 } else {
Tim Northover9c7e0352013-12-12 11:55:52 +0000394 assert(isTargetMacOS() && "unexpected non MacOS platform");
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000395 // The dynamic runtime library was merged with libSystem for 10.6 and
396 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000397 if (isMacosxVersionLT(10, 5))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000398 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbar6d23b2f2010-01-27 00:57:03 +0000399 else if (isMacosxVersionLT(10, 6))
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000400 CmdArgs.push_back("-lgcc_s.10.5");
401
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000402 // For OS X, we thought we would only need a static runtime library when
Chris Lattner57540c52011-04-15 05:22:18 +0000403 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000404 // omitted from 10.4.dylib.
405 //
406 // Unfortunately, that turned out to not be true, because Darwin system
407 // headers can still use eprintf on i386, and it is not exported from
408 // libSystem. Therefore, we still must provide a runtime library just for
409 // the tiny tiny handful of projects that *might* use that symbol.
410 if (isMacosxVersionLT(10, 5)) {
Eric Christopherc235d0c62011-06-22 17:41:40 +0000411 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000412 } else {
413 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopherc235d0c62011-06-22 17:41:40 +0000414 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
415 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbarda4f6b52010-09-22 00:03:52 +0000416 }
Daniel Dunbar7cde09a2010-01-22 03:38:14 +0000417 }
Daniel Dunbar6276f992009-09-18 08:15:13 +0000418}
419
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000420void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +0000421 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000422
Daniel Dunbar455a0492012-08-17 18:43:50 +0000423 // Support allowing the SDKROOT environment variable used by xcrun and other
424 // Xcode tools to define the default sysroot, by making it the default for
425 // isysroot.
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000426 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
427 // Warn if the path does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000428 if (!getVFS().exists(A->getValue()))
Chad Rosier6c2b11c2012-12-19 23:41:50 +0000429 getDriver().Diag(clang::diag::warn_missing_sysroot) << A->getValue();
430 } else {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000431 if (char *env = ::getenv("SDKROOT")) {
Daniel Dunbarb2543042013-01-15 20:33:56 +0000432 // We only use this value as the default if it is an absolute path,
433 // exists, and it is not the root path.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000434 if (llvm::sys::path::is_absolute(env) && getVFS().exists(env) &&
Daniel Dunbarb2543042013-01-15 20:33:56 +0000435 StringRef(env) != "/") {
Daniel Dunbar455a0492012-08-17 18:43:50 +0000436 Args.append(Args.MakeSeparateArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000437 nullptr, Opts.getOption(options::OPT_isysroot), env));
Daniel Dunbar455a0492012-08-17 18:43:50 +0000438 }
439 }
440 }
441
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000442 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000443 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
Eli Friedman027e9c32012-01-11 02:41:15 +0000444
Bob Wilson7f294b52014-10-10 23:10:10 +0000445 if (OSXVersion && iOSVersion) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000446 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000447 << OSXVersion->getAsString(Args) << iOSVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000448 iOSVersion = nullptr;
449 } else if (!OSXVersion && !iOSVersion) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000450 // If no deployment target was specified on the command line, check for
Daniel Dunbard54669d2010-01-26 01:45:19 +0000451 // environment defines.
Alexey Samsonov905c8022015-06-18 21:46:05 +0000452 std::string OSXTarget;
453 std::string iOSTarget;
Chad Rosier64707fe2011-08-31 20:56:25 +0000454 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
455 OSXTarget = env;
456 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
457 iOSTarget = env;
Daniel Dunbarb5023e92009-04-10 21:00:07 +0000458
Steven Wu7a1372c2015-06-25 01:59:35 +0000459 // If there is no command-line argument to specify the Target version and
460 // no environment variable defined, see if we can set the default based
461 // on -isysroot.
462 if (iOSTarget.empty() && OSXTarget.empty() &&
463 Args.hasArg(options::OPT_isysroot)) {
Chad Rosier64707fe2011-08-31 20:56:25 +0000464 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000465 StringRef isysroot = A->getValue();
Steven Wu7a1372c2015-06-25 01:59:35 +0000466 // Assume SDK has path: SOME_PATH/SDKs/PlatformXX.YY.sdk
467 size_t BeginSDK = isysroot.rfind("SDKs/");
468 size_t EndSDK = isysroot.rfind(".sdk");
469 if (BeginSDK != StringRef::npos && EndSDK != StringRef::npos) {
470 StringRef SDK = isysroot.slice(BeginSDK + 5, EndSDK);
471 // Slice the version number out.
472 // Version number is between the first and the last number.
473 size_t StartVer = SDK.find_first_of("0123456789");
474 size_t EndVer = SDK.find_last_of("0123456789");
475 if (StartVer != StringRef::npos && EndVer > StartVer) {
476 StringRef Version = SDK.slice(StartVer, EndVer + 1);
477 if (SDK.startswith("iPhoneOS") ||
478 SDK.startswith("iPhoneSimulator"))
479 iOSTarget = Version;
480 else if (SDK.startswith("MacOSX"))
481 OSXTarget = Version;
482 }
483 }
Chad Rosier64707fe2011-08-31 20:56:25 +0000484 }
485 }
Daniel Dunbard54669d2010-01-26 01:45:19 +0000486
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000487 // If no OSX or iOS target has been specified, try to guess platform
Alexey Samsonov905c8022015-06-18 21:46:05 +0000488 // from arch name and compute the version from the triple.
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000489 if (OSXTarget.empty() && iOSTarget.empty()) {
490 StringRef MachOArchName = getMachOArchName(Args);
Alexey Samsonov905c8022015-06-18 21:46:05 +0000491 unsigned Major, Minor, Micro;
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000492 if (MachOArchName == "armv7" || MachOArchName == "armv7s" ||
Alexey Samsonov905c8022015-06-18 21:46:05 +0000493 MachOArchName == "arm64") {
494 getTriple().getiOSVersion(Major, Minor, Micro);
495 llvm::raw_string_ostream(iOSTarget) << Major << '.' << Minor << '.'
496 << Micro;
497 } else if (MachOArchName != "armv6m" && MachOArchName != "armv7m" &&
498 MachOArchName != "armv7em") {
499 if (!getTriple().getMacOSXVersion(Major, Minor, Micro)) {
500 getDriver().Diag(diag::err_drv_invalid_darwin_version)
501 << getTriple().getOSName();
502 }
503 llvm::raw_string_ostream(OSXTarget) << Major << '.' << Minor << '.'
504 << Micro;
505 }
Alexey Samsonovfd0bb3a2015-06-18 00:36:38 +0000506 }
Chad Rosierfe6fd362011-09-28 00:46:32 +0000507
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000508 // Allow conflicts among OSX and iOS for historical reasons, but choose the
509 // default platform.
Chad Rosier64707fe2011-08-31 20:56:25 +0000510 if (!OSXTarget.empty() && !iOSTarget.empty()) {
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000511 if (getTriple().getArch() == llvm::Triple::arm ||
Tim Northover573cbee2014-05-24 12:52:07 +0000512 getTriple().getArch() == llvm::Triple::aarch64 ||
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000513 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosier64707fe2011-08-31 20:56:25 +0000514 OSXTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000515 else
Chad Rosier64707fe2011-08-31 20:56:25 +0000516 iOSTarget = "";
Daniel Dunbarffa70e82010-02-02 17:31:12 +0000517 }
Daniel Dunbar65969842010-01-29 17:02:25 +0000518
Chad Rosier64707fe2011-08-31 20:56:25 +0000519 if (!OSXTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000520 const Option O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000521 OSXVersion = Args.MakeJoinedArg(nullptr, O, OSXTarget);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000522 Args.append(OSXVersion);
Chad Rosier64707fe2011-08-31 20:56:25 +0000523 } else if (!iOSTarget.empty()) {
Michael J. Spencerfc790902012-10-19 22:36:40 +0000524 const Option O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Craig Topper92fc2df2014-05-17 16:56:41 +0000525 iOSVersion = Args.MakeJoinedArg(nullptr, O, iOSTarget);
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000526 Args.append(iOSVersion);
Daniel Dunbar84e727f2009-09-04 18:35:21 +0000527 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000528 }
Mike Stump11289f42009-09-09 15:08:12 +0000529
Tim Northover9c7e0352013-12-12 11:55:52 +0000530 DarwinPlatformKind Platform;
531 if (OSXVersion)
532 Platform = MacOS;
533 else if (iOSVersion)
534 Platform = IPhoneOS;
Tim Northover9c7e0352013-12-12 11:55:52 +0000535 else
Tim Northover157d9112014-01-16 08:48:16 +0000536 llvm_unreachable("Unable to infer Darwin variant");
Tim Northover9c7e0352013-12-12 11:55:52 +0000537
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000538 // Set the tool chain target information.
539 unsigned Major, Minor, Micro;
540 bool HadExtra;
Tim Northover9c7e0352013-12-12 11:55:52 +0000541 if (Platform == MacOS) {
Bob Wilson7f294b52014-10-10 23:10:10 +0000542 assert(!iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000543 if (!Driver::GetReleaseVersion(OSXVersion->getValue(), Major, Minor, Micro,
544 HadExtra) ||
545 HadExtra || Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000546 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000547 << OSXVersion->getAsString(Args);
Bob Wilson7f294b52014-10-10 23:10:10 +0000548 } else if (Platform == IPhoneOS) {
549 assert(iOSVersion && "Unknown target platform!");
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000550 if (!Driver::GetReleaseVersion(iOSVersion->getValue(), Major, Minor, Micro,
551 HadExtra) ||
552 HadExtra || Major >= 10 || Minor >= 100 || Micro >= 100)
Eli Friedman027e9c32012-01-11 02:41:15 +0000553 getDriver().Diag(diag::err_drv_invalid_version_number)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000554 << iOSVersion->getAsString(Args);
Tim Northover157d9112014-01-16 08:48:16 +0000555 } else
556 llvm_unreachable("unknown kind of Darwin platform");
Daniel Dunbar9aaeb642011-04-30 04:15:58 +0000557
Bob Wilson7f294b52014-10-10 23:10:10 +0000558 // Recognize iOS targets with an x86 architecture as the iOS simulator.
Daniel Dunbarb1189432011-04-30 04:18:16 +0000559 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
560 getTriple().getArch() == llvm::Triple::x86_64))
Tim Northover9c7e0352013-12-12 11:55:52 +0000561 Platform = IPhoneOSSimulator;
Daniel Dunbarb1189432011-04-30 04:18:16 +0000562
Tim Northover9c7e0352013-12-12 11:55:52 +0000563 setTarget(Platform, Major, Minor, Micro);
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000564}
565
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000566void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000567 ArgStringList &CmdArgs) const {
568 CXXStdlibType Type = GetCXXStdlibType(Args);
569
570 switch (Type) {
571 case ToolChain::CST_Libcxx:
572 CmdArgs.push_back("-lc++");
573 break;
574
Hans Wennborgdcfba332015-10-06 23:40:43 +0000575 case ToolChain::CST_Libstdcxx:
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000576 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
577 // it was previously found in the gcc lib dir. However, for all the Darwin
578 // platforms we care about it was -lstdc++.6, so we search for that
579 // explicitly if we can't see an obvious -lstdc++ candidate.
580
581 // Check in the sysroot first.
582 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000583 SmallString<128> P(A->getValue());
Benjamin Kramer17381a02013-06-28 16:25:46 +0000584 llvm::sys::path::append(P, "usr", "lib", "libstdc++.dylib");
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000585
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000586 if (!getVFS().exists(P)) {
Rafael Espindola358256c2013-06-26 02:13:00 +0000587 llvm::sys::path::remove_filename(P);
588 llvm::sys::path::append(P, "libstdc++.6.dylib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000589 if (getVFS().exists(P)) {
Yaron Keren92e1b622015-03-18 10:17:07 +0000590 CmdArgs.push_back(Args.MakeArgString(P));
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000591 return;
592 }
593 }
594 }
595
596 // Otherwise, look in the root.
Bob Wilson1a9ad0f2011-11-11 07:47:04 +0000597 // FIXME: This should be removed someday when we don't have to care about
598 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000599 if (!getVFS().exists("/usr/lib/libstdc++.dylib") &&
600 getVFS().exists("/usr/lib/libstdc++.6.dylib")) {
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000601 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
602 return;
603 }
604
605 // Otherwise, let the linker search.
606 CmdArgs.push_back("-lstdc++");
607 break;
608 }
Daniel Dunbar8fa86b12010-09-17 01:16:06 +0000609}
610
Shantonu Senafeb03b2010-09-17 18:39:08 +0000611void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
612 ArgStringList &CmdArgs) const {
613
614 // For Darwin platforms, use the compiler-rt-based support library
615 // instead of the gcc-provided one (which is also incidentally
616 // only present in the gcc lib dir, which makes it hard to find).
617
Rafael Espindola358256c2013-06-26 02:13:00 +0000618 SmallString<128> P(getDriver().ResourceDir);
Benjamin Kramer17381a02013-06-28 16:25:46 +0000619 llvm::sys::path::append(P, "lib", "darwin");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000620
621 // Use the newer cc_kext for iOS ARM after 6.0.
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000622 if (isTargetIPhoneOS()) {
623 llvm::sys::path::append(P, "libclang_rt.cc_kext_ios.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000624 } else {
Chris Bieneman25bc0de2015-09-23 22:52:35 +0000625 llvm::sys::path::append(P, "libclang_rt.cc_kext.a");
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000626 }
NAKAMURA Takumi8b73b3e2011-06-03 03:49:51 +0000627
Shantonu Senafeb03b2010-09-17 18:39:08 +0000628 // For now, allow missing resource libraries to support developers who may
629 // not have compiler-rt checked out or integrated into their build.
Benjamin Kramerd45b2052015-10-07 15:48:01 +0000630 if (getVFS().exists(P))
Yaron Keren92e1b622015-03-18 10:17:07 +0000631 CmdArgs.push_back(Args.MakeArgString(P));
Shantonu Senafeb03b2010-09-17 18:39:08 +0000632}
633
Tim Northover157d9112014-01-16 08:48:16 +0000634DerivedArgList *MachO::TranslateArgs(const DerivedArgList &Args,
635 const char *BoundArch) const {
Daniel Dunbarb2b8a912010-07-19 17:11:33 +0000636 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
637 const OptTable &Opts = getDriver().getOpts();
638
639 // FIXME: We really want to get out of the tool chain level argument
640 // translation business, as it makes the driver functionality much
641 // more opaque. For now, we follow gcc closely solely for the
642 // purpose of easily achieving feature parity & testability. Once we
643 // have something that works, we should reevaluate each translation
644 // and try to push it down into tool specific logic.
Daniel Dunbar3b8e50d2010-01-27 00:56:25 +0000645
Simon Atanasyan6f657c42014-05-08 19:32:46 +0000646 for (Arg *A : Args) {
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000647 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar471c4f82011-06-21 00:20:17 +0000648 // Skip this argument unless the architecture matches either the toolchain
649 // triple arch, or the arch being bound.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000650 llvm::Triple::ArchType XarchArch =
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000651 tools::darwin::getArchTypeForMachOArchName(A->getValue(0));
652 if (!(XarchArch == getArch() ||
653 (BoundArch &&
654 XarchArch ==
655 tools::darwin::getArchTypeForMachOArchName(BoundArch))))
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000656 continue;
657
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000658 Arg *OriginalArg = A;
Richard Smithbd55daf2012-11-01 04:30:05 +0000659 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000660 unsigned Prev = Index;
Nico Webera04d5f82014-05-11 17:27:13 +0000661 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
Mike Stump11289f42009-09-09 15:08:12 +0000662
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000663 // If the argument parsing failed or more than one argument was
664 // consumed, the -Xarch_ argument's parameter tried to consume
665 // extra arguments. Emit an error and ignore.
666 //
667 // We also want to disallow any options which would alter the
668 // driver behavior; that isn't going to work in our model. We
669 // use isDriverOption() as an approximation, although things
670 // like -O4 are going to slip through.
Daniel Dunbar5a784c82011-04-21 17:41:34 +0000671 if (!XarchArg || Index > Prev + 1) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000672 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000673 << A->getAsString(Args);
Daniel Dunbar6914a982011-04-21 17:32:21 +0000674 continue;
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000675 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000676 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000677 << A->getAsString(Args);
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000678 continue;
679 }
680
Daniel Dunbar53b406f2009-03-29 22:29:05 +0000681 XarchArg->setBaseArg(A);
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000682
Nico Webera04d5f82014-05-11 17:27:13 +0000683 A = XarchArg.release();
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +0000684 DAL->AddSynthesizedArg(A);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000685
686 // Linker input arguments require custom handling. The problem is that we
687 // have already constructed the phase actions, so we can not treat them as
688 // "input arguments".
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000689 if (A->getOption().hasFlag(options::LinkerInput)) {
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000690 // Convert the argument into individual Zlinker_input_args.
Douglas Katzman6bbffc42015-06-25 18:51:37 +0000691 for (const char *Value : A->getValues()) {
692 DAL->AddSeparateArg(
693 OriginalArg, Opts.getOption(options::OPT_Zlinker_input), Value);
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000694 }
695 continue;
696 }
Mike Stump11289f42009-09-09 15:08:12 +0000697 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000698
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000699 // Sob. These is strictly gcc compatible for the time being. Apple
700 // gcc translates options twice, which means that self-expanding
701 // options add duplicates.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000702 switch ((options::ID)A->getOption().getID()) {
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000703 default:
704 DAL->append(A);
705 break;
706
707 case options::OPT_mkernel:
708 case options::OPT_fapple_kext:
709 DAL->append(A);
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000710 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000711 break;
Mike Stump11289f42009-09-09 15:08:12 +0000712
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000713 case options::OPT_dependency_file:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000714 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF), A->getValue());
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000715 break;
716
717 case options::OPT_gfull:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000718 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000719 DAL->AddFlagArg(
720 A, Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000721 break;
722
723 case options::OPT_gused:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000724 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000725 DAL->AddFlagArg(
726 A, Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000727 break;
728
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000729 case options::OPT_shared:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000730 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000731 break;
732
733 case options::OPT_fconstant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000734 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000735 break;
736
737 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000738 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000739 break;
740
741 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000742 DAL->AddFlagArg(A,
743 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000744 break;
745
746 case options::OPT_Wno_nonportable_cfstrings:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000747 DAL->AddFlagArg(
748 A, Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000749 break;
750
751 case options::OPT_fpascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000752 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000753 break;
754
755 case options::OPT_fno_pascal_strings:
Daniel Dunbar2d6e9ee2010-06-14 20:20:41 +0000756 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000757 break;
758 }
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000759 }
760
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000761 if (getTriple().getArch() == llvm::Triple::x86 ||
762 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbarfffd1812009-11-19 04:00:53 +0000763 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000764 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mtune_EQ),
765 "core2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000766
767 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosier7c5d9082012-04-27 14:58:16 +0000768 // how the driver driver works.
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000769 if (BoundArch) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000770 StringRef Name = BoundArch;
Michael J. Spencerfc790902012-10-19 22:36:40 +0000771 const Option MCpu = Opts.getOption(options::OPT_mcpu_EQ);
772 const Option MArch = Opts.getOption(options::OPT_march_EQ);
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000773
774 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
775 // which defines the list of which architectures we accept.
776 if (Name == "ppc")
777 ;
778 else if (Name == "ppc601")
Craig Topper92fc2df2014-05-17 16:56:41 +0000779 DAL->AddJoinedArg(nullptr, MCpu, "601");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000780 else if (Name == "ppc603")
Craig Topper92fc2df2014-05-17 16:56:41 +0000781 DAL->AddJoinedArg(nullptr, MCpu, "603");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000782 else if (Name == "ppc604")
Craig Topper92fc2df2014-05-17 16:56:41 +0000783 DAL->AddJoinedArg(nullptr, MCpu, "604");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000784 else if (Name == "ppc604e")
Craig Topper92fc2df2014-05-17 16:56:41 +0000785 DAL->AddJoinedArg(nullptr, MCpu, "604e");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000786 else if (Name == "ppc750")
Craig Topper92fc2df2014-05-17 16:56:41 +0000787 DAL->AddJoinedArg(nullptr, MCpu, "750");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000788 else if (Name == "ppc7400")
Craig Topper92fc2df2014-05-17 16:56:41 +0000789 DAL->AddJoinedArg(nullptr, MCpu, "7400");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000790 else if (Name == "ppc7450")
Craig Topper92fc2df2014-05-17 16:56:41 +0000791 DAL->AddJoinedArg(nullptr, MCpu, "7450");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000792 else if (Name == "ppc970")
Craig Topper92fc2df2014-05-17 16:56:41 +0000793 DAL->AddJoinedArg(nullptr, MCpu, "970");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000794
Bill Schmidt778d3872013-07-26 01:36:11 +0000795 else if (Name == "ppc64" || Name == "ppc64le")
Craig Topper92fc2df2014-05-17 16:56:41 +0000796 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000797
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000798 else if (Name == "i386")
799 ;
800 else if (Name == "i486")
Craig Topper92fc2df2014-05-17 16:56:41 +0000801 DAL->AddJoinedArg(nullptr, MArch, "i486");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000802 else if (Name == "i586")
Craig Topper92fc2df2014-05-17 16:56:41 +0000803 DAL->AddJoinedArg(nullptr, MArch, "i586");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000804 else if (Name == "i686")
Craig Topper92fc2df2014-05-17 16:56:41 +0000805 DAL->AddJoinedArg(nullptr, MArch, "i686");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000806 else if (Name == "pentium")
Craig Topper92fc2df2014-05-17 16:56:41 +0000807 DAL->AddJoinedArg(nullptr, MArch, "pentium");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000808 else if (Name == "pentium2")
Craig Topper92fc2df2014-05-17 16:56:41 +0000809 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000810 else if (Name == "pentpro")
Craig Topper92fc2df2014-05-17 16:56:41 +0000811 DAL->AddJoinedArg(nullptr, MArch, "pentiumpro");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000812 else if (Name == "pentIIm3")
Craig Topper92fc2df2014-05-17 16:56:41 +0000813 DAL->AddJoinedArg(nullptr, MArch, "pentium2");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000814
815 else if (Name == "x86_64")
Craig Topper92fc2df2014-05-17 16:56:41 +0000816 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
Jim Grosbach82eee262013-11-16 00:53:35 +0000817 else if (Name == "x86_64h") {
Craig Topper92fc2df2014-05-17 16:56:41 +0000818 DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_m64));
819 DAL->AddJoinedArg(nullptr, MArch, "x86_64h");
Jim Grosbach82eee262013-11-16 00:53:35 +0000820 }
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000821
822 else if (Name == "arm")
Craig Topper92fc2df2014-05-17 16:56:41 +0000823 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000824 else if (Name == "armv4t")
Craig Topper92fc2df2014-05-17 16:56:41 +0000825 DAL->AddJoinedArg(nullptr, MArch, "armv4t");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000826 else if (Name == "armv5")
Craig Topper92fc2df2014-05-17 16:56:41 +0000827 DAL->AddJoinedArg(nullptr, MArch, "armv5tej");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000828 else if (Name == "xscale")
Craig Topper92fc2df2014-05-17 16:56:41 +0000829 DAL->AddJoinedArg(nullptr, MArch, "xscale");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000830 else if (Name == "armv6")
Craig Topper92fc2df2014-05-17 16:56:41 +0000831 DAL->AddJoinedArg(nullptr, MArch, "armv6k");
Bob Wilson743bf672013-03-04 22:37:49 +0000832 else if (Name == "armv6m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000833 DAL->AddJoinedArg(nullptr, MArch, "armv6m");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000834 else if (Name == "armv7")
Craig Topper92fc2df2014-05-17 16:56:41 +0000835 DAL->AddJoinedArg(nullptr, MArch, "armv7a");
Bob Wilson743bf672013-03-04 22:37:49 +0000836 else if (Name == "armv7em")
Craig Topper92fc2df2014-05-17 16:56:41 +0000837 DAL->AddJoinedArg(nullptr, MArch, "armv7em");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000838 else if (Name == "armv7k")
Craig Topper92fc2df2014-05-17 16:56:41 +0000839 DAL->AddJoinedArg(nullptr, MArch, "armv7k");
Bob Wilson743bf672013-03-04 22:37:49 +0000840 else if (Name == "armv7m")
Craig Topper92fc2df2014-05-17 16:56:41 +0000841 DAL->AddJoinedArg(nullptr, MArch, "armv7m");
Bob Wilsond7cf1042012-09-29 23:52:50 +0000842 else if (Name == "armv7s")
Craig Topper92fc2df2014-05-17 16:56:41 +0000843 DAL->AddJoinedArg(nullptr, MArch, "armv7s");
Daniel Dunbar3c7b9ca2009-09-09 22:33:15 +0000844 }
Daniel Dunbar0af75a12009-03-25 06:58:31 +0000845
Tim Northover157d9112014-01-16 08:48:16 +0000846 return DAL;
847}
848
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000849void MachO::AddLinkRuntimeLibArgs(const ArgList &Args,
850 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000851 // Embedded targets are simple at the moment, not supporting sanitizers and
852 // with different libraries for each member of the product { static, PIC } x
853 // { hard-float, soft-float }
854 llvm::SmallString<32> CompilerRT = StringRef("libclang_rt.");
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000855 CompilerRT +=
856 (tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard)
857 ? "hard"
858 : "soft";
Tim Northover157d9112014-01-16 08:48:16 +0000859 CompilerRT += Args.hasArg(options::OPT_fPIC) ? "_pic.a" : "_static.a";
860
861 AddLinkRuntimeLib(Args, CmdArgs, CompilerRT, false, true);
862}
863
Tim Northover157d9112014-01-16 08:48:16 +0000864DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
865 const char *BoundArch) const {
866 // First get the generic Apple args, before moving onto Darwin-specific ones.
867 DerivedArgList *DAL = MachO::TranslateArgs(Args, BoundArch);
868 const OptTable &Opts = getDriver().getOpts();
869
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000870 // If no architecture is bound, none of the translations here are relevant.
871 if (!BoundArch)
872 return DAL;
873
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000874 // Add an explicit version min argument for the deployment target. We do this
875 // after argument translation because -Xarch_ arguments may add a version min
876 // argument.
Bob Wilsonf8cf1612014-02-21 00:20:07 +0000877 AddDeploymentTarget(*DAL);
Daniel Dunbar354e96d2010-07-19 17:11:36 +0000878
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000879 // For iOS 6, undo the translation to add -static for -mkernel/-fapple-kext.
880 // FIXME: It would be far better to avoid inserting those -static arguments,
881 // but we can't check the deployment target in the translation code until
882 // it is set here.
Bob Wilson5f4346d2014-12-02 00:27:35 +0000883 if (isTargetIOSBased() && !isIPhoneOSVersionLT(6, 0)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000884 for (ArgList::iterator it = DAL->begin(), ie = DAL->end(); it != ie;) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000885 Arg *A = *it;
886 ++it;
887 if (A->getOption().getID() != options::OPT_mkernel &&
888 A->getOption().getID() != options::OPT_fapple_kext)
889 continue;
890 assert(it != ie && "unexpected argument translation");
891 A = *it;
892 assert(A->getOption().getID() == options::OPT_static &&
893 "missing expected -static argument");
894 it = DAL->getArgs().erase(it);
895 }
896 }
897
Bob Wilson0f7445b2013-11-02 23:19:53 +0000898 // Default to use libc++ on OS X 10.9+ and iOS 7+.
899 if (((isTargetMacOS() && !isMacosxVersionLT(10, 9)) ||
Tim Northover9c7e0352013-12-12 11:55:52 +0000900 (isTargetIOSBased() && !isIPhoneOSVersionLT(7, 0))) &&
Bob Wilson0f7445b2013-11-02 23:19:53 +0000901 !Args.getLastArg(options::OPT_stdlib_EQ))
Craig Topper92fc2df2014-05-17 16:56:41 +0000902 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_stdlib_EQ),
903 "libc++");
Bob Wilson0f7445b2013-11-02 23:19:53 +0000904
Bob Wilson102be442011-10-07 17:54:41 +0000905 // Validate the C++ standard library choice.
906 CXXStdlibType Type = GetCXXStdlibType(*DAL);
907 if (Type == ToolChain::CST_Libcxx) {
John McCall5fb5df92012-06-20 06:18:46 +0000908 // Check whether the target provides libc++.
909 StringRef where;
910
Alp Tokerf6a24ce2013-12-05 16:25:25 +0000911 // Complain about targeting iOS < 5.0 in any way.
Tim Northover9c7e0352013-12-12 11:55:52 +0000912 if (isTargetIOSBased() && isIPhoneOSVersionLT(5, 0))
Bob Wilson5ad5a952012-11-09 01:59:30 +0000913 where = "iOS 5.0";
John McCall5fb5df92012-06-20 06:18:46 +0000914
915 if (where != StringRef()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000916 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment) << where;
Bob Wilson102be442011-10-07 17:54:41 +0000917 }
918 }
919
Daniel Dunbaraabb0b12009-03-25 06:12:34 +0000920 return DAL;
Mike Stump11289f42009-09-09 15:08:12 +0000921}
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000922
Tim Northover157d9112014-01-16 08:48:16 +0000923bool MachO::IsUnwindTablesDefault() const {
Rafael Espindolae8bd4e52012-10-07 03:23:40 +0000924 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000925}
926
Tim Northover157d9112014-01-16 08:48:16 +0000927bool MachO::UseDwarfDebugFlags() const {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +0000928 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
929 return S[0] != '\0';
930 return false;
931}
932
Daniel Dunbar3241d402010-02-10 18:49:11 +0000933bool Darwin::UseSjLjExceptions() const {
934 // Darwin uses SjLj exceptions on ARM.
935 return (getTriple().getArch() == llvm::Triple::arm ||
936 getTriple().getArch() == llvm::Triple::thumb);
937}
938
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000939bool MachO::isPICDefault() const { return true; }
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000940
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000941bool MachO::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +0000942
Tim Northover157d9112014-01-16 08:48:16 +0000943bool MachO::isPICDefaultForced() const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000944 return (getArch() == llvm::Triple::x86_64 ||
Tim Northover573cbee2014-05-24 12:52:07 +0000945 getArch() == llvm::Triple::aarch64);
Daniel Dunbar03e0a4f2009-03-20 00:57:52 +0000946}
947
Tim Northover157d9112014-01-16 08:48:16 +0000948bool MachO::SupportsProfiling() const {
Daniel Dunbar733b0f82011-03-01 18:49:30 +0000949 // Profiling instrumentation is only supported on x86.
Rafael Espindola35ca7d92012-10-07 04:44:33 +0000950 return getArch() == llvm::Triple::x86 || getArch() == llvm::Triple::x86_64;
Daniel Dunbar733b0f82011-03-01 18:49:30 +0000951}
952
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000953void Darwin::addMinVersionArgs(const ArgList &Args,
954 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000955 VersionTuple TargetVersion = getTargetVersion();
956
Bob Wilson771b7cd2014-10-10 19:38:34 +0000957 if (isTargetIOSSimulator())
Tim Northover157d9112014-01-16 08:48:16 +0000958 CmdArgs.push_back("-ios_simulator_version_min");
Bob Wilson5cfc55e2014-02-01 21:06:21 +0000959 else if (isTargetIOSBased())
Tim Northover157d9112014-01-16 08:48:16 +0000960 CmdArgs.push_back("-iphoneos_version_min");
961 else {
962 assert(isTargetMacOS() && "unexpected target");
963 CmdArgs.push_back("-macosx_version_min");
964 }
965
966 CmdArgs.push_back(Args.MakeArgString(TargetVersion.getAsString()));
967}
968
Douglas Katzmanf08fadf2015-06-04 14:40:44 +0000969void Darwin::addStartObjectFileArgs(const ArgList &Args,
970 ArgStringList &CmdArgs) const {
Tim Northover157d9112014-01-16 08:48:16 +0000971 // Derived from startfile spec.
972 if (Args.hasArg(options::OPT_dynamiclib)) {
973 // Derived from darwin_dylib1 spec.
974 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +0000975 ; // iOS simulator does not need dylib1.o.
Tim Northover157d9112014-01-16 08:48:16 +0000976 } else if (isTargetIPhoneOS()) {
977 if (isIPhoneOSVersionLT(3, 1))
978 CmdArgs.push_back("-ldylib1.o");
979 } else {
980 if (isMacosxVersionLT(10, 5))
981 CmdArgs.push_back("-ldylib1.o");
982 else if (isMacosxVersionLT(10, 6))
983 CmdArgs.push_back("-ldylib1.10.5.o");
984 }
985 } else {
986 if (Args.hasArg(options::OPT_bundle)) {
987 if (!Args.hasArg(options::OPT_static)) {
988 // Derived from darwin_bundle1 spec.
989 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +0000990 ; // iOS simulator does not need bundle1.o.
Tim Northover157d9112014-01-16 08:48:16 +0000991 } else if (isTargetIPhoneOS()) {
992 if (isIPhoneOSVersionLT(3, 1))
993 CmdArgs.push_back("-lbundle1.o");
994 } else {
995 if (isMacosxVersionLT(10, 6))
996 CmdArgs.push_back("-lbundle1.o");
997 }
998 }
999 } else {
1000 if (Args.hasArg(options::OPT_pg) && SupportsProfiling()) {
1001 if (Args.hasArg(options::OPT_static) ||
1002 Args.hasArg(options::OPT_object) ||
1003 Args.hasArg(options::OPT_preload)) {
1004 CmdArgs.push_back("-lgcrt0.o");
1005 } else {
1006 CmdArgs.push_back("-lgcrt1.o");
1007
1008 // darwin_crt2 spec is empty.
1009 }
1010 // By default on OS X 10.8 and later, we don't link with a crt1.o
1011 // file and the linker knows to use _main as the entry point. But,
1012 // when compiling with -pg, we need to link with the gcrt1.o file,
1013 // so pass the -no_new_main option to tell the linker to use the
1014 // "start" symbol as the entry point.
1015 if (isTargetMacOS() && !isMacosxVersionLT(10, 8))
1016 CmdArgs.push_back("-no_new_main");
1017 } else {
1018 if (Args.hasArg(options::OPT_static) ||
1019 Args.hasArg(options::OPT_object) ||
1020 Args.hasArg(options::OPT_preload)) {
1021 CmdArgs.push_back("-lcrt0.o");
1022 } else {
1023 // Derived from darwin_crt1 spec.
1024 if (isTargetIOSSimulator()) {
Bob Wilson74b6cd12014-01-21 00:17:10 +00001025 ; // iOS simulator does not need crt1.o.
Tim Northover157d9112014-01-16 08:48:16 +00001026 } else if (isTargetIPhoneOS()) {
Tim Northover40956e62014-07-23 12:32:58 +00001027 if (getArch() == llvm::Triple::aarch64)
Tim Northovera2ee4332014-03-29 15:09:45 +00001028 ; // iOS does not need any crt1 files for arm64
1029 else if (isIPhoneOSVersionLT(3, 1))
Tim Northover157d9112014-01-16 08:48:16 +00001030 CmdArgs.push_back("-lcrt1.o");
1031 else if (isIPhoneOSVersionLT(6, 0))
1032 CmdArgs.push_back("-lcrt1.3.1.o");
1033 } else {
1034 if (isMacosxVersionLT(10, 5))
1035 CmdArgs.push_back("-lcrt1.o");
1036 else if (isMacosxVersionLT(10, 6))
1037 CmdArgs.push_back("-lcrt1.10.5.o");
1038 else if (isMacosxVersionLT(10, 8))
1039 CmdArgs.push_back("-lcrt1.10.6.o");
1040
1041 // darwin_crt2 spec is empty.
1042 }
1043 }
1044 }
1045 }
1046 }
1047
1048 if (!isTargetIPhoneOS() && Args.hasArg(options::OPT_shared_libgcc) &&
1049 isMacosxVersionLT(10, 5)) {
1050 const char *Str = Args.MakeArgString(GetFilePath("crt3.o"));
1051 CmdArgs.push_back(Str);
1052 }
1053}
1054
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001055bool Darwin::SupportsObjCGC() const { return isTargetMacOS(); }
Daniel Dunbar16334e12010-04-10 16:20:23 +00001056
John McCall3deb1ad2012-08-21 02:47:43 +00001057void Darwin::CheckObjCARC() const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001058 if (isTargetIOSBased() || (isTargetMacOS() && !isMacosxVersionLT(10, 6)))
John McCall3deb1ad2012-08-21 02:47:43 +00001059 return;
John McCall93207072012-08-27 01:56:21 +00001060 getDriver().Diag(diag::err_arc_unsupported_on_toolchain);
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00001061}
1062
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001063SanitizerMask Darwin::getSupportedSanitizers() const {
1064 SanitizerMask Res = ToolChain::getSupportedSanitizers();
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001065 if (isTargetMacOS() || isTargetIOSSimulator())
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001066 Res |= SanitizerKind::Address;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001067 if (isTargetMacOS()) {
1068 if (!isMacosxVersionLT(10, 9))
1069 Res |= SanitizerKind::Vptr;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001070 Res |= SanitizerKind::SafeStack;
Alexey Samsonov1d4cff22015-06-25 00:58:02 +00001071 }
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00001072 return Res;
1073}
1074
Daniel Dunbar59e5e882009-03-20 00:20:03 +00001075/// Generic_GCC - A tool chain using the 'gcc' command to perform
1076/// all subcommands; this relies on gcc translating the majority of
1077/// command line options.
1078
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001079/// \brief Parse a GCCVersion object out of a string of text.
1080///
1081/// This is the primary means of forming GCCVersion objects.
1082/*static*/
1083Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001084 const GCCVersion BadVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001085 std::pair<StringRef, StringRef> First = VersionText.split('.');
1086 std::pair<StringRef, StringRef> Second = First.second.split('.');
1087
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001088 GCCVersion GoodVersion = {VersionText.str(), -1, -1, -1, "", "", ""};
1089 if (First.first.getAsInteger(10, GoodVersion.Major) || GoodVersion.Major < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001090 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001091 GoodVersion.MajorStr = First.first.str();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001092 if (Second.first.getAsInteger(10, GoodVersion.Minor) || GoodVersion.Minor < 0)
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001093 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001094 GoodVersion.MinorStr = Second.first.str();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001095
1096 // First look for a number prefix and parse that if present. Otherwise just
1097 // stash the entire patch string in the suffix, and leave the number
1098 // unspecified. This covers versions strings such as:
1099 // 4.4
1100 // 4.4.0
1101 // 4.4.x
1102 // 4.4.2-rc4
1103 // 4.4.x-patched
1104 // And retains any patch number it finds.
1105 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
1106 if (!PatchText.empty()) {
Will Dietza38608b2013-01-10 22:20:02 +00001107 if (size_t EndNumber = PatchText.find_first_not_of("0123456789")) {
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001108 // Try to parse the number and any suffix.
1109 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1110 GoodVersion.Patch < 0)
1111 return BadVersion;
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00001112 GoodVersion.PatchSuffix = PatchText.substr(EndNumber);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001113 }
1114 }
1115
1116 return GoodVersion;
1117}
1118
1119/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001120bool Generic_GCC::GCCVersion::isOlderThan(int RHSMajor, int RHSMinor,
1121 int RHSPatch,
1122 StringRef RHSPatchSuffix) const {
1123 if (Major != RHSMajor)
1124 return Major < RHSMajor;
1125 if (Minor != RHSMinor)
1126 return Minor < RHSMinor;
1127 if (Patch != RHSPatch) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001128 // Note that versions without a specified patch sort higher than those with
1129 // a patch.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001130 if (RHSPatch == -1)
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001131 return true;
1132 if (Patch == -1)
1133 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001134
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001135 // Otherwise just sort on the patch itself.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001136 return Patch < RHSPatch;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001137 }
Benjamin Kramer604e8482013-08-09 17:17:48 +00001138 if (PatchSuffix != RHSPatchSuffix) {
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001139 // Sort empty suffixes higher.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001140 if (RHSPatchSuffix.empty())
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001141 return true;
1142 if (PatchSuffix.empty())
Chandler Carruth19e8bea2012-12-29 13:00:47 +00001143 return false;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001144
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001145 // Provide a lexicographic sort to make this a total ordering.
Benjamin Kramer604e8482013-08-09 17:17:48 +00001146 return PatchSuffix < RHSPatchSuffix;
Chandler Carruth5193dfc2012-12-29 12:01:08 +00001147 }
1148
1149 // The versions are equal.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001150 return false;
1151}
1152
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001153static llvm::StringRef getGCCToolchainDir(const ArgList &Args) {
Rafael Espindola1af7c212012-02-19 01:38:32 +00001154 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1155 if (A)
Richard Smithbd55daf2012-11-01 04:30:05 +00001156 return A->getValue();
Rafael Espindola1af7c212012-02-19 01:38:32 +00001157 return GCC_INSTALL_PREFIX;
1158}
1159
Roman Divacky326d9982013-12-06 18:32:18 +00001160/// \brief Initialize a GCCInstallationDetector from the driver.
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001161///
1162/// This performs all of the autodetection and sets up the various paths.
Gabor Greif8a45d572012-04-17 11:16:26 +00001163/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth866faab2012-01-25 07:21:38 +00001164///
1165/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1166/// should instead pull the target out of the driver. This is currently
1167/// necessary because the driver doesn't store the final version of the target
1168/// triple.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001169void Generic_GCC::GCCInstallationDetector::init(
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001170 const llvm::Triple &TargetTriple, const ArgList &Args,
Douglas Katzman8c39e6a2015-09-18 15:23:16 +00001171 ArrayRef<std::string> ExtraTripleAliases) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001172 llvm::Triple BiarchVariantTriple = TargetTriple.isArch32Bit()
1173 ? TargetTriple.get64BitArchVariant()
1174 : TargetTriple.get32BitArchVariant();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001175 // The library directories which may contain GCC installations.
Chandler Carruthb427c562013-06-22 11:35:51 +00001176 SmallVector<StringRef, 4> CandidateLibDirs, CandidateBiarchLibDirs;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001177 // The compatible GCC triples for this particular architecture.
Hans Wennborg90aa63f2014-08-11 18:09:28 +00001178 SmallVector<StringRef, 16> CandidateTripleAliases;
1179 SmallVector<StringRef, 16> CandidateBiarchTripleAliases;
Chandler Carruthb427c562013-06-22 11:35:51 +00001180 CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs,
1181 CandidateTripleAliases, CandidateBiarchLibDirs,
1182 CandidateBiarchTripleAliases);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001183
1184 // Compute the set of prefixes for our search.
1185 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1186 D.PrefixDirs.end());
Rafael Espindolac29af942012-02-03 01:01:20 +00001187
Rafael Espindola1af7c212012-02-19 01:38:32 +00001188 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1189 if (GCCToolchainDir != "") {
1190 if (GCCToolchainDir.back() == '/')
1191 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindolac29af942012-02-03 01:01:20 +00001192
Rafael Espindola1af7c212012-02-19 01:38:32 +00001193 Prefixes.push_back(GCCToolchainDir);
Rafael Espindolac29af942012-02-03 01:01:20 +00001194 } else {
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001195 // If we have a SysRoot, try that first.
1196 if (!D.SysRoot.empty()) {
1197 Prefixes.push_back(D.SysRoot);
1198 Prefixes.push_back(D.SysRoot + "/usr");
1199 }
1200
1201 // Then look for gcc installed alongside clang.
Rafael Espindolac29af942012-02-03 01:01:20 +00001202 Prefixes.push_back(D.InstalledDir + "/..");
Rafael Espindola0f4b04e2013-08-28 23:17:47 +00001203
1204 // And finally in /usr.
1205 if (D.SysRoot.empty())
1206 Prefixes.push_back("/usr");
Rafael Espindolac29af942012-02-03 01:01:20 +00001207 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001208
1209 // Loop over the various components which exist and select the best GCC
1210 // installation available. GCC installs are ranked by version number.
1211 Version = GCCVersion::Parse("0.0.0");
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001212 for (const std::string &Prefix : Prefixes) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001213 if (!D.getVFS().exists(Prefix))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001214 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001215 for (StringRef Suffix : CandidateLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001216 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001217 if (!D.getVFS().exists(LibDir))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001218 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001219 for (StringRef Candidate : ExtraTripleAliases) // Try these first.
Douglas Katzmand6e597c2015-09-17 19:56:40 +00001220 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Benjamin Kramer72e64312015-09-24 14:48:49 +00001221 for (StringRef Candidate : CandidateTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001222 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate);
Chandler Carruth866faab2012-01-25 07:21:38 +00001223 }
Benjamin Kramer72e64312015-09-24 14:48:49 +00001224 for (StringRef Suffix : CandidateBiarchLibDirs) {
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001225 const std::string LibDir = Prefix + Suffix.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001226 if (!D.getVFS().exists(LibDir))
Chandler Carruth866faab2012-01-25 07:21:38 +00001227 continue;
Benjamin Kramer72e64312015-09-24 14:48:49 +00001228 for (StringRef Candidate : CandidateBiarchTripleAliases)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00001229 ScanLibDirForGCCTriple(TargetTriple, Args, LibDir, Candidate,
Chandler Carruthb427c562013-06-22 11:35:51 +00001230 /*NeedsBiarchSuffix=*/ true);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001231 }
1232 }
1233}
1234
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001235void Generic_GCC::GCCInstallationDetector::print(raw_ostream &OS) const {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001236 for (const auto &InstallPath : CandidateGCCInstallPaths)
1237 OS << "Found candidate GCC installation: " << InstallPath << "\n";
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001238
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001239 if (!GCCInstallPath.empty())
1240 OS << "Selected GCC installation: " << GCCInstallPath << "\n";
1241
Simon Atanasyan6f657c42014-05-08 19:32:46 +00001242 for (const auto &Multilib : Multilibs)
1243 OS << "Candidate multilib: " << Multilib << "\n";
Yunzhong Gaoe3f902c2014-02-19 19:06:58 +00001244
1245 if (Multilibs.size() != 0 || !SelectedMultilib.isDefault())
1246 OS << "Selected multilib: " << SelectedMultilib << "\n";
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001247}
1248
1249bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const {
1250 if (BiarchSibling.hasValue()) {
1251 M = BiarchSibling.getValue();
1252 return true;
1253 }
1254 return false;
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00001255}
1256
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001257/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruthb427c562013-06-22 11:35:51 +00001258 const llvm::Triple &TargetTriple, const llvm::Triple &BiarchTriple,
Chandler Carruth866faab2012-01-25 07:21:38 +00001259 SmallVectorImpl<StringRef> &LibDirs,
1260 SmallVectorImpl<StringRef> &TripleAliases,
Chandler Carruthb427c562013-06-22 11:35:51 +00001261 SmallVectorImpl<StringRef> &BiarchLibDirs,
1262 SmallVectorImpl<StringRef> &BiarchTripleAliases) {
Chandler Carruth866faab2012-01-25 07:21:38 +00001263 // Declare a bunch of static data sets that we'll select between below. These
1264 // are specifically designed to always refer to string literals to avoid any
1265 // lifetime or initialization issues.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001266 static const char *const AArch64LibDirs[] = {"/lib64", "/lib"};
1267 static const char *const AArch64Triples[] = {
1268 "aarch64-none-linux-gnu", "aarch64-linux-gnu", "aarch64-linux-android",
1269 "aarch64-redhat-linux"};
1270 static const char *const AArch64beLibDirs[] = {"/lib"};
1271 static const char *const AArch64beTriples[] = {"aarch64_be-none-linux-gnu",
1272 "aarch64_be-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00001273
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001274 static const char *const ARMLibDirs[] = {"/lib"};
1275 static const char *const ARMTriples[] = {"arm-linux-gnueabi",
1276 "arm-linux-androideabi"};
1277 static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf",
1278 "armv7hl-redhat-linux-gnueabi"};
1279 static const char *const ARMebLibDirs[] = {"/lib"};
1280 static const char *const ARMebTriples[] = {"armeb-linux-gnueabi",
1281 "armeb-linux-androideabi"};
1282 static const char *const ARMebHFTriples[] = {
1283 "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001284
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001285 static const char *const X86_64LibDirs[] = {"/lib64", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001286 static const char *const X86_64Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001287 "x86_64-linux-gnu", "x86_64-unknown-linux-gnu",
1288 "x86_64-pc-linux-gnu", "x86_64-redhat-linux6E",
1289 "x86_64-redhat-linux", "x86_64-suse-linux",
1290 "x86_64-manbo-linux-gnu", "x86_64-linux-gnu",
1291 "x86_64-slackware-linux", "x86_64-linux-android",
1292 "x86_64-unknown-linux"};
1293 static const char *const X32LibDirs[] = {"/libx32"};
1294 static const char *const X86LibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001295 static const char *const X86Triples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001296 "i686-linux-gnu", "i686-pc-linux-gnu", "i486-linux-gnu",
1297 "i386-linux-gnu", "i386-redhat-linux6E", "i686-redhat-linux",
1298 "i586-redhat-linux", "i386-redhat-linux", "i586-suse-linux",
1299 "i486-slackware-linux", "i686-montavista-linux", "i686-linux-android",
1300 "i586-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001301
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001302 static const char *const MIPSLibDirs[] = {"/lib"};
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00001303 static const char *const MIPSTriples[] = {
1304 "mips-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu"};
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001305 static const char *const MIPSELLibDirs[] = {"/lib"};
1306 static const char *const MIPSELTriples[] = {
1307 "mipsel-linux-gnu", "mipsel-linux-android", "mips-img-linux-gnu"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001308
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001309 static const char *const MIPS64LibDirs[] = {"/lib64", "/lib"};
1310 static const char *const MIPS64Triples[] = {
1311 "mips64-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1312 "mips64-linux-gnuabi64"};
1313 static const char *const MIPS64ELLibDirs[] = {"/lib64", "/lib"};
1314 static const char *const MIPS64ELTriples[] = {
1315 "mips64el-linux-gnu", "mips-mti-linux-gnu", "mips-img-linux-gnu",
1316 "mips64el-linux-android", "mips64el-linux-gnuabi64"};
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001317
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001318 static const char *const PPCLibDirs[] = {"/lib32", "/lib"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001319 static const char *const PPCTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001320 "powerpc-linux-gnu", "powerpc-unknown-linux-gnu", "powerpc-linux-gnuspe",
1321 "powerpc-suse-linux", "powerpc-montavista-linuxspe"};
1322 static const char *const PPC64LibDirs[] = {"/lib64", "/lib"};
1323 static const char *const PPC64Triples[] = {
1324 "powerpc64-linux-gnu", "powerpc64-unknown-linux-gnu",
1325 "powerpc64-suse-linux", "ppc64-redhat-linux"};
1326 static const char *const PPC64LELibDirs[] = {"/lib64", "/lib"};
1327 static const char *const PPC64LETriples[] = {
1328 "powerpc64le-linux-gnu", "powerpc64le-unknown-linux-gnu",
1329 "powerpc64le-suse-linux", "ppc64le-redhat-linux"};
Chandler Carruth866faab2012-01-25 07:21:38 +00001330
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001331 static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"};
1332 static const char *const SPARCv8Triples[] = {"sparc-linux-gnu",
1333 "sparcv8-linux-gnu"};
1334 static const char *const SPARCv9LibDirs[] = {"/lib64", "/lib"};
1335 static const char *const SPARCv9Triples[] = {"sparc64-linux-gnu",
1336 "sparcv9-linux-gnu"};
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001337
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001338 static const char *const SystemZLibDirs[] = {"/lib64", "/lib"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001339 static const char *const SystemZTriples[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001340 "s390x-linux-gnu", "s390x-unknown-linux-gnu", "s390x-ibm-linux-gnu",
1341 "s390x-suse-linux", "s390x-redhat-linux"};
Ulrich Weigand47445072013-05-06 16:26:41 +00001342
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001343 // Solaris.
1344 static const char *const SolarisSPARCLibDirs[] = {"/gcc"};
1345 static const char *const SolarisSPARCTriples[] = {"sparc-sun-solaris2.11",
1346 "i386-pc-solaris2.11"};
1347
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001348 using std::begin;
1349 using std::end;
1350
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001351 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
1352 LibDirs.append(begin(SolarisSPARCLibDirs), end(SolarisSPARCLibDirs));
1353 TripleAliases.append(begin(SolarisSPARCTriples), end(SolarisSPARCTriples));
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001354 return;
1355 }
1356
Chandler Carruth866faab2012-01-25 07:21:38 +00001357 switch (TargetTriple.getArch()) {
Tim Northover9bb857a2013-01-31 12:13:10 +00001358 case llvm::Triple::aarch64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001359 LibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1360 TripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
1361 BiarchLibDirs.append(begin(AArch64LibDirs), end(AArch64LibDirs));
1362 BiarchTripleAliases.append(begin(AArch64Triples), end(AArch64Triples));
Tim Northover9bb857a2013-01-31 12:13:10 +00001363 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00001364 case llvm::Triple::aarch64_be:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001365 LibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1366 TripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
1367 BiarchLibDirs.append(begin(AArch64beLibDirs), end(AArch64beLibDirs));
1368 BiarchTripleAliases.append(begin(AArch64beTriples), end(AArch64beTriples));
Christian Pirkera74c7912014-03-14 12:15:45 +00001369 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001370 case llvm::Triple::arm:
1371 case llvm::Triple::thumb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001372 LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001373 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001374 TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001375 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001376 TripleAliases.append(begin(ARMTriples), end(ARMTriples));
Jiangning Liu61b06cb2012-07-31 08:06:29 +00001377 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001378 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001379 case llvm::Triple::armeb:
1380 case llvm::Triple::thumbeb:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001381 LibDirs.append(begin(ARMebLibDirs), end(ARMebLibDirs));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001382 if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001383 TripleAliases.append(begin(ARMebHFTriples), end(ARMebHFTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001384 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001385 TripleAliases.append(begin(ARMebTriples), end(ARMebTriples));
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001386 }
1387 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001388 case llvm::Triple::x86_64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001389 LibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1390 TripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
1391 // x32 is always available when x86_64 is available, so adding it as
1392 // secondary arch with x86_64 triples
Zinovy Nis1db95732014-07-10 15:27:19 +00001393 if (TargetTriple.getEnvironment() == llvm::Triple::GNUX32) {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001394 BiarchLibDirs.append(begin(X32LibDirs), end(X32LibDirs));
1395 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001396 } else {
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001397 BiarchLibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1398 BiarchTripleAliases.append(begin(X86Triples), end(X86Triples));
Zinovy Nis1db95732014-07-10 15:27:19 +00001399 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001400 break;
1401 case llvm::Triple::x86:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001402 LibDirs.append(begin(X86LibDirs), end(X86LibDirs));
1403 TripleAliases.append(begin(X86Triples), end(X86Triples));
1404 BiarchLibDirs.append(begin(X86_64LibDirs), end(X86_64LibDirs));
1405 BiarchTripleAliases.append(begin(X86_64Triples), end(X86_64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001406 break;
1407 case llvm::Triple::mips:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001408 LibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1409 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1410 BiarchLibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1411 BiarchTripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001412 break;
1413 case llvm::Triple::mipsel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001414 LibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1415 TripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1416 TripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
1417 BiarchLibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1418 BiarchTripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001419 break;
1420 case llvm::Triple::mips64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001421 LibDirs.append(begin(MIPS64LibDirs), end(MIPS64LibDirs));
1422 TripleAliases.append(begin(MIPS64Triples), end(MIPS64Triples));
1423 BiarchLibDirs.append(begin(MIPSLibDirs), end(MIPSLibDirs));
1424 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Simon Atanasyan9bb634d2012-04-26 19:57:02 +00001425 break;
1426 case llvm::Triple::mips64el:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001427 LibDirs.append(begin(MIPS64ELLibDirs), end(MIPS64ELLibDirs));
1428 TripleAliases.append(begin(MIPS64ELTriples), end(MIPS64ELTriples));
1429 BiarchLibDirs.append(begin(MIPSELLibDirs), end(MIPSELLibDirs));
1430 BiarchTripleAliases.append(begin(MIPSELTriples), end(MIPSELTriples));
1431 BiarchTripleAliases.append(begin(MIPSTriples), end(MIPSTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001432 break;
1433 case llvm::Triple::ppc:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001434 LibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1435 TripleAliases.append(begin(PPCTriples), end(PPCTriples));
1436 BiarchLibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1437 BiarchTripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001438 break;
1439 case llvm::Triple::ppc64:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001440 LibDirs.append(begin(PPC64LibDirs), end(PPC64LibDirs));
1441 TripleAliases.append(begin(PPC64Triples), end(PPC64Triples));
1442 BiarchLibDirs.append(begin(PPCLibDirs), end(PPCLibDirs));
1443 BiarchTripleAliases.append(begin(PPCTriples), end(PPCTriples));
Chandler Carruth866faab2012-01-25 07:21:38 +00001444 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00001445 case llvm::Triple::ppc64le:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001446 LibDirs.append(begin(PPC64LELibDirs), end(PPC64LELibDirs));
1447 TripleAliases.append(begin(PPC64LETriples), end(PPC64LETriples));
Bill Schmidt778d3872013-07-26 01:36:11 +00001448 break;
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001449 case llvm::Triple::sparc:
Douglas Katzmanb76a3df2015-09-02 13:33:42 +00001450 case llvm::Triple::sparcel:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001451 LibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1452 TripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
1453 BiarchLibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1454 BiarchTripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001455 break;
1456 case llvm::Triple::sparcv9:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001457 LibDirs.append(begin(SPARCv9LibDirs), end(SPARCv9LibDirs));
1458 TripleAliases.append(begin(SPARCv9Triples), end(SPARCv9Triples));
1459 BiarchLibDirs.append(begin(SPARCv8LibDirs), end(SPARCv8LibDirs));
1460 BiarchTripleAliases.append(begin(SPARCv8Triples), end(SPARCv8Triples));
Jakob Stoklund Olesenb3f938e2014-01-10 06:53:02 +00001461 break;
Ulrich Weigand47445072013-05-06 16:26:41 +00001462 case llvm::Triple::systemz:
Benjamin Kramer6ec434e2014-10-18 10:43:51 +00001463 LibDirs.append(begin(SystemZLibDirs), end(SystemZLibDirs));
1464 TripleAliases.append(begin(SystemZTriples), end(SystemZTriples));
Ulrich Weigand47445072013-05-06 16:26:41 +00001465 break;
Chandler Carruth866faab2012-01-25 07:21:38 +00001466 default:
1467 // By default, just rely on the standard lib directories and the original
1468 // triple.
1469 break;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001470 }
Chandler Carruth866faab2012-01-25 07:21:38 +00001471
1472 // Always append the drivers target triple to the end, in case it doesn't
1473 // match any of our aliases.
1474 TripleAliases.push_back(TargetTriple.str());
1475
1476 // Also include the multiarch variant if it's different.
Chandler Carruthb427c562013-06-22 11:35:51 +00001477 if (TargetTriple.str() != BiarchTriple.str())
1478 BiarchTripleAliases.push_back(BiarchTriple.str());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00001479}
1480
Artem Belevich98607b62015-09-23 21:49:39 +00001481// \brief -- try common CUDA installation paths looking for files we need for
1482// CUDA compilation.
1483
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001484void Generic_GCC::CudaInstallationDetector::init(
1485 const llvm::Triple &TargetTriple, const llvm::opt::ArgList &Args) {
NAKAMURA Takumi0c8decd2015-09-24 03:15:44 +00001486 SmallVector<std::string, 4> CudaPathCandidates;
Artem Belevich98607b62015-09-23 21:49:39 +00001487
1488 if (Args.hasArg(options::OPT_cuda_path_EQ))
1489 CudaPathCandidates.push_back(
1490 Args.getLastArgValue(options::OPT_cuda_path_EQ));
1491 else {
1492 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda");
1493 CudaPathCandidates.push_back(D.SysRoot + "/usr/local/cuda-7.0");
1494 }
1495
Benjamin Kramere8b76412015-09-24 14:48:37 +00001496 for (const auto &CudaPath : CudaPathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001497 if (CudaPath.empty() || !D.getVFS().exists(CudaPath))
Artem Belevich98607b62015-09-23 21:49:39 +00001498 continue;
1499
1500 CudaInstallPath = CudaPath;
1501 CudaIncludePath = CudaInstallPath + "/include";
1502 CudaLibDevicePath = CudaInstallPath + "/nvvm/libdevice";
1503 CudaLibPath =
1504 CudaInstallPath + (TargetTriple.isArch64Bit() ? "/lib64" : "/lib");
1505
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001506 if (!(D.getVFS().exists(CudaIncludePath) &&
1507 D.getVFS().exists(CudaLibPath) &&
1508 D.getVFS().exists(CudaLibDevicePath)))
Artem Belevich98607b62015-09-23 21:49:39 +00001509 continue;
1510
1511 IsValid = true;
1512 break;
1513 }
1514}
1515
1516void Generic_GCC::CudaInstallationDetector::print(raw_ostream &OS) const {
1517 if (isValid())
1518 OS << "Found CUDA installation: " << CudaInstallPath << "\n";
1519}
1520
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001521namespace {
1522// Filter to remove Multilibs that don't exist as a suffix to Path
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001523class FilterNonExistent {
1524 StringRef Base;
1525
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001526public:
Benjamin Kramerac75baa2015-03-22 15:56:12 +00001527 FilterNonExistent(StringRef Base) : Base(Base) {}
1528 bool operator()(const Multilib &M) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001529 return !llvm::sys::fs::exists(Base + M.gccSuffix() + "/crtbegin.o");
1530 }
1531};
1532} // end anonymous namespace
1533
1534static void addMultilibFlag(bool Enabled, const char *const Flag,
1535 std::vector<std::string> &Flags) {
1536 if (Enabled)
1537 Flags.push_back(std::string("+") + Flag);
1538 else
1539 Flags.push_back(std::string("-") + Flag);
1540}
1541
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001542static bool isMipsArch(llvm::Triple::ArchType Arch) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001543 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
1544 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1545}
1546
1547static bool isMips32(llvm::Triple::ArchType Arch) {
1548 return Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel;
1549}
1550
1551static bool isMips64(llvm::Triple::ArchType Arch) {
1552 return Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el;
1553}
1554
1555static bool isMipsEL(llvm::Triple::ArchType Arch) {
1556 return Arch == llvm::Triple::mipsel || Arch == llvm::Triple::mips64el;
1557}
1558
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001559static bool isMips16(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001560 Arg *A = Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001561 return A && A->getOption().matches(options::OPT_mips16);
1562}
1563
1564static bool isMicroMips(const ArgList &Args) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001565 Arg *A = Args.getLastArg(options::OPT_mmicromips, options::OPT_mno_micromips);
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001566 return A && A->getOption().matches(options::OPT_mmicromips);
1567}
1568
Simon Atanasyan60280b42014-05-12 07:37:51 +00001569struct DetectedMultilibs {
1570 /// The set of multilibs that the detected installation supports.
1571 MultilibSet Multilibs;
1572
1573 /// The primary multilib appropriate for the given flags.
1574 Multilib SelectedMultilib;
1575
1576 /// On Biarch systems, this corresponds to the default multilib when
1577 /// targeting the non-default multilib. Otherwise, it is empty.
1578 llvm::Optional<Multilib> BiarchSibling;
1579};
1580
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001581static Multilib makeMultilib(StringRef commonSuffix) {
1582 return Multilib(commonSuffix, commonSuffix, commonSuffix);
1583}
1584
Simon Atanasyan60280b42014-05-12 07:37:51 +00001585static bool findMIPSMultilibs(const llvm::Triple &TargetTriple, StringRef Path,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001586 const ArgList &Args, DetectedMultilibs &Result) {
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00001587 // Some MIPS toolchains put libraries and object files compiled
1588 // using different options in to the sub-directoris which names
1589 // reflects the flags used for compilation. For example sysroot
1590 // directory might looks like the following examples:
1591 //
1592 // /usr
1593 // /lib <= crt*.o files compiled with '-mips32'
1594 // /mips16
1595 // /usr
1596 // /lib <= crt*.o files compiled with '-mips16'
1597 // /el
1598 // /usr
1599 // /lib <= crt*.o files compiled with '-mips16 -EL'
1600 //
1601 // or
1602 //
1603 // /usr
1604 // /lib <= crt*.o files compiled with '-mips32r2'
1605 // /mips16
1606 // /usr
1607 // /lib <= crt*.o files compiled with '-mips32r2 -mips16'
1608 // /mips32
1609 // /usr
1610 // /lib <= crt*.o files compiled with '-mips32'
Simon Atanasyanee1accf2013-09-28 13:45:11 +00001611
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001612 FilterNonExistent NonExistent(Path);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001613
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001614 // Check for FSF toolchain multilibs
1615 MultilibSet FSFMipsMultilibs;
1616 {
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001617 auto MArchMips32 = makeMultilib("/mips32")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001618 .flag("+m32")
1619 .flag("-m64")
1620 .flag("-mmicromips")
1621 .flag("+march=mips32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001622
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001623 auto MArchMicroMips = makeMultilib("/micromips")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001624 .flag("+m32")
1625 .flag("-m64")
1626 .flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001627
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001628 auto MArchMips64r2 = makeMultilib("/mips64r2")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001629 .flag("-m32")
1630 .flag("+m64")
1631 .flag("+march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001632
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001633 auto MArchMips64 = makeMultilib("/mips64").flag("-m32").flag("+m64").flag(
1634 "-march=mips64r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001635
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001636 auto MArchDefault = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001637 .flag("+m32")
1638 .flag("-m64")
1639 .flag("-mmicromips")
1640 .flag("+march=mips32r2");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001641
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001642 auto Mips16 = makeMultilib("/mips16").flag("+mips16");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001643
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001644 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001645
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001646 auto MAbi64 =
1647 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001648
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001649 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001650
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001651 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001652
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001653 auto SoftFloat = makeMultilib("/sof").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001654
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001655 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001656
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001657 FSFMipsMultilibs =
1658 MultilibSet()
1659 .Either(MArchMips32, MArchMicroMips, MArchMips64r2, MArchMips64,
1660 MArchDefault)
1661 .Maybe(UCLibc)
1662 .Maybe(Mips16)
1663 .FilterOut("/mips64/mips16")
1664 .FilterOut("/mips64r2/mips16")
1665 .FilterOut("/micromips/mips16")
1666 .Maybe(MAbi64)
1667 .FilterOut("/micromips/64")
1668 .FilterOut("/mips32/64")
1669 .FilterOut("^/64")
1670 .FilterOut("/mips16/64")
1671 .Either(BigEndian, LittleEndian)
1672 .Maybe(SoftFloat)
1673 .Maybe(Nan2008)
1674 .FilterOut(".*sof/nan2008")
1675 .FilterOut(NonExistent)
1676 .setIncludeDirsCallback([](StringRef InstallDir,
1677 StringRef TripleStr, const Multilib &M) {
1678 std::vector<std::string> Dirs;
1679 Dirs.push_back((InstallDir + "/include").str());
1680 std::string SysRootInc =
1681 InstallDir.str() + "/../../../../sysroot";
1682 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1683 Dirs.push_back(SysRootInc + "/uclibc/usr/include");
1684 else
1685 Dirs.push_back(SysRootInc + "/usr/include");
1686 return Dirs;
1687 });
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001688 }
1689
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001690 // Check for Code Sourcery toolchain multilibs
1691 MultilibSet CSMipsMultilibs;
1692 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001693 auto MArchMips16 = makeMultilib("/mips16").flag("+m32").flag("+mips16");
Simon Atanasyan13e965a2013-11-26 11:57:14 +00001694
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001695 auto MArchMicroMips =
1696 makeMultilib("/micromips").flag("+m32").flag("+mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001697
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001698 auto MArchDefault = makeMultilib("").flag("-mips16").flag("-mmicromips");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001699
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001700 auto UCLibc = makeMultilib("/uclibc").flag("+muclibc");
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001701
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001702 auto SoftFloat = makeMultilib("/soft-float").flag("+msoft-float");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001703
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001704 auto Nan2008 = makeMultilib("/nan2008").flag("+mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001705
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001706 auto DefaultFloat =
1707 makeMultilib("").flag("-msoft-float").flag("-mnan=2008");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001708
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001709 auto BigEndian = makeMultilib("").flag("+EB").flag("-EL");
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001710
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001711 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001712
1713 // Note that this one's osSuffix is ""
Simon Atanasyan1b0542e2014-07-30 09:15:10 +00001714 auto MAbi64 = makeMultilib("")
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001715 .gccSuffix("/64")
1716 .includeSuffix("/64")
1717 .flag("+mabi=n64")
1718 .flag("-mabi=n32")
1719 .flag("-m32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001720
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001721 CSMipsMultilibs =
1722 MultilibSet()
1723 .Either(MArchMips16, MArchMicroMips, MArchDefault)
1724 .Maybe(UCLibc)
1725 .Either(SoftFloat, Nan2008, DefaultFloat)
1726 .FilterOut("/micromips/nan2008")
1727 .FilterOut("/mips16/nan2008")
1728 .Either(BigEndian, LittleEndian)
1729 .Maybe(MAbi64)
1730 .FilterOut("/mips16.*/64")
1731 .FilterOut("/micromips.*/64")
1732 .FilterOut(NonExistent)
1733 .setIncludeDirsCallback([](StringRef InstallDir,
1734 StringRef TripleStr, const Multilib &M) {
1735 std::vector<std::string> Dirs;
1736 Dirs.push_back((InstallDir + "/include").str());
1737 std::string SysRootInc =
1738 InstallDir.str() + "/../../../../" + TripleStr.str();
1739 if (StringRef(M.includeSuffix()).startswith("/uclibc"))
1740 Dirs.push_back(SysRootInc + "/libc/uclibc/usr/include");
1741 else
1742 Dirs.push_back(SysRootInc + "/libc/usr/include");
1743 return Dirs;
1744 });
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001745 }
1746
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001747 MultilibSet AndroidMipsMultilibs =
1748 MultilibSet()
1749 .Maybe(Multilib("/mips-r2").flag("+march=mips32r2"))
1750 .Maybe(Multilib("/mips-r6").flag("+march=mips32r6"))
1751 .FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001752
1753 MultilibSet DebianMipsMultilibs;
1754 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001755 Multilib MAbiN32 =
1756 Multilib().gccSuffix("/n32").includeSuffix("/n32").flag("+mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001757
1758 Multilib M64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001759 .gccSuffix("/64")
1760 .includeSuffix("/64")
1761 .flag("+m64")
1762 .flag("-m32")
1763 .flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001764
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001765 Multilib M32 = Multilib().flag("-m64").flag("+m32").flag("-mabi=n32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001766
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001767 DebianMipsMultilibs =
1768 MultilibSet().Either(M32, M64, MAbiN32).FilterOut(NonExistent);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001769 }
1770
Daniel Sanders2bf13662014-07-10 14:40:57 +00001771 MultilibSet ImgMultilibs;
1772 {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001773 auto Mips64r6 = makeMultilib("/mips64r6").flag("+m64").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001774
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001775 auto LittleEndian = makeMultilib("/el").flag("+EL").flag("-EB");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001776
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001777 auto MAbi64 =
1778 makeMultilib("/64").flag("+mabi=n64").flag("-mabi=n32").flag("-m32");
Daniel Sanders2bf13662014-07-10 14:40:57 +00001779
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001780 ImgMultilibs =
1781 MultilibSet()
1782 .Maybe(Mips64r6)
1783 .Maybe(MAbi64)
1784 .Maybe(LittleEndian)
1785 .FilterOut(NonExistent)
1786 .setIncludeDirsCallback([](StringRef InstallDir,
1787 StringRef TripleStr, const Multilib &M) {
1788 std::vector<std::string> Dirs;
1789 Dirs.push_back((InstallDir + "/include").str());
1790 Dirs.push_back(
1791 (InstallDir + "/../../../../sysroot/usr/include").str());
1792 return Dirs;
1793 });
Daniel Sanders2bf13662014-07-10 14:40:57 +00001794 }
1795
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001796 StringRef CPUName;
1797 StringRef ABIName;
1798 tools::mips::getMipsCPUAndABI(Args, TargetTriple, CPUName, ABIName);
1799
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001800 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
1801
1802 Multilib::flags_list Flags;
1803 addMultilibFlag(isMips32(TargetArch), "m32", Flags);
1804 addMultilibFlag(isMips64(TargetArch), "m64", Flags);
1805 addMultilibFlag(isMips16(Args), "mips16", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001806 addMultilibFlag(CPUName == "mips32", "march=mips32", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001807 addMultilibFlag(CPUName == "mips32r2" || CPUName == "mips32r3" ||
Daniel Sandersff952582015-10-05 12:24:30 +00001808 CPUName == "mips32r5" || CPUName == "p5600",
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001809 "march=mips32r2", Flags);
Simon Atanasyan3f024032015-02-25 07:31:12 +00001810 addMultilibFlag(CPUName == "mips32r6", "march=mips32r6", Flags);
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001811 addMultilibFlag(CPUName == "mips64", "march=mips64", Flags);
Simon Atanasyan59b25cb2015-02-26 04:45:57 +00001812 addMultilibFlag(CPUName == "mips64r2" || CPUName == "mips64r3" ||
1813 CPUName == "mips64r5" || CPUName == "octeon",
Simon Atanasyan9988e3a2014-07-16 17:34:54 +00001814 "march=mips64r2", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001815 addMultilibFlag(isMicroMips(Args), "mmicromips", Flags);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00001816 addMultilibFlag(tools::mips::isUCLibc(Args), "muclibc", Flags);
Simon Atanasyanab6db9f2014-07-16 12:24:48 +00001817 addMultilibFlag(tools::mips::isNaN2008(Args, TargetTriple), "mnan=2008",
1818 Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001819 addMultilibFlag(ABIName == "n32", "mabi=n32", Flags);
1820 addMultilibFlag(ABIName == "n64", "mabi=n64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001821 addMultilibFlag(isSoftFloatABI(Args), "msoft-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001822 addMultilibFlag(!isSoftFloatABI(Args), "mhard-float", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001823 addMultilibFlag(isMipsEL(TargetArch), "EL", Flags);
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001824 addMultilibFlag(!isMipsEL(TargetArch), "EB", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001825
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001826 if (TargetTriple.isAndroid()) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001827 // Select Android toolchain. It's the only choice in that case.
Simon Atanasyan60280b42014-05-12 07:37:51 +00001828 if (AndroidMipsMultilibs.select(Flags, Result.SelectedMultilib)) {
1829 Result.Multilibs = AndroidMipsMultilibs;
1830 return true;
1831 }
1832 return false;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001833 }
1834
Daniel Sanders2bf13662014-07-10 14:40:57 +00001835 if (TargetTriple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1836 TargetTriple.getOS() == llvm::Triple::Linux &&
1837 TargetTriple.getEnvironment() == llvm::Triple::GNU) {
1838 // Select mips-img-linux-gnu toolchain.
1839 if (ImgMultilibs.select(Flags, Result.SelectedMultilib)) {
1840 Result.Multilibs = ImgMultilibs;
1841 return true;
1842 }
1843 return false;
1844 }
1845
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001846 // Sort candidates. Toolchain that best meets the directories goes first.
1847 // Then select the first toolchains matches command line flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001848 MultilibSet *candidates[] = {&DebianMipsMultilibs, &FSFMipsMultilibs,
1849 &CSMipsMultilibs};
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001850 std::sort(
1851 std::begin(candidates), std::end(candidates),
1852 [](MultilibSet *a, MultilibSet *b) { return a->size() > b->size(); });
1853 for (const auto &candidate : candidates) {
Simon Atanasyan60280b42014-05-12 07:37:51 +00001854 if (candidate->select(Flags, Result.SelectedMultilib)) {
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001855 if (candidate == &DebianMipsMultilibs)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001856 Result.BiarchSibling = Multilib();
1857 Result.Multilibs = *candidate;
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001858 return true;
1859 }
1860 }
1861
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00001862 {
1863 // Fallback to the regular toolchain-tree structure.
1864 Multilib Default;
1865 Result.Multilibs.push_back(Default);
1866 Result.Multilibs.FilterOut(NonExistent);
1867
1868 if (Result.Multilibs.select(Flags, Result.SelectedMultilib)) {
1869 Result.BiarchSibling = Multilib();
1870 return true;
1871 }
1872 }
1873
Simon Atanasyan738f85a2014-03-04 18:37:28 +00001874 return false;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001875}
1876
Simon Atanasyan60280b42014-05-12 07:37:51 +00001877static bool findBiarchMultilibs(const llvm::Triple &TargetTriple,
1878 StringRef Path, const ArgList &Args,
1879 bool NeedsBiarchSuffix,
1880 DetectedMultilibs &Result) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001881
1882 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
1883 // in what would normally be GCCInstallPath and put the 64-bit
1884 // libs in a subdirectory named 64. The simple logic we follow is that
1885 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1886 // we use that. If not, and if not a biarch triple alias, we look for
1887 // crtbegin.o without the subdirectory.
1888
1889 Multilib Default;
1890 Multilib Alt64 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001891 .gccSuffix("/64")
1892 .includeSuffix("/64")
1893 .flag("-m32")
1894 .flag("+m64")
1895 .flag("-mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001896 Multilib Alt32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001897 .gccSuffix("/32")
1898 .includeSuffix("/32")
1899 .flag("+m32")
1900 .flag("-m64")
1901 .flag("-mx32");
Zinovy Nis1db95732014-07-10 15:27:19 +00001902 Multilib Altx32 = Multilib()
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001903 .gccSuffix("/x32")
1904 .includeSuffix("/x32")
1905 .flag("-m32")
1906 .flag("-m64")
1907 .flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001908
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001909 FilterNonExistent NonExistent(Path);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001910
Zinovy Nis1db95732014-07-10 15:27:19 +00001911 // Determine default multilib from: 32, 64, x32
1912 // Also handle cases such as 64 on 32, 32 on 64, etc.
1913 enum { UNKNOWN, WANT32, WANT64, WANTX32 } Want = UNKNOWN;
David Blaikie40f842d2014-07-10 18:46:15 +00001914 const bool IsX32 = TargetTriple.getEnvironment() == llvm::Triple::GNUX32;
Alp Tokerf45fa3d2014-02-25 04:21:44 +00001915 if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001916 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001917 else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
Zinovy Nis1db95732014-07-10 15:27:19 +00001918 Want = WANT64;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001919 else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
Zinovy Nis1db95732014-07-10 15:27:19 +00001920 Want = WANT32;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001921 else {
Zinovy Nis1db95732014-07-10 15:27:19 +00001922 if (TargetTriple.isArch32Bit())
1923 Want = NeedsBiarchSuffix ? WANT64 : WANT32;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001924 else if (IsX32)
Zinovy Nis1db95732014-07-10 15:27:19 +00001925 Want = NeedsBiarchSuffix ? WANT64 : WANTX32;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001926 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001927 Want = NeedsBiarchSuffix ? WANT32 : WANT64;
Jonathan Roelofs0e7ec602014-02-12 01:29:25 +00001928 }
1929
Zinovy Nis1db95732014-07-10 15:27:19 +00001930 if (Want == WANT32)
1931 Default.flag("+m32").flag("-m64").flag("-mx32");
1932 else if (Want == WANT64)
1933 Default.flag("-m32").flag("+m64").flag("-mx32");
1934 else if (Want == WANTX32)
1935 Default.flag("-m32").flag("-m64").flag("+mx32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001936 else
Zinovy Nis1db95732014-07-10 15:27:19 +00001937 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001938
Simon Atanasyan60280b42014-05-12 07:37:51 +00001939 Result.Multilibs.push_back(Default);
1940 Result.Multilibs.push_back(Alt64);
1941 Result.Multilibs.push_back(Alt32);
Zinovy Nis1db95732014-07-10 15:27:19 +00001942 Result.Multilibs.push_back(Altx32);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001943
Simon Atanasyan60280b42014-05-12 07:37:51 +00001944 Result.Multilibs.FilterOut(NonExistent);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001945
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001946 Multilib::flags_list Flags;
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001947 addMultilibFlag(TargetTriple.isArch64Bit() && !IsX32, "m64", Flags);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001948 addMultilibFlag(TargetTriple.isArch32Bit(), "m32", Flags);
Zinovy Nis6e3c6302014-07-10 15:42:35 +00001949 addMultilibFlag(TargetTriple.isArch64Bit() && IsX32, "mx32", Flags);
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001950
Simon Atanasyan60280b42014-05-12 07:37:51 +00001951 if (!Result.Multilibs.select(Flags, Result.SelectedMultilib))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001952 return false;
Jonathan Roelofs3fa96d82014-02-12 01:36:51 +00001953
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001954 if (Result.SelectedMultilib == Alt64 || Result.SelectedMultilib == Alt32 ||
Zinovy Nis1db95732014-07-10 15:27:19 +00001955 Result.SelectedMultilib == Altx32)
Simon Atanasyan60280b42014-05-12 07:37:51 +00001956 Result.BiarchSibling = Default;
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001957
1958 return true;
Simon Atanasyan08450bd2013-04-20 08:15:03 +00001959}
1960
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001961void Generic_GCC::GCCInstallationDetector::scanLibDirForGCCTripleSolaris(
1962 const llvm::Triple &TargetArch, const llvm::opt::ArgList &Args,
1963 const std::string &LibDir, StringRef CandidateTriple,
1964 bool NeedsBiarchSuffix) {
1965 // Solaris is a special case. The GCC installation is under
1966 // /usr/gcc/<major>.<minor>/lib/gcc/<triple>/<major>.<minor>.<patch>/, so we
1967 // need to iterate twice.
1968 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001969 for (vfs::directory_iterator LI = D.getVFS().dir_begin(LibDir, EC), LE;
1970 !EC && LI != LE; LI = LI.increment(EC)) {
1971 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001972 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1973
1974 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001975 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001976 continue; // Saw this path before; no need to look at it again.
1977 if (CandidateVersion.isOlderThan(4, 1, 1))
1978 continue;
1979 if (CandidateVersion <= Version)
1980 continue;
1981
1982 GCCInstallPath =
1983 LibDir + "/" + VersionText.str() + "/lib/gcc/" + CandidateTriple.str();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001984 if (!D.getVFS().exists(GCCInstallPath))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001985 continue;
1986
1987 // If we make it here there has to be at least one GCC version, let's just
1988 // use the latest one.
1989 std::error_code EEC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001990 for (vfs::directory_iterator
1991 LLI = D.getVFS().dir_begin(GCCInstallPath, EEC),
1992 LLE;
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001993 !EEC && LLI != LLE; LLI = LLI.increment(EEC)) {
1994
Benjamin Kramerd45b2052015-10-07 15:48:01 +00001995 StringRef SubVersionText = llvm::sys::path::filename(LLI->getName());
Rafael Espindolac53c5b12015-08-31 19:17:51 +00001996 GCCVersion CandidateSubVersion = GCCVersion::Parse(SubVersionText);
1997
1998 if (CandidateSubVersion > Version)
1999 Version = CandidateSubVersion;
2000 }
2001
2002 GCCTriple.setTriple(CandidateTriple);
2003
2004 GCCInstallPath += "/" + Version.Text;
2005 GCCParentLibPath = GCCInstallPath + "/../../../../";
2006
2007 IsValid = true;
2008 }
2009}
2010
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002011void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002012 const llvm::Triple &TargetTriple, const ArgList &Args,
Chandler Carruthb427c562013-06-22 11:35:51 +00002013 const std::string &LibDir, StringRef CandidateTriple,
2014 bool NeedsBiarchSuffix) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002015 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002016 // There are various different suffixes involving the triple we
2017 // check for. We also record what is necessary to walk from each back
Douglas Katzmancb07d152015-08-14 15:52:12 +00002018 // up to the lib directory. Specifically, the number of "up" steps
2019 // in the second half of each row is 1 + the number of path separators
2020 // in the first half.
2021 const std::string LibAndInstallSuffixes[][2] = {
2022 {"/gcc/" + CandidateTriple.str(), "/../../.."},
2023
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002024 // Debian puts cross-compilers in gcc-cross
Douglas Katzmancb07d152015-08-14 15:52:12 +00002025 {"/gcc-cross/" + CandidateTriple.str(), "/../../.."},
2026
2027 {"/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
2028 "/../../../.."},
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002029
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002030 // The Freescale PPC SDK has the gcc libraries in
2031 // <sysroot>/usr/lib/<triple>/x.y.z so have a look there as well.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002032 {"/" + CandidateTriple.str(), "/../.."},
Hal Finkelf3587912012-09-18 22:25:07 +00002033
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002034 // Ubuntu has a strange mis-matched pair of triples that this happens to
2035 // match.
2036 // FIXME: It may be worthwhile to generalize this and look for a second
2037 // triple.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002038 {"/i386-linux-gnu/gcc/" + CandidateTriple.str(), "/../../../.."}};
2039
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002040 if (TargetTriple.getOS() == llvm::Triple::Solaris) {
2041 scanLibDirForGCCTripleSolaris(TargetTriple, Args, LibDir, CandidateTriple,
2042 NeedsBiarchSuffix);
2043 return;
2044 }
2045
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002046 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002047 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibAndInstallSuffixes) -
2048 (TargetArch != llvm::Triple::x86));
Chandler Carruth866faab2012-01-25 07:21:38 +00002049 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
Douglas Katzmancb07d152015-08-14 15:52:12 +00002050 StringRef LibSuffix = LibAndInstallSuffixes[i][0];
Rafael Espindolac0809172014-06-12 14:02:15 +00002051 std::error_code EC;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002052 for (vfs::directory_iterator
2053 LI = D.getVFS().dir_begin(LibDir + LibSuffix, EC),
2054 LE;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002055 !EC && LI != LE; LI = LI.increment(EC)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002056 StringRef VersionText = llvm::sys::path::filename(LI->getName());
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002057 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002058 if (CandidateVersion.Major != -1) // Filter obviously bad entries.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002059 if (!CandidateGCCInstallPaths.insert(LI->getName()).second)
Benjamin Kramera97e4d12013-08-14 18:38:51 +00002060 continue; // Saw this path before; no need to look at it again.
Benjamin Kramer604e8482013-08-09 17:17:48 +00002061 if (CandidateVersion.isOlderThan(4, 1, 1))
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002062 continue;
2063 if (CandidateVersion <= Version)
2064 continue;
Hal Finkel221e11e2011-12-08 05:50:03 +00002065
Simon Atanasyan60280b42014-05-12 07:37:51 +00002066 DetectedMultilibs Detected;
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002067
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002068 // Debian mips multilibs behave more like the rest of the biarch ones,
2069 // so handle them there
2070 if (isMipsArch(TargetArch)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002071 if (!findMIPSMultilibs(TargetTriple, LI->getName(), Args, Detected))
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002072 continue;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002073 } else if (!findBiarchMultilibs(TargetTriple, LI->getName(), Args,
Simon Atanasyan60280b42014-05-12 07:37:51 +00002074 NeedsBiarchSuffix, Detected)) {
Simon Atanasyanee1accf2013-09-28 13:45:11 +00002075 continue;
Simon Atanasyan60280b42014-05-12 07:37:51 +00002076 }
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002077
Simon Atanasyan60280b42014-05-12 07:37:51 +00002078 Multilibs = Detected.Multilibs;
2079 SelectedMultilib = Detected.SelectedMultilib;
2080 BiarchSibling = Detected.BiarchSibling;
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002081 Version = CandidateVersion;
Chandler Carruth4d9d7682012-01-24 19:28:29 +00002082 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002083 // FIXME: We hack together the directory name here instead of
2084 // using LI to ensure stable path separators across Windows and
2085 // Linux.
Douglas Katzmancb07d152015-08-14 15:52:12 +00002086 GCCInstallPath =
2087 LibDir + LibAndInstallSuffixes[i][0] + "/" + VersionText.str();
2088 GCCParentLibPath = GCCInstallPath + LibAndInstallSuffixes[i][1];
Chandler Carruth4c90fba2011-11-06 23:39:34 +00002089 IsValid = true;
2090 }
2091 }
2092}
2093
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002094Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002095 const ArgList &Args)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002096 : ToolChain(D, Triple, Args), GCCInstallation(D), CudaInstallation(D) {
Daniel Dunbar88979912010-08-01 22:29:51 +00002097 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00002098 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00002099 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar76ce7412009-03-23 16:15:50 +00002100}
2101
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002102Generic_GCC::~Generic_GCC() {}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002103
Rafael Espindola7cf32212013-03-20 03:05:54 +00002104Tool *Generic_GCC::getTool(Action::ActionClass AC) const {
Rafael Espindola260e28d2013-03-18 20:48:54 +00002105 switch (AC) {
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002106 case Action::PreprocessJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002107 if (!Preprocess)
Douglas Katzman95354292015-06-23 20:42:09 +00002108 Preprocess.reset(new tools::gcc::Preprocessor(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002109 return Preprocess.get();
Rafael Espindolac8e3a012013-03-18 18:50:01 +00002110 case Action::CompileJobClass:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002111 if (!Compile)
Douglas Katzman95354292015-06-23 20:42:09 +00002112 Compile.reset(new tools::gcc::Compiler(*this));
Rafael Espindola7cf32212013-03-20 03:05:54 +00002113 return Compile.get();
Rafael Espindolad15a8912013-03-19 00:36:57 +00002114 default:
Rafael Espindola7cf32212013-03-20 03:05:54 +00002115 return ToolChain::getTool(AC);
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002116 }
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002117}
2118
Rafael Espindola7cf32212013-03-20 03:05:54 +00002119Tool *Generic_GCC::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002120 return new tools::gnutools::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002121}
2122
Douglas Katzman95354292015-06-23 20:42:09 +00002123Tool *Generic_GCC::buildLinker() const { return new tools::gcc::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00002124
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002125void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
2126 // Print the information about how we detected the GCC installation.
2127 GCCInstallation.print(OS);
Artem Belevich98607b62015-09-23 21:49:39 +00002128 CudaInstallation.print(OS);
Chandler Carruth0ae39aa2013-07-30 17:57:09 +00002129}
2130
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002131bool Generic_GCC::IsUnwindTablesDefault() const {
Rafael Espindola08f1ebb2012-09-22 15:04:11 +00002132 return getArch() == llvm::Triple::x86_64;
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002133}
2134
David Majnemer17f448b2015-06-28 04:23:33 +00002135bool Generic_GCC::isPICDefault() const {
2136 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2137}
Daniel Dunbar59e5e882009-03-20 00:20:03 +00002138
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002139bool Generic_GCC::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002140
David Majnemer17f448b2015-06-28 04:23:33 +00002141bool Generic_GCC::isPICDefaultForced() const {
2142 return getArch() == llvm::Triple::x86_64 && getTriple().isOSWindows();
2143}
Chandler Carruth76a943b2012-11-19 03:52:03 +00002144
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002145bool Generic_GCC::IsIntegratedAssemblerDefault() const {
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002146 switch (getTriple().getArch()) {
2147 case llvm::Triple::x86:
2148 case llvm::Triple::x86_64:
2149 case llvm::Triple::aarch64:
2150 case llvm::Triple::aarch64_be:
2151 case llvm::Triple::arm:
2152 case llvm::Triple::armeb:
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00002153 case llvm::Triple::bpfel:
2154 case llvm::Triple::bpfeb:
Douglas Katzman7ae27b82015-06-03 19:40:30 +00002155 case llvm::Triple::thumb:
2156 case llvm::Triple::thumbeb:
2157 case llvm::Triple::ppc:
2158 case llvm::Triple::ppc64:
2159 case llvm::Triple::ppc64le:
2160 case llvm::Triple::sparc:
2161 case llvm::Triple::sparcel:
2162 case llvm::Triple::sparcv9:
2163 case llvm::Triple::systemz:
2164 return true;
2165 default:
2166 return false;
2167 }
Rafael Espindolaa8b3b682013-11-25 18:50:53 +00002168}
2169
Kristof Beylsfb387292014-01-10 13:44:34 +00002170void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
2171 ArgStringList &CC1Args) const {
2172 const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
Tim Northovera2ee4332014-03-29 15:09:45 +00002173 bool UseInitArrayDefault =
Kristof Beylsfb387292014-01-10 13:44:34 +00002174 getTriple().getArch() == llvm::Triple::aarch64 ||
Christian Pirker9b019ae2014-02-25 13:51:00 +00002175 getTriple().getArch() == llvm::Triple::aarch64_be ||
Tim Northovera2ee4332014-03-29 15:09:45 +00002176 (getTriple().getOS() == llvm::Triple::Linux &&
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002177 (!V.isOlderThan(4, 7, 0) || getTriple().isAndroid())) ||
Vasileios Kalintirisfdfc0102015-10-05 10:34:46 +00002178 getTriple().getOS() == llvm::Triple::NaCl;
Kristof Beylsfb387292014-01-10 13:44:34 +00002179
2180 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002181 options::OPT_fno_use_init_array, UseInitArrayDefault))
Kristof Beylsfb387292014-01-10 13:44:34 +00002182 CC1Args.push_back("-fuse-init-array");
2183}
2184
Tony Linthicum76329bf2011-12-12 21:14:55 +00002185/// Hexagon Toolchain
2186
Douglas Katzman54366072015-07-27 16:53:08 +00002187std::string HexagonToolChain::GetGnuDir(const std::string &InstalledDir,
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002188 const ArgList &Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002189 // Locate the rest of the toolchain ...
Samuel Antaoc909c992014-11-07 17:48:03 +00002190 std::string GccToolchain = getGCCToolchainDir(Args);
2191
2192 if (!GccToolchain.empty())
2193 return GccToolchain;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002194
2195 std::string InstallRelDir = InstalledDir + "/../../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002196 if (getVFS().exists(InstallRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002197 return InstallRelDir;
2198
2199 std::string PrefixRelDir = std::string(LLVM_PREFIX) + "/../gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002200 if (getVFS().exists(PrefixRelDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002201 return PrefixRelDir;
2202
2203 return InstallRelDir;
2204}
2205
Douglas Katzman54366072015-07-27 16:53:08 +00002206const char *HexagonToolChain::GetSmallDataThreshold(const ArgList &Args) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002207 Arg *A;
2208
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002209 A = Args.getLastArg(options::OPT_G, options::OPT_G_EQ,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002210 options::OPT_msmall_data_threshold_EQ);
2211 if (A)
2212 return A->getValue();
2213
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002214 A = Args.getLastArg(options::OPT_shared, options::OPT_fpic,
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002215 options::OPT_fPIC);
2216 if (A)
2217 return "0";
2218
Hans Wennborgdcfba332015-10-06 23:40:43 +00002219 return nullptr;
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002220}
2221
Douglas Katzman54366072015-07-27 16:53:08 +00002222bool HexagonToolChain::UsesG0(const char *smallDataThreshold) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002223 return smallDataThreshold && smallDataThreshold[0] == '0';
2224}
2225
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002226static void GetHexagonLibraryPaths(const HexagonToolChain &TC,
2227 const ArgList &Args, const std::string &Ver,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002228 const std::string &MarchString,
2229 const std::string &InstalledDir,
2230 ToolChain::path_list *LibPaths) {
Matthew Curtise689b052012-12-06 15:46:07 +00002231 bool buildingLib = Args.hasArg(options::OPT_shared);
2232
2233 //----------------------------------------------------------------------------
2234 // -L Args
2235 //----------------------------------------------------------------------------
Douglas Katzman6bbffc42015-06-25 18:51:37 +00002236 for (Arg *A : Args.filtered(options::OPT_L))
2237 for (const char *Value : A->getValues())
2238 LibPaths->push_back(Value);
Matthew Curtise689b052012-12-06 15:46:07 +00002239
2240 //----------------------------------------------------------------------------
2241 // Other standard paths
2242 //----------------------------------------------------------------------------
2243 const std::string MarchSuffix = "/" + MarchString;
2244 const std::string G0Suffix = "/G0";
2245 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002246 const std::string RootDir = TC.GetGnuDir(InstalledDir, Args) + "/";
Matthew Curtise689b052012-12-06 15:46:07 +00002247
2248 // lib/gcc/hexagon/...
2249 std::string LibGCCHexagonDir = RootDir + "lib/gcc/hexagon/";
2250 if (buildingLib) {
2251 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchG0Suffix);
2252 LibPaths->push_back(LibGCCHexagonDir + Ver + G0Suffix);
2253 }
2254 LibPaths->push_back(LibGCCHexagonDir + Ver + MarchSuffix);
2255 LibPaths->push_back(LibGCCHexagonDir + Ver);
2256
2257 // lib/gcc/...
2258 LibPaths->push_back(RootDir + "lib/gcc");
2259
2260 // hexagon/lib/...
2261 std::string HexagonLibDir = RootDir + "hexagon/lib";
2262 if (buildingLib) {
2263 LibPaths->push_back(HexagonLibDir + MarchG0Suffix);
2264 LibPaths->push_back(HexagonLibDir + G0Suffix);
2265 }
2266 LibPaths->push_back(HexagonLibDir + MarchSuffix);
2267 LibPaths->push_back(HexagonLibDir);
2268}
2269
Douglas Katzman54366072015-07-27 16:53:08 +00002270HexagonToolChain::HexagonToolChain(const Driver &D, const llvm::Triple &Triple,
2271 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002272 : Linux(D, Triple, Args) {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002273 const std::string InstalledDir(getDriver().getInstalledDir());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002274 const std::string GnuDir = GetGnuDir(InstalledDir, Args);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002275
2276 // Note: Generic_GCC::Generic_GCC adds InstalledDir and getDriver().Dir to
2277 // program paths
2278 const std::string BinDir(GnuDir + "/bin");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002279 if (D.getVFS().exists(BinDir))
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002280 getProgramPaths().push_back(BinDir);
2281
2282 // Determine version of GCC libraries and headers to use.
2283 const std::string HexagonDir(GnuDir + "/lib/gcc/hexagon");
Rafael Espindolac0809172014-06-12 14:02:15 +00002284 std::error_code ec;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002285 GCCVersion MaxVersion = GCCVersion::Parse("0.0.0");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002286 for (vfs::directory_iterator di = D.getVFS().dir_begin(HexagonDir, ec), de;
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002287 !ec && di != de; di = di.increment(ec)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002288 GCCVersion cv = GCCVersion::Parse(llvm::sys::path::filename(di->getName()));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002289 if (MaxVersion < cv)
2290 MaxVersion = cv;
2291 }
2292 GCCLibAndIncVersion = MaxVersion;
Matthew Curtise689b052012-12-06 15:46:07 +00002293
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002294 ToolChain::path_list *LibPaths = &getFilePaths();
Matthew Curtise689b052012-12-06 15:46:07 +00002295
2296 // Remove paths added by Linux toolchain. Currently Hexagon_TC really targets
2297 // 'elf' OS type, so the Linux paths are not appropriate. When we actually
2298 // support 'linux' we'll need to fix this up
2299 LibPaths->clear();
2300
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002301 GetHexagonLibraryPaths(*this, Args, GetGCCLibAndIncVersion(),
2302 GetTargetCPU(Args), InstalledDir, LibPaths);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002303}
2304
Douglas Katzman54366072015-07-27 16:53:08 +00002305HexagonToolChain::~HexagonToolChain() {}
Tony Linthicum76329bf2011-12-12 21:14:55 +00002306
Douglas Katzman54366072015-07-27 16:53:08 +00002307Tool *HexagonToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002308 return new tools::hexagon::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002309}
2310
Douglas Katzman54366072015-07-27 16:53:08 +00002311Tool *HexagonToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002312 return new tools::hexagon::Linker(*this);
Tony Linthicum76329bf2011-12-12 21:14:55 +00002313}
2314
Douglas Katzman54366072015-07-27 16:53:08 +00002315void HexagonToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2316 ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002317 const Driver &D = getDriver();
2318
2319 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
2320 DriverArgs.hasArg(options::OPT_nostdlibinc))
2321 return;
2322
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002323 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002324 std::string GnuDir = GetGnuDir(D.InstalledDir, DriverArgs);
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002325 std::string HexagonDir(GnuDir + "/lib/gcc/hexagon/" + Ver);
2326 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include");
2327 addExternCSystemInclude(DriverArgs, CC1Args, HexagonDir + "/include-fixed");
2328 addExternCSystemInclude(DriverArgs, CC1Args, GnuDir + "/hexagon/include");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002329}
2330
Douglas Katzman54366072015-07-27 16:53:08 +00002331void HexagonToolChain::AddClangCXXStdlibIncludeArgs(
2332 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002333 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2334 DriverArgs.hasArg(options::OPT_nostdincxx))
2335 return;
2336
2337 const Driver &D = getDriver();
2338 std::string Ver(GetGCCLibAndIncVersion());
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002339 SmallString<128> IncludeDir(GetGnuDir(D.InstalledDir, DriverArgs));
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002340
Rafael Espindola358256c2013-06-26 02:13:00 +00002341 llvm::sys::path::append(IncludeDir, "hexagon/include/c++/");
2342 llvm::sys::path::append(IncludeDir, Ver);
Yaron Keren92e1b622015-03-18 10:17:07 +00002343 addSystemInclude(DriverArgs, CC1Args, IncludeDir);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002344}
Matthew Curtisf10a5952012-12-06 14:16:43 +00002345
Matthew Curtise689b052012-12-06 15:46:07 +00002346ToolChain::CXXStdlibType
Douglas Katzman54366072015-07-27 16:53:08 +00002347HexagonToolChain::GetCXXStdlibType(const ArgList &Args) const {
Matthew Curtise689b052012-12-06 15:46:07 +00002348 Arg *A = Args.getLastArg(options::OPT_stdlib_EQ);
2349 if (!A)
2350 return ToolChain::CST_Libstdcxx;
2351
2352 StringRef Value = A->getValue();
2353 if (Value != "libstdc++") {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002354 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Matthew Curtise689b052012-12-06 15:46:07 +00002355 }
2356
2357 return ToolChain::CST_Libstdcxx;
2358}
2359
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002360static int getHexagonVersion(const ArgList &Args) {
2361 Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ);
2362 // Select the default CPU (v4) if none was given.
2363 if (!A)
2364 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002365
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002366 // FIXME: produce errors if we cannot parse the version.
2367 StringRef WhichHexagon = A->getValue();
2368 if (WhichHexagon.startswith("hexagonv")) {
2369 int Val;
2370 if (!WhichHexagon.substr(sizeof("hexagonv") - 1).getAsInteger(10, Val))
2371 return Val;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002372 }
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002373 if (WhichHexagon.startswith("v")) {
2374 int Val;
2375 if (!WhichHexagon.substr(1).getAsInteger(10, Val))
2376 return Val;
2377 }
2378
2379 // FIXME: should probably be an error.
2380 return 4;
Matthew Curtisf10a5952012-12-06 14:16:43 +00002381}
2382
Douglas Katzman54366072015-07-27 16:53:08 +00002383StringRef HexagonToolChain::GetTargetCPU(const ArgList &Args) {
Rafael Espindolabfd88f22013-09-24 13:28:24 +00002384 int V = getHexagonVersion(Args);
2385 // FIXME: We don't support versions < 4. We should error on them.
2386 switch (V) {
2387 default:
2388 llvm_unreachable("Unexpected version");
2389 case 5:
2390 return "v5";
2391 case 4:
2392 return "v4";
2393 case 3:
2394 return "v3";
2395 case 2:
2396 return "v2";
2397 case 1:
2398 return "v1";
Matthew Curtisf10a5952012-12-06 14:16:43 +00002399 }
Matthew Curtisf10a5952012-12-06 14:16:43 +00002400}
Matthew Curtis22dd8da2012-12-06 12:43:18 +00002401// End Hexagon
Daniel Dunbardac54a82009-03-25 04:13:45 +00002402
Tom Stellard8fa33092015-07-18 01:49:05 +00002403/// AMDGPU Toolchain
2404AMDGPUToolChain::AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,
2405 const ArgList &Args)
2406 : Generic_ELF(D, Triple, Args) { }
2407
2408Tool *AMDGPUToolChain::buildLinker() const {
2409 return new tools::amdgpu::Linker(*this);
2410}
2411// End AMDGPU
2412
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002413/// NaCl Toolchain
Douglas Katzman54366072015-07-27 16:53:08 +00002414NaClToolChain::NaClToolChain(const Driver &D, const llvm::Triple &Triple,
2415 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002416 : Generic_ELF(D, Triple, Args) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002417
2418 // Remove paths added by Generic_GCC. NaCl Toolchain cannot use the
2419 // default paths, and must instead only use the paths provided
2420 // with this toolchain based on architecture.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002421 path_list &file_paths = getFilePaths();
2422 path_list &prog_paths = getProgramPaths();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002423
2424 file_paths.clear();
2425 prog_paths.clear();
2426
2427 // Path for library files (libc.a, ...)
2428 std::string FilePath(getDriver().Dir + "/../");
2429
2430 // Path for tools (clang, ld, etc..)
2431 std::string ProgPath(getDriver().Dir + "/../");
2432
2433 // Path for toolchain libraries (libgcc.a, ...)
2434 std::string ToolPath(getDriver().ResourceDir + "/lib/");
2435
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002436 switch (Triple.getArch()) {
Hans Wennborgdcfba332015-10-06 23:40:43 +00002437 case llvm::Triple::x86:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002438 file_paths.push_back(FilePath + "x86_64-nacl/lib32");
Derek Schuff9afb0502015-08-26 17:14:08 +00002439 file_paths.push_back(FilePath + "i686-nacl/usr/lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002440 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2441 file_paths.push_back(ToolPath + "i686-nacl");
2442 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002443 case llvm::Triple::x86_64:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002444 file_paths.push_back(FilePath + "x86_64-nacl/lib");
2445 file_paths.push_back(FilePath + "x86_64-nacl/usr/lib");
2446 prog_paths.push_back(ProgPath + "x86_64-nacl/bin");
2447 file_paths.push_back(ToolPath + "x86_64-nacl");
2448 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002449 case llvm::Triple::arm:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002450 file_paths.push_back(FilePath + "arm-nacl/lib");
2451 file_paths.push_back(FilePath + "arm-nacl/usr/lib");
2452 prog_paths.push_back(ProgPath + "arm-nacl/bin");
2453 file_paths.push_back(ToolPath + "arm-nacl");
2454 break;
Hans Wennborgdcfba332015-10-06 23:40:43 +00002455 case llvm::Triple::mipsel:
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002456 file_paths.push_back(FilePath + "mipsel-nacl/lib");
2457 file_paths.push_back(FilePath + "mipsel-nacl/usr/lib");
2458 prog_paths.push_back(ProgPath + "bin");
2459 file_paths.push_back(ToolPath + "mipsel-nacl");
2460 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002461 default:
2462 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002463 }
2464
2465 // Use provided linker, not system linker
Derek Schuffef465d72015-08-24 23:53:25 +00002466 Linker = GetLinkerPath();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002467 NaClArmMacrosPath = GetFilePath("nacl-arm-macros.s");
2468}
2469
Douglas Katzman54366072015-07-27 16:53:08 +00002470void NaClToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2471 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002472 const Driver &D = getDriver();
2473 if (DriverArgs.hasArg(options::OPT_nostdinc))
2474 return;
2475
2476 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
2477 SmallString<128> P(D.ResourceDir);
2478 llvm::sys::path::append(P, "include");
2479 addSystemInclude(DriverArgs, CC1Args, P.str());
2480 }
2481
2482 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2483 return;
2484
2485 SmallString<128> P(D.Dir + "/../");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002486 switch (getTriple().getArch()) {
Derek Schuff9afb0502015-08-26 17:14:08 +00002487 case llvm::Triple::x86:
2488 // x86 is special because multilib style uses x86_64-nacl/include for libc
2489 // headers but the SDK wants i686-nacl/usr/include. The other architectures
2490 // have the same substring.
2491 llvm::sys::path::append(P, "i686-nacl/usr/include");
2492 addSystemInclude(DriverArgs, CC1Args, P.str());
2493 llvm::sys::path::remove_filename(P);
2494 llvm::sys::path::remove_filename(P);
2495 llvm::sys::path::remove_filename(P);
2496 llvm::sys::path::append(P, "x86_64-nacl/include");
2497 addSystemInclude(DriverArgs, CC1Args, P.str());
2498 return;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002499 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002500 llvm::sys::path::append(P, "arm-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002501 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002502 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002503 llvm::sys::path::append(P, "x86_64-nacl/usr/include");
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002504 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002505 case llvm::Triple::mipsel:
2506 llvm::sys::path::append(P, "mipsel-nacl/usr/include");
2507 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002508 default:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002509 return;
2510 }
2511
2512 addSystemInclude(DriverArgs, CC1Args, P.str());
2513 llvm::sys::path::remove_filename(P);
2514 llvm::sys::path::remove_filename(P);
2515 llvm::sys::path::append(P, "include");
2516 addSystemInclude(DriverArgs, CC1Args, P.str());
2517}
2518
Douglas Katzman54366072015-07-27 16:53:08 +00002519void NaClToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
2520 ArgStringList &CmdArgs) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002521 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2522 // if the value is libc++, and emits an error for other values.
2523 GetCXXStdlibType(Args);
2524 CmdArgs.push_back("-lc++");
2525}
2526
Douglas Katzman54366072015-07-27 16:53:08 +00002527void NaClToolChain::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2528 ArgStringList &CC1Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002529 const Driver &D = getDriver();
2530 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2531 DriverArgs.hasArg(options::OPT_nostdincxx))
2532 return;
2533
2534 // Check for -stdlib= flags. We only support libc++ but this consumes the arg
2535 // if the value is libc++, and emits an error for other values.
2536 GetCXXStdlibType(DriverArgs);
2537
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002538 SmallString<128> P(D.Dir + "/../");
2539 switch (getTriple().getArch()) {
2540 case llvm::Triple::arm:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002541 llvm::sys::path::append(P, "arm-nacl/include/c++/v1");
2542 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002543 break;
2544 case llvm::Triple::x86:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002545 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2546 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002547 break;
2548 case llvm::Triple::x86_64:
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002549 llvm::sys::path::append(P, "x86_64-nacl/include/c++/v1");
2550 addSystemInclude(DriverArgs, CC1Args, P.str());
Douglas Katzman7e37afb2015-06-23 03:02:39 +00002551 break;
Petar Jovanovic26a4a402015-07-08 13:07:31 +00002552 case llvm::Triple::mipsel:
2553 llvm::sys::path::append(P, "mipsel-nacl/include/c++/v1");
2554 addSystemInclude(DriverArgs, CC1Args, P.str());
2555 break;
Douglas Katzman9ad0ec22015-06-23 04:20:44 +00002556 default:
2557 break;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002558 }
2559}
2560
Douglas Katzman54366072015-07-27 16:53:08 +00002561ToolChain::CXXStdlibType
2562NaClToolChain::GetCXXStdlibType(const ArgList &Args) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002563 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2564 StringRef Value = A->getValue();
2565 if (Value == "libc++")
2566 return ToolChain::CST_Libcxx;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002567 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002568 }
2569
2570 return ToolChain::CST_Libcxx;
2571}
2572
Douglas Katzman54366072015-07-27 16:53:08 +00002573std::string
2574NaClToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
2575 types::ID InputType) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002576 llvm::Triple TheTriple(ComputeLLVMTriple(Args, InputType));
2577 if (TheTriple.getArch() == llvm::Triple::arm &&
2578 TheTriple.getEnvironment() == llvm::Triple::UnknownEnvironment)
2579 TheTriple.setEnvironment(llvm::Triple::GNUEABIHF);
2580 return TheTriple.getTriple();
2581}
2582
Douglas Katzman54366072015-07-27 16:53:08 +00002583Tool *NaClToolChain::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002584 return new tools::nacltools::Linker(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002585}
2586
Douglas Katzman54366072015-07-27 16:53:08 +00002587Tool *NaClToolChain::buildAssembler() const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002588 if (getTriple().getArch() == llvm::Triple::arm)
Douglas Katzman95354292015-06-23 20:42:09 +00002589 return new tools::nacltools::AssemblerARM(*this);
2590 return new tools::gnutools::Assembler(*this);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00002591}
2592// End NaCl
2593
Chris Lattner09797542010-03-04 21:07:38 +00002594/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
2595/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
2596/// Currently does not support anything else but compilation.
2597
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002598TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola84b588b2013-03-18 18:10:27 +00002599 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002600 : ToolChain(D, Triple, Args) {
Chris Lattner09797542010-03-04 21:07:38 +00002601 // Path mangling to find libexec
2602 std::string Path(getDriver().Dir);
2603
2604 Path += "/../libexec";
2605 getProgramPaths().push_back(Path);
2606}
2607
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002608TCEToolChain::~TCEToolChain() {}
Chris Lattner09797542010-03-04 21:07:38 +00002609
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002610bool TCEToolChain::IsMathErrnoDefault() const { return true; }
Chris Lattner09797542010-03-04 21:07:38 +00002611
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002612bool TCEToolChain::isPICDefault() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002613
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002614bool TCEToolChain::isPIEDefault() const { return false; }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002615
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002616bool TCEToolChain::isPICDefaultForced() const { return false; }
Chris Lattner09797542010-03-04 21:07:38 +00002617
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002618// CloudABI - CloudABI tool chain which can call ld(1) directly.
2619
2620CloudABI::CloudABI(const Driver &D, const llvm::Triple &Triple,
2621 const ArgList &Args)
2622 : Generic_ELF(D, Triple, Args) {
2623 SmallString<128> P(getDriver().Dir);
2624 llvm::sys::path::append(P, "..", getTriple().str(), "lib");
2625 getFilePaths().push_back(P.str());
2626}
2627
2628void CloudABI::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2629 ArgStringList &CC1Args) const {
2630 if (DriverArgs.hasArg(options::OPT_nostdlibinc) &&
2631 DriverArgs.hasArg(options::OPT_nostdincxx))
2632 return;
2633
2634 SmallString<128> P(getDriver().Dir);
2635 llvm::sys::path::append(P, "..", getTriple().str(), "include/c++/v1");
2636 addSystemInclude(DriverArgs, CC1Args, P.str());
2637}
2638
2639void CloudABI::AddCXXStdlibLibArgs(const ArgList &Args,
2640 ArgStringList &CmdArgs) const {
2641 CmdArgs.push_back("-lc++");
2642 CmdArgs.push_back("-lc++abi");
2643 CmdArgs.push_back("-lunwind");
2644}
2645
Douglas Katzman95354292015-06-23 20:42:09 +00002646Tool *CloudABI::buildLinker() const {
2647 return new tools::cloudabi::Linker(*this);
2648}
Ed Schouten3c3e58c2015-03-26 11:13:44 +00002649
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002650/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
2651
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002652OpenBSD::OpenBSD(const Driver &D, const llvm::Triple &Triple,
2653 const ArgList &Args)
2654 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar083edf72009-12-21 18:54:17 +00002655 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002656 getFilePaths().push_back("/usr/lib");
2657}
2658
Rafael Espindola7cf32212013-03-20 03:05:54 +00002659Tool *OpenBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002660 return new tools::openbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002661}
2662
Douglas Katzman95354292015-06-23 20:42:09 +00002663Tool *OpenBSD::buildLinker() const { return new tools::openbsd::Linker(*this); }
Daniel Dunbar10de9e62009-06-29 20:52:51 +00002664
Eli Friedman9fa28852012-08-08 23:57:20 +00002665/// Bitrig - Bitrig tool chain which can call as(1) and ld(1) directly.
2666
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002667Bitrig::Bitrig(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2668 : Generic_ELF(D, Triple, Args) {
Eli Friedman9fa28852012-08-08 23:57:20 +00002669 getFilePaths().push_back(getDriver().Dir + "/../lib");
2670 getFilePaths().push_back("/usr/lib");
2671}
2672
Rafael Espindola7cf32212013-03-20 03:05:54 +00002673Tool *Bitrig::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002674 return new tools::bitrig::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002675}
2676
Douglas Katzman95354292015-06-23 20:42:09 +00002677Tool *Bitrig::buildLinker() const { return new tools::bitrig::Linker(*this); }
Eli Friedman9fa28852012-08-08 23:57:20 +00002678
Douglas Katzman95354292015-06-23 20:42:09 +00002679ToolChain::CXXStdlibType Bitrig::GetCXXStdlibType(const ArgList &Args) const {
Richard Smith51af5192014-05-01 23:24:24 +00002680 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2681 StringRef Value = A->getValue();
2682 if (Value == "libstdc++")
2683 return ToolChain::CST_Libstdcxx;
2684 if (Value == "libc++")
2685 return ToolChain::CST_Libcxx;
2686
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002687 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Richard Smith51af5192014-05-01 23:24:24 +00002688 }
2689 return ToolChain::CST_Libcxx;
2690}
2691
Eli Friedman9fa28852012-08-08 23:57:20 +00002692void Bitrig::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2693 ArgStringList &CC1Args) const {
2694 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2695 DriverArgs.hasArg(options::OPT_nostdincxx))
2696 return;
2697
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002698 switch (GetCXXStdlibType(DriverArgs)) {
2699 case ToolChain::CST_Libcxx:
2700 addSystemInclude(DriverArgs, CC1Args,
Richard Smith51af5192014-05-01 23:24:24 +00002701 getDriver().SysRoot + "/usr/include/c++/v1");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002702 break;
2703 case ToolChain::CST_Libstdcxx:
2704 addSystemInclude(DriverArgs, CC1Args,
2705 getDriver().SysRoot + "/usr/include/c++/stdc++");
2706 addSystemInclude(DriverArgs, CC1Args,
2707 getDriver().SysRoot + "/usr/include/c++/stdc++/backward");
Eli Friedman9fa28852012-08-08 23:57:20 +00002708
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002709 StringRef Triple = getTriple().str();
2710 if (Triple.startswith("amd64"))
2711 addSystemInclude(DriverArgs, CC1Args,
2712 getDriver().SysRoot + "/usr/include/c++/stdc++/x86_64" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002713 Triple.substr(5));
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002714 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002715 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot +
2716 "/usr/include/c++/stdc++/" +
2717 Triple);
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002718 break;
2719 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002720}
2721
2722void Bitrig::AddCXXStdlibLibArgs(const ArgList &Args,
2723 ArgStringList &CmdArgs) const {
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002724 switch (GetCXXStdlibType(Args)) {
2725 case ToolChain::CST_Libcxx:
2726 CmdArgs.push_back("-lc++");
Richard Smith51af5192014-05-01 23:24:24 +00002727 CmdArgs.push_back("-lc++abi");
2728 CmdArgs.push_back("-lpthread");
Chandler Carruthc0f5cd12012-10-08 21:31:38 +00002729 break;
2730 case ToolChain::CST_Libstdcxx:
2731 CmdArgs.push_back("-lstdc++");
2732 break;
2733 }
Eli Friedman9fa28852012-08-08 23:57:20 +00002734}
2735
Daniel Dunbare24297c2009-03-30 21:06:03 +00002736/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
2737
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002738FreeBSD::FreeBSD(const Driver &D, const llvm::Triple &Triple,
2739 const ArgList &Args)
2740 : Generic_ELF(D, Triple, Args) {
Daniel Dunbara18a4872010-08-02 05:43:59 +00002741
Chandler Carruth0b1756b2012-01-26 01:35:15 +00002742 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
2743 // back to '/usr/lib' if it doesn't exist.
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002744 if ((Triple.getArch() == llvm::Triple::x86 ||
2745 Triple.getArch() == llvm::Triple::ppc) &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002746 D.getVFS().exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruthf7bf3db2012-01-25 11:24:24 +00002747 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
2748 else
2749 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbare24297c2009-03-30 21:06:03 +00002750}
2751
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002752ToolChain::CXXStdlibType FreeBSD::GetCXXStdlibType(const ArgList &Args) const {
David Chisnall867ccd82013-11-09 15:10:56 +00002753 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2754 StringRef Value = A->getValue();
2755 if (Value == "libstdc++")
2756 return ToolChain::CST_Libstdcxx;
2757 if (Value == "libc++")
2758 return ToolChain::CST_Libcxx;
2759
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002760 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
David Chisnall867ccd82013-11-09 15:10:56 +00002761 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002762 if (getTriple().getOSMajorVersion() >= 10)
David Chisnall867ccd82013-11-09 15:10:56 +00002763 return ToolChain::CST_Libcxx;
2764 return ToolChain::CST_Libstdcxx;
2765}
2766
2767void FreeBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2768 ArgStringList &CC1Args) const {
2769 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2770 DriverArgs.hasArg(options::OPT_nostdincxx))
2771 return;
2772
2773 switch (GetCXXStdlibType(DriverArgs)) {
2774 case ToolChain::CST_Libcxx:
2775 addSystemInclude(DriverArgs, CC1Args,
2776 getDriver().SysRoot + "/usr/include/c++/v1");
2777 break;
2778 case ToolChain::CST_Libstdcxx:
2779 addSystemInclude(DriverArgs, CC1Args,
2780 getDriver().SysRoot + "/usr/include/c++/4.2");
2781 addSystemInclude(DriverArgs, CC1Args,
2782 getDriver().SysRoot + "/usr/include/c++/4.2/backward");
2783 break;
2784 }
2785}
2786
Rafael Espindola7cf32212013-03-20 03:05:54 +00002787Tool *FreeBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002788 return new tools::freebsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002789}
2790
Douglas Katzman95354292015-06-23 20:42:09 +00002791Tool *FreeBSD::buildLinker() const { return new tools::freebsd::Linker(*this); }
Daniel Dunbarcc912342009-05-02 18:28:39 +00002792
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002793bool FreeBSD::UseSjLjExceptions() const {
2794 // FreeBSD uses SjLj exceptions on ARM oabi.
2795 switch (getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00002796 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00002797 case llvm::Triple::GNUEABI:
2798 case llvm::Triple::EABI:
2799 return false;
2800
2801 default:
2802 return (getTriple().getArch() == llvm::Triple::arm ||
2803 getTriple().getArch() == llvm::Triple::thumb);
2804 }
2805}
2806
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002807bool FreeBSD::HasNativeLLVMSupport() const { return true; }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002808
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002809bool FreeBSD::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Alexey Samsonove65ceb92014-02-25 13:26:03 +00002810
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00002811SanitizerMask FreeBSD::getSupportedSanitizers() const {
2812 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
2813 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
2814 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
2815 getTriple().getArch() == llvm::Triple::mips64el;
2816 SanitizerMask Res = ToolChain::getSupportedSanitizers();
2817 Res |= SanitizerKind::Address;
2818 Res |= SanitizerKind::Vptr;
2819 if (IsX86_64 || IsMIPS64) {
2820 Res |= SanitizerKind::Leak;
2821 Res |= SanitizerKind::Thread;
2822 }
2823 if (IsX86 || IsX86_64) {
2824 Res |= SanitizerKind::SafeStack;
2825 }
2826 return Res;
2827}
2828
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002829/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
2830
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002831NetBSD::NetBSD(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2832 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002833
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002834 if (getDriver().UseStdLib) {
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002835 // When targeting a 32-bit platform, try the special directory used on
2836 // 64-bit hosts, and only fall back to the main library directory if that
2837 // doesn't work.
2838 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
2839 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002840 switch (Triple.getArch()) {
2841 case llvm::Triple::x86:
Joerg Sonnenbergerbc923f32011-03-21 13:59:26 +00002842 getFilePaths().push_back("=/usr/lib/i386");
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002843 break;
2844 case llvm::Triple::arm:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002845 case llvm::Triple::armeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002846 case llvm::Triple::thumb:
Joerg Sonnenberger3a6c28a2014-05-07 08:24:23 +00002847 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002848 switch (Triple.getEnvironment()) {
2849 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002850 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002851 getFilePaths().push_back("=/usr/lib/eabi");
2852 break;
Joerg Sonnenberger17a80e42014-08-09 19:01:52 +00002853 case llvm::Triple::EABIHF:
2854 case llvm::Triple::GNUEABIHF:
2855 getFilePaths().push_back("=/usr/lib/eabihf");
2856 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002857 default:
2858 getFilePaths().push_back("=/usr/lib/oabi");
2859 break;
2860 }
2861 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002862 case llvm::Triple::mips64:
2863 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002864 if (tools::mips::hasMipsAbiArg(Args, "o32"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002865 getFilePaths().push_back("=/usr/lib/o32");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00002866 else if (tools::mips::hasMipsAbiArg(Args, "64"))
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00002867 getFilePaths().push_back("=/usr/lib/64");
2868 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002869 case llvm::Triple::ppc:
2870 getFilePaths().push_back("=/usr/lib/powerpc");
2871 break;
Joerg Sonnenberger8280abe2014-04-16 20:44:17 +00002872 case llvm::Triple::sparc:
2873 getFilePaths().push_back("=/usr/lib/sparc");
2874 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00002875 default:
2876 break;
2877 }
Chandler Carruth1ccbed82012-01-25 11:18:20 +00002878
2879 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002880 }
2881}
2882
Rafael Espindola7cf32212013-03-20 03:05:54 +00002883Tool *NetBSD::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002884 return new tools::netbsd::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002885}
2886
Douglas Katzman95354292015-06-23 20:42:09 +00002887Tool *NetBSD::buildLinker() const { return new tools::netbsd::Linker(*this); }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00002888
Douglas Katzman95354292015-06-23 20:42:09 +00002889ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002890 if (Arg *A = Args.getLastArg(options::OPT_stdlib_EQ)) {
2891 StringRef Value = A->getValue();
2892 if (Value == "libstdc++")
2893 return ToolChain::CST_Libstdcxx;
2894 if (Value == "libc++")
2895 return ToolChain::CST_Libcxx;
2896
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002897 getDriver().Diag(diag::err_drv_invalid_stdlib_name) << A->getAsString(Args);
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002898 }
2899
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002900 unsigned Major, Minor, Micro;
2901 getTriple().getOSVersion(Major, Minor, Micro);
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002902 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002903 switch (getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00002904 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00002905 case llvm::Triple::arm:
2906 case llvm::Triple::armeb:
2907 case llvm::Triple::thumb:
2908 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00002909 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00002910 case llvm::Triple::ppc64:
2911 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002912 case llvm::Triple::x86:
2913 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002914 return ToolChain::CST_Libcxx;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00002915 default:
2916 break;
2917 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00002918 }
Joerg Sonnenberger428ef1e2013-04-30 01:21:43 +00002919 return ToolChain::CST_Libstdcxx;
2920}
2921
2922void NetBSD::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2923 ArgStringList &CC1Args) const {
2924 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2925 DriverArgs.hasArg(options::OPT_nostdincxx))
2926 return;
2927
2928 switch (GetCXXStdlibType(DriverArgs)) {
2929 case ToolChain::CST_Libcxx:
2930 addSystemInclude(DriverArgs, CC1Args,
2931 getDriver().SysRoot + "/usr/include/c++/");
2932 break;
2933 case ToolChain::CST_Libstdcxx:
2934 addSystemInclude(DriverArgs, CC1Args,
2935 getDriver().SysRoot + "/usr/include/g++");
2936 addSystemInclude(DriverArgs, CC1Args,
2937 getDriver().SysRoot + "/usr/include/g++/backward");
2938 break;
2939 }
2940}
2941
Chris Lattner3e2ee142010-07-07 16:01:42 +00002942/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
2943
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002944Minix::Minix(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
2945 : Generic_ELF(D, Triple, Args) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00002946 getFilePaths().push_back(getDriver().Dir + "/../lib");
2947 getFilePaths().push_back("/usr/lib");
Chris Lattner3e2ee142010-07-07 16:01:42 +00002948}
2949
Rafael Espindola7cf32212013-03-20 03:05:54 +00002950Tool *Minix::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002951 return new tools::minix::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00002952}
2953
Douglas Katzman95354292015-06-23 20:42:09 +00002954Tool *Minix::buildLinker() const { return new tools::minix::Linker(*this); }
Chris Lattner3e2ee142010-07-07 16:01:42 +00002955
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002956static void addPathIfExists(const Driver &D, const Twine &Path,
2957 ToolChain::path_list &Paths) {
2958 if (D.getVFS().exists(Path))
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002959 Paths.push_back(Path.str());
2960}
2961
David Chisnallf571cde2012-02-15 13:39:01 +00002962/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
2963
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002964Solaris::Solaris(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola1af7c212012-02-19 01:38:32 +00002965 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002966 : Generic_GCC(D, Triple, Args) {
David Chisnallf571cde2012-02-15 13:39:01 +00002967
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002968 GCCInstallation.init(Triple, Args);
David Chisnallf571cde2012-02-15 13:39:01 +00002969
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002970 path_list &Paths = getFilePaths();
2971 if (GCCInstallation.isValid())
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002972 addPathIfExists(D, GCCInstallation.getInstallPath(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002973
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002974 addPathIfExists(D, getDriver().getInstalledDir(), Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002975 if (getDriver().getInstalledDir() != getDriver().Dir)
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002976 addPathIfExists(D, getDriver().Dir, Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002977
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002978 addPathIfExists(D, getDriver().SysRoot + getDriver().Dir + "/../lib", Paths);
Rafael Espindolac53c5b12015-08-31 19:17:51 +00002979
2980 std::string LibPath = "/usr/lib/";
2981 switch (Triple.getArch()) {
2982 case llvm::Triple::x86:
2983 case llvm::Triple::sparc:
2984 break;
2985 case llvm::Triple::x86_64:
2986 LibPath += "amd64/";
2987 break;
2988 case llvm::Triple::sparcv9:
2989 LibPath += "sparcv9/";
2990 break;
2991 default:
2992 llvm_unreachable("Unsupported architecture");
2993 }
2994
Benjamin Kramerd45b2052015-10-07 15:48:01 +00002995 addPathIfExists(D, getDriver().SysRoot + LibPath, Paths);
David Chisnallf571cde2012-02-15 13:39:01 +00002996}
2997
Rafael Espindola7cf32212013-03-20 03:05:54 +00002998Tool *Solaris::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00002999 return new tools::solaris::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003000}
3001
Douglas Katzman95354292015-06-23 20:42:09 +00003002Tool *Solaris::buildLinker() const { return new tools::solaris::Linker(*this); }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00003003
Rafael Espindolad5117262015-09-09 13:36:00 +00003004void Solaris::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3005 ArgStringList &CC1Args) const {
3006 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3007 DriverArgs.hasArg(options::OPT_nostdincxx))
3008 return;
3009
3010 // Include the support directory for things like xlocale and fudged system
3011 // headers.
3012 addSystemInclude(DriverArgs, CC1Args, "/usr/include/c++/v1/support/solaris");
3013
3014 if (GCCInstallation.isValid()) {
3015 GCCVersion Version = GCCInstallation.getVersion();
3016 addSystemInclude(DriverArgs, CC1Args,
3017 getDriver().SysRoot + "/usr/gcc/" +
3018 Version.MajorStr + "." +
3019 Version.MinorStr +
3020 "/include/c++/" + Version.Text);
3021 addSystemInclude(DriverArgs, CC1Args,
3022 getDriver().SysRoot + "/usr/gcc/" + Version.MajorStr +
3023 "." + Version.MinorStr + "/include/c++/" +
3024 Version.Text + "/" +
3025 GCCInstallation.getTriple().str());
3026 }
3027}
3028
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003029/// Distribution (very bare-bones at the moment).
Eli Friedman5cd659f2009-05-26 07:52:18 +00003030
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003031enum Distro {
Douglas Katzmana5df0c82015-06-22 20:55:31 +00003032 // NB: Releases of a particular Linux distro should be kept together
3033 // in this enum, because some tests are done by integer comparison against
3034 // the first and last known member in the family, e.g. IsRedHat().
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003035 ArchLinux,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003036 DebianLenny,
3037 DebianSqueeze,
Eli Friedmanf7600942011-06-02 21:36:53 +00003038 DebianWheezy,
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003039 DebianJessie,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003040 DebianStretch,
Rafael Espindola12479842010-11-11 02:07:13 +00003041 Exherbo,
Chris Lattner84e38552011-05-22 05:36:06 +00003042 RHEL4,
3043 RHEL5,
3044 RHEL6,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003045 RHEL7,
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003046 Fedora,
Rafael Espindola10a63c22013-07-03 14:14:00 +00003047 OpenSUSE,
Douglas Gregor0a36f4d2011-03-14 15:39:50 +00003048 UbuntuHardy,
3049 UbuntuIntrepid,
Rafael Espindola66b291a2010-11-10 05:00:22 +00003050 UbuntuJaunty,
Zhongxing Xu14776cf2010-11-15 09:01:52 +00003051 UbuntuKarmic,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003052 UbuntuLucid,
3053 UbuntuMaverick,
Ted Kremenek43d47cc2011-04-05 22:04:27 +00003054 UbuntuNatty,
Benjamin Kramerf90b5de2011-06-05 16:08:59 +00003055 UbuntuOneiric,
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003056 UbuntuPrecise,
Rafael Espindola62e87702012-12-13 20:26:05 +00003057 UbuntuQuantal,
3058 UbuntuRaring,
Sylvestre Ledru93c47b72013-06-13 11:52:27 +00003059 UbuntuSaucy,
Sylvestre Ledruaaf01a72013-11-07 09:31:30 +00003060 UbuntuTrusty,
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003061 UbuntuUtopic,
3062 UbuntuVivid,
Benjamin Kramer2d469802015-07-09 15:31:17 +00003063 UbuntuWily,
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003064 UnknownDistro
3065};
3066
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003067static bool IsRedhat(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003068 return Distro == Fedora || (Distro >= RHEL4 && Distro <= RHEL7);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003069}
3070
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003071static bool IsOpenSUSE(enum Distro Distro) { return Distro == OpenSUSE; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003072
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003073static bool IsDebian(enum Distro Distro) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003074 return Distro >= DebianLenny && Distro <= DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003075}
3076
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003077static bool IsUbuntu(enum Distro Distro) {
Benjamin Kramer2d469802015-07-09 15:31:17 +00003078 return Distro >= UbuntuHardy && Distro <= UbuntuWily;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003079}
3080
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003081static Distro DetectDistro(const Driver &D, llvm::Triple::ArchType Arch) {
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003082 llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> File =
3083 llvm::MemoryBuffer::getFile("/etc/lsb-release");
3084 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003085 StringRef Data = File.get()->getBuffer();
Hans Wennborg3b7dd8d2014-08-11 18:09:32 +00003086 SmallVector<StringRef, 16> Lines;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003087 Data.split(Lines, "\n");
Thomas Schwinge6d94da02013-03-28 19:02:48 +00003088 Distro Version = UnknownDistro;
Benjamin Kramer72e64312015-09-24 14:48:49 +00003089 for (StringRef Line : Lines)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003090 if (Version == UnknownDistro && Line.startswith("DISTRIB_CODENAME="))
3091 Version = llvm::StringSwitch<Distro>(Line.substr(17))
3092 .Case("hardy", UbuntuHardy)
3093 .Case("intrepid", UbuntuIntrepid)
3094 .Case("jaunty", UbuntuJaunty)
3095 .Case("karmic", UbuntuKarmic)
3096 .Case("lucid", UbuntuLucid)
3097 .Case("maverick", UbuntuMaverick)
3098 .Case("natty", UbuntuNatty)
3099 .Case("oneiric", UbuntuOneiric)
3100 .Case("precise", UbuntuPrecise)
3101 .Case("quantal", UbuntuQuantal)
3102 .Case("raring", UbuntuRaring)
3103 .Case("saucy", UbuntuSaucy)
3104 .Case("trusty", UbuntuTrusty)
3105 .Case("utopic", UbuntuUtopic)
3106 .Case("vivid", UbuntuVivid)
Benjamin Kramer2d469802015-07-09 15:31:17 +00003107 .Case("wily", UbuntuWily)
Douglas Katzman6bbffc42015-06-25 18:51:37 +00003108 .Default(UnknownDistro);
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003109 return Version;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003110 }
3111
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003112 File = llvm::MemoryBuffer::getFile("/etc/redhat-release");
3113 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003114 StringRef Data = File.get()->getBuffer();
Rafael Espindola0d2cbc02013-10-25 18:09:41 +00003115 if (Data.startswith("Fedora release"))
3116 return Fedora;
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003117 if (Data.startswith("Red Hat Enterprise Linux") ||
3118 Data.startswith("CentOS")) {
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003119 if (Data.find("release 7") != StringRef::npos)
3120 return RHEL7;
3121 else if (Data.find("release 6") != StringRef::npos)
Benjamin Kramer6af073b2014-05-05 12:39:32 +00003122 return RHEL6;
3123 else if (Data.find("release 5") != StringRef::npos)
3124 return RHEL5;
3125 else if (Data.find("release 4") != StringRef::npos)
3126 return RHEL4;
3127 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003128 return UnknownDistro;
3129 }
3130
Rafael Espindola2d2b4202014-07-06 17:43:24 +00003131 File = llvm::MemoryBuffer::getFile("/etc/debian_version");
3132 if (File) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003133 StringRef Data = File.get()->getBuffer();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003134 if (Data[0] == '5')
3135 return DebianLenny;
Rafael Espindola1510c852011-12-28 18:17:14 +00003136 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003137 return DebianSqueeze;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003138 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedmanf7600942011-06-02 21:36:53 +00003139 return DebianWheezy;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003140 else if (Data.startswith("jessie/sid") || Data[0] == '8')
Sylvestre Ledrubdef2892013-01-06 08:09:29 +00003141 return DebianJessie;
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003142 else if (Data.startswith("stretch/sid") || Data[0] == '9')
3143 return DebianStretch;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003144 return UnknownDistro;
3145 }
3146
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003147 if (D.getVFS().exists("/etc/SuSE-release"))
Rafael Espindola10a63c22013-07-03 14:14:00 +00003148 return OpenSUSE;
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003149
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003150 if (D.getVFS().exists("/etc/exherbo-release"))
Rafael Espindola12479842010-11-11 02:07:13 +00003151 return Exherbo;
3152
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003153 if (D.getVFS().exists("/etc/arch-release"))
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003154 return ArchLinux;
3155
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003156 return UnknownDistro;
3157}
3158
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003159/// \brief Get our best guess at the multiarch triple for a target.
3160///
3161/// Debian-based systems are starting to use a multiarch setup where they use
3162/// a target-triple directory in the library and header search paths.
3163/// Unfortunately, this triple does not align with the vanilla target triple,
3164/// so we provide a rough mapping here.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003165static std::string getMultiarchTriple(const Driver &D,
3166 const llvm::Triple &TargetTriple,
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003167 StringRef SysRoot) {
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003168 llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment();
3169
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003170 // For most architectures, just use whatever we have rather than trying to be
3171 // clever.
3172 switch (TargetTriple.getArch()) {
3173 default:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003174 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003175
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003176 // We use the existence of '/lib/<triple>' as a directory to detect some
3177 // common linux triples that don't quite match the Clang triple for both
3178 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
3179 // regardless of what the actual target triple is.
Chad Rosier4dce73a2012-07-11 19:08:21 +00003180 case llvm::Triple::arm:
3181 case llvm::Triple::thumb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003182 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003183 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabihf"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003184 return "arm-linux-gnueabihf";
3185 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003186 if (D.getVFS().exists(SysRoot + "/lib/arm-linux-gnueabi"))
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003187 return "arm-linux-gnueabi";
3188 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003189 break;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003190 case llvm::Triple::armeb:
3191 case llvm::Triple::thumbeb:
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003192 if (TargetEnvironment == llvm::Triple::GNUEABIHF) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003193 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabihf"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003194 return "armeb-linux-gnueabihf";
3195 } else {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003196 if (D.getVFS().exists(SysRoot + "/lib/armeb-linux-gnueabi"))
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003197 return "armeb-linux-gnueabi";
3198 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003199 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003200 case llvm::Triple::x86:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003201 if (D.getVFS().exists(SysRoot + "/lib/i386-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003202 return "i386-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003203 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003204 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00003205 // We don't want this for x32, otherwise it will match x86_64 libs
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003206 if (TargetEnvironment != llvm::Triple::GNUX32 &&
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003207 D.getVFS().exists(SysRoot + "/lib/x86_64-linux-gnu"))
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003208 return "x86_64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003209 break;
Tim Northover9bb857a2013-01-31 12:13:10 +00003210 case llvm::Triple::aarch64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003211 if (D.getVFS().exists(SysRoot + "/lib/aarch64-linux-gnu"))
Tim Northover9bb857a2013-01-31 12:13:10 +00003212 return "aarch64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003213 break;
Christian Pirkera74c7912014-03-14 12:15:45 +00003214 case llvm::Triple::aarch64_be:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003215 if (D.getVFS().exists(SysRoot + "/lib/aarch64_be-linux-gnu"))
Christian Pirkera74c7912014-03-14 12:15:45 +00003216 return "aarch64_be-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003217 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003218 case llvm::Triple::mips:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003219 if (D.getVFS().exists(SysRoot + "/lib/mips-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003220 return "mips-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003221 break;
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003222 case llvm::Triple::mipsel:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003223 if (D.getVFS().exists(SysRoot + "/lib/mipsel-linux-gnu"))
Eli Friedman27b8c4f2011-11-08 19:43:37 +00003224 return "mipsel-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003225 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003226 case llvm::Triple::mips64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003227 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003228 return "mips64-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003229 if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003230 return "mips64-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003231 break;
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003232 case llvm::Triple::mips64el:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003233 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003234 return "mips64el-linux-gnu";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003235 if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64"))
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003236 return "mips64el-linux-gnuabi64";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003237 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003238 case llvm::Triple::ppc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003239 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe"))
Sylvestre Ledrue0bf5812013-03-15 16:22:43 +00003240 return "powerpc-linux-gnuspe";
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003241 if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003242 return "powerpc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003243 break;
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003244 case llvm::Triple::ppc64:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003245 if (D.getVFS().exists(SysRoot + "/lib/powerpc64-linux-gnu"))
Chandler Carruthaf3c2092012-02-26 09:03:21 +00003246 return "powerpc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003247 break;
Bill Schmidt778d3872013-07-26 01:36:11 +00003248 case llvm::Triple::ppc64le:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003249 if (D.getVFS().exists(SysRoot + "/lib/powerpc64le-linux-gnu"))
Bill Schmidt778d3872013-07-26 01:36:11 +00003250 return "powerpc64le-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003251 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003252 case llvm::Triple::sparc:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003253 if (D.getVFS().exists(SysRoot + "/lib/sparc-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003254 return "sparc-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003255 break;
James Y Knightc0aeadf2015-06-04 15:36:30 +00003256 case llvm::Triple::sparcv9:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003257 if (D.getVFS().exists(SysRoot + "/lib/sparc64-linux-gnu"))
James Y Knightc0aeadf2015-06-04 15:36:30 +00003258 return "sparc64-linux-gnu";
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003259 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003260 case llvm::Triple::systemz:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003261 if (D.getVFS().exists(SysRoot + "/lib/s390x-linux-gnu"))
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003262 return "s390x-linux-gnu";
3263 break;
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003264 }
Douglas Katzmanecddb3a2015-06-26 18:37:15 +00003265 return TargetTriple.str();
Chandler Carruthfb7fa242011-10-31 08:42:24 +00003266}
3267
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003268static StringRef getOSLibDir(const llvm::Triple &Triple, const ArgList &Args) {
Chandler Carruthda797042013-10-29 10:27:30 +00003269 if (isMipsArch(Triple.getArch())) {
3270 // lib32 directory has a special meaning on MIPS targets.
3271 // It contains N32 ABI binaries. Use this folder if produce
3272 // code for N32 ABI only.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003273 if (tools::mips::hasMipsAbiArg(Args, "n32"))
Chandler Carruthda797042013-10-29 10:27:30 +00003274 return "lib32";
3275 return Triple.isArch32Bit() ? "lib" : "lib64";
3276 }
Simon Atanasyand4413882012-09-14 11:27:24 +00003277
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003278 // It happens that only x86 and PPC use the 'lib32' variant of oslibdir, and
Chandler Carruthda797042013-10-29 10:27:30 +00003279 // using that variant while targeting other architectures causes problems
3280 // because the libraries are laid out in shared system roots that can't cope
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003281 // with a 'lib32' library search path being considered. So we only enable
Chandler Carruthda797042013-10-29 10:27:30 +00003282 // them when we know we may need it.
3283 //
3284 // FIXME: This is a bit of a hack. We should really unify this code for
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003285 // reasoning about oslibdir spellings with the lib dir spellings in the
Chandler Carruthda797042013-10-29 10:27:30 +00003286 // GCCInstallationDetector, but that is a more significant refactoring.
3287 if (Triple.getArch() == llvm::Triple::x86 ||
3288 Triple.getArch() == llvm::Triple::ppc)
Simon Atanasyand4413882012-09-14 11:27:24 +00003289 return "lib32";
3290
Zinovy Nis1db95732014-07-10 15:27:19 +00003291 if (Triple.getArch() == llvm::Triple::x86_64 &&
3292 Triple.getEnvironment() == llvm::Triple::GNUX32)
3293 return "libx32";
3294
Simon Atanasyand4413882012-09-14 11:27:24 +00003295 return Triple.isArch32Bit() ? "lib" : "lib64";
3296}
3297
Rafael Espindola1af7c212012-02-19 01:38:32 +00003298Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003299 : Generic_ELF(D, Triple, Args) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003300 GCCInstallation.init(Triple, Args);
3301 CudaInstallation.init(Triple, Args);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003302 Multilibs = GCCInstallation.getMultilibs();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003303 llvm::Triple::ArchType Arch = Triple.getArch();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003304 std::string SysRoot = computeSysRoot();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003305
Rafael Espindola10a63c22013-07-03 14:14:00 +00003306 // Cross-compiling binutils and GCC installations (vanilla and openSUSE at
Chandler Carruthd6c62b62013-06-20 23:37:54 +00003307 // least) put various tools in a triple-prefixed directory off of the parent
3308 // of the GCC installation. We use the GCC triple here to ensure that we end
3309 // up with tools that support the same amount of cross compiling as the
3310 // detected GCC installation. For example, if we find a GCC installation
3311 // targeting x86_64, but it is a bi-arch GCC installation, it can also be
3312 // used to target i386.
3313 // FIXME: This seems unlikely to be Linux-specific.
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003314 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruth4be70dd2011-11-06 09:21:54 +00003315 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003316 GCCInstallation.getTriple().str() + "/bin")
3317 .str());
Rafael Espindola5f344ff2011-09-01 16:25:49 +00003318
Logan Chieneb9162f2014-06-26 14:23:45 +00003319 Linker = GetLinkerPath();
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003320
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003321 Distro Distro = DetectDistro(D, Arch);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003322
Rafael Espindola10a63c22013-07-03 14:14:00 +00003323 if (IsOpenSUSE(Distro) || IsUbuntu(Distro)) {
Rafael Espindolac5688622010-11-08 14:48:47 +00003324 ExtraOpts.push_back("-z");
3325 ExtraOpts.push_back("relro");
3326 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003327
Douglas Gregord9bb1522011-03-06 19:11:49 +00003328 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003329 ExtraOpts.push_back("-X");
3330
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003331 const bool IsAndroid = Triple.isAndroid();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003332 const bool IsMips = isMipsArch(Arch);
3333
3334 if (IsMips && !SysRoot.empty())
3335 ExtraOpts.push_back("--sysroot=" + SysRoot);
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003336
Chandler Carruth0b842912011-12-09 04:45:18 +00003337 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
3338 // and the MIPS ABI require .dynsym to be sorted in different ways.
3339 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
3340 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov2ca1aa52012-01-13 09:30:38 +00003341 // Android loader does not support .gnu.hash.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003342 if (!IsMips && !IsAndroid) {
Rafael Espindola10a63c22013-07-03 14:14:00 +00003343 if (IsRedhat(Distro) || IsOpenSUSE(Distro) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003344 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruth0b842912011-12-09 04:45:18 +00003345 ExtraOpts.push_back("--hash-style=gnu");
3346
Rafael Espindola10a63c22013-07-03 14:14:00 +00003347 if (IsDebian(Distro) || IsOpenSUSE(Distro) || Distro == UbuntuLucid ||
Chandler Carruth0b842912011-12-09 04:45:18 +00003348 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
3349 ExtraOpts.push_back("--hash-style=both");
3350 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003351
Chris Lattner84e38552011-05-22 05:36:06 +00003352 if (IsRedhat(Distro))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003353 ExtraOpts.push_back("--no-add-needed");
3354
Benjamin Kramer1a8fa8b2015-04-06 12:30:43 +00003355 if ((IsDebian(Distro) && Distro >= DebianSqueeze) || IsOpenSUSE(Distro) ||
Rafael Espindolad8f92c82011-06-03 15:23:24 +00003356 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer7c3f09d2012-02-06 14:36:09 +00003357 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003358 ExtraOpts.push_back("--build-id");
3359
Rafael Espindola10a63c22013-07-03 14:14:00 +00003360 if (IsOpenSUSE(Distro))
Chandler Carruthe5d9d902011-05-24 07:51:17 +00003361 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattnerd075c822011-05-22 16:45:07 +00003362
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003363 // The selection of paths to try here is designed to match the patterns which
3364 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
3365 // This was determined by running GCC in a fake filesystem, creating all
3366 // possible permutations of these directories, and seeing which ones it added
3367 // to the link paths.
3368 path_list &Paths = getFilePaths();
Chandler Carruth6a4e8e32011-02-25 06:39:53 +00003369
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003370 const std::string OSLibDir = getOSLibDir(Triple, Args);
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003371 const std::string MultiarchTriple = getMultiarchTriple(D, Triple, SysRoot);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003372
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003373 // Add the multilib suffixed paths where they are available.
3374 if (GCCInstallation.isValid()) {
Chandler Carruth4d9d7682012-01-24 19:28:29 +00003375 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth96bae7b2012-01-24 20:08:17 +00003376 const std::string &LibPath = GCCInstallation.getParentLibPath();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003377 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyan53fefd12012-10-03 17:46:38 +00003378
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003379 // Sourcery CodeBench MIPS toolchain holds some libraries under
Chandler Carruth9b6ce932013-10-29 02:27:56 +00003380 // a biarch-like suffix of the GCC installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003381 addPathIfExists(D, GCCInstallation.getInstallPath() + Multilib.gccSuffix(),
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003382 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003383
3384 // GCC cross compiling toolchains will install target libraries which ship
3385 // as part of the toolchain under <prefix>/<triple>/<libdir> rather than as
3386 // any part of the GCC installation in
3387 // <prefix>/<libdir>/gcc/<triple>/<version>. This decision is somewhat
3388 // debatable, but is the reality today. We need to search this tree even
3389 // when we have a sysroot somewhere else. It is the responsibility of
Alp Tokerf6a24ce2013-12-05 16:25:25 +00003390 // whomever is doing the cross build targeting a sysroot using a GCC
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003391 // installation that is *not* within the system root to ensure two things:
3392 //
3393 // 1) Any DSOs that are linked in from this tree or from the install path
Alexander Potapenkoc8e749a2014-09-01 12:35:57 +00003394 // above must be present on the system root and found via an
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003395 // appropriate rpath.
3396 // 2) There must not be libraries installed into
3397 // <prefix>/<triple>/<libdir> unless they should be preferred over
3398 // those within the system root.
3399 //
3400 // Note that this matches the GCC behavior. See the below comment for where
3401 // Clang diverges from GCC's behavior.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003402 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" +
3403 OSLibDir + Multilib.osSuffix(),
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003404 Paths);
3405
Chandler Carruth69a125b2012-04-06 16:32:06 +00003406 // If the GCC installation we found is inside of the sysroot, we want to
3407 // prefer libraries installed in the parent prefix of the GCC installation.
3408 // It is important to *not* use these paths when the GCC installation is
Gabor Greif5d3231c2012-04-18 10:59:08 +00003409 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003410 // This usually happens when there is an external cross compiler on the
3411 // host system, and a more minimal sysroot available that is the target of
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003412 // the cross. Note that GCC does include some of these directories in some
3413 // configurations but this seems somewhere between questionable and simply
3414 // a bug.
Chandler Carruth69a125b2012-04-06 16:32:06 +00003415 if (StringRef(LibPath).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003416 addPathIfExists(D, LibPath + "/" + MultiarchTriple, Paths);
3417 addPathIfExists(D, LibPath + "/../" + OSLibDir, Paths);
Chandler Carruth69a125b2012-04-06 16:32:06 +00003418 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003419 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003420
3421 // Similar to the logic for GCC above, if we currently running Clang inside
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003422 // of the requested system root, add its parent library paths to
Chandler Carruth902efc62014-01-21 22:49:05 +00003423 // those searched.
3424 // FIXME: It's not clear whether we should use the driver's installed
3425 // directory ('Dir' below) or the ResourceDir.
3426 if (StringRef(D.Dir).startswith(SysRoot)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003427 addPathIfExists(D, D.Dir + "/../lib/" + MultiarchTriple, Paths);
3428 addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003429 }
3430
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003431 addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
3432 addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
3433 addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
3434 addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003435
Chandler Carruthb427c562013-06-22 11:35:51 +00003436 // Try walking via the GCC triple path in case of biarch or multiarch GCC
Chandler Carruthd0b93d62011-11-06 23:09:05 +00003437 // installations with strange symlinks.
Rafael Espindolab6250162013-10-25 17:06:04 +00003438 if (GCCInstallation.isValid()) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003439 addPathIfExists(D,
3440 SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003441 "/../../" + OSLibDir,
3442 Paths);
Rafael Espindola30490212011-06-03 15:39:42 +00003443
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003444 // Add the 'other' biarch variant path
3445 Multilib BiarchSibling;
3446 if (GCCInstallation.getBiarchSibling(BiarchSibling)) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003447 addPathIfExists(D, GCCInstallation.getInstallPath() +
3448 BiarchSibling.gccSuffix(),
3449 Paths);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003450 }
Chandler Carruth69a125b2012-04-06 16:32:06 +00003451
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003452 // See comments above on the multilib variant for details of why this is
3453 // included even from outside the sysroot.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003454 const std::string &LibPath = GCCInstallation.getParentLibPath();
3455 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
3456 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003457 addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib" +
3458 Multilib.osSuffix(),
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003459 Paths);
Chandler Carruth7f8042c2013-07-31 00:37:07 +00003460
3461 // See comments above on the multilib variant for details of why this is
3462 // only included from within the sysroot.
3463 if (StringRef(LibPath).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003464 addPathIfExists(D, LibPath, Paths);
Chandler Carruth413e5ac2011-10-03 05:28:29 +00003465 }
Chandler Carruth902efc62014-01-21 22:49:05 +00003466
3467 // Similar to the logic for GCC above, if we are currently running Clang
3468 // inside of the requested system root, add its parent library path to those
3469 // searched.
3470 // FIXME: It's not clear whether we should use the driver's installed
3471 // directory ('Dir' below) or the ResourceDir.
3472 if (StringRef(D.Dir).startswith(SysRoot))
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003473 addPathIfExists(D, D.Dir + "/../lib", Paths);
Chandler Carruth902efc62014-01-21 22:49:05 +00003474
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003475 addPathIfExists(D, SysRoot + "/lib", Paths);
3476 addPathIfExists(D, SysRoot + "/usr/lib", Paths);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00003477}
3478
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003479bool Linux::HasNativeLLVMSupport() const { return true; }
Eli Friedman5cd659f2009-05-26 07:52:18 +00003480
Douglas Katzman95354292015-06-23 20:42:09 +00003481Tool *Linux::buildLinker() const { return new tools::gnutools::Linker(*this); }
Rafael Espindola7cf32212013-03-20 03:05:54 +00003482
3483Tool *Linux::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003484 return new tools::gnutools::Assembler(*this);
Rafael Espindola92b00932010-08-10 00:25:48 +00003485}
3486
Simon Atanasyana0d89572013-10-05 14:37:55 +00003487std::string Linux::computeSysRoot() const {
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003488 if (!getDriver().SysRoot.empty())
3489 return getDriver().SysRoot;
3490
3491 if (!GCCInstallation.isValid() || !isMipsArch(getTriple().getArch()))
3492 return std::string();
3493
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003494 // Standalone MIPS toolchains use different names for sysroot folder
3495 // and put it into different places. Here we try to check some known
3496 // variants.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003497
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003498 const StringRef InstallDir = GCCInstallation.getInstallPath();
3499 const StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003500 const Multilib &Multilib = GCCInstallation.getMultilib();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003501
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003502 std::string Path =
3503 (InstallDir + "/../../../../" + TripleStr + "/libc" + Multilib.osSuffix())
3504 .str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003505
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003506 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003507 return Path;
3508
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003509 Path = (InstallDir + "/../../../../sysroot" + Multilib.osSuffix()).str();
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003510
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003511 if (getVFS().exists(Path))
Simon Atanasyana61b7ec2013-10-10 07:57:44 +00003512 return Path;
3513
3514 return std::string();
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003515}
3516
Chandler Carrutha796f532011-11-05 20:17:13 +00003517void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3518 ArgStringList &CC1Args) const {
3519 const Driver &D = getDriver();
Simon Atanasyana0d89572013-10-05 14:37:55 +00003520 std::string SysRoot = computeSysRoot();
Chandler Carrutha796f532011-11-05 20:17:13 +00003521
3522 if (DriverArgs.hasArg(options::OPT_nostdinc))
3523 return;
3524
3525 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003526 addSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/local/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003527
3528 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Rafael Espindola358256c2013-06-26 02:13:00 +00003529 SmallString<128> P(D.ResourceDir);
3530 llvm::sys::path::append(P, "include");
Yaron Keren92e1b622015-03-18 10:17:07 +00003531 addSystemInclude(DriverArgs, CC1Args, P);
Chandler Carrutha796f532011-11-05 20:17:13 +00003532 }
3533
3534 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
3535 return;
3536
3537 // Check for configure-time C include directories.
3538 StringRef CIncludeDirs(C_INCLUDE_DIRS);
3539 if (CIncludeDirs != "") {
3540 SmallVector<StringRef, 5> dirs;
3541 CIncludeDirs.split(dirs, ":");
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003542 for (StringRef dir : dirs) {
Benjamin Kramer33cd6dc2015-02-18 18:45:54 +00003543 StringRef Prefix =
3544 llvm::sys::path::is_absolute(dir) ? StringRef(SysRoot) : "";
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003545 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + dir);
Chandler Carrutha796f532011-11-05 20:17:13 +00003546 }
3547 return;
3548 }
3549
3550 // Lacking those, try to detect the correct set of system includes for the
3551 // target triple.
3552
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003553 // Add include directories specific to the selected multilib set and multilib.
3554 if (GCCInstallation.isValid()) {
Benjamin Kramerac75baa2015-03-22 15:56:12 +00003555 const auto &Callback = Multilibs.includeDirsCallback();
Simon Atanasyan9e49e142014-08-06 05:44:47 +00003556 if (Callback) {
3557 const auto IncludePaths = Callback(GCCInstallation.getInstallPath(),
3558 GCCInstallation.getTriple().str(),
3559 GCCInstallation.getMultilib());
3560 for (const auto &Path : IncludePaths)
3561 addExternCSystemIncludeIfExists(DriverArgs, CC1Args, Path);
3562 }
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003563 }
3564
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003565 // Implement generic Debian multiarch support.
3566 const StringRef X86_64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003567 "/usr/include/x86_64-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003568
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003569 // FIXME: These are older forms of multiarch. It's not clear that they're
3570 // in use in any released version of Debian, so we should consider
3571 // removing them.
3572 "/usr/include/i686-linux-gnu/64", "/usr/include/i486-linux-gnu/64"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003573 const StringRef X86MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003574 "/usr/include/i386-linux-gnu",
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003575
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003576 // FIXME: These are older forms of multiarch. It's not clear that they're
3577 // in use in any released version of Debian, so we should consider
3578 // removing them.
3579 "/usr/include/x86_64-linux-gnu/32", "/usr/include/i686-linux-gnu",
3580 "/usr/include/i486-linux-gnu"};
Tim Northover9bb857a2013-01-31 12:13:10 +00003581 const StringRef AArch64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003582 "/usr/include/aarch64-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003583 const StringRef ARMMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003584 "/usr/include/arm-linux-gnueabi"};
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003585 const StringRef ARMHFMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003586 "/usr/include/arm-linux-gnueabihf"};
3587 const StringRef MIPSMultiarchIncludeDirs[] = {"/usr/include/mips-linux-gnu"};
Eli Friedman7771c832011-11-11 03:05:19 +00003588 const StringRef MIPSELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003589 "/usr/include/mipsel-linux-gnu"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003590 const StringRef MIPS64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003591 "/usr/include/mips64-linux-gnu", "/usr/include/mips64-linux-gnuabi64"};
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003592 const StringRef MIPS64ELMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003593 "/usr/include/mips64el-linux-gnu",
3594 "/usr/include/mips64el-linux-gnuabi64"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003595 const StringRef PPCMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003596 "/usr/include/powerpc-linux-gnu"};
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003597 const StringRef PPC64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003598 "/usr/include/powerpc64-linux-gnu"};
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003599 const StringRef PPC64LEMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003600 "/usr/include/powerpc64le-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003601 const StringRef SparcMultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003602 "/usr/include/sparc-linux-gnu"};
James Y Knight09677ad2015-06-05 13:44:43 +00003603 const StringRef Sparc64MultiarchIncludeDirs[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003604 "/usr/include/sparc64-linux-gnu"};
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003605 const StringRef SYSTEMZMultiarchIncludeDirs[] = {
3606 "/usr/include/s390x-linux-gnu"};
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003607 ArrayRef<StringRef> MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003608 switch (getTriple().getArch()) {
3609 case llvm::Triple::x86_64:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003610 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003611 break;
3612 case llvm::Triple::x86:
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003613 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003614 break;
3615 case llvm::Triple::aarch64:
3616 case llvm::Triple::aarch64_be:
Tim Northover9bb857a2013-01-31 12:13:10 +00003617 MultiarchIncludeDirs = AArch64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003618 break;
3619 case llvm::Triple::arm:
Jiangning Liu61b06cb2012-07-31 08:06:29 +00003620 if (getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
3621 MultiarchIncludeDirs = ARMHFMultiarchIncludeDirs;
3622 else
3623 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003624 break;
3625 case llvm::Triple::mips:
Eli Friedman7771c832011-11-11 03:05:19 +00003626 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003627 break;
3628 case llvm::Triple::mipsel:
Eli Friedman7771c832011-11-11 03:05:19 +00003629 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003630 break;
3631 case llvm::Triple::mips64:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003632 MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003633 break;
3634 case llvm::Triple::mips64el:
Simon Atanasyan3a46afa2014-06-24 19:00:12 +00003635 MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003636 break;
3637 case llvm::Triple::ppc:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003638 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003639 break;
3640 case llvm::Triple::ppc64:
Chandler Carruth2e9d7312012-02-26 09:21:43 +00003641 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003642 break;
3643 case llvm::Triple::ppc64le:
Ulrich Weiganda8331b92014-06-20 13:41:24 +00003644 MultiarchIncludeDirs = PPC64LEMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003645 break;
3646 case llvm::Triple::sparc:
James Y Knight09677ad2015-06-05 13:44:43 +00003647 MultiarchIncludeDirs = SparcMultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003648 break;
3649 case llvm::Triple::sparcv9:
James Y Knight09677ad2015-06-05 13:44:43 +00003650 MultiarchIncludeDirs = Sparc64MultiarchIncludeDirs;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003651 break;
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00003652 case llvm::Triple::systemz:
3653 MultiarchIncludeDirs = SYSTEMZMultiarchIncludeDirs;
3654 break;
Douglas Katzman7e37afb2015-06-23 03:02:39 +00003655 default:
3656 break;
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003657 }
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003658 for (StringRef Dir : MultiarchIncludeDirs) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003659 if (D.getVFS().exists(SysRoot + Dir)) {
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003660 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir);
Chandler Carruth5b77c6c2011-11-06 08:21:07 +00003661 break;
3662 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003663 }
3664
3665 if (getTriple().getOS() == llvm::Triple::RTEMS)
3666 return;
3667
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003668 // Add an include of '/include' directly. This isn't provided by default by
3669 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
3670 // add even when Clang is acting as-if it were a system compiler.
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003671 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/include");
Chandler Carruth475ab6a2011-11-08 17:19:47 +00003672
Simon Atanasyan08450bd2013-04-20 08:15:03 +00003673 addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + "/usr/include");
Chandler Carrutha796f532011-11-05 20:17:13 +00003674}
3675
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003676/// \brief Helper to add the variant paths of a libstdc++ installation.
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003677bool Linux::addLibStdCXXIncludePaths(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003678 Twine Base, Twine Suffix, StringRef GCCTriple, StringRef GCCMultiarchTriple,
3679 StringRef TargetMultiarchTriple, Twine IncludeSuffix,
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003680 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
3681 if (!getVFS().exists(Base + Suffix))
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003682 return false;
Chandler Carrutha796f532011-11-05 20:17:13 +00003683
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003684 addSystemInclude(DriverArgs, CC1Args, Base + Suffix);
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003685
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003686 // The vanilla GCC layout of libstdc++ headers uses a triple subdirectory. If
3687 // that path exists or we have neither a GCC nor target multiarch triple, use
3688 // this vanilla search path.
3689 if ((GCCMultiarchTriple.empty() && TargetMultiarchTriple.empty()) ||
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003690 getVFS().exists(Base + Suffix + "/" + GCCTriple + IncludeSuffix)) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003691 addSystemInclude(DriverArgs, CC1Args,
3692 Base + Suffix + "/" + GCCTriple + IncludeSuffix);
3693 } else {
3694 // Otherwise try to use multiarch naming schemes which have normalized the
3695 // triples and put the triple before the suffix.
3696 //
3697 // GCC surprisingly uses *both* the GCC triple with a multilib suffix and
3698 // the target triple, so we support that here.
3699 addSystemInclude(DriverArgs, CC1Args,
3700 Base + "/" + GCCMultiarchTriple + Suffix + IncludeSuffix);
3701 addSystemInclude(DriverArgs, CC1Args,
3702 Base + "/" + TargetMultiarchTriple + Suffix);
3703 }
3704
3705 addSystemInclude(DriverArgs, CC1Args, Base + Suffix + "/backward");
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003706 return true;
3707}
3708
Chandler Carrutha796f532011-11-05 20:17:13 +00003709void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
3710 ArgStringList &CC1Args) const {
3711 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3712 DriverArgs.hasArg(options::OPT_nostdincxx))
3713 return;
3714
Chandler Carruthf4701732011-11-07 09:01:17 +00003715 // Check if libc++ has been enabled and provide its include paths if so.
3716 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003717 const std::string LibCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003718 // The primary location is within the Clang installation.
3719 // FIXME: We shouldn't hard code 'v1' here to make Clang future proof to
3720 // newer ABI versions.
3721 getDriver().Dir + "/../include/c++/v1",
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003722
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003723 // We also check the system as for a long time this is the only place
3724 // Clang looked.
3725 // FIXME: We should really remove this. It doesn't make any sense.
3726 getDriver().SysRoot + "/usr/include/c++/v1"};
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003727 for (const auto &IncludePath : LibCXXIncludePathCandidates) {
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003728 if (!getVFS().exists(IncludePath))
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003729 continue;
3730 // Add the first candidate that exists.
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003731 addSystemInclude(DriverArgs, CC1Args, IncludePath);
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003732 break;
3733 }
Chandler Carruthf4701732011-11-07 09:01:17 +00003734 return;
3735 }
3736
Chandler Carrutha1f1fd32012-01-25 08:04:13 +00003737 // We need a detected GCC installation on Linux to provide libstdc++'s
3738 // headers. We handled the libc++ case above.
3739 if (!GCCInstallation.isValid())
3740 return;
Chandler Carrutha796f532011-11-05 20:17:13 +00003741
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003742 // By default, look for the C++ headers in an include directory adjacent to
3743 // the lib directory of the GCC installation. Note that this is expect to be
3744 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
3745 StringRef LibDir = GCCInstallation.getParentLibPath();
3746 StringRef InstallDir = GCCInstallation.getInstallPath();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003747 StringRef TripleStr = GCCInstallation.getTriple().str();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003748 const Multilib &Multilib = GCCInstallation.getMultilib();
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003749 const std::string GCCMultiarchTriple = getMultiarchTriple(
3750 getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot);
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003751 const std::string TargetMultiarchTriple =
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003752 getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot);
Chandler Carruth1f2b2f82013-08-26 08:59:53 +00003753 const GCCVersion &Version = GCCInstallation.getVersion();
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003754
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003755 // The primary search for libstdc++ supports multiarch variants.
Chandler Carruth8677d922013-10-29 08:53:03 +00003756 if (addLibStdCXXIncludePaths(LibDir.str() + "/../include",
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003757 "/c++/" + Version.Text, TripleStr,
3758 GCCMultiarchTriple, TargetMultiarchTriple,
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00003759 Multilib.includeSuffix(), DriverArgs, CC1Args))
Dmitri Gribenko15225ae2013-03-06 17:14:05 +00003760 return;
3761
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003762 // Otherwise, fall back on a bunch of options which don't use multiarch
3763 // layouts for simplicity.
Chandler Carruth5a3d8982014-01-20 09:42:24 +00003764 const std::string LibStdCXXIncludePathCandidates[] = {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003765 // Gentoo is weird and places its headers inside the GCC install,
3766 // so if the first attempt to find the headers fails, try these patterns.
3767 InstallDir.str() + "/include/g++-v" + Version.MajorStr + "." +
3768 Version.MinorStr,
3769 InstallDir.str() + "/include/g++-v" + Version.MajorStr,
3770 // Android standalone toolchain has C++ headers in yet another place.
3771 LibDir.str() + "/../" + TripleStr.str() + "/include/c++/" + Version.Text,
3772 // Freescale SDK C++ headers are directly in <sysroot>/usr/include/c++,
3773 // without a subdirectory corresponding to the gcc version.
3774 LibDir.str() + "/../include/c++",
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003775 };
3776
Simon Atanasyan6f657c42014-05-08 19:32:46 +00003777 for (const auto &IncludePath : LibStdCXXIncludePathCandidates) {
Chandler Carruthc44f4d42014-08-27 08:41:41 +00003778 if (addLibStdCXXIncludePaths(IncludePath, /*Suffix*/ "", TripleStr,
3779 /*GCCMultiarchTriple*/ "",
3780 /*TargetMultiarchTriple*/ "",
3781 Multilib.includeSuffix(), DriverArgs, CC1Args))
Evgeniy Stepanov763671e2012-09-03 09:05:50 +00003782 break;
Chandler Carruthf5d4df92011-11-06 10:31:01 +00003783 }
Chandler Carrutha796f532011-11-05 20:17:13 +00003784}
3785
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003786bool Linux::isPIEDefault() const { return getSanitizerArgs().requiresPIE(); }
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003787
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003788SanitizerMask Linux::getSupportedSanitizers() const {
3789 const bool IsX86 = getTriple().getArch() == llvm::Triple::x86;
3790 const bool IsX86_64 = getTriple().getArch() == llvm::Triple::x86_64;
3791 const bool IsMIPS64 = getTriple().getArch() == llvm::Triple::mips64 ||
3792 getTriple().getArch() == llvm::Triple::mips64el;
Jay Foade967dd02015-06-25 10:35:19 +00003793 const bool IsPowerPC64 = getTriple().getArch() == llvm::Triple::ppc64 ||
3794 getTriple().getArch() == llvm::Triple::ppc64le;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003795 const bool IsAArch64 = getTriple().getArch() == llvm::Triple::aarch64 ||
3796 getTriple().getArch() == llvm::Triple::aarch64_be;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003797 SanitizerMask Res = ToolChain::getSupportedSanitizers();
3798 Res |= SanitizerKind::Address;
3799 Res |= SanitizerKind::KernelAddress;
3800 Res |= SanitizerKind::Vptr;
Evgeniy Stepanov299238a2015-09-24 17:22:46 +00003801 Res |= SanitizerKind::SafeStack;
Adhemerval Zanella76aee672015-07-30 20:50:39 +00003802 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003803 Res |= SanitizerKind::DataFlow;
Adhemerval Zanellabffb20d2015-10-05 19:16:42 +00003804 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003805 Res |= SanitizerKind::Leak;
Renato Golind45c2df2015-08-05 18:42:41 +00003806 if (IsX86_64 || IsMIPS64 || IsAArch64)
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003807 Res |= SanitizerKind::Thread;
Adhemerval Zanella567b9262015-09-16 15:11:21 +00003808 if (IsX86_64 || IsMIPS64 || IsPowerPC64 || IsAArch64)
Jay Foade967dd02015-06-25 10:35:19 +00003809 Res |= SanitizerKind::Memory;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003810 if (IsX86 || IsX86_64) {
3811 Res |= SanitizerKind::Function;
Alexey Samsonov7f2a0d22015-06-19 21:36:47 +00003812 }
3813 return Res;
3814}
3815
Daniel Dunbarcc912342009-05-02 18:28:39 +00003816/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
3817
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003818DragonFly::DragonFly(const Driver &D, const llvm::Triple &Triple,
3819 const ArgList &Args)
3820 : Generic_ELF(D, Triple, Args) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00003821
3822 // Path mangling to find libexec
Daniel Dunbar88979912010-08-01 22:29:51 +00003823 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer51477bd2011-03-01 22:50:47 +00003824 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbar88979912010-08-01 22:29:51 +00003825 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003826
Daniel Dunbar083edf72009-12-21 18:54:17 +00003827 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003828 getFilePaths().push_back("/usr/lib");
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003829 if (D.getVFS().exists("/usr/lib/gcc47"))
John McCall65b8da02013-04-11 22:55:55 +00003830 getFilePaths().push_back("/usr/lib/gcc47");
3831 else
3832 getFilePaths().push_back("/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00003833}
3834
Rafael Espindola7cf32212013-03-20 03:05:54 +00003835Tool *DragonFly::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003836 return new tools::dragonfly::Assembler(*this);
Rafael Espindola7cf32212013-03-20 03:05:54 +00003837}
3838
3839Tool *DragonFly::buildLinker() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003840 return new tools::dragonfly::Linker(*this);
Daniel Dunbarcc912342009-05-02 18:28:39 +00003841}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003842
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003843/// Stub for CUDA toolchain. At the moment we don't have assembler or
3844/// linker and need toolchain mainly to propagate device-side options
3845/// to CC1.
3846
3847CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
3848 const ArgList &Args)
3849 : Linux(D, Triple, Args) {}
3850
3851void
3852CudaToolChain::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
3853 llvm::opt::ArgStringList &CC1Args) const {
3854 Linux::addClangTargetOptions(DriverArgs, CC1Args);
3855 CC1Args.push_back("-fcuda-is-device");
3856}
3857
3858llvm::opt::DerivedArgList *
3859CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
3860 const char *BoundArch) const {
3861 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
3862 const OptTable &Opts = getDriver().getOpts();
3863
3864 for (Arg *A : Args) {
3865 if (A->getOption().matches(options::OPT_Xarch__)) {
3866 // Skip this argument unless the architecture matches BoundArch
3867 if (A->getValue(0) != StringRef(BoundArch))
3868 continue;
3869
3870 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(1));
3871 unsigned Prev = Index;
3872 std::unique_ptr<Arg> XarchArg(Opts.ParseOneArg(Args, Index));
3873
3874 // If the argument parsing failed or more than one argument was
3875 // consumed, the -Xarch_ argument's parameter tried to consume
3876 // extra arguments. Emit an error and ignore.
3877 //
3878 // We also want to disallow any options which would alter the
3879 // driver behavior; that isn't going to work in our model. We
3880 // use isDriverOption() as an approximation, although things
3881 // like -O4 are going to slip through.
3882 if (!XarchArg || Index > Prev + 1) {
3883 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
3884 << A->getAsString(Args);
3885 continue;
3886 } else if (XarchArg->getOption().hasFlag(options::DriverOption)) {
3887 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
3888 << A->getAsString(Args);
3889 continue;
3890 }
3891 XarchArg->setBaseArg(A);
3892 A = XarchArg.release();
3893 DAL->AddSynthesizedArg(A);
3894 }
3895 DAL->append(A);
3896 }
3897
3898 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), BoundArch);
3899 return DAL;
3900}
3901
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003902/// XCore tool chain
Douglas Katzman54366072015-07-27 16:53:08 +00003903XCoreToolChain::XCoreToolChain(const Driver &D, const llvm::Triple &Triple,
3904 const ArgList &Args)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003905 : ToolChain(D, Triple, Args) {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003906 // ProgramPaths are found via 'PATH' environment variable.
3907}
3908
Douglas Katzman54366072015-07-27 16:53:08 +00003909Tool *XCoreToolChain::buildAssembler() const {
Douglas Katzman95354292015-06-23 20:42:09 +00003910 return new tools::XCore::Assembler(*this);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003911}
3912
Douglas Katzman54366072015-07-27 16:53:08 +00003913Tool *XCoreToolChain::buildLinker() const {
3914 return new tools::XCore::Linker(*this);
3915}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003916
Douglas Katzman54366072015-07-27 16:53:08 +00003917bool XCoreToolChain::isPICDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003918
Douglas Katzman54366072015-07-27 16:53:08 +00003919bool XCoreToolChain::isPIEDefault() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003920
Douglas Katzman54366072015-07-27 16:53:08 +00003921bool XCoreToolChain::isPICDefaultForced() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003922
Douglas Katzman54366072015-07-27 16:53:08 +00003923bool XCoreToolChain::SupportsProfiling() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003924
Douglas Katzman54366072015-07-27 16:53:08 +00003925bool XCoreToolChain::hasBlocksRuntime() const { return false; }
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003926
Douglas Katzman54366072015-07-27 16:53:08 +00003927void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3928 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003929 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
3930 DriverArgs.hasArg(options::OPT_nostdlibinc))
3931 return;
3932 if (const char *cl_include_dir = getenv("XCC_C_INCLUDE_PATH")) {
3933 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003934 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003935 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3936 ArrayRef<StringRef> DirVec(Dirs);
3937 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3938 }
3939}
3940
Douglas Katzman54366072015-07-27 16:53:08 +00003941void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
3942 ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003943 CC1Args.push_back("-nostdsysteminc");
3944}
3945
Douglas Katzman54366072015-07-27 16:53:08 +00003946void XCoreToolChain::AddClangCXXStdlibIncludeArgs(
3947 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003948 if (DriverArgs.hasArg(options::OPT_nostdinc) ||
Robert Lyttonf9710b32014-08-01 13:11:46 +00003949 DriverArgs.hasArg(options::OPT_nostdlibinc) ||
3950 DriverArgs.hasArg(options::OPT_nostdincxx))
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003951 return;
3952 if (const char *cl_include_dir = getenv("XCC_CPLUS_INCLUDE_PATH")) {
3953 SmallVector<StringRef, 4> Dirs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003954 const char EnvPathSeparatorStr[] = {llvm::sys::EnvPathSeparator, '\0'};
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003955 StringRef(cl_include_dir).split(Dirs, StringRef(EnvPathSeparatorStr));
3956 ArrayRef<StringRef> DirVec(Dirs);
3957 addSystemIncludes(DriverArgs, CC1Args, DirVec);
3958 }
3959}
3960
Douglas Katzman54366072015-07-27 16:53:08 +00003961void XCoreToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
3962 ArgStringList &CmdArgs) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00003963 // We don't output any lib args. This is handled by xcc.
3964}
Douglas Katzman84a75642015-06-19 14:55:19 +00003965
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003966MyriadToolChain::MyriadToolChain(const Driver &D, const llvm::Triple &Triple,
3967 const ArgList &Args)
3968 : Generic_GCC(D, Triple, Args) {
3969 // If a target of 'sparc-myriad-elf' is specified to clang, it wants to use
3970 // 'sparc-myriad--elf' (note the unknown OS) as the canonical triple.
3971 // This won't work to find gcc. Instead we give the installation detector an
3972 // extra triple, which is preferable to further hacks of the logic that at
3973 // present is based solely on getArch(). In particular, it would be wrong to
3974 // choose the myriad installation when targeting a non-myriad sparc install.
3975 switch (Triple.getArch()) {
3976 default:
3977 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName() << "myriad";
3978 case llvm::Triple::sparc:
3979 case llvm::Triple::sparcel:
3980 case llvm::Triple::shave:
Benjamin Kramerd45b2052015-10-07 15:48:01 +00003981 GCCInstallation.init(Triple, Args, {"sparc-myriad-elf"});
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003982 }
3983}
3984
3985MyriadToolChain::~MyriadToolChain() {}
3986
Douglas Katzmanb1278f32015-09-17 21:20:16 +00003987void MyriadToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
3988 ArgStringList &CC1Args) const {
3989 if (!DriverArgs.hasArg(options::OPT_nostdinc))
3990 addSystemInclude(DriverArgs, CC1Args, getDriver().SysRoot + "/include");
3991}
3992
Douglas Katzmand6e597c2015-09-17 19:56:40 +00003993// MyriadToolChain handles several triples:
3994// {shave,sparc{,el}}-myriad-{rtems,unknown}-elf
3995Tool *MyriadToolChain::SelectTool(const JobAction &JA) const {
3996 // The inherited method works fine if not targeting the SHAVE.
3997 if (!isShaveCompilation(getTriple()))
3998 return ToolChain::SelectTool(JA);
Douglas Katzman84a75642015-06-19 14:55:19 +00003999 switch (JA.getKind()) {
4000 case Action::CompileJobClass:
4001 if (!Compiler)
Douglas Katzman95354292015-06-23 20:42:09 +00004002 Compiler.reset(new tools::SHAVE::Compiler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004003 return Compiler.get();
4004 case Action::AssembleJobClass:
4005 if (!Assembler)
Douglas Katzman95354292015-06-23 20:42:09 +00004006 Assembler.reset(new tools::SHAVE::Assembler(*this));
Douglas Katzman84a75642015-06-19 14:55:19 +00004007 return Assembler.get();
4008 default:
4009 return ToolChain::getTool(JA.getKind());
4010 }
4011}
4012
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004013void MyriadToolChain::getCompilerSupportDir(std::string &Dir) const {
4014 // This directory contains crt{i,n,begin,end}.o as well as libgcc.
4015 // These files are tied to a particular version of gcc.
4016 SmallString<128> Result(GCCInstallation.getInstallPath());
4017 // There are actually 4 choices: {le,be} x {fpu,nofpu}
4018 // but as this toolchain is for LEON sparc, it can assume FPU.
4019 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4020 llvm::sys::path::append(Result, "le");
4021 Dir.assign(Result.str());
4022}
4023void MyriadToolChain::getBuiltinLibDir(std::string &Dir) const {
4024 // The contents of LibDir are independent of the version of gcc.
4025 // This contains libc, libg (a superset of libc), libm, libstdc++, libssp.
4026 SmallString<128> Result(GCCInstallation.getParentLibPath());
4027 if (this->getTriple().getArch() == llvm::Triple::sparcel)
4028 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib/le");
4029 else
4030 llvm::sys::path::append(Result, "../sparc-myriad-elf/lib");
4031 Dir.assign(Result.str());
Douglas Katzman84a75642015-06-19 14:55:19 +00004032}
4033
Douglas Katzmand6e597c2015-09-17 19:56:40 +00004034Tool *MyriadToolChain::buildLinker() const {
4035 return new tools::Myriad::Linker(*this);
Douglas Katzman84a75642015-06-19 14:55:19 +00004036}
Dan Gohmanc2853072015-09-03 22:51:53 +00004037
4038bool WebAssembly::IsMathErrnoDefault() const { return false; }
4039
4040bool WebAssembly::IsObjCNonFragileABIDefault() const { return true; }
4041
4042bool WebAssembly::UseObjCMixedDispatch() const { return true; }
4043
4044bool WebAssembly::isPICDefault() const { return false; }
4045
4046bool WebAssembly::isPIEDefault() const { return false; }
4047
4048bool WebAssembly::isPICDefaultForced() const { return false; }
4049
4050bool WebAssembly::IsIntegratedAssemblerDefault() const { return true; }
4051
4052// TODO: Support Objective C stuff.
4053bool WebAssembly::SupportsObjCGC() const { return false; }
4054
4055bool WebAssembly::hasBlocksRuntime() const { return false; }
4056
4057// TODO: Support profiling.
4058bool WebAssembly::SupportsProfiling() const { return false; }
4059
4060void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
4061 ArgStringList &CC1Args) const {
4062 if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
4063 options::OPT_fno_use_init_array, true))
4064 CC1Args.push_back("-fuse-init-array");
4065}