aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/HostInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Driver/HostInfo.cpp')
-rw-r--r--lib/Driver/HostInfo.cpp123
1 files changed, 118 insertions, 5 deletions
diff --git a/lib/Driver/HostInfo.cpp b/lib/Driver/HostInfo.cpp
index 3ae0c38d39..5069bda3ed 100644
--- a/lib/Driver/HostInfo.cpp
+++ b/lib/Driver/HostInfo.cpp
@@ -8,6 +8,16 @@
//===----------------------------------------------------------------------===//
#include "clang/Driver/HostInfo.h"
+
+#include "clang/Driver/Arg.h"
+#include "clang/Driver/ArgList.h"
+#include "clang/Driver/Option.h"
+#include "clang/Driver/Options.h"
+
+#include "llvm/ADT/StringMap.h"
+#include "llvm/Support/Compiler.h"
+
+#include <cassert>
using namespace clang::driver;
@@ -21,11 +31,37 @@ HostInfo::HostInfo(const char *_Arch, const char *_Platform,
HostInfo::~HostInfo() {
}
+namespace VISIBILITY_HIDDEN {
+
// Darwin Host Info
-DarwinHostInfo::DarwinHostInfo(const char *Arch, const char *Platform,
- const char *OS)
- : HostInfo(Arch, Platform, OS) {
+/// DarwinHostInfo - Darwin host information implementation.
+class DarwinHostInfo : public HostInfo {
+ /// Darwin version of host.
+ unsigned DarwinVersion[3];
+
+ /// GCC version to use on this host.
+ unsigned GCCVersion[3];
+
+ /// Cache of tool chains we have created.
+ mutable llvm::StringMap<ToolChain*> ToolChains;
+
+public:
+ DarwinHostInfo(const char *Arch, const char *Platform, const char *OS);
+
+ virtual bool useDriverDriver() const;
+
+ virtual ToolChain *getToolChain(const ArgList &Args,
+ const char *ArchName) const;
+};
+
+DarwinHostInfo::DarwinHostInfo(const char *_Arch, const char *_Platform,
+ const char *_OS)
+ : HostInfo(_Arch, _Platform, _OS) {
+
+ assert((getArchName() == "i386" || getArchName() == "x86_64" ||
+ getArchName() == "ppc" || getArchName() == "ppc64") &&
+ "Unknown Darwin arch.");
// FIXME: How to deal with errors?
@@ -41,13 +77,57 @@ bool DarwinHostInfo::useDriverDriver() const {
ToolChain *DarwinHostInfo::getToolChain(const ArgList &Args,
const char *ArchName) const {
- return 0;
+ if (!ArchName) {
+ ArchName = getArchName().c_str();
+
+ // If no arch name is specified, infer it from the host and
+ // -m32/-m64.
+ if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
+ if (getArchName() == "i386" || getArchName() == "x86_64") {
+ ArchName =
+ (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
+ } else if (getArchName() == "ppc" || getArchName() == "ppc64") {
+ ArchName =
+ (A->getOption().getId() == options::OPT_m32) ? "ppc" : "ppc64";
+ }
+ }
+ }
+
+ ToolChain *&TC = ToolChains[ArchName];
+ if (!TC) {
+ TC = 0;
+#if 0
+ if (ArchName == "i386")
+ TC = new Darwin_X86_ToolChain(ArchName);
+ else if (ArchName == "x86_64")
+ TC = new Darwin_X86_ToolChain(ArchName);
+ else
+ TC = new Darwin_GCC_ToolChain(ArchName);
+#endif
+ }
+
+ return TC;
}
// Unknown Host Info
+/// UnknownHostInfo - Generic host information to use for unknown
+/// hosts.
+class UnknownHostInfo : public HostInfo {
+ /// Cache of tool chains we have created.
+ mutable llvm::StringMap<ToolChain*> ToolChains;
+
+public:
+ UnknownHostInfo(const char *Arch, const char *Platform, const char *OS);
+
+ virtual bool useDriverDriver() const;
+
+ virtual ToolChain *getToolChain(const ArgList &Args,
+ const char *ArchName) const;
+};
+
UnknownHostInfo::UnknownHostInfo(const char *Arch, const char *Platform,
- const char *OS)
+ const char *OS)
: HostInfo(Arch, Platform, OS) {
}
@@ -57,5 +137,38 @@ bool UnknownHostInfo::useDriverDriver() const {
ToolChain *UnknownHostInfo::getToolChain(const ArgList &Args,
const char *ArchName) const {
+ assert(!ArchName &&
+ "Unexpected arch name on platform without driver driver support.");
+
+ // Automatically handle some instances of -m32/-m64 we know about.
+ ArchName = getArchName().c_str();
+ if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
+ if (getArchName() == "i386" || getArchName() == "x86_64") {
+ ArchName =
+ (A->getOption().getId() == options::OPT_m32) ? "i386" : "x86_64";
+ } else if (getArchName() == "ppc" || getArchName() == "ppc64") {
+ ArchName =
+ (A->getOption().getId() == options::OPT_m32) ? "ppc" : "ppc64";
+ }
+ }
+
+ ToolChain *&TC = ToolChains[ArchName];
+ if (!TC)
+ TC = 0; //new Generic_GCC_ToolChain(ArchName);
+
return 0;
}
+
+}
+
+const HostInfo *clang::driver::createDarwinHostInfo(const char *Arch,
+ const char *Platform,
+ const char *OS) {
+ return new DarwinHostInfo(Arch, Platform, OS);
+}
+
+const HostInfo *clang::driver::createUnknownHostInfo(const char *Arch,
+ const char *Platform,
+ const char *OS) {
+ return new UnknownHostInfo(Arch, Platform, OS);
+}