blob: 1b64212d88777e0b94901f7d162204b8ef438a29 [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);
158
Daniel Dunbara12df5c2009-03-17 21:38:00 +0000159 if (strcmp(ArchName, "i386") == 0 || strcmp(ArchName, "x86_64") == 0)
Daniel Dunbar08303652009-05-22 02:53:45 +0000160 TC = new toolchains::Darwin_X86(*this, TCTriple,
Daniel Dunbar49a35de2009-03-23 16:15:50 +0000161 DarwinVersion,
162 GCCVersion);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000163 else
Daniel Dunbar08303652009-05-22 02:53:45 +0000164 TC = new toolchains::Darwin_GCC(*this, TCTriple);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000165 }
166
167 return TC;
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000168}
169
170// Unknown Host Info
171
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000172/// UnknownHostInfo - Generic host information to use for unknown
173/// hosts.
174class UnknownHostInfo : public HostInfo {
175 /// Cache of tool chains we have created.
176 mutable llvm::StringMap<ToolChain*> ToolChains;
177
178public:
Daniel Dunbar08303652009-05-22 02:53:45 +0000179 UnknownHostInfo(const Driver &D, const llvm::Triple& Triple);
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +0000180 ~UnknownHostInfo();
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000181
182 virtual bool useDriverDriver() const;
183
Daniel Dunbar7b6dfbd2009-03-20 23:39:23 +0000184 virtual types::ID lookupTypeForExtension(const char *Ext) const {
185 return types::lookupTypeForExtension(Ext);
186 }
187
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000188 virtual ToolChain *getToolChain(const ArgList &Args,
189 const char *ArchName) const;
190};
191
Daniel Dunbar08303652009-05-22 02:53:45 +0000192UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple)
193 : HostInfo(D, Triple) {
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000194}
195
Daniel Dunbar2f8b37e2009-03-18 01:09:40 +0000196UnknownHostInfo::~UnknownHostInfo() {
197 for (llvm::StringMap<ToolChain*>::iterator
198 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
199 delete it->second;
200}
201
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000202bool UnknownHostInfo::useDriverDriver() const {
203 return false;
204}
205
206ToolChain *UnknownHostInfo::getToolChain(const ArgList &Args,
207 const char *ArchName) const {
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000208 assert(!ArchName &&
209 "Unexpected arch name on platform without driver driver support.");
210
211 // Automatically handle some instances of -m32/-m64 we know about.
Daniel Dunbar08303652009-05-22 02:53:45 +0000212 std::string Arch = getArchName();
213 ArchName = Arch.c_str();
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000214 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Eli Friedman32690c12009-06-03 18:59:56 +0000215 if (Triple.getArch() == llvm::Triple::x86 ||
216 Triple.getArch() == llvm::Triple::x86_64) {
217 ArchName =
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000218 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
Eli Friedman32690c12009-06-03 18:59:56 +0000219 } else if (Triple.getArch() == llvm::Triple::ppc ||
220 Triple.getArch() == llvm::Triple::ppc64) {
221 ArchName =
Daniel Dunbarb7daa2d2009-04-01 20:33:11 +0000222 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000223 }
224 }
225
226 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbar08303652009-05-22 02:53:45 +0000227 if (!TC) {
228 llvm::Triple TCTriple(getTriple());
229 TCTriple.setArchName(ArchName);
230
231 TC = new toolchains::Generic_GCC(*this, TCTriple);
232 }
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000233
Daniel Dunbarb1dd58a2009-03-18 01:39:08 +0000234 return TC;
Daniel Dunbarc1376b62009-03-10 23:50:49 +0000235}
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000236
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000237// OpenBSD Host Info
238
239/// OpenBSDHostInfo - OpenBSD host information implementation.
240class OpenBSDHostInfo : public HostInfo {
241 /// Cache of tool chains we have created.
242 mutable llvm::StringMap<ToolChain*> ToolChains;
243
244public:
245 OpenBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
246 : HostInfo(D, Triple) {}
247 ~OpenBSDHostInfo();
248
249 virtual bool useDriverDriver() const;
250
251 virtual types::ID lookupTypeForExtension(const char *Ext) const {
252 return types::lookupTypeForExtension(Ext);
253 }
254
255 virtual ToolChain *getToolChain(const ArgList &Args,
256 const char *ArchName) const;
257};
258
259OpenBSDHostInfo::~OpenBSDHostInfo() {
260 for (llvm::StringMap<ToolChain*>::iterator
261 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
262 delete it->second;
263}
264
265bool OpenBSDHostInfo::useDriverDriver() const {
266 return false;
267}
268
269ToolChain *OpenBSDHostInfo::getToolChain(const ArgList &Args,
270 const char *ArchName) const {
271 assert(!ArchName &&
272 "Unexpected arch name on platform without driver driver support.");
273
274 std::string Arch = getArchName();
275 ArchName = Arch.c_str();
276
277 ToolChain *&TC = ToolChains[ArchName];
278 if (!TC) {
279 llvm::Triple TCTriple(getTriple());
280 TCTriple.setArchName(ArchName);
281
282 TC = new toolchains::OpenBSD(*this, TCTriple);
283 }
284
285 return TC;
286}
287
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000288// AuroraUX Host Info
289
290/// AuroraUXHostInfo - AuroraUX host information implementation.
291class AuroraUXHostInfo : public HostInfo {
292 /// Cache of tool chains we have created.
293 mutable llvm::StringMap<ToolChain*> ToolChains;
294
295public:
296 AuroraUXHostInfo(const Driver &D, const llvm::Triple& Triple)
297 : HostInfo(D, Triple) {}
298 ~AuroraUXHostInfo();
299
300 virtual bool useDriverDriver() const;
301
302 virtual types::ID lookupTypeForExtension(const char *Ext) const {
303 return types::lookupTypeForExtension(Ext);
304 }
305
306 virtual ToolChain *getToolChain(const ArgList &Args,
307 const char *ArchName) const;
308};
309
310AuroraUXHostInfo::~AuroraUXHostInfo() {
311 for (llvm::StringMap<ToolChain*>::iterator
312 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
313 delete it->second;
314}
315
316bool AuroraUXHostInfo::useDriverDriver() const {
317 return false;
318}
319
320ToolChain *AuroraUXHostInfo::getToolChain(const ArgList &Args,
321 const char *ArchName) const {
322 assert(!ArchName &&
323 "Unexpected arch name on platform without driver driver support.");
324
325 ToolChain *&TC = ToolChains[getArchName()];
326
327 if (!TC) {
328 llvm::Triple TCTriple(getTriple());
329 TCTriple.setArchName(getArchName());
330
331 TC = new toolchains::AuroraUX(*this, TCTriple);
332 }
333
334 return TC;
335}
336
Daniel Dunbar606f6142009-03-30 21:06:03 +0000337// FreeBSD Host Info
338
Daniel Dunbare9b52a22009-03-30 22:11:38 +0000339/// FreeBSDHostInfo - FreeBSD host information implementation.
Daniel Dunbar606f6142009-03-30 21:06:03 +0000340class FreeBSDHostInfo : public HostInfo {
341 /// Cache of tool chains we have created.
342 mutable llvm::StringMap<ToolChain*> ToolChains;
343
344public:
Daniel Dunbar08303652009-05-22 02:53:45 +0000345 FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
346 : HostInfo(D, Triple) {}
Daniel Dunbar606f6142009-03-30 21:06:03 +0000347 ~FreeBSDHostInfo();
348
349 virtual bool useDriverDriver() const;
350
351 virtual types::ID lookupTypeForExtension(const char *Ext) const {
352 return types::lookupTypeForExtension(Ext);
353 }
354
355 virtual ToolChain *getToolChain(const ArgList &Args,
356 const char *ArchName) const;
357};
358
Daniel Dunbar606f6142009-03-30 21:06:03 +0000359FreeBSDHostInfo::~FreeBSDHostInfo() {
360 for (llvm::StringMap<ToolChain*>::iterator
361 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
362 delete it->second;
363}
364
365bool FreeBSDHostInfo::useDriverDriver() const {
366 return false;
367}
368
369ToolChain *FreeBSDHostInfo::getToolChain(const ArgList &Args,
370 const char *ArchName) const {
371 bool Lib32 = false;
372
373 assert(!ArchName &&
374 "Unexpected arch name on platform without driver driver support.");
375
376 // On x86_64 we need to be able to compile 32-bits binaries as well.
377 // Compiling 64-bit binaries on i386 is not supported. We don't have a
378 // lib64.
Daniel Dunbar08303652009-05-22 02:53:45 +0000379 std::string Arch = getArchName();
380 ArchName = Arch.c_str();
Daniel Dunbar606f6142009-03-30 21:06:03 +0000381 if (Args.hasArg(options::OPT_m32) && getArchName() == "x86_64") {
382 ArchName = "i386";
383 Lib32 = true;
384 }
385
386 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbar08303652009-05-22 02:53:45 +0000387 if (!TC) {
388 llvm::Triple TCTriple(getTriple());
389 TCTriple.setArchName(ArchName);
390
391 TC = new toolchains::FreeBSD(*this, TCTriple, Lib32);
392 }
Daniel Dunbar606f6142009-03-30 21:06:03 +0000393
394 return TC;
395}
396
Daniel Dunbar46363f52009-05-02 18:28:39 +0000397// DragonFly Host Info
398
399/// DragonFlyHostInfo - DragonFly host information implementation.
400class DragonFlyHostInfo : public HostInfo {
401 /// Cache of tool chains we have created.
402 mutable llvm::StringMap<ToolChain*> ToolChains;
403
404public:
Daniel Dunbar08303652009-05-22 02:53:45 +0000405 DragonFlyHostInfo(const Driver &D, const llvm::Triple& Triple)
406 : HostInfo(D, Triple) {}
Daniel Dunbar46363f52009-05-02 18:28:39 +0000407 ~DragonFlyHostInfo();
408
409 virtual bool useDriverDriver() const;
410
411 virtual types::ID lookupTypeForExtension(const char *Ext) const {
412 return types::lookupTypeForExtension(Ext);
413 }
414
415 virtual ToolChain *getToolChain(const ArgList &Args,
416 const char *ArchName) const;
417};
418
Daniel Dunbar46363f52009-05-02 18:28:39 +0000419DragonFlyHostInfo::~DragonFlyHostInfo() {
420 for (llvm::StringMap<ToolChain*>::iterator
421 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
422 delete it->second;
423}
424
425bool DragonFlyHostInfo::useDriverDriver() const {
426 return false;
427}
428
429ToolChain *DragonFlyHostInfo::getToolChain(const ArgList &Args,
Daniel Dunbar08303652009-05-22 02:53:45 +0000430 const char *ArchName) const {
Daniel Dunbar46363f52009-05-02 18:28:39 +0000431 assert(!ArchName &&
432 "Unexpected arch name on platform without driver driver support.");
433
Daniel Dunbar08303652009-05-22 02:53:45 +0000434 ToolChain *&TC = ToolChains[getArchName()];
Daniel Dunbar46363f52009-05-02 18:28:39 +0000435
Daniel Dunbar08303652009-05-22 02:53:45 +0000436 if (!TC) {
437 llvm::Triple TCTriple(getTriple());
438 TCTriple.setArchName(getArchName());
Daniel Dunbar46363f52009-05-02 18:28:39 +0000439
Daniel Dunbar08303652009-05-22 02:53:45 +0000440 TC = new toolchains::DragonFly(*this, TCTriple);
441 }
Daniel Dunbar46363f52009-05-02 18:28:39 +0000442
Daniel Dunbar46363f52009-05-02 18:28:39 +0000443 return TC;
444}
445
Eli Friedman8cac4352009-05-26 07:52:18 +0000446// Linux Host Info
447
448/// LinuxHostInfo - Linux host information implementation.
449class LinuxHostInfo : public HostInfo {
450 /// Cache of tool chains we have created.
451 mutable llvm::StringMap<ToolChain*> ToolChains;
452
453public:
454 LinuxHostInfo(const Driver &D, const llvm::Triple& Triple)
455 : HostInfo(D, Triple) {}
456 ~LinuxHostInfo();
457
458 virtual bool useDriverDriver() const;
459
460 virtual types::ID lookupTypeForExtension(const char *Ext) const {
461 return types::lookupTypeForExtension(Ext);
462 }
463
464 virtual ToolChain *getToolChain(const ArgList &Args,
465 const char *ArchName) const;
466};
467
468LinuxHostInfo::~LinuxHostInfo() {
469 for (llvm::StringMap<ToolChain*>::iterator
470 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
471 delete it->second;
472}
473
474bool LinuxHostInfo::useDriverDriver() const {
475 return false;
476}
477
478ToolChain *LinuxHostInfo::getToolChain(const ArgList &Args,
479 const char *ArchName) const {
480
481 assert(!ArchName &&
482 "Unexpected arch name on platform without driver driver support.");
483
Eli Friedman32690c12009-06-03 18:59:56 +0000484 // Automatically handle some instances of -m32/-m64 we know about.
485 std::string Arch = getArchName();
486 ArchName = Arch.c_str();
487 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
488 if (Triple.getArch() == llvm::Triple::x86 ||
489 Triple.getArch() == llvm::Triple::x86_64) {
490 ArchName =
491 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
492 } else if (Triple.getArch() == llvm::Triple::ppc ||
493 Triple.getArch() == llvm::Triple::ppc64) {
494 ArchName =
495 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
496 }
497 }
498
Eli Friedman8cac4352009-05-26 07:52:18 +0000499 ToolChain *&TC = ToolChains[ArchName];
500
501 if (!TC) {
502 llvm::Triple TCTriple(getTriple());
Eli Friedman32690c12009-06-03 18:59:56 +0000503 TCTriple.setArchName(ArchName);
Eli Friedman8cac4352009-05-26 07:52:18 +0000504
505 TC = new toolchains::Linux(*this, TCTriple);
506 }
507
508 return TC;
509}
510
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000511}
512
Daniel Dunbar08303652009-05-22 02:53:45 +0000513const HostInfo *
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000514clang::driver::createAuroraUXHostInfo(const Driver &D,
515 const llvm::Triple& Triple){
516 return new AuroraUXHostInfo(D, Triple);
517}
518
519const HostInfo *
Daniel Dunbar08303652009-05-22 02:53:45 +0000520clang::driver::createDarwinHostInfo(const Driver &D,
521 const llvm::Triple& Triple){
522 return new DarwinHostInfo(D, Triple);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000523}
524
Daniel Dunbar08303652009-05-22 02:53:45 +0000525const HostInfo *
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000526clang::driver::createOpenBSDHostInfo(const Driver &D,
527 const llvm::Triple& Triple) {
528 return new OpenBSDHostInfo(D, Triple);
529}
530
531const HostInfo *
Daniel Dunbar08303652009-05-22 02:53:45 +0000532clang::driver::createFreeBSDHostInfo(const Driver &D,
533 const llvm::Triple& Triple) {
534 return new FreeBSDHostInfo(D, Triple);
Daniel Dunbar606f6142009-03-30 21:06:03 +0000535}
536
Daniel Dunbar08303652009-05-22 02:53:45 +0000537const HostInfo *
538clang::driver::createDragonFlyHostInfo(const Driver &D,
539 const llvm::Triple& Triple) {
540 return new DragonFlyHostInfo(D, Triple);
Daniel Dunbar46363f52009-05-02 18:28:39 +0000541}
542
Daniel Dunbar08303652009-05-22 02:53:45 +0000543const HostInfo *
Eli Friedman8cac4352009-05-26 07:52:18 +0000544clang::driver::createLinuxHostInfo(const Driver &D,
545 const llvm::Triple& Triple) {
546 return new LinuxHostInfo(D, Triple);
547}
548
549const HostInfo *
Daniel Dunbar08303652009-05-22 02:53:45 +0000550clang::driver::createUnknownHostInfo(const Driver &D,
551 const llvm::Triple& Triple) {
552 return new UnknownHostInfo(D, Triple);
Daniel Dunbar7424b8a2009-03-17 19:00:50 +0000553}