blob: a1dc1496ac6d4c21f523113d06c19dd6a3975bec [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"
14#include "clang/Driver/Option.h"
15#include "clang/Driver/Options.h"
16
17#include "llvm/ADT/StringMap.h"
18#include "llvm/Support/Compiler.h"
19
Daniel Dunbar83b08eb2009-03-17 21:38:00 +000020#include "ToolChains.h"
21
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000022#include <cassert>
Daniel Dunbare3995642009-03-10 23:50:49 +000023
24using namespace clang::driver;
25
Daniel Dunbare5049522009-03-17 20:45:45 +000026HostInfo::HostInfo(const Driver &D, const char *_Arch, const char *_Platform,
Daniel Dunbare3995642009-03-10 23:50:49 +000027 const char *_OS)
Daniel Dunbare5049522009-03-17 20:45:45 +000028 : TheDriver(D), Arch(_Arch), Platform(_Platform), OS(_OS)
Daniel Dunbare3995642009-03-10 23:50:49 +000029{
30
31}
32
33HostInfo::~HostInfo() {
34}
35
Chris Lattneraae82f12009-03-17 22:24:01 +000036namespace {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000037
Daniel Dunbare3995642009-03-10 23:50:49 +000038// Darwin Host Info
39
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000040/// DarwinHostInfo - Darwin host information implementation.
41class DarwinHostInfo : public HostInfo {
42 /// Darwin version of host.
43 unsigned DarwinVersion[3];
44
45 /// GCC version to use on this host.
46 unsigned GCCVersion[3];
47
48 /// Cache of tool chains we have created.
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000049 mutable llvm::StringMap<ToolChain *> ToolChains;
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000050
51public:
Daniel Dunbare5049522009-03-17 20:45:45 +000052 DarwinHostInfo(const Driver &D, const char *Arch,
53 const char *Platform, const char *OS);
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000054 ~DarwinHostInfo();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000055
56 virtual bool useDriverDriver() const;
57
58 virtual ToolChain *getToolChain(const ArgList &Args,
59 const char *ArchName) const;
60};
61
Daniel Dunbare5049522009-03-17 20:45:45 +000062DarwinHostInfo::DarwinHostInfo(const Driver &D, const char *_Arch,
63 const char *_Platform, const char *_OS)
64 : HostInfo(D, _Arch, _Platform, _OS) {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000065
66 assert((getArchName() == "i386" || getArchName() == "x86_64" ||
67 getArchName() == "ppc" || getArchName() == "ppc64") &&
68 "Unknown Darwin arch.");
Daniel Dunbare3995642009-03-10 23:50:49 +000069
70 // FIXME: How to deal with errors?
71
72 // We can only call 4.2.1 for now.
73 GCCVersion[0] = 4;
74 GCCVersion[1] = 2;
75 GCCVersion[2] = 1;
76}
77
Daniel Dunbar7e4534d2009-03-18 01:09:40 +000078DarwinHostInfo::~DarwinHostInfo() {
79 for (llvm::StringMap<ToolChain*>::iterator
80 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
81 delete it->second;
82}
83
Daniel Dunbare3995642009-03-10 23:50:49 +000084bool DarwinHostInfo::useDriverDriver() const {
85 return true;
86}
87
88ToolChain *DarwinHostInfo::getToolChain(const ArgList &Args,
89 const char *ArchName) const {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000090 if (!ArchName) {
91 ArchName = getArchName().c_str();
92
93 // If no arch name is specified, infer it from the host and
94 // -m32/-m64.
95 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
96 if (getArchName() == "i386" || getArchName() == "x86_64") {
97 ArchName =
98 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
99 } else if (getArchName() == "ppc" || getArchName() == "ppc64") {
100 ArchName =
101 (A->getOption().getId() == options::OPT_m32) ? "ppc" : "ppc64";
102 }
103 }
104 }
105
106 ToolChain *&TC = ToolChains[ArchName];
107 if (!TC) {
Daniel Dunbar83b08eb2009-03-17 21:38:00 +0000108 if (strcmp(ArchName, "i386") == 0 || strcmp(ArchName, "x86_64") == 0)
109 TC = new toolchains::Generic_GCC(*this, ArchName,
110 getPlatformName().c_str(),
111 getOSName().c_str());
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000112 else
Daniel Dunbar83b08eb2009-03-17 21:38:00 +0000113 TC = new toolchains::Generic_GCC(*this, ArchName,
114 getPlatformName().c_str(),
115 getOSName().c_str());
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000116 }
117
118 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000119}
120
121// Unknown Host Info
122
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000123/// UnknownHostInfo - Generic host information to use for unknown
124/// hosts.
125class UnknownHostInfo : public HostInfo {
126 /// Cache of tool chains we have created.
127 mutable llvm::StringMap<ToolChain*> ToolChains;
128
129public:
Daniel Dunbare5049522009-03-17 20:45:45 +0000130 UnknownHostInfo(const Driver &D, const char *Arch,
131 const char *Platform, const char *OS);
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000132 ~UnknownHostInfo();
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000133
134 virtual bool useDriverDriver() const;
135
136 virtual ToolChain *getToolChain(const ArgList &Args,
137 const char *ArchName) const;
138};
139
Daniel Dunbare5049522009-03-17 20:45:45 +0000140UnknownHostInfo::UnknownHostInfo(const Driver &D, const char *Arch,
141 const char *Platform, const char *OS)
142 : HostInfo(D, Arch, Platform, OS) {
Daniel Dunbare3995642009-03-10 23:50:49 +0000143}
144
Daniel Dunbar7e4534d2009-03-18 01:09:40 +0000145UnknownHostInfo::~UnknownHostInfo() {
146 for (llvm::StringMap<ToolChain*>::iterator
147 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
148 delete it->second;
149}
150
Daniel Dunbare3995642009-03-10 23:50:49 +0000151bool UnknownHostInfo::useDriverDriver() const {
152 return false;
153}
154
155ToolChain *UnknownHostInfo::getToolChain(const ArgList &Args,
156 const char *ArchName) const {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000157 assert(!ArchName &&
158 "Unexpected arch name on platform without driver driver support.");
159
160 // Automatically handle some instances of -m32/-m64 we know about.
161 ArchName = getArchName().c_str();
162 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
163 if (getArchName() == "i386" || getArchName() == "x86_64") {
164 ArchName =
165 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
166 } else if (getArchName() == "ppc" || getArchName() == "ppc64") {
167 ArchName =
168 (A->getOption().getId() == options::OPT_m32) ? "ppc" : "ppc64";
169 }
170 }
171
172 ToolChain *&TC = ToolChains[ArchName];
173 if (!TC)
Daniel Dunbar83b08eb2009-03-17 21:38:00 +0000174 TC = new toolchains::Generic_GCC(*this, ArchName,
175 getPlatformName().c_str(),
176 getOSName().c_str());
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000177
Daniel Dunbarb25c7c12009-03-18 01:39:08 +0000178 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000179}
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000180
181}
182
Daniel Dunbare5049522009-03-17 20:45:45 +0000183const HostInfo *clang::driver::createDarwinHostInfo(const Driver &D,
184 const char *Arch,
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000185 const char *Platform,
186 const char *OS) {
Daniel Dunbare5049522009-03-17 20:45:45 +0000187 return new DarwinHostInfo(D, Arch, Platform, OS);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000188}
189
Daniel Dunbare5049522009-03-17 20:45:45 +0000190const HostInfo *clang::driver::createUnknownHostInfo(const Driver &D,
191 const char *Arch,
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000192 const char *Platform,
193 const char *OS) {
Daniel Dunbare5049522009-03-17 20:45:45 +0000194 return new UnknownHostInfo(D, Arch, Platform, OS);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000195}