diff --git a/include/clang/Frontend/InitHeaderSearch.h b/include/clang/Frontend/InitHeaderSearch.h
index 1d04439..c495a1d 100644
--- a/include/clang/Frontend/InitHeaderSearch.h
+++ b/include/clang/Frontend/InitHeaderSearch.h
@@ -59,7 +59,9 @@ public:
 
   /// AddGnuCPlusPlusIncludePaths - Add the necessary paths to suport a gnu
   ///  libstdc++.
-  void AddGnuCPlusPlusIncludePaths(const std::string &Base, const char *Arch);
+  void AddGnuCPlusPlusIncludePaths(const std::string &Base, const char *Dir32,
+                                   const char *Dir64,
+                                   const llvm::Triple &triple);
 
   /// AddDefaultEnvVarPaths - Adds list of paths from default environment
   ///  variables such as CPATH.
diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp
index 412b707..80dcaac 100644
--- a/lib/Frontend/InitHeaderSearch.cpp
+++ b/lib/Frontend/InitHeaderSearch.cpp
@@ -99,10 +99,18 @@ void InitHeaderSearch::AddEnvVarPaths(const char *Name) {
 }
 
 void InitHeaderSearch::AddGnuCPlusPlusIncludePaths(const std::string &Base,
-                                                  const char *Arch) {
-    AddPath(Base, System, true, false, false);
-    AddPath(Base + "/" + Arch, System, true, false, false);
-    AddPath(Base + "/backward", System, true, false, false);
+                                                   const char *Dir32,
+                                                   const char *Dir64,
+                                                   const llvm::Triple &triple) {
+  llvm::Triple::ArchType arch = triple.getArch();
+  bool is64bit = arch == llvm::Triple::ppc64 || arch == llvm::Triple::x86_64;
+
+  AddPath(Base, System, true, false, false);
+  if (is64bit)
+    AddPath(Base + "/" + Dir64, System, true, false, false);
+  else
+    AddPath(Base + "/" + Dir32, System, true, false, false);
+  AddPath(Base + "/backward", System, true, false, false);
 }
 
 #if defined(LLVM_ON_WIN32)
@@ -222,7 +230,7 @@ bool getVisualStudioDir(std::string &path) {
 #endif // LLVM_ON_WIN32
 
 void InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang,
-                                                   const llvm::Triple &triple) {
+                                                    const llvm::Triple &triple) {
   // FIXME: temporary hack: hard-coded paths.
   llvm::Triple::OSType os = triple.getOS();
 
@@ -267,21 +275,15 @@ void InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang,
   case llvm::Triple::MinGW64:
     if (Lang.CPlusPlus) {
       // Try gcc 4.4.0
-      // FIXME: This can just use AddGnuCPlusPlusIncludePaths, right?
-      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);
+      AddGnuCPlusPlusIncludePaths("c:/mingw/lib/gcc/mingw32/4.4.0/include/c++",
+                                  "mingw32",
+                                  "mingw32",
+                                  triple);
       // Try gcc 4.3.0
-      // FIXME: This can just use AddGnuCPlusPlusIncludePaths, right?
-      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);
+      AddGnuCPlusPlusIncludePaths("c:/mingw/lib/gcc/mingw32/4.3.0/include/c++",
+                                  "mingw32",
+                                  "mingw32",
+                                  triple);
     }
     AddPath("c:/mingw/include", System, true, false, false);
     break;
@@ -290,56 +292,91 @@ void InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang,
       switch (os) {
         case llvm::Triple::Darwin:
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.2.1",
-                                      "i686-apple-darwin10");
+                                      "i686-apple-darwin10",
+                                      "i686-apple-darwin10/x86_64",
+                                      triple);
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.0.0",
-                                      "i686-apple-darwin8");
+                                      "i686-apple-darwin8",
+                                      "i686-apple-darwin8",
+                                      triple);
           break;
         case llvm::Triple::Linux:
           // Ubuntu 7.10 - Gutsy Gibbon
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.3",
-                                      "i486-linux-gnu");
+                                      "i486-linux-gnu",
+                                      "i486-linux-gnu",
+                                      triple);
           // Ubuntu 9.04
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.3",
-                                      "x86_64-linux-gnu");
+                                      "x86_64-linux-gnu/32",
+                                      "x86_64-linux-gnu",
+                                      triple);
           // Fedora 8
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.1.2",
-                                      "i386-redhat-linux");
+                                      "i386-redhat-linux",
+                                      "i386-redhat-linux",
+                                      triple);
           // Fedora 9
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.0",
-                                      "i386-redhat-linux");
+                                      "i386-redhat-linux",
+                                      "i386-redhat-linux",
+                                      triple);
           // Fedora 10
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.2",
-                                      "i386-redhat-linux");
-          // openSUSE 11.1
+                                      "i386-redhat-linux",
+                                      "i386-redhat-linux",
+                                      triple);
+          // openSUSE 11.1 32 bit
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
-                                      "i586-suse-linux");
+                                      "i586-suse-linux",
+                                      "i586-suse-linux",
+                                      triple);
+          // openSUSE 11.1 64 bit
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
-                                      "x86_64-suse-linux");
+                                      "x86_64-suse-linux",
+                                      "x86_64-suse-linux",
+                                      triple);
           // openSUSE 11.2
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
-                                      "i586-suse-linux");
+                                      "i586-suse-linux",
+                                      "i586-suse-linux",
+                                      triple);
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.4",
-                                      "x86_64-suse-linux");
+                                      "x86_64-suse-linux",
+                                      "x86_64-suse-linux",
+                                      triple);
           // Arch Linux 2008-06-24
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1",
-                                      "i686-pc-linux-gnu");
+                                      "i686-pc-linux-gnu",
+                                      "i686-pc-linux-gnu",
+                                      triple);
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3.1",
-                                      "x86_64-unknown-linux-gnu");
+                                      "x86_64-unknown-linux-gnu",
+                                      "x86_64-unknown-linux-gnu",
+                                      triple);
           // Gentoo x86 2009.0 stable
           AddGnuCPlusPlusIncludePaths(
              "/usr/lib/gcc/i686-pc-linux-gnu/4.3.2/include/g++-v4",
-             "i686-pc-linux-gnu");
+             "i686-pc-linux-gnu",
+             "i686-pc-linux-gnu",
+             triple);
           // Gentoo x86 2008.0 stable
           AddGnuCPlusPlusIncludePaths(
              "/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4",
-             "i686-pc-linux-gnu");
+             "i686-pc-linux-gnu",
+             "i686-pc-linux-gnu",
+             triple);
           // Ubuntu 8.10
           AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.3",
-                                      "i486-pc-linux-gnu");
+                                      "i486-pc-linux-gnu",
+                                      "i486-pc-linux-gnu",
+                                      triple);
           // Gentoo amd64 stable
           AddGnuCPlusPlusIncludePaths(
              "/usr/lib/gcc/x86_64-pc-linux-gnu/4.1.2/include/g++-v4",
-             "i686-pc-linux-gnu");
+             "i686-pc-linux-gnu",
+             "i686-pc-linux-gnu",
+             triple);
           break;
         case llvm::Triple::FreeBSD:
           // DragonFly
@@ -350,7 +387,9 @@ void InitHeaderSearch::AddDefaultSystemIncludePaths(const LangOptions &Lang,
         case llvm::Triple::Solaris:
           // AuroraUX
           AddGnuCPlusPlusIncludePaths("/Opt/gcc4/include/c++/4.2.4",
-                                      "i386-pc-solaris2.11");
+                                      "i386-pc-solaris2.11",
+                                      "i386-pc-solaris2.11",
+                                      triple);
           break;
         default:
           break;
