Merging r143866:
authorChandler Carruth <chandlerc@gmail.com>
Mon, 7 Nov 2011 10:34:06 +0000 (10:34 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Mon, 7 Nov 2011 10:34:06 +0000 (10:34 +0000)
------------------------------------------------------------------------
r143866 | chandlerc | 2011-11-06 01:21:07 -0700 (Sun, 06 Nov 2011) | 4 lines

Take a better approach to detecting and selecting multiarch include
directories. This way we stop at the first multiarch directory found on
the system. This achieves the real intended result of pruning
non-existent directories.
------------------------------------------------------------------------

git-svn-id: https://llvm.org/svn/llvm-project/cfe/branches/release_30@143946 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/ToolChains.cpp

index 4440e27eb94f24b3e3331809a353409fb5594ddb..d07abab9cf312c1b4c6d9d274ceacba0e319883b 100644 (file)
@@ -2003,23 +2003,44 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
   // Lacking those, try to detect the correct set of system includes for the
   // target triple.
 
-  // Generic Debian multiarch support:
+  // 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) {
-    addExternCSystemInclude(DriverArgs, CC1Args,
-                            "/usr/include/x86_64-linux-gnu");
-    addExternCSystemInclude(DriverArgs, CC1Args,
-                            "/usr/include/i686-linux-gnu/64");
-    addExternCSystemInclude(DriverArgs, CC1Args,
-                            "/usr/include/i486-linux-gnu/64");
+    MultiarchIncludeDirs = X86_64MultiarchIncludeDirs;
   } else if (getTriple().getArch() == llvm::Triple::x86) {
-    addExternCSystemInclude(DriverArgs, CC1Args,
-                            "/usr/include/x86_64-linux-gnu/32");
-    addExternCSystemInclude(DriverArgs, CC1Args, "/usr/include/i686-linux-gnu");
-    addExternCSystemInclude(DriverArgs, CC1Args, "/usr/include/i486-linux-gnu");
-    addExternCSystemInclude(DriverArgs, CC1Args, "/usr/include/i386-linux-gnu");
+    MultiarchIncludeDirs = X86MultiarchIncludeDirs;
   } else if (getTriple().getArch() == llvm::Triple::arm) {
-    addExternCSystemInclude(DriverArgs, CC1Args,
-                            "/usr/include/arm-linux-gnueabi");
+    MultiarchIncludeDirs = ARMMultiarchIncludeDirs;
+  }
+  for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),
+                                     E = MultiarchIncludeDirs.end();
+       I != E; ++I) {
+    if (llvm::sys::fs::exists(*I)) {
+      addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I);
+      break;
+    }
   }
 
   if (getTriple().getOS() == llvm::Triple::RTEMS)