diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index 1ec477f..8506b97 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -185,33 +185,34 @@
   }
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::InputClass:
-    case Action::BindArchClass:
-      llvm_unreachable("Invalid tool kind.");
-    case Action::PreprocessJobClass:
-    case Action::AnalyzeJobClass:
-    case Action::MigrateJobClass:
-    case Action::PrecompileJobClass:
-    case Action::CompileJobClass:
-      T = new tools::Clang(*this); break;
-    case Action::AssembleJobClass: {
-      if (useIntegratedAs())
-        T = new tools::ClangAs(*this);
-      else
-        T = new tools::darwin::Assemble(*this);
-      break;
-    }
-    case Action::LinkJobClass:
-      T = new tools::darwin::Link(*this); break;
-    case Action::LipoJobClass:
-      T = new tools::darwin::Lipo(*this); break;
-    case Action::DsymutilJobClass:
-      T = new tools::darwin::Dsymutil(*this); break;
-    case Action::VerifyJobClass:
-      T = new tools::darwin::VerifyDebug(*this); break;
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::InputClass:
+  case Action::BindArchClass:
+    llvm_unreachable("Invalid tool kind.");
+  case Action::PreprocessJobClass:
+  case Action::AnalyzeJobClass:
+  case Action::MigrateJobClass:
+  case Action::PrecompileJobClass:
+  case Action::CompileJobClass:
+    T = new tools::Clang(*this); break;
+  case Action::AssembleJobClass: {
+    if (useIntegratedAs())
+      T = new tools::ClangAs(*this);
+    else
+      T = new tools::darwin::Assemble(*this);
+    break;
+  }
+  case Action::LinkJobClass:
+    T = new tools::darwin::Link(*this); break;
+  case Action::LipoJobClass:
+    T = new tools::darwin::Lipo(*this); break;
+  case Action::DsymutilJobClass:
+    T = new tools::darwin::Dsymutil(*this); break;
+  case Action::VerifyJobClass:
+    T = new tools::darwin::VerifyDebug(*this); break;
   }
 
   return *T;
@@ -1390,34 +1391,35 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::InputClass:
-    case Action::BindArchClass:
-      llvm_unreachable("Invalid tool kind.");
-    case Action::PreprocessJobClass:
-      T = new tools::gcc::Preprocess(*this); break;
-    case Action::PrecompileJobClass:
-      T = new tools::gcc::Precompile(*this); break;
-    case Action::AnalyzeJobClass:
-    case Action::MigrateJobClass:
-      T = new tools::Clang(*this); break;
-    case Action::CompileJobClass:
-      T = new tools::gcc::Compile(*this); break;
-    case Action::AssembleJobClass:
-      T = new tools::gcc::Assemble(*this); break;
-    case Action::LinkJobClass:
-      T = new tools::gcc::Link(*this); break;
+  if (T)
+    return *T;
 
-      // This is a bit ungeneric, but the only platform using a driver
-      // driver is Darwin.
-    case Action::LipoJobClass:
-      T = new tools::darwin::Lipo(*this); break;
-    case Action::DsymutilJobClass:
-      T = new tools::darwin::Dsymutil(*this); break;
-    case Action::VerifyJobClass:
-      T = new tools::darwin::VerifyDebug(*this); break;
-    }
+  switch (Key) {
+  case Action::InputClass:
+  case Action::BindArchClass:
+    llvm_unreachable("Invalid tool kind.");
+  case Action::PreprocessJobClass:
+    T = new tools::gcc::Preprocess(*this); break;
+  case Action::PrecompileJobClass:
+    T = new tools::gcc::Precompile(*this); break;
+  case Action::AnalyzeJobClass:
+  case Action::MigrateJobClass:
+    T = new tools::Clang(*this); break;
+  case Action::CompileJobClass:
+    T = new tools::gcc::Compile(*this); break;
+  case Action::AssembleJobClass:
+    T = new tools::gcc::Assemble(*this); break;
+  case Action::LinkJobClass:
+    T = new tools::gcc::Link(*this); break;
+
+    // This is a bit ungeneric, but the only platform using a driver
+    // driver is Darwin.
+  case Action::LipoJobClass:
+    T = new tools::darwin::Lipo(*this); break;
+  case Action::DsymutilJobClass:
+    T = new tools::darwin::Dsymutil(*this); break;
+  case Action::VerifyJobClass:
+    T = new tools::darwin::VerifyDebug(*this); break;
   }
 
   return *T;
@@ -1559,20 +1561,21 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::InputClass:
-    case Action::BindArchClass:
-      assert(0 && "Invalid tool kind.");
-    case Action::AnalyzeJobClass:
-      T = new tools::Clang(*this); break;
-    case Action::AssembleJobClass:
-      T = new tools::hexagon::Assemble(*this); break;
-    case Action::LinkJobClass:
-      T = new tools::hexagon::Link(*this); break;
-    default:
-      assert(false && "Unsupported action for Hexagon target.");
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::InputClass:
+  case Action::BindArchClass:
+    assert(0 && "Invalid tool kind.");
+  case Action::AnalyzeJobClass:
+    T = new tools::Clang(*this); break;
+  case Action::AssembleJobClass:
+    T = new tools::hexagon::Assemble(*this); break;
+  case Action::LinkJobClass:
+    T = new tools::hexagon::Link(*this); break;
+  default:
+    assert(false && "Unsupported action for Hexagon target.");
   }
 
   return *T;
@@ -1700,15 +1703,16 @@
   Key = Action::AnalyzeJobClass;
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::PreprocessJobClass:
-      T = new tools::gcc::Preprocess(*this); break;
-    case Action::AnalyzeJobClass:
-      T = new tools::Clang(*this); break;
-    default:
-     llvm_unreachable("Unsupported action for TCE target.");
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::PreprocessJobClass:
+    T = new tools::gcc::Preprocess(*this); break;
+  case Action::AnalyzeJobClass:
+    T = new tools::Clang(*this); break;
+  default:
+    llvm_unreachable("Unsupported action for TCE target.");
   }
   return *T;
 }
@@ -1729,20 +1733,21 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::AssembleJobClass: {
-      if (useIntegratedAs())
-        T = new tools::ClangAs(*this);
-      else
-        T = new tools::openbsd::Assemble(*this);
-      break;
-    }
-    case Action::LinkJobClass:
-      T = new tools::openbsd::Link(*this); break;
-    default:
-      T = &Generic_GCC::SelectTool(JA);
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::AssembleJobClass: {
+    if (useIntegratedAs())
+      T = new tools::ClangAs(*this);
+    else
+      T = new tools::openbsd::Assemble(*this);
+    break;
+  }
+  case Action::LinkJobClass:
+    T = new tools::openbsd::Link(*this); break;
+  default:
+    return Generic_GCC::SelectTool(JA);
   }
 
   return *T;
@@ -1764,20 +1769,21 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::AssembleJobClass: {
-      if (useIntegratedAs())
-        T = new tools::ClangAs(*this);
-      else
-        T = new tools::bitrig::Assemble(*this);
-      break;
-    }
-    case Action::LinkJobClass:
-      T = new tools::bitrig::Link(*this); break;
-    default:
-      T = &Generic_GCC::SelectTool(JA);
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::AssembleJobClass: {
+    if (useIntegratedAs())
+      T = new tools::ClangAs(*this);
+    else
+      T = new tools::bitrig::Assemble(*this);
+    break;
+  }
+  case Action::LinkJobClass:
+    T = new tools::bitrig::Link(*this); break;
+  default:
+    return Generic_GCC::SelectTool(JA);
   }
 
   return *T;
@@ -1851,19 +1857,20 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::AssembleJobClass:
-      if (useIntegratedAs())
-        T = new tools::ClangAs(*this);
-      else
-        T = new tools::freebsd::Assemble(*this);
-      break;
-    case Action::LinkJobClass:
-      T = new tools::freebsd::Link(*this); break;
-    default:
-      T = &Generic_GCC::SelectTool(JA);
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::AssembleJobClass:
+    if (useIntegratedAs())
+      T = new tools::ClangAs(*this);
+    else
+      T = new tools::freebsd::Assemble(*this);
+    break;
+  case Action::LinkJobClass:
+    T = new tools::freebsd::Link(*this); break;
+  default:
+    return Generic_GCC::SelectTool(JA);
   }
 
   return *T;
@@ -1908,20 +1915,21 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::AssembleJobClass:
-      if (useIntegratedAs())
-        T = new tools::ClangAs(*this);
-      else
-        T = new tools::netbsd::Assemble(*this);
-      break;
-    case Action::LinkJobClass:
-      T = new tools::netbsd::Link(*this);
-      break;
-    default:
-      T = &Generic_GCC::SelectTool(JA);
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::AssembleJobClass:
+    if (useIntegratedAs())
+      T = new tools::ClangAs(*this);
+    else
+      T = new tools::netbsd::Assemble(*this);
+    break;
+  case Action::LinkJobClass:
+    T = new tools::netbsd::Link(*this);
+    break;
+  default:
+    return Generic_GCC::SelectTool(JA);
   }
 
   return *T;
@@ -1943,15 +1951,16 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::AssembleJobClass:
-      T = new tools::minix::Assemble(*this); break;
-    case Action::LinkJobClass:
-      T = new tools::minix::Link(*this); break;
-    default:
-      T = &Generic_GCC::SelectTool(JA);
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::AssembleJobClass:
+    T = new tools::minix::Assemble(*this); break;
+  case Action::LinkJobClass:
+    T = new tools::minix::Link(*this); break;
+  default:
+    return Generic_GCC::SelectTool(JA);
   }
 
   return *T;
@@ -1983,15 +1992,16 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::AssembleJobClass:
-      T = new tools::auroraux::Assemble(*this); break;
-    case Action::LinkJobClass:
-      T = new tools::auroraux::Link(*this); break;
-    default:
-      T = &Generic_GCC::SelectTool(JA);
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::AssembleJobClass:
+    T = new tools::auroraux::Assemble(*this); break;
+  case Action::LinkJobClass:
+    T = new tools::auroraux::Link(*this); break;
+  default:
+    return Generic_GCC::SelectTool(JA);
   }
 
   return *T;
@@ -2019,15 +2029,16 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::AssembleJobClass:
-      T = new tools::solaris::Assemble(*this); break;
-    case Action::LinkJobClass:
-      T = new tools::solaris::Link(*this); break;
-    default:
-      T = &Generic_GCC::SelectTool(JA);
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::AssembleJobClass:
+    T = new tools::solaris::Assemble(*this); break;
+  case Action::LinkJobClass:
+    T = new tools::solaris::Link(*this); break;
+  default:
+    return Generic_GCC::SelectTool(JA);
   }
 
   return *T;
@@ -2407,19 +2418,20 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::AssembleJobClass:
-      if (useIntegratedAs())
-        T = new tools::ClangAs(*this);
-      else
-        T = new tools::linuxtools::Assemble(*this);
-      break;
-    case Action::LinkJobClass:
-      T = new tools::linuxtools::Link(*this); break;
-    default:
-      T = &Generic_GCC::SelectTool(JA);
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::AssembleJobClass:
+    if (useIntegratedAs())
+      T = new tools::ClangAs(*this);
+    else
+      T = new tools::linuxtools::Assemble(*this);
+    break;
+  case Action::LinkJobClass:
+    T = new tools::linuxtools::Link(*this); break;
+  default:
+    return Generic_GCC::SelectTool(JA);
   }
 
   return *T;
@@ -2659,15 +2671,16 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::AssembleJobClass:
-      T = new tools::dragonfly::Assemble(*this); break;
-    case Action::LinkJobClass:
-      T = new tools::dragonfly::Link(*this); break;
-    default:
-      T = &Generic_GCC::SelectTool(JA);
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::AssembleJobClass:
+    T = new tools::dragonfly::Assemble(*this); break;
+  case Action::LinkJobClass:
+    T = new tools::dragonfly::Link(*this); break;
+  default:
+    return Generic_GCC::SelectTool(JA);
   }
 
   return *T;
diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h
index b8f469d..a11ae14 100644
--- a/lib/Driver/ToolChains.h
+++ b/lib/Driver/ToolChains.h
@@ -502,8 +502,6 @@
 
 class LLVM_LIBRARY_VISIBILITY Hexagon_TC : public Linux {
 protected:
-  mutable llvm::DenseMap<unsigned, Tool*> Tools;
-
   GCCVersion GCCLibAndIncVersion;
 
 public:
diff --git a/lib/Driver/WindowsToolChain.cpp b/lib/Driver/WindowsToolChain.cpp
index 52d7e19..60781ca 100644
--- a/lib/Driver/WindowsToolChain.cpp
+++ b/lib/Driver/WindowsToolChain.cpp
@@ -44,29 +44,30 @@
     Key = JA.getKind();
 
   Tool *&T = Tools[Key];
-  if (!T) {
-    switch (Key) {
-    case Action::InputClass:
-    case Action::BindArchClass:
-    case Action::LipoJobClass:
-    case Action::DsymutilJobClass:
-    case Action::VerifyJobClass:
-    case Action::PreprocessJobClass:
-    case Action::PrecompileJobClass:
-    case Action::AnalyzeJobClass:
-    case Action::MigrateJobClass:
-    case Action::CompileJobClass:
-      T = new tools::Clang(*this); break;
-    case Action::AssembleJobClass:
-      if (!useIntegratedAs() &&
-          getTriple().getEnvironment() == llvm::Triple::MachO)
-        T = new tools::darwin::Assemble(*this);
-      else
-        T = new tools::ClangAs(*this);
-      break;
-    case Action::LinkJobClass:
-      T = new tools::visualstudio::Link(*this); break;
-    }
+  if (T)
+    return *T;
+
+  switch (Key) {
+  case Action::InputClass:
+  case Action::BindArchClass:
+  case Action::LipoJobClass:
+  case Action::DsymutilJobClass:
+  case Action::VerifyJobClass:
+  case Action::PreprocessJobClass:
+  case Action::PrecompileJobClass:
+  case Action::AnalyzeJobClass:
+  case Action::MigrateJobClass:
+  case Action::CompileJobClass:
+    T = new tools::Clang(*this); break;
+  case Action::AssembleJobClass:
+    if (!useIntegratedAs() &&
+        getTriple().getEnvironment() == llvm::Triple::MachO)
+      T = new tools::darwin::Assemble(*this);
+    else
+      T = new tools::ClangAs(*this);
+    break;
+  case Action::LinkJobClass:
+    T = new tools::visualstudio::Link(*this); break;
   }
 
   return *T;
