diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-03-30 21:06:03 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-03-30 21:06:03 +0000 |
commit | 75358d267256022475371416654b056ad8531cb3 (patch) | |
tree | ec54a91b7c0b89b30324a159dc7d7a60c8dc58a4 /lib/Driver/HostInfo.cpp | |
parent | ba8639dd25b0bc9b9c49b305047d069342a126f2 (diff) |
Driver: Sketch FreeBSD tool chain.
- Patch by Ed Schouten!
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68061 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/HostInfo.cpp')
-rw-r--r-- | lib/Driver/HostInfo.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/Driver/HostInfo.cpp b/lib/Driver/HostInfo.cpp index c02267fbdc..07aa28673a 100644 --- a/lib/Driver/HostInfo.cpp +++ b/lib/Driver/HostInfo.cpp @@ -205,6 +205,68 @@ ToolChain *UnknownHostInfo::getToolChain(const ArgList &Args, return TC; } +// FreeBSD Host Info + +/// FreeBSDHostInfo - Similar to UnknownHostInfo, but doesn't depend on +class FreeBSDHostInfo : public HostInfo { + /// Cache of tool chains we have created. + mutable llvm::StringMap<ToolChain*> ToolChains; + +public: + FreeBSDHostInfo(const Driver &D, const char *Arch, + const char *Platform, const char *OS); + ~FreeBSDHostInfo(); + + virtual bool useDriverDriver() const; + + virtual types::ID lookupTypeForExtension(const char *Ext) const { + return types::lookupTypeForExtension(Ext); + } + + virtual ToolChain *getToolChain(const ArgList &Args, + const char *ArchName) const; +}; + +FreeBSDHostInfo::FreeBSDHostInfo(const Driver &D, const char *Arch, + const char *Platform, const char *OS) + : HostInfo(D, Arch, Platform, OS) { +} + +FreeBSDHostInfo::~FreeBSDHostInfo() { + for (llvm::StringMap<ToolChain*>::iterator + it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it) + delete it->second; +} + +bool FreeBSDHostInfo::useDriverDriver() const { + return false; +} + +ToolChain *FreeBSDHostInfo::getToolChain(const ArgList &Args, + const char *ArchName) const { + bool Lib32 = false; + + assert(!ArchName && + "Unexpected arch name on platform without driver driver support."); + + // On x86_64 we need to be able to compile 32-bits binaries as well. + // Compiling 64-bit binaries on i386 is not supported. We don't have a + // lib64. + ArchName = getArchName().c_str(); + if (Args.hasArg(options::OPT_m32) && getArchName() == "x86_64") { + ArchName = "i386"; + Lib32 = true; + } + + ToolChain *&TC = ToolChains[ArchName]; + if (!TC) + TC = new toolchains::FreeBSD(*this, ArchName, + getPlatformName().c_str(), + getOSName().c_str(), Lib32); + + return TC; +} + } const HostInfo *clang::driver::createDarwinHostInfo(const Driver &D, @@ -214,6 +276,13 @@ const HostInfo *clang::driver::createDarwinHostInfo(const Driver &D, return new DarwinHostInfo(D, Arch, Platform, OS); } +const HostInfo *clang::driver::createFreeBSDHostInfo(const Driver &D, + const char *Arch, + const char *Platform, + const char *OS) { + return new FreeBSDHostInfo(D, Arch, Platform, OS); +} + const HostInfo *clang::driver::createUnknownHostInfo(const Driver &D, const char *Arch, const char *Platform, |