blob: 305c7ccb1b56487bf5bb46f15275d6d883cb790f [file] [log] [blame]
Daniel Dunbarc1376b62009-03-10 23:50:49 +00001//===--- HostInfo.cpp - Host specific information -----------------------*-===//
2//
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 "clang/Driver/HostInfo.h"
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000011
12#include "clang/Driver/Arg.h"
13#include "clang/Driver/ArgList.h"
Daniel Dunbard9be9092009-03-20 18:21:51 +000014#include "clang/Driver/Driver.h"
15#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000016#include "clang/Driver/Option.h"
17#include "clang/Driver/Options.h"
18
19#include "llvm/ADT/StringMap.h"
20#include "llvm/Support/Compiler.h"
21
Daniel Dunbara12df5c2009-03-17 21:38:00 +000022#include "ToolChains.h"
23
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000024#include <cassert>
Daniel Dunbarc1376b62009-03-10 23:50:49 +000025
26using namespace clang::driver;
27
Daniel Dunbar08303652009-05-22 02:53:45 +000028HostInfo::HostInfo(const Driver &D, const llvm::Triple &_Triple)
29 : TheDriver(D), Triple(_Triple)
Daniel Dunbarc1376b62009-03-10 23:50:49 +000030{
31
32}
33
34HostInfo::~HostInfo() {
35}
36
Chris Lattner8db5bfd2009-03-17 22:24:01 +000037namespace {
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000038
Daniel Dunbarc1376b62009-03-10 23:50:49 +000039// Darwin Host Info
40
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000041/// DarwinHostInfo - Darwin host information implementation.
42class DarwinHostInfo : public HostInfo {
43 /// Darwin version of host.
44 unsigned DarwinVersion[3];
45
46 /// GCC version to use on this host.
47 unsigned GCCVersion[3];
48
49 /// Cache of tool chains we have created.
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +000050 mutable llvm::StringMap<ToolChain *> ToolChains;
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000051
52public:
Daniel Dunbar08303652009-05-22 02:53:45 +000053 DarwinHostInfo(const Driver &D, const llvm::Triple &Triple);
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +000054 ~DarwinHostInfo();
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000055
56 virtual bool useDriverDriver() const;
57
Daniel Dunbar7b6dfbd2009-03-20 23:39:23 +000058 virtual types::ID lookupTypeForExtension(const char *Ext) const {
59 types::ID Ty = types::lookupTypeForExtension(Ext);
60
61 // Darwin always preprocesses assembly files (unless -x is used
62 // explicitly).
63 if (Ty == types::TY_PP_Asm)
64 return types::TY_Asm;
65
66 return Ty;
67 }
68
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000069 virtual ToolChain *getToolChain(const ArgList &Args,
70 const char *ArchName) const;
71};
72
Daniel Dunbar08303652009-05-22 02:53:45 +000073DarwinHostInfo::DarwinHostInfo(const Driver &D, const llvm::Triple& Triple)
74 : HostInfo(D, Triple) {
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000075
76 assert((getArchName() == "i386" || getArchName() == "x86_64" ||
Eli Friedman4e9a40e2009-05-28 20:57:06 +000077 getArchName() == "powerpc" || getArchName() == "powerpc64" ||
78 getArchName() == "arm") &&
Daniel Dunbar7424b8a2009-03-17 19:00:50 +000079 "Unknown Darwin arch.");
Daniel Dunbarc1376b62009-03-10 23:50:49 +000080
Daniel Dunbard9be9092009-03-20 18:21:51 +000081 assert(memcmp(&getOSName()[0], "darwin", 6) == 0 &&
82 "Unknown Darwin platform.");
Daniel Dunbar9cdd4d42009-03-26 15:58:36 +000083 bool HadExtra;
Daniel Dunbarb377b4b2009-05-23 18:55:58 +000084 if (!Driver::GetReleaseVersion(&getOSName()[6],
85 DarwinVersion[0], DarwinVersion[1],
Daniel Dunbar9cdd4d42009-03-26 15:58:36 +000086 DarwinVersion[2], HadExtra)) {
Daniel Dunbard9be9092009-03-20 18:21:51 +000087 D.Diag(clang::diag::err_drv_invalid_darwin_version)
Daniel Dunbarb377b4b2009-05-23 18:55:58 +000088 << getOSName();
Daniel Dunbard9be9092009-03-20 18:21:51 +000089 }
Daniel Dunbarc1376b62009-03-10 23:50:49 +000090
91 // We can only call 4.2.1 for now.
92 GCCVersion[0] = 4;
93 GCCVersion[1] = 2;
94 GCCVersion[2] = 1;
95}
96
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +000097DarwinHostInfo::~DarwinHostInfo() {
98 for (llvm::StringMap<ToolChain*>::iterator
99 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
100 delete it->second;
101}
102
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000103bool DarwinHostInfo::useDriverDriver() const {
104 return true;
105}
106
107ToolChain *DarwinHostInfo::getToolChain(const ArgList &Args,
108 const char *ArchName) const {
Daniel Dunbar08303652009-05-22 02:53:45 +0000109 std::string Arch;
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000110 if (!ArchName) {
Daniel Dunbar5b518b42009-06-16 21:39:33 +0000111 // If we aren't looking for a specific arch, infer the default architecture
112 // based on -arch and -m32/-m64 command line options.
113 if (Arg *A = Args.getLastArg(options::OPT_arch)) {
114 // The gcc driver behavior with multiple -arch flags wasn't consistent for
115 // things which rely on a default architecture. We just use the last -arch
116 // to find the default tool chain.
117 Arch = A->getValue(Args);
118
119 // Normalize arch name; we shouldn't be doing this here.
120 //
121 // FIXME: This should be unnecessary once everything moves over to using
122 // the ID based Triple interface.
123 if (Arch == "ppc")
124 Arch = "powerpc";
Daniel Dunbarcb7e1e12009-06-16 21:46:01 +0000125 else if (Arch == "ppc64")
Daniel Dunbar5b518b42009-06-16 21:39:33 +0000126 Arch = "powerpc64";
127 } else {
128 // Otherwise default to the arch of the host.
129 Arch = getArchName();
130 }
Daniel Dunbar08303652009-05-22 02:53:45 +0000131 ArchName = Arch.c_str();
Daniel Dunbar5b518b42009-06-16 21:39:33 +0000132
133 // Honor -m32 and -m64 when finding the default tool chain.
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000134 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Daniel Dunbar5b518b42009-06-16 21:39:33 +0000135 if (Arch == "i386" || Arch == "x86_64") {
136 ArchName = (A->getOption().getId() == options::OPT_m32) ? "i386" :
137 "x86_64";
138 } else if (Arch == "powerpc" || Arch == "powerpc64") {
Daniel Dunbarb7daa2d2009-04-01 20:33:11 +0000139 ArchName = (A->getOption().getId() == options::OPT_m32) ? "powerpc" :
140 "powerpc64";
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000141 }
142 }
Daniel Dunbarb7daa2d2009-04-01 20:33:11 +0000143 } else {
144 // Normalize arch name; we shouldn't be doing this here.
Daniel Dunbar08303652009-05-22 02:53:45 +0000145 //
146 // FIXME: This should be unnecessary once everything moves over to using the
147 // ID based Triple interface.
Daniel Dunbarb7daa2d2009-04-01 20:33:11 +0000148 if (strcmp(ArchName, "ppc") == 0)
149 ArchName = "powerpc";
150 else if (strcmp(ArchName, "ppc64") == 0)
151 ArchName = "powerpc64";
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000152 }
153
154 ToolChain *&TC = ToolChains[ArchName];
155 if (!TC) {
Daniel Dunbar08303652009-05-22 02:53:45 +0000156 llvm::Triple TCTriple(getTriple());
157 TCTriple.setArchName(ArchName);
Daniel Dunbar2c4c4612009-09-04 18:35:21 +0000158
Daniel Dunbara12df5c2009-03-17 21:38:00 +0000159 if (strcmp(ArchName, "i386") == 0 || strcmp(ArchName, "x86_64") == 0)
Daniel Dunbar57c63bb2009-09-04 18:34:51 +0000160 TC = new toolchains::Darwin(*this, TCTriple,
161 DarwinVersion,
Daniel Dunbar2c4c4612009-09-04 18:35:21 +0000162 GCCVersion,
163 false);
164 else if (strncmp(ArchName, "arm", 3) == 0 ||
165 strncmp(ArchName, "thumb", 5) == 0)
166 TC = new toolchains::Darwin(*this, TCTriple,
167 DarwinVersion,
168 GCCVersion,
169 true);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000170 else
Daniel Dunbar08303652009-05-22 02:53:45 +0000171 TC = new toolchains::Darwin_GCC(*this, TCTriple);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000172 }
173
174 return TC;
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000175}
176
177// Unknown Host Info
178
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000179/// UnknownHostInfo - Generic host information to use for unknown
180/// hosts.
181class UnknownHostInfo : public HostInfo {
182 /// Cache of tool chains we have created.
183 mutable llvm::StringMap<ToolChain*> ToolChains;
184
185public:
Daniel Dunbar08303652009-05-22 02:53:45 +0000186 UnknownHostInfo(const Driver &D, const llvm::Triple& Triple);
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +0000187 ~UnknownHostInfo();
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000188
189 virtual bool useDriverDriver() const;
190
Daniel Dunbar7b6dfbd2009-03-20 23:39:23 +0000191 virtual types::ID lookupTypeForExtension(const char *Ext) const {
192 return types::lookupTypeForExtension(Ext);
193 }
194
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000195 virtual ToolChain *getToolChain(const ArgList &Args,
196 const char *ArchName) const;
197};
198
Daniel Dunbar08303652009-05-22 02:53:45 +0000199UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple)
200 : HostInfo(D, Triple) {
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000201}
202
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +0000203UnknownHostInfo::~UnknownHostInfo() {
204 for (llvm::StringMap<ToolChain*>::iterator
205 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
206 delete it->second;
207}
208
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000209bool UnknownHostInfo::useDriverDriver() const {
210 return false;
211}
212
213ToolChain *UnknownHostInfo::getToolChain(const ArgList &Args,
214 const char *ArchName) const {
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000215 assert(!ArchName &&
216 "Unexpected arch name on platform without driver driver support.");
217
218 // Automatically handle some instances of -m32/-m64 we know about.
Daniel Dunbar08303652009-05-22 02:53:45 +0000219 std::string Arch = getArchName();
220 ArchName = Arch.c_str();
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000221 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Eli Friedman32690c12009-06-03 18:59:56 +0000222 if (Triple.getArch() == llvm::Triple::x86 ||
223 Triple.getArch() == llvm::Triple::x86_64) {
224 ArchName =
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000225 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
Eli Friedman32690c12009-06-03 18:59:56 +0000226 } else if (Triple.getArch() == llvm::Triple::ppc ||
227 Triple.getArch() == llvm::Triple::ppc64) {
228 ArchName =
Daniel Dunbarb7daa2d2009-04-01 20:33:11 +0000229 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000230 }
231 }
232
233 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbar08303652009-05-22 02:53:45 +0000234 if (!TC) {
235 llvm::Triple TCTriple(getTriple());
236 TCTriple.setArchName(ArchName);
237
238 TC = new toolchains::Generic_GCC(*this, TCTriple);
239 }
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000240
Daniel Dunbarb1dd58a2009-03-18 01:39:08 +0000241 return TC;
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000242}
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000243
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000244// OpenBSD Host Info
245
246/// OpenBSDHostInfo - OpenBSD host information implementation.
247class OpenBSDHostInfo : public HostInfo {
248 /// Cache of tool chains we have created.
249 mutable llvm::StringMap<ToolChain*> ToolChains;
250
251public:
252 OpenBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
253 : HostInfo(D, Triple) {}
254 ~OpenBSDHostInfo();
255
256 virtual bool useDriverDriver() const;
257
258 virtual types::ID lookupTypeForExtension(const char *Ext) const {
259 return types::lookupTypeForExtension(Ext);
260 }
261
262 virtual ToolChain *getToolChain(const ArgList &Args,
263 const char *ArchName) const;
264};
265
266OpenBSDHostInfo::~OpenBSDHostInfo() {
267 for (llvm::StringMap<ToolChain*>::iterator
268 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
269 delete it->second;
270}
271
272bool OpenBSDHostInfo::useDriverDriver() const {
273 return false;
274}
275
276ToolChain *OpenBSDHostInfo::getToolChain(const ArgList &Args,
277 const char *ArchName) const {
278 assert(!ArchName &&
279 "Unexpected arch name on platform without driver driver support.");
280
281 std::string Arch = getArchName();
282 ArchName = Arch.c_str();
283
284 ToolChain *&TC = ToolChains[ArchName];
285 if (!TC) {
286 llvm::Triple TCTriple(getTriple());
287 TCTriple.setArchName(ArchName);
288
289 TC = new toolchains::OpenBSD(*this, TCTriple);
290 }
291
292 return TC;
293}
294
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000295// AuroraUX Host Info
296
297/// AuroraUXHostInfo - AuroraUX host information implementation.
298class AuroraUXHostInfo : public HostInfo {
299 /// Cache of tool chains we have created.
300 mutable llvm::StringMap<ToolChain*> ToolChains;
301
302public:
303 AuroraUXHostInfo(const Driver &D, const llvm::Triple& Triple)
304 : HostInfo(D, Triple) {}
305 ~AuroraUXHostInfo();
306
307 virtual bool useDriverDriver() const;
308
309 virtual types::ID lookupTypeForExtension(const char *Ext) const {
310 return types::lookupTypeForExtension(Ext);
311 }
312
313 virtual ToolChain *getToolChain(const ArgList &Args,
314 const char *ArchName) const;
315};
316
317AuroraUXHostInfo::~AuroraUXHostInfo() {
318 for (llvm::StringMap<ToolChain*>::iterator
319 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
320 delete it->second;
321}
322
323bool AuroraUXHostInfo::useDriverDriver() const {
324 return false;
325}
326
327ToolChain *AuroraUXHostInfo::getToolChain(const ArgList &Args,
328 const char *ArchName) const {
329 assert(!ArchName &&
330 "Unexpected arch name on platform without driver driver support.");
331
332 ToolChain *&TC = ToolChains[getArchName()];
333
334 if (!TC) {
335 llvm::Triple TCTriple(getTriple());
336 TCTriple.setArchName(getArchName());
337
338 TC = new toolchains::AuroraUX(*this, TCTriple);
339 }
340
341 return TC;
342}
343
Daniel Dunbar606f6142009-03-30 21:06:03 +0000344// FreeBSD Host Info
345
Daniel Dunbare9b52a22009-03-30 22:11:38 +0000346/// FreeBSDHostInfo - FreeBSD host information implementation.
Daniel Dunbar606f6142009-03-30 21:06:03 +0000347class FreeBSDHostInfo : public HostInfo {
348 /// Cache of tool chains we have created.
349 mutable llvm::StringMap<ToolChain*> ToolChains;
350
351public:
Daniel Dunbar08303652009-05-22 02:53:45 +0000352 FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
353 : HostInfo(D, Triple) {}
Daniel Dunbar606f6142009-03-30 21:06:03 +0000354 ~FreeBSDHostInfo();
355
356 virtual bool useDriverDriver() const;
357
358 virtual types::ID lookupTypeForExtension(const char *Ext) const {
359 return types::lookupTypeForExtension(Ext);
360 }
361
362 virtual ToolChain *getToolChain(const ArgList &Args,
363 const char *ArchName) const;
364};
365
Daniel Dunbar606f6142009-03-30 21:06:03 +0000366FreeBSDHostInfo::~FreeBSDHostInfo() {
367 for (llvm::StringMap<ToolChain*>::iterator
368 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
369 delete it->second;
370}
371
372bool FreeBSDHostInfo::useDriverDriver() const {
373 return false;
374}
375
376ToolChain *FreeBSDHostInfo::getToolChain(const ArgList &Args,
377 const char *ArchName) const {
378 bool Lib32 = false;
379
380 assert(!ArchName &&
381 "Unexpected arch name on platform without driver driver support.");
382
383 // On x86_64 we need to be able to compile 32-bits binaries as well.
384 // Compiling 64-bit binaries on i386 is not supported. We don't have a
385 // lib64.
Daniel Dunbar08303652009-05-22 02:53:45 +0000386 std::string Arch = getArchName();
387 ArchName = Arch.c_str();
Daniel Dunbar606f6142009-03-30 21:06:03 +0000388 if (Args.hasArg(options::OPT_m32) && getArchName() == "x86_64") {
389 ArchName = "i386";
390 Lib32 = true;
391 }
392
393 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbar08303652009-05-22 02:53:45 +0000394 if (!TC) {
395 llvm::Triple TCTriple(getTriple());
396 TCTriple.setArchName(ArchName);
397
398 TC = new toolchains::FreeBSD(*this, TCTriple, Lib32);
399 }
Daniel Dunbar606f6142009-03-30 21:06:03 +0000400
401 return TC;
402}
403
Daniel Dunbar46363f52009-05-02 18:28:39 +0000404// DragonFly Host Info
405
406/// DragonFlyHostInfo - DragonFly host information implementation.
407class DragonFlyHostInfo : public HostInfo {
408 /// Cache of tool chains we have created.
409 mutable llvm::StringMap<ToolChain*> ToolChains;
410
411public:
Daniel Dunbar08303652009-05-22 02:53:45 +0000412 DragonFlyHostInfo(const Driver &D, const llvm::Triple& Triple)
413 : HostInfo(D, Triple) {}
Daniel Dunbar46363f52009-05-02 18:28:39 +0000414 ~DragonFlyHostInfo();
415
416 virtual bool useDriverDriver() const;
417
418 virtual types::ID lookupTypeForExtension(const char *Ext) const {
419 return types::lookupTypeForExtension(Ext);
420 }
421
422 virtual ToolChain *getToolChain(const ArgList &Args,
423 const char *ArchName) const;
424};
425
Daniel Dunbar46363f52009-05-02 18:28:39 +0000426DragonFlyHostInfo::~DragonFlyHostInfo() {
427 for (llvm::StringMap<ToolChain*>::iterator
428 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
429 delete it->second;
430}
431
432bool DragonFlyHostInfo::useDriverDriver() const {
433 return false;
434}
435
436ToolChain *DragonFlyHostInfo::getToolChain(const ArgList &Args,
Daniel Dunbar08303652009-05-22 02:53:45 +0000437 const char *ArchName) const {
Daniel Dunbar46363f52009-05-02 18:28:39 +0000438 assert(!ArchName &&
439 "Unexpected arch name on platform without driver driver support.");
440
Daniel Dunbar08303652009-05-22 02:53:45 +0000441 ToolChain *&TC = ToolChains[getArchName()];
Daniel Dunbar46363f52009-05-02 18:28:39 +0000442
Daniel Dunbar08303652009-05-22 02:53:45 +0000443 if (!TC) {
444 llvm::Triple TCTriple(getTriple());
445 TCTriple.setArchName(getArchName());
Daniel Dunbar46363f52009-05-02 18:28:39 +0000446
Daniel Dunbar08303652009-05-22 02:53:45 +0000447 TC = new toolchains::DragonFly(*this, TCTriple);
448 }
Daniel Dunbar46363f52009-05-02 18:28:39 +0000449
Daniel Dunbar46363f52009-05-02 18:28:39 +0000450 return TC;
451}
452
Eli Friedman8cac4352009-05-26 07:52:18 +0000453// Linux Host Info
454
455/// LinuxHostInfo - Linux host information implementation.
456class LinuxHostInfo : public HostInfo {
457 /// Cache of tool chains we have created.
458 mutable llvm::StringMap<ToolChain*> ToolChains;
459
460public:
461 LinuxHostInfo(const Driver &D, const llvm::Triple& Triple)
462 : HostInfo(D, Triple) {}
463 ~LinuxHostInfo();
464
465 virtual bool useDriverDriver() const;
466
467 virtual types::ID lookupTypeForExtension(const char *Ext) const {
468 return types::lookupTypeForExtension(Ext);
469 }
470
471 virtual ToolChain *getToolChain(const ArgList &Args,
472 const char *ArchName) const;
473};
474
475LinuxHostInfo::~LinuxHostInfo() {
476 for (llvm::StringMap<ToolChain*>::iterator
477 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
478 delete it->second;
479}
480
481bool LinuxHostInfo::useDriverDriver() const {
482 return false;
483}
484
485ToolChain *LinuxHostInfo::getToolChain(const ArgList &Args,
486 const char *ArchName) const {
487
488 assert(!ArchName &&
489 "Unexpected arch name on platform without driver driver support.");
490
Eli Friedman32690c12009-06-03 18:59:56 +0000491 // Automatically handle some instances of -m32/-m64 we know about.
492 std::string Arch = getArchName();
493 ArchName = Arch.c_str();
494 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
495 if (Triple.getArch() == llvm::Triple::x86 ||
496 Triple.getArch() == llvm::Triple::x86_64) {
497 ArchName =
498 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
499 } else if (Triple.getArch() == llvm::Triple::ppc ||
500 Triple.getArch() == llvm::Triple::ppc64) {
501 ArchName =
502 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
503 }
504 }
505
Eli Friedman8cac4352009-05-26 07:52:18 +0000506 ToolChain *&TC = ToolChains[ArchName];
507
508 if (!TC) {
509 llvm::Triple TCTriple(getTriple());
Eli Friedman32690c12009-06-03 18:59:56 +0000510 TCTriple.setArchName(ArchName);
Eli Friedman8cac4352009-05-26 07:52:18 +0000511
512 TC = new toolchains::Linux(*this, TCTriple);
513 }
514
515 return TC;
516}
517
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000518}
519
Daniel Dunbar08303652009-05-22 02:53:45 +0000520const HostInfo *
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000521clang::driver::createAuroraUXHostInfo(const Driver &D,
522 const llvm::Triple& Triple){
523 return new AuroraUXHostInfo(D, Triple);
524}
525
526const HostInfo *
Daniel Dunbar08303652009-05-22 02:53:45 +0000527clang::driver::createDarwinHostInfo(const Driver &D,
528 const llvm::Triple& Triple){
529 return new DarwinHostInfo(D, Triple);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000530}
531
Daniel Dunbar08303652009-05-22 02:53:45 +0000532const HostInfo *
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000533clang::driver::createOpenBSDHostInfo(const Driver &D,
534 const llvm::Triple& Triple) {
535 return new OpenBSDHostInfo(D, Triple);
536}
537
538const HostInfo *
Daniel Dunbar08303652009-05-22 02:53:45 +0000539clang::driver::createFreeBSDHostInfo(const Driver &D,
540 const llvm::Triple& Triple) {
541 return new FreeBSDHostInfo(D, Triple);
Daniel Dunbar606f6142009-03-30 21:06:03 +0000542}
543
Daniel Dunbar08303652009-05-22 02:53:45 +0000544const HostInfo *
545clang::driver::createDragonFlyHostInfo(const Driver &D,
546 const llvm::Triple& Triple) {
547 return new DragonFlyHostInfo(D, Triple);
Daniel Dunbar46363f52009-05-02 18:28:39 +0000548}
549
Daniel Dunbar08303652009-05-22 02:53:45 +0000550const HostInfo *
Eli Friedman8cac4352009-05-26 07:52:18 +0000551clang::driver::createLinuxHostInfo(const Driver &D,
552 const llvm::Triple& Triple) {
553 return new LinuxHostInfo(D, Triple);
554}
555
556const HostInfo *
Daniel Dunbar08303652009-05-22 02:53:45 +0000557clang::driver::createUnknownHostInfo(const Driver &D,
558 const llvm::Triple& Triple) {
559 return new UnknownHostInfo(D, Triple);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000560}