From 8a5a13d24172fbc578bab55a10d1477749998527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Date: Fri, 2 Dec 2016 15:41:00 +0100 Subject: [PATCH] [Driver] Improve support for Gentoo arm*-hardfloat-*-*eabi triples Add support for the alternative arm*-hardfloat-* triples that are used by Gentoo to the GCC installation detector, in order to make it possible to link to gcc libraries while using the standard clang -target triples. Add tests based on armhf Gentoo environment. --- lib/Driver/ToolChains.cpp | 9 ++++++++ .../usr/armv7a-hardfloat-linux-gnueabi/lib/.keep | 0 .../gentoo_linux_gcc_armhf_tree/usr/include/.keep | 0 .../4.9.3/crtbegin.o | 0 .../4.9.3/include/g++-v4.9.3/.keep | 0 test/Driver/linux-ld.c | 26 ++++++++++++++++++++++ 6 files changed, 35 insertions(+) create mode 100644 test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/armv7a-hardfloat-linux-gnueabi/lib/.keep create mode 100644 test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/include/.keep create mode 100644 test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/crtbegin.o create mode 100644 test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/include/g++-v4.9.3/.keep diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index d03e0cbd8a..fb73628bf2 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -1557,7 +1557,10 @@ bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const { static const char *const ARMLibDirs[] = {"/lib"}; static const char *const ARMTriples[] = {"arm-linux-gnueabi", "arm-linux-androideabi"}; + // arm*-hardfloat-* triples are used by Gentoo static const char *const ARMHFTriples[] = {"arm-linux-gnueabihf", + "armv6j-hardfloat-linux-gnueabi", + "armv7a-hardfloat-linux-gnueabi", "armv7hl-redhat-linux-gnueabi"}; static const char *const ARMebLibDirs[] = {"/lib"}; static const char *const ARMebTriples[] = {"armeb-linux-gnueabi", @@ -1565,6 +1568,10 @@ bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const { static const char *const ARMebHFTriples[] = { "armeb-linux-gnueabihf", "armebv7hl-redhat-linux-gnueabi"}; + static const char *const ARMHFMuslTriples[] = { + "armv6j-hardfloat-linux-musleabi", + "armv7a-hardfloat-linux-musleabi"}; + static const char *const X86_64LibDirs[] = {"/lib64", "/lib"}; static const char *const X86_64Triples[] = { "x86_64-linux-gnu", "x86_64-unknown-linux-gnu", @@ -1664,6 +1671,8 @@ bool Generic_GCC::GCCInstallationDetector::getBiarchSibling(Multilib &M) const { LibDirs.append(begin(ARMLibDirs), end(ARMLibDirs)); if (TargetTriple.getEnvironment() == llvm::Triple::GNUEABIHF) { TripleAliases.append(begin(ARMHFTriples), end(ARMHFTriples)); + } else if (TargetTriple.getEnvironment() == llvm::Triple::MuslEABIHF) { + TripleAliases.append(begin(ARMHFMuslTriples), end(ARMHFMuslTriples)); } else { TripleAliases.append(begin(ARMTriples), end(ARMTriples)); } diff --git a/test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/armv7a-hardfloat-linux-gnueabi/lib/.keep b/test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/armv7a-hardfloat-linux-gnueabi/lib/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/include/.keep b/test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/include/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/crtbegin.o b/test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/crtbegin.o new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/include/g++-v4.9.3/.keep b/test/Driver/Inputs/gentoo_linux_gcc_armhf_tree/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/include/g++-v4.9.3/.keep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/linux-ld.c b/test/Driver/linux-ld.c index 60b30dd543..dcd7afbf6a 100644 --- a/test/Driver/linux-ld.c +++ b/test/Driver/linux-ld.c @@ -1002,6 +1002,32 @@ // CHECK-DEBIAN-SPARC64: "[[SYSROOT]]/usr/lib/gcc/sparc64-linux-gnu/4.9{{/|\\\\}}crtend.o" // CHECK-DEBIAN-SPARC64: "[[SYSROOT]]/usr/lib/gcc/sparc64-linux-gnu/4.9/../../../sparc64-linux-gnu{{/|\\\\}}crtn.o" // +// Check Gentoo Linux with GCC installed using arm*-hardfloat-linux-gnu* triples. +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: --target=armv7a-hardfloat-linux-gnueabi --rtlib=platform \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/gentoo_linux_gcc_armhf_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-GENTOO-ARMHF %s +// CHECK-LD-GENTOO-ARMHF-NOT: warning: +// CHECK-LD-GENTOO-ARMHF: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-LD-GENTOO-ARMHF: "--eh-frame-hdr" +// CHECK-LD-GENTOO-ARMHF: "-m" "armelf_linux_eabi" +// CHECK-LD-GENTOO-ARMHF: "-dynamic-linker" "/lib/ld-linux-armhf.so.3" +// CHECK-LD-GENTOO-ARMHF: "{{.*}}/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/crtbegin.o" +// CHECK-LD-GENTOO-ARMHF: "-L[[SYSROOT]]/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3" +// CHECK-LD-GENTOO-ARMHF: "-L[[SYSROOT]]/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/../../../../armv7a-hardfloat-linux-gnueabi/lib" +// CHECK-LD-GENTOO-ARMHF: "-L[[SYSROOT]]/usr/lib/gcc/armv7a-hardfloat-linux-gnueabi/4.9.3/../../.." +// CHECK-LD-GENTOO-ARMHF: "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// CHECK-LD-GENTOO-ARMHF: "-lc" +// CHECK-LD-GENTOO-ARMHF: "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// +// Check whether the standard ARM triples can find Gentoo gcc. +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN: --target=armv7a-unknown-linux-gnueabihf --rtlib=platform \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/gentoo_linux_gcc_armhf_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-GENTOO-ARMHF %s +// // Test linker invocation on Android. // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: --target=arm-linux-androideabi -rtlib=platform \ -- 2.11.0