diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp
index b56e3a8..05855cf 100644
--- a/lib/Frontend/InitHeaderSearch.cpp
+++ b/lib/Frontend/InitHeaderSearch.cpp
@@ -99,100 +99,269 @@
 }
 
 void InitHeaderSearch::AddGnuCPlusPlusIncludePaths(std::string base,
-						   std::string arch) {
+                                                   std::string arch) {
     AddPath(base, System, true, false, false);
     AddPath(base + "/" + arch, System, true, false, false);
     AddPath(base + "/backward", System, true, false, false);
 }
 
-void InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang) {
-  // FIXME: temporary hack: hard-coded paths.
-  // FIXME: get these from the target?
+#if defined(LLVM_ON_WIN32)
 
-#ifdef LLVM_ON_WIN32
-  if (Lang.CPlusPlus) {
-    // Mingw32 GCC version 4
-    AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++",
-            System, true, false, false);
-    AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++/mingw32",
-            System, true, false, false);
-    AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++/backward",
-            System, true, false, false);
+#if 0 // Yikes!  Can't include windows.h.
+  #if LLVM_ON_WIN32
+    #define WIN32_LEAN_AND_MEAN 1
+    #include <windows.h>
+  #endif
+
+  // Read Windows registry string.
+bool getWindowsRegistryString(const char *keyPath, const char *valueName,
+                       char *value, size_t maxLength) {
+  HKEY hRootKey = NULL;
+  HKEY hKey = NULL;
+  const char* subKey = NULL;
+  DWORD valueType;
+  DWORD valueSize = maxLength - 1;
+  bool returnValue = false;
+  if (strncmp(keyPath, "HKEY_CLASSES_ROOT\\", 18) == 0) {
+    hRootKey = HKEY_CLASSES_ROOT;
+    subKey = keyPath + 18;
   }
+  else if (strncmp(keyPath, "HKEY_USERS\\", 11) == 0) {
+    hRootKey = HKEY_USERS;
+    subKey = keyPath + 11;
+  }
+  else if (strncmp(keyPath, "HKEY_LOCAL_MACHINE\\", 19) == 0) {
+    hRootKey = HKEY_LOCAL_MACHINE;
+    subKey = keyPath + 19;
+  }
+  else if (strncmp(keyPath, "HKEY_CURRENT_USER\\", 18) == 0) {
+    hRootKey = HKEY_CURRENT_USER;
+    subKey = keyPath + 18;
+  }
+  else
+    return(false);
+  long lResult = RegOpenKeyEx(hRootKey, subKey, 0, KEY_READ, &hKey);
+  if (lResult == ERROR_SUCCESS) {
+    lResult = RegQueryValueEx(hKey, valueName, NULL, &valueType, (LPBYTE)value,
+                              &valueSize);
+    if (lResult == ERROR_SUCCESS)
+      returnValue = true;
+    RegCloseKey(kKey);
+  }
+  return(returnValue);
+}
 
-  // Mingw32 GCC version 4
-  AddPath("C:/mingw/include", System, false, false, false);
+  // Get Visual Studio installation directory.
+bool getVisualStudioDir(std::string &path) {
+  char vs80comntools[256];
+  char vs90comntools[256];
+  const char* vscomntools = NULL;
+  bool has80 = getWindowsRegistryString(
+    "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\8.0",
+    "InstallDir", vs80comntools, sizeof(vs80comntools) - 1);
+  bool has90 = getWindowsRegistryString(
+    "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\9.0",
+    "InstallDir", vs90comntools, sizeof(vs90comntools) - 1);
+    // If we have both vc80 and vc90, pick version we were compiled with. 
+  if (has80 && has90) {
+    #ifdef _MSC_VER
+      #if (_MSC_VER >= 1500)  // VC90
+          vscomntools = vs90comntools;
+      #elif (_MSC_VER == 1400) // VC80
+          vscomntools = vs80comntools;
+      #else
+          vscomntools = vs90comntools;
+      #endif
+    #else
+      vscomntools = vs90comntools;
+    #endif
+  }
+  else if (has90)
+    vscomntools = vs90comntools;
+  else if (has80)
+    vscomntools = vs80comntools;
+  else
+    return(false);
+  char *p = strstr(vscomntools, "\\Common7\\ide");
+  if (p)
+    *p = '\0';
+  path = vscomntools;
+  return(true);
+}
 #else
 
-  if (Lang.CPlusPlus) {
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
-				"i686-apple-darwin10");
-
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0", "i686-apple-darwin8");
-
-    // Ubuntu 7.10 - Gutsy Gibbon
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.3", "i486-linux-gnu");
-
-    // Ubuntu 9.04
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.3", "x86_64-linux-gnu");
-
-    // Fedora 8
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.2", "i386-redhat-linux");
-
-    // Fedora 9
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.0", "i386-redhat-linux");
-
-    // Fedora 10
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.2", "i386-redhat-linux");
-
-    // openSUSE 11.1
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3", "i586-suse-linux");
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3", "x86_64-suse-linux");
-
-    // openSUSE 11.2
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4", "i586-suse-linux");
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4", "x86_64-suse-linux");
-
-    // Arch Linux 2008-06-24
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1", "i686-pc-linux-gnu");
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1",
-				"x86_64-unknown-linux-gnu");
-
-    // Gentoo x86 2009.0 stable
-    AddGnuCPlusPlusIncludePaths(
-       "/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4",
-       "i686-pc-linux-gnu");
-
-    // Gentoo x86 2008.0 stable
-    AddGnuCPlusPlusIncludePaths(
-       "/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4",
-       "i686-pc-linux-gnu");
-
-    // Ubuntu 8.10
-    AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3", "i486-pc-linux-gnu");
-
-    // Gentoo amd64 stable
-    AddGnuCPlusPlusIncludePaths(
-        "/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4",
-	"i686-pc-linux-gnu");
-
-    // DragonFly
-    AddPath("/usr/include/c++/4.1", System, true, false, false);
-
-    // FreeBSD
-    AddPath("/usr/include/c++/4.2", System, true, false, false);
-
-    // AuroraUX
-    AddGnuCPlusPlusIncludePaths("/Opt/gcc4/include/c++/4.2.4",
-				"i386-pc-solaris2.11");
+  // Get Visual Studio installation directory.
+bool getVisualStudioDir(std::string &path) {
+  const char* vs90comntools = getenv("VS90COMNTOOLS");
+  const char* vs80comntools = getenv("VS80COMNTOOLS");
+  const char* vscomntools = NULL;
+    // If we have both vc80 and vc90, pick version we were compiled with. 
+  if (vs90comntools && vs80comntools) {
+    #if (_MSC_VER >= 1500)  // VC90
+        vscomntools = vs90comntools;
+    #elif (_MSC_VER == 1400) // VC80
+        vscomntools = vs80comntools;
+    #else
+        vscomntools = vs90comntools;
+    #endif
   }
-
-  AddPath("/usr/local/include", System, false, false, false);
-
-  AddPath("/usr/include", System, false, false, false);
-  AddPath("/System/Library/Frameworks", System, true, false, true);
-  AddPath("/Library/Frameworks", System, true, false, true);
+  else if (vs90comntools)
+    vscomntools = vs90comntools;
+  else if (vs80comntools)
+    vscomntools = vs80comntools;
+  else
+    return(false);
+  char *p = (char*)strstr(vscomntools, "\\Common7\\Tools");
+  if (p)
+    *p = '\0';
+  path = vscomntools;
+  return(true);
+}
 #endif
+
+#endif // LLVM_ON_WIN32
+
+void InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang,
+                                                    llvm::Triple &triple) {
+  // FIXME: temporary hack: hard-coded paths.
+  llvm::Triple::OSType os = triple.getOS();
+
+  switch (os) {
+  case llvm::Triple::Win32:
+    {
+      #if defined(_MSC_VER)
+        std::string VSDir;
+        if (getVisualStudioDir(VSDir)) {
+          VSDir += "\\VC\\include";
+          AddPath(VSDir, System, false, false, false);
+        }
+        else {
+            // Default install paths.
+          AddPath("C:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\include",
+            System, false, false, false);
+          AddPath("C:\\Program Files\\Microsoft Visual Studio 8\\VC\\include",
+            System, false, false, false);
+            // For some clang developers.
+          AddPath("G:\\Program Files\\Microsoft Visual Studio 9.0\\VC\\include",
+            System, false, false, false);
+        }
+      #else
+          // Default install paths.
+        AddPath("/Program Files/Microsoft Visual Studio 9.0/VC/include",
+          System, false, false, false);
+        AddPath("/Program Files/Microsoft Visual Studio 8/VC/include",
+          System, false, false, false);
+      #endif
+    }
+    break;
+  case llvm::Triple::Cygwin:
+    if (Lang.CPlusPlus) {
+      AddPath("/lib/gcc/i686-pc-cygwin/3.4.4/include", System, false, false,
+              false);
+      AddPath("/lib/gcc/i686-pc-cygwin/3.4.4/include/c++", System, false, false,
+              false);
+    }
+    AddPath("/usr/include", System, false, false, false);
+    break;
+  case llvm::Triple::MinGW32:
+  case llvm::Triple::MinGW64:
+    if (Lang.CPlusPlus) {
+      // Try gcc 4.4.0
+      AddPath("c:/mingw/lib/gcc/mingw32/4.4.0/include/c++",
+              System, true, false, false);
+      AddPath("c:/mingw/lib/gcc/mingw32/4.4.0/include/c++/mingw32",
+              System, true, false, false);
+      AddPath("c:/mingw/lib/gcc/mingw32/4.4.0/include/c++/backward",
+              System, true, false, false);
+      // Try gcc 4.3.0
+      AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++",
+              System, true, false, false);
+      AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++/mingw32",
+              System, true, false, false);
+      AddPath("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++/backward",
+              System, true, false, false);
+    }
+    AddPath("c:/mingw/include", System, true, false, false);
+    break;
+  default:
+    if (Lang.CPlusPlus) {
+      switch (os) {
+        case llvm::Triple::Darwin:
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
+                                      "i686-apple-darwin10");
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0",
+                                      "i686-apple-darwin8");
+          break;
+        case llvm::Triple::Linux:
+          // Ubuntu 7.10 - Gutsy Gibbon
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.3",
+                                      "i486-linux-gnu");
+          // Ubuntu 9.04
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.3",
+                                      "x86_64-linux-gnu");
+          // Fedora 8
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.2",
+                                      "i386-redhat-linux");
+          // Fedora 9
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.0",
+                                      "i386-redhat-linux");
+          // Fedora 10
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.2",
+                                      "i386-redhat-linux");
+          // openSUSE 11.1
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
+                                      "i586-suse-linux");
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
+                                      "x86_64-suse-linux");
+          // openSUSE 11.2
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
+                                      "i586-suse-linux");
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
+                                      "x86_64-suse-linux");
+          // Arch Linux 2008-06-24
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1",
+                                      "i686-pc-linux-gnu");
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1",
+                                      "x86_64-unknown-linux-gnu");
+          // Gentoo x86 2009.0 stable
+          AddGnuCPlusPlusIncludePaths(
+             "/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4",
+             "i686-pc-linux-gnu");
+          // Gentoo x86 2008.0 stable
+          AddGnuCPlusPlusIncludePaths(
+             "/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4",
+             "i686-pc-linux-gnu");
+          // Ubuntu 8.10
+          AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
+                                      "i486-pc-linux-gnu");
+          // Gentoo amd64 stable
+          AddGnuCPlusPlusIncludePaths(
+             "/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4",
+             "i686-pc-linux-gnu");
+          break;
+        case llvm::Triple::FreeBSD:
+          // DragonFly
+          AddPath("/usr/include/c++/4.1", System, true, false, false);
+          // FreeBSD
+          AddPath("/usr/include/c++/4.2", System, true, false, false);
+          break;
+        case llvm::Triple::Solaris:
+          // AuroraUX
+          AddGnuCPlusPlusIncludePaths("/Opt/gcc4/include/c++/4.2.4",
+                                      "i386-pc-solaris2.11");
+          break;
+        default:
+          break;
+      }
+    }
+
+    AddPath("/usr/local/include", System, false, false, false);
+
+    AddPath("/usr/include", System, false, false, false);
+    AddPath("/System/Library/Frameworks", System, true, false, true);
+    AddPath("/Library/Frameworks", System, true, false, true);
+    break;
+  }
 }
 
 void InitHeaderSearch::AddDefaultEnvVarPaths(const LangOptions &Lang) {
