blob: f34423b278b0452a208e6931dea3d829525f9f3f [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
Rafael Espindola14ea13c2011-06-02 22:18:46 +000012#ifdef HAVE_CLANG_CONFIG_H
13# include "clang/Config/config.h"
14#endif
15
Daniel Dunbarf3cad362009-03-25 04:13:45 +000016#include "clang/Driver/Arg.h"
17#include "clang/Driver/ArgList.h"
Daniel Dunbar0f602de2010-05-20 21:48:38 +000018#include "clang/Driver/Compilation.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000019#include "clang/Driver/Driver.h"
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +000020#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000021#include "clang/Driver/HostInfo.h"
John McCall9f084a32011-07-06 00:26:06 +000022#include "clang/Driver/ObjCRuntime.h"
Daniel Dunbar27e738d2009-11-19 00:15:11 +000023#include "clang/Driver/OptTable.h"
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +000024#include "clang/Driver/Option.h"
Daniel Dunbar265e9ef2009-11-19 04:25:22 +000025#include "clang/Driver/Options.h"
Douglas Gregor34916db2010-09-03 17:16:03 +000026#include "clang/Basic/Version.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000027
Daniel Dunbar00577ad2010-08-23 22:35:37 +000028#include "llvm/ADT/SmallString.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000029#include "llvm/ADT/StringExtras.h"
John McCallf85e1932011-06-15 23:02:42 +000030#include "llvm/ADT/STLExtras.h"
Daniel Dunbar84ec96c2009-09-09 22:33:15 +000031#include "llvm/Support/ErrorHandling.h"
Michael J. Spencer32bef4e2011-01-10 02:34:13 +000032#include "llvm/Support/FileSystem.h"
Rafael Espindolac1da9812010-11-07 20:14:31 +000033#include "llvm/Support/MemoryBuffer.h"
Daniel Dunbarec069ed2009-03-25 06:58:31 +000034#include "llvm/Support/raw_ostream.h"
Michael J. Spencer03013fa2010-11-29 18:12:39 +000035#include "llvm/Support/Path.h"
Michael J. Spencer3a321e22010-12-09 17:36:38 +000036#include "llvm/Support/system_error.h"
Daniel Dunbarc50b00d2009-03-23 16:15:50 +000037
Daniel Dunbarf36a06a2009-04-10 21:00:07 +000038#include <cstdlib> // ::getenv
39
Dylan Noblesmith89bb6142011-06-23 13:50:47 +000040#include "llvm/Config/config.h" // for CXX_INCLUDE_ROOT
41
Daniel Dunbar39176082009-03-20 00:20:03 +000042using namespace clang::driver;
43using namespace clang::driver::toolchains;
Chris Lattner5f9e2722011-07-23 10:55:15 +000044using namespace clang;
Daniel Dunbar39176082009-03-20 00:20:03 +000045
Daniel Dunbarf3955282009-09-04 18:34:51 +000046/// Darwin - Darwin tool chain for i386 and x86_64.
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +000047
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000048Darwin::Darwin(const HostInfo &Host, const llvm::Triple& Triple)
John McCallf85e1932011-06-15 23:02:42 +000049 : ToolChain(Host, Triple), TargetInitialized(false),
50 ARCRuntimeForSimulator(ARCSimulator_None)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +000051{
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000052 // Compute the initial Darwin version based on the host.
53 bool HadExtra;
54 std::string OSName = Triple.getOSName();
Daniel Dunbar34f9e292011-02-25 21:20:15 +000055 if (!Driver::GetReleaseVersion(&OSName.c_str()[6],
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000056 DarwinVersion[0], DarwinVersion[1],
57 DarwinVersion[2], HadExtra))
Chris Lattner5f9e2722011-07-23 10:55:15 +000058 getDriver().Diag(diag::err_drv_invalid_darwin_version) << OSName;
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000059
Daniel Dunbar02633b52009-03-26 16:23:12 +000060 llvm::raw_string_ostream(MacosxVersionMin)
Daniel Dunbar25b58eb2010-08-02 05:44:07 +000061 << "10." << std::max(0, (int)DarwinVersion[0] - 4) << '.'
62 << DarwinVersion[1];
Daniel Dunbar1d4612b2009-09-18 08:15:13 +000063}
64
Daniel Dunbar41800112010-08-02 05:43:56 +000065types::ID Darwin::LookupTypeForExtension(const char *Ext) const {
66 types::ID Ty = types::lookupTypeForExtension(Ext);
67
68 // Darwin always preprocesses assembly files (unless -x is used explicitly).
69 if (Ty == types::TY_PP_Asm)
70 return types::TY_Asm;
71
72 return Ty;
73}
74
Daniel Dunbarb993f5d2010-09-17 00:24:52 +000075bool Darwin::HasNativeLLVMSupport() const {
76 return true;
77}
78
John McCall9f084a32011-07-06 00:26:06 +000079bool Darwin::hasARCRuntime() const {
John McCallf85e1932011-06-15 23:02:42 +000080 // FIXME: Remove this once there is a proper way to detect an ARC runtime
81 // for the simulator.
82 switch (ARCRuntimeForSimulator) {
83 case ARCSimulator_None:
84 break;
85 case ARCSimulator_HasARCRuntime:
86 return true;
87 case ARCSimulator_NoARCRuntime:
88 return false;
89 }
90
91 if (isTargetIPhoneOS())
92 return !isIPhoneOSVersionLT(5);
93 else
94 return !isMacosxVersionLT(10, 7);
95}
96
John McCall9f084a32011-07-06 00:26:06 +000097/// Darwin provides an ARC runtime starting in MacOS X 10.7 and iOS 5.0.
98void Darwin::configureObjCRuntime(ObjCRuntime &runtime) const {
99 if (runtime.getKind() != ObjCRuntime::NeXT)
100 return ToolChain::configureObjCRuntime(runtime);
101
102 runtime.HasARC = runtime.HasWeak = hasARCRuntime();
John McCall256a76e2011-07-06 01:22:26 +0000103
104 // So far, objc_terminate is only available in iOS 5.
105 // FIXME: do the simulator logic properly.
106 if (!ARCRuntimeForSimulator && isTargetIPhoneOS())
107 runtime.HasTerminate = !isIPhoneOSVersionLT(5);
108 else
109 runtime.HasTerminate = false;
John McCall9f084a32011-07-06 00:26:06 +0000110}
111
Daniel Dunbareeff4062010-01-22 02:04:58 +0000112// FIXME: Can we tablegen this?
Chris Lattner5f9e2722011-07-23 10:55:15 +0000113static const char *GetArmArchForMArch(StringRef Value) {
Daniel Dunbareeff4062010-01-22 02:04:58 +0000114 if (Value == "armv6k")
115 return "armv6";
116
117 if (Value == "armv5tej")
118 return "armv5";
119
120 if (Value == "xscale")
121 return "xscale";
122
123 if (Value == "armv4t")
124 return "armv4t";
125
126 if (Value == "armv7" || Value == "armv7-a" || Value == "armv7-r" ||
127 Value == "armv7-m" || Value == "armv7a" || Value == "armv7r" ||
128 Value == "armv7m")
129 return "armv7";
130
131 return 0;
132}
133
134// FIXME: Can we tablegen this?
Chris Lattner5f9e2722011-07-23 10:55:15 +0000135static const char *GetArmArchForMCpu(StringRef Value) {
Daniel Dunbareeff4062010-01-22 02:04:58 +0000136 if (Value == "arm10tdmi" || Value == "arm1020t" || Value == "arm9e" ||
137 Value == "arm946e-s" || Value == "arm966e-s" ||
138 Value == "arm968e-s" || Value == "arm10e" ||
139 Value == "arm1020e" || Value == "arm1022e" || Value == "arm926ej-s" ||
140 Value == "arm1026ej-s")
141 return "armv5";
142
143 if (Value == "xscale")
144 return "xscale";
145
146 if (Value == "arm1136j-s" || Value == "arm1136jf-s" ||
Bob Wilson1ec0ade2011-03-21 20:40:05 +0000147 Value == "arm1176jz-s" || Value == "arm1176jzf-s" ||
148 Value == "cortex-m0" )
Daniel Dunbareeff4062010-01-22 02:04:58 +0000149 return "armv6";
150
151 if (Value == "cortex-a8" || Value == "cortex-r4" || Value == "cortex-m3")
152 return "armv7";
153
154 return 0;
155}
156
Chris Lattner5f9e2722011-07-23 10:55:15 +0000157StringRef Darwin::getDarwinArchName(const ArgList &Args) const {
Daniel Dunbareeff4062010-01-22 02:04:58 +0000158 switch (getTriple().getArch()) {
159 default:
160 return getArchName();
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000161
Douglas Gregorf0594d82011-03-06 19:11:49 +0000162 case llvm::Triple::thumb:
Daniel Dunbareeff4062010-01-22 02:04:58 +0000163 case llvm::Triple::arm: {
164 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
165 if (const char *Arch = GetArmArchForMArch(A->getValue(Args)))
166 return Arch;
167
168 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
169 if (const char *Arch = GetArmArchForMCpu(A->getValue(Args)))
170 return Arch;
171
172 return "arm";
173 }
174 }
175}
176
Daniel Dunbarf3955282009-09-04 18:34:51 +0000177Darwin::~Darwin() {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000178 // Free tool implementations.
179 for (llvm::DenseMap<unsigned, Tool*>::iterator
180 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
181 delete it->second;
182}
183
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000184std::string Darwin::ComputeEffectiveClangTriple(const ArgList &Args) const {
185 llvm::Triple Triple(ComputeLLVMTriple(Args));
186
187 // If the target isn't initialized (e.g., an unknown Darwin platform, return
188 // the default triple).
189 if (!isTargetInitialized())
190 return Triple.getTriple();
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000191
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000192 unsigned Version[3];
193 getTargetVersion(Version);
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000194
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000195 llvm::SmallString<16> Str;
Daniel Dunbar729f38e2011-04-19 21:45:47 +0000196 llvm::raw_svector_ostream(Str)
Daniel Dunbar659d23a2011-04-19 23:34:17 +0000197 << (isTargetIPhoneOS() ? "ios" : "macosx")
Daniel Dunbar729f38e2011-04-19 21:45:47 +0000198 << Version[0] << "." << Version[1] << "." << Version[2];
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000199 Triple.setOSName(Str.str());
200
201 return Triple.getTriple();
202}
203
Daniel Dunbarac0659a2011-03-18 20:14:00 +0000204Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
205 const ActionList &Inputs) const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000206 Action::ActionClass Key;
Daniel Dunbar5ce872f2011-03-18 20:14:03 +0000207
208 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) {
209 // Fallback to llvm-gcc for i386 kext compiles, we don't support that ABI.
210 if (Inputs.size() == 1 &&
211 types::isCXX(Inputs[0]->getType()) &&
212 getTriple().getOS() == llvm::Triple::Darwin &&
213 getTriple().getArch() == llvm::Triple::x86 &&
214 C.getArgs().getLastArg(options::OPT_fapple_kext))
215 Key = JA.getKind();
216 else
217 Key = Action::AnalyzeJobClass;
218 } else
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000219 Key = JA.getKind();
220
Daniel Dunbar0f602de2010-05-20 21:48:38 +0000221 // FIXME: This doesn't belong here, but ideally we will support static soon
222 // anyway.
223 bool HasStatic = (C.getArgs().hasArg(options::OPT_mkernel) ||
224 C.getArgs().hasArg(options::OPT_static) ||
225 C.getArgs().hasArg(options::OPT_fapple_kext));
226 bool IsIADefault = IsIntegratedAssemblerDefault() && !HasStatic;
227 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
228 options::OPT_no_integrated_as,
229 IsIADefault);
230
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000231 Tool *&T = Tools[Key];
232 if (!T) {
233 switch (Key) {
234 case Action::InputClass:
235 case Action::BindArchClass:
236 assert(0 && "Invalid tool kind.");
237 case Action::PreprocessJobClass:
Daniel Dunbar9120f172009-03-29 22:27:40 +0000238 T = new tools::darwin::Preprocess(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000239 case Action::AnalyzeJobClass:
240 T = new tools::Clang(*this); break;
Daniel Dunbar9120f172009-03-29 22:27:40 +0000241 case Action::PrecompileJobClass:
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000242 case Action::CompileJobClass:
Daniel Dunbar9120f172009-03-29 22:27:40 +0000243 T = new tools::darwin::Compile(*this); break;
Daniel Dunbar0f602de2010-05-20 21:48:38 +0000244 case Action::AssembleJobClass: {
245 if (UseIntegratedAs)
246 T = new tools::ClangAs(*this);
247 else
248 T = new tools::darwin::Assemble(*this);
249 break;
250 }
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000251 case Action::LinkJobClass:
Daniel Dunbar8f289622009-09-04 17:39:02 +0000252 T = new tools::darwin::Link(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000253 case Action::LipoJobClass:
254 T = new tools::darwin::Lipo(*this); break;
Daniel Dunbar6e0f2542010-06-04 18:28:36 +0000255 case Action::DsymutilJobClass:
256 T = new tools::darwin::Dsymutil(*this); break;
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000257 }
258 }
259
260 return *T;
261}
262
Daniel Dunbar6cd41542009-09-18 08:15:03 +0000263
Daniel Dunbar25b58eb2010-08-02 05:44:07 +0000264DarwinClang::DarwinClang(const HostInfo &Host, const llvm::Triple& Triple)
265 : Darwin(Host, Triple)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000266{
Daniel Dunbar47023092011-03-18 19:25:15 +0000267 std::string UsrPrefix = "llvm-gcc-4.2/";
268
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000269 getProgramPaths().push_back(getDriver().getInstalledDir());
270 if (getDriver().getInstalledDir() != getDriver().Dir)
271 getProgramPaths().push_back(getDriver().Dir);
272
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000273 // We expect 'as', 'ld', etc. to be adjacent to our install dir.
Daniel Dunbaredf29b02010-08-01 22:29:51 +0000274 getProgramPaths().push_back(getDriver().getInstalledDir());
275 if (getDriver().getInstalledDir() != getDriver().Dir)
276 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000277
278 // For fallback, we need to know how to find the GCC cc1 executables, so we
Daniel Dunbar47023092011-03-18 19:25:15 +0000279 // also add the GCC libexec paths. This is legacy code that can be removed
280 // once fallback is no longer useful.
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000281 std::string ToolChainDir = "i686-apple-darwin";
282 ToolChainDir += llvm::utostr(DarwinVersion[0]);
283 ToolChainDir += "/4.2.1";
284
285 std::string Path = getDriver().Dir;
Daniel Dunbar47023092011-03-18 19:25:15 +0000286 Path += "/../" + UsrPrefix + "libexec/gcc/";
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000287 Path += ToolChainDir;
288 getProgramPaths().push_back(Path);
289
Daniel Dunbar47023092011-03-18 19:25:15 +0000290 Path = "/usr/" + UsrPrefix + "libexec/gcc/";
Daniel Dunbar0e50ee42010-09-17 08:22:12 +0000291 Path += ToolChainDir;
292 getProgramPaths().push_back(Path);
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000293}
294
295void DarwinClang::AddLinkSearchPathArgs(const ArgList &Args,
296 ArgStringList &CmdArgs) const {
297 // The Clang toolchain uses explicit paths for internal libraries.
Daniel Dunbar424b6612010-06-30 23:56:13 +0000298
299 // Unfortunately, we still might depend on a few of the libraries that are
300 // only available in the gcc library directory (in particular
301 // libstdc++.dylib). For now, hardcode the path to the known install location.
302 llvm::sys::Path P(getDriver().Dir);
303 P.eraseComponent(); // .../usr/bin -> ../usr
304 P.appendComponent("lib");
305 P.appendComponent("gcc");
306 switch (getTriple().getArch()) {
307 default:
308 assert(0 && "Invalid Darwin arch!");
309 case llvm::Triple::x86:
310 case llvm::Triple::x86_64:
311 P.appendComponent("i686-apple-darwin10");
312 break;
313 case llvm::Triple::arm:
314 case llvm::Triple::thumb:
315 P.appendComponent("arm-apple-darwin10");
316 break;
317 case llvm::Triple::ppc:
318 case llvm::Triple::ppc64:
319 P.appendComponent("powerpc-apple-darwin10");
320 break;
321 }
322 P.appendComponent("4.2.1");
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000323
324 // Determine the arch specific GCC subdirectory.
325 const char *ArchSpecificDir = 0;
326 switch (getTriple().getArch()) {
327 default:
328 break;
329 case llvm::Triple::arm:
Daniel Dunbar3a0e3922010-08-26 00:55:52 +0000330 case llvm::Triple::thumb: {
331 std::string Triple = ComputeLLVMTriple(Args);
Chris Lattner5f9e2722011-07-23 10:55:15 +0000332 StringRef TripleStr = Triple;
Daniel Dunbar3a0e3922010-08-26 00:55:52 +0000333 if (TripleStr.startswith("armv5") || TripleStr.startswith("thumbv5"))
334 ArchSpecificDir = "v5";
335 else if (TripleStr.startswith("armv6") || TripleStr.startswith("thumbv6"))
336 ArchSpecificDir = "v6";
337 else if (TripleStr.startswith("armv7") || TripleStr.startswith("thumbv7"))
338 ArchSpecificDir = "v7";
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000339 break;
Daniel Dunbar3a0e3922010-08-26 00:55:52 +0000340 }
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000341 case llvm::Triple::ppc64:
342 ArchSpecificDir = "ppc64";
343 break;
344 case llvm::Triple::x86_64:
345 ArchSpecificDir = "x86_64";
346 break;
347 }
348
349 if (ArchSpecificDir) {
350 P.appendComponent(ArchSpecificDir);
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000351 bool Exists;
352 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Daniel Dunbareab3bc42010-08-23 20:58:52 +0000353 CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
354 P.eraseComponent();
355 }
356
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000357 bool Exists;
358 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Daniel Dunbar424b6612010-06-30 23:56:13 +0000359 CmdArgs.push_back(Args.MakeArgString("-L" + P.str()));
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000360}
361
John McCallf85e1932011-06-15 23:02:42 +0000362void DarwinClang::AddLinkARCArgs(const ArgList &Args,
363 ArgStringList &CmdArgs) const {
364
365 CmdArgs.push_back("-force_load");
366 llvm::sys::Path P(getDriver().ClangExecutable);
367 P.eraseComponent(); // 'clang'
368 P.eraseComponent(); // 'bin'
369 P.appendComponent("lib");
370 P.appendComponent("arc");
371 P.appendComponent("libarclite_");
372 std::string s = P.str();
373 // Mash in the platform.
374 if (isTargetIPhoneOS())
375 s += "iphoneos";
376 // FIXME: isTargetIphoneOSSimulator() is not returning true.
377 else if (ARCRuntimeForSimulator != ARCSimulator_None)
378 s += "iphonesimulator";
379 else
380 s += "macosx";
381 s += ".a";
382
383 CmdArgs.push_back(Args.MakeArgString(s));
384}
385
Eric Christopher3404fe72011-06-22 17:41:40 +0000386void DarwinClang::AddLinkRuntimeLib(const ArgList &Args,
387 ArgStringList &CmdArgs,
388 const char *DarwinStaticLib) const {
389 llvm::sys::Path P(getDriver().ResourceDir);
390 P.appendComponent("lib");
391 P.appendComponent("darwin");
392 P.appendComponent(DarwinStaticLib);
393
394 // For now, allow missing resource libraries to support developers who may
395 // not have compiler-rt checked out or integrated into their build.
396 bool Exists;
397 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
398 CmdArgs.push_back(Args.MakeArgString(P.str()));
399}
400
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000401void DarwinClang::AddLinkRuntimeLibArgs(const ArgList &Args,
402 ArgStringList &CmdArgs) const {
Daniel Dunbareec99102010-01-22 03:38:14 +0000403 // Darwin doesn't support real static executables, don't link any runtime
404 // libraries with -static.
405 if (Args.hasArg(options::OPT_static))
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000406 return;
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000407
408 // Reject -static-libgcc for now, we can deal with this when and if someone
409 // cares. This is useful in situations where someone wants to statically link
410 // something like libstdc++, and needs its runtime support routines.
411 if (const Arg *A = Args.getLastArg(options::OPT_static_libgcc)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000412 getDriver().Diag(diag::err_drv_unsupported_opt)
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000413 << A->getAsString(Args);
414 return;
415 }
416
Daniel Dunbareec99102010-01-22 03:38:14 +0000417 // Otherwise link libSystem, then the dynamic runtime library, and finally any
418 // target specific static runtime library.
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000419 CmdArgs.push_back("-lSystem");
Daniel Dunbareec99102010-01-22 03:38:14 +0000420
421 // Select the dynamic runtime library and the target specific static library.
Daniel Dunbar251ca6c2010-01-27 00:56:37 +0000422 if (isTargetIPhoneOS()) {
Daniel Dunbar87e945f2011-04-30 04:25:16 +0000423 // If we are compiling as iOS / simulator, don't attempt to link libgcc_s.1,
424 // it never went into the SDK.
425 if (!isTargetIOSSimulator())
426 CmdArgs.push_back("-lgcc_s.1");
Daniel Dunbareec99102010-01-22 03:38:14 +0000427
Daniel Dunbar3cceec52011-04-18 23:48:36 +0000428 // We currently always need a static runtime library for iOS.
Eric Christopher3404fe72011-06-22 17:41:40 +0000429 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.ios.a");
Daniel Dunbareec99102010-01-22 03:38:14 +0000430 } else {
Daniel Dunbareec99102010-01-22 03:38:14 +0000431 // The dynamic runtime library was merged with libSystem for 10.6 and
432 // beyond; only 10.4 and 10.5 need an additional runtime library.
Daniel Dunbarce3fdf22010-01-27 00:57:03 +0000433 if (isMacosxVersionLT(10, 5))
Daniel Dunbareec99102010-01-22 03:38:14 +0000434 CmdArgs.push_back("-lgcc_s.10.4");
Daniel Dunbarce3fdf22010-01-27 00:57:03 +0000435 else if (isMacosxVersionLT(10, 6))
Daniel Dunbareec99102010-01-22 03:38:14 +0000436 CmdArgs.push_back("-lgcc_s.10.5");
437
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000438 // For OS X, we thought we would only need a static runtime library when
Chris Lattnerfc8f0e12011-04-15 05:22:18 +0000439 // targeting 10.4, to provide versions of the static functions which were
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000440 // omitted from 10.4.dylib.
441 //
442 // Unfortunately, that turned out to not be true, because Darwin system
443 // headers can still use eprintf on i386, and it is not exported from
444 // libSystem. Therefore, we still must provide a runtime library just for
445 // the tiny tiny handful of projects that *might* use that symbol.
446 if (isMacosxVersionLT(10, 5)) {
Eric Christopher3404fe72011-06-22 17:41:40 +0000447 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.10.4.a");
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000448 } else {
449 if (getTriple().getArch() == llvm::Triple::x86)
Eric Christopher3404fe72011-06-22 17:41:40 +0000450 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.eprintf.a");
451 AddLinkRuntimeLib(Args, CmdArgs, "libclang_rt.osx.a");
Daniel Dunbar885b1db2010-09-22 00:03:52 +0000452 }
Daniel Dunbareec99102010-01-22 03:38:14 +0000453 }
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000454}
455
Chris Lattner5f9e2722011-07-23 10:55:15 +0000456static inline StringRef SimulatorVersionDefineName() {
John McCallf85e1932011-06-15 23:02:42 +0000457 return "__IPHONE_OS_VERSION_MIN_REQUIRED";
458}
459
460/// \brief Parse the simulator version define:
461/// __IPHONE_OS_VERSION_MIN_REQUIRED=([0-9])([0-9][0-9])([0-9][0-9])
462// and return the grouped values as integers, e.g:
463// __IPHONE_OS_VERSION_MIN_REQUIRED=40201
464// will return Major=4, Minor=2, Micro=1.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000465static bool GetVersionFromSimulatorDefine(StringRef define,
John McCallf85e1932011-06-15 23:02:42 +0000466 unsigned &Major, unsigned &Minor,
467 unsigned &Micro) {
468 assert(define.startswith(SimulatorVersionDefineName()));
Chris Lattner5f9e2722011-07-23 10:55:15 +0000469 StringRef name, version;
John McCallf85e1932011-06-15 23:02:42 +0000470 llvm::tie(name, version) = define.split('=');
471 if (version.empty())
472 return false;
473 std::string verstr = version.str();
474 char *end;
475 unsigned num = (unsigned) strtol(verstr.c_str(), &end, 10);
476 if (*end != '\0')
477 return false;
478 Major = num / 10000;
479 num = num % 10000;
480 Minor = num / 100;
481 Micro = num % 100;
482 return true;
483}
484
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000485void Darwin::AddDeploymentTarget(DerivedArgList &Args) const {
Daniel Dunbaree788e72009-12-21 18:54:17 +0000486 const OptTable &Opts = getDriver().getOpts();
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000487
Daniel Dunbar26031372010-01-27 00:56:25 +0000488 Arg *OSXVersion = Args.getLastArg(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000489 Arg *iOSVersion = Args.getLastArg(options::OPT_miphoneos_version_min_EQ);
490 Arg *iOSSimVersion = Args.getLastArg(
491 options::OPT_mios_simulator_version_min_EQ);
John McCallf85e1932011-06-15 23:02:42 +0000492
Chad Rosier98fdfd32011-08-08 23:39:34 +0000493 // If no '-miphoneos-version-min' specified, see if we can set the default
494 // based on isysroot.
495 if (!iOSVersion) {
496 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
497 StringRef first, second;
498 StringRef isysroot = A->getValue(Args);
499 llvm::tie(first, second) = isysroot.split(StringRef("SDKs/iPhoneOS"));
500 if (second != "") {
501 const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
502 iOSVersion = Args.MakeJoinedArg(0, O, second.substr(0,3));
503 Args.append(iOSVersion);
504 }
505 }
506 }
507
John McCallf85e1932011-06-15 23:02:42 +0000508 // FIXME: HACK! When compiling for the simulator we don't get a
509 // '-miphoneos-version-min' to help us know whether there is an ARC runtime
510 // or not; try to parse a __IPHONE_OS_VERSION_MIN_REQUIRED
511 // define passed in command-line.
512 if (!iOSVersion) {
513 for (arg_iterator it = Args.filtered_begin(options::OPT_D),
514 ie = Args.filtered_end(); it != ie; ++it) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000515 StringRef define = (*it)->getValue(Args);
John McCallf85e1932011-06-15 23:02:42 +0000516 if (define.startswith(SimulatorVersionDefineName())) {
517 unsigned Major, Minor, Micro;
518 if (GetVersionFromSimulatorDefine(define, Major, Minor, Micro) &&
519 Major < 10 && Minor < 100 && Micro < 100) {
520 ARCRuntimeForSimulator = Major < 5 ? ARCSimulator_NoARCRuntime
521 : ARCSimulator_HasARCRuntime;
522 }
523 break;
524 }
525 }
526 }
527
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000528 if (OSXVersion && (iOSVersion || iOSSimVersion)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000529 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarff8857a2009-04-10 20:11:50 +0000530 << OSXVersion->getAsString(Args)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000531 << (iOSVersion ? iOSVersion : iOSSimVersion)->getAsString(Args);
532 iOSVersion = iOSSimVersion = 0;
533 } else if (iOSVersion && iOSSimVersion) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000534 getDriver().Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000535 << iOSVersion->getAsString(Args)
536 << iOSSimVersion->getAsString(Args);
537 iOSSimVersion = 0;
538 } else if (!OSXVersion && !iOSVersion && !iOSSimVersion) {
539 // If not deployment target was specified on the command line, check for
Daniel Dunbar816bc312010-01-26 01:45:19 +0000540 // environment defines.
541 const char *OSXTarget = ::getenv("MACOSX_DEPLOYMENT_TARGET");
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000542 const char *iOSTarget = ::getenv("IPHONEOS_DEPLOYMENT_TARGET");
543 const char *iOSSimTarget = ::getenv("IOS_SIMULATOR_DEPLOYMENT_TARGET");
Daniel Dunbarf36a06a2009-04-10 21:00:07 +0000544
Daniel Dunbar816bc312010-01-26 01:45:19 +0000545 // Ignore empty strings.
546 if (OSXTarget && OSXTarget[0] == '\0')
547 OSXTarget = 0;
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000548 if (iOSTarget && iOSTarget[0] == '\0')
549 iOSTarget = 0;
550 if (iOSSimTarget && iOSSimTarget[0] == '\0')
551 iOSSimTarget = 0;
Daniel Dunbar816bc312010-01-26 01:45:19 +0000552
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000553 // Handle conflicting deployment targets
Daniel Dunbar39053672010-02-02 17:31:12 +0000554 //
555 // FIXME: Don't hardcode default here.
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000556
557 // Do not allow conflicts with the iOS simulator target.
558 if (iOSSimTarget && (OSXTarget || iOSTarget)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000559 getDriver().Diag(diag::err_drv_conflicting_deployment_targets)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000560 << "IOS_SIMULATOR_DEPLOYMENT_TARGET"
561 << (OSXTarget ? "MACOSX_DEPLOYMENT_TARGET" :
562 "IPHONEOS_DEPLOYMENT_TARGET");
563 }
564
565 // Allow conflicts among OSX and iOS for historical reasons, but choose the
566 // default platform.
567 if (OSXTarget && iOSTarget) {
Daniel Dunbar39053672010-02-02 17:31:12 +0000568 if (getTriple().getArch() == llvm::Triple::arm ||
569 getTriple().getArch() == llvm::Triple::thumb)
Daniel Dunbar84d1e6e2010-03-20 08:47:42 +0000570 OSXTarget = 0;
Daniel Dunbar39053672010-02-02 17:31:12 +0000571 else
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000572 iOSTarget = 0;
Daniel Dunbar39053672010-02-02 17:31:12 +0000573 }
Daniel Dunbar1a3c1d92010-01-29 17:02:25 +0000574
Daniel Dunbar39053672010-02-02 17:31:12 +0000575 if (OSXTarget) {
Daniel Dunbar30392de2009-09-04 18:35:21 +0000576 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000577 OSXVersion = Args.MakeJoinedArg(0, O, OSXTarget);
578 Args.append(OSXVersion);
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000579 } else if (iOSTarget) {
Daniel Dunbar30392de2009-09-04 18:35:21 +0000580 const Option *O = Opts.getOption(options::OPT_miphoneos_version_min_EQ);
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000581 iOSVersion = Args.MakeJoinedArg(0, O, iOSTarget);
582 Args.append(iOSVersion);
583 } else if (iOSSimTarget) {
584 const Option *O = Opts.getOption(
585 options::OPT_mios_simulator_version_min_EQ);
586 iOSSimVersion = Args.MakeJoinedArg(0, O, iOSSimTarget);
587 Args.append(iOSSimVersion);
Daniel Dunbar816bc312010-01-26 01:45:19 +0000588 } else {
Daniel Dunbar2bb38d02010-07-15 16:18:06 +0000589 // Otherwise, assume we are targeting OS X.
590 const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000591 OSXVersion = Args.MakeJoinedArg(0, O, MacosxVersionMin);
592 Args.append(OSXVersion);
Daniel Dunbar30392de2009-09-04 18:35:21 +0000593 }
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000594 }
Mike Stump1eb44332009-09-09 15:08:12 +0000595
Daniel Dunbar3fd823b2011-04-30 04:20:40 +0000596 // Reject invalid architecture combinations.
597 if (iOSSimVersion && (getTriple().getArch() != llvm::Triple::x86 &&
598 getTriple().getArch() != llvm::Triple::x86_64)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000599 getDriver().Diag(diag::err_drv_invalid_arch_for_deployment_target)
Daniel Dunbar3fd823b2011-04-30 04:20:40 +0000600 << getTriple().getArchName() << iOSSimVersion->getAsString(Args);
601 }
602
Daniel Dunbar26031372010-01-27 00:56:25 +0000603 // Set the tool chain target information.
604 unsigned Major, Minor, Micro;
605 bool HadExtra;
606 if (OSXVersion) {
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000607 assert((!iOSVersion && !iOSSimVersion) && "Unknown target platform!");
Daniel Dunbar26031372010-01-27 00:56:25 +0000608 if (!Driver::GetReleaseVersion(OSXVersion->getValue(Args), Major, Minor,
609 Micro, HadExtra) || HadExtra ||
Daniel Dunbar8a3a7f32011-04-21 21:27:33 +0000610 Major != 10 || Minor >= 100 || Micro >= 100)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000611 getDriver().Diag(diag::err_drv_invalid_version_number)
Daniel Dunbar26031372010-01-27 00:56:25 +0000612 << OSXVersion->getAsString(Args);
613 } else {
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000614 const Arg *Version = iOSVersion ? iOSVersion : iOSSimVersion;
615 assert(Version && "Unknown target platform!");
616 if (!Driver::GetReleaseVersion(Version->getValue(Args), Major, Minor,
Daniel Dunbar26031372010-01-27 00:56:25 +0000617 Micro, HadExtra) || HadExtra ||
618 Major >= 10 || Minor >= 100 || Micro >= 100)
Chris Lattner5f9e2722011-07-23 10:55:15 +0000619 getDriver().Diag(diag::err_drv_invalid_version_number)
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000620 << Version->getAsString(Args);
Daniel Dunbar26031372010-01-27 00:56:25 +0000621 }
Daniel Dunbar9d609f22011-04-30 04:15:58 +0000622
Daniel Dunbar5f5c37b2011-04-30 04:18:16 +0000623 bool IsIOSSim = bool(iOSSimVersion);
624
625 // In GCC, the simulator historically was treated as being OS X in some
626 // contexts, like determining the link logic, despite generally being called
627 // with an iOS deployment target. For compatibility, we detect the
628 // simulator as iOS + x86, and treat it differently in a few contexts.
629 if (iOSVersion && (getTriple().getArch() == llvm::Triple::x86 ||
630 getTriple().getArch() == llvm::Triple::x86_64))
631 IsIOSSim = true;
632
633 setTarget(/*IsIPhoneOS=*/ !OSXVersion, Major, Minor, Micro, IsIOSSim);
Daniel Dunbarc0e665e2010-07-19 17:11:33 +0000634}
635
Daniel Dunbar132e35d2010-09-17 01:20:05 +0000636void DarwinClang::AddCXXStdlibLibArgs(const ArgList &Args,
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000637 ArgStringList &CmdArgs) const {
638 CXXStdlibType Type = GetCXXStdlibType(Args);
639
640 switch (Type) {
641 case ToolChain::CST_Libcxx:
642 CmdArgs.push_back("-lc++");
643 break;
644
645 case ToolChain::CST_Libstdcxx: {
646 // Unfortunately, -lstdc++ doesn't always exist in the standard search path;
647 // it was previously found in the gcc lib dir. However, for all the Darwin
648 // platforms we care about it was -lstdc++.6, so we search for that
649 // explicitly if we can't see an obvious -lstdc++ candidate.
650
651 // Check in the sysroot first.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000652 bool Exists;
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000653 if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
654 llvm::sys::Path P(A->getValue(Args));
655 P.appendComponent("usr");
656 P.appendComponent("lib");
657 P.appendComponent("libstdc++.dylib");
658
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000659 if (llvm::sys::fs::exists(P.str(), Exists) || !Exists) {
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000660 P.eraseComponent();
661 P.appendComponent("libstdc++.6.dylib");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000662 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists) {
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000663 CmdArgs.push_back(Args.MakeArgString(P.str()));
664 return;
665 }
666 }
667 }
668
669 // Otherwise, look in the root.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000670 if ((llvm::sys::fs::exists("/usr/lib/libstdc++.dylib", Exists) || !Exists)&&
671 (!llvm::sys::fs::exists("/usr/lib/libstdc++.6.dylib", Exists) && Exists)){
Daniel Dunbarefe91ea2010-09-17 01:16:06 +0000672 CmdArgs.push_back("/usr/lib/libstdc++.6.dylib");
673 return;
674 }
675
676 // Otherwise, let the linker search.
677 CmdArgs.push_back("-lstdc++");
678 break;
679 }
680 }
681}
682
Shantonu Sen7433fed2010-09-17 18:39:08 +0000683void DarwinClang::AddCCKextLibArgs(const ArgList &Args,
684 ArgStringList &CmdArgs) const {
685
686 // For Darwin platforms, use the compiler-rt-based support library
687 // instead of the gcc-provided one (which is also incidentally
688 // only present in the gcc lib dir, which makes it hard to find).
689
690 llvm::sys::Path P(getDriver().ResourceDir);
691 P.appendComponent("lib");
692 P.appendComponent("darwin");
693 P.appendComponent("libclang_rt.cc_kext.a");
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000694
Shantonu Sen7433fed2010-09-17 18:39:08 +0000695 // For now, allow missing resource libraries to support developers who may
696 // not have compiler-rt checked out or integrated into their build.
Michael J. Spencer32bef4e2011-01-10 02:34:13 +0000697 bool Exists;
698 if (!llvm::sys::fs::exists(P.str(), Exists) && Exists)
Shantonu Sen7433fed2010-09-17 18:39:08 +0000699 CmdArgs.push_back(Args.MakeArgString(P.str()));
700}
701
Daniel Dunbarc0e665e2010-07-19 17:11:33 +0000702DerivedArgList *Darwin::TranslateArgs(const DerivedArgList &Args,
703 const char *BoundArch) const {
704 DerivedArgList *DAL = new DerivedArgList(Args.getBaseArgs());
705 const OptTable &Opts = getDriver().getOpts();
706
707 // FIXME: We really want to get out of the tool chain level argument
708 // translation business, as it makes the driver functionality much
709 // more opaque. For now, we follow gcc closely solely for the
710 // purpose of easily achieving feature parity & testability. Once we
711 // have something that works, we should reevaluate each translation
712 // and try to push it down into tool specific logic.
Daniel Dunbar26031372010-01-27 00:56:25 +0000713
Daniel Dunbar279c1db2010-06-11 22:00:26 +0000714 for (ArgList::const_iterator it = Args.begin(),
715 ie = Args.end(); it != ie; ++it) {
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000716 Arg *A = *it;
717
718 if (A->getOption().matches(options::OPT_Xarch__)) {
Daniel Dunbar2a45fa72011-06-21 00:20:17 +0000719 // Skip this argument unless the architecture matches either the toolchain
720 // triple arch, or the arch being bound.
721 //
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000722 // FIXME: Canonicalize name.
Chris Lattner5f9e2722011-07-23 10:55:15 +0000723 StringRef XarchArch = A->getValue(Args, 0);
Daniel Dunbar2a45fa72011-06-21 00:20:17 +0000724 if (!(XarchArch == getArchName() ||
725 (BoundArch && XarchArch == BoundArch)))
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000726 continue;
727
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000728 Arg *OriginalArg = A;
Daniel Dunbar0e100312010-06-14 21:23:08 +0000729 unsigned Index = Args.getBaseArgs().MakeIndex(A->getValue(Args, 1));
730 unsigned Prev = Index;
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000731 Arg *XarchArg = Opts.ParseOneArg(Args, Index);
Mike Stump1eb44332009-09-09 15:08:12 +0000732
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000733 // If the argument parsing failed or more than one argument was
734 // consumed, the -Xarch_ argument's parameter tried to consume
735 // extra arguments. Emit an error and ignore.
736 //
737 // We also want to disallow any options which would alter the
738 // driver behavior; that isn't going to work in our model. We
739 // use isDriverOption() as an approximation, although things
740 // like -O4 are going to slip through.
Daniel Dunbar0e02f6e2011-04-21 17:41:34 +0000741 if (!XarchArg || Index > Prev + 1) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000742 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_with_args)
Daniel Dunbar7e9293b2011-04-21 17:32:21 +0000743 << A->getAsString(Args);
744 continue;
745 } else if (XarchArg->getOption().isDriverOption()) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000746 getDriver().Diag(diag::err_drv_invalid_Xarch_argument_isdriver)
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000747 << A->getAsString(Args);
748 continue;
749 }
750
Daniel Dunbar478edc22009-03-29 22:29:05 +0000751 XarchArg->setBaseArg(A);
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000752 A = XarchArg;
Daniel Dunbar0e100312010-06-14 21:23:08 +0000753
754 DAL->AddSynthesizedArg(A);
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000755
756 // Linker input arguments require custom handling. The problem is that we
757 // have already constructed the phase actions, so we can not treat them as
758 // "input arguments".
759 if (A->getOption().isLinkerInput()) {
760 // Convert the argument into individual Zlinker_input_args.
761 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
762 DAL->AddSeparateArg(OriginalArg,
763 Opts.getOption(options::OPT_Zlinker_input),
764 A->getValue(Args, i));
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +0000765
Daniel Dunbar8ac38d72011-02-19 05:33:51 +0000766 }
767 continue;
768 }
Mike Stump1eb44332009-09-09 15:08:12 +0000769 }
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000770
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000771 // Sob. These is strictly gcc compatible for the time being. Apple
772 // gcc translates options twice, which means that self-expanding
773 // options add duplicates.
Daniel Dunbar9e1f9822009-11-19 04:14:53 +0000774 switch ((options::ID) A->getOption().getID()) {
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000775 default:
776 DAL->append(A);
777 break;
778
779 case options::OPT_mkernel:
780 case options::OPT_fapple_kext:
781 DAL->append(A);
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000782 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
783 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000784 break;
Mike Stump1eb44332009-09-09 15:08:12 +0000785
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000786 case options::OPT_dependency_file:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000787 DAL->AddSeparateArg(A, Opts.getOption(options::OPT_MF),
788 A->getValue(Args));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000789 break;
790
791 case options::OPT_gfull:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000792 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
793 DAL->AddFlagArg(A,
794 Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000795 break;
796
797 case options::OPT_gused:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000798 DAL->AddFlagArg(A, Opts.getOption(options::OPT_g_Flag));
799 DAL->AddFlagArg(A,
800 Opts.getOption(options::OPT_feliminate_unused_debug_symbols));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000801 break;
802
803 case options::OPT_fterminated_vtables:
804 case options::OPT_findirect_virtual_calls:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000805 DAL->AddFlagArg(A, Opts.getOption(options::OPT_fapple_kext));
806 DAL->AddFlagArg(A, Opts.getOption(options::OPT_static));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000807 break;
808
809 case options::OPT_shared:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000810 DAL->AddFlagArg(A, Opts.getOption(options::OPT_dynamiclib));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000811 break;
812
813 case options::OPT_fconstant_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000814 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mconstant_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000815 break;
816
817 case options::OPT_fno_constant_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000818 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_constant_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000819 break;
820
821 case options::OPT_Wnonportable_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000822 DAL->AddFlagArg(A,
823 Opts.getOption(options::OPT_mwarn_nonportable_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000824 break;
825
826 case options::OPT_Wno_nonportable_cfstrings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000827 DAL->AddFlagArg(A,
828 Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000829 break;
830
831 case options::OPT_fpascal_strings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000832 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mpascal_strings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000833 break;
834
835 case options::OPT_fno_pascal_strings:
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000836 DAL->AddFlagArg(A, Opts.getOption(options::OPT_mno_pascal_strings));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000837 break;
838 }
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000839 }
840
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000841 if (getTriple().getArch() == llvm::Triple::x86 ||
842 getTriple().getArch() == llvm::Triple::x86_64)
Daniel Dunbare4bdae72009-11-19 04:00:53 +0000843 if (!Args.hasArgNoClaim(options::OPT_mtune_EQ))
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000844 DAL->AddJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ), "core2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000845
846 // Add the arch options based on the particular spelling of -arch, to match
847 // how the driver driver works.
848 if (BoundArch) {
Chris Lattner5f9e2722011-07-23 10:55:15 +0000849 StringRef Name = BoundArch;
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000850 const Option *MCpu = Opts.getOption(options::OPT_mcpu_EQ);
851 const Option *MArch = Opts.getOption(options::OPT_march_EQ);
852
853 // This code must be kept in sync with LLVM's getArchTypeForDarwinArch,
854 // which defines the list of which architectures we accept.
855 if (Name == "ppc")
856 ;
857 else if (Name == "ppc601")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000858 DAL->AddJoinedArg(0, MCpu, "601");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000859 else if (Name == "ppc603")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000860 DAL->AddJoinedArg(0, MCpu, "603");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000861 else if (Name == "ppc604")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000862 DAL->AddJoinedArg(0, MCpu, "604");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000863 else if (Name == "ppc604e")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000864 DAL->AddJoinedArg(0, MCpu, "604e");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000865 else if (Name == "ppc750")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000866 DAL->AddJoinedArg(0, MCpu, "750");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000867 else if (Name == "ppc7400")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000868 DAL->AddJoinedArg(0, MCpu, "7400");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000869 else if (Name == "ppc7450")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000870 DAL->AddJoinedArg(0, MCpu, "7450");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000871 else if (Name == "ppc970")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000872 DAL->AddJoinedArg(0, MCpu, "970");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000873
874 else if (Name == "ppc64")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000875 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000876
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000877 else if (Name == "i386")
878 ;
879 else if (Name == "i486")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000880 DAL->AddJoinedArg(0, MArch, "i486");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000881 else if (Name == "i586")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000882 DAL->AddJoinedArg(0, MArch, "i586");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000883 else if (Name == "i686")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000884 DAL->AddJoinedArg(0, MArch, "i686");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000885 else if (Name == "pentium")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000886 DAL->AddJoinedArg(0, MArch, "pentium");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000887 else if (Name == "pentium2")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000888 DAL->AddJoinedArg(0, MArch, "pentium2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000889 else if (Name == "pentpro")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000890 DAL->AddJoinedArg(0, MArch, "pentiumpro");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000891 else if (Name == "pentIIm3")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000892 DAL->AddJoinedArg(0, MArch, "pentium2");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000893
894 else if (Name == "x86_64")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000895 DAL->AddFlagArg(0, Opts.getOption(options::OPT_m64));
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000896
897 else if (Name == "arm")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000898 DAL->AddJoinedArg(0, MArch, "armv4t");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000899 else if (Name == "armv4t")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000900 DAL->AddJoinedArg(0, MArch, "armv4t");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000901 else if (Name == "armv5")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000902 DAL->AddJoinedArg(0, MArch, "armv5tej");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000903 else if (Name == "xscale")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000904 DAL->AddJoinedArg(0, MArch, "xscale");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000905 else if (Name == "armv6")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000906 DAL->AddJoinedArg(0, MArch, "armv6k");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000907 else if (Name == "armv7")
Daniel Dunbar9d0863b2010-06-14 20:20:41 +0000908 DAL->AddJoinedArg(0, MArch, "armv7a");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000909
910 else
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +0000911 llvm_unreachable("invalid Darwin arch");
Daniel Dunbar84ec96c2009-09-09 22:33:15 +0000912 }
Daniel Dunbarec069ed2009-03-25 06:58:31 +0000913
Daniel Dunbar60baf0f2010-07-19 17:11:36 +0000914 // Add an explicit version min argument for the deployment target. We do this
915 // after argument translation because -Xarch_ arguments may add a version min
916 // argument.
917 AddDeploymentTarget(*DAL);
918
Daniel Dunbar4e7e9cf2009-03-25 06:12:34 +0000919 return DAL;
Mike Stump1eb44332009-09-09 15:08:12 +0000920}
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000921
Daniel Dunbarf3955282009-09-04 18:34:51 +0000922bool Darwin::IsUnwindTablesDefault() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000923 // FIXME: Gross; we should probably have some separate target
924 // definition, possibly even reusing the one in clang.
925 return getArchName() == "x86_64";
926}
927
Daniel Dunbarf2d8b9f2009-12-18 02:43:17 +0000928bool Darwin::UseDwarfDebugFlags() const {
929 if (const char *S = ::getenv("RC_DEBUG_OPTIONS"))
930 return S[0] != '\0';
931 return false;
932}
933
Daniel Dunbarb2987d12010-02-10 18:49:11 +0000934bool Darwin::UseSjLjExceptions() const {
935 // Darwin uses SjLj exceptions on ARM.
936 return (getTriple().getArch() == llvm::Triple::arm ||
937 getTriple().getArch() == llvm::Triple::thumb);
938}
939
Daniel Dunbarf3955282009-09-04 18:34:51 +0000940const char *Darwin::GetDefaultRelocationModel() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000941 return "pic";
942}
943
Daniel Dunbarf3955282009-09-04 18:34:51 +0000944const char *Darwin::GetForcedPicModel() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000945 if (getArchName() == "x86_64")
946 return "pic";
947 return 0;
948}
949
Daniel Dunbarbbe8e3e2011-03-01 18:49:30 +0000950bool Darwin::SupportsProfiling() const {
951 // Profiling instrumentation is only supported on x86.
952 return getArchName() == "i386" || getArchName() == "x86_64";
953}
954
Daniel Dunbar43a9b322010-04-10 16:20:23 +0000955bool Darwin::SupportsObjCGC() const {
956 // Garbage collection is supported everywhere except on iPhone OS.
957 return !isTargetIPhoneOS();
958}
959
Daniel Dunbar00577ad2010-08-23 22:35:37 +0000960std::string
961Darwin_Generic_GCC::ComputeEffectiveClangTriple(const ArgList &Args) const {
962 return ComputeLLVMTriple(Args);
963}
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
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000969Generic_GCC::Generic_GCC(const HostInfo &Host, const llvm::Triple& Triple)
Mike Stump1eb44332009-09-09 15:08:12 +0000970 : ToolChain(Host, Triple) {
Daniel Dunbaredf29b02010-08-01 22:29:51 +0000971 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +0000972 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +0000973 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbarc50b00d2009-03-23 16:15:50 +0000974}
975
Daniel Dunbar39176082009-03-20 00:20:03 +0000976Generic_GCC::~Generic_GCC() {
977 // Free tool implementations.
978 for (llvm::DenseMap<unsigned, Tool*>::iterator
979 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
980 delete it->second;
981}
982
Mike Stump1eb44332009-09-09 15:08:12 +0000983Tool &Generic_GCC::SelectTool(const Compilation &C,
Daniel Dunbarac0659a2011-03-18 20:14:00 +0000984 const JobAction &JA,
985 const ActionList &Inputs) const {
Daniel Dunbar39176082009-03-20 00:20:03 +0000986 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +0000987 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar39176082009-03-20 00:20:03 +0000988 Key = Action::AnalyzeJobClass;
989 else
990 Key = JA.getKind();
991
992 Tool *&T = Tools[Key];
993 if (!T) {
994 switch (Key) {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +0000995 case Action::InputClass:
996 case Action::BindArchClass:
Daniel Dunbar39176082009-03-20 00:20:03 +0000997 assert(0 && "Invalid tool kind.");
998 case Action::PreprocessJobClass:
999 T = new tools::gcc::Preprocess(*this); break;
1000 case Action::PrecompileJobClass:
1001 T = new tools::gcc::Precompile(*this); break;
1002 case Action::AnalyzeJobClass:
1003 T = new tools::Clang(*this); break;
1004 case Action::CompileJobClass:
1005 T = new tools::gcc::Compile(*this); break;
1006 case Action::AssembleJobClass:
1007 T = new tools::gcc::Assemble(*this); break;
1008 case Action::LinkJobClass:
1009 T = new tools::gcc::Link(*this); break;
Mike Stump1eb44332009-09-09 15:08:12 +00001010
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +00001011 // This is a bit ungeneric, but the only platform using a driver
1012 // driver is Darwin.
1013 case Action::LipoJobClass:
1014 T = new tools::darwin::Lipo(*this); break;
Daniel Dunbar6e0f2542010-06-04 18:28:36 +00001015 case Action::DsymutilJobClass:
1016 T = new tools::darwin::Dsymutil(*this); break;
Daniel Dunbar39176082009-03-20 00:20:03 +00001017 }
1018 }
1019
1020 return *T;
1021}
1022
Daniel Dunbar39176082009-03-20 00:20:03 +00001023bool Generic_GCC::IsUnwindTablesDefault() const {
Daniel Dunbar8eddb3f2009-03-20 00:57:52 +00001024 // FIXME: Gross; we should probably have some separate target
1025 // definition, possibly even reusing the one in clang.
Daniel Dunbar39176082009-03-20 00:20:03 +00001026 return getArchName() == "x86_64";
1027}
1028
1029const char *Generic_GCC::GetDefaultRelocationModel() const {
1030 return "static";
1031}
1032
1033const char *Generic_GCC::GetForcedPicModel() const {
1034 return 0;
1035}
Daniel Dunbarf3cad362009-03-25 04:13:45 +00001036
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001037/// TCEToolChain - A tool chain using the llvm bitcode tools to perform
1038/// all subcommands. See http://tce.cs.tut.fi for our peculiar target.
1039/// Currently does not support anything else but compilation.
1040
1041TCEToolChain::TCEToolChain(const HostInfo &Host, const llvm::Triple& Triple)
1042 : ToolChain(Host, Triple) {
1043 // Path mangling to find libexec
1044 std::string Path(getDriver().Dir);
1045
1046 Path += "/../libexec";
1047 getProgramPaths().push_back(Path);
1048}
1049
1050TCEToolChain::~TCEToolChain() {
1051 for (llvm::DenseMap<unsigned, Tool*>::iterator
1052 it = Tools.begin(), ie = Tools.end(); it != ie; ++it)
1053 delete it->second;
1054}
1055
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001056bool TCEToolChain::IsMathErrnoDefault() const {
1057 return true;
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001058}
1059
1060bool TCEToolChain::IsUnwindTablesDefault() const {
1061 return false;
1062}
1063
1064const char *TCEToolChain::GetDefaultRelocationModel() const {
1065 return "static";
1066}
1067
1068const char *TCEToolChain::GetForcedPicModel() const {
1069 return 0;
1070}
1071
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001072Tool &TCEToolChain::SelectTool(const Compilation &C,
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001073 const JobAction &JA,
1074 const ActionList &Inputs) const {
Chris Lattner3a47c4e2010-03-04 21:07:38 +00001075 Action::ActionClass Key;
1076 Key = Action::AnalyzeJobClass;
1077
1078 Tool *&T = Tools[Key];
1079 if (!T) {
1080 switch (Key) {
1081 case Action::PreprocessJobClass:
1082 T = new tools::gcc::Preprocess(*this); break;
1083 case Action::AnalyzeJobClass:
1084 T = new tools::Clang(*this); break;
1085 default:
1086 assert(false && "Unsupported action for TCE target.");
1087 }
1088 }
1089 return *T;
1090}
1091
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001092/// OpenBSD - OpenBSD tool chain which can call as(1) and ld(1) directly.
1093
1094OpenBSD::OpenBSD(const HostInfo &Host, const llvm::Triple& Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001095 : Generic_ELF(Host, Triple) {
Daniel Dunbaree788e72009-12-21 18:54:17 +00001096 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001097 getFilePaths().push_back("/usr/lib");
1098}
1099
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001100Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
1101 const ActionList &Inputs) const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001102 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001103 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001104 Key = Action::AnalyzeJobClass;
1105 else
1106 Key = JA.getKind();
1107
Rafael Espindoladda5b922010-11-07 23:13:01 +00001108 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1109 options::OPT_no_integrated_as,
1110 IsIntegratedAssemblerDefault());
1111
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001112 Tool *&T = Tools[Key];
1113 if (!T) {
1114 switch (Key) {
Rafael Espindoladda5b922010-11-07 23:13:01 +00001115 case Action::AssembleJobClass: {
1116 if (UseIntegratedAs)
1117 T = new tools::ClangAs(*this);
1118 else
1119 T = new tools::openbsd::Assemble(*this);
1120 break;
1121 }
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001122 case Action::LinkJobClass:
1123 T = new tools::openbsd::Link(*this); break;
1124 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001125 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +00001126 }
1127 }
1128
1129 return *T;
1130}
1131
Daniel Dunbar75358d22009-03-30 21:06:03 +00001132/// FreeBSD - FreeBSD tool chain which can call as(1) and ld(1) directly.
1133
Daniel Dunbar214afe92010-08-02 05:43:59 +00001134FreeBSD::FreeBSD(const HostInfo &Host, const llvm::Triple& Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001135 : Generic_ELF(Host, Triple) {
Daniel Dunbar214afe92010-08-02 05:43:59 +00001136
1137 // Determine if we are compiling 32-bit code on an x86_64 platform.
1138 bool Lib32 = false;
1139 if (Triple.getArch() == llvm::Triple::x86 &&
1140 llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
1141 llvm::Triple::x86_64)
1142 Lib32 = true;
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001143
Roman Divacky3393cef2011-06-04 07:37:31 +00001144 if (Triple.getArch() == llvm::Triple::ppc &&
1145 llvm::Triple(getDriver().DefaultHostTriple).getArch() ==
1146 llvm::Triple::ppc64)
1147 Lib32 = true;
1148
Daniel Dunbarbc534662009-04-02 18:30:04 +00001149 if (Lib32) {
Daniel Dunbarbc534662009-04-02 18:30:04 +00001150 getFilePaths().push_back("/usr/lib32");
1151 } else {
Daniel Dunbarbc534662009-04-02 18:30:04 +00001152 getFilePaths().push_back("/usr/lib");
1153 }
Daniel Dunbar75358d22009-03-30 21:06:03 +00001154}
1155
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001156Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
1157 const ActionList &Inputs) const {
Daniel Dunbar75358d22009-03-30 21:06:03 +00001158 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001159 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar75358d22009-03-30 21:06:03 +00001160 Key = Action::AnalyzeJobClass;
1161 else
1162 Key = JA.getKind();
1163
Roman Divacky67dece72010-11-08 17:46:39 +00001164 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1165 options::OPT_no_integrated_as,
1166 IsIntegratedAssemblerDefault());
1167
Daniel Dunbar75358d22009-03-30 21:06:03 +00001168 Tool *&T = Tools[Key];
1169 if (!T) {
1170 switch (Key) {
Daniel Dunbar68a31d42009-03-31 17:45:15 +00001171 case Action::AssembleJobClass:
Roman Divacky67dece72010-11-08 17:46:39 +00001172 if (UseIntegratedAs)
1173 T = new tools::ClangAs(*this);
1174 else
1175 T = new tools::freebsd::Assemble(*this);
Roman Divackyfe3a7ea2010-11-08 19:39:10 +00001176 break;
Daniel Dunbar008f54a2009-04-01 19:36:32 +00001177 case Action::LinkJobClass:
1178 T = new tools::freebsd::Link(*this); break;
Daniel Dunbar75358d22009-03-30 21:06:03 +00001179 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001180 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbar75358d22009-03-30 21:06:03 +00001181 }
1182 }
1183
1184 return *T;
1185}
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001186
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001187/// NetBSD - NetBSD tool chain which can call as(1) and ld(1) directly.
1188
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001189NetBSD::NetBSD(const HostInfo &Host, const llvm::Triple& Triple,
1190 const llvm::Triple& ToolTriple)
1191 : Generic_ELF(Host, Triple), ToolTriple(ToolTriple) {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001192
1193 // Determine if we are compiling 32-bit code on an x86_64 platform.
1194 bool Lib32 = false;
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001195 if (ToolTriple.getArch() == llvm::Triple::x86_64 &&
1196 Triple.getArch() == llvm::Triple::x86)
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001197 Lib32 = true;
1198
Joerg Sonnenberger05e59302011-03-21 13:59:26 +00001199 if (getDriver().UseStdLib) {
1200 if (Lib32)
1201 getFilePaths().push_back("=/usr/lib/i386");
1202 else
1203 getFilePaths().push_back("=/usr/lib");
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001204 }
1205}
1206
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001207Tool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
1208 const ActionList &Inputs) const {
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001209 Action::ActionClass Key;
1210 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1211 Key = Action::AnalyzeJobClass;
1212 else
1213 Key = JA.getKind();
1214
1215 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1216 options::OPT_no_integrated_as,
1217 IsIntegratedAssemblerDefault());
1218
1219 Tool *&T = Tools[Key];
1220 if (!T) {
1221 switch (Key) {
1222 case Action::AssembleJobClass:
1223 if (UseIntegratedAs)
1224 T = new tools::ClangAs(*this);
1225 else
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001226 T = new tools::netbsd::Assemble(*this, ToolTriple);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001227 break;
1228 case Action::LinkJobClass:
Joerg Sonnenberger182564c2011-05-16 13:35:02 +00001229 T = new tools::netbsd::Link(*this, ToolTriple);
1230 break;
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001231 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001232 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Benjamin Kramer8e50a962011-02-02 18:59:27 +00001233 }
1234 }
1235
1236 return *T;
1237}
1238
Chris Lattner38e317d2010-07-07 16:01:42 +00001239/// Minix - Minix tool chain which can call as(1) and ld(1) directly.
1240
1241Minix::Minix(const HostInfo &Host, const llvm::Triple& Triple)
1242 : Generic_GCC(Host, Triple) {
1243 getFilePaths().push_back(getDriver().Dir + "/../lib");
1244 getFilePaths().push_back("/usr/lib");
1245 getFilePaths().push_back("/usr/gnu/lib");
1246 getFilePaths().push_back("/usr/gnu/lib/gcc/i686-pc-minix/4.4.3");
1247}
1248
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001249Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
1250 const ActionList &Inputs) const {
Chris Lattner38e317d2010-07-07 16:01:42 +00001251 Action::ActionClass Key;
1252 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1253 Key = Action::AnalyzeJobClass;
1254 else
1255 Key = JA.getKind();
1256
1257 Tool *&T = Tools[Key];
1258 if (!T) {
1259 switch (Key) {
1260 case Action::AssembleJobClass:
1261 T = new tools::minix::Assemble(*this); break;
1262 case Action::LinkJobClass:
1263 T = new tools::minix::Link(*this); break;
1264 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001265 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Chris Lattner38e317d2010-07-07 16:01:42 +00001266 }
1267 }
1268
1269 return *T;
1270}
1271
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001272/// AuroraUX - AuroraUX tool chain which can call as(1) and ld(1) directly.
1273
1274AuroraUX::AuroraUX(const HostInfo &Host, const llvm::Triple& Triple)
1275 : Generic_GCC(Host, Triple) {
1276
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001277 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +00001278 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001279 getProgramPaths().push_back(getDriver().Dir);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001280
Daniel Dunbaree788e72009-12-21 18:54:17 +00001281 getFilePaths().push_back(getDriver().Dir + "/../lib");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001282 getFilePaths().push_back("/usr/lib");
1283 getFilePaths().push_back("/usr/sfw/lib");
1284 getFilePaths().push_back("/opt/gcc4/lib");
Edward O'Callaghan7adf9492009-10-15 07:44:07 +00001285 getFilePaths().push_back("/opt/gcc4/lib/gcc/i386-pc-solaris2.11/4.2.4");
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001286
1287}
1288
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001289Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
1290 const ActionList &Inputs) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001291 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001292 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001293 Key = Action::AnalyzeJobClass;
1294 else
1295 Key = JA.getKind();
1296
1297 Tool *&T = Tools[Key];
1298 if (!T) {
1299 switch (Key) {
1300 case Action::AssembleJobClass:
1301 T = new tools::auroraux::Assemble(*this); break;
1302 case Action::LinkJobClass:
1303 T = new tools::auroraux::Link(*this); break;
1304 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001305 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Edward O'Callaghane7925a02009-08-22 01:06:46 +00001306 }
1307 }
1308
1309 return *T;
1310}
1311
1312
Eli Friedman6b3454a2009-05-26 07:52:18 +00001313/// Linux toolchain (very bare-bones at the moment).
1314
Rafael Espindolac1da9812010-11-07 20:14:31 +00001315enum LinuxDistro {
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001316 ArchLinux,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001317 DebianLenny,
1318 DebianSqueeze,
Eli Friedman0b200f62011-06-02 21:36:53 +00001319 DebianWheezy,
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001320 Exherbo,
Chris Lattnerd753b562011-05-22 05:36:06 +00001321 RHEL4,
1322 RHEL5,
1323 RHEL6,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001324 Fedora13,
1325 Fedora14,
Eric Christopher8f1cc072011-04-06 18:22:53 +00001326 Fedora15,
1327 FedoraRawhide,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001328 OpenSuse11_3,
David Chisnallde5c0482011-05-19 13:26:33 +00001329 OpenSuse11_4,
1330 OpenSuse12_1,
Douglas Gregor814638e2011-03-14 15:39:50 +00001331 UbuntuHardy,
1332 UbuntuIntrepid,
Rafael Espindola021aaa42010-11-10 05:00:22 +00001333 UbuntuJaunty,
Zhongxing Xu5ede8072010-11-15 09:01:52 +00001334 UbuntuKarmic,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001335 UbuntuLucid,
1336 UbuntuMaverick,
Ted Kremenek43ac2972011-04-05 22:04:27 +00001337 UbuntuNatty,
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001338 UbuntuOneiric,
Rafael Espindolac1da9812010-11-07 20:14:31 +00001339 UnknownDistro
1340};
1341
Chris Lattnerd753b562011-05-22 05:36:06 +00001342static bool IsRedhat(enum LinuxDistro Distro) {
Eric Christopher8f1cc072011-04-06 18:22:53 +00001343 return Distro == Fedora13 || Distro == Fedora14 ||
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001344 Distro == Fedora15 || Distro == FedoraRawhide ||
1345 Distro == RHEL4 || Distro == RHEL5 || Distro == RHEL6;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001346}
1347
1348static bool IsOpenSuse(enum LinuxDistro Distro) {
David Chisnallde5c0482011-05-19 13:26:33 +00001349 return Distro == OpenSuse11_3 || Distro == OpenSuse11_4 ||
1350 Distro == OpenSuse12_1;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001351}
1352
1353static bool IsDebian(enum LinuxDistro Distro) {
Eli Friedman0b200f62011-06-02 21:36:53 +00001354 return Distro == DebianLenny || Distro == DebianSqueeze ||
1355 Distro == DebianWheezy;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001356}
1357
1358static bool IsUbuntu(enum LinuxDistro Distro) {
Douglas Gregor814638e2011-03-14 15:39:50 +00001359 return Distro == UbuntuHardy || Distro == UbuntuIntrepid ||
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001360 Distro == UbuntuLucid || Distro == UbuntuMaverick ||
Ted Kremenek43ac2972011-04-05 22:04:27 +00001361 Distro == UbuntuJaunty || Distro == UbuntuKarmic ||
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001362 Distro == UbuntuNatty || Distro == UbuntuOneiric;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001363}
1364
1365static bool IsDebianBased(enum LinuxDistro Distro) {
1366 return IsDebian(Distro) || IsUbuntu(Distro);
1367}
1368
1369static bool HasMultilib(llvm::Triple::ArchType Arch, enum LinuxDistro Distro) {
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001370 if (Arch == llvm::Triple::x86_64) {
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001371 bool Exists;
1372 if (Distro == Exherbo &&
1373 (llvm::sys::fs::exists("/usr/lib32/libc.so", Exists) || !Exists))
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001374 return false;
1375
Rafael Espindolac1da9812010-11-07 20:14:31 +00001376 return true;
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001377 }
Ted Kremenek43ac2972011-04-05 22:04:27 +00001378 if (Arch == llvm::Triple::ppc64)
1379 return true;
Eric Christopher9af535a2011-06-03 13:28:31 +00001380 if ((Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc) &&
1381 IsDebianBased(Distro))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001382 return true;
1383 return false;
1384}
1385
1386static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001387 llvm::OwningPtr<llvm::MemoryBuffer> File;
1388 if (!llvm::MemoryBuffer::getFile("/etc/lsb-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001389 StringRef Data = File.get()->getBuffer();
1390 SmallVector<StringRef, 8> Lines;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001391 Data.split(Lines, "\n");
1392 for (unsigned int i = 0, s = Lines.size(); i < s; ++ i) {
Douglas Gregor814638e2011-03-14 15:39:50 +00001393 if (Lines[i] == "DISTRIB_CODENAME=hardy")
1394 return UbuntuHardy;
Ted Kremenek43ac2972011-04-05 22:04:27 +00001395 else if (Lines[i] == "DISTRIB_CODENAME=intrepid")
1396 return UbuntuIntrepid;
Rafael Espindola021aaa42010-11-10 05:00:22 +00001397 else if (Lines[i] == "DISTRIB_CODENAME=jaunty")
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001398 return UbuntuJaunty;
Zhongxing Xu5ede8072010-11-15 09:01:52 +00001399 else if (Lines[i] == "DISTRIB_CODENAME=karmic")
1400 return UbuntuKarmic;
Ted Kremenek43ac2972011-04-05 22:04:27 +00001401 else if (Lines[i] == "DISTRIB_CODENAME=lucid")
1402 return UbuntuLucid;
1403 else if (Lines[i] == "DISTRIB_CODENAME=maverick")
1404 return UbuntuMaverick;
1405 else if (Lines[i] == "DISTRIB_CODENAME=natty")
1406 return UbuntuNatty;
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001407 else if (Lines[i] == "DISTRIB_CODENAME=oneiric")
1408 return UbuntuOneiric;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001409 }
1410 return UnknownDistro;
1411 }
1412
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001413 if (!llvm::MemoryBuffer::getFile("/etc/redhat-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001414 StringRef Data = File.get()->getBuffer();
Eric Christopher8f1cc072011-04-06 18:22:53 +00001415 if (Data.startswith("Fedora release 15"))
1416 return Fedora15;
1417 else if (Data.startswith("Fedora release 14"))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001418 return Fedora14;
Eric Christopher8f1cc072011-04-06 18:22:53 +00001419 else if (Data.startswith("Fedora release 13"))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001420 return Fedora13;
Eric Christopher8f1cc072011-04-06 18:22:53 +00001421 else if (Data.startswith("Fedora release") &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001422 Data.find("Rawhide") != StringRef::npos)
Eric Christopher8f1cc072011-04-06 18:22:53 +00001423 return FedoraRawhide;
Chris Lattnerd753b562011-05-22 05:36:06 +00001424 else if (Data.startswith("Red Hat Enterprise Linux") &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001425 Data.find("release 6") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001426 return RHEL6;
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001427 else if ((Data.startswith("Red Hat Enterprise Linux") ||
1428 Data.startswith("CentOS")) &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001429 Data.find("release 5") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001430 return RHEL5;
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001431 else if ((Data.startswith("Red Hat Enterprise Linux") ||
1432 Data.startswith("CentOS")) &&
Chris Lattner5f9e2722011-07-23 10:55:15 +00001433 Data.find("release 4") != StringRef::npos)
Chris Lattnerd753b562011-05-22 05:36:06 +00001434 return RHEL4;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001435 return UnknownDistro;
1436 }
1437
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001438 if (!llvm::MemoryBuffer::getFile("/etc/debian_version", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001439 StringRef Data = File.get()->getBuffer();
Rafael Espindolac1da9812010-11-07 20:14:31 +00001440 if (Data[0] == '5')
1441 return DebianLenny;
1442 else if (Data.startswith("squeeze/sid"))
1443 return DebianSqueeze;
Eli Friedman0b200f62011-06-02 21:36:53 +00001444 else if (Data.startswith("wheezy/sid"))
1445 return DebianWheezy;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001446 return UnknownDistro;
1447 }
1448
Michael J. Spencer4eeebc42010-12-16 03:28:14 +00001449 if (!llvm::MemoryBuffer::getFile("/etc/SuSE-release", File)) {
Chris Lattner5f9e2722011-07-23 10:55:15 +00001450 StringRef Data = File.get()->getBuffer();
Rafael Espindolac1da9812010-11-07 20:14:31 +00001451 if (Data.startswith("openSUSE 11.3"))
1452 return OpenSuse11_3;
David Chisnallde5c0482011-05-19 13:26:33 +00001453 else if (Data.startswith("openSUSE 11.4"))
1454 return OpenSuse11_4;
1455 else if (Data.startswith("openSUSE 12.1"))
1456 return OpenSuse12_1;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001457 return UnknownDistro;
1458 }
1459
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001460 bool Exists;
1461 if (!llvm::sys::fs::exists("/etc/exherbo-release", Exists) && Exists)
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001462 return Exherbo;
1463
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001464 if (!llvm::sys::fs::exists("/etc/arch-release", Exists) && Exists)
1465 return ArchLinux;
1466
Rafael Espindolac1da9812010-11-07 20:14:31 +00001467 return UnknownDistro;
1468}
1469
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001470static std::string findGCCBaseLibDir(const std::string &GccTriple) {
Chandler Carruth169dd312011-06-08 10:14:38 +00001471 // FIXME: Using CXX_INCLUDE_ROOT is here is a bit of a hack, but
1472 // avoids adding yet another option to configure/cmake.
1473 // It would probably be cleaner to break it in two variables
1474 // CXX_GCC_ROOT with just /foo/bar
1475 // CXX_GCC_VER with 4.5.2
1476 // Then we would have
1477 // CXX_INCLUDE_ROOT = CXX_GCC_ROOT/include/c++/CXX_GCC_VER
1478 // and this function would return
1479 // CXX_GCC_ROOT/lib/gcc/CXX_INCLUDE_ARCH/CXX_GCC_VER
1480 llvm::SmallString<128> CxxIncludeRoot(CXX_INCLUDE_ROOT);
1481 if (CxxIncludeRoot != "") {
1482 // This is of the form /foo/bar/include/c++/4.5.2/
1483 if (CxxIncludeRoot.back() == '/')
1484 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the /
Chris Lattner5f9e2722011-07-23 10:55:15 +00001485 StringRef Version = llvm::sys::path::filename(CxxIncludeRoot);
Chandler Carruth169dd312011-06-08 10:14:38 +00001486 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the version
1487 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the c++
1488 llvm::sys::path::remove_filename(CxxIncludeRoot); // remove the include
1489 std::string ret(CxxIncludeRoot.c_str());
1490 ret.append("/lib/gcc/");
1491 ret.append(CXX_INCLUDE_ARCH);
1492 ret.append("/");
1493 ret.append(Version);
1494 return ret;
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001495 }
Chandler Carruth37187cc2011-07-02 00:51:03 +00001496 static const char* GccVersions[] = {"4.6.1", "4.6.0", "4.6",
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001497 "4.5.2", "4.5.1", "4.5",
1498 "4.4.5", "4.4.4", "4.4.3", "4.4",
1499 "4.3.4", "4.3.3", "4.3.2", "4.3",
1500 "4.2.4", "4.2.3", "4.2.2", "4.2.1",
1501 "4.2", "4.1.1"};
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001502 bool Exists;
1503 for (unsigned i = 0; i < sizeof(GccVersions)/sizeof(char*); ++i) {
1504 std::string Suffix = GccTriple + "/" + GccVersions[i];
1505 std::string t1 = "/usr/lib/gcc/" + Suffix;
1506 if (!llvm::sys::fs::exists(t1 + "/crtbegin.o", Exists) && Exists)
1507 return t1;
1508 std::string t2 = "/usr/lib64/gcc/" + Suffix;
1509 if (!llvm::sys::fs::exists(t2 + "/crtbegin.o", Exists) && Exists)
1510 return t2;
1511 std::string t3 = "/usr/lib/" + GccTriple + "/gcc/" + Suffix;
1512 if (!llvm::sys::fs::exists(t3 + "/crtbegin.o", Exists) && Exists)
1513 return t3;
1514 }
1515 return "";
1516}
1517
Nick Lewycky3fdcc6f2010-12-31 17:31:54 +00001518Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001519 : Generic_ELF(Host, Triple) {
Rafael Espindolac1da9812010-11-07 20:14:31 +00001520 llvm::Triple::ArchType Arch =
1521 llvm::Triple(getDriver().DefaultHostTriple).getArch();
Daniel Dunbara9822de2009-08-06 01:47:11 +00001522
Rafael Espindolac1da9812010-11-07 20:14:31 +00001523 std::string Suffix32 = "";
1524 if (Arch == llvm::Triple::x86_64)
1525 Suffix32 = "/32";
Daniel Dunbara9822de2009-08-06 01:47:11 +00001526
Rafael Espindolac1da9812010-11-07 20:14:31 +00001527 std::string Suffix64 = "";
Ted Kremenek43ac2972011-04-05 22:04:27 +00001528 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001529 Suffix64 = "/64";
1530
1531 std::string Lib32 = "lib";
1532
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001533 bool Exists;
1534 if (!llvm::sys::fs::exists("/lib32", Exists) && Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001535 Lib32 = "lib32";
1536
1537 std::string Lib64 = "lib";
Michael J. Spencer2dea7c72011-01-12 23:54:48 +00001538 bool Symlink;
Chris Lattner48aef362011-01-13 01:35:58 +00001539 if (!llvm::sys::fs::exists("/lib64", Exists) && Exists &&
1540 (llvm::sys::fs::is_symlink("/lib64", Symlink) || !Symlink))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001541 Lib64 = "lib64";
1542
1543 std::string GccTriple = "";
Douglas Gregorf0594d82011-03-06 19:11:49 +00001544 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001545 if (!llvm::sys::fs::exists("/usr/lib/gcc/arm-linux-gnueabi", Exists) &&
1546 Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001547 GccTriple = "arm-linux-gnueabi";
1548 } else if (Arch == llvm::Triple::x86_64) {
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001549 if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-linux-gnu", Exists) &&
1550 Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001551 GccTriple = "x86_64-linux-gnu";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001552 else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-unknown-linux-gnu",
1553 Exists) && Exists)
Rafael Espindola53dd00b2010-11-17 00:25:26 +00001554 GccTriple = "x86_64-unknown-linux-gnu";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001555 else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-pc-linux-gnu",
1556 Exists) && Exists)
Rafael Espindola0a84aee2010-11-11 02:07:13 +00001557 GccTriple = "x86_64-pc-linux-gnu";
NAKAMURA Takumic3703982011-06-16 12:43:57 +00001558 else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-redhat-linux6E",
1559 Exists) && Exists)
1560 GccTriple = "x86_64-redhat-linux6E";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001561 else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-redhat-linux",
1562 Exists) && Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001563 GccTriple = "x86_64-redhat-linux";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001564 else if (!llvm::sys::fs::exists("/usr/lib64/gcc/x86_64-suse-linux",
1565 Exists) && Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001566 GccTriple = "x86_64-suse-linux";
Nick Lewyckye10f9002011-02-01 23:03:29 +00001567 else if (!llvm::sys::fs::exists("/usr/lib/gcc/x86_64-manbo-linux-gnu",
1568 Exists) && Exists)
1569 GccTriple = "x86_64-manbo-linux-gnu";
Nico Weber80585d82011-04-25 03:17:35 +00001570 else if (!llvm::sys::fs::exists("/usr/lib/x86_64-linux-gnu/gcc",
1571 Exists) && Exists)
1572 GccTriple = "x86_64-linux-gnu";
Rafael Espindolac1da9812010-11-07 20:14:31 +00001573 } else if (Arch == llvm::Triple::x86) {
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001574 if (!llvm::sys::fs::exists("/usr/lib/gcc/i686-linux-gnu", Exists) && Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001575 GccTriple = "i686-linux-gnu";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001576 else if (!llvm::sys::fs::exists("/usr/lib/gcc/i686-pc-linux-gnu", Exists) &&
1577 Exists)
Nuno Lopes2a69ddd2010-11-19 17:26:57 +00001578 GccTriple = "i686-pc-linux-gnu";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001579 else if (!llvm::sys::fs::exists("/usr/lib/gcc/i486-linux-gnu", Exists) &&
1580 Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001581 GccTriple = "i486-linux-gnu";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001582 else if (!llvm::sys::fs::exists("/usr/lib/gcc/i686-redhat-linux", Exists) &&
1583 Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001584 GccTriple = "i686-redhat-linux";
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001585 else if (!llvm::sys::fs::exists("/usr/lib/gcc/i586-suse-linux", Exists) &&
1586 Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001587 GccTriple = "i586-suse-linux";
Ted Kremenekd130c7d2011-04-18 17:50:19 +00001588 else if (!llvm::sys::fs::exists("/usr/lib/gcc/i486-slackware-linux", Exists)
1589 && Exists)
1590 GccTriple = "i486-slackware-linux";
Ted Kremenek43ac2972011-04-05 22:04:27 +00001591 } else if (Arch == llvm::Triple::ppc) {
1592 if (!llvm::sys::fs::exists("/usr/lib/powerpc-linux-gnu", Exists) && Exists)
1593 GccTriple = "powerpc-linux-gnu";
Eric Christopher9af535a2011-06-03 13:28:31 +00001594 else if (!llvm::sys::fs::exists("/usr/lib/gcc/powerpc-unknown-linux-gnu",
1595 Exists) && Exists)
Ted Kremenek43ac2972011-04-05 22:04:27 +00001596 GccTriple = "powerpc-unknown-linux-gnu";
1597 } else if (Arch == llvm::Triple::ppc64) {
Eric Christopher9af535a2011-06-03 13:28:31 +00001598 if (!llvm::sys::fs::exists("/usr/lib/gcc/powerpc64-unknown-linux-gnu",
1599 Exists) && Exists)
Ted Kremenek43ac2972011-04-05 22:04:27 +00001600 GccTriple = "powerpc64-unknown-linux-gnu";
Eric Christopher9af535a2011-06-03 13:28:31 +00001601 else if (!llvm::sys::fs::exists("/usr/lib64/gcc/"
1602 "powerpc64-unknown-linux-gnu", Exists) &&
1603 Exists)
Ted Kremenek43ac2972011-04-05 22:04:27 +00001604 GccTriple = "powerpc64-unknown-linux-gnu";
Rafael Espindolac1da9812010-11-07 20:14:31 +00001605 }
1606
Rafael Espindola14ea13c2011-06-02 22:18:46 +00001607 std::string Base = findGCCBaseLibDir(GccTriple);
Rafael Espindolac1da9812010-11-07 20:14:31 +00001608 path_list &Paths = getFilePaths();
Eric Christopher9af535a2011-06-03 13:28:31 +00001609 bool Is32Bits = (getArch() == llvm::Triple::x86 ||
1610 getArch() == llvm::Triple::ppc);
Rafael Espindolac1da9812010-11-07 20:14:31 +00001611
1612 std::string Suffix;
1613 std::string Lib;
1614
1615 if (Is32Bits) {
1616 Suffix = Suffix32;
1617 Lib = Lib32;
1618 } else {
1619 Suffix = Suffix64;
1620 Lib = Lib64;
1621 }
1622
1623 llvm::sys::Path LinkerPath(Base + "/../../../../" + GccTriple + "/bin/ld");
Michael J. Spencer32bef4e2011-01-10 02:34:13 +00001624 if (!llvm::sys::fs::exists(LinkerPath.str(), Exists) && Exists)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001625 Linker = LinkerPath.str();
1626 else
1627 Linker = GetProgramPath("ld");
1628
1629 LinuxDistro Distro = DetectLinuxDistro(Arch);
1630
Chris Lattner64a89172011-05-22 16:45:07 +00001631 if (IsOpenSuse(Distro) || IsUbuntu(Distro)) {
Rafael Espindola94c80222010-11-08 14:48:47 +00001632 ExtraOpts.push_back("-z");
1633 ExtraOpts.push_back("relro");
1634 }
Rafael Espindolac1da9812010-11-07 20:14:31 +00001635
Douglas Gregorf0594d82011-03-06 19:11:49 +00001636 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001637 ExtraOpts.push_back("-X");
1638
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001639 if (IsRedhat(Distro) || IsOpenSuse(Distro) || Distro == UbuntuMaverick ||
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001640 Distro == UbuntuNatty || Distro == UbuntuOneiric)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001641 ExtraOpts.push_back("--hash-style=gnu");
1642
NAKAMURA Takumi304ed3f2011-06-03 03:49:51 +00001643 if (IsDebian(Distro) || IsOpenSuse(Distro) || Distro == UbuntuLucid ||
Chris Lattner64a89172011-05-22 16:45:07 +00001644 Distro == UbuntuJaunty || Distro == UbuntuKarmic)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001645 ExtraOpts.push_back("--hash-style=both");
1646
Chris Lattnerd753b562011-05-22 05:36:06 +00001647 if (IsRedhat(Distro))
Rafael Espindolac1da9812010-11-07 20:14:31 +00001648 ExtraOpts.push_back("--no-add-needed");
1649
Eli Friedman0b200f62011-06-02 21:36:53 +00001650 if (Distro == DebianSqueeze || Distro == DebianWheezy ||
Rafael Espindola5a640ef2011-06-03 15:23:24 +00001651 IsOpenSuse(Distro) ||
1652 (IsRedhat(Distro) && Distro != RHEL4 && Distro != RHEL5) ||
1653 Distro == UbuntuLucid ||
Eli Friedman0b200f62011-06-02 21:36:53 +00001654 Distro == UbuntuMaverick || Distro == UbuntuKarmic ||
Benjamin Kramer25a857b2011-06-05 16:08:59 +00001655 Distro == UbuntuNatty || Distro == UbuntuOneiric)
Rafael Espindolac1da9812010-11-07 20:14:31 +00001656 ExtraOpts.push_back("--build-id");
1657
Chris Lattner64a89172011-05-22 16:45:07 +00001658 if (IsOpenSuse(Distro))
Chandler Carruthf0b60ec2011-05-24 07:51:17 +00001659 ExtraOpts.push_back("--enable-new-dtags");
Chris Lattner64a89172011-05-22 16:45:07 +00001660
Chandler Carruth3fd345a2011-02-25 06:39:53 +00001661 if (Distro == ArchLinux)
1662 Lib = "lib";
1663
Rafael Espindolac1da9812010-11-07 20:14:31 +00001664 Paths.push_back(Base + Suffix);
1665 if (HasMultilib(Arch, Distro)) {
1666 if (IsOpenSuse(Distro) && Is32Bits)
1667 Paths.push_back(Base + "/../../../../" + GccTriple + "/lib/../lib");
1668 Paths.push_back(Base + "/../../../../" + Lib);
Rafael Espindolac1da9812010-11-07 20:14:31 +00001669 }
Rafael Espindolac7409a02011-06-03 15:39:42 +00001670
1671 // FIXME: This is in here to find crt1.o. It is provided by libc, and
1672 // libc (like gcc), can be installed in any directory. Once we are
1673 // fetching this from a config file, we should have a libc prefix.
1674 Paths.push_back("/lib/../" + Lib);
1675 Paths.push_back("/usr/lib/../" + Lib);
1676
Rafael Espindolac1da9812010-11-07 20:14:31 +00001677 if (!Suffix.empty())
1678 Paths.push_back(Base);
1679 if (IsOpenSuse(Distro))
1680 Paths.push_back(Base + "/../../../../" + GccTriple + "/lib");
1681 Paths.push_back(Base + "/../../..");
1682 if (Arch == getArch() && IsUbuntu(Distro))
1683 Paths.push_back("/usr/lib/" + GccTriple);
1684}
1685
1686bool Linux::HasNativeLLVMSupport() const {
1687 return true;
Eli Friedman6b3454a2009-05-26 07:52:18 +00001688}
1689
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001690Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
1691 const ActionList &Inputs) const {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001692 Action::ActionClass Key;
1693 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1694 Key = Action::AnalyzeJobClass;
1695 else
1696 Key = JA.getKind();
1697
Rafael Espindoladda5b922010-11-07 23:13:01 +00001698 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1699 options::OPT_no_integrated_as,
1700 IsIntegratedAssemblerDefault());
1701
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001702 Tool *&T = Tools[Key];
1703 if (!T) {
1704 switch (Key) {
1705 case Action::AssembleJobClass:
Rafael Espindoladda5b922010-11-07 23:13:01 +00001706 if (UseIntegratedAs)
1707 T = new tools::ClangAs(*this);
1708 else
1709 T = new tools::linuxtools::Assemble(*this);
1710 break;
Rafael Espindolac1da9812010-11-07 20:14:31 +00001711 case Action::LinkJobClass:
1712 T = new tools::linuxtools::Link(*this); break;
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001713 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001714 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Rafael Espindolaba30bbe2010-08-10 00:25:48 +00001715 }
1716 }
1717
1718 return *T;
1719}
1720
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001721/// DragonFly - DragonFly tool chain which can call as(1) and ld(1) directly.
1722
Daniel Dunbarcb8ab232009-05-22 02:53:45 +00001723DragonFly::DragonFly(const HostInfo &Host, const llvm::Triple& Triple)
Rafael Espindolae43cfa12010-10-29 20:14:02 +00001724 : Generic_ELF(Host, Triple) {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001725
1726 // Path mangling to find libexec
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001727 getProgramPaths().push_back(getDriver().getInstalledDir());
Benjamin Kramer86643b82011-03-01 22:50:47 +00001728 if (getDriver().getInstalledDir() != getDriver().Dir)
Daniel Dunbaredf29b02010-08-01 22:29:51 +00001729 getProgramPaths().push_back(getDriver().Dir);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001730
Daniel Dunbaree788e72009-12-21 18:54:17 +00001731 getFilePaths().push_back(getDriver().Dir + "/../lib");
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001732 getFilePaths().push_back("/usr/lib");
1733 getFilePaths().push_back("/usr/lib/gcc41");
1734}
1735
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001736Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
1737 const ActionList &Inputs) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001738 Action::ActionClass Key;
Daniel Dunbaree788e72009-12-21 18:54:17 +00001739 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001740 Key = Action::AnalyzeJobClass;
1741 else
1742 Key = JA.getKind();
1743
1744 Tool *&T = Tools[Key];
1745 if (!T) {
1746 switch (Key) {
1747 case Action::AssembleJobClass:
1748 T = new tools::dragonfly::Assemble(*this); break;
1749 case Action::LinkJobClass:
1750 T = new tools::dragonfly::Link(*this); break;
1751 default:
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001752 T = &Generic_GCC::SelectTool(C, JA, Inputs);
Daniel Dunbar11e1b402009-05-02 18:28:39 +00001753 }
1754 }
1755
1756 return *T;
1757}
Michael J. Spencerff58e362010-08-21 21:55:07 +00001758
1759Windows::Windows(const HostInfo &Host, const llvm::Triple& Triple)
1760 : ToolChain(Host, Triple) {
1761}
1762
Daniel Dunbarac0659a2011-03-18 20:14:00 +00001763Tool &Windows::SelectTool(const Compilation &C, const JobAction &JA,
1764 const ActionList &Inputs) const {
Michael J. Spencerff58e362010-08-21 21:55:07 +00001765 Action::ActionClass Key;
1766 if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
1767 Key = Action::AnalyzeJobClass;
1768 else
1769 Key = JA.getKind();
1770
Chad Rosierc57114a2011-07-20 19:14:30 +00001771 bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
1772 options::OPT_no_integrated_as,
1773 IsIntegratedAssemblerDefault());
1774
Michael J. Spencerff58e362010-08-21 21:55:07 +00001775 Tool *&T = Tools[Key];
1776 if (!T) {
1777 switch (Key) {
1778 case Action::InputClass:
1779 case Action::BindArchClass:
Chandler Carruthe97673f2010-08-22 06:56:37 +00001780 case Action::LipoJobClass:
1781 case Action::DsymutilJobClass:
Michael J. Spencerff58e362010-08-21 21:55:07 +00001782 assert(0 && "Invalid tool kind.");
1783 case Action::PreprocessJobClass:
1784 case Action::PrecompileJobClass:
1785 case Action::AnalyzeJobClass:
1786 case Action::CompileJobClass:
1787 T = new tools::Clang(*this); break;
1788 case Action::AssembleJobClass:
Chad Rosierc57114a2011-07-20 19:14:30 +00001789 if (!UseIntegratedAs && getTriple().getEnvironment() == llvm::Triple::MachO)
1790 T = new tools::darwin::Assemble(*this);
1791 else
1792 T = new tools::ClangAs(*this);
1793 break;
Michael J. Spencerff58e362010-08-21 21:55:07 +00001794 case Action::LinkJobClass:
1795 T = new tools::visualstudio::Link(*this); break;
1796 }
1797 }
1798
1799 return *T;
1800}
1801
1802bool Windows::IsIntegratedAssemblerDefault() const {
1803 return true;
1804}
1805
1806bool Windows::IsUnwindTablesDefault() const {
1807 // FIXME: Gross; we should probably have some separate target
1808 // definition, possibly even reusing the one in clang.
1809 return getArchName() == "x86_64";
1810}
1811
1812const char *Windows::GetDefaultRelocationModel() const {
1813 return "static";
1814}
1815
1816const char *Windows::GetForcedPicModel() const {
1817 if (getArchName() == "x86_64")
1818 return "pic";
1819 return 0;
1820}