summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2011-10-03 08:02:58 +0000
committerChandler Carruth <chandlerc@gmail.com>2011-10-03 08:02:58 +0000
commit5fdc7cba2ab94ef5d4cb9227c60aafa9b2f9732b (patch)
tree54109a1debf49abe8d95a3337f8de262015f44e8
parent285bc3408958d9b31117d8b2076fc2abf500f776 (diff)
downloadbcm5719-llvm-5fdc7cba2ab94ef5d4cb9227c60aafa9b2f9732b.tar.gz
bcm5719-llvm-5fdc7cba2ab94ef5d4cb9227c60aafa9b2f9732b.zip
Teach the logic for locating an installed GCC about the system root.
This requires fixing a latent bug -- if we used the default host triple instead of an autodetected triple to locate GCC's installation, we didn't go back and fix the GCC triple. Correct that with a pile of hacks. This entire routine needs a major refactoring which I'm saving for a subsequent commit. Essentially, the detection of the GCC triple should be hoisted into the same routine as we locate the GCC installation: the first is intrinsically tied to the latter. Then the routine will just return the triple and base directory. Also start to bring the rest of the library search path logic under test, including locating crtbegin.o. Still need to test the multilib and other behaviors, but there are also bugs in the way of that. llvm-svn: 140995
-rw-r--r--clang/lib/Driver/ToolChains.cpp18
-rw-r--r--clang/test/Driver/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0/crtbegin.o0
-rw-r--r--clang/test/Driver/Inputs/basic_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0/crtbegin.o0
-rw-r--r--clang/test/Driver/linux-ld.c14
4 files changed, 23 insertions, 9 deletions
diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp
index dd35172402c..c6adbc04a8e 100644
--- a/clang/lib/Driver/ToolChains.cpp
+++ b/clang/lib/Driver/ToolChains.cpp
@@ -1483,8 +1483,12 @@ static LinuxDistro DetectLinuxDistro(llvm::Triple::ArchType Arch) {
return UnknownDistro;
}
-static std::string findGCCBaseLibDir(const Driver &D,
- const std::string &GccTriple) {
+/// \brief Find an installed GCC lib base directory.
+///
+/// Tries both the auto-detected GccTriple passed in as well as the
+/// Driver-specified default host triple. Sets the GccTriple to the triple
+/// actually used.
+static std::string findGCCBaseLibDir(const Driver &D, std::string &GccTriple) {
// FIXME: Using CXX_INCLUDE_ROOT is here is a bit of a hack, but
// avoids adding yet another option to configure/cmake.
// It would probably be cleaner to break it in two variables
@@ -1519,13 +1523,14 @@ static std::string findGCCBaseLibDir(const Driver &D,
bool Exists;
llvm::SmallVector<std::string, 8> Paths(D.PrefixDirs.begin(),
D.PrefixDirs.end());
- Paths.push_back("/usr/");
- const std::string *Triples[] = {&GccTriple, &D.DefaultHostTriple};
+ Paths.push_back(D.SysRoot + "/usr/");
+ const std::string Triples[] = {GccTriple, D.DefaultHostTriple};
for (llvm::SmallVector<std::string, 8>::const_iterator it = Paths.begin(),
ie = Paths.end(); it != ie; ++it) {
for (unsigned i = 0; i < sizeof(GccVersions)/sizeof(char*); ++i) {
for (unsigned j = 0; j < sizeof(Triples)/sizeof(Triples[0]); ++j) {
- std::string Suffix = *Triples[j] + "/" + GccVersions[i];
+ GccTriple = Triples[j];
+ std::string Suffix = Triples[j] + "/" + GccVersions[i];
std::string t1 = *it + "lib/gcc/" + Suffix;
if (!llvm::sys::fs::exists(t1 + "/crtbegin.o", Exists) && Exists)
return t1;
@@ -1546,6 +1551,7 @@ static std::string findGCCBaseLibDir(const Driver &D,
}
}
}
+ GccTriple.clear();
return "";
}
@@ -1710,7 +1716,7 @@ Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple)
// Add the non-multiplib suffixed paths (if potentially different).
if (!Base.empty() && !GccTriple.empty()) {
- if (!Suffix.empty())
+ if (!Suffix.empty() || !HasMultilib(Arch, Distro))
addPathIfExists(Base, Paths);
addPathIfExists(Base + "/../../../../" + GccTriple + "/lib", Paths);
addPathIfExists(Base + "/../../..", Paths);
diff --git a/clang/test/Driver/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0/crtbegin.o b/clang/test/Driver/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0/crtbegin.o
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/clang/test/Driver/Inputs/basic_linux_tree/usr/lib/gcc/i386-unknown-linux/4.6.0/crtbegin.o
diff --git a/clang/test/Driver/Inputs/basic_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0/crtbegin.o b/clang/test/Driver/Inputs/basic_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0/crtbegin.o
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/clang/test/Driver/Inputs/basic_linux_tree/usr/lib/gcc/x86_64-unknown-linux/4.6.0/crtbegin.o
diff --git a/clang/test/Driver/linux-ld.c b/clang/test/Driver/linux-ld.c
index 8896afc5e8c..63b10205773 100644
--- a/clang/test/Driver/linux-ld.c
+++ b/clang/test/Driver/linux-ld.c
@@ -2,15 +2,23 @@
// sysroot to make these tests independent of the host system.
//
// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
-// RUN: -ccc-host-triple i386-unkown-linux \
+// RUN: -ccc-host-triple i386-unknown-linux \
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
// RUN: | FileCheck --check-prefix=CHECK-LD-32 %s
// CHECK-LD-32: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
-// CHECK-LD-32: {{.*}} "-L[[SYSROOT]]/lib" "-L[[SYSROOT]]/usr/lib"
+// CHECK-LD-32: "[[SYSROOT]]/usr/lib/gcc/i386-unknown-linux/4.6.0/crtbegin.o"
+// CHECK-LD-32: "-L[[SYSROOT]]/usr/lib/gcc/i386-unknown-linux/4.6.0"
+// CHECK-LD-32: "-L[[SYSROOT]]/usr/lib/gcc/i386-unknown-linux/4.6.0/../../.."
+// CHECK-LD-32: "-L[[SYSROOT]]/lib"
+// CHECK-LD-32: "-L[[SYSROOT]]/usr/lib"
//
// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \
// RUN: -ccc-host-triple x86_64-unknown-linux \
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
// RUN: | FileCheck --check-prefix=CHECK-LD-64 %s
// CHECK-LD-64: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]"
-// CHECK-LD-64: {{.*}} "-L[[SYSROOT]]/lib" "-L[[SYSROOT]]/usr/lib"
+// CHECK-LD-64: "[[SYSROOT]]/usr/lib/gcc/x86_64-unknown-linux/4.6.0/crtbegin.o"
+// CHECK-LD-64: "-L[[SYSROOT]]/usr/lib/gcc/x86_64-unknown-linux/4.6.0"
+// CHECK-LD-64: "-L[[SYSROOT]]/usr/lib/gcc/x86_64-unknown-linux/4.6.0/../../.."
+// CHECK-LD-64: "-L[[SYSROOT]]/lib"
+// CHECK-LD-64: "-L[[SYSROOT]]/usr/lib"
OpenPOWER on IntegriCloud