diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2009-05-26 07:52:18 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2009-05-26 07:52:18 +0000 |
commit | 5cd659fd3219044a70075794cd3e27e87b6eb9b8 (patch) | |
tree | 0e296d2edf8c22fa96fb0cfd74ffd4b41c838de1 /clang/lib/Driver/HostInfo.cpp | |
parent | 7061ee968ce148a76f6211cbc54854d05657969e (diff) | |
download | bcm5719-llvm-5cd659fd3219044a70075794cd3e27e87b6eb9b8.tar.gz bcm5719-llvm-5cd659fd3219044a70075794cd3e27e87b6eb9b8.zip |
Fix for PR4140: Add the start of a Linux toolchain (basically, just
barely enough to get the given usage of -print-file-name working).
llvm-svn: 72412
Diffstat (limited to 'clang/lib/Driver/HostInfo.cpp')
-rw-r--r-- | clang/lib/Driver/HostInfo.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/clang/lib/Driver/HostInfo.cpp b/clang/lib/Driver/HostInfo.cpp index f60d25e754f..a9713cea472 100644 --- a/clang/lib/Driver/HostInfo.cpp +++ b/clang/lib/Driver/HostInfo.cpp @@ -322,6 +322,58 @@ ToolChain *DragonFlyHostInfo::getToolChain(const ArgList &Args, return TC; } +// Linux Host Info + +/// LinuxHostInfo - Linux host information implementation. +class LinuxHostInfo : public HostInfo { + /// Cache of tool chains we have created. + mutable llvm::StringMap<ToolChain*> ToolChains; + +public: + LinuxHostInfo(const Driver &D, const llvm::Triple& Triple) + : HostInfo(D, Triple) {} + ~LinuxHostInfo(); + + 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; +}; + +LinuxHostInfo::~LinuxHostInfo() { + for (llvm::StringMap<ToolChain*>::iterator + it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it) + delete it->second; +} + +bool LinuxHostInfo::useDriverDriver() const { + return false; +} + +ToolChain *LinuxHostInfo::getToolChain(const ArgList &Args, + const char *ArchName) const { + + assert(!ArchName && + "Unexpected arch name on platform without driver driver support."); + + ArchName = getArchName().c_str(); + + ToolChain *&TC = ToolChains[ArchName]; + + if (!TC) { + llvm::Triple TCTriple(getTriple()); + TCTriple.setArchName(getArchName()); + + TC = new toolchains::Linux(*this, TCTriple); + } + + return TC; +} + } const HostInfo * @@ -343,6 +395,12 @@ clang::driver::createDragonFlyHostInfo(const Driver &D, } const HostInfo * +clang::driver::createLinuxHostInfo(const Driver &D, + const llvm::Triple& Triple) { + return new LinuxHostInfo(D, Triple); +} + +const HostInfo * clang::driver::createUnknownHostInfo(const Driver &D, const llvm::Triple& Triple) { return new UnknownHostInfo(D, Triple); |