blob: 602a977135055c26abab19704fab24584a7cebab [file] [log] [blame]
Daniel Dunbare3995642009-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 Dunbar1fd6c4b2009-03-17 19:00:50 +000011
12#include "clang/Driver/Arg.h"
13#include "clang/Driver/ArgList.h"
Daniel Dunbarfc6a8992009-03-20 18:21:51 +000014#include "clang/Driver/Driver.h"
15#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar1fd6c4b2009-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 Dunbar83b08eb2009-03-17 21:38:00 +000022#include "ToolChains.h"
23
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000024#include <cassert>
Daniel Dunbare3995642009-03-10 23:50:49 +000025
26using namespace clang::driver;
27
Daniel Dunbarcb8ab232009-05-22 02:53:45 +000028HostInfo::HostInfo(const Driver &D, const llvm::Triple &_Triple)
29 : TheDriver(D), Triple(_Triple)
Daniel Dunbare3995642009-03-10 23:50:49 +000030{
31
32}
33
34HostInfo::~HostInfo() {
35}
36
Chris Lattneraae82f12009-03-17 22:24:01 +000037namespace {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000038
Daniel Dunbare3995642009-03-10 23:50:49 +000039// Darwin Host Info
40
Daniel Dunbar1fd6c4b2009-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 Dunbar7e4534d2009-03-18 01:09:40 +000050 mutable llvm::StringMap<ToolChain *> ToolChains;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000051
52public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +000053 DarwinHostInfo(const Driver &D, const llvm::Triple &Triple);
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000054 ~DarwinHostInfo();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000055
56 virtual bool useDriverDriver() const;
57
Daniel Dunbare33bea42009-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 Dunbar1fd6c4b2009-03-17 19:00:50 +000069 virtual ToolChain *getToolChain(const ArgList &Args,
70 const char *ArchName) const;
71};
72
Daniel Dunbarcb8ab232009-05-22 02:53:45 +000073DarwinHostInfo::DarwinHostInfo(const Driver &D, const llvm::Triple& Triple)
74 : HostInfo(D, Triple) {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000075
76 assert((getArchName() == "i386" || getArchName() == "x86_64" ||
Eli Friedman8ea97542009-05-28 20:57:06 +000077 getArchName() == "powerpc" || getArchName() == "powerpc64" ||
78 getArchName() == "arm") &&
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000079 "Unknown Darwin arch.");
Daniel Dunbare3995642009-03-10 23:50:49 +000080
Daniel Dunbarfc6a8992009-03-20 18:21:51 +000081 assert(memcmp(&getOSName()[0], "darwin", 6) == 0 &&
82 "Unknown Darwin platform.");
Daniel Dunbard73fe9b2009-03-26 15:58:36 +000083 bool HadExtra;
Daniel Dunbar10708c42009-05-23 18:55:58 +000084 if (!Driver::GetReleaseVersion(&getOSName()[6],
85 DarwinVersion[0], DarwinVersion[1],
Daniel Dunbard73fe9b2009-03-26 15:58:36 +000086 DarwinVersion[2], HadExtra)) {
Daniel Dunbarfc6a8992009-03-20 18:21:51 +000087 D.Diag(clang::diag::err_drv_invalid_darwin_version)
Daniel Dunbar10708c42009-05-23 18:55:58 +000088 << getOSName();
Daniel Dunbarfc6a8992009-03-20 18:21:51 +000089 }
Daniel Dunbare3995642009-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 Dunbar7e4534d2009-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 Dunbare3995642009-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 Dunbarcb8ab232009-05-22 02:53:45 +0000109 std::string Arch;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000110 if (!ArchName) {
Daniel Dunbarf2edbf32009-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 Dunbar407899b2009-06-16 21:46:01 +0000125 else if (Arch == "ppc64")
Daniel Dunbarf2edbf32009-06-16 21:39:33 +0000126 Arch = "powerpc64";
127 } else {
128 // Otherwise default to the arch of the host.
129 Arch = getArchName();
130 }
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000131 ArchName = Arch.c_str();
Daniel Dunbarf2edbf32009-06-16 21:39:33 +0000132
133 // Honor -m32 and -m64 when finding the default tool chain.
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000134 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Daniel Dunbarf2edbf32009-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 Dunbarbf54a062009-04-01 20:33:11 +0000139 ArchName = (A->getOption().getId() == options::OPT_m32) ? "powerpc" :
140 "powerpc64";
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000141 }
142 }
Daniel Dunbarbf54a062009-04-01 20:33:11 +0000143 } else {
144 // Normalize arch name; we shouldn't be doing this here.
Daniel Dunbarcb8ab232009-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 Dunbarbf54a062009-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 Dunbar1fd6c4b2009-03-17 19:00:50 +0000152 }
153
154 ToolChain *&TC = ToolChains[ArchName];
155 if (!TC) {
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000156 llvm::Triple TCTriple(getTriple());
157 TCTriple.setArchName(ArchName);
158
Daniel Dunbar83b08eb2009-03-17 21:38:00 +0000159 if (strcmp(ArchName, "i386") == 0 || strcmp(ArchName, "x86_64") == 0)
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000160 TC = new toolchains::Darwin_X86(*this, TCTriple,
Daniel Dunbarc50b00d2009-03-23 16:15:50 +0000161 DarwinVersion,
162 GCCVersion);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000163 else
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000164 TC = new toolchains::Darwin_GCC(*this, TCTriple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000165 }
166
167 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000168}
169
170// Unknown Host Info
171
Daniel Dunbar1fd6c4b2009-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 Dunbarcb8ab232009-05-22 02:53:45 +0000179 UnknownHostInfo(const Driver &D, const llvm::Triple& Triple);
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000180 ~UnknownHostInfo();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000181
182 virtual bool useDriverDriver() const;
183
Daniel Dunbare33bea42009-03-20 23:39:23 +0000184 virtual types::ID lookupTypeForExtension(const char *Ext) const {
185 return types::lookupTypeForExtension(Ext);
186 }
187
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000188 virtual ToolChain *getToolChain(const ArgList &Args,
189 const char *ArchName) const;
190};
191
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000192UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple)
193 : HostInfo(D, Triple) {
Daniel Dunbare3995642009-03-10 23:50:49 +0000194}
195
Daniel Dunbar7e4534d2009-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 Dunbare3995642009-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 Dunbar1fd6c4b2009-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 Dunbarcb8ab232009-05-22 02:53:45 +0000212 std::string Arch = getArchName();
213 ArchName = Arch.c_str();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000214 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Eli Friedman4e2567d2009-06-03 18:59:56 +0000215 if (Triple.getArch() == llvm::Triple::x86 ||
216 Triple.getArch() == llvm::Triple::x86_64) {
217 ArchName =
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000218 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
Eli Friedman4e2567d2009-06-03 18:59:56 +0000219 } else if (Triple.getArch() == llvm::Triple::ppc ||
220 Triple.getArch() == llvm::Triple::ppc64) {
221 ArchName =
Daniel Dunbarbf54a062009-04-01 20:33:11 +0000222 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000223 }
224 }
225
226 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbarcb8ab232009-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 Dunbar1fd6c4b2009-03-17 19:00:50 +0000233
Daniel Dunbarb25c7c12009-03-18 01:39:08 +0000234 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000235}
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000236
Daniel Dunbarf7b8eec2009-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
Daniel Dunbar75358d22009-03-30 21:06:03 +0000288// FreeBSD Host Info
289
Daniel Dunbarb85f59d2009-03-30 22:11:38 +0000290/// FreeBSDHostInfo - FreeBSD host information implementation.
Daniel Dunbar75358d22009-03-30 21:06:03 +0000291class FreeBSDHostInfo : public HostInfo {
292 /// Cache of tool chains we have created.
293 mutable llvm::StringMap<ToolChain*> ToolChains;
294
295public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000296 FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
297 : HostInfo(D, Triple) {}
Daniel Dunbar75358d22009-03-30 21:06:03 +0000298 ~FreeBSDHostInfo();
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
Daniel Dunbar75358d22009-03-30 21:06:03 +0000310FreeBSDHostInfo::~FreeBSDHostInfo() {
311 for (llvm::StringMap<ToolChain*>::iterator
312 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
313 delete it->second;
314}
315
316bool FreeBSDHostInfo::useDriverDriver() const {
317 return false;
318}
319
320ToolChain *FreeBSDHostInfo::getToolChain(const ArgList &Args,
321 const char *ArchName) const {
322 bool Lib32 = false;
323
324 assert(!ArchName &&
325 "Unexpected arch name on platform without driver driver support.");
326
327 // On x86_64 we need to be able to compile 32-bits binaries as well.
328 // Compiling 64-bit binaries on i386 is not supported. We don't have a
329 // lib64.
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000330 std::string Arch = getArchName();
331 ArchName = Arch.c_str();
Daniel Dunbar75358d22009-03-30 21:06:03 +0000332 if (Args.hasArg(options::OPT_m32) && getArchName() == "x86_64") {
333 ArchName = "i386";
334 Lib32 = true;
335 }
336
337 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000338 if (!TC) {
339 llvm::Triple TCTriple(getTriple());
340 TCTriple.setArchName(ArchName);
341
342 TC = new toolchains::FreeBSD(*this, TCTriple, Lib32);
343 }
Daniel Dunbar75358d22009-03-30 21:06:03 +0000344
345 return TC;
346}
347
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000348// DragonFly Host Info
349
350/// DragonFlyHostInfo - DragonFly host information implementation.
351class DragonFlyHostInfo : public HostInfo {
352 /// Cache of tool chains we have created.
353 mutable llvm::StringMap<ToolChain*> ToolChains;
354
355public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000356 DragonFlyHostInfo(const Driver &D, const llvm::Triple& Triple)
357 : HostInfo(D, Triple) {}
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000358 ~DragonFlyHostInfo();
359
360 virtual bool useDriverDriver() const;
361
362 virtual types::ID lookupTypeForExtension(const char *Ext) const {
363 return types::lookupTypeForExtension(Ext);
364 }
365
366 virtual ToolChain *getToolChain(const ArgList &Args,
367 const char *ArchName) const;
368};
369
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000370DragonFlyHostInfo::~DragonFlyHostInfo() {
371 for (llvm::StringMap<ToolChain*>::iterator
372 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
373 delete it->second;
374}
375
376bool DragonFlyHostInfo::useDriverDriver() const {
377 return false;
378}
379
380ToolChain *DragonFlyHostInfo::getToolChain(const ArgList &Args,
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000381 const char *ArchName) const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000382 assert(!ArchName &&
383 "Unexpected arch name on platform without driver driver support.");
384
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000385 ToolChain *&TC = ToolChains[getArchName()];
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000386
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000387 if (!TC) {
388 llvm::Triple TCTriple(getTriple());
389 TCTriple.setArchName(getArchName());
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000390
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000391 TC = new toolchains::DragonFly(*this, TCTriple);
392 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000393
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000394 return TC;
395}
396
Eli Friedman6b3454a2009-05-26 07:52:18 +0000397// Linux Host Info
398
399/// LinuxHostInfo - Linux host information implementation.
400class LinuxHostInfo : public HostInfo {
401 /// Cache of tool chains we have created.
402 mutable llvm::StringMap<ToolChain*> ToolChains;
403
404public:
405 LinuxHostInfo(const Driver &D, const llvm::Triple& Triple)
406 : HostInfo(D, Triple) {}
407 ~LinuxHostInfo();
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
419LinuxHostInfo::~LinuxHostInfo() {
420 for (llvm::StringMap<ToolChain*>::iterator
421 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
422 delete it->second;
423}
424
425bool LinuxHostInfo::useDriverDriver() const {
426 return false;
427}
428
429ToolChain *LinuxHostInfo::getToolChain(const ArgList &Args,
430 const char *ArchName) const {
431
432 assert(!ArchName &&
433 "Unexpected arch name on platform without driver driver support.");
434
Eli Friedman4e2567d2009-06-03 18:59:56 +0000435 // Automatically handle some instances of -m32/-m64 we know about.
436 std::string Arch = getArchName();
437 ArchName = Arch.c_str();
438 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
439 if (Triple.getArch() == llvm::Triple::x86 ||
440 Triple.getArch() == llvm::Triple::x86_64) {
441 ArchName =
442 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
443 } else if (Triple.getArch() == llvm::Triple::ppc ||
444 Triple.getArch() == llvm::Triple::ppc64) {
445 ArchName =
446 (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
447 }
448 }
449
Eli Friedman6b3454a2009-05-26 07:52:18 +0000450 ToolChain *&TC = ToolChains[ArchName];
451
452 if (!TC) {
453 llvm::Triple TCTriple(getTriple());
Eli Friedman4e2567d2009-06-03 18:59:56 +0000454 TCTriple.setArchName(ArchName);
Eli Friedman6b3454a2009-05-26 07:52:18 +0000455
456 TC = new toolchains::Linux(*this, TCTriple);
457 }
458
459 return TC;
460}
461
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000462}
463
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000464const HostInfo *
465clang::driver::createDarwinHostInfo(const Driver &D,
466 const llvm::Triple& Triple){
467 return new DarwinHostInfo(D, Triple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000468}
469
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000470const HostInfo *
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000471clang::driver::createOpenBSDHostInfo(const Driver &D,
472 const llvm::Triple& Triple) {
473 return new OpenBSDHostInfo(D, Triple);
474}
475
476const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000477clang::driver::createFreeBSDHostInfo(const Driver &D,
478 const llvm::Triple& Triple) {
479 return new FreeBSDHostInfo(D, Triple);
Daniel Dunbar75358d22009-03-30 21:06:03 +0000480}
481
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000482const HostInfo *
483clang::driver::createDragonFlyHostInfo(const Driver &D,
484 const llvm::Triple& Triple) {
485 return new DragonFlyHostInfo(D, Triple);
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000486}
487
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000488const HostInfo *
Eli Friedman6b3454a2009-05-26 07:52:18 +0000489clang::driver::createLinuxHostInfo(const Driver &D,
490 const llvm::Triple& Triple) {
491 return new LinuxHostInfo(D, Triple);
492}
493
494const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000495clang::driver::createUnknownHostInfo(const Driver &D,
496 const llvm::Triple& Triple) {
497 return new UnknownHostInfo(D, Triple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000498}