blob: 745d273a5e2f141b6da6b16e1b562a0afb5d9a39 [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 Dunbarfe8aa472009-09-08 23:37:08 +000025
Daniel Dunbare3995642009-03-10 23:50:49 +000026using namespace clang::driver;
27
Daniel Dunbarcb8ab232009-05-22 02:53:45 +000028HostInfo::HostInfo(const Driver &D, const llvm::Triple &_Triple)
Mike Stump1eb44332009-09-09 15:08:12 +000029 : TheDriver(D), Triple(_Triple) {
Daniel Dunbare3995642009-03-10 23:50:49 +000030}
31
32HostInfo::~HostInfo() {
33}
34
Chris Lattneraae82f12009-03-17 22:24:01 +000035namespace {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000036
Daniel Dunbare3995642009-03-10 23:50:49 +000037// Darwin Host Info
38
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000039/// DarwinHostInfo - Darwin host information implementation.
40class DarwinHostInfo : public HostInfo {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000041 /// Cache of tool chains we have created.
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000042 mutable llvm::DenseMap<unsigned, ToolChain*> ToolChains;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000043
44public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +000045 DarwinHostInfo(const Driver &D, const llvm::Triple &Triple);
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000046 ~DarwinHostInfo();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000047
48 virtual bool useDriverDriver() const;
49
Daniel Dunbard7502d02009-09-08 23:37:19 +000050 virtual ToolChain *CreateToolChain(const ArgList &Args,
51 const char *ArchName) const;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000052};
53
Daniel Dunbarcb8ab232009-05-22 02:53:45 +000054DarwinHostInfo::DarwinHostInfo(const Driver &D, const llvm::Triple& Triple)
55 : HostInfo(D, Triple) {
Daniel Dunbare3995642009-03-10 23:50:49 +000056}
57
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000058DarwinHostInfo::~DarwinHostInfo() {
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000059 for (llvm::DenseMap<unsigned, ToolChain*>::iterator
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000060 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
61 delete it->second;
62}
63
Daniel Dunbarfe8aa472009-09-08 23:37:08 +000064bool DarwinHostInfo::useDriverDriver() const {
Daniel Dunbare3995642009-03-10 23:50:49 +000065 return true;
66}
67
Daniel Dunbard7502d02009-09-08 23:37:19 +000068ToolChain *DarwinHostInfo::CreateToolChain(const ArgList &Args,
69 const char *ArchName) const {
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000070 llvm::Triple::ArchType Arch;
71
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000072 if (!ArchName) {
Daniel Dunbarf2edbf32009-06-16 21:39:33 +000073 // If we aren't looking for a specific arch, infer the default architecture
74 // based on -arch and -m32/-m64 command line options.
75 if (Arg *A = Args.getLastArg(options::OPT_arch)) {
76 // The gcc driver behavior with multiple -arch flags wasn't consistent for
77 // things which rely on a default architecture. We just use the last -arch
Daniel Dunbar26031372010-01-27 00:56:25 +000078 // to find the default tool chain (assuming it is valid).
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000079 Arch = llvm::Triple::getArchTypeForDarwinArchName(A->getValue(Args));
Daniel Dunbarfe8aa472009-09-08 23:37:08 +000080
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000081 // If it was invalid just use the host, we will reject this command line
82 // later.
83 if (Arch == llvm::Triple::UnknownArch)
84 Arch = getTriple().getArch();
Daniel Dunbarf2edbf32009-06-16 21:39:33 +000085 } else {
86 // Otherwise default to the arch of the host.
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000087 Arch = getTriple().getArch();
Daniel Dunbarf2edbf32009-06-16 21:39:33 +000088 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +000089
Daniel Dunbarf2edbf32009-06-16 21:39:33 +000090 // Honor -m32 and -m64 when finding the default tool chain.
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000091 //
92 // FIXME: Should this information be in llvm::Triple?
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000093 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Daniel Dunbarb827a052009-11-19 03:26:40 +000094 if (A->getOption().matches(options::OPT_m32)) {
Daniel Dunbar7ef7f132009-09-08 23:37:36 +000095 if (Arch == llvm::Triple::x86_64)
96 Arch = llvm::Triple::x86;
97 if (Arch == llvm::Triple::ppc64)
98 Arch = llvm::Triple::ppc;
99 } else {
100 if (Arch == llvm::Triple::x86)
101 Arch = llvm::Triple::x86_64;
102 if (Arch == llvm::Triple::ppc)
103 Arch = llvm::Triple::ppc64;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000104 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000105 }
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000106 } else
107 Arch = llvm::Triple::getArchTypeForDarwinArchName(ArchName);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000108
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000109 assert(Arch != llvm::Triple::UnknownArch && "Unexpected arch!");
110 ToolChain *&TC = ToolChains[Arch];
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000111 if (!TC) {
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000112 llvm::Triple TCTriple(getTriple());
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000113 TCTriple.setArch(Arch);
Daniel Dunbar30392de2009-09-04 18:35:21 +0000114
Daniel Dunbar7ef7f132009-09-08 23:37:36 +0000115 // If we recognized the arch, match it to the toolchains we support.
Daniel Dunbar2dc70ad2010-08-26 01:41:44 +0000116 const char *UseNewToolChain = ::getenv("CCC_ENABLE_NEW_DARWIN_TOOLCHAIN");
117 if (UseNewToolChain ||
Daniel Dunbara9b02c02010-09-17 04:25:28 +0000118 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64 ||
Daniel Dunbar2dc70ad2010-08-26 01:41:44 +0000119 Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Daniel Dunbar5edbd232010-08-26 00:55:55 +0000120 TC = new toolchains::DarwinClang(*this, TCTriple);
Daniel Dunbar2dc70ad2010-08-26 01:41:44 +0000121 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
122 // We still use the legacy DarwinGCC toolchain on X86.
123 TC = new toolchains::DarwinGCC(*this, TCTriple);
Daniel Dunbar3bc96eb2010-03-26 22:41:03 +0000124 } else
Daniel Dunbar1d4612b2009-09-18 08:15:13 +0000125 TC = new toolchains::Darwin_Generic_GCC(*this, TCTriple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000126 }
127
128 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000129}
130
Chris Lattner3a47c4e2010-03-04 21:07:38 +0000131// TCE Host Info
132
133/// TCEHostInfo - TCE host information implementation (see http://tce.cs.tut.fi)
134class TCEHostInfo : public HostInfo {
135
136public:
137 TCEHostInfo(const Driver &D, const llvm::Triple &Triple);
Douglas Gregorda791492010-03-08 02:49:35 +0000138 ~TCEHostInfo() {}
Chris Lattner3a47c4e2010-03-04 21:07:38 +0000139
140 virtual bool useDriverDriver() const;
141
Chris Lattner3a47c4e2010-03-04 21:07:38 +0000142 virtual ToolChain *CreateToolChain(const ArgList &Args,
143 const char *ArchName) const;
144};
145
146TCEHostInfo::TCEHostInfo(const Driver &D, const llvm::Triple& Triple)
147 : HostInfo(D, Triple) {
148}
149
150bool TCEHostInfo::useDriverDriver() const {
151 return false;
152}
153
154ToolChain *TCEHostInfo::CreateToolChain(const ArgList &Args,
155 const char *ArchName) const {
156 llvm::Triple TCTriple(getTriple());
157// TCTriple.setArchName(ArchName);
158 return new toolchains::TCEToolChain(*this, TCTriple);
159}
160
161
Daniel Dunbare3995642009-03-10 23:50:49 +0000162// Unknown Host Info
163
Daniel Dunbar26031372010-01-27 00:56:25 +0000164/// UnknownHostInfo - Generic host information to use for unknown hosts.
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000165class UnknownHostInfo : public HostInfo {
166 /// Cache of tool chains we have created.
167 mutable llvm::StringMap<ToolChain*> ToolChains;
168
169public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000170 UnknownHostInfo(const Driver &D, const llvm::Triple& Triple);
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000171 ~UnknownHostInfo();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000172
173 virtual bool useDriverDriver() const;
174
Daniel Dunbard7502d02009-09-08 23:37:19 +0000175 virtual ToolChain *CreateToolChain(const ArgList &Args,
176 const char *ArchName) const;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000177};
178
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000179UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000180 : HostInfo(D, Triple) {
Daniel Dunbare3995642009-03-10 23:50:49 +0000181}
182
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000183UnknownHostInfo::~UnknownHostInfo() {
184 for (llvm::StringMap<ToolChain*>::iterator
185 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
186 delete it->second;
187}
188
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000189bool UnknownHostInfo::useDriverDriver() const {
Daniel Dunbare3995642009-03-10 23:50:49 +0000190 return false;
191}
192
Daniel Dunbard7502d02009-09-08 23:37:19 +0000193ToolChain *UnknownHostInfo::CreateToolChain(const ArgList &Args,
194 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000195 assert(!ArchName &&
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000196 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000197
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000198 // Automatically handle some instances of -m32/-m64 we know about.
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000199 std::string Arch = getArchName();
200 ArchName = Arch.c_str();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000201 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
Eli Friedman4e2567d2009-06-03 18:59:56 +0000202 if (Triple.getArch() == llvm::Triple::x86 ||
203 Triple.getArch() == llvm::Triple::x86_64) {
204 ArchName =
Daniel Dunbarb827a052009-11-19 03:26:40 +0000205 (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
Eli Friedman4e2567d2009-06-03 18:59:56 +0000206 } else if (Triple.getArch() == llvm::Triple::ppc ||
207 Triple.getArch() == llvm::Triple::ppc64) {
208 ArchName =
Daniel Dunbarb827a052009-11-19 03:26:40 +0000209 (A->getOption().matches(options::OPT_m32)) ? "powerpc" : "powerpc64";
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000210 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000211 }
212
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000213 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000214 if (!TC) {
215 llvm::Triple TCTriple(getTriple());
216 TCTriple.setArchName(ArchName);
217
218 TC = new toolchains::Generic_GCC(*this, TCTriple);
219 }
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000220
Daniel Dunbarb25c7c12009-03-18 01:39:08 +0000221 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000222}
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000223
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000224// OpenBSD Host Info
225
226/// OpenBSDHostInfo - OpenBSD host information implementation.
227class OpenBSDHostInfo : public HostInfo {
228 /// Cache of tool chains we have created.
229 mutable llvm::StringMap<ToolChain*> ToolChains;
230
231public:
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000232 OpenBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000233 : HostInfo(D, Triple) {}
234 ~OpenBSDHostInfo();
235
236 virtual bool useDriverDriver() const;
237
Daniel Dunbard7502d02009-09-08 23:37:19 +0000238 virtual ToolChain *CreateToolChain(const ArgList &Args,
239 const char *ArchName) const;
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000240};
241
242OpenBSDHostInfo::~OpenBSDHostInfo() {
243 for (llvm::StringMap<ToolChain*>::iterator
244 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
245 delete it->second;
246}
247
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000248bool OpenBSDHostInfo::useDriverDriver() const {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000249 return false;
250}
251
Daniel Dunbard7502d02009-09-08 23:37:19 +0000252ToolChain *OpenBSDHostInfo::CreateToolChain(const ArgList &Args,
253 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000254 assert(!ArchName &&
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000255 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000256
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000257 std::string Arch = getArchName();
258 ArchName = Arch.c_str();
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000259
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000260 ToolChain *&TC = ToolChains[ArchName];
261 if (!TC) {
262 llvm::Triple TCTriple(getTriple());
263 TCTriple.setArchName(ArchName);
264
265 TC = new toolchains::OpenBSD(*this, TCTriple);
266 }
267
268 return TC;
269}
270
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000271// AuroraUX Host Info
272
273/// AuroraUXHostInfo - AuroraUX host information implementation.
274class AuroraUXHostInfo : public HostInfo {
275 /// Cache of tool chains we have created.
276 mutable llvm::StringMap<ToolChain*> ToolChains;
277
278public:
279 AuroraUXHostInfo(const Driver &D, const llvm::Triple& Triple)
280 : HostInfo(D, Triple) {}
281 ~AuroraUXHostInfo();
282
283 virtual bool useDriverDriver() const;
284
Daniel Dunbard7502d02009-09-08 23:37:19 +0000285 virtual ToolChain *CreateToolChain(const ArgList &Args,
286 const char *ArchName) const;
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000287};
288
289AuroraUXHostInfo::~AuroraUXHostInfo() {
290 for (llvm::StringMap<ToolChain*>::iterator
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000291 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000292 delete it->second;
293}
294
295bool AuroraUXHostInfo::useDriverDriver() const {
296 return false;
297}
298
Daniel Dunbard7502d02009-09-08 23:37:19 +0000299ToolChain *AuroraUXHostInfo::CreateToolChain(const ArgList &Args,
300 const char *ArchName) const {
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000301 assert(!ArchName &&
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000302 "Unexpected arch name on platform without driver driver support.");
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000303
304 ToolChain *&TC = ToolChains[getArchName()];
305
306 if (!TC) {
307 llvm::Triple TCTriple(getTriple());
308 TCTriple.setArchName(getArchName());
309
310 TC = new toolchains::AuroraUX(*this, TCTriple);
311 }
312
313 return TC;
314}
315
Daniel Dunbar75358d22009-03-30 21:06:03 +0000316// FreeBSD Host Info
317
Daniel Dunbarb85f59d2009-03-30 22:11:38 +0000318/// FreeBSDHostInfo - FreeBSD host information implementation.
Daniel Dunbar75358d22009-03-30 21:06:03 +0000319class FreeBSDHostInfo : public HostInfo {
320 /// Cache of tool chains we have created.
321 mutable llvm::StringMap<ToolChain*> ToolChains;
322
323public:
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000324 FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000325 : HostInfo(D, Triple) {}
Daniel Dunbar75358d22009-03-30 21:06:03 +0000326 ~FreeBSDHostInfo();
327
328 virtual bool useDriverDriver() const;
329
Daniel Dunbard7502d02009-09-08 23:37:19 +0000330 virtual ToolChain *CreateToolChain(const ArgList &Args,
331 const char *ArchName) const;
Daniel Dunbar75358d22009-03-30 21:06:03 +0000332};
333
Daniel Dunbar75358d22009-03-30 21:06:03 +0000334FreeBSDHostInfo::~FreeBSDHostInfo() {
335 for (llvm::StringMap<ToolChain*>::iterator
336 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
337 delete it->second;
338}
339
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000340bool FreeBSDHostInfo::useDriverDriver() const {
Daniel Dunbar75358d22009-03-30 21:06:03 +0000341 return false;
342}
343
Daniel Dunbard7502d02009-09-08 23:37:19 +0000344ToolChain *FreeBSDHostInfo::CreateToolChain(const ArgList &Args,
345 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000346 assert(!ArchName &&
Daniel Dunbar75358d22009-03-30 21:06:03 +0000347 "Unexpected arch name on platform without driver driver support.");
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000348
Daniel Dunbar9d5600a2010-08-10 17:39:05 +0000349 // Automatically handle some instances of -m32/-m64 we know about.
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000350 std::string Arch = getArchName();
351 ArchName = Arch.c_str();
Daniel Dunbar9d5600a2010-08-10 17:39:05 +0000352 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
353 if (Triple.getArch() == llvm::Triple::x86 ||
354 Triple.getArch() == llvm::Triple::x86_64) {
355 ArchName =
356 (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
357 } else if (Triple.getArch() == llvm::Triple::ppc ||
358 Triple.getArch() == llvm::Triple::ppc64) {
359 ArchName =
360 (A->getOption().matches(options::OPT_m32)) ? "powerpc" : "powerpc64";
361 }
362 }
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000363
Daniel Dunbar75358d22009-03-30 21:06:03 +0000364 ToolChain *&TC = ToolChains[ArchName];
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000365 if (!TC) {
366 llvm::Triple TCTriple(getTriple());
367 TCTriple.setArchName(ArchName);
368
Daniel Dunbar214afe92010-08-02 05:43:59 +0000369 TC = new toolchains::FreeBSD(*this, TCTriple);
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000370 }
Daniel Dunbar75358d22009-03-30 21:06:03 +0000371
372 return TC;
373}
374
Chris Lattner38e317d2010-07-07 16:01:42 +0000375// Minix Host Info
376
377/// MinixHostInfo - Minix host information implementation.
378class MinixHostInfo : public HostInfo {
379 /// Cache of tool chains we have created.
380 mutable llvm::StringMap<ToolChain*> ToolChains;
381
382public:
383 MinixHostInfo(const Driver &D, const llvm::Triple& Triple)
384 : HostInfo(D, Triple) {}
385 ~MinixHostInfo();
386
387 virtual bool useDriverDriver() const;
388
Chris Lattner38e317d2010-07-07 16:01:42 +0000389 virtual ToolChain *CreateToolChain(const ArgList &Args,
390 const char *ArchName) const;
391};
392
393MinixHostInfo::~MinixHostInfo() {
394 for (llvm::StringMap<ToolChain*>::iterator
395 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it){
396 delete it->second;
397 }
398}
399
400bool MinixHostInfo::useDriverDriver() const {
401 return false;
402}
403
404ToolChain *MinixHostInfo::CreateToolChain(const ArgList &Args,
405 const char *ArchName) const {
406 assert(!ArchName &&
407 "Unexpected arch name on platform without driver driver support.");
408
409 std::string Arch = getArchName();
410 ArchName = Arch.c_str();
411
412 ToolChain *&TC = ToolChains[ArchName];
413 if (!TC) {
414 llvm::Triple TCTriple(getTriple());
415 TCTriple.setArchName(ArchName);
416
417 TC = new toolchains::Minix(*this, TCTriple);
418 }
419
420 return TC;
421}
422
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000423// DragonFly Host Info
424
425/// DragonFlyHostInfo - DragonFly host information implementation.
426class DragonFlyHostInfo : public HostInfo {
427 /// Cache of tool chains we have created.
428 mutable llvm::StringMap<ToolChain*> ToolChains;
429
430public:
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000431 DragonFlyHostInfo(const Driver &D, const llvm::Triple& Triple)
432 : HostInfo(D, Triple) {}
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000433 ~DragonFlyHostInfo();
434
435 virtual bool useDriverDriver() const;
436
Daniel Dunbard7502d02009-09-08 23:37:19 +0000437 virtual ToolChain *CreateToolChain(const ArgList &Args,
438 const char *ArchName) const;
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000439};
440
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000441DragonFlyHostInfo::~DragonFlyHostInfo() {
442 for (llvm::StringMap<ToolChain*>::iterator
443 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
444 delete it->second;
445}
446
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000447bool DragonFlyHostInfo::useDriverDriver() const {
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000448 return false;
449}
450
Daniel Dunbard7502d02009-09-08 23:37:19 +0000451ToolChain *DragonFlyHostInfo::CreateToolChain(const ArgList &Args,
452 const char *ArchName) const {
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000453 assert(!ArchName &&
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000454 "Unexpected arch name on platform without driver driver support.");
455
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000456 ToolChain *&TC = ToolChains[getArchName()];
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000457
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000458 if (!TC) {
459 llvm::Triple TCTriple(getTriple());
460 TCTriple.setArchName(getArchName());
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000461
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000462 TC = new toolchains::DragonFly(*this, TCTriple);
463 }
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000464
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000465 return TC;
466}
467
Eli Friedman6b3454a2009-05-26 07:52:18 +0000468// Linux Host Info
469
470/// LinuxHostInfo - Linux host information implementation.
471class LinuxHostInfo : public HostInfo {
472 /// Cache of tool chains we have created.
473 mutable llvm::StringMap<ToolChain*> ToolChains;
474
475public:
476 LinuxHostInfo(const Driver &D, const llvm::Triple& Triple)
477 : HostInfo(D, Triple) {}
478 ~LinuxHostInfo();
479
480 virtual bool useDriverDriver() const;
481
Daniel Dunbard7502d02009-09-08 23:37:19 +0000482 virtual ToolChain *CreateToolChain(const ArgList &Args,
483 const char *ArchName) const;
Eli Friedman6b3454a2009-05-26 07:52:18 +0000484};
485
486LinuxHostInfo::~LinuxHostInfo() {
487 for (llvm::StringMap<ToolChain*>::iterator
488 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
489 delete it->second;
490}
491
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000492bool LinuxHostInfo::useDriverDriver() const {
Eli Friedman6b3454a2009-05-26 07:52:18 +0000493 return false;
494}
495
Daniel Dunbard7502d02009-09-08 23:37:19 +0000496ToolChain *LinuxHostInfo::CreateToolChain(const ArgList &Args,
497 const char *ArchName) const {
Eli Friedman6b3454a2009-05-26 07:52:18 +0000498
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000499 assert(!ArchName &&
Eli Friedman6b3454a2009-05-26 07:52:18 +0000500 "Unexpected arch name on platform without driver driver support.");
501
Eli Friedman4e2567d2009-06-03 18:59:56 +0000502 // Automatically handle some instances of -m32/-m64 we know about.
503 std::string Arch = getArchName();
504 ArchName = Arch.c_str();
505 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
506 if (Triple.getArch() == llvm::Triple::x86 ||
507 Triple.getArch() == llvm::Triple::x86_64) {
508 ArchName =
Daniel Dunbarb827a052009-11-19 03:26:40 +0000509 (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
Eli Friedman4e2567d2009-06-03 18:59:56 +0000510 } else if (Triple.getArch() == llvm::Triple::ppc ||
511 Triple.getArch() == llvm::Triple::ppc64) {
512 ArchName =
Daniel Dunbarb827a052009-11-19 03:26:40 +0000513 (A->getOption().matches(options::OPT_m32)) ? "powerpc" : "powerpc64";
Eli Friedman4e2567d2009-06-03 18:59:56 +0000514 }
515 }
516
Eli Friedman6b3454a2009-05-26 07:52:18 +0000517 ToolChain *&TC = ToolChains[ArchName];
518
519 if (!TC) {
520 llvm::Triple TCTriple(getTriple());
Eli Friedman4e2567d2009-06-03 18:59:56 +0000521 TCTriple.setArchName(ArchName);
Eli Friedman6b3454a2009-05-26 07:52:18 +0000522
523 TC = new toolchains::Linux(*this, TCTriple);
524 }
525
526 return TC;
527}
528
Michael J. Spencerff58e362010-08-21 21:55:07 +0000529// Windows Host Info
530
531/// WindowsHostInfo - Host information to use on Microsoft Windows.
532class WindowsHostInfo : public HostInfo {
533 /// Cache of tool chains we have created.
534 mutable llvm::StringMap<ToolChain*> ToolChains;
535
536public:
537 WindowsHostInfo(const Driver &D, const llvm::Triple& Triple);
538 ~WindowsHostInfo();
539
540 virtual bool useDriverDriver() const;
541
542 virtual types::ID lookupTypeForExtension(const char *Ext) const {
543 return types::lookupTypeForExtension(Ext);
544 }
545
546 virtual ToolChain *CreateToolChain(const ArgList &Args,
547 const char *ArchName) const;
548};
549
550WindowsHostInfo::WindowsHostInfo(const Driver &D, const llvm::Triple& Triple)
551 : HostInfo(D, Triple) {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000552}
553
Michael J. Spencerff58e362010-08-21 21:55:07 +0000554WindowsHostInfo::~WindowsHostInfo() {
555 for (llvm::StringMap<ToolChain*>::iterator
556 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
557 delete it->second;
558}
559
560bool WindowsHostInfo::useDriverDriver() const {
561 return false;
562}
563
564ToolChain *WindowsHostInfo::CreateToolChain(const ArgList &Args,
565 const char *ArchName) const {
566 assert(!ArchName &&
567 "Unexpected arch name on platform without driver driver support.");
568
569 // Automatically handle some instances of -m32/-m64 we know about.
570 std::string Arch = getArchName();
571 ArchName = Arch.c_str();
572 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
573 if (Triple.getArch() == llvm::Triple::x86 ||
574 Triple.getArch() == llvm::Triple::x86_64) {
575 ArchName =
576 (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
577 }
578 }
579
580 ToolChain *&TC = ToolChains[ArchName];
581 if (!TC) {
582 llvm::Triple TCTriple(getTriple());
583 TCTriple.setArchName(ArchName);
584
585 TC = new toolchains::Windows(*this, TCTriple);
586 }
587
588 return TC;
589}
590
591// FIXME: This is a placeholder.
592class MinGWHostInfo : public UnknownHostInfo {
593public:
594 MinGWHostInfo(const Driver &D, const llvm::Triple& Triple);
595};
596
597MinGWHostInfo::MinGWHostInfo(const Driver &D, const llvm::Triple& Triple)
598 : UnknownHostInfo(D, Triple) {}
599
600} // end anon namespace
601
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000602const HostInfo *
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000603clang::driver::createAuroraUXHostInfo(const Driver &D,
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000604 const llvm::Triple& Triple){
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000605 return new AuroraUXHostInfo(D, Triple);
606}
607
608const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000609clang::driver::createDarwinHostInfo(const Driver &D,
610 const llvm::Triple& Triple){
611 return new DarwinHostInfo(D, Triple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000612}
613
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000614const HostInfo *
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000615clang::driver::createOpenBSDHostInfo(const Driver &D,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000616 const llvm::Triple& Triple) {
617 return new OpenBSDHostInfo(D, Triple);
618}
619
620const HostInfo *
Daniel Dunbarfe8aa472009-09-08 23:37:08 +0000621clang::driver::createFreeBSDHostInfo(const Driver &D,
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000622 const llvm::Triple& Triple) {
623 return new FreeBSDHostInfo(D, Triple);
Daniel Dunbar75358d22009-03-30 21:06:03 +0000624}
625
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000626const HostInfo *
Chris Lattner38e317d2010-07-07 16:01:42 +0000627clang::driver::createMinixHostInfo(const Driver &D,
628 const llvm::Triple& Triple) {
629 return new MinixHostInfo(D, Triple);
630}
631
632const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000633clang::driver::createDragonFlyHostInfo(const Driver &D,
634 const llvm::Triple& Triple) {
635 return new DragonFlyHostInfo(D, Triple);
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000636}
637
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000638const HostInfo *
Eli Friedman6b3454a2009-05-26 07:52:18 +0000639clang::driver::createLinuxHostInfo(const Driver &D,
640 const llvm::Triple& Triple) {
641 return new LinuxHostInfo(D, Triple);
642}
643
644const HostInfo *
Chris Lattner3a47c4e2010-03-04 21:07:38 +0000645clang::driver::createTCEHostInfo(const Driver &D,
646 const llvm::Triple& Triple) {
647 return new TCEHostInfo(D, Triple);
648}
649
650const HostInfo *
Michael J. Spencerff58e362010-08-21 21:55:07 +0000651clang::driver::createWindowsHostInfo(const Driver &D,
652 const llvm::Triple& Triple) {
653 return new WindowsHostInfo(D, Triple);
654}
655
656const HostInfo *
657clang::driver::createMinGWHostInfo(const Driver &D,
658 const llvm::Triple& Triple) {
659 return new MinGWHostInfo(D, Triple);
660}
661
662const HostInfo *
Daniel Dunbarcb8ab232009-05-22 02:53:45 +0000663clang::driver::createUnknownHostInfo(const Driver &D,
664 const llvm::Triple& Triple) {
665 return new UnknownHostInfo(D, Triple);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000666}