blob: cc1adb1ea8317d2b706358e322f8441d621c9c6f [file] [log] [blame]
Nick Lewycky3fdcc6f2010-12-31 17:31:54 +00001//===--- ToolChains.cpp - ToolChain Implementations -----------------------===//
Daniel Dunbar39176082009-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"
11
Daniel Dunbarf3cad362009-03-25 04:13:45 +000012#include "clang/Driver/Arg.h"
13#include "clang/Driver/ArgList.h"
Daniel Dunbar0f602de2010-05-20 21:48:38 +000014#include "clang/Driver/Compilation.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000015#include "clang/Driver/Driver.h"
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +000016#include "clang/Driver/DriverDiagnostic.h"
John McCall9f084a32011-07-06 00:26:06 +000017#include "clang/Driver/ObjCRuntime.h"
Daniel Dunbar27e738d2009-11-19 00:15:11 +000018#include "clang/Driver/OptTable.h"
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +000019#include "clang/Driver/Option.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000020#include "clang/Driver/Options.h"
Douglas Gregor34916db2010-09-03 17:16:03 +000021#include "clang/Basic/Version.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000022
Daniel Dunbar00577ad2010-08-23 22:35:37 +000023#include "llvm/ADT/SmallString.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000024#include "llvm/ADT/StringExtras.h"
Bob Wilsona59956b2011-10-07 00:37:57 +000025#include "llvm/ADT/StringSwitch.h"
John McCallf85e1932011-06-15 23:02:42 +000026#include "llvm/ADT/STLExtras.h"
Daniel Dunbar84ec96c2009-09-09 22:33:15 +000027#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000028#include "llvm/Support/FileSystem.h"
Rafael Espindolac1da9812010-11-07 20:14:31 +000029#include "llvm/Support/MemoryBuffer.h"
Daniel Dunbarec069ed2009-03-25 06:58:31 +000030#include "llvm/Support/raw_ostream.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000031#include "llvm/Support/Path.h"
Michael J. Spencer3a321e22010-12-09 17:36:38 +000032#include "llvm/Support/system_error.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000033
Daniel Dunbarf36a06a2009-04-10 21:00:07 +000034#include <cstdlib> // ::getenv
35
Dylan Noblesmithcc8a9452012-02-14 15:54:49 +000036#include "clang/Config/config.h" // for GCC_INSTALL_PREFIX
Dylan Noblesmith89bb6142011-06-23 13:50:47 +000037
Daniel Dunbar39176082009-03-20 00:20:03 +000038using namespace clang::driver;
39using namespace clang::driver::toolchains;
Chris Lattner5f9e2722011-07-23 10:55:15 +000040using namespace clang;
Daniel Dunbar39176082009-03-20 00:20:03 +000041
Daniel Dunbarf3955282009-09-04 18:34:51 +000042/// Darwin - Darwin tool chain for i386 and x86_64.
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +000043
Chandler Carruth1d16f0f2012-01-31 02:21:20 +000044Darwin::Darwin(const Driver &D, const llvm::Triple& Triple)
45 : ToolChain(D, Triple), TargetInitialized(false),
Bob Wilson163b1512011-10-07 17:54:41 +000046 ARCRuntimeForSimulator(ARCSimulator_None),
47 LibCXXForSimulator(LibCXXSimulator_None)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +000048{
Bob Wilson10853772012-01-31 21:30:03 +000049 // Compute the initial Darwin version from the triple
50 unsigned Major, Minor, Micro;
Bob Wilson4c5ffb32012-01-31 22:43:59 +000051 if (!Triple.getMacOSXVersion(Major, Minor, Micro))
52 getDriver().Diag(diag::err_drv_invalid_darwin_version) <<
53 Triple.getOSName();
54 llvm::raw_string_ostream(MacosxVersionMin)
55 << Major << '.' << Minor << '.' << Micro;
56
Bob Wilson10853772012-01-31 21:30:03 +000057 // FIXME: DarwinVersion is only used to find GCC's libexec directory.
58 // It should be removed when we stop supporting that.
59 DarwinVersion[0] = Minor + 4;
60 DarwinVersion[1] = Micro;
61 DarwinVersion[2] = 0;
Daniel Dunbar1d4612b2009-09-18 08:15:13 +000062}
63
Daniel Dunbar41800112010-08-02 05:43:56 +000064types::ID Darwin::LookupTypeForExtension(const char *Ext) const {
65 types::ID Ty = types::lookupTypeForExtension(Ext);
66
67 // Darwin always preprocesses assembly files (unless -x is used explicitly).
68 if (Ty == types::TY_PP_Asm)
69 return types::TY_Asm;
70
71 return Ty;
72}
73
Daniel Dunbarb993f5d2010-09-17 00:24:52 +000074bool Darwin::HasNativeLLVMSupport() const {
75 return true;
76}
77
John McCall9f084a32011-07-06 00:26:06 +000078bool Darwin::hasARCRuntime() const {
John McCallf85e1932011-06-15 23:02:42 +000079 // FIXME: Remove this once there is a proper way to detect an ARC runtime
80 // for the simulator.
81 switch (ARCRuntimeForSimulator) {
82 case ARCSimulator_None:
83 break;
84 case ARCSimulator_HasARCRuntime:
85 return true;
86 case ARCSimulator_NoARCRuntime:
87 return false;
88 }
89
90 if (isTargetIPhoneOS())
91 return !isIPhoneOSVersionLT(5);
92 else
93 return !isMacosxVersionLT(10, 7);
94}
95
Ted Kremenekebcb57a2012-03-06 20:05:56 +000096bool Darwin::hasSubscriptingRuntime() const {
97 return !isTargetIPhoneOS() && !isMacosxVersionLT(10, 8);
98}
99
John McCall9f084a32011-07-06 00:26:06 +0000100/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
101void Darwin::configureObjCRuntime(ObjCRuntime &runtime) const {
102 if (runtime.getKind() != ObjCRuntime::NeXT)
103 return ToolChain::configureObjCRuntime(runtime);
104
105 runtime.HasARC = runtime.HasWeak = hasARCRuntime();
Ted Kremenekebcb57a2012-03-06 20:05:56 +0000106 runtime.HasSubscripting = hasSubscriptingRuntime();
John McCall256a76e2011-07-06 01:22:26 +0000107
108 // So far, objc_terminate is only available in iOS 5.
109 // FIXME: do the simulator logic properly.
110 if (!ARCRuntimeForSimulator && isTargetIPhoneOS())
111 runtime.HasTerminate = !isIPhoneOSVersionLT(5);
112 else
113 runtime.HasTerminate = false;
John McCall9f084a32011-07-06 00:26:06 +0000114}
115
John McCall13db5cf2011-09-09 20:41:01 +0000116/// Darwin provides a blocks runtime starting in MacOS X 10.6 and iOS 3.2.
117bool Darwin::hasBlocksRuntime() const {
118 if (isTargetIPhoneOS())
119 return !isIPhoneOSVersionLT(3, 2);
120 else
121 return !isMacosxVersionLT(10, 6);
122}
123
Chris Lattner5f9e2722011-07-23 10:55:15 +0000124static const char *GetArmArchForMArch(StringRef Value) {
Bob Wilsona59956b2011-10-07 00:37:57 +0000125 return llvm::StringSwitch<const char*>(Value)
126 .Case("armv6k", "armv6")
127 .Case("armv5tej", "armv5")
128 .Case("xscale", "xscale")
129 .Case("armv4t", "armv4t")
130 .Case("armv7", "armv7")
131 .Cases("armv7a", "armv7-a", "armv7")
132 .Cases("armv7r", "armv7-r", "armv7")
133 .Cases("armv7m", "armv7-m", "armv7")
134 .Default(0);
Daniel Dunbareeff4062010-01-22 02:04:58 +0000135}
136
Chris Lattner5f9e2722011-07-23 10:55:15 +0000137static const char *GetArmArchForMCpu(StringRef Value) {
Bob Wilsona59956b2011-10-07 00:37:57 +0000138 return llvm::StringSwitch<const char *>(Value)
139 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "arm926ej-s","armv5")
140 .Cases("arm10e", "arm10tdmi", "armv5")
141 .Cases("arm1020t", "arm1020e", "arm1022e", "arm1026ej-s", "armv5")
142 .Case("xscale", "xscale")
143 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s",
144 "arm1176jzf-s", "cortex-m0", "armv6")
145 .Cases("cortex-a8", "cortex-r4", "cortex-m3", "cortex-a9", "armv7")
146 .Default(0);
Daniel Dunbareeff4062010-01-22 02:04:58 +0000147}
148
Chris Lattner5f9e2722011-07-23 10:55:15 +0000149StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
Daniel Dunbareeff4062010-01-22 02:04:58 +0000150 switch (getTriple().getArch()) {
151 default:
152 return getArchName();
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000153
Douglas Gregorf0594d82011-03-06 19:11:49 +0000154 case llvm::Triple::thumb:
Daniel Dunbareeff4062010-01-22 02:04:58 +0000155 case llvm::Triple::arm: {
156 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
157 if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
158 return Arch;
159
160 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
161 if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
162 return Arch;
163
164 return "arm";
165 }
166 }
167}
168
Daniel Dunbarf3955282009-09-04 18:34:51 +0000169Darwin::~Darwin() {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000170 // Free tool implementations.
171 for (llvm::DenseMap<unsigned, Tool*>::iterator
172 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
173 delete it->second;
174}
175
Chad Rosier61ab80a2011-09-20 20:44:06 +0000176std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args,
177 types::ID InputType) const {
178 llvm::Triple Triple(ComputeLLVMTriple(Args, InputType));
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000179
180 // If the target isn't initialized (e.g., an unknown Darwin platform, return
181 // the default triple).
182 if (!isTargetInitialized())
183 return Triple.getTriple();
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000184
Dylan Noblesmithf7ccbad2012-02-05 02:13:05 +0000185 SmallString<16> Str;
Benjamin Kramer09c9a562012-03-10 20:55:36 +0000186 Str += isTargetIPhoneOS() ? "ios" : "macosx";
187 Str += getTargetVersion().getAsString();
188 Triple.setOSName(Str);
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000189
190 return Triple.getTriple();
191}
192
David Blaikie99ba9e32011-12-20 02:48:34 +0000193void Generic_ELF::anchor() {}
194
Daniel Dunbarac0659a2011-03-18 20:14:00 +0000195Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
196 const ActionList &Inputs) const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000197 Action::ActionClass Key;
Daniel Dunbar5ce872f2011-03-18 20:14:03 +0000198
199 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) {
200 // Fallback to llvm-gcc for i386 kext compiles, we don't support that ABI.
201 if (Inputs.size() == 1 &&
202 types::isCXX(Inputs[0]->getType()) &&
Bob Wilson905c45f2011-10-14 05:03:44 +0000203 getTriple().isOSDarwin() &&
Daniel Dunbar5ce872f2011-03-18 20:14:03 +0000204 getTriple().getArch() == llvm::Triple::x86 &&
Bob Wilsona544aee2011-08-13 23:48:55 +0000205 (C.getArgs().getLastArg(options::OPT_fapple_kext) ||
206 C.getArgs().getLastArg(options::OPT_mkernel)))
Daniel Dunbar5ce872f2011-03-18 20:14:03 +0000207 Key = JA.getKind();
208 else
209 Key = Action::AnalyzeJobClass;
210 } else
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000211 Key = JA.getKind();
212
Daniel Dunbar0f602de2010-05-20 21:48:38 +0000213 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
214 options::OPT_no_integrated_as,
Bob Wilson1a1764b2011-10-30 00:20:28 +0000215 IsIntegratedAssemblerDefault());
Daniel Dunbar0f602de2010-05-20 21:48:38 +0000216
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000217 Tool *&T = Tools[Key];
218 if (!T) {
219 switch (Key) {
220 case Action::InputClass:
221 case Action::BindArchClass:
David Blaikieb219cfc2011-09-23 05:06:16 +0000222 llvm_unreachable("Invalid tool kind.");
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000223 case Action::PreprocessJobClass:
Daniel Dunbar9120f172009-03-29 22:27:40 +0000224 T = new tools::darwin::Preprocess(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000225 case Action::AnalyzeJobClass:
Ted Kremenek30660a82012-03-06 20:06:33 +0000226 case Action::MigrateJobClass:
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000227 T = new tools::Clang(*this); break;
Daniel Dunbar9120f172009-03-29 22:27:40 +0000228 case Action::PrecompileJobClass:
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000229 case Action::CompileJobClass:
Daniel Dunbar9120f172009-03-29 22:27:40 +0000230 T = new tools::darwin::Compile(*this); break;
Daniel Dunbar0f602de2010-05-20 21:48:38 +0000231 case Action::AssembleJobClass: {
232 if (UseIntegratedAs)
233 T = new tools::ClangAs(*this);
234 else
235 T = new tools::darwin::Assemble(*this);
236 break;
237 }
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000238 case Action::LinkJobClass:
Daniel Dunbar8f289622009-09-04 17:39:02 +0000239 T = new tools::darwin::Link(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000240 case Action::LipoJobClass:
241 T = new tools::darwin::Lipo(*this); break;
Daniel Dunbar6e0f2542010-06-04 18:28:36 +0000242 case Action::DsymutilJobClass:
243 T = new tools::darwin::Dsymutil(*this); break;
Eric Christopherf8571862011-08-23 17:56:55 +0000244 case Action::VerifyJobClass:
245 T = new tools::darwin::VerifyDebug(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000246 }
247 }
248
249 return *T;
250}
251
Daniel Dunbar6cd41542009-09-18 08:15:03 +0000252
Chandler Carruth1d16f0f2012-01-31 02:21:20 +0000253DarwinClang::DarwinClang(const Driver &D, const llvm::Triple& Triple)
254 : Darwin(D, Triple)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000255{
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000256 getProgramPaths().push_back(getDriver().getInstalledDir());
257 if (getDriver().getInstalledDir() != getDriver().Dir)
258 getProgramPaths().push_back(getDriver().Dir);
259
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000260 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
Daniel Dunbaredf29b02010-08-01 22:29:51 +0000261 getProgramPaths().push_back(getDriver().getInstalledDir());
262 if (getDriver().getInstalledDir() != getDriver().Dir)
263 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000264
265 // For fallback, we need to know how to find the GCC cc1 executables, so we
Daniel Dunbar47023092011-03-18 19:25:15 +0000266 // also add the GCC libexec paths. This is legacy code that can be removed
267 // once fallback is no longer useful.
Bob Wilson8aa76ea2011-09-20 22:00:38 +0000268 AddGCCLibexecPath(DarwinVersion[0]);
269 AddGCCLibexecPath(DarwinVersion[0] - 2);
270 AddGCCLibexecPath(DarwinVersion[0] - 1);
271 AddGCCLibexecPath(DarwinVersion[0] + 1);
272 AddGCCLibexecPath(DarwinVersion[0] + 2);
273}
274
275void DarwinClang::AddGCCLibexecPath(unsigned darwinVersion) {
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000276 std::string ToolChainDir = "i686-apple-darwin";
Bob Wilson8aa76ea2011-09-20 22:00:38 +0000277 ToolChainDir += llvm::utostr(darwinVersion);
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000278 ToolChainDir += "/4.2.1";
279
280 std::string Path = getDriver().Dir;
Bob Wilson8aa76ea2011-09-20 22:00:38 +0000281 Path += "/../llvm-gcc-4.2/libexec/gcc/";
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000282 Path += ToolChainDir;
283 getProgramPaths().push_back(Path);
284
Bob Wilson8aa76ea2011-09-20 22:00:38 +0000285 Path = "/usr/llvm-gcc-4.2/libexec/gcc/";
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000286 Path += ToolChainDir;
287 getProgramPaths().push_back(Path);
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000288}
289
John McCallf85e1932011-06-15 23:02:42 +0000290void DarwinClang::AddLinkARCArgs(const ArgList &Args,
291 ArgStringList &CmdArgs) const {
Eric Christopherf8571862011-08-23 17:56:55 +0000292
293 CmdArgs.push_back("-force_load");
John McCallf85e1932011-06-15 23:02:42 +0000294 llvm::sys::Path P(getDriver().ClangExecutable);
295 P.eraseComponent(); // 'clang'
296 P.eraseComponent(); // 'bin'
297 P.appendComponent("lib");
298 P.appendComponent("arc");
299 P.appendComponent("libarclite_");
300 std::string s = P.str();
301 // Mash in the platform.
Argyrios Kyrtzidisc19981c2011-10-18 17:40:15 +0000302 if (isTargetIOSSimulator())
303 s += "iphonesimulator";
304 else if (isTargetIPhoneOS())
John McCallf85e1932011-06-15 23:02:42 +0000305 s += "iphoneos";
Argyrios Kyrtzidisc19981c2011-10-18 17:40:15 +0000306 // FIXME: Remove this once we depend fully on -mios-simulator-version-min.
John McCallf85e1932011-06-15 23:02:42 +0000307 else if (ARCRuntimeForSimulator != ARCSimulator_None)
308 s += "iphonesimulator";
309 else
310 s += "macosx";
311 s += ".a";
312
313 CmdArgs.push_back(Args.MakeArgString(s));
314}
315
Eric Christopher3404fe72011-06-22 17:41:40 +0000316void DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
Eric Christopherf8571862011-08-23 17:56:55 +0000317 ArgStringList &CmdArgs,
Eric Christopher3404fe72011-06-22 17:41:40 +0000318 const char *DarwinStaticLib) const {
319 llvm::sys::Path P(getDriver().ResourceDir);
320 P.appendComponent("lib");
321 P.appendComponent("darwin");
322 P.appendComponent(DarwinStaticLib);
Eric Christopherf8571862011-08-23 17:56:55 +0000323
Eric Christopher3404fe72011-06-22 17:41:40 +0000324 // For now, allow missing resource libraries to support developers who may
325 // not have compiler-rt checked out or integrated into their build.
326 bool Exists;
327 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
328 CmdArgs.push_back(Args.MakeArgString(P.str()));
329}
330
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000331void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
332 ArgStringList &CmdArgs) const {
Daniel Dunbarc24767c2011-12-07 23:03:15 +0000333 // Darwin only supports the compiler-rt based runtime libraries.
334 switch (GetRuntimeLibType(Args)) {
335 case ToolChain::RLT_CompilerRT:
336 break;
337 default:
338 getDriver().Diag(diag::err_drv_unsupported_rtlib_for_platform)
339 << Args.getLastArg(options::OPT_rtlib_EQ)->getValue(Args) << "darwin";
340 return;
341 }
342
Daniel Dunbareec99102010-01-22 03:38:14 +0000343 // Darwin doesn't support real static executables, don't link any runtime
344 // libraries with -static.
345 if (Args.hasArg(options::OPT_static))
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000346 return;
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000347
348 // Reject -static-libgcc for now, we can deal with this when and if someone
349 // cares. This is useful in situations where someone wants to statically link
350 // something like libstdc++, and needs its runtime support routines.
351 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000352 getDriver().Diag(diag::err_drv_unsupported_opt)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000353 << A->getAsString(Args);
354 return;
355 }
356
Daniel Dunbarf4714872011-11-17 00:36:57 +0000357 // If we are building profile support, link that library in.
358 if (Args.hasArg(options::OPT_fprofile_arcs) ||
359 Args.hasArg(options::OPT_fprofile_generate) ||
360 Args.hasArg(options::OPT_fcreate_profile) ||
361 Args.hasArg(options::OPT_coverage)) {
362 // Select the appropriate runtime library for the target.
363 if (isTargetIPhoneOS()) {
364 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_ios.a");
365 } else {
366 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.profile_osx.a");
367 }
368 }
369
Kostya Serebryany7b5f1012011-12-06 19:18:44 +0000370 // Add ASAN runtime library, if required. Dynamic libraries and bundles
371 // should not be linked with the runtime library.
Daniel Dunbar94b54ea2011-12-01 23:40:18 +0000372 if (Args.hasFlag(options::OPT_faddress_sanitizer,
373 options::OPT_fno_address_sanitizer, false)) {
Kostya Serebryany7b5f1012011-12-06 19:18:44 +0000374 if (Args.hasArg(options::OPT_dynamiclib) ||
375 Args.hasArg(options::OPT_bundle)) return;
Daniel Dunbar94b54ea2011-12-01 23:40:18 +0000376 if (isTargetIPhoneOS()) {
377 getDriver().Diag(diag::err_drv_clang_unsupported_per_platform)
378 << "-faddress-sanitizer";
379 } else {
380 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.asan_osx.a");
381
382 // The ASAN runtime library requires C++ and CoreFoundation.
383 AddCXXStdlibLibArgs(Args, CmdArgs);
384 CmdArgs.push_back("-framework");
385 CmdArgs.push_back("CoreFoundation");
386 }
387 }
388
Daniel Dunbareec99102010-01-22 03:38:14 +0000389 // Otherwise link libSystem, then the dynamic runtime library, and finally any
390 // target specific static runtime library.
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000391 CmdArgs.push_back("-lSystem");
Daniel Dunbareec99102010-01-22 03:38:14 +0000392
393 // Select the dynamic runtime library and the target specific static library.
Daniel Dunbar251ca6c2010-01-27 00:56:37 +0000394 if (isTargetIPhoneOS()) {
Daniel Dunbar87e945f2011-04-30 04:25:16 +0000395 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
396 // it never went into the SDK.
Bob Wilson163b1512011-10-07 17:54:41 +0000397 // Linking against libgcc_s.1 isn't needed for iOS 5.0+
398 if (isIPhoneOSVersionLT(5, 0) && !isTargetIOSSimulator())
399 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbareec99102010-01-22 03:38:14 +0000400
Daniel Dunbar3cceec52011-04-18 23:48:36 +0000401 // We currently always need a static runtime library for iOS.
Eric Christopher3404fe72011-06-22 17:41:40 +0000402 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbareec99102010-01-22 03:38:14 +0000403 } else {
Daniel Dunbareec99102010-01-22 03:38:14 +0000404 // The dynamic runtime library was merged with libSystem for 10.6 and
405 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbarce3fdf22010-01-27 00:57:03 +0000406 if (isMacosxVersionLT(10, 5))
Daniel Dunbareec99102010-01-22 03:38:14 +0000407 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +0000408 else if (isMacosxVersionLT(10, 6))
Daniel Dunbareec99102010-01-22 03:38:14 +0000409 CmdArgs.push_back("-lgcc_s.10.5");
410
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000411 // For OS X, we thought we would only need a static runtime library when
Chris Lattnerfc8f0e12011-04-15 05:22:18 +0000412 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000413 // omitted from 10.4.dylib.
414 //
415 // Unfortunately, that turned out to not be true, because Darwin system
416 // headers can still use eprintf on i386, and it is not exported from
417 // libSystem. Therefore, we still must provide a runtime library just for
418 // the tiny tiny handful of projects that *might* use that symbol.
419 if (isMacosxVersionLT(10, 5)) {
Eric Christopher3404fe72011-06-22 17:41:40 +0000420 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000421 } else {
422 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopher3404fe72011-06-22 17:41:40 +0000423 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
424 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000425 }
Daniel Dunbareec99102010-01-22 03:38:14 +0000426 }
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000427}
428
Argyrios Kyrtzidisdceb11f2011-10-18 00:22:49 +0000429static inline StringRef SimulatorVersionDefineName() {
430 return "__IPHONE_OS_VERSION_MIN_REQUIRED";
431}
432
433/// \brief Parse the simulator version define:
434/// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9])
435// and return the grouped values as integers, e.g:
436// __IPHONE_OS_VERSION_MIN_REQUIRED=40201
437// will return Major=4, Minor=2, Micro=1.
438static bool GetVersionFromSimulatorDefine(StringRef define,
439 unsigned &Major, unsigned &Minor,
440 unsigned &Micro) {
441 assert(define.startswith(SimulatorVersionDefineName()));
442 StringRef name, version;
443 llvm::tie(name, version) = define.split('=');
444 if (version.empty())
445 return false;
446 std::string verstr = version.str();
447 char *end;
448 unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10);
449 if (*end != '\0')
450 return false;
451 Major = num / 10000;
452 num = num % 10000;
453 Minor = num / 100;
454 Micro = num % 100;
455 return true;
456}
457
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000458void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +0000459 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000460
Daniel Dunbar26031372010-01-27 00:56:25 +0000461 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000462 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
463 Arg *iOSSimVersion = Args.getLastArg(
464 options::OPT_mios_simulator_version_min_EQ);
Eli Friedman983d8352012-01-11 02:41:15 +0000465
Bob Wilsonc01dfc12012-01-26 03:37:03 +0000466 // FIXME: HACK! When compiling for the simulator we don't get a
467 // '-miphoneos-version-min' to help us know whether there is an ARC runtime
468 // or not; try to parse a __IPHONE_OS_VERSION_MIN_REQUIRED
469 // define passed in command-line.
470 if (!iOSVersion && !iOSSimVersion) {
471 for (arg_iterator it = Args.filtered_begin(options::OPT_D),
472 ie = Args.filtered_end(); it != ie; ++it) {
473 StringRef define = (*it)->getValue(Args);
474 if (define.startswith(SimulatorVersionDefineName())) {
475 unsigned Major = 0, Minor = 0, Micro = 0;
476 if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) &&
477 Major < 10 && Minor < 100 && Micro < 100) {
478 ARCRuntimeForSimulator = Major < 5 ? ARCSimulator_NoARCRuntime
479 : ARCSimulator_HasARCRuntime;
480 LibCXXForSimulator = Major < 5 ? LibCXXSimulator_NotAvailable
481 : LibCXXSimulator_Available;
482 }
483 break;
484 }
485 }
486 }
487
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000488 if (OSXVersion && (iOSVersion || iOSSimVersion)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000489 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarff8857a2009-04-10 20:11:50 +0000490 << OSXVersion->getAsString(Args)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000491 << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
492 iOSVersion = iOSSimVersion = 0;
493 } else if (iOSVersion && iOSSimVersion) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000494 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000495 << iOSVersion->getAsString(Args)
496 << iOSSimVersion->getAsString(Args);
497 iOSSimVersion = 0;
498 } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
Chad Rosiera4884972011-08-31 20:56:25 +0000499 // If no deployment target was specified on the command line, check for
Daniel Dunbar816bc312010-01-26 01:45:19 +0000500 // environment defines.
Chad Rosiera4884972011-08-31 20:56:25 +0000501 StringRef OSXTarget;
502 StringRef iOSTarget;
503 StringRef iOSSimTarget;
504 if (char *env = ::getenv("MACOSX_DEPLOYMENT_TARGET"))
505 OSXTarget = env;
506 if (char *env = ::getenv("IPHONEOS_DEPLOYMENT_TARGET"))
507 iOSTarget = env;
508 if (char *env = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET"))
509 iOSSimTarget = env;
Daniel Dunbarf36a06a2009-04-10 21:00:07 +0000510
NAKAMURA Takumia789ca92011-10-08 11:31:46 +0000511 // If no '-miphoneos-version-min' specified on the command line and
Chad Rosiera4884972011-08-31 20:56:25 +0000512 // IPHONEOS_DEPLOYMENT_TARGET is not defined, see if we can set the default
Gabor Greif241cbe42012-04-18 10:59:08 +0000513 // based on -isysroot.
Chad Rosiera4884972011-08-31 20:56:25 +0000514 if (iOSTarget.empty()) {
515 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
516 StringRef first, second;
517 StringRef isysroot = A->getValue(Args);
518 llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
519 if (second != "")
520 iOSTarget = second.substr(0,3);
521 }
522 }
Daniel Dunbar816bc312010-01-26 01:45:19 +0000523
Chad Rosier4f8de272011-09-28 00:46:32 +0000524 // If no OSX or iOS target has been specified and we're compiling for armv7,
525 // go ahead as assume we're targeting iOS.
526 if (OSXTarget.empty() && iOSTarget.empty())
527 if (getDarwinArchName(Args) == "armv7")
528 iOSTarget = "0.0";
529
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000530 // Handle conflicting deployment targets
Daniel Dunbar39053672010-02-02 17:31:12 +0000531 //
532 // FIXME: Don't hardcode default here.
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000533
534 // Do not allow conflicts with the iOS simulator target.
Chad Rosiera4884972011-08-31 20:56:25 +0000535 if (!iOSSimTarget.empty() && (!OSXTarget.empty() || !iOSTarget.empty())) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000536 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000537 << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
Chad Rosiera4884972011-08-31 20:56:25 +0000538 << (!OSXTarget.empty() ? "MACOSX_DEPLOYMENT_TARGET" :
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000539 "IPHONEOS_DEPLOYMENT_TARGET");
540 }
541
542 // Allow conflicts among OSX and iOS for historical reasons, but choose the
543 // default platform.
Chad Rosiera4884972011-08-31 20:56:25 +0000544 if (!OSXTarget.empty() && !iOSTarget.empty()) {
Daniel Dunbar39053672010-02-02 17:31:12 +0000545 if (getTriple().getArch() == llvm::Triple::arm ||
546 getTriple().getArch() == llvm::Triple::thumb)
Chad Rosiera4884972011-08-31 20:56:25 +0000547 OSXTarget = "";
Daniel Dunbar39053672010-02-02 17:31:12 +0000548 else
Chad Rosiera4884972011-08-31 20:56:25 +0000549 iOSTarget = "";
Daniel Dunbar39053672010-02-02 17:31:12 +0000550 }
Daniel Dunbar1a3c1d92010-01-29 17:02:25 +0000551
Chad Rosiera4884972011-08-31 20:56:25 +0000552 if (!OSXTarget.empty()) {
Daniel Dunbar30392de2009-09-04 18:35:21 +0000553 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000554 OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
555 Args.append(OSXVersion);
Chad Rosiera4884972011-08-31 20:56:25 +0000556 } else if (!iOSTarget.empty()) {
Daniel Dunbar30392de2009-09-04 18:35:21 +0000557 const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000558 iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
559 Args.append(iOSVersion);
Chad Rosiera4884972011-08-31 20:56:25 +0000560 } else if (!iOSSimTarget.empty()) {
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000561 const Option *O = Opts.getOption(
562 options::OPT_mios_simulator_version_min_EQ);
563 iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
564 Args.append(iOSSimVersion);
Daniel Dunbar816bc312010-01-26 01:45:19 +0000565 } else {
Daniel Dunbar2bb38d02010-07-15 16:18:06 +0000566 // Otherwise, assume we are targeting OS X.
567 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000568 OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
569 Args.append(OSXVersion);
Daniel Dunbar30392de2009-09-04 18:35:21 +0000570 }
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000571 }
Mike Stump1eb44332009-09-09 15:08:12 +0000572
Daniel Dunbar3fd823b2011-04-30 04:20:40 +0000573 // Reject invalid architecture combinations.
574 if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
575 getTriple().getArch() != llvm::Triple::x86_64)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000576 getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
Daniel Dunbar3fd823b2011-04-30 04:20:40 +0000577 << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
578 }
579
Daniel Dunbar26031372010-01-27 00:56:25 +0000580 // Set the tool chain target information.
581 unsigned Major, Minor, Micro;
582 bool HadExtra;
583 if (OSXVersion) {
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000584 assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
Daniel Dunbar26031372010-01-27 00:56:25 +0000585 if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
586 Micro, HadExtra) || HadExtra ||
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000587 Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000588 getDriver().Diag(diag::err_drv_invalid_version_number)
Daniel Dunbar26031372010-01-27 00:56:25 +0000589 << OSXVersion->getAsString(Args);
590 } else {
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000591 const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
592 assert(Version && "Unknown target platform!");
Eli Friedman983d8352012-01-11 02:41:15 +0000593 if (!Driver::GetReleaseVersion(Version->getValue(Args), Major, Minor,
594 Micro, HadExtra) || HadExtra ||
595 Major >= 10 || Minor >= 100 || Micro >= 100)
596 getDriver().Diag(diag::err_drv_invalid_version_number)
597 << Version->getAsString(Args);
Daniel Dunbar26031372010-01-27 00:56:25 +0000598 }
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000599
Daniel Dunbar5f5c37b2011-04-30 04:18:16 +0000600 bool IsIOSSim = bool(iOSSimVersion);
601
602 // In GCC, the simulator historically was treated as being OS X in some
603 // contexts, like determining the link logic, despite generally being called
604 // with an iOS deployment target. For compatibility, we detect the
605 // simulator as iOS + x86, and treat it differently in a few contexts.
606 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
607 getTriple().getArch() == llvm::Triple::x86_64))
608 IsIOSSim = true;
609
610 setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
Daniel Dunbarc0e665e2010-07-19 17:11:33 +0000611}
612
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000613void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000614 ArgStringList &CmdArgs) const {
615 CXXStdlibType Type = GetCXXStdlibType(Args);
616
617 switch (Type) {
618 case ToolChain::CST_Libcxx:
619 CmdArgs.push_back("-lc++");
620 break;
621
622 case ToolChain::CST_Libstdcxx: {
623 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
624 // it was previously found in the gcc lib dir. However, for all the Darwin
625 // platforms we care about it was -lstdc++.6, so we search for that
626 // explicitly if we can't see an obvious -lstdc++ candidate.
627
628 // Check in the sysroot first.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000629 bool Exists;
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000630 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
631 llvm::sys::Path P(A->getValue(Args));
632 P.appendComponent("usr");
633 P.appendComponent("lib");
634 P.appendComponent("libstdc++.dylib");
635
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000636 if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000637 P.eraseComponent();
638 P.appendComponent("libstdc++.6.dylib");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000639 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000640 CmdArgs.push_back(Args.MakeArgString(P.str()));
641 return;
642 }
643 }
644 }
645
646 // Otherwise, look in the root.
Bob Wilson5a5dcdc2011-11-11 07:47:04 +0000647 // FIXME: This should be removed someday when we don't have to care about
648 // 10.6 and earlier, where /usr/lib/libstdc++.dylib does not exist.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000649 if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
650 (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000651 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
652 return;
653 }
654
655 // Otherwise, let the linker search.
656 CmdArgs.push_back("-lstdc++");
657 break;
658 }
659 }
660}
661
Shantonu Sen7433fed2010-09-17 18:39:08 +0000662void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
663 ArgStringList &CmdArgs) const {
664
665 // For Darwin platforms, use the compiler-rt-based support library
666 // instead of the gcc-provided one (which is also incidentally
667 // only present in the gcc lib dir, which makes it hard to find).
668
669 llvm::sys::Path P(getDriver().ResourceDir);
670 P.appendComponent("lib");
671 P.appendComponent("darwin");
672 P.appendComponent("libclang_rt.cc_kext.a");
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000673
Shantonu Sen7433fed2010-09-17 18:39:08 +0000674 // For now, allow missing resource libraries to support developers who may
675 // not have compiler-rt checked out or integrated into their build.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000676 bool Exists;
677 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Shantonu Sen7433fed2010-09-17 18:39:08 +0000678 CmdArgs.push_back(Args.MakeArgString(P.str()));
679}
680
Daniel Dunbarc0e665e2010-07-19 17:11:33 +0000681DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
682 const char *BoundArch) const {
683 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
684 const OptTable &Opts = getDriver().getOpts();
685
686 // FIXME: We really want to get out of the tool chain level argument
687 // translation business, as it makes the driver functionality much
688 // more opaque. For now, we follow gcc closely solely for the
689 // purpose of easily achieving feature parity & testability. Once we
690 // have something that works, we should reevaluate each translation
691 // and try to push it down into tool specific logic.
Daniel Dunbar26031372010-01-27 00:56:25 +0000692
Daniel Dunbar279c1db2010-06-11 22:00:26 +0000693 for (ArgList::const_iterator it = Args.begin(),
694 ie = Args.end(); it != ie; ++it) {
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000695 Arg *A = *it;
696
697 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar2a45fa72011-06-21 00:20:17 +0000698 // Skip this argument unless the architecture matches either the toolchain
699 // triple arch, or the arch being bound.
700 //
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000701 // FIXME: Canonicalize name.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000702 StringRef XarchArch = A->getValue(Args, 0);
Daniel Dunbar2a45fa72011-06-21 00:20:17 +0000703 if (!(XarchArch == getArchName() ||
704 (BoundArch && XarchArch == BoundArch)))
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000705 continue;
706
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000707 Arg *OriginalArg = A;
Daniel Dunbar0e100312010-06-14 21:23:08 +0000708 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1));
709 unsigned Prev = Index;
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000710 Arg *XarchArg = Opts.ParseOneArg(Args, Index);
Mike Stump1eb44332009-09-09 15:08:12 +0000711
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000712 // If the argument parsing failed or more than one argument was
713 // consumed, the -Xarch_ argument's parameter tried to consume
714 // extra arguments. Emit an error and ignore.
715 //
716 // We also want to disallow any options which would alter the
717 // driver behavior; that isn't going to work in our model. We
718 // use isDriverOption() as an approximation, although things
719 // like -O4 are going to slip through.
Daniel Dunbar0e02f6e2011-04-21 17:41:34 +0000720 if (!XarchArg || Index > Prev + 1) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000721 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Daniel Dunbar7e9293b2011-04-21 17:32:21 +0000722 << A->getAsString(Args);
723 continue;
724 } else if (XarchArg->getOption().isDriverOption()) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000725 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000726 << A->getAsString(Args);
727 continue;
728 }
729
Daniel Dunbar478edc22009-03-29 22:29:05 +0000730 XarchArg->setBaseArg(A);
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000731 A = XarchArg;
Daniel Dunbar0e100312010-06-14 21:23:08 +0000732
733 DAL->AddSynthesizedArg(A);
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000734
735 // Linker input arguments require custom handling. The problem is that we
736 // have already constructed the phase actions, so we can not treat them as
737 // "input arguments".
738 if (A->getOption().isLinkerInput()) {
739 // Convert the argument into individual Zlinker_input_args.
740 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
741 DAL->AddSeparateArg(OriginalArg,
742 Opts.getOption(options::OPT_Zlinker_input),
743 A->getValue(Args, i));
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000744
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000745 }
746 continue;
747 }
Mike Stump1eb44332009-09-09 15:08:12 +0000748 }
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000749
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000750 // Sob. These is strictly gcc compatible for the time being. Apple
751 // gcc translates options twice, which means that self-expanding
752 // options add duplicates.
Daniel Dunbar9e1f9822009-11-19 04:14:53 +0000753 switch ((options::ID) A->getOption().getID()) {
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000754 default:
755 DAL->append(A);
756 break;
757
758 case options::OPT_mkernel:
759 case options::OPT_fapple_kext:
760 DAL->append(A);
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000761 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000762 break;
Mike Stump1eb44332009-09-09 15:08:12 +0000763
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000764 case options::OPT_dependency_file:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000765 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
766 A->getValue(Args));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000767 break;
768
769 case options::OPT_gfull:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000770 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
771 DAL->AddFlagArg(A,
772 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000773 break;
774
775 case options::OPT_gused:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000776 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
777 DAL->AddFlagArg(A,
778 Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000779 break;
780
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000781 case options::OPT_shared:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000782 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000783 break;
784
785 case options::OPT_fconstant_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000786 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000787 break;
788
789 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000790 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000791 break;
792
793 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000794 DAL->AddFlagArg(A,
795 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000796 break;
797
798 case options::OPT_Wno_nonportable_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000799 DAL->AddFlagArg(A,
800 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000801 break;
802
803 case options::OPT_fpascal_strings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000804 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000805 break;
806
807 case options::OPT_fno_pascal_strings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000808 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000809 break;
810 }
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000811 }
812
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000813 if (getTriple().getArch() == llvm::Triple::x86 ||
814 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbare4bdae72009-11-19 04:00:53 +0000815 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000816 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000817
818 // Add the arch options based on the particular spelling of -arch, to match
Chad Rosierc97e96a2012-04-27 14:58:16 +0000819 // how the driver driver works.
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000820 if (BoundArch) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000821 StringRef Name = BoundArch;
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000822 const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
823 const Option *MArch = Opts.getOption(options::OPT_march_EQ);
824
825 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
826 // which defines the list of which architectures we accept.
827 if (Name == "ppc")
828 ;
829 else if (Name == "ppc601")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000830 DAL->AddJoinedArg(0, MCpu, "601");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000831 else if (Name == "ppc603")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000832 DAL->AddJoinedArg(0, MCpu, "603");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000833 else if (Name == "ppc604")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000834 DAL->AddJoinedArg(0, MCpu, "604");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000835 else if (Name == "ppc604e")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000836 DAL->AddJoinedArg(0, MCpu, "604e");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000837 else if (Name == "ppc750")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000838 DAL->AddJoinedArg(0, MCpu, "750");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000839 else if (Name == "ppc7400")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000840 DAL->AddJoinedArg(0, MCpu, "7400");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000841 else if (Name == "ppc7450")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000842 DAL->AddJoinedArg(0, MCpu, "7450");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000843 else if (Name == "ppc970")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000844 DAL->AddJoinedArg(0, MCpu, "970");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000845
846 else if (Name == "ppc64")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000847 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000848
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000849 else if (Name == "i386")
850 ;
851 else if (Name == "i486")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000852 DAL->AddJoinedArg(0, MArch, "i486");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000853 else if (Name == "i586")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000854 DAL->AddJoinedArg(0, MArch, "i586");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000855 else if (Name == "i686")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000856 DAL->AddJoinedArg(0, MArch, "i686");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000857 else if (Name == "pentium")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000858 DAL->AddJoinedArg(0, MArch, "pentium");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000859 else if (Name == "pentium2")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000860 DAL->AddJoinedArg(0, MArch, "pentium2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000861 else if (Name == "pentpro")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000862 DAL->AddJoinedArg(0, MArch, "pentiumpro");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000863 else if (Name == "pentIIm3")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000864 DAL->AddJoinedArg(0, MArch, "pentium2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000865
866 else if (Name == "x86_64")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000867 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000868
869 else if (Name == "arm")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000870 DAL->AddJoinedArg(0, MArch, "armv4t");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000871 else if (Name == "armv4t")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000872 DAL->AddJoinedArg(0, MArch, "armv4t");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000873 else if (Name == "armv5")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000874 DAL->AddJoinedArg(0, MArch, "armv5tej");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000875 else if (Name == "xscale")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000876 DAL->AddJoinedArg(0, MArch, "xscale");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000877 else if (Name == "armv6")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000878 DAL->AddJoinedArg(0, MArch, "armv6k");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000879 else if (Name == "armv7")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000880 DAL->AddJoinedArg(0, MArch, "armv7a");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000881
882 else
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +0000883 llvm_unreachable("invalid Darwin arch");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000884 }
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000885
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000886 // Add an explicit version min argument for the deployment target. We do this
887 // after argument translation because -Xarch_ arguments may add a version min
888 // argument.
Chad Rosier8202fb82012-04-27 19:51:11 +0000889 if (BoundArch)
890 AddDeploymentTarget(*DAL);
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000891
Bob Wilson163b1512011-10-07 17:54:41 +0000892 // Validate the C++ standard library choice.
893 CXXStdlibType Type = GetCXXStdlibType(*DAL);
894 if (Type == ToolChain::CST_Libcxx) {
895 switch (LibCXXForSimulator) {
896 case LibCXXSimulator_None:
897 // Handle non-simulator cases.
898 if (isTargetIPhoneOS()) {
899 if (isIPhoneOSVersionLT(5, 0)) {
900 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
901 << "iOS 5.0";
902 }
Bob Wilson163b1512011-10-07 17:54:41 +0000903 }
904 break;
905 case LibCXXSimulator_NotAvailable:
906 getDriver().Diag(clang::diag::err_drv_invalid_libcxx_deployment)
907 << "iOS 5.0";
908 break;
909 case LibCXXSimulator_Available:
910 break;
911 }
912 }
913
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000914 return DAL;
Mike Stump1eb44332009-09-09 15:08:12 +0000915}
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000916
Daniel Dunbarf3955282009-09-04 18:34:51 +0000917bool Darwin::IsUnwindTablesDefault() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000918 // FIXME: Gross; we should probably have some separate target
919 // definition, possibly even reusing the one in clang.
920 return getArchName() == "x86_64";
921}
922
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +0000923bool Darwin::UseDwarfDebugFlags() const {
924 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
925 return S[0] != '\0';
926 return false;
927}
928
Daniel Dunbarb2987d12010-02-10 18:49:11 +0000929bool Darwin::UseSjLjExceptions() const {
930 // Darwin uses SjLj exceptions on ARM.
931 return (getTriple().getArch() == llvm::Triple::arm ||
932 getTriple().getArch() == llvm::Triple::thumb);
933}
934
Daniel Dunbarf3955282009-09-04 18:34:51 +0000935const char *Darwin::GetDefaultRelocationModel() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000936 return "pic";
937}
938
Daniel Dunbarf3955282009-09-04 18:34:51 +0000939const char *Darwin::GetForcedPicModel() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000940 if (getArchName() == "x86_64")
941 return "pic";
942 return 0;
943}
944
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +0000945bool Darwin::SupportsProfiling() const {
946 // Profiling instrumentation is only supported on x86.
947 return getArchName() == "i386" || getArchName() == "x86_64";
948}
949
Daniel Dunbar43a9b322010-04-10 16:20:23 +0000950bool Darwin::SupportsObjCGC() const {
951 // Garbage collection is supported everywhere except on iPhone OS.
952 return !isTargetIPhoneOS();
953}
954
Argyrios Kyrtzidis5840dd92012-02-29 03:43:52 +0000955bool Darwin::SupportsObjCARC() const {
956 return isTargetIPhoneOS() || !isMacosxVersionLT(10, 6);
957}
958
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000959std::string
Chad Rosier61ab80a2011-09-20 20:44:06 +0000960Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args,
961 types::ID InputType) const {
962 return ComputeLLVMTriple(Args, InputType);
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000963}
964
Daniel Dunbar39176082009-03-20 00:20:03 +0000965/// Generic_GCC - A tool chain using the 'gcc' command to perform
966/// all subcommands; this relies on gcc translating the majority of
967/// command line options.
968
Chandler Carruth19347ed2011-11-06 23:39:34 +0000969/// \brief Parse a GCCVersion object out of a string of text.
970///
971/// This is the primary means of forming GCCVersion objects.
972/*static*/
973Generic_GCC::GCCVersion Linux::GCCVersion::Parse(StringRef VersionText) {
974 const GCCVersion BadVersion = { VersionText.str(), -1, -1, -1, "" };
975 std::pair<StringRef, StringRef> First = VersionText.split('.');
976 std::pair<StringRef, StringRef> Second = First.second.split('.');
977
978 GCCVersion GoodVersion = { VersionText.str(), -1, -1, -1, "" };
979 if (First.first.getAsInteger(10, GoodVersion.Major) ||
980 GoodVersion.Major < 0)
981 return BadVersion;
982 if (Second.first.getAsInteger(10, GoodVersion.Minor) ||
983 GoodVersion.Minor < 0)
984 return BadVersion;
985
986 // First look for a number prefix and parse that if present. Otherwise just
987 // stash the entire patch string in the suffix, and leave the number
988 // unspecified. This covers versions strings such as:
989 // 4.4
990 // 4.4.0
991 // 4.4.x
992 // 4.4.2-rc4
993 // 4.4.x-patched
994 // And retains any patch number it finds.
995 StringRef PatchText = GoodVersion.PatchSuffix = Second.second.str();
996 if (!PatchText.empty()) {
997 if (unsigned EndNumber = PatchText.find_first_not_of("0123456789")) {
998 // Try to parse the number and any suffix.
999 if (PatchText.slice(0, EndNumber).getAsInteger(10, GoodVersion.Patch) ||
1000 GoodVersion.Patch < 0)
1001 return BadVersion;
1002 GoodVersion.PatchSuffix = PatchText.substr(EndNumber).str();
1003 }
1004 }
1005
1006 return GoodVersion;
1007}
1008
1009/// \brief Less-than for GCCVersion, implementing a Strict Weak Ordering.
1010bool Generic_GCC::GCCVersion::operator<(const GCCVersion &RHS) const {
1011 if (Major < RHS.Major) return true; if (Major > RHS.Major) return false;
1012 if (Minor < RHS.Minor) return true; if (Minor > RHS.Minor) return false;
1013
1014 // Note that we rank versions with *no* patch specified is better than ones
1015 // hard-coding a patch version. Thus if the RHS has no patch, it always
1016 // wins, and the LHS only wins if it has no patch and the RHS does have
1017 // a patch.
1018 if (RHS.Patch == -1) return true; if (Patch == -1) return false;
1019 if (Patch < RHS.Patch) return true; if (Patch > RHS.Patch) return false;
Gabor Greif241cbe42012-04-18 10:59:08 +00001020 if (PatchSuffix == RHS.PatchSuffix) return false;
Chandler Carruth19347ed2011-11-06 23:39:34 +00001021
1022 // Finally, between completely tied version numbers, the version with the
1023 // suffix loses as we prefer full releases.
1024 if (RHS.PatchSuffix.empty()) return true;
1025 return false;
1026}
1027
Rafael Espindola0e659592012-02-19 01:38:32 +00001028static StringRef getGCCToolchainDir(const ArgList &Args) {
1029 const Arg *A = Args.getLastArg(options::OPT_gcc_toolchain);
1030 if (A)
1031 return A->getValue(Args);
1032 return GCC_INSTALL_PREFIX;
1033}
1034
Chandler Carruth19347ed2011-11-06 23:39:34 +00001035/// \brief Construct a GCCInstallationDetector from the driver.
1036///
1037/// This performs all of the autodetection and sets up the various paths.
Gabor Greif0407a042012-04-17 11:16:26 +00001038/// Once constructed, a GCCInstallationDetector is essentially immutable.
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001039///
1040/// FIXME: We shouldn't need an explicit TargetTriple parameter here, and
1041/// should instead pull the target out of the driver. This is currently
1042/// necessary because the driver doesn't store the final version of the target
1043/// triple.
1044Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(
1045 const Driver &D,
Rafael Espindola0e659592012-02-19 01:38:32 +00001046 const llvm::Triple &TargetTriple,
1047 const ArgList &Args)
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001048 : IsValid(false) {
Chandler Carruth9b338a72012-02-13 02:02:09 +00001049 llvm::Triple MultiarchTriple
1050 = TargetTriple.isArch32Bit() ? TargetTriple.get64BitArchVariant()
1051 : TargetTriple.get32BitArchVariant();
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001052 llvm::Triple::ArchType TargetArch = TargetTriple.getArch();
Chandler Carruth19347ed2011-11-06 23:39:34 +00001053 // The library directories which may contain GCC installations.
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001054 SmallVector<StringRef, 4> CandidateLibDirs, CandidateMultiarchLibDirs;
Chandler Carruth19347ed2011-11-06 23:39:34 +00001055 // The compatible GCC triples for this particular architecture.
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001056 SmallVector<StringRef, 10> CandidateTripleAliases;
1057 SmallVector<StringRef, 10> CandidateMultiarchTripleAliases;
1058 CollectLibDirsAndTriples(TargetTriple, MultiarchTriple, CandidateLibDirs,
1059 CandidateTripleAliases,
1060 CandidateMultiarchLibDirs,
1061 CandidateMultiarchTripleAliases);
Chandler Carruth19347ed2011-11-06 23:39:34 +00001062
1063 // Compute the set of prefixes for our search.
1064 SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(),
1065 D.PrefixDirs.end());
Rafael Espindola353300c2012-02-03 01:01:20 +00001066
Rafael Espindola0e659592012-02-19 01:38:32 +00001067 StringRef GCCToolchainDir = getGCCToolchainDir(Args);
1068 if (GCCToolchainDir != "") {
1069 if (GCCToolchainDir.back() == '/')
1070 GCCToolchainDir = GCCToolchainDir.drop_back(); // remove the /
Rafael Espindola353300c2012-02-03 01:01:20 +00001071
Rafael Espindola0e659592012-02-19 01:38:32 +00001072 Prefixes.push_back(GCCToolchainDir);
Rafael Espindola353300c2012-02-03 01:01:20 +00001073 } else {
1074 Prefixes.push_back(D.SysRoot);
1075 Prefixes.push_back(D.SysRoot + "/usr");
1076 Prefixes.push_back(D.InstalledDir + "/..");
1077 }
Chandler Carruth19347ed2011-11-06 23:39:34 +00001078
1079 // Loop over the various components which exist and select the best GCC
1080 // installation available. GCC installs are ranked by version number.
1081 Version = GCCVersion::Parse("0.0.0");
1082 for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
1083 if (!llvm::sys::fs::exists(Prefixes[i]))
1084 continue;
1085 for (unsigned j = 0, je = CandidateLibDirs.size(); j < je; ++j) {
1086 const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
1087 if (!llvm::sys::fs::exists(LibDir))
1088 continue;
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001089 for (unsigned k = 0, ke = CandidateTripleAliases.size(); k < ke; ++k)
1090 ScanLibDirForGCCTriple(TargetArch, LibDir, CandidateTripleAliases[k]);
1091 }
1092 for (unsigned j = 0, je = CandidateMultiarchLibDirs.size(); j < je; ++j) {
1093 const std::string LibDir
1094 = Prefixes[i] + CandidateMultiarchLibDirs[j].str();
1095 if (!llvm::sys::fs::exists(LibDir))
1096 continue;
1097 for (unsigned k = 0, ke = CandidateMultiarchTripleAliases.size(); k < ke;
1098 ++k)
1099 ScanLibDirForGCCTriple(TargetArch, LibDir,
1100 CandidateMultiarchTripleAliases[k],
1101 /*NeedsMultiarchSuffix=*/true);
Chandler Carruth19347ed2011-11-06 23:39:34 +00001102 }
1103 }
1104}
1105
1106/*static*/ void Generic_GCC::GCCInstallationDetector::CollectLibDirsAndTriples(
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001107 const llvm::Triple &TargetTriple,
1108 const llvm::Triple &MultiarchTriple,
1109 SmallVectorImpl<StringRef> &LibDirs,
1110 SmallVectorImpl<StringRef> &TripleAliases,
1111 SmallVectorImpl<StringRef> &MultiarchLibDirs,
1112 SmallVectorImpl<StringRef> &MultiarchTripleAliases) {
1113 // Declare a bunch of static data sets that we'll select between below. These
1114 // are specifically designed to always refer to string literals to avoid any
1115 // lifetime or initialization issues.
1116 static const char *const ARMLibDirs[] = { "/lib" };
1117 static const char *const ARMTriples[] = {
1118 "arm-linux-gnueabi",
1119 "arm-linux-androideabi"
1120 };
1121
1122 static const char *const X86_64LibDirs[] = { "/lib64", "/lib" };
1123 static const char *const X86_64Triples[] = {
1124 "x86_64-linux-gnu",
1125 "x86_64-unknown-linux-gnu",
1126 "x86_64-pc-linux-gnu",
1127 "x86_64-redhat-linux6E",
1128 "x86_64-redhat-linux",
1129 "x86_64-suse-linux",
1130 "x86_64-manbo-linux-gnu",
1131 "x86_64-linux-gnu",
1132 "x86_64-slackware-linux"
1133 };
1134 static const char *const X86LibDirs[] = { "/lib32", "/lib" };
1135 static const char *const X86Triples[] = {
1136 "i686-linux-gnu",
1137 "i686-pc-linux-gnu",
1138 "i486-linux-gnu",
1139 "i386-linux-gnu",
1140 "i686-redhat-linux",
1141 "i586-redhat-linux",
1142 "i386-redhat-linux",
1143 "i586-suse-linux",
1144 "i486-slackware-linux"
1145 };
1146
1147 static const char *const MIPSLibDirs[] = { "/lib" };
1148 static const char *const MIPSTriples[] = { "mips-linux-gnu" };
1149 static const char *const MIPSELLibDirs[] = { "/lib" };
1150 static const char *const MIPSELTriples[] = { "mipsel-linux-gnu" };
1151
Simon Atanasyanb8c43812012-04-26 19:57:02 +00001152 static const char *const MIPS64LibDirs[] = { "/lib64", "/lib" };
1153 static const char *const MIPS64Triples[] = { "mips64-linux-gnu" };
1154 static const char *const MIPS64ELLibDirs[] = { "/lib64", "/lib" };
1155 static const char *const MIPS64ELTriples[] = { "mips64el-linux-gnu" };
1156
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001157 static const char *const PPCLibDirs[] = { "/lib32", "/lib" };
1158 static const char *const PPCTriples[] = {
1159 "powerpc-linux-gnu",
1160 "powerpc-unknown-linux-gnu",
1161 "powerpc-suse-linux"
1162 };
1163 static const char *const PPC64LibDirs[] = { "/lib64", "/lib" };
1164 static const char *const PPC64Triples[] = {
Chandler Carruth155c54c2012-02-26 09:03:21 +00001165 "powerpc64-linux-gnu",
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001166 "powerpc64-unknown-linux-gnu",
1167 "powerpc64-suse-linux",
1168 "ppc64-redhat-linux"
1169 };
1170
1171 switch (TargetTriple.getArch()) {
1172 case llvm::Triple::arm:
1173 case llvm::Triple::thumb:
Chandler Carruth19347ed2011-11-06 23:39:34 +00001174 LibDirs.append(ARMLibDirs, ARMLibDirs + llvm::array_lengthof(ARMLibDirs));
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001175 TripleAliases.append(
1176 ARMTriples, ARMTriples + llvm::array_lengthof(ARMTriples));
1177 break;
1178 case llvm::Triple::x86_64:
1179 LibDirs.append(
1180 X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1181 TripleAliases.append(
1182 X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
1183 MultiarchLibDirs.append(
1184 X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
1185 MultiarchTripleAliases.append(
1186 X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
1187 break;
1188 case llvm::Triple::x86:
Chandler Carruth19347ed2011-11-06 23:39:34 +00001189 LibDirs.append(X86LibDirs, X86LibDirs + llvm::array_lengthof(X86LibDirs));
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001190 TripleAliases.append(
1191 X86Triples, X86Triples + llvm::array_lengthof(X86Triples));
1192 MultiarchLibDirs.append(
1193 X86_64LibDirs, X86_64LibDirs + llvm::array_lengthof(X86_64LibDirs));
1194 MultiarchTripleAliases.append(
1195 X86_64Triples, X86_64Triples + llvm::array_lengthof(X86_64Triples));
1196 break;
1197 case llvm::Triple::mips:
1198 LibDirs.append(
1199 MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1200 TripleAliases.append(
1201 MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
Simon Atanasyanb8c43812012-04-26 19:57:02 +00001202 MultiarchLibDirs.append(
1203 MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1204 MultiarchTripleAliases.append(
1205 MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001206 break;
1207 case llvm::Triple::mipsel:
1208 LibDirs.append(
1209 MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1210 TripleAliases.append(
1211 MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
Simon Atanasyanb8c43812012-04-26 19:57:02 +00001212 MultiarchLibDirs.append(
1213 MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1214 MultiarchTripleAliases.append(
1215 MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1216 break;
1217 case llvm::Triple::mips64:
1218 LibDirs.append(
1219 MIPS64LibDirs, MIPS64LibDirs + llvm::array_lengthof(MIPS64LibDirs));
1220 TripleAliases.append(
1221 MIPS64Triples, MIPS64Triples + llvm::array_lengthof(MIPS64Triples));
1222 MultiarchLibDirs.append(
1223 MIPSLibDirs, MIPSLibDirs + llvm::array_lengthof(MIPSLibDirs));
1224 MultiarchTripleAliases.append(
1225 MIPSTriples, MIPSTriples + llvm::array_lengthof(MIPSTriples));
1226 break;
1227 case llvm::Triple::mips64el:
1228 LibDirs.append(
1229 MIPS64ELLibDirs, MIPS64ELLibDirs + llvm::array_lengthof(MIPS64ELLibDirs));
1230 TripleAliases.append(
1231 MIPS64ELTriples, MIPS64ELTriples + llvm::array_lengthof(MIPS64ELTriples));
1232 MultiarchLibDirs.append(
1233 MIPSELLibDirs, MIPSELLibDirs + llvm::array_lengthof(MIPSELLibDirs));
1234 MultiarchTripleAliases.append(
1235 MIPSELTriples, MIPSELTriples + llvm::array_lengthof(MIPSELTriples));
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001236 break;
1237 case llvm::Triple::ppc:
Chandler Carruth19347ed2011-11-06 23:39:34 +00001238 LibDirs.append(PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001239 TripleAliases.append(
1240 PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
1241 MultiarchLibDirs.append(
1242 PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1243 MultiarchTripleAliases.append(
1244 PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
1245 break;
1246 case llvm::Triple::ppc64:
1247 LibDirs.append(
1248 PPC64LibDirs, PPC64LibDirs + llvm::array_lengthof(PPC64LibDirs));
1249 TripleAliases.append(
1250 PPC64Triples, PPC64Triples + llvm::array_lengthof(PPC64Triples));
1251 MultiarchLibDirs.append(
1252 PPCLibDirs, PPCLibDirs + llvm::array_lengthof(PPCLibDirs));
1253 MultiarchTripleAliases.append(
1254 PPCTriples, PPCTriples + llvm::array_lengthof(PPCTriples));
1255 break;
1256
1257 default:
1258 // By default, just rely on the standard lib directories and the original
1259 // triple.
1260 break;
Chandler Carruth19347ed2011-11-06 23:39:34 +00001261 }
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001262
1263 // Always append the drivers target triple to the end, in case it doesn't
1264 // match any of our aliases.
1265 TripleAliases.push_back(TargetTriple.str());
1266
1267 // Also include the multiarch variant if it's different.
1268 if (TargetTriple.str() != MultiarchTriple.str())
1269 MultiarchTripleAliases.push_back(MultiarchTriple.str());
Chandler Carruth19347ed2011-11-06 23:39:34 +00001270}
1271
1272void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001273 llvm::Triple::ArchType TargetArch, const std::string &LibDir,
1274 StringRef CandidateTriple, bool NeedsMultiarchSuffix) {
Chandler Carruth19347ed2011-11-06 23:39:34 +00001275 // There are various different suffixes involving the triple we
1276 // check for. We also record what is necessary to walk from each back
1277 // up to the lib directory.
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001278 const std::string LibSuffixes[] = {
Chandler Carruth19347ed2011-11-06 23:39:34 +00001279 "/gcc/" + CandidateTriple.str(),
1280 "/" + CandidateTriple.str() + "/gcc/" + CandidateTriple.str(),
1281
1282 // Ubuntu has a strange mis-matched pair of triples that this happens to
1283 // match.
1284 // FIXME: It may be worthwhile to generalize this and look for a second
1285 // triple.
Chandler Carruthd936d9d2011-11-09 03:46:20 +00001286 "/i386-linux-gnu/gcc/" + CandidateTriple.str()
Chandler Carruth19347ed2011-11-06 23:39:34 +00001287 };
1288 const std::string InstallSuffixes[] = {
1289 "/../../..",
1290 "/../../../..",
1291 "/../../../.."
1292 };
1293 // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001294 const unsigned NumLibSuffixes = (llvm::array_lengthof(LibSuffixes) -
1295 (TargetArch != llvm::Triple::x86));
1296 for (unsigned i = 0; i < NumLibSuffixes; ++i) {
1297 StringRef LibSuffix = LibSuffixes[i];
Chandler Carruth19347ed2011-11-06 23:39:34 +00001298 llvm::error_code EC;
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001299 for (llvm::sys::fs::directory_iterator LI(LibDir + LibSuffix, EC), LE;
Chandler Carruth19347ed2011-11-06 23:39:34 +00001300 !EC && LI != LE; LI = LI.increment(EC)) {
1301 StringRef VersionText = llvm::sys::path::filename(LI->path());
1302 GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
1303 static const GCCVersion MinVersion = { "4.1.1", 4, 1, 1, "" };
1304 if (CandidateVersion < MinVersion)
1305 continue;
1306 if (CandidateVersion <= Version)
1307 continue;
Hal Finkel2e55df42011-12-08 05:50:03 +00001308
1309 // Some versions of SUSE and Fedora on ppc64 put 32-bit libs
Chandler Carruth5d84bb42012-01-24 19:21:42 +00001310 // in what would normally be GCCInstallPath and put the 64-bit
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001311 // libs in a subdirectory named 64. The simple logic we follow is that
1312 // *if* there is a subdirectory of the right name with crtbegin.o in it,
1313 // we use that. If not, and if not a multiarch triple, we look for
1314 // crtbegin.o without the subdirectory.
1315 StringRef MultiarchSuffix
1316 = (TargetArch == llvm::Triple::x86_64 ||
Simon Atanasyanb8c43812012-04-26 19:57:02 +00001317 TargetArch == llvm::Triple::ppc64 ||
1318 TargetArch == llvm::Triple::mips64 ||
1319 TargetArch == llvm::Triple::mips64el) ? "/64" : "/32";
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001320 if (llvm::sys::fs::exists(LI->path() + MultiarchSuffix + "/crtbegin.o")) {
1321 GCCMultiarchSuffix = MultiarchSuffix.str();
1322 } else {
1323 if (NeedsMultiarchSuffix ||
1324 !llvm::sys::fs::exists(LI->path() + "/crtbegin.o"))
1325 continue;
1326 GCCMultiarchSuffix.clear();
1327 }
Chandler Carruth19347ed2011-11-06 23:39:34 +00001328
1329 Version = CandidateVersion;
Chandler Carruthfa5be912012-01-24 19:28:29 +00001330 GCCTriple.setTriple(CandidateTriple);
Chandler Carruth19347ed2011-11-06 23:39:34 +00001331 // FIXME: We hack together the directory name here instead of
1332 // using LI to ensure stable path separators across Windows and
1333 // Linux.
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00001334 GCCInstallPath = LibDir + LibSuffixes[i] + "/" + VersionText.str();
Chandler Carruth5d84bb42012-01-24 19:21:42 +00001335 GCCParentLibPath = GCCInstallPath + InstallSuffixes[i];
Chandler Carruth19347ed2011-11-06 23:39:34 +00001336 IsValid = true;
1337 }
1338 }
1339}
1340
Rafael Espindola0e659592012-02-19 01:38:32 +00001341Generic_GCC::Generic_GCC(const Driver &D, const llvm::Triple& Triple,
1342 const ArgList &Args)
1343 : ToolChain(D, Triple), GCCInstallation(getDriver(), Triple, Args) {
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001344 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +00001345 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001346 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarc50b00d2009-03-23 16:15:50 +00001347}
1348
Daniel Dunbar39176082009-03-20 00:20:03 +00001349Generic_GCC::~Generic_GCC() {
1350 // Free tool implementations.
1351 for (llvm::DenseMap<unsigned, Tool*>::iterator
1352 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1353 delete it->second;
1354}
1355
Mike Stump1eb44332009-09-09 15:08:12 +00001356Tool &Generic_GCC::SelectTool(const Compilation &C,
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001357 const JobAction &JA,
1358 const ActionList &Inputs) const {
Daniel Dunbar39176082009-03-20 00:20:03 +00001359 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001360 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar39176082009-03-20 00:20:03 +00001361 Key = Action::AnalyzeJobClass;
1362 else
1363 Key = JA.getKind();
1364
1365 Tool *&T = Tools[Key];
1366 if (!T) {
1367 switch (Key) {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +00001368 case Action::InputClass:
1369 case Action::BindArchClass:
David Blaikieb219cfc2011-09-23 05:06:16 +00001370 llvm_unreachable("Invalid tool kind.");
Daniel Dunbar39176082009-03-20 00:20:03 +00001371 case Action::PreprocessJobClass:
1372 T = new tools::gcc::Preprocess(*this); break;
1373 case Action::PrecompileJobClass:
1374 T = new tools::gcc::Precompile(*this); break;
1375 case Action::AnalyzeJobClass:
Ted Kremenek30660a82012-03-06 20:06:33 +00001376 case Action::MigrateJobClass:
Daniel Dunbar39176082009-03-20 00:20:03 +00001377 T = new tools::Clang(*this); break;
1378 case Action::CompileJobClass:
1379 T = new tools::gcc::Compile(*this); break;
1380 case Action::AssembleJobClass:
1381 T = new tools::gcc::Assemble(*this); break;
1382 case Action::LinkJobClass:
1383 T = new tools::gcc::Link(*this); break;
Mike Stump1eb44332009-09-09 15:08:12 +00001384
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +00001385 // This is a bit ungeneric, but the only platform using a driver
1386 // driver is Darwin.
1387 case Action::LipoJobClass:
1388 T = new tools::darwin::Lipo(*this); break;
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00001389 case Action::DsymutilJobClass:
1390 T = new tools::darwin::Dsymutil(*this); break;
Eric Christopherf8571862011-08-23 17:56:55 +00001391 case Action::VerifyJobClass:
1392 T = new tools::darwin::VerifyDebug(*this); break;
Daniel Dunbar39176082009-03-20 00:20:03 +00001393 }
1394 }
1395
1396 return *T;
1397}
1398
Daniel Dunbar39176082009-03-20 00:20:03 +00001399bool Generic_GCC::IsUnwindTablesDefault() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +00001400 // FIXME: Gross; we should probably have some separate target
1401 // definition, possibly even reusing the one in clang.
Daniel Dunbar39176082009-03-20 00:20:03 +00001402 return getArchName() == "x86_64";
1403}
1404
1405const char *Generic_GCC::GetDefaultRelocationModel() const {
1406 return "static";
1407}
1408
1409const char *Generic_GCC::GetForcedPicModel() const {
1410 return 0;
1411}
Tony Linthicum96319392011-12-12 21:14:55 +00001412/// Hexagon Toolchain
1413
Chandler Carruth1d16f0f2012-01-31 02:21:20 +00001414Hexagon_TC::Hexagon_TC(const Driver &D, const llvm::Triple& Triple)
1415 : ToolChain(D, Triple) {
Tony Linthicum96319392011-12-12 21:14:55 +00001416 getProgramPaths().push_back(getDriver().getInstalledDir());
1417 if (getDriver().getInstalledDir() != getDriver().Dir.c_str())
1418 getProgramPaths().push_back(getDriver().Dir);
1419}
1420
1421Hexagon_TC::~Hexagon_TC() {
1422 // Free tool implementations.
1423 for (llvm::DenseMap<unsigned, Tool*>::iterator
1424 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1425 delete it->second;
1426}
1427
1428Tool &Hexagon_TC::SelectTool(const Compilation &C,
1429 const JobAction &JA,
1430 const ActionList &Inputs) const {
1431 Action::ActionClass Key;
1432 // if (JA.getKind () == Action::CompileJobClass)
1433 // Key = JA.getKind ();
1434 // else
1435
1436 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1437 Key = Action::AnalyzeJobClass;
1438 else
1439 Key = JA.getKind();
1440 // if ((JA.getKind () == Action::CompileJobClass)
1441 // && (JA.getType () != types::TY_LTO_BC)) {
1442 // Key = JA.getKind ();
1443 // }
1444
1445 Tool *&T = Tools[Key];
1446 if (!T) {
1447 switch (Key) {
1448 case Action::InputClass:
1449 case Action::BindArchClass:
1450 assert(0 && "Invalid tool kind.");
1451 case Action::AnalyzeJobClass:
1452 T = new tools::Clang(*this); break;
1453 case Action::AssembleJobClass:
1454 T = new tools::hexagon::Assemble(*this); break;
1455 case Action::LinkJobClass:
1456 T = new tools::hexagon::Link(*this); break;
1457 default:
1458 assert(false && "Unsupported action for Hexagon target.");
1459 }
1460 }
1461
1462 return *T;
1463}
1464
1465bool Hexagon_TC::IsUnwindTablesDefault() const {
1466 // FIXME: Gross; we should probably have some separate target
1467 // definition, possibly even reusing the one in clang.
1468 return getArchName() == "x86_64";
1469}
1470
1471const char *Hexagon_TC::GetDefaultRelocationModel() const {
1472 return "static";
1473}
1474
1475const char *Hexagon_TC::GetForcedPicModel() const {
1476 return 0;
1477} // End Hexagon
1478
Daniel Dunbarf3cad362009-03-25 04:13:45 +00001479
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001480/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
1481/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
1482/// Currently does not support anything else but compilation.
1483
Chandler Carruth1d16f0f2012-01-31 02:21:20 +00001484TCEToolChain::TCEToolChain(const Driver &D, const llvm::Triple& Triple)
1485 : ToolChain(D, Triple) {
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001486 // Path mangling to find libexec
1487 std::string Path(getDriver().Dir);
1488
1489 Path += "/../libexec";
1490 getProgramPaths().push_back(Path);
1491}
1492
1493TCEToolChain::~TCEToolChain() {
1494 for (llvm::DenseMap<unsigned, Tool*>::iterator
1495 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1496 delete it->second;
1497}
1498
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001499bool TCEToolChain::IsMathErrnoDefault() const {
1500 return true;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001501}
1502
1503bool TCEToolChain::IsUnwindTablesDefault() const {
1504 return false;
1505}
1506
1507const char *TCEToolChain::GetDefaultRelocationModel() const {
1508 return "static";
1509}
1510
1511const char *TCEToolChain::GetForcedPicModel() const {
1512 return 0;
1513}
1514
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001515Tool &TCEToolChain::SelectTool(const Compilation &C,
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001516 const JobAction &JA,
1517 const ActionList &Inputs) const {
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001518 Action::ActionClass Key;
1519 Key = Action::AnalyzeJobClass;
1520
1521 Tool *&T = Tools[Key];
1522 if (!T) {
1523 switch (Key) {
1524 case Action::PreprocessJobClass:
1525 T = new tools::gcc::Preprocess(*this); break;
1526 case Action::AnalyzeJobClass:
1527 T = new tools::Clang(*this); break;
1528 default:
David Blaikieb219cfc2011-09-23 05:06:16 +00001529 llvm_unreachable("Unsupported action for TCE target.");
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001530 }
1531 }
1532 return *T;
1533}
1534
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001535/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1536
Rafael Espindola0e659592012-02-19 01:38:32 +00001537OpenBSD::OpenBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1538 : Generic_ELF(D, Triple, Args) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00001539 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001540 getFilePaths().push_back("/usr/lib");
1541}
1542
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001543Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
1544 const ActionList &Inputs) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001545 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001546 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001547 Key = Action::AnalyzeJobClass;
1548 else
1549 Key = JA.getKind();
1550
Rafael Espindoladda5b922010-11-07 23:13:01 +00001551 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1552 options::OPT_no_integrated_as,
1553 IsIntegratedAssemblerDefault());
1554
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001555 Tool *&T = Tools[Key];
1556 if (!T) {
1557 switch (Key) {
Rafael Espindoladda5b922010-11-07 23:13:01 +00001558 case Action::AssembleJobClass: {
1559 if (UseIntegratedAs)
1560 T = new tools::ClangAs(*this);
1561 else
1562 T = new tools::openbsd::Assemble(*this);
1563 break;
1564 }
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001565 case Action::LinkJobClass:
1566 T = new tools::openbsd::Link(*this); break;
1567 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001568 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001569 }
1570 }
1571
1572 return *T;
1573}
1574
Daniel Dunbar75358d22009-03-30 21:06:03 +00001575/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
1576
Rafael Espindola0e659592012-02-19 01:38:32 +00001577FreeBSD::FreeBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1578 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar214afe92010-08-02 05:43:59 +00001579
Chandler Carruth24248e32012-01-26 01:35:15 +00001580 // When targeting 32-bit platforms, look for '/usr/lib32/crt1.o' and fall
1581 // back to '/usr/lib' if it doesn't exist.
Chandler Carruth00646ba2012-01-25 11:24:24 +00001582 if ((Triple.getArch() == llvm::Triple::x86 ||
1583 Triple.getArch() == llvm::Triple::ppc) &&
Chandler Carruth24248e32012-01-26 01:35:15 +00001584 llvm::sys::fs::exists(getDriver().SysRoot + "/usr/lib32/crt1.o"))
Chandler Carruth00646ba2012-01-25 11:24:24 +00001585 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib32");
1586 else
1587 getFilePaths().push_back(getDriver().SysRoot + "/usr/lib");
Daniel Dunbar75358d22009-03-30 21:06:03 +00001588}
1589
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001590Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
1591 const ActionList &Inputs) const {
Daniel Dunbar75358d22009-03-30 21:06:03 +00001592 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001593 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar75358d22009-03-30 21:06:03 +00001594 Key = Action::AnalyzeJobClass;
1595 else
1596 Key = JA.getKind();
1597
Roman Divacky67dece72010-11-08 17:46:39 +00001598 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1599 options::OPT_no_integrated_as,
1600 IsIntegratedAssemblerDefault());
1601
Daniel Dunbar75358d22009-03-30 21:06:03 +00001602 Tool *&T = Tools[Key];
1603 if (!T) {
1604 switch (Key) {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00001605 case Action::AssembleJobClass:
Roman Divacky67dece72010-11-08 17:46:39 +00001606 if (UseIntegratedAs)
1607 T = new tools::ClangAs(*this);
1608 else
1609 T = new tools::freebsd::Assemble(*this);
Roman Divackyfe3a7ea2010-11-08 19:39:10 +00001610 break;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00001611 case Action::LinkJobClass:
1612 T = new tools::freebsd::Link(*this); break;
Daniel Dunbar75358d22009-03-30 21:06:03 +00001613 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001614 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbar75358d22009-03-30 21:06:03 +00001615 }
1616 }
1617
1618 return *T;
1619}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001620
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001621/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
1622
Rafael Espindola0e659592012-02-19 01:38:32 +00001623NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1624 : Generic_ELF(D, Triple, Args) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001625
Joerg Sonnenberger05e59302011-03-21 13:59:26 +00001626 if (getDriver().UseStdLib) {
Chandler Carruth32f88be2012-01-25 11:18:20 +00001627 // When targeting a 32-bit platform, try the special directory used on
1628 // 64-bit hosts, and only fall back to the main library directory if that
1629 // doesn't work.
1630 // FIXME: It'd be nicer to test if this directory exists, but I'm not sure
1631 // what all logic is needed to emulate the '=' prefix here.
Joerg Sonnenberger66de97f2012-01-26 21:58:37 +00001632 if (Triple.getArch() == llvm::Triple::x86)
Joerg Sonnenberger05e59302011-03-21 13:59:26 +00001633 getFilePaths().push_back("=/usr/lib/i386");
Chandler Carruth32f88be2012-01-25 11:18:20 +00001634
1635 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001636 }
1637}
1638
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001639Tool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
1640 const ActionList &Inputs) const {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001641 Action::ActionClass Key;
1642 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1643 Key = Action::AnalyzeJobClass;
1644 else
1645 Key = JA.getKind();
1646
1647 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1648 options::OPT_no_integrated_as,
1649 IsIntegratedAssemblerDefault());
1650
1651 Tool *&T = Tools[Key];
1652 if (!T) {
1653 switch (Key) {
1654 case Action::AssembleJobClass:
1655 if (UseIntegratedAs)
1656 T = new tools::ClangAs(*this);
1657 else
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00001658 T = new tools::netbsd::Assemble(*this);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001659 break;
1660 case Action::LinkJobClass:
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +00001661 T = new tools::netbsd::Link(*this);
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001662 break;
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001663 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001664 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001665 }
1666 }
1667
1668 return *T;
1669}
1670
Chris Lattner38e317d2010-07-07 16:01:42 +00001671/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
1672
Rafael Espindola0e659592012-02-19 01:38:32 +00001673Minix::Minix(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
1674 : Generic_ELF(D, Triple, Args) {
Chris Lattner38e317d2010-07-07 16:01:42 +00001675 getFilePaths().push_back(getDriver().Dir + "/../lib");
1676 getFilePaths().push_back("/usr/lib");
Chris Lattner38e317d2010-07-07 16:01:42 +00001677}
1678
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001679Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
1680 const ActionList &Inputs) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00001681 Action::ActionClass Key;
1682 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1683 Key = Action::AnalyzeJobClass;
1684 else
1685 Key = JA.getKind();
1686
1687 Tool *&T = Tools[Key];
1688 if (!T) {
1689 switch (Key) {
1690 case Action::AssembleJobClass:
1691 T = new tools::minix::Assemble(*this); break;
1692 case Action::LinkJobClass:
1693 T = new tools::minix::Link(*this); break;
1694 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001695 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Chris Lattner38e317d2010-07-07 16:01:42 +00001696 }
1697 }
1698
1699 return *T;
1700}
1701
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001702/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1703
Rafael Espindola0e659592012-02-19 01:38:32 +00001704AuroraUX::AuroraUX(const Driver &D, const llvm::Triple& Triple,
1705 const ArgList &Args)
1706 : Generic_GCC(D, Triple, Args) {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001707
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001708 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +00001709 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001710 getProgramPaths().push_back(getDriver().Dir);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001711
Daniel Dunbaree788e72009-12-21 18:54:17 +00001712 getFilePaths().push_back(getDriver().Dir + "/../lib");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001713 getFilePaths().push_back("/usr/lib");
1714 getFilePaths().push_back("/usr/sfw/lib");
1715 getFilePaths().push_back("/opt/gcc4/lib");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00001716 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001717
1718}
1719
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001720Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
1721 const ActionList &Inputs) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001722 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001723 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001724 Key = Action::AnalyzeJobClass;
1725 else
1726 Key = JA.getKind();
1727
1728 Tool *&T = Tools[Key];
1729 if (!T) {
1730 switch (Key) {
1731 case Action::AssembleJobClass:
1732 T = new tools::auroraux::Assemble(*this); break;
1733 case Action::LinkJobClass:
1734 T = new tools::auroraux::Link(*this); break;
1735 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001736 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001737 }
1738 }
1739
1740 return *T;
1741}
1742
David Chisnall31c46902012-02-15 13:39:01 +00001743/// Solaris - Solaris tool chain which can call as(1) and ld(1) directly.
1744
Rafael Espindola0e659592012-02-19 01:38:32 +00001745Solaris::Solaris(const Driver &D, const llvm::Triple& Triple,
1746 const ArgList &Args)
1747 : Generic_GCC(D, Triple, Args) {
David Chisnall31c46902012-02-15 13:39:01 +00001748
1749 getProgramPaths().push_back(getDriver().getInstalledDir());
1750 if (getDriver().getInstalledDir() != getDriver().Dir)
1751 getProgramPaths().push_back(getDriver().Dir);
1752
1753 getFilePaths().push_back(getDriver().Dir + "/../lib");
1754 getFilePaths().push_back("/usr/lib");
1755}
1756
1757Tool &Solaris::SelectTool(const Compilation &C, const JobAction &JA,
1758 const ActionList &Inputs) const {
1759 Action::ActionClass Key;
1760 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1761 Key = Action::AnalyzeJobClass;
1762 else
1763 Key = JA.getKind();
1764
1765 Tool *&T = Tools[Key];
1766 if (!T) {
1767 switch (Key) {
1768 case Action::AssembleJobClass:
1769 T = new tools::solaris::Assemble(*this); break;
1770 case Action::LinkJobClass:
1771 T = new tools::solaris::Link(*this); break;
1772 default:
1773 T = &Generic_GCC::SelectTool(C, JA, Inputs);
1774 }
1775 }
1776
1777 return *T;
1778}
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001779
Eli Friedman6b3454a2009-05-26 07:52:18 +00001780/// Linux toolchain (very bare-bones at the moment).
1781
Rafael Espindolac1da9812010-11-07 20:14:31 +00001782enum LinuxDistro {
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001783 ArchLinux,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001784 DebianLenny,
1785 DebianSqueeze,
Eli Friedman0b200f62011-06-02 21:36:53 +00001786 DebianWheezy,
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001787 Exherbo,
Chris Lattnerd753b562011-05-22 05:36:06 +00001788 RHEL4,
1789 RHEL5,
1790 RHEL6,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001791 Fedora13,
1792 Fedora14,
Eric Christopher8f1cc072011-04-06 18:22:53 +00001793 Fedora15,
Benjamin Kramerafe55fb2012-02-06 15:33:06 +00001794 Fedora16,
Eric Christopher8f1cc072011-04-06 18:22:53 +00001795 FedoraRawhide,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001796 OpenSuse11_3,
David Chisnallde5c0482011-05-19 13:26:33 +00001797 OpenSuse11_4,
1798 OpenSuse12_1,
Douglas Gregor4e1b2922012-04-30 23:42:57 +00001799 OpenSuse12_2,
Douglas Gregor814638e2011-03-14 15:39:50 +00001800 UbuntuHardy,
1801 UbuntuIntrepid,
Rafael Espindola021aaa42010-11-10 05:00:22 +00001802 UbuntuJaunty,
Zhongxing Xu5ede8072010-11-15 09:01:52 +00001803 UbuntuKarmic,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001804 UbuntuLucid,
1805 UbuntuMaverick,
Ted Kremenek43ac2972011-04-05 22:04:27 +00001806 UbuntuNatty,
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001807 UbuntuOneiric,
Benjamin Kramer668ecd92012-02-06 14:36:09 +00001808 UbuntuPrecise,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001809 UnknownDistro
1810};
1811
Chris Lattnerd753b562011-05-22 05:36:06 +00001812static bool IsRedhat(enum LinuxDistro Distro) {
Benjamin Kramerafe55fb2012-02-06 15:33:06 +00001813 return (Distro >= Fedora13 && Distro <= FedoraRawhide) ||
1814 (Distro >= RHEL4 && Distro <= RHEL6);
Rafael Espindolac1da9812010-11-07 20:14:31 +00001815}
1816
1817static bool IsOpenSuse(enum LinuxDistro Distro) {
Douglas Gregor4e1b2922012-04-30 23:42:57 +00001818 return Distro >= OpenSuse11_3 && Distro <= OpenSuse12_2;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001819}
1820
1821static bool IsDebian(enum LinuxDistro Distro) {
Benjamin Kramerafe55fb2012-02-06 15:33:06 +00001822 return Distro >= DebianLenny && Distro <= DebianWheezy;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001823}
1824
1825static bool IsUbuntu(enum LinuxDistro Distro) {
Benjamin Kramer668ecd92012-02-06 14:36:09 +00001826 return Distro >= UbuntuHardy && Distro <= UbuntuPrecise;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001827}
1828
Rafael Espindolac1da9812010-11-07 20:14:31 +00001829static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
Dylan Noblesmith6f42b622012-02-05 02:12:40 +00001830 OwningPtr<llvm::MemoryBuffer> File;
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001831 if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001832 StringRef Data = File.get()->getBuffer();
1833 SmallVector<StringRef, 8> Lines;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001834 Data.split(Lines, "\n");
Benjamin Kramer668ecd92012-02-06 14:36:09 +00001835 LinuxDistro Version = UnknownDistro;
1836 for (unsigned i = 0, s = Lines.size(); i != s; ++i)
1837 if (Version == UnknownDistro && Lines[i].startswith("DISTRIB_CODENAME="))
1838 Version = llvm::StringSwitch<LinuxDistro>(Lines[i].substr(17))
1839 .Case("hardy", UbuntuHardy)
1840 .Case("intrepid", UbuntuIntrepid)
1841 .Case("jaunty", UbuntuJaunty)
1842 .Case("karmic", UbuntuKarmic)
1843 .Case("lucid", UbuntuLucid)
1844 .Case("maverick", UbuntuMaverick)
1845 .Case("natty", UbuntuNatty)
1846 .Case("oneiric", UbuntuOneiric)
1847 .Case("precise", UbuntuPrecise)
1848 .Default(UnknownDistro);
1849 return Version;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001850 }
1851
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001852 if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001853 StringRef Data = File.get()->getBuffer();
Benjamin Kramerafe55fb2012-02-06 15:33:06 +00001854 if (Data.startswith("Fedora release 16"))
1855 return Fedora16;
1856 else if (Data.startswith("Fedora release 15"))
Eric Christopher8f1cc072011-04-06 18:22:53 +00001857 return Fedora15;
1858 else if (Data.startswith("Fedora release 14"))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001859 return Fedora14;
Eric Christopher8f1cc072011-04-06 18:22:53 +00001860 else if (Data.startswith("Fedora release 13"))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001861 return Fedora13;
Eric Christopher8f1cc072011-04-06 18:22:53 +00001862 else if (Data.startswith("Fedora release") &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001863 Data.find("Rawhide") != StringRef::npos)
Eric Christopher8f1cc072011-04-06 18:22:53 +00001864 return FedoraRawhide;
Chris Lattnerd753b562011-05-22 05:36:06 +00001865 else if (Data.startswith("Red Hat Enterprise Linux") &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001866 Data.find("release 6") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001867 return RHEL6;
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001868 else if ((Data.startswith("Red Hat Enterprise Linux") ||
1869 Data.startswith("CentOS")) &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001870 Data.find("release 5") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001871 return RHEL5;
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001872 else if ((Data.startswith("Red Hat Enterprise Linux") ||
1873 Data.startswith("CentOS")) &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001874 Data.find("release 4") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001875 return RHEL4;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001876 return UnknownDistro;
1877 }
1878
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001879 if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001880 StringRef Data = File.get()->getBuffer();
Rafael Espindolac1da9812010-11-07 20:14:31 +00001881 if (Data[0] == '5')
1882 return DebianLenny;
Rafael Espindola0e743b12011-12-28 18:17:14 +00001883 else if (Data.startswith("squeeze/sid") || Data[0] == '6')
Rafael Espindolac1da9812010-11-07 20:14:31 +00001884 return DebianSqueeze;
Rafael Espindola0e743b12011-12-28 18:17:14 +00001885 else if (Data.startswith("wheezy/sid") || Data[0] == '7')
Eli Friedman0b200f62011-06-02 21:36:53 +00001886 return DebianWheezy;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001887 return UnknownDistro;
1888 }
1889
Benjamin Kramerafe55fb2012-02-06 15:33:06 +00001890 if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File))
1891 return llvm::StringSwitch<LinuxDistro>(File.get()->getBuffer())
1892 .StartsWith("openSUSE 11.3", OpenSuse11_3)
1893 .StartsWith("openSUSE 11.4", OpenSuse11_4)
1894 .StartsWith("openSUSE 12.1", OpenSuse12_1)
Douglas Gregor4e1b2922012-04-30 23:42:57 +00001895 .StartsWith("openSUSE 12.2", OpenSuse12_2)
Benjamin Kramerafe55fb2012-02-06 15:33:06 +00001896 .Default(UnknownDistro);
Rafael Espindolac1da9812010-11-07 20:14:31 +00001897
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001898 bool Exists;
1899 if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001900 return Exherbo;
1901
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001902 if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
1903 return ArchLinux;
1904
Rafael Espindolac1da9812010-11-07 20:14:31 +00001905 return UnknownDistro;
1906}
1907
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001908/// \brief Get our best guess at the multiarch triple for a target.
1909///
1910/// Debian-based systems are starting to use a multiarch setup where they use
1911/// a target-triple directory in the library and header search paths.
1912/// Unfortunately, this triple does not align with the vanilla target triple,
1913/// so we provide a rough mapping here.
1914static std::string getMultiarchTriple(const llvm::Triple TargetTriple,
1915 StringRef SysRoot) {
1916 // For most architectures, just use whatever we have rather than trying to be
1917 // clever.
1918 switch (TargetTriple.getArch()) {
1919 default:
1920 return TargetTriple.str();
1921
1922 // We use the existence of '/lib/<triple>' as a directory to detect some
1923 // common linux triples that don't quite match the Clang triple for both
Chandler Carruth236e0b62011-10-31 09:06:40 +00001924 // 32-bit and 64-bit targets. Multiarch fixes its install triples to these
1925 // regardless of what the actual target triple is.
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001926 case llvm::Triple::x86:
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001927 if (llvm::sys::fs::exists(SysRoot + "/lib/i386-linux-gnu"))
1928 return "i386-linux-gnu";
1929 return TargetTriple.str();
1930 case llvm::Triple::x86_64:
1931 if (llvm::sys::fs::exists(SysRoot + "/lib/x86_64-linux-gnu"))
1932 return "x86_64-linux-gnu";
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001933 return TargetTriple.str();
Eli Friedman5bea4f62011-11-08 19:43:37 +00001934 case llvm::Triple::mips:
1935 if (llvm::sys::fs::exists(SysRoot + "/lib/mips-linux-gnu"))
1936 return "mips-linux-gnu";
1937 return TargetTriple.str();
1938 case llvm::Triple::mipsel:
1939 if (llvm::sys::fs::exists(SysRoot + "/lib/mipsel-linux-gnu"))
1940 return "mipsel-linux-gnu";
1941 return TargetTriple.str();
Chandler Carruth155c54c2012-02-26 09:03:21 +00001942 case llvm::Triple::ppc:
1943 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc-linux-gnu"))
1944 return "powerpc-linux-gnu";
1945 return TargetTriple.str();
1946 case llvm::Triple::ppc64:
1947 if (llvm::sys::fs::exists(SysRoot + "/lib/powerpc64-linux-gnu"))
1948 return "powerpc64-linux-gnu";
1949 return TargetTriple.str();
Chandler Carruthdeb73f82011-10-31 08:42:24 +00001950 }
1951}
1952
Chandler Carruth00646ba2012-01-25 11:24:24 +00001953static void addPathIfExists(Twine Path, ToolChain::path_list &Paths) {
1954 if (llvm::sys::fs::exists(Path)) Paths.push_back(Path.str());
1955}
1956
Rafael Espindola0e659592012-02-19 01:38:32 +00001957Linux::Linux(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
1958 : Generic_ELF(D, Triple, Args) {
Chandler Carruth89088792012-01-24 20:08:17 +00001959 llvm::Triple::ArchType Arch = Triple.getArch();
Chandler Carruthfde8d142011-10-03 06:41:08 +00001960 const std::string &SysRoot = getDriver().SysRoot;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001961
Rafael Espindolaab784082011-09-01 16:25:49 +00001962 // OpenSuse stores the linker with the compiler, add that to the search
1963 // path.
1964 ToolChain::path_list &PPaths = getProgramPaths();
Chandler Carruthfa134592011-11-06 09:21:54 +00001965 PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
Chandler Carruthfa5be912012-01-24 19:28:29 +00001966 GCCInstallation.getTriple().str() + "/bin").str());
Rafael Espindolaab784082011-09-01 16:25:49 +00001967
1968 Linker = GetProgramPath("ld");
Rafael Espindolac1da9812010-11-07 20:14:31 +00001969
1970 LinuxDistro Distro = DetectLinuxDistro(Arch);
1971
Chris Lattner64a89172011-05-22 16:45:07 +00001972 if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
Rafael Espindola94c80222010-11-08 14:48:47 +00001973 ExtraOpts.push_back("-z");
1974 ExtraOpts.push_back("relro");
1975 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00001976
Douglas Gregorf0594d82011-03-06 19:11:49 +00001977 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001978 ExtraOpts.push_back("-X");
1979
Chandler Carruthd4e6e7e2011-12-09 04:45:18 +00001980 const bool IsMips = Arch == llvm::Triple::mips ||
1981 Arch == llvm::Triple::mipsel ||
1982 Arch == llvm::Triple::mips64 ||
1983 Arch == llvm::Triple::mips64el;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001984
Evgeniy Stepanov704e7322012-01-13 09:30:38 +00001985 const bool IsAndroid = Triple.getEnvironment() == llvm::Triple::ANDROIDEABI;
1986
Chandler Carruthd4e6e7e2011-12-09 04:45:18 +00001987 // Do not use 'gnu' hash style for Mips targets because .gnu.hash
1988 // and the MIPS ABI require .dynsym to be sorted in different ways.
1989 // .gnu.hash needs symbols to be grouped by hash code whereas the MIPS
1990 // ABI requires a mapping between the GOT and the symbol table.
Evgeniy Stepanov704e7322012-01-13 09:30:38 +00001991 // Android loader does not support .gnu.hash.
1992 if (!IsMips && !IsAndroid) {
Benjamin Kramer668ecd92012-02-06 14:36:09 +00001993 if (IsRedhat(Distro) || IsOpenSuse(Distro) ||
1994 (IsUbuntu(Distro) && Distro >= UbuntuMaverick))
Chandler Carruthd4e6e7e2011-12-09 04:45:18 +00001995 ExtraOpts.push_back("--hash-style=gnu");
1996
1997 if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
1998 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
1999 ExtraOpts.push_back("--hash-style=both");
2000 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00002001
Chris Lattnerd753b562011-05-22 05:36:06 +00002002 if (IsRedhat(Distro))
Rafael Espindolac1da9812010-11-07 20:14:31 +00002003 ExtraOpts.push_back("--no-add-needed");
2004
Eli Friedman0b200f62011-06-02 21:36:53 +00002005 if (Distro == DebianSqueeze || Distro == DebianWheezy ||
Rafael Espindola5a640ef2011-06-03 15:23:24 +00002006 IsOpenSuse(Distro) ||
2007 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
Benjamin Kramer668ecd92012-02-06 14:36:09 +00002008 (IsUbuntu(Distro) && Distro >= UbuntuKarmic))
Rafael Espindolac1da9812010-11-07 20:14:31 +00002009 ExtraOpts.push_back("--build-id");
2010
Chris Lattner64a89172011-05-22 16:45:07 +00002011 if (IsOpenSuse(Distro))
Chandler Carruthf0b60ec2011-05-24 07:51:17 +00002012 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattner64a89172011-05-22 16:45:07 +00002013
Chandler Carruthd2deee12011-10-03 05:28:29 +00002014 // The selection of paths to try here is designed to match the patterns which
2015 // the GCC driver itself uses, as this is part of the GCC-compatible driver.
2016 // This was determined by running GCC in a fake filesystem, creating all
2017 // possible permutations of these directories, and seeing which ones it added
2018 // to the link paths.
2019 path_list &Paths = getFilePaths();
Chandler Carruth3fd345a2011-02-25 06:39:53 +00002020
Chandler Carruthd747efa2012-02-11 03:31:12 +00002021 const std::string Multilib = Triple.isArch32Bit() ? "lib32" : "lib64";
Chandler Carruthdeb73f82011-10-31 08:42:24 +00002022 const std::string MultiarchTriple = getMultiarchTriple(Triple, SysRoot);
Chandler Carruthd2deee12011-10-03 05:28:29 +00002023
Chandler Carruthd1f73062011-11-06 23:09:05 +00002024 // Add the multilib suffixed paths where they are available.
2025 if (GCCInstallation.isValid()) {
Chandler Carruthfa5be912012-01-24 19:28:29 +00002026 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth89088792012-01-24 20:08:17 +00002027 const std::string &LibPath = GCCInstallation.getParentLibPath();
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00002028 addPathIfExists((GCCInstallation.getInstallPath() +
2029 GCCInstallation.getMultiarchSuffix()),
2030 Paths);
Chandler Carruth9f314372012-04-06 16:32:06 +00002031
2032 // If the GCC installation we found is inside of the sysroot, we want to
2033 // prefer libraries installed in the parent prefix of the GCC installation.
2034 // It is important to *not* use these paths when the GCC installation is
Gabor Greif241cbe42012-04-18 10:59:08 +00002035 // outside of the system root as that can pick up unintended libraries.
Chandler Carruth9f314372012-04-06 16:32:06 +00002036 // This usually happens when there is an external cross compiler on the
2037 // host system, and a more minimal sysroot available that is the target of
2038 // the cross.
2039 if (StringRef(LibPath).startswith(SysRoot)) {
2040 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib/../" + Multilib,
2041 Paths);
2042 addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);
2043 addPathIfExists(LibPath + "/../" + Multilib, Paths);
2044 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00002045 }
Chandler Carruthd1f73062011-11-06 23:09:05 +00002046 addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);
2047 addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths);
2048 addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
2049 addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths);
2050
2051 // Try walking via the GCC triple path in case of multiarch GCC
2052 // installations with strange symlinks.
2053 if (GCCInstallation.isValid())
Chandler Carruthfa5be912012-01-24 19:28:29 +00002054 addPathIfExists(SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
Chandler Carruthd1f73062011-11-06 23:09:05 +00002055 "/../../" + Multilib, Paths);
Rafael Espindolac7409a02011-06-03 15:39:42 +00002056
Chandler Carruth7a09d012011-10-16 10:54:30 +00002057 // Add the non-multilib suffixed paths (if potentially different).
Chandler Carruth048e6492011-10-03 18:16:54 +00002058 if (GCCInstallation.isValid()) {
2059 const std::string &LibPath = GCCInstallation.getParentLibPath();
Chandler Carruthfa5be912012-01-24 19:28:29 +00002060 const llvm::Triple &GCCTriple = GCCInstallation.getTriple();
Chandler Carruth1c6f04a2012-01-25 07:21:38 +00002061 if (!GCCInstallation.getMultiarchSuffix().empty())
Chandler Carruth048e6492011-10-03 18:16:54 +00002062 addPathIfExists(GCCInstallation.getInstallPath(), Paths);
Chandler Carruth9f314372012-04-06 16:32:06 +00002063
2064 if (StringRef(LibPath).startswith(SysRoot)) {
2065 addPathIfExists(LibPath + "/../" + GCCTriple.str() + "/lib", Paths);
2066 addPathIfExists(LibPath, Paths);
2067 }
Chandler Carruthd2deee12011-10-03 05:28:29 +00002068 }
Chandler Carruthfde8d142011-10-03 06:41:08 +00002069 addPathIfExists(SysRoot + "/lib", Paths);
2070 addPathIfExists(SysRoot + "/usr/lib", Paths);
Rafael Espindolac1da9812010-11-07 20:14:31 +00002071}
2072
2073bool Linux::HasNativeLLVMSupport() const {
2074 return true;
Eli Friedman6b3454a2009-05-26 07:52:18 +00002075}
2076
Daniel Dunbarac0659a2011-03-18 20:14:00 +00002077Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
2078 const ActionList &Inputs) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00002079 Action::ActionClass Key;
2080 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
2081 Key = Action::AnalyzeJobClass;
2082 else
2083 Key = JA.getKind();
2084
Rafael Espindoladda5b922010-11-07 23:13:01 +00002085 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
2086 options::OPT_no_integrated_as,
2087 IsIntegratedAssemblerDefault());
2088
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00002089 Tool *&T = Tools[Key];
2090 if (!T) {
2091 switch (Key) {
2092 case Action::AssembleJobClass:
Rafael Espindoladda5b922010-11-07 23:13:01 +00002093 if (UseIntegratedAs)
2094 T = new tools::ClangAs(*this);
2095 else
2096 T = new tools::linuxtools::Assemble(*this);
2097 break;
Rafael Espindolac1da9812010-11-07 20:14:31 +00002098 case Action::LinkJobClass:
2099 T = new tools::linuxtools::Link(*this); break;
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00002100 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00002101 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00002102 }
2103 }
2104
2105 return *T;
2106}
2107
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002108void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
2109 ArgStringList &CC1Args) const {
2110 const Driver &D = getDriver();
2111
2112 if (DriverArgs.hasArg(options::OPT_nostdinc))
2113 return;
2114
2115 if (!DriverArgs.hasArg(options::OPT_nostdlibinc))
2116 addSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/local/include");
2117
2118 if (!DriverArgs.hasArg(options::OPT_nobuiltininc)) {
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002119 llvm::sys::Path P(D.ResourceDir);
2120 P.appendComponent("include");
Chandler Carruth07643082011-11-07 09:17:31 +00002121 addSystemInclude(DriverArgs, CC1Args, P.str());
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002122 }
2123
2124 if (DriverArgs.hasArg(options::OPT_nostdlibinc))
2125 return;
2126
2127 // Check for configure-time C include directories.
2128 StringRef CIncludeDirs(C_INCLUDE_DIRS);
2129 if (CIncludeDirs != "") {
2130 SmallVector<StringRef, 5> dirs;
2131 CIncludeDirs.split(dirs, ":");
2132 for (SmallVectorImpl<StringRef>::iterator I = dirs.begin(), E = dirs.end();
2133 I != E; ++I) {
2134 StringRef Prefix = llvm::sys::path::is_absolute(*I) ? D.SysRoot : "";
2135 addExternCSystemInclude(DriverArgs, CC1Args, Prefix + *I);
2136 }
2137 return;
2138 }
2139
2140 // Lacking those, try to detect the correct set of system includes for the
2141 // target triple.
2142
Chandler Carrutha4630892011-11-06 08:21:07 +00002143 // Implement generic Debian multiarch support.
2144 const StringRef X86_64MultiarchIncludeDirs[] = {
2145 "/usr/include/x86_64-linux-gnu",
2146
2147 // FIXME: These are older forms of multiarch. It's not clear that they're
2148 // in use in any released version of Debian, so we should consider
2149 // removing them.
2150 "/usr/include/i686-linux-gnu/64",
2151 "/usr/include/i486-linux-gnu/64"
2152 };
2153 const StringRef X86MultiarchIncludeDirs[] = {
2154 "/usr/include/i386-linux-gnu",
2155
2156 // FIXME: These are older forms of multiarch. It's not clear that they're
2157 // in use in any released version of Debian, so we should consider
2158 // removing them.
2159 "/usr/include/x86_64-linux-gnu/32",
2160 "/usr/include/i686-linux-gnu",
2161 "/usr/include/i486-linux-gnu"
2162 };
2163 const StringRef ARMMultiarchIncludeDirs[] = {
2164 "/usr/include/arm-linux-gnueabi"
2165 };
Eli Friedmand7df7852011-11-11 03:05:19 +00002166 const StringRef MIPSMultiarchIncludeDirs[] = {
2167 "/usr/include/mips-linux-gnu"
2168 };
2169 const StringRef MIPSELMultiarchIncludeDirs[] = {
2170 "/usr/include/mipsel-linux-gnu"
2171 };
Chandler Carruth079d2bb2012-02-26 09:21:43 +00002172 const StringRef PPCMultiarchIncludeDirs[] = {
2173 "/usr/include/powerpc-linux-gnu"
2174 };
2175 const StringRef PPC64MultiarchIncludeDirs[] = {
2176 "/usr/include/powerpc64-linux-gnu"
2177 };
Chandler Carrutha4630892011-11-06 08:21:07 +00002178 ArrayRef<StringRef> MultiarchIncludeDirs;
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002179 if (getTriple().getArch() == llvm::Triple::x86_64) {
Chandler Carrutha4630892011-11-06 08:21:07 +00002180 MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002181 } else if (getTriple().getArch() == llvm::Triple::x86) {
Chandler Carrutha4630892011-11-06 08:21:07 +00002182 MultiarchIncludeDirs = X86MultiarchIncludeDirs;
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002183 } else if (getTriple().getArch() == llvm::Triple::arm) {
Chandler Carrutha4630892011-11-06 08:21:07 +00002184 MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
Eli Friedmand7df7852011-11-11 03:05:19 +00002185 } else if (getTriple().getArch() == llvm::Triple::mips) {
2186 MultiarchIncludeDirs = MIPSMultiarchIncludeDirs;
2187 } else if (getTriple().getArch() == llvm::Triple::mipsel) {
2188 MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs;
Chandler Carruth079d2bb2012-02-26 09:21:43 +00002189 } else if (getTriple().getArch() == llvm::Triple::ppc) {
2190 MultiarchIncludeDirs = PPCMultiarchIncludeDirs;
2191 } else if (getTriple().getArch() == llvm::Triple::ppc64) {
2192 MultiarchIncludeDirs = PPC64MultiarchIncludeDirs;
Chandler Carrutha4630892011-11-06 08:21:07 +00002193 }
2194 for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
2195 E = MultiarchIncludeDirs.end();
2196 I != E; ++I) {
Chandler Carruthd936d9d2011-11-09 03:46:20 +00002197 if (llvm::sys::fs::exists(D.SysRoot + *I)) {
Chandler Carrutha4630892011-11-06 08:21:07 +00002198 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I);
2199 break;
2200 }
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002201 }
2202
2203 if (getTriple().getOS() == llvm::Triple::RTEMS)
2204 return;
2205
Chandler Carruthc44bc2d2011-11-08 17:19:47 +00002206 // Add an include of '/include' directly. This isn't provided by default by
2207 // system GCCs, but is often used with cross-compiling GCCs, and harmless to
2208 // add even when Clang is acting as-if it were a system compiler.
2209 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/include");
2210
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002211 addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + "/usr/include");
2212}
2213
Chandler Carruth79cbbdc2011-12-17 23:10:01 +00002214/// \brief Helper to add the thre variant paths for a libstdc++ installation.
2215/*static*/ bool Linux::addLibStdCXXIncludePaths(Twine Base, Twine TargetArchDir,
2216 const ArgList &DriverArgs,
2217 ArgStringList &CC1Args) {
Chandler Carruthabaa1d72011-11-06 10:31:01 +00002218 if (!llvm::sys::fs::exists(Base))
2219 return false;
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002220 addSystemInclude(DriverArgs, CC1Args, Base);
Chandler Carruthabaa1d72011-11-06 10:31:01 +00002221 addSystemInclude(DriverArgs, CC1Args, Base + "/" + TargetArchDir);
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002222 addSystemInclude(DriverArgs, CC1Args, Base + "/backward");
Chandler Carruthabaa1d72011-11-06 10:31:01 +00002223 return true;
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002224}
2225
2226void Linux::AddClangCXXStdlibIncludeArgs(const ArgList &DriverArgs,
2227 ArgStringList &CC1Args) const {
2228 if (DriverArgs.hasArg(options::OPT_nostdlibinc) ||
2229 DriverArgs.hasArg(options::OPT_nostdincxx))
2230 return;
2231
Chandler Carrutheb35ffc2011-11-07 09:01:17 +00002232 // Check if libc++ has been enabled and provide its include paths if so.
2233 if (GetCXXStdlibType(DriverArgs) == ToolChain::CST_Libcxx) {
2234 // libc++ is always installed at a fixed path on Linux currently.
2235 addSystemInclude(DriverArgs, CC1Args,
2236 getDriver().SysRoot + "/usr/include/c++/v1");
2237 return;
2238 }
2239
Chandler Carruthfc52f752012-01-25 08:04:13 +00002240 // We need a detected GCC installation on Linux to provide libstdc++'s
2241 // headers. We handled the libc++ case above.
2242 if (!GCCInstallation.isValid())
2243 return;
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002244
Chandler Carruthabaa1d72011-11-06 10:31:01 +00002245 // By default, look for the C++ headers in an include directory adjacent to
2246 // the lib directory of the GCC installation. Note that this is expect to be
2247 // equivalent to '/usr/include/c++/X.Y' in almost all cases.
2248 StringRef LibDir = GCCInstallation.getParentLibPath();
2249 StringRef InstallDir = GCCInstallation.getInstallPath();
2250 StringRef Version = GCCInstallation.getVersion();
2251 if (!addLibStdCXXIncludePaths(LibDir + "/../include/c++/" + Version,
Chandler Carruthfc52f752012-01-25 08:04:13 +00002252 (GCCInstallation.getTriple().str() +
2253 GCCInstallation.getMultiarchSuffix()),
Chandler Carruthabaa1d72011-11-06 10:31:01 +00002254 DriverArgs, CC1Args)) {
2255 // Gentoo is weird and places its headers inside the GCC install, so if the
2256 // first attempt to find the headers fails, try this pattern.
2257 addLibStdCXXIncludePaths(InstallDir + "/include/g++-v4",
Chandler Carruthfc52f752012-01-25 08:04:13 +00002258 (GCCInstallation.getTriple().str() +
2259 GCCInstallation.getMultiarchSuffix()),
Chandler Carruthabaa1d72011-11-06 10:31:01 +00002260 DriverArgs, CC1Args);
2261 }
Chandler Carruth7d7e9f92011-11-05 20:17:13 +00002262}
2263
Daniel Dunbar11e1b402009-05-02 18:28:39 +00002264/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
2265
Rafael Espindola0e659592012-02-19 01:38:32 +00002266DragonFly::DragonFly(const Driver &D, const llvm::Triple& Triple, const ArgList &Args)
2267 : Generic_ELF(D, Triple, Args) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00002268
2269 // Path mangling to find libexec
Daniel Dunbaredf29b02010-08-01 22:29:51 +00002270 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +00002271 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +00002272 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00002273
Daniel Dunbaree788e72009-12-21 18:54:17 +00002274 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00002275 getFilePaths().push_back("/usr/lib");
2276 getFilePaths().push_back("/usr/lib/gcc41");
2277}
2278
Daniel Dunbarac0659a2011-03-18 20:14:00 +00002279Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
2280 const ActionList &Inputs) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00002281 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00002282 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar11e1b402009-05-02 18:28:39 +00002283 Key = Action::AnalyzeJobClass;
2284 else
2285 Key = JA.getKind();
2286
2287 Tool *&T = Tools[Key];
2288 if (!T) {
2289 switch (Key) {
2290 case Action::AssembleJobClass:
2291 T = new tools::dragonfly::Assemble(*this); break;
2292 case Action::LinkJobClass:
2293 T = new tools::dragonfly::Link(*this); break;
2294 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00002295 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00002296 }
2297 }
2298
2299 return *T;
2300}