diff --git a/lib/Driver/HostInfo.cpp b/lib/Driver/HostInfo.cpp
index 305c7cc..a80e08e 100644
--- a/lib/Driver/HostInfo.cpp
+++ b/lib/Driver/HostInfo.cpp
@@ -22,13 +22,13 @@
 #include "ToolChains.h"
 
 #include <cassert>
- 
+
 using namespace clang::driver;
 
 HostInfo::HostInfo(const Driver &D, const llvm::Triple &_Triple)
   : TheDriver(D), Triple(_Triple)
 {
-  
+
 }
 
 HostInfo::~HostInfo() {
@@ -66,14 +66,14 @@
     return Ty;
   }
 
-  virtual ToolChain *getToolChain(const ArgList &Args, 
+  virtual ToolChain *getToolChain(const ArgList &Args,
                                   const char *ArchName) const;
 };
 
 DarwinHostInfo::DarwinHostInfo(const Driver &D, const llvm::Triple& Triple)
   : HostInfo(D, Triple) {
-  
-  assert((getArchName() == "i386" || getArchName() == "x86_64" || 
+
+  assert((getArchName() == "i386" || getArchName() == "x86_64" ||
           getArchName() == "powerpc" || getArchName() == "powerpc64" ||
           getArchName() == "arm") &&
          "Unknown Darwin arch.");
@@ -81,13 +81,13 @@
   assert(memcmp(&getOSName()[0], "darwin", 6) == 0 &&
          "Unknown Darwin platform.");
   bool HadExtra;
-  if (!Driver::GetReleaseVersion(&getOSName()[6], 
-                                 DarwinVersion[0], DarwinVersion[1], 
+  if (!Driver::GetReleaseVersion(&getOSName()[6],
+                                 DarwinVersion[0], DarwinVersion[1],
                                  DarwinVersion[2], HadExtra)) {
     D.Diag(clang::diag::err_drv_invalid_darwin_version)
       << getOSName();
   }
-  
+
   // We can only call 4.2.1 for now.
   GCCVersion[0] = 4;
   GCCVersion[1] = 2;
@@ -100,11 +100,11 @@
     delete it->second;
 }
 
-bool DarwinHostInfo::useDriverDriver() const { 
+bool DarwinHostInfo::useDriverDriver() const {
   return true;
 }
 
-ToolChain *DarwinHostInfo::getToolChain(const ArgList &Args, 
+ToolChain *DarwinHostInfo::getToolChain(const ArgList &Args,
                                         const char *ArchName) const {
   std::string Arch;
   if (!ArchName) {
@@ -115,7 +115,7 @@
       // things which rely on a default architecture. We just use the last -arch
       // to find the default tool chain.
       Arch = A->getValue(Args);
-      
+
       // Normalize arch name; we shouldn't be doing this here.
       //
       // FIXME: This should be unnecessary once everything moves over to using
@@ -129,17 +129,17 @@
       Arch = getArchName();
     }
     ArchName = Arch.c_str();
-    
+
     // Honor -m32 and -m64 when finding the default tool chain.
     if (Arg *A = Args.getLastArg(options::OPT_m32, options::OPT_m64)) {
       if (Arch == "i386" || Arch == "x86_64") {
-        ArchName = (A->getOption().getId() == options::OPT_m32) ? "i386" : 
+        ArchName = (A->getOption().getId() == options::OPT_m32) ? "i386" :
           "x86_64";
       } else if (Arch == "powerpc" || Arch == "powerpc64") {
-        ArchName = (A->getOption().getId() == options::OPT_m32) ? "powerpc" : 
+        ArchName = (A->getOption().getId() == options::OPT_m32) ? "powerpc" :
           "powerpc64";
       }
-    } 
+    }
   } else {
     // Normalize arch name; we shouldn't be doing this here.
     //
@@ -192,11 +192,11 @@
     return types::lookupTypeForExtension(Ext);
   }
 
-  virtual ToolChain *getToolChain(const ArgList &Args, 
+  virtual ToolChain *getToolChain(const ArgList &Args,
                                   const char *ArchName) const;
 };
 
-UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple) 
+UnknownHostInfo::UnknownHostInfo(const Driver &D, const llvm::Triple& Triple)
   : HostInfo(D, Triple) {
 }
 
@@ -206,15 +206,15 @@
     delete it->second;
 }
 
-bool UnknownHostInfo::useDriverDriver() const { 
+bool UnknownHostInfo::useDriverDriver() const {
   return false;
 }
 
-ToolChain *UnknownHostInfo::getToolChain(const ArgList &Args, 
+ToolChain *UnknownHostInfo::getToolChain(const ArgList &Args,
                                          const char *ArchName) const {
-  assert(!ArchName && 
+  assert(!ArchName &&
          "Unexpected arch name on platform without driver driver support.");
-  
+
   // Automatically handle some instances of -m32/-m64 we know about.
   std::string Arch = getArchName();
   ArchName = Arch.c_str();
@@ -228,8 +228,8 @@
       ArchName =
         (A->getOption().getId() == options::OPT_m32) ? "powerpc" : "powerpc64";
     }
-  } 
-  
+  }
+
   ToolChain *&TC = ToolChains[ArchName];
   if (!TC) {
     llvm::Triple TCTriple(getTriple());
@@ -249,7 +249,7 @@
   mutable llvm::StringMap<ToolChain*> ToolChains;
 
 public:
-  OpenBSDHostInfo(const Driver &D, const llvm::Triple& Triple) 
+  OpenBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
     : HostInfo(D, Triple) {}
   ~OpenBSDHostInfo();
 
@@ -259,7 +259,7 @@
     return types::lookupTypeForExtension(Ext);
   }
 
-  virtual ToolChain *getToolChain(const ArgList &Args, 
+  virtual ToolChain *getToolChain(const ArgList &Args,
                                   const char *ArchName) const;
 };
 
@@ -269,18 +269,18 @@
     delete it->second;
 }
 
-bool OpenBSDHostInfo::useDriverDriver() const { 
+bool OpenBSDHostInfo::useDriverDriver() const {
   return false;
 }
 
-ToolChain *OpenBSDHostInfo::getToolChain(const ArgList &Args, 
+ToolChain *OpenBSDHostInfo::getToolChain(const ArgList &Args,
                                          const char *ArchName) const {
-  assert(!ArchName && 
+  assert(!ArchName &&
          "Unexpected arch name on platform without driver driver support.");
-  
+
   std::string Arch = getArchName();
   ArchName = Arch.c_str();
-  
+
   ToolChain *&TC = ToolChains[ArchName];
   if (!TC) {
     llvm::Triple TCTriple(getTriple());
@@ -311,12 +311,12 @@
   }
 
   virtual ToolChain *getToolChain(const ArgList &Args,
-				  const char *ArchName) const;
+                                  const char *ArchName) const;
 };
 
 AuroraUXHostInfo::~AuroraUXHostInfo() {
   for (llvm::StringMap<ToolChain*>::iterator
-	 it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
+         it = ToolChains.begin(), ie = ToolChains.end(); it != ie; ++it)
     delete it->second;
 }
 
@@ -325,9 +325,9 @@
 }
 
 ToolChain *AuroraUXHostInfo::getToolChain(const ArgList &Args,
-					  const char *ArchName) const {
+                                          const char *ArchName) const {
   assert(!ArchName &&
-	 "Unexpected arch name on platform without driver driver support.");
+         "Unexpected arch name on platform without driver driver support.");
 
   ToolChain *&TC = ToolChains[getArchName()];
 
@@ -349,7 +349,7 @@
   mutable llvm::StringMap<ToolChain*> ToolChains;
 
 public:
-  FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple) 
+  FreeBSDHostInfo(const Driver &D, const llvm::Triple& Triple)
     : HostInfo(D, Triple) {}
   ~FreeBSDHostInfo();
 
@@ -359,7 +359,7 @@
     return types::lookupTypeForExtension(Ext);
   }
 
-  virtual ToolChain *getToolChain(const ArgList &Args, 
+  virtual ToolChain *getToolChain(const ArgList &Args,
                                   const char *ArchName) const;
 };
 
@@ -369,17 +369,17 @@
     delete it->second;
 }
 
-bool FreeBSDHostInfo::useDriverDriver() const { 
+bool FreeBSDHostInfo::useDriverDriver() const {
   return false;
 }
 
-ToolChain *FreeBSDHostInfo::getToolChain(const ArgList &Args, 
+ToolChain *FreeBSDHostInfo::getToolChain(const ArgList &Args,
                                          const char *ArchName) const {
   bool Lib32 = false;
 
-  assert(!ArchName && 
+  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.
@@ -388,8 +388,8 @@
   if (Args.hasArg(options::OPT_m32) && getArchName() == "x86_64") {
     ArchName = "i386";
     Lib32 = true;
-  } 
-  
+  }
+
   ToolChain *&TC = ToolChains[ArchName];
   if (!TC) {
     llvm::Triple TCTriple(getTriple());
@@ -419,7 +419,7 @@
     return types::lookupTypeForExtension(Ext);
   }
 
-  virtual ToolChain *getToolChain(const ArgList &Args, 
+  virtual ToolChain *getToolChain(const ArgList &Args,
                                   const char *ArchName) const;
 };
 
@@ -429,13 +429,13 @@
     delete it->second;
 }
 
-bool DragonFlyHostInfo::useDriverDriver() const { 
+bool DragonFlyHostInfo::useDriverDriver() const {
   return false;
 }
 
-ToolChain *DragonFlyHostInfo::getToolChain(const ArgList &Args, 
+ToolChain *DragonFlyHostInfo::getToolChain(const ArgList &Args,
                                            const char *ArchName) const {
-  assert(!ArchName && 
+  assert(!ArchName &&
          "Unexpected arch name on platform without driver driver support.");
 
   ToolChain *&TC = ToolChains[getArchName()];
@@ -468,7 +468,7 @@
     return types::lookupTypeForExtension(Ext);
   }
 
-  virtual ToolChain *getToolChain(const ArgList &Args, 
+  virtual ToolChain *getToolChain(const ArgList &Args,
                                   const char *ArchName) const;
 };
 
@@ -478,14 +478,14 @@
     delete it->second;
 }
 
-bool LinuxHostInfo::useDriverDriver() const { 
+bool LinuxHostInfo::useDriverDriver() const {
   return false;
 }
 
-ToolChain *LinuxHostInfo::getToolChain(const ArgList &Args, 
+ToolChain *LinuxHostInfo::getToolChain(const ArgList &Args,
                                        const char *ArchName) const {
 
-  assert(!ArchName && 
+  assert(!ArchName &&
          "Unexpected arch name on platform without driver driver support.");
 
   // Automatically handle some instances of -m32/-m64 we know about.
@@ -519,7 +519,7 @@
 
 const HostInfo *
 clang::driver::createAuroraUXHostInfo(const Driver &D,
-				      const llvm::Triple& Triple){
+                                      const llvm::Triple& Triple){
   return new AuroraUXHostInfo(D, Triple);
 }
 
@@ -530,13 +530,13 @@
 }
 
 const HostInfo *
-clang::driver::createOpenBSDHostInfo(const Driver &D, 
+clang::driver::createOpenBSDHostInfo(const Driver &D,
                                      const llvm::Triple& Triple) {
   return new OpenBSDHostInfo(D, Triple);
 }
 
 const HostInfo *
-clang::driver::createFreeBSDHostInfo(const Driver &D, 
+clang::driver::createFreeBSDHostInfo(const Driver &D,
                                      const llvm::Triple& Triple) {
   return new FreeBSDHostInfo(D, Triple);
 }
