Hey Doug, Bill;<div><br></div><div>This revision does in fact fix the issue reported by Duncan. I've been able to reproduce this now on a VM with the same version of Ubuntu, and can confirm that this fixes the issue.</div>
<div><br></div><div>Is this small enough to pull in? These issues were present before I started this process, but they were latent. Now that we are using the driver infrastructure more heavily, the issue surfaced...</div>
<div><br></div><div>-Chandler<br><br><div class="gmail_quote">On Tue, Nov 8, 2011 at 7:46 PM, Chandler Carruth <span dir="ltr"><<a href="mailto:chandlerc@gmail.com">chandlerc@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Author: chandlerc<br>
Date: Tue Nov  8 21:46:20 2011<br>
New Revision: 144165<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=144165&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=144165&view=rev</a><br>
Log:<br>
Fix an issue that Duncan discovered on a specific (no longer current)<br>
version of Ubuntu. It has a very broken multiarch configuration, and so<br>
we need special logic to handle it correctly. Fixing and testing this<br>
uncovered a few other trivial issues with the logic that are fixed as<br>
well.<br>
<br>
I added tests to cover this as it is hard to notice if you install<br>
recent versions of the OS.<br>
<br>
Added:<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/.keep<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/i386-linux-gnu/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/i386-linux-gnu/.keep<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/.keep<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/.keep<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/backward/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/backward/.keep<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/i686-linux-gnu/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/i686-linux-gnu/.keep<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/i386-linux-gnu/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/i386-linux-gnu/.keep<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/.keep<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/.keep<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/gcc/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/<br>
    cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/crtbegin.o<br>
    cfe/trunk/test/Driver/linux-header-search.cpp<br>
Modified:<br>
    cfe/trunk/lib/Driver/ToolChains.cpp<br>
    cfe/trunk/lib/Driver/ToolChains.h<br>
    cfe/trunk/test/Driver/linux-ld.c<br>
<br>
Modified: cfe/trunk/lib/Driver/ToolChains.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=144165&r1=144164&r2=144165&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=144165&r1=144164&r2=144165&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Driver/ToolChains.cpp (original)<br>
+++ cfe/trunk/lib/Driver/ToolChains.cpp Tue Nov  8 21:46:20 2011<br>
@@ -1146,7 +1146,7 @@<br>
       if (!llvm::sys::fs::exists(LibDir))<br>
         continue;<br>
       for (unsigned k = 0, ke = CandidateTriples.size(); k < ke; ++k)<br>
-        ScanLibDirForGCCTriple(LibDir, CandidateTriples[k]);<br>
+        ScanLibDirForGCCTriple(HostArch, LibDir, CandidateTriples[k]);<br>
     }<br>
   }<br>
 }<br>
@@ -1226,7 +1226,8 @@<br>
 }<br>
<br>
 void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(<br>
-    const std::string &LibDir, StringRef CandidateTriple) {<br>
+    llvm::Triple::ArchType HostArch, const std::string &LibDir,<br>
+    StringRef CandidateTriple) {<br>
   // There are various different suffixes involving the triple we<br>
   // check for. We also record what is necessary to walk from each back<br>
   // up to the lib directory.<br>
@@ -1238,7 +1239,7 @@<br>
     // match.<br>
     // FIXME: It may be worthwhile to generalize this and look for a second<br>
     // triple.<br>
-    "/" + CandidateTriple.str() + "/gcc/i686-linux-gnu"<br>
+    "/i386-linux-gnu/gcc/" + CandidateTriple.str()<br>
   };<br>
   const std::string InstallSuffixes[] = {<br>
     "/../../..",<br>
@@ -1247,7 +1248,7 @@<br>
   };<br>
   // Only look at the final, weird Ubuntu suffix for i386-linux-gnu.<br>
   const unsigned NumSuffixes = (llvm::array_lengthof(Suffixes) -<br>
-                                (CandidateTriple != "i386-linux-gnu"));<br>
+                                (HostArch != llvm::Triple::x86));<br>
   for (unsigned i = 0; i < NumSuffixes; ++i) {<br>
     StringRef Suffix = Suffixes[i];<br>
     llvm::error_code EC;<br>
@@ -1889,12 +1890,9 @@<br>
     if (!Suffix.empty())<br>
       addPathIfExists(GCCInstallation.getInstallPath(), Paths);<br>
     addPathIfExists(LibPath + "/../" + GccTriple + "/lib", Paths);<br>
-    addPathIfExists(LibPath + "/" + MultiarchTriple, Paths);<br>
     addPathIfExists(LibPath, Paths);<br>
   }<br>
-  addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths);<br>
   addPathIfExists(SysRoot + "/lib", Paths);<br>
-  addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths);<br>
   addPathIfExists(SysRoot + "/usr/lib", Paths);<br>
 }<br>
<br>
@@ -2002,7 +2000,7 @@<br>
   for (ArrayRef<StringRef>::iterator I = MultiarchIncludeDirs.begin(),<br>
                                      E = MultiarchIncludeDirs.end();<br>
        I != E; ++I) {<br>
-    if (llvm::sys::fs::exists(*I)) {<br>
+    if (llvm::sys::fs::exists(D.SysRoot + *I)) {<br>
       addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I);<br>
       break;<br>
     }<br>
<br>
Modified: cfe/trunk/lib/Driver/ToolChains.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=144165&r1=144164&r2=144165&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.h?rev=144165&r1=144164&r2=144165&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Driver/ToolChains.h (original)<br>
+++ cfe/trunk/lib/Driver/ToolChains.h Tue Nov  8 21:46:20 2011<br>
@@ -100,7 +100,8 @@<br>
                                          SmallVectorImpl<StringRef> &LibDirs,<br>
                                          SmallVectorImpl<StringRef> &Triples);<br>
<br>
-    void ScanLibDirForGCCTriple(const std::string &LibDir,<br>
+    void ScanLibDirForGCCTriple(llvm::Triple::ArchType HostArch,<br>
+                                const std::string &LibDir,<br>
                                 StringRef CandidateTriple);<br>
   };<br>
<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/.keep<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/.keep?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/.keep?rev=144165&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/i386-linux-gnu/.keep<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/i386-linux-gnu/.keep?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/i386-linux-gnu/.keep?rev=144165&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/.keep<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/.keep?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/.keep?rev=144165&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/.keep<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c%2B%2B/4.5/.keep?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c%2B%2B/4.5/.keep?rev=144165&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/backward/.keep<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c%2B%2B/4.5/backward/.keep?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c%2B%2B/4.5/backward/.keep?rev=144165&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/i686-linux-gnu/.keep<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c%2B%2B/4.5/i686-linux-gnu/.keep?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c%2B%2B/4.5/i686-linux-gnu/.keep?rev=144165&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/i386-linux-gnu/.keep<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/i386-linux-gnu/.keep?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/i386-linux-gnu/.keep?rev=144165&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/.keep<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/.keep?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/.keep?rev=144165&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/.keep<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/.keep?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/.keep?rev=144165&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/crtbegin.o<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/crtbegin.o?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/crtbegin.o?rev=144165&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Driver/linux-header-search.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/linux-header-search.cpp?rev=144165&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/linux-header-search.cpp?rev=144165&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/Driver/linux-header-search.cpp (added)<br>
+++ cfe/trunk/test/Driver/linux-header-search.cpp Tue Nov  8 21:46:20 2011<br>
@@ -0,0 +1,17 @@<br>
+// General tests that the header search paths detected by the driver and passed<br>
+// to CC1 are sane.<br>
+//<br>
+// Test a very broken version of multiarch that shipped in Ubuntu 11.04.<br>
+// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \<br>
+// RUN:     -ccc-host-triple i386-unknown-linux \<br>
+// RUN:     --sysroot=%S/Inputs/ubuntu_11.04_multiarch_tree \<br>
+// RUN:   | FileCheck --check-prefix=CHECK-UBUNTU-11-04 %s<br>
+// CHECK-UBUNTU-11-04: "{{.*}}clang{{.*}}" "-cc1"<br>
+// CHECK-UBUNTU-11-04: "-isysroot" "[[SYSROOT:[^"]+]]"<br>
+// CHECK-UBUNTU-11-04: "-internal-isystem" "[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../../../include/c++/4.5"<br>
+// CHECK-UBUNTU-11-04: "-internal-isystem" "[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../../../include/c++/4.5/i686-linux-gnu"<br>
+// CHECK-UBUNTU-11-04: "-internal-isystem" "[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../../../include/c++/4.5/backward"<br>
+// CHECK-UBUNTU-11-04: "-internal-isystem" "[[SYSROOT]]/usr/local/include"<br>
+// CHECK-UBUNTU-11-04: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9]\.[0-9]}}/include"<br>
+// CHECK-UBUNTU-11-04: "-internal-externc-isystem" "[[SYSROOT]]/include"<br>
+// CHECK-UBUNTU-11-04: "-internal-externc-isystem" "[[SYSROOT]]/usr/include"<br>
<br>
Modified: cfe/trunk/test/Driver/linux-ld.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/linux-ld.c?rev=144165&r1=144164&r2=144165&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/linux-ld.c?rev=144165&r1=144164&r2=144165&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Driver/linux-ld.c (original)<br>
+++ cfe/trunk/test/Driver/linux-ld.c Tue Nov  8 21:46:20 2011<br>
@@ -145,3 +145,17 @@<br>
 // CHECK-GCC-VERSION4: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"<br>
 // CHECK-GCC-VERSION4: "{{.*}}/Inputs/gcc_version_parsing4/bin/../lib/gcc/i386-unknown-linux/4.7.99/crtbegin.o"<br>
 // CHECK-GCC-VERSION4: "-L{{.*}}/Inputs/gcc_version_parsing4/bin/../lib/gcc/i386-unknown-linux/4.7.99"<br>
+//<br>
+// Test a very broken version of multiarch that shipped in Ubuntu 11.04.<br>
+// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \<br>
+// RUN:     -ccc-host-triple i386-unknown-linux \<br>
+// RUN:     --sysroot=%S/Inputs/ubuntu_11.04_multiarch_tree \<br>
+// RUN:   | FileCheck --check-prefix=CHECK-UBUNTU-11-04 %s<br>
+// CHECK-UBUNTU-11-04: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"<br>
+// CHECK-UBUNTU-11-04: "{{.*}}/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/crtbegin.o"<br>
+// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5"<br>
+// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../../i386-linux-gnu"<br>
+// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib/i386-linux-gnu"<br>
+// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../.."<br>
+// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/lib"<br>
+// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib"<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>