Index: clang-3.0/tools/clang/lib/Driver/ToolChains.cpp
===================================================================
--- clang-3.0.orig/tools/clang/lib/Driver/ToolChains.cpp	2011-11-17 08:40:32.000000000 +0100
+++ clang-3.0/tools/clang/lib/Driver/ToolChains.cpp	2011-12-10 20:39:33.659630421 +0100
@@ -49,6 +49,8 @@
   #undef max
 #endif
 
+#include "clang/Debian/debian_path.h"
+
 using namespace clang::driver;
 using namespace clang::driver::toolchains;
 using namespace clang;
@@ -1954,37 +1956,45 @@
   // Lacking those, try to detect the correct set of system includes for the
   // target triple.
 
-  // Implement generic Debian multiarch support.
-  const StringRef X86_64MultiarchIncludeDirs[] = {
-    "/usr/include/x86_64-linux-gnu",
-
-    // FIXME: These are older forms of multiarch. It's not clear that they're
-    // in use in any released version of Debian, so we should consider
-    // removing them.
-    "/usr/include/i686-linux-gnu/64",
-    "/usr/include/i486-linux-gnu/64"
-  };
-  const StringRef X86MultiarchIncludeDirs[] = {
-    "/usr/include/i386-linux-gnu",
+  // // Implement generic Debian multiarch support.
+  // const StringRef X86_64MultiarchIncludeDirs[] = {
+  //   "/usr/include/x86_64-linux-gnu",
+
+  //   // FIXME: These are older forms of multiarch. It's not clear that they're
+  //   // in use in any released version of Debian, so we should consider
+  //   // removing them.
+  //   "/usr/include/i686-linux-gnu/64",
+  //   "/usr/include/i486-linux-gnu/64"
+  // };
+  // const StringRef X86MultiarchIncludeDirs[] = {
+  //   "/usr/include/i386-linux-gnu",
+
+  //   // FIXME: These are older forms of multiarch. It's not clear that they're
+  //   // in use in any released version of Debian, so we should consider
+  //   // removing them.
+  //   "/usr/include/x86_64-linux-gnu/32",
+  //   "/usr/include/i686-linux-gnu",
+  //   "/usr/include/i486-linux-gnu"
+  // };
+  // const StringRef ARMMultiarchIncludeDirs[] = {
+  //      "/usr/include/arm-linux-gnueabi"
+  // };
+
+  // ArrayRef<StringRef> MultiarchIncludeDirs;
+  // if (getTriple().getArch() == llvm::Triple::x86_64) {
+  //   MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
+  // } else if (getTriple().getArch() == llvm::Triple::x86) {
+  //   MultiarchIncludeDirs = X86MultiarchIncludeDirs;
+  // } else if (getTriple().getArch() == llvm::Triple::arm) {
+  //   MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
+  // }
+  // Debian/Ubuntu hack: we know we run Debian. The case therefor use hardcoded paths
+  // For example, stddef.h is provided by the gcc-X.Y package and files will be installed into:
+  // /usr/lib/gcc/x86_64-linux-gnu/4.6/include/stddef.h
+
+  addExternCSystemInclude(DriverArgs, CC1Args, std::string("/usr/lib/gcc/") + DEB_HOST_GNU_TYPE_TRIPLET + "/" + std::string(GCCInstallation.getVersion()) + "/include/");
 
-    // FIXME: These are older forms of multiarch. It's not clear that they're
-    // in use in any released version of Debian, so we should consider
-    // removing them.
-    "/usr/include/x86_64-linux-gnu/32",
-    "/usr/include/i686-linux-gnu",
-    "/usr/include/i486-linux-gnu"
-  };
-  const StringRef ARMMultiarchIncludeDirs[] = {
-    "/usr/include/arm-linux-gnueabi"
-  };
   ArrayRef<StringRef> MultiarchIncludeDirs;
-  if (getTriple().getArch() == llvm::Triple::x86_64) {
-    MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
-  } else if (getTriple().getArch() == llvm::Triple::x86) {
-    MultiarchIncludeDirs = X86MultiarchIncludeDirs;
-  } else if (getTriple().getArch() == llvm::Triple::arm) {
-    MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
-  }
   for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
                                      E = MultiarchIncludeDirs.end();
        I != E; ++I) {
Index: clang-3.0/tools/clang/lib/Frontend/InitHeaderSearch.cpp
===================================================================
--- clang-3.0.orig/tools/clang/lib/Frontend/InitHeaderSearch.cpp	2011-11-07 11:27:39.000000000 +0100
+++ clang-3.0/tools/clang/lib/Frontend/InitHeaderSearch.cpp	2011-12-10 20:40:42.067632305 +0100
@@ -15,6 +15,7 @@
 # include "clang/Config/config.h"
 #endif
 
+#include "clang/Basic/Version.h"
 #include "clang/Frontend/Utils.h"
 #include "clang/Basic/FileManager.h"
 #include "clang/Basic/LangOptions.h"
@@ -30,6 +31,7 @@
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Config/config.h"
+#include "clang/Debian/debian_path.h"
 using namespace clang;
 using namespace clang::frontend;
 
@@ -220,6 +222,17 @@
     }
   }
 
+  AddPath("/usr/include/" + std::string(DEB_HOST_GNU_TYPE_TRIPLET) + "/", System, true, false, false);
+  AddPath("/usr/include/" + std::string(DEB_HOST_MULTIARCH_TRIPLET) + "/", System, true, false, false);
+//      std::string("/usr/lib/gcc/") + DEB_HOST_GNU_TYPE_TRIPLET + "/" + std::string(GCCInstallation.getVersion()) + "/include/"
+
+  AddPath("/usr/include/clang/" + std::string(CLANG_VERSION_STRING) + "/include/", System, true, false, false);
+
+  AddPath("/usr/lib/gcc/" + std::string(DEB_HOST_GNU_TYPE_TRIPLET) + "/4.6/include/", System, true, false, false);
+  
+  AddPath("/usr/lib/gcc/" + std::string(DEB_HOST_GNU_TYPE_TRIPLET) + "/4.6/include-fixed/", System, true, false, false);
+
+
   // Builtin includes use #include_next directives and should be positioned
   // just prior C include dirs.
   if (HSOpts.UseBuiltinIncludes) {
@@ -328,6 +342,10 @@
 void InitHeaderSearch::
 AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple, const HeaderSearchOptions &HSOpts) {
   llvm::Triple::OSType os = triple.getOS();
+
+  AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6/", DEB_HOST_GNU_TYPE_TRIPLET, "", "64", triple);
+  AddGnuCPlusPlusIncludePaths("/usr/include/c++/4.6/", DEB_HOST_GNU_TYPE_TRIPLET, "32", "", triple);
+
   StringRef CxxIncludeRoot(CXX_INCLUDE_ROOT);
   if (CxxIncludeRoot != "") {
     StringRef CxxIncludeArch(CXX_INCLUDE_ARCH);
@@ -451,7 +469,7 @@
   default:
     break; // Everything else continues to use this routine's logic.
 
-  case llvm::Triple::Linux:
+//  case llvm::Triple::Linux:
   case llvm::Triple::Win32:
     return;
   }
