]> granicus.if.org Git - clang/commitdiff
Take a better approach to detecting and selecting multiarch include
authorChandler Carruth <chandlerc@gmail.com>
Sun, 6 Nov 2011 08:21:07 +0000 (08:21 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sun, 6 Nov 2011 08:21:07 +0000 (08:21 +0000)
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/trunk@143866 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Driver/ToolChains.cpp

index 3d4f12cb86539130ab7d7ab541fccbbede3e99c9..df01fc9d7897f076785274ae8816a398656709a7 100644 (file)
@@ -1995,23 +1995,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)