clang API Documentation

HostInfo.cpp
Go to the documentation of this file.
00001 //===--- HostInfo.cpp - Host specific information -------------------------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 
00010 #include "clang/Driver/HostInfo.h"
00011 
00012 #include "clang/Driver/Arg.h"
00013 #include "clang/Driver/ArgList.h"
00014 #include "clang/Driver/Driver.h"
00015 #include "clang/Driver/DriverDiagnostic.h"
00016 #include "clang/Driver/Option.h"
00017 #include "clang/Driver/Options.h"
00018 
00019 #include "llvm/ADT/StringMap.h"
00020 #include "llvm/Support/Compiler.h"
00021 
00022 #include "ToolChains.h"
00023 
00024 #include <cassert>
00025 
00026 using namespace clang::driver;
00027 
00028 HostInfo::HostInfo(const Driver &D, const llvm::Triple &_Triple)
00029   : TheDriver(D), Triple(_Triple) {
00030 }
00031 
00032 HostInfo::~HostInfo() {
00033 }
00034 
00035 namespace {
00036 
00037 // Darwin Host Info
00038 
00039 /// DarwinHostInfo - Darwin host information implementation.
00040 class DarwinHostInfo : public HostInfo {
00041   /// Cache of tool chains we have created.
00042   mutable llvm::DenseMap<unsigned, ToolChain*> ToolChains;
00043 
00044 public:
00045   DarwinHostInfo(const Driver &D, const llvm::Triple &Triple);
00046   ~DarwinHostInfo();
00047 
00048   virtual ToolChain *CreateToolChain(const ArgList &Args,
00049                                      const char *ArchName) const;
00050 };
00051 
00052 DarwinHostInfo::DarwinHostInfo(const Driver &D, const llvm::Triple& Triple)
00053   : HostInfo(D, Triple) {
00054 }
00055 
00056 DarwinHostInfo::~DarwinHostInfo() {
00057   for (llvm::DenseMap<unsigned, ToolChain*>::iterator
00058          it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
00059     delete it->second;
00060 }
00061 
00062 ToolChain *DarwinHostInfo::CreateToolChain(const ArgList &Args,
00063                                            const char *ArchName) const {
00064   llvm::Triple::ArchType Arch;
00065 
00066   if (!ArchName) {
00067     // If we aren't looking for a specific arch, infer the default architecture
00068     // based on -arch and -m32/-m64 command line options.
00069     if (Arg *A = Args.getLastArg(options::OPT_arch)) {
00070       // The gcc driver behavior with multiple -arch flags wasn't consistent for
00071       // things which rely on a default architecture. We just use the last -arch
00072       // to find the default tool chain (assuming it is valid).
00073       Arch = llvm::Triple::getArchTypeForDarwinArchName(A->getValue(Args));
00074 
00075       // If it was invalid just use the host, we will reject this command line
00076       // later.
00077       if (Arch == llvm::Triple::UnknownArch)
00078         Arch = getTriple().getArch();
00079     } else {
00080       // Otherwise default to the arch of the host.
00081       Arch = getTriple().getArch();
00082     }
00083 
00084     // Honor -m32 and -m64 when finding the default tool chain.
00085     //
00086     // FIXME: Should this information be in llvm::Triple?
00087     if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
00088       if (A->getOption().matches(options::OPT_m32)) {
00089         if (Arch == llvm::Triple::x86_64)
00090           Arch = llvm::Triple::x86;
00091         if (Arch == llvm::Triple::ppc64)
00092           Arch = llvm::Triple::ppc;
00093       } else {
00094         if (Arch == llvm::Triple::x86)
00095           Arch = llvm::Triple::x86_64;
00096         if (Arch == llvm::Triple::ppc)
00097           Arch = llvm::Triple::ppc64;
00098       }
00099     }
00100   } else
00101     Arch = llvm::Triple::getArchTypeForDarwinArchName(ArchName);
00102 
00103   assert(Arch != llvm::Triple::UnknownArch && "Unexpected arch!");
00104   ToolChain *&TC = ToolChains[Arch];
00105   if (!TC) {
00106     llvm::Triple TCTriple(getTriple());
00107     TCTriple.setArch(Arch);
00108 
00109     // If we recognized the arch, match it to the toolchains we support.
00110     if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64 ||
00111         Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
00112       TC = new toolchains::DarwinClang(*this, TCTriple);
00113     } else
00114       TC = new toolchains::Darwin_Generic_GCC(*this, TCTriple);
00115   }
00116 
00117   return TC;
00118 }
00119 
00120 // TCE Host Info
00121 
00122 /// TCEHostInfo - TCE host information implementation (see http://tce.cs.tut.fi)
00123 class TCEHostInfo : public HostInfo {
00124 
00125 public:
00126   TCEHostInfo(const Driver &D, const llvm::Triple &Triple);
00127   ~TCEHostInfo() {}
00128 
00129   virtual ToolChain *CreateToolChain(const ArgList &Args, 
00130                                      const char *ArchName) const;
00131 };
00132 
00133 TCEHostInfo::TCEHostInfo(const Driver &D, const llvm::Triple& Triple)
00134   : HostInfo(D, Triple) {
00135 }
00136 
00137 ToolChain *TCEHostInfo::CreateToolChain(const ArgList &Args, 
00138                                         const char *ArchName) const {
00139   llvm::Triple TCTriple(getTriple());
00140 //  TCTriple.setArchName(ArchName);
00141   return new toolchains::TCEToolChain(*this, TCTriple);
00142 }
00143 
00144 
00145 // Unknown Host Info
00146 
00147 /// UnknownHostInfo - Generic host information to use for unknown hosts.
00148 class UnknownHostInfo : public HostInfo {
00149   /// Cache of tool chains we have created.
00150   mutable llvm::StringMap<ToolChain*> ToolChains;
00151 
00152 public:
00153   UnknownHostInfo(const Driver &D, const llvm::Triple& Triple);
00154   ~UnknownHostInfo();
00155 
00156   virtual ToolChain *CreateToolChain(const ArgList &Args,
00157                                      const char *ArchName) const;
00158 };
00159 
00160 UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple)
00161   : HostInfo(D, Triple) {
00162 }
00163 
00164 UnknownHostInfo::~UnknownHostInfo() {
00165   for (llvm::StringMap<ToolChain*>::iterator
00166          it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
00167     delete it->second;
00168 }
00169 
00170 ToolChain *UnknownHostInfo::CreateToolChain(const ArgList &Args,
00171                                             const char *ArchName) const {
00172   assert(!ArchName &&
00173          "Unexpected arch name on platform without driver support.");
00174 
00175   // Automatically handle some instances of -m32/-m64 we know about.
00176   std::string Arch = getArchName();
00177   ArchName = Arch.c_str();
00178   if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
00179     if (Triple.getArch() == llvm::Triple::x86 ||
00180         Triple.getArch() == llvm::Triple::x86_64) {
00181       ArchName =
00182         (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
00183     } else if (Triple.getArch() == llvm::Triple::ppc ||
00184                Triple.getArch() == llvm::Triple::ppc64) {
00185       ArchName =
00186         (A->getOption().matches(options::OPT_m32)) ? "powerpc" : "powerpc64";
00187     }
00188   }
00189 
00190   ToolChain *&TC = ToolChains[ArchName];
00191   if (!TC) {
00192     llvm::Triple TCTriple(getTriple());
00193     TCTriple.setArchName(ArchName);
00194 
00195     TC = new toolchains::Generic_GCC(*this, TCTriple);
00196   }
00197 
00198   return TC;
00199 }
00200 
00201 // OpenBSD Host Info
00202 
00203 /// OpenBSDHostInfo -  OpenBSD host information implementation.
00204 class OpenBSDHostInfo : public HostInfo {
00205   /// Cache of tool chains we have created.
00206   mutable llvm::StringMap<ToolChain*> ToolChains;
00207 
00208 public:
00209   OpenBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
00210     : HostInfo(D, Triple) {}
00211   ~OpenBSDHostInfo();
00212 
00213   virtual ToolChain *CreateToolChain(const ArgList &Args,
00214                                      const char *ArchName) const;
00215 };
00216 
00217 OpenBSDHostInfo::~OpenBSDHostInfo() {
00218   for (llvm::StringMap<ToolChain*>::iterator
00219          it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
00220     delete it->second;
00221 }
00222 
00223 ToolChain *OpenBSDHostInfo::CreateToolChain(const ArgList &Args,
00224                                             const char *ArchName) const {
00225   assert(!ArchName &&
00226          "Unexpected arch name on platform without driver driver support.");
00227 
00228   std::string Arch = getArchName();
00229   ArchName = Arch.c_str();
00230 
00231   ToolChain *&TC = ToolChains[ArchName];
00232   if (!TC) {
00233     llvm::Triple TCTriple(getTriple());
00234     TCTriple.setArchName(ArchName);
00235 
00236     TC = new toolchains::OpenBSD(*this, TCTriple);
00237   }
00238 
00239   return TC;
00240 }
00241 
00242 // AuroraUX Host Info
00243 
00244 /// AuroraUXHostInfo - AuroraUX host information implementation.
00245 class AuroraUXHostInfo : public HostInfo {
00246   /// Cache of tool chains we have created.
00247   mutable llvm::StringMap<ToolChain*> ToolChains;
00248 
00249 public:
00250   AuroraUXHostInfo(const Driver &D, const llvm::Triple& Triple)
00251     : HostInfo(D, Triple) {}
00252   ~AuroraUXHostInfo();
00253 
00254   virtual ToolChain *CreateToolChain(const ArgList &Args,
00255                                      const char *ArchName) const;
00256 };
00257 
00258 AuroraUXHostInfo::~AuroraUXHostInfo() {
00259   for (llvm::StringMap<ToolChain*>::iterator
00260          it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
00261     delete it->second;
00262 }
00263 
00264 ToolChain *AuroraUXHostInfo::CreateToolChain(const ArgList &Args,
00265                                              const char *ArchName) const {
00266   assert(!ArchName &&
00267          "Unexpected arch name on platform without driver driver support.");
00268 
00269   ToolChain *&TC = ToolChains[getArchName()];
00270 
00271   if (!TC) {
00272     llvm::Triple TCTriple(getTriple());
00273     TCTriple.setArchName(getArchName());
00274 
00275     TC = new toolchains::AuroraUX(*this, TCTriple);
00276   }
00277 
00278   return TC;
00279 }
00280 
00281 // FreeBSD Host Info
00282 
00283 /// FreeBSDHostInfo -  FreeBSD host information implementation.
00284 class FreeBSDHostInfo : public HostInfo {
00285   /// Cache of tool chains we have created.
00286   mutable llvm::StringMap<ToolChain*> ToolChains;
00287 
00288 public:
00289   FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
00290     : HostInfo(D, Triple) {}
00291   ~FreeBSDHostInfo();
00292 
00293   virtual ToolChain *CreateToolChain(const ArgList &Args,
00294                                      const char *ArchName) const;
00295 };
00296 
00297 FreeBSDHostInfo::~FreeBSDHostInfo() {
00298   for (llvm::StringMap<ToolChain*>::iterator
00299          it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
00300     delete it->second;
00301 }
00302 
00303 ToolChain *FreeBSDHostInfo::CreateToolChain(const ArgList &Args,
00304                                             const char *ArchName) const {
00305   assert(!ArchName &&
00306          "Unexpected arch name on platform without driver driver support.");
00307 
00308   // Automatically handle some instances of -m32/-m64 we know about.
00309   std::string Arch = getArchName();
00310   ArchName = Arch.c_str();
00311   if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
00312     if (Triple.getArch() == llvm::Triple::x86 ||
00313         Triple.getArch() == llvm::Triple::x86_64) {
00314       ArchName =
00315         (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
00316     } else if (Triple.getArch() == llvm::Triple::ppc ||
00317                Triple.getArch() == llvm::Triple::ppc64) {
00318       ArchName =
00319         (A->getOption().matches(options::OPT_m32)) ? "powerpc" : "powerpc64";
00320     }
00321   }
00322 
00323   ToolChain *&TC = ToolChains[ArchName];
00324   if (!TC) {
00325     llvm::Triple TCTriple(getTriple());
00326     TCTriple.setArchName(ArchName);
00327 
00328     TC = new toolchains::FreeBSD(*this, TCTriple);
00329   }
00330 
00331   return TC;
00332 }
00333 
00334 // NetBSD Host Info
00335 
00336 /// NetBSDHostInfo -  NetBSD host information implementation.
00337 class NetBSDHostInfo : public HostInfo {
00338   /// Cache of tool chains we have created.
00339   mutable llvm::StringMap<ToolChain*> ToolChains;
00340 
00341 public:
00342   NetBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
00343     : HostInfo(D, Triple) {}
00344   ~NetBSDHostInfo();
00345 
00346   virtual ToolChain *CreateToolChain(const ArgList &Args,
00347                                      const char *ArchName) const;
00348 };
00349 
00350 NetBSDHostInfo::~NetBSDHostInfo() {
00351   for (llvm::StringMap<ToolChain*>::iterator
00352          it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
00353     delete it->second;
00354 }
00355 
00356 ToolChain *NetBSDHostInfo::CreateToolChain(const ArgList &Args,
00357                                             const char *ArchName) const {
00358   assert(!ArchName &&
00359          "Unexpected arch name on platform without driver driver support.");
00360 
00361   // Automatically handle some instances of -m32/-m64 we know about.
00362   std::string Arch = getArchName();
00363   ArchName = Arch.c_str();
00364   if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
00365     if (Triple.getArch() == llvm::Triple::x86 ||
00366         Triple.getArch() == llvm::Triple::x86_64) {
00367       ArchName =
00368         (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
00369     } else if (Triple.getArch() == llvm::Triple::ppc ||
00370                Triple.getArch() == llvm::Triple::ppc64) {
00371       ArchName =
00372         (A->getOption().matches(options::OPT_m32)) ? "powerpc" : "powerpc64";
00373     }
00374   }
00375   llvm::Triple TargetTriple(getTriple());
00376   TargetTriple.setArchName(ArchName);
00377 
00378   ToolChain *TC;
00379 
00380   // XXX Cache toolchain even if -m32 is used
00381   if (Arch == ArchName) {
00382     TC = ToolChains[ArchName];
00383     if (TC)
00384       return TC;
00385   }
00386 
00387   TC = new toolchains::NetBSD(*this, TargetTriple, getTriple());
00388 
00389   return TC;
00390 }
00391 
00392 // Minix Host Info
00393 
00394 /// MinixHostInfo -  Minix host information implementation.
00395 class MinixHostInfo : public HostInfo {
00396   /// Cache of tool chains we have created.
00397   mutable llvm::StringMap<ToolChain*> ToolChains;
00398 
00399 public:
00400   MinixHostInfo(const Driver &D, const llvm::Triple& Triple)
00401     : HostInfo(D, Triple) {}
00402   ~MinixHostInfo();
00403 
00404   virtual ToolChain *CreateToolChain(const ArgList &Args,
00405                                      const char *ArchName) const;
00406 };
00407 
00408 MinixHostInfo::~MinixHostInfo() {
00409   for (llvm::StringMap<ToolChain*>::iterator
00410          it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it){
00411     delete it->second;
00412   }
00413 }
00414 
00415 ToolChain *MinixHostInfo::CreateToolChain(const ArgList &Args,
00416                                             const char *ArchName) const {
00417   assert(!ArchName &&
00418          "Unexpected arch name on platform without driver driver support.");
00419 
00420   std::string Arch = getArchName();
00421   ArchName = Arch.c_str();
00422 
00423   ToolChain *&TC = ToolChains[ArchName];
00424   if (!TC) {
00425     llvm::Triple TCTriple(getTriple());
00426     TCTriple.setArchName(ArchName);
00427 
00428     TC = new toolchains::Minix(*this, TCTriple);
00429   }
00430 
00431   return TC;
00432 }
00433 
00434 // DragonFly Host Info
00435 
00436 /// DragonFlyHostInfo -  DragonFly host information implementation.
00437 class DragonFlyHostInfo : public HostInfo {
00438   /// Cache of tool chains we have created.
00439   mutable llvm::StringMap<ToolChain*> ToolChains;
00440 
00441 public:
00442   DragonFlyHostInfo(const Driver &D, const llvm::Triple& Triple)
00443     : HostInfo(D, Triple) {}
00444   ~DragonFlyHostInfo();
00445 
00446   virtual ToolChain *CreateToolChain(const ArgList &Args,
00447                                      const char *ArchName) const;
00448 };
00449 
00450 DragonFlyHostInfo::~DragonFlyHostInfo() {
00451   for (llvm::StringMap<ToolChain*>::iterator
00452          it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
00453     delete it->second;
00454 }
00455 
00456 ToolChain *DragonFlyHostInfo::CreateToolChain(const ArgList &Args,
00457                                               const char *ArchName) const {
00458   assert(!ArchName &&
00459          "Unexpected arch name on platform without driver driver support.");
00460 
00461   ToolChain *&TC = ToolChains[getArchName()];
00462 
00463   if (!TC) {
00464     llvm::Triple TCTriple(getTriple());
00465     TCTriple.setArchName(getArchName());
00466 
00467     TC = new toolchains::DragonFly(*this, TCTriple);
00468   }
00469 
00470   return TC;
00471 }
00472 
00473 // Linux Host Info
00474 
00475 /// LinuxHostInfo -  Linux host information implementation.
00476 class LinuxHostInfo : public HostInfo {
00477   /// Cache of tool chains we have created.
00478   mutable llvm::StringMap<ToolChain*> ToolChains;
00479 
00480 public:
00481   LinuxHostInfo(const Driver &D, const llvm::Triple& Triple)
00482     : HostInfo(D, Triple) {}
00483   ~LinuxHostInfo();
00484 
00485   virtual ToolChain *CreateToolChain(const ArgList &Args,
00486                                      const char *ArchName) const;
00487 };
00488 
00489 LinuxHostInfo::~LinuxHostInfo() {
00490   for (llvm::StringMap<ToolChain*>::iterator
00491          it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
00492     delete it->second;
00493 }
00494 
00495 ToolChain *LinuxHostInfo::CreateToolChain(const ArgList &Args,
00496                                           const char *ArchName) const {
00497 
00498   assert(!ArchName &&
00499          "Unexpected arch name on platform without driver driver support.");
00500 
00501   // Automatically handle some instances of -m32/-m64 we know about.
00502   std::string Arch = getArchName();
00503   ArchName = Arch.c_str();
00504   if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
00505     if (Triple.getArch() == llvm::Triple::x86 ||
00506         Triple.getArch() == llvm::Triple::x86_64) {
00507       ArchName =
00508         (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
00509     } else if (Triple.getArch() == llvm::Triple::ppc ||
00510                Triple.getArch() == llvm::Triple::ppc64) {
00511       ArchName =
00512         (A->getOption().matches(options::OPT_m32)) ? "powerpc" : "powerpc64";
00513     }
00514   }
00515 
00516   ToolChain *&TC = ToolChains[ArchName];
00517 
00518   if (!TC && !Arch.compare ("hexagon")) {
00519     llvm::Triple TCTriple (getTriple());
00520     TC = new toolchains::Hexagon_TC (*this, TCTriple);
00521   }
00522 
00523   if (!TC) {
00524     llvm::Triple TCTriple(getTriple());
00525     TCTriple.setArchName(ArchName);
00526 
00527     TC = new toolchains::Linux(*this, TCTriple);
00528   }
00529 
00530   return TC;
00531 }
00532 
00533 // Windows Host Info
00534 
00535 /// WindowsHostInfo - Host information to use on Microsoft Windows.
00536 class WindowsHostInfo : public HostInfo {
00537   /// Cache of tool chains we have created.
00538   mutable llvm::StringMap<ToolChain*> ToolChains;
00539 
00540 public:
00541   WindowsHostInfo(const Driver &D, const llvm::Triple& Triple);
00542   ~WindowsHostInfo();
00543 
00544   virtual types::ID lookupTypeForExtension(const char *Ext) const {
00545     return types::lookupTypeForExtension(Ext);
00546   }
00547 
00548   virtual ToolChain *CreateToolChain(const ArgList &Args,
00549                                      const char *ArchName) const;
00550 };
00551 
00552 WindowsHostInfo::WindowsHostInfo(const Driver &D, const llvm::Triple& Triple)
00553   : HostInfo(D, Triple) {
00554 }
00555 
00556 WindowsHostInfo::~WindowsHostInfo() {
00557   for (llvm::StringMap<ToolChain*>::iterator
00558          it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
00559     delete it->second;
00560 }
00561 
00562 ToolChain *WindowsHostInfo::CreateToolChain(const ArgList &Args,
00563                                             const char *ArchName) const {
00564   assert(!ArchName &&
00565          "Unexpected arch name on platform without driver driver support.");
00566 
00567   // Automatically handle some instances of -m32/-m64 we know about.
00568   std::string Arch = getArchName();
00569   ArchName = Arch.c_str();
00570   if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
00571     if (Triple.getArch() == llvm::Triple::x86 ||
00572         Triple.getArch() == llvm::Triple::x86_64) {
00573       ArchName =
00574         (A->getOption().matches(options::OPT_m32)) ? "i386" : "x86_64";
00575     }
00576   }
00577 
00578   ToolChain *&TC = ToolChains[ArchName];
00579   if (!TC) {
00580     llvm::Triple TCTriple(getTriple());
00581     TCTriple.setArchName(ArchName);
00582 
00583     TC = new toolchains::Windows(*this, TCTriple);
00584   }
00585 
00586   return TC;
00587 }
00588 
00589 // FIXME: This is a placeholder.
00590 class MinGWHostInfo : public UnknownHostInfo {
00591 public:
00592   MinGWHostInfo(const Driver &D, const llvm::Triple& Triple);
00593 };
00594 
00595 MinGWHostInfo::MinGWHostInfo(const Driver &D, const llvm::Triple& Triple)
00596   : UnknownHostInfo(D, Triple) {}
00597 
00598 } // end anon namespace
00599 
00600 const HostInfo *
00601 clang::driver::createAuroraUXHostInfo(const Driver &D,
00602                                       const llvm::Triple& Triple){
00603   return new AuroraUXHostInfo(D, Triple);
00604 }
00605 
00606 const HostInfo *
00607 clang::driver::createDarwinHostInfo(const Driver &D,
00608                                     const llvm::Triple& Triple){
00609   return new DarwinHostInfo(D, Triple);
00610 }
00611 
00612 const HostInfo *
00613 clang::driver::createOpenBSDHostInfo(const Driver &D,
00614                                      const llvm::Triple& Triple) {
00615   return new OpenBSDHostInfo(D, Triple);
00616 }
00617 
00618 const HostInfo *
00619 clang::driver::createFreeBSDHostInfo(const Driver &D,
00620                                      const llvm::Triple& Triple) {
00621   return new FreeBSDHostInfo(D, Triple);
00622 }
00623 
00624 const HostInfo *
00625 clang::driver::createNetBSDHostInfo(const Driver &D,
00626                                      const llvm::Triple& Triple) {
00627   return new NetBSDHostInfo(D, Triple);
00628 }
00629 
00630 const HostInfo *
00631 clang::driver::createMinixHostInfo(const Driver &D,
00632                                      const llvm::Triple& Triple) {
00633   return new MinixHostInfo(D, Triple);
00634 }
00635 
00636 const HostInfo *
00637 clang::driver::createDragonFlyHostInfo(const Driver &D,
00638                                        const llvm::Triple& Triple) {
00639   return new DragonFlyHostInfo(D, Triple);
00640 }
00641 
00642 const HostInfo *
00643 clang::driver::createLinuxHostInfo(const Driver &D,
00644                                    const llvm::Triple& Triple) {
00645   return new LinuxHostInfo(D, Triple);
00646 }
00647 
00648 const HostInfo *
00649 clang::driver::createTCEHostInfo(const Driver &D,
00650                                    const llvm::Triple& Triple) {
00651   return new TCEHostInfo(D, Triple);
00652 }
00653 
00654 const HostInfo *
00655 clang::driver::createWindowsHostInfo(const Driver &D,
00656                                      const llvm::Triple& Triple) {
00657   return new WindowsHostInfo(D, Triple);
00658 }
00659 
00660 const HostInfo *
00661 clang::driver::createMinGWHostInfo(const Driver &D,
00662                                    const llvm::Triple& Triple) {
00663   return new MinGWHostInfo(D, Triple);
00664 }
00665 
00666 const HostInfo *
00667 clang::driver::createUnknownHostInfo(const Driver &D,
00668                                      const llvm::Triple& Triple) {
00669   return new UnknownHostInfo(D, Triple);
00670 }