From 6f8442bdd8703b934b1b8bd89c28e56b37143327 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Mon, 23 May 2016 02:17:28 +0000 Subject: [PATCH] Driver: support exherbo's multiarch support Exherbo has an alternative file system layout to accommodate multiarch. The loader is located at /usr/${triple}/lib/${loader}. Adjust the Linux toolchain to support that on exherbo. llvm-svn: 270392 --- clang/lib/Driver/ToolChains.cpp | 85 +++++++++++++++++++++++---------- clang/test/Driver/dyld-prefix.c | 6 +-- clang/test/Driver/linux-ld.c | 40 ++++++++-------- 3 files changed, 82 insertions(+), 49 deletions(-) diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp index 79290219c7ff..2f1420e943f9 100644 --- a/clang/lib/Driver/ToolChains.cpp +++ b/clang/lib/Driver/ToolChains.cpp @@ -4037,69 +4037,102 @@ std::string Linux::getDynamicLinker(const ArgList &Args) const { const llvm::Triple::ArchType Arch = getArch(); const llvm::Triple &Triple = getTriple(); + const enum Distro Distro = DetectDistro(getDriver(), Arch); + if (Triple.isAndroid()) return Triple.isArch64Bit() ? "/system/bin/linker64" : "/system/bin/linker"; + std::string LibDir; + std::string Loader; + switch (Arch) { - default: llvm_unreachable("unsupported architecture"); + default: + llvm_unreachable("unsupported architecture"); case llvm::Triple::aarch64: - return "/lib/ld-linux-aarch64.so.1"; + LibDir = "lib"; + Loader = "ld-linux-aarch64.so.1"; + break; case llvm::Triple::aarch64_be: - return "/lib/ld-linux-aarch64_be.so.1"; + LibDir = "lib"; + Loader = "ld-linux-aarch64_be.so.1"; + break; case llvm::Triple::arm: case llvm::Triple::thumb: case llvm::Triple::armeb: case llvm::Triple::thumbeb: { - const bool IsHardFloat = + const bool HF = Triple.getEnvironment() == llvm::Triple::GNUEABIHF || tools::arm::getARMFloatABI(*this, Args) == tools::arm::FloatABI::Hard; - return IsHardFloat ? "/lib/ld-linux-armhf.so.3" : "/lib/ld-linux.so.3"; + LibDir = "lib"; + Loader = HF ? "ld-linux-armhf.so.3" : "ld-linux.so.3"; + break; } case llvm::Triple::mips: case llvm::Triple::mipsel: case llvm::Triple::mips64: case llvm::Triple::mips64el: { - bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple); bool LE = (Triple.getArch() == llvm::Triple::mipsel) || (Triple.getArch() == llvm::Triple::mips64el); + bool IsNaN2008 = tools::mips::isNaN2008(Args, Triple); + + LibDir = "lib" + tools::mips::getMipsABILibSuffix(Args, Triple); - std::string LibDir = - "/lib" + tools::mips::getMipsABILibSuffix(Args, Triple); - StringRef LibName; if (tools::mips::isUCLibc(Args)) - LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0"; + Loader = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0"; else if (!Triple.hasEnvironment() && Triple.getVendor() == llvm::Triple::VendorType::MipsTechnologies) - LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1"; + Loader = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1"; else - LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1"; + Loader = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1"; - return (LibDir + "/" + LibName).str(); + break; } case llvm::Triple::ppc: - return "/lib/ld.so.1"; + LibDir = "lib"; + Loader = "ld.so.1"; + break; case llvm::Triple::ppc64: - return (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "/lib64/ld64.so.2" - : "/lib64/ld64.so.1"; + LibDir = "lib64"; + Loader = + (tools::ppc::hasPPCAbiArg(Args, "elfv2")) ? "ld64.so.2" : "ld64.so.1"; + break; case llvm::Triple::ppc64le: - return (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "/lib64/ld64.so.1" - : "/lib64/ld64.so.2"; + LibDir = "lib64"; + Loader = + (tools::ppc::hasPPCAbiArg(Args, "elfv1")) ? "ld64.so.1" : "ld64.so.2"; + break; case llvm::Triple::sparc: case llvm::Triple::sparcel: - return "/lib/ld-linux.so.2"; + LibDir = "lib"; + Loader = "ld-linux.so.2"; + break; case llvm::Triple::sparcv9: - return "/lib64/ld-linux.so.2"; + LibDir = "lib64"; + Loader = "ld-linux.so.2"; + break; case llvm::Triple::systemz: - return "/lib/ld64.so.1"; + LibDir = "lib"; + Loader = "ld64.so.1"; + break; case llvm::Triple::x86: - return "/lib/ld-linux.so.2"; - case llvm::Triple::x86_64: - return (Triple.getEnvironment() == llvm::Triple::GNUX32) - ? "/libx32/ld-linux-x32.so.2" - : "/lib64/ld-linux-x86-64.so.2"; + LibDir = "lib"; + Loader = "ld-linux.so.2"; + break; + case llvm::Triple::x86_64: { + bool X32 = Triple.getEnvironment() == llvm::Triple::GNUX32; + + LibDir = X32 ? "libx32" : "lib64"; + Loader = X32 ? "ld-linux-x32.so.2" : "ld-linux-x86-64.so.2"; + break; } + } + + if (Distro == Exherbo && (Triple.getVendor() == llvm::Triple::UnknownVendor || + Triple.getVendor() == llvm::Triple::PC)) + return "/usr/" + Triple.str() + "/lib/" + Loader; + return "/" + LibDir + "/" + Loader; } void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs, diff --git a/clang/test/Driver/dyld-prefix.c b/clang/test/Driver/dyld-prefix.c index 2c2bc4ff88ea..5a79874b5674 100644 --- a/clang/test/Driver/dyld-prefix.c +++ b/clang/test/Driver/dyld-prefix.c @@ -1,10 +1,10 @@ // RUN: touch %t.o // RUN: %clang -target i386-unknown-linux --dyld-prefix /foo -### %t.o 2>&1 | FileCheck --check-prefix=CHECK-32 %s -// CHECK-32: "-dynamic-linker" "/foo/lib/ld-linux.so.2" +// CHECK-32: "-dynamic-linker" "/foo{{(/usr/i386-unknown-linux)?}}/lib/ld-linux.so.2" // RUN: %clang -target x86_64-unknown-linux --dyld-prefix /foo -### %t.o 2>&1 | FileCheck --check-prefix=CHECK-64 %s -// CHECK-64: "-dynamic-linker" "/foo/lib64/ld-linux-x86-64.so.2" +// CHECK-64: "-dynamic-linker" "/foo{{(/usr/x86_64-unknown-linux)?}}/lib{{(64)?}}/ld-linux-x86-64.so.2" // RUN: %clang -target x86_64-unknown-linux-gnux32 --dyld-prefix /foo -### %t.o 2>&1 | FileCheck --check-prefix=CHECK-X32 %s -// CHECK-X32: "-dynamic-linker" "/foo/libx32/ld-linux-x32.so.2" +// CHECK-X32: "-dynamic-linker" "/foo{{(/x86_64-unknown-linux-gnux32)?}}/lib{{(x32)?}}/ld-linux-x32.so.2" diff --git a/clang/test/Driver/linux-ld.c b/clang/test/Driver/linux-ld.c index 1c7a68161b30..3cc8bc663e07 100644 --- a/clang/test/Driver/linux-ld.c +++ b/clang/test/Driver/linux-ld.c @@ -474,7 +474,7 @@ // RUN: --sysroot=%S/Inputs/x86-64_ubuntu_13.10 \ // RUN: | FileCheck --check-prefix=CHECK-X86-64-UBUNTU-13-10-ARM-HF %s // CHECK-X86-64-UBUNTU-13-10-ARM-HF: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" -// CHECK-X86-64-UBUNTU-13-10-ARM-HF: "-dynamic-linker" "/lib/ld-linux-armhf.so.3" +// CHECK-X86-64-UBUNTU-13-10-ARM-HF: "-dynamic-linker" "{{(/usr/arm--linux-gnueabihf)?}}/lib/ld-linux-armhf.so.3" // CHECK-X86-64-UBUNTU-13-10-ARM-HF: "{{.*}}/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib{{/|\\\\}}crt1.o" // CHECK-X86-64-UBUNTU-13-10-ARM-HF: "{{.*}}/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8/../../../../arm-linux-gnueabihf/lib/../lib{{/|\\\\}}crti.o" // CHECK-X86-64-UBUNTU-13-10-ARM-HF: "{{.*}}/usr/lib/gcc-cross/arm-linux-gnueabihf/4.8{{/|\\\\}}crtbegin.o" @@ -493,7 +493,7 @@ // RUN: --sysroot=%S/Inputs/x86-64_ubuntu_13.10 \ // RUN: | FileCheck --check-prefix=CHECK-X86-64-UBUNTU-13-10-ARM %s // CHECK-X86-64-UBUNTU-13-10-ARM: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" -// CHECK-X86-64-UBUNTU-13-10-ARM: "-dynamic-linker" "/lib/ld-linux.so.3" +// CHECK-X86-64-UBUNTU-13-10-ARM: "-dynamic-linker" "{{(/usr/arm--linux-gnueabi)?}}/lib/ld-linux.so.3" // CHECK-X86-64-UBUNTU-13-10-ARM: "{{.*}}/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/lib/../lib{{/|\\\\}}crt1.o" // CHECK-X86-64-UBUNTU-13-10-ARM: "{{.*}}/usr/lib/gcc-cross/arm-linux-gnueabi/4.7/../../../../arm-linux-gnueabi/lib/../lib{{/|\\\\}}crti.o" // CHECK-X86-64-UBUNTU-13-10-ARM: "{{.*}}/usr/lib/gcc-cross/arm-linux-gnueabi/4.7{{/|\\\\}}crtbegin.o" @@ -636,7 +636,7 @@ // RUN: | FileCheck --check-prefix=CHECK-PPC64 %s // CHECK-PPC64: "{{.*}}ld{{(.exe)?}}" // CHECK-PPC64: "-m" "elf64ppc" -// CHECK-PPC64: "-dynamic-linker" "{{.*}}/lib64/ld64.so.1" +// CHECK-PPC64: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld64.so.1" // // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=powerpc64-linux-gnu -mabi=elfv1 \ @@ -646,35 +646,35 @@ // RUN: | FileCheck --check-prefix=CHECK-PPC64-ELFv1 %s // CHECK-PPC64-ELFv1: "{{.*}}ld{{(.exe)?}}" // CHECK-PPC64-ELFv1: "-m" "elf64ppc" -// CHECK-PPC64-ELFv1: "-dynamic-linker" "{{.*}}/lib64/ld64.so.1" +// CHECK-PPC64-ELFv1: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld64.so.1" // // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=powerpc64-linux-gnu -mabi=elfv2 \ // RUN: | FileCheck --check-prefix=CHECK-PPC64-ELFv2 %s // CHECK-PPC64-ELFv2: "{{.*}}ld{{(.exe)?}}" // CHECK-PPC64-ELFv2: "-m" "elf64ppc" -// CHECK-PPC64-ELFv2: "-dynamic-linker" "{{.*}}/lib64/ld64.so.2" +// CHECK-PPC64-ELFv2: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld64.so.2" // // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=powerpc64le-linux-gnu \ // RUN: | FileCheck --check-prefix=CHECK-PPC64LE %s // CHECK-PPC64LE: "{{.*}}ld{{(.exe)?}}" // CHECK-PPC64LE: "-m" "elf64lppc" -// CHECK-PPC64LE: "-dynamic-linker" "{{.*}}/lib64/ld64.so.2" +// CHECK-PPC64LE: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld64.so.2" // // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=powerpc64le-linux-gnu -mabi=elfv1 \ // RUN: | FileCheck --check-prefix=CHECK-PPC64LE-ELFv1 %s // CHECK-PPC64LE-ELFv1: "{{.*}}ld{{(.exe)?}}" // CHECK-PPC64LE-ELFv1: "-m" "elf64lppc" -// CHECK-PPC64LE-ELFv1: "-dynamic-linker" "{{.*}}/lib64/ld64.so.1" +// CHECK-PPC64LE-ELFv1: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld64.so.1" // // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=powerpc64le-linux-gnu -mabi=elfv2 \ // RUN: | FileCheck --check-prefix=CHECK-PPC64LE-ELFv2 %s // CHECK-PPC64LE-ELFv2: "{{.*}}ld{{(.exe)?}}" // CHECK-PPC64LE-ELFv2: "-m" "elf64lppc" -// CHECK-PPC64LE-ELFv2: "-dynamic-linker" "{{.*}}/lib64/ld64.so.2" +// CHECK-PPC64LE-ELFv2: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld64.so.2" // // Check that we do not pass --hash-style=gnu and --hash-style=both to linker // and provide correct path to the dynamic linker and emulation mode when build @@ -714,7 +714,7 @@ // RUN: | FileCheck --check-prefix=CHECK-MIPS64 %s // CHECK-MIPS64: "{{.*}}ld{{(.exe)?}}" // CHECK-MIPS64: "-m" "elf64btsmip" -// CHECK-MIPS64: "-dynamic-linker" "{{.*}}/lib64/ld.so.1" +// CHECK-MIPS64: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld.so.1" // CHECK-MIPS64-NOT: "--hash-style={{gnu|both}}" // // RUN: %clang %s -### -o %t.o 2>&1 \ @@ -722,21 +722,21 @@ // RUN: | FileCheck --check-prefix=CHECK-MIPS64EL %s // CHECK-MIPS64EL: "{{.*}}ld{{(.exe)?}}" // CHECK-MIPS64EL: "-m" "elf64ltsmip" -// CHECK-MIPS64EL: "-dynamic-linker" "{{.*}}/lib64/ld.so.1" +// CHECK-MIPS64EL: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld.so.1" // CHECK-MIPS64EL-NOT: "--hash-style={{gnu|both}}" // // RUN: %clang %s -### -o %t.o 2>&1 --target=mips64el-linux-gnu -mnan=2008 \ // RUN: | FileCheck --check-prefix=CHECK-MIPS64EL-NAN2008 %s // CHECK-MIPS64EL-NAN2008: "{{.*}}ld{{(.exe)?}}" // CHECK-MIPS64EL-NAN2008: "-m" "elf64ltsmip" -// CHECK-MIPS64EL-NAN2008: "-dynamic-linker" "{{.*}}/lib64/ld-linux-mipsn8.so.1" +// CHECK-MIPS64EL-NAN2008: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld-linux-mipsn8.so.1" // CHECK-MIPS64EL-NAN2008-NOT: "--hash-style={{gnu|both}}" // // RUN: %clang %s -### -o %t.o 2>&1 --target=mips64el-linux-gnu -mcpu=mips64r6 \ // RUN: | FileCheck --check-prefix=CHECK-MIPS64R6EL %s // CHECK-MIPS64R6EL: "{{.*}}ld{{(.exe)?}}" // CHECK-MIPS64R6EL: "-m" "elf64ltsmip" -// CHECK-MIPS64R6EL: "-dynamic-linker" "{{.*}}/lib64/ld-linux-mipsn8.so.1" +// CHECK-MIPS64R6EL: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld-linux-mipsn8.so.1" // CHECK-MIPS64R6EL-NOT: "--hash-style={{gnu|both}}" // // RUN: %clang %s -### -o %t.o 2>&1 \ @@ -744,7 +744,7 @@ // RUN: | FileCheck --check-prefix=CHECK-MIPS64-N32 %s // CHECK-MIPS64-N32: "{{.*}}ld{{(.exe)?}}" // CHECK-MIPS64-N32: "-m" "elf32btsmipn32" -// CHECK-MIPS64-N32: "-dynamic-linker" "{{.*}}/lib32/ld.so.1" +// CHECK-MIPS64-N32: "-dynamic-linker" "{{.*}}/lib{{(32)?}}/ld.so.1" // CHECK-MIPS64-N32-NOT: "--hash-style={{gnu|both}}" // // RUN: %clang %s -### -o %t.o 2>&1 \ @@ -752,22 +752,22 @@ // RUN: | FileCheck --check-prefix=CHECK-MIPS64EL-N32 %s // CHECK-MIPS64EL-N32: "{{.*}}ld{{(.exe)?}}" // CHECK-MIPS64EL-N32: "-m" "elf32ltsmipn32" -// CHECK-MIPS64EL-N32: "-dynamic-linker" "{{.*}}/lib32/ld.so.1" +// CHECK-MIPS64EL-N32: "-dynamic-linker" "{{.*}}/lib{{(32)?}}/ld.so.1" // CHECK-MIPS64EL-N32-NOT: "--hash-style={{gnu|both}}" // // RUN: %clang %s -### -o %t.o 2>&1 --target=mips64el-linux-gnu -mabi=n32 \ // RUN: -mnan=2008 | FileCheck --check-prefix=CHECK-MIPS64EL-N32-NAN2008 %s // CHECK-MIPS64EL-N32-NAN2008: "{{.*}}ld{{(.exe)?}}" // CHECK-MIPS64EL-N32-NAN2008: "-m" "elf32ltsmipn32" -// CHECK-MIPS64EL-N32-NAN2008: "-dynamic-linker" "{{.*}}/lib32/ld-linux-mipsn8.so.1" +// CHECK-MIPS64EL-N32-NAN2008: "-dynamic-linker" "{{.*}}/lib{{(32)?}}/ld-linux-mipsn8.so.1" // CHECK-MIPS64EL-N32-NAN2008-NOT: "--hash-style={{gnu|both}}" // // RUN: %clang %s -### -o %t.o 2>&1 --target=mips64el-redhat-linux \ // RUN: | FileCheck --check-prefix=CHECK-MIPS64EL-REDHAT %s // CHECK-MIPS64EL-REDHAT: "{{.*}}ld{{(.exe)?}}" // CHECK-MIPS64EL-REDHAT: "-m" "elf64ltsmip" -// CHECK-MIPS64EL-REDHAT: "-dynamic-linker" "{{.*}}/lib64/ld.so.1" -// CHECK-MIPS64EL-REDHAT-NOT: "-dynamic-linker" "{{.*}}/lib64/ld-musl-mipsel.so.1" +// CHECK-MIPS64EL-REDHAT: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld.so.1" +// CHECK-MIPS64EL-REDHAT-NOT: "-dynamic-linker" "{{.*}}/lib{{(64)?}}/ld-musl-mipsel.so.1" // CHECK-MIPS64EL-REDHAT-NOT: "--hash-style={{gnu|both}}" // // RUN: %clang %s -### -o %t.o 2>&1 \ @@ -775,21 +775,21 @@ // RUN: | FileCheck --check-prefix=CHECK-SPARCV8 %s // CHECK-SPARCV8: "{{.*}}ld{{(.exe)?}}" // CHECK-SPARCV8: "-m" "elf32_sparc" -// CHECK-SPARCV8: "-dynamic-linker" "/lib/ld-linux.so.2" +// CHECK-SPARCV8: "-dynamic-linker" "{{(/usr/sparc-unknown-linux-gnu)?}}/lib/ld-linux.so.2" // // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=sparcel-unknown-linux-gnu \ // RUN: | FileCheck --check-prefix=CHECK-SPARCV8EL %s // CHECK-SPARCV8EL: "{{.*}}ld{{(.exe)?}}" // CHECK-SPARCV8EL: "-m" "elf32_sparc" -// CHECK-SPARCV8EL: "-dynamic-linker" "/lib/ld-linux.so.2" +// CHECK-SPARCV8EL: "-dynamic-linker" "{{(/usr/sparcel-unknown-linux-gnu)?}}/lib/ld-linux.so.2" // // RUN: %clang %s -### -o %t.o 2>&1 \ // RUN: --target=sparcv9-unknown-linux-gnu \ // RUN: | FileCheck --check-prefix=CHECK-SPARCV9 %s // CHECK-SPARCV9: "{{.*}}ld{{(.exe)?}}" // CHECK-SPARCV9: "-m" "elf64_sparc" -// CHECK-SPARCV9: "-dynamic-linker" "/lib64/ld-linux.so.2" +// CHECK-SPARCV9: "-dynamic-linker" "{{(/usr/sparcv9-unknown-linux-gnu)?}}/lib{{(64)?}}/ld-linux.so.2" // // Thoroughly exercise the Debian multiarch environment. // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \