blob: 9e8213876ca9f4d690422b0d7e28775cafc5075a [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
20#include <cassert>
Daniel Dunbare3995642009-03-10 23:50:49 +000021
22using namespace clang::driver;
23
Daniel Dunbare5049522009-03-17 20:45:45 +000024HostInfo::HostInfo(const Driver &D, const char *_Arch, const char *_Platform,
Daniel Dunbare3995642009-03-10 23:50:49 +000025 const char *_OS)
Daniel Dunbare5049522009-03-17 20:45:45 +000026 : TheDriver(D), Arch(_Arch), Platform(_Platform), OS(_OS)
Daniel Dunbare3995642009-03-10 23:50:49 +000027{
28
29}
30
31HostInfo::~HostInfo() {
32}
33
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000034namespace VISIBILITY_HIDDEN {
35
Daniel Dunbare3995642009-03-10 23:50:49 +000036// Darwin Host Info
37
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000038/// DarwinHostInfo - Darwin host information implementation.
39class DarwinHostInfo : public HostInfo {
40 /// Darwin version of host.
41 unsigned DarwinVersion[3];
42
43 /// GCC version to use on this host.
44 unsigned GCCVersion[3];
45
46 /// Cache of tool chains we have created.
47 mutable llvm::StringMap<ToolChain*> ToolChains;
48
49public:
Daniel Dunbare5049522009-03-17 20:45:45 +000050 DarwinHostInfo(const Driver &D, const char *Arch,
51 const char *Platform, const char *OS);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000052
53 virtual bool useDriverDriver() const;
54
55 virtual ToolChain *getToolChain(const ArgList &Args,
56 const char *ArchName) const;
57};
58
Daniel Dunbare5049522009-03-17 20:45:45 +000059DarwinHostInfo::DarwinHostInfo(const Driver &D, const char *_Arch,
60 const char *_Platform, const char *_OS)
61 : HostInfo(D, _Arch, _Platform, _OS) {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000062
63 assert((getArchName() == "i386" || getArchName() == "x86_64" ||
64 getArchName() == "ppc" || getArchName() == "ppc64") &&
65 "Unknown Darwin arch.");
Daniel Dunbare3995642009-03-10 23:50:49 +000066
67 // FIXME: How to deal with errors?
68
69 // We can only call 4.2.1 for now.
70 GCCVersion[0] = 4;
71 GCCVersion[1] = 2;
72 GCCVersion[2] = 1;
73}
74
75bool DarwinHostInfo::useDriverDriver() const {
76 return true;
77}
78
79ToolChain *DarwinHostInfo::getToolChain(const ArgList &Args,
80 const char *ArchName) const {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +000081 if (!ArchName) {
82 ArchName = getArchName().c_str();
83
84 // If no arch name is specified, infer it from the host and
85 // -m32/-m64.
86 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
87 if (getArchName() == "i386" || getArchName() == "x86_64") {
88 ArchName =
89 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
90 } else if (getArchName() == "ppc" || getArchName() == "ppc64") {
91 ArchName =
92 (A->getOption().getId() == options::OPT_m32) ? "ppc" : "ppc64";
93 }
94 }
95 }
96
97 ToolChain *&TC = ToolChains[ArchName];
98 if (!TC) {
99 TC = 0;
100#if 0
101 if (ArchName == "i386")
102 TC = new Darwin_X86_ToolChain(ArchName);
103 else if (ArchName == "x86_64")
104 TC = new Darwin_X86_ToolChain(ArchName);
105 else
106 TC = new Darwin_GCC_ToolChain(ArchName);
107#endif
108 }
109
110 return TC;
Daniel Dunbare3995642009-03-10 23:50:49 +0000111}
112
113// Unknown Host Info
114
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000115/// UnknownHostInfo - Generic host information to use for unknown
116/// hosts.
117class UnknownHostInfo : public HostInfo {
118 /// Cache of tool chains we have created.
119 mutable llvm::StringMap<ToolChain*> ToolChains;
120
121public:
Daniel Dunbare5049522009-03-17 20:45:45 +0000122 UnknownHostInfo(const Driver &D, const char *Arch,
123 const char *Platform, const char *OS);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000124
125 virtual bool useDriverDriver() const;
126
127 virtual ToolChain *getToolChain(const ArgList &Args,
128 const char *ArchName) const;
129};
130
Daniel Dunbare5049522009-03-17 20:45:45 +0000131UnknownHostInfo::UnknownHostInfo(const Driver &D, const char *Arch,
132 const char *Platform, const char *OS)
133 : HostInfo(D, Arch, Platform, OS) {
Daniel Dunbare3995642009-03-10 23:50:49 +0000134}
135
136bool UnknownHostInfo::useDriverDriver() const {
137 return false;
138}
139
140ToolChain *UnknownHostInfo::getToolChain(const ArgList &Args,
141 const char *ArchName) const {
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000142 assert(!ArchName &&
143 "Unexpected arch name on platform without driver driver support.");
144
145 // Automatically handle some instances of -m32/-m64 we know about.
146 ArchName = getArchName().c_str();
147 if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
148 if (getArchName() == "i386" || getArchName() == "x86_64") {
149 ArchName =
150 (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
151 } else if (getArchName() == "ppc" || getArchName() == "ppc64") {
152 ArchName =
153 (A->getOption().getId() == options::OPT_m32) ? "ppc" : "ppc64";
154 }
155 }
156
157 ToolChain *&TC = ToolChains[ArchName];
158 if (!TC)
159 TC = 0; //new Generic_GCC_ToolChain(ArchName);
160
Daniel Dunbare3995642009-03-10 23:50:49 +0000161 return 0;
162}
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000163
164}
165
Daniel Dunbare5049522009-03-17 20:45:45 +0000166const HostInfo *clang::driver::createDarwinHostInfo(const Driver &D,
167 const char *Arch,
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000168 const char *Platform,
169 const char *OS) {
Daniel Dunbare5049522009-03-17 20:45:45 +0000170 return new DarwinHostInfo(D, Arch, Platform, OS);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000171}
172
Daniel Dunbare5049522009-03-17 20:45:45 +0000173const HostInfo *clang::driver::createUnknownHostInfo(const Driver &D,
174 const char *Arch,
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000175 const char *Platform,
176 const char *OS) {
Daniel Dunbare5049522009-03-17 20:45:45 +0000177 return new UnknownHostInfo(D, Arch, Platform, OS);
Daniel Dunbar1fd6c4b2009-03-17 19:00:50 +0000178}