From fde8d14ea3061ff82e9dfddb23f17648c103eae6 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Mon, 3 Oct 2011 06:41:08 +0000 Subject: [PATCH] Add initial support for applying the sysroot to library search paths. This is still very much a WIP, but sysroot was completely broken before this so we are moving closer to correctness. The crux of this is that 'ld' (on Linux, the only place I'm touching here) doesn't apply the sysroot to any flags given to it. Instead, the driver must translate all the paths it adds to the link step with the system root. This is easily observed by building a GCC that supports sysroot, and checking its driver output. This patch just fixes the non-multilib library search paths. We should also use this in many other places, but first things first. This also allows us to make the Linux 'ld' test independent of the host system. This in turn will allow me to check in test tree configurations based on various different distro's configuration. Again, WIP. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140990 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/ToolChains.cpp | 11 ++++++----- test/Driver/Inputs/basic_linux_tree/lib/.keep | 0 .../Inputs/basic_linux_tree/usr/lib/.keep | 0 test/Driver/linux-ld.c | 17 ++++++++++++----- 4 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 test/Driver/Inputs/basic_linux_tree/lib/.keep create mode 100644 test/Driver/Inputs/basic_linux_tree/usr/lib/.keep diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 1b2ff2ecb7..dd35172402 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -1560,6 +1560,7 @@ Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple) : Generic_ELF(Host, Triple) { llvm::Triple::ArchType Arch = llvm::Triple(getDriver().DefaultHostTriple).getArch(); + const std::string &SysRoot = getDriver().SysRoot; bool Exists; std::string GccTriple = ""; @@ -1703,8 +1704,8 @@ Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple) Multilib, Paths); addPathIfExists(Base + "/../../../../" + Multilib, Paths); } - addPathIfExists("/lib/../" + Multilib, Paths); - addPathIfExists("/usr/lib/../" + Multilib, Paths); + addPathIfExists(SysRoot + "/lib/../" + Multilib, Paths); + addPathIfExists(SysRoot + "/usr/lib/../" + Multilib, Paths); } // Add the non-multiplib suffixed paths (if potentially different). @@ -1714,11 +1715,11 @@ Linux::Linux(const HostInfo &Host, const llvm::Triple &Triple) addPathIfExists(Base + "/../../../../" + GccTriple + "/lib", Paths); addPathIfExists(Base + "/../../..", Paths); } - addPathIfExists("/lib", Paths); - addPathIfExists("/usr/lib", Paths); + addPathIfExists(SysRoot + "/lib", Paths); + addPathIfExists(SysRoot + "/usr/lib", Paths); if (Arch == getArch() && IsUbuntu(Distro)) - Paths.push_back("/usr/lib/" + GccTriple); + Paths.push_back(SysRoot + "/usr/lib/" + GccTriple); } bool Linux::HasNativeLLVMSupport() const { diff --git a/test/Driver/Inputs/basic_linux_tree/lib/.keep b/test/Driver/Inputs/basic_linux_tree/lib/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/basic_linux_tree/usr/lib/.keep b/test/Driver/Inputs/basic_linux_tree/usr/lib/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c index 745b03c7a6..8896afc5e8 100644 --- a/test/Driver/linux-ld.c +++ b/test/Driver/linux-ld.c @@ -1,9 +1,16 @@ -// General tests that ld invocations on Linux targets sane. +// General tests that ld invocations on Linux targets sane. Note that we use +// sysroot to make these tests independent of the host system. // -// RUN: %clang -no-canonical-prefixes -ccc-host-triple i386-unknown-linux %s -### -o %t.o 2>&1 \ +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: -ccc-host-triple i386-unkown-linux \ +// RUN: --sysroot=%S/Inputs/basic_linux_tree \ // RUN: | FileCheck --check-prefix=CHECK-LD-32 %s -// CHECK-LD-32: "{{.*}}ld{{(.exe)?}}" {{.*}} "-L/lib" "-L/usr/lib" +// CHECK-LD-32: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-LD-32: {{.*}} "-L[[SYSROOT]]/lib" "-L[[SYSROOT]]/usr/lib" // -// RUN: %clang -no-canonical-prefixes -ccc-host-triple x86_64-unknown-linux %s -### -o %t.o 2>&1 \ +// 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)?}}" {{.*}} "-L/lib" "-L/usr/lib" +// CHECK-LD-64: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-LD-64: {{.*}} "-L[[SYSROOT]]/lib" "-L[[SYSROOT]]/usr/lib" -- 2.40.0