From: Chandler Carruth Date: Wed, 9 Nov 2011 03:46:20 +0000 (+0000) Subject: Fix an issue that Duncan discovered on a specific (no longer current) X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d936d9d9abae0e5018fa0233aa51ac8390a6778f;p=clang Fix an issue that Duncan discovered on a specific (no longer current) version of Ubuntu. It has a very broken multiarch configuration, and so we need special logic to handle it correctly. Fixing and testing this uncovered a few other trivial issues with the logic that are fixed as well. I added tests to cover this as it is hard to notice if you install recent versions of the OS. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144165 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index e5f82bab7d..79eff7b9cd 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -1146,7 +1146,7 @@ Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(const Driver &D) if (!llvm::sys::fs::exists(LibDir)) continue; for (unsigned k = 0, ke = CandidateTriples.size(); k < ke; ++k) - ScanLibDirForGCCTriple(LibDir, CandidateTriples[k]); + ScanLibDirForGCCTriple(HostArch, LibDir, CandidateTriples[k]); } } } @@ -1226,7 +1226,8 @@ Generic_GCC::GCCInstallationDetector::GCCInstallationDetector(const Driver &D) } void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( - const std::string &LibDir, StringRef CandidateTriple) { + llvm::Triple::ArchType HostArch, const std::string &LibDir, + StringRef CandidateTriple) { // There are various different suffixes involving the triple we // check for. We also record what is necessary to walk from each back // up to the lib directory. @@ -1238,7 +1239,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( // match. // FIXME: It may be worthwhile to generalize this and look for a second // triple. - "/" + CandidateTriple.str() + "/gcc/i686-linux-gnu" + "/i386-linux-gnu/gcc/" + CandidateTriple.str() }; const std::string InstallSuffixes[] = { "/../../..", @@ -1247,7 +1248,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple( }; // Only look at the final, weird Ubuntu suffix for i386-linux-gnu. const unsigned NumSuffixes = (llvm::array_lengthof(Suffixes) - - (CandidateTriple != "i386-linux-gnu")); + (HostArch != llvm::Triple::x86)); for (unsigned i = 0; i < NumSuffixes; ++i) { StringRef Suffix = Suffixes[i]; llvm::error_code EC; @@ -1889,12 +1890,9 @@ Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple) if (!Suffix.empty()) addPathIfExists(GCCInstallation.getInstallPath(), Paths); addPathIfExists(LibPath + "/../" + GccTriple + "/lib", Paths); - addPathIfExists(LibPath + "/" + MultiarchTriple, Paths); addPathIfExists(LibPath, Paths); } - addPathIfExists(SysRoot + "/lib/" + MultiarchTriple, Paths); addPathIfExists(SysRoot + "/lib", Paths); - addPathIfExists(SysRoot + "/usr/lib/" + MultiarchTriple, Paths); addPathIfExists(SysRoot + "/usr/lib", Paths); } @@ -2002,7 +2000,7 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs, for (ArrayRef::iterator I = MultiarchIncludeDirs.begin(), E = MultiarchIncludeDirs.end(); I != E; ++I) { - if (llvm::sys::fs::exists(*I)) { + if (llvm::sys::fs::exists(D.SysRoot + *I)) { addExternCSystemInclude(DriverArgs, CC1Args, D.SysRoot + *I); break; } diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 60453ebca4..d150a97693 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -100,7 +100,8 @@ protected: SmallVectorImpl &LibDirs, SmallVectorImpl &Triples); - void ScanLibDirForGCCTriple(const std::string &LibDir, + void ScanLibDirForGCCTriple(llvm::Triple::ArchType HostArch, + const std::string &LibDir, StringRef CandidateTriple); }; diff --git a/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/.keep b/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/i386-linux-gnu/.keep b/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/lib/i386-linux-gnu/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/.keep b/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/.keep b/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/backward/.keep b/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/backward/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/i686-linux-gnu/.keep b/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/c++/4.5/i686-linux-gnu/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/i386-linux-gnu/.keep b/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/include/i386-linux-gnu/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/.keep b/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/.keep b/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/crtbegin.o b/test/Driver/Inputs/ubuntu_11.04_multiarch_tree/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/crtbegin.o new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/linux-header-search.cpp b/test/Driver/linux-header-search.cpp new file mode 100644 index 0000000000..a2f486e307 --- /dev/null +++ b/test/Driver/linux-header-search.cpp @@ -0,0 +1,17 @@ +// General tests that the header search paths detected by the driver and passed +// to CC1 are sane. +// +// Test a very broken version of multiarch that shipped in Ubuntu 11.04. +// RUN: %clang -no-canonical-prefixes %s -### -fsyntax-only 2>&1 \ +// RUN: -ccc-host-triple i386-unknown-linux \ +// RUN: --sysroot=%S/Inputs/ubuntu_11.04_multiarch_tree \ +// RUN: | FileCheck --check-prefix=CHECK-UBUNTU-11-04 %s +// CHECK-UBUNTU-11-04: "{{.*}}clang{{.*}}" "-cc1" +// CHECK-UBUNTU-11-04: "-isysroot" "[[SYSROOT:[^"]+]]" +// CHECK-UBUNTU-11-04: "-internal-isystem" "[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../../../include/c++/4.5" +// 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" +// CHECK-UBUNTU-11-04: "-internal-isystem" "[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../../../include/c++/4.5/backward" +// CHECK-UBUNTU-11-04: "-internal-isystem" "[[SYSROOT]]/usr/local/include" +// CHECK-UBUNTU-11-04: "-internal-isystem" "{{.*}}/lib/clang/{{[0-9]\.[0-9]}}/include" +// CHECK-UBUNTU-11-04: "-internal-externc-isystem" "[[SYSROOT]]/include" +// CHECK-UBUNTU-11-04: "-internal-externc-isystem" "[[SYSROOT]]/usr/include" diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c index 456f7add7f..b2f510544f 100644 --- a/test/Driver/linux-ld.c +++ b/test/Driver/linux-ld.c @@ -145,3 +145,17 @@ // CHECK-GCC-VERSION4: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" // CHECK-GCC-VERSION4: "{{.*}}/Inputs/gcc_version_parsing4/bin/../lib/gcc/i386-unknown-linux/4.7.99/crtbegin.o" // CHECK-GCC-VERSION4: "-L{{.*}}/Inputs/gcc_version_parsing4/bin/../lib/gcc/i386-unknown-linux/4.7.99" +// +// Test a very broken version of multiarch that shipped in Ubuntu 11.04. +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -ccc-host-triple i386-unknown-linux \ +// RUN: --sysroot=%S/Inputs/ubuntu_11.04_multiarch_tree \ +// RUN: | FileCheck --check-prefix=CHECK-UBUNTU-11-04 %s +// CHECK-UBUNTU-11-04: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-UBUNTU-11-04: "{{.*}}/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/crtbegin.o" +// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5" +// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../../i386-linux-gnu" +// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib/i386-linux-gnu" +// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../.." +// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/lib" +// CHECK-UBUNTU-11-04: "-L[[SYSROOT]]/usr/lib"