diff --git a/clang/include/clang/Driver/ToolChain.h b/clang/include/clang/Driver/ToolChain.h --- a/clang/include/clang/Driver/ToolChain.h +++ b/clang/include/clang/Driver/ToolChain.h @@ -88,6 +88,7 @@ class ToolChain { public: using path_list = SmallVector; + using prefix_list = SmallVector; enum CXXStdlibType { CST_Libcxx, @@ -133,6 +134,9 @@ /// The list of toolchain specific path prefixes to search for programs. path_list ProgramPaths; + /// The list of toolchain specific name prefixes to search for programs. + prefix_list ProgramPrefixes; + mutable std::unique_ptr Clang; mutable std::unique_ptr Flang; mutable std::unique_ptr Assemble; @@ -240,6 +244,9 @@ path_list &getProgramPaths() { return ProgramPaths; } const path_list &getProgramPaths() const { return ProgramPaths; } + prefix_list &getProgramPrefixes() { return ProgramPrefixes; } + const prefix_list &getProgramPrefixes() const { return ProgramPrefixes; } + const MultilibSet &getMultilibs() const { return Multilibs; } const Multilib &getMultilib() const { return SelectedMultilib; } diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -5,7 +5,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// - #include "clang/Driver/Driver.h" #include "InputInfo.h" #include "ToolChains/AIX.h" @@ -4684,12 +4683,10 @@ SmallVectorImpl &Names) const { // FIXME: Needs a better variable than TargetTriple Names.emplace_back((TargetTriple + "-" + Tool).str()); + for(std::string PPrefix : TC.getProgramPrefixes()) { + Names.emplace_back((PPrefix + Tool).str()); + } Names.emplace_back(Tool); - - // Allow the discovery of tools prefixed with LLVM's default target triple. - std::string DefaultTargetTriple = llvm::sys::getDefaultTargetTriple(); - if (DefaultTargetTriple != TargetTriple) - Names.emplace_back((DefaultTargetTriple + "-" + Tool).str()); } static bool ScanDirForExecutable(SmallString<128> &Dir, diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -5,7 +5,6 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// - #include "Gnu.h" #include "Arch/ARM.h" #include "Arch/Mips.h" @@ -2576,6 +2575,8 @@ getProgramPaths().push_back(getDriver().getInstalledDir()); if (getDriver().getInstalledDir() != getDriver().Dir) getProgramPaths().push_back(getDriver().Dir); + getProgramPrefixes().push_back(Twine(GCCInstallation.getTriple().str() + "-").str()); + } Generic_GCC::~Generic_GCC() {} diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -234,10 +234,12 @@ // used to target i386. // FIXME: This seems unlikely to be Linux-specific. ToolChain::path_list &PPaths = getProgramPaths(); + ToolChain::prefix_list &PPrefixes = getProgramPrefixes(); if (GCCInstallation.isValid()) { PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" + GCCInstallation.getTriple().str() + "/bin") .str()); + PPrefixes.push_back(Twine(GCCInstallation.getTriple().str() + "-").str()); } Distro Distro(D.getVFS(), Triple); diff --git a/clang/test/Driver/android-triple-version.c b/clang/test/Driver/android-triple-version.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/android-triple-version.c @@ -0,0 +1,172 @@ +// Android's target triples can contain a version number in the environment +// field (e.g. arm-linux-androideabi9). +// Make sure that any version is stripped when finding toolchain binaries. + +// Ensure no execute permissions on .../bin/{target-triple}/ld. +// RUN: chmod -x %S/Inputs/basic_android_ndk_tree/arm-linux-androideabi/bin/ld +// RUN: chmod -x %S/Inputs/basic_android_ndk_tree/aarch64-linux-android/bin/ld +// RUN: chmod -x %S/Inputs/basic_android_ndk_tree/i686-linux-android/bin/ld +// RUN: chmod -x %S/Inputs/basic_android_ndk_tree/mipsel-linux-android/bin/ld + +// Ensure execute permissions on .../bin/{target-triple}-ld +// RUN: chmod +x %S/Inputs/basic_android_ndk_tree/bin/arm-linux-androideabi-ld +// RUN: chmod +x %S/Inputs/basic_android_ndk_tree/bin/aarch64-linux-android-ld +// RUN: chmod +x %S/Inputs/basic_android_ndk_tree/bin/i686-linux-android-ld +// RUN: chmod +x %S/Inputs/basic_android_ndk_tree/bin/mipsel-linux-android-ld + +// Link clang into the mock NDK. +// RUN: rm -f %S/Inputs/basic_android_ndk_tree/bin/clang +// RUN: ln -s %clang %S/Inputs/basic_android_ndk_tree/bin/clang + +// Test target arm-linux-androideabi +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target arm-linux-androideabi %s |& \ +// RUN: grep arm-linux-androideabi-ld + +// Test target arm-unknown-linux-androideabi +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target arm-unknown-linux-androideabi %s |& \ +// RUN: grep arm-linux-androideabi-ld + +// Test target arm-linux-androideabi14 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target arm-linux-androideabi14 %s |& \ +// RUN: grep arm-linux-androideabi-ld + +// Test target arm-linux-androideabi29 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target arm-linux-androideabi29 %s |& \ +// RUN: grep arm-linux-androideabi-ld + +// Test target arm-unknown-linux-androideabi14 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target arm-unknown-linux-androideabi14 %s |& \ +// RUN: grep arm-linux-androideabi-ld + +// Test target arm-unknown-linux-androideabi29 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target arm-unknown-linux-androideabi29 %s |& \ +// RUN: grep arm-linux-androideabi-ld + +// Test target aarch64-linux-android +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target aarch64-linux-android %s |& \ +// RUN: grep aarch64-linux-android-ld + +// Test target aarch64-unknown-linux-android +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target aarch64-unknown-linux-android %s |& \ +// RUN: grep aarch64-linux-android-ld + +// Test target aarch64-linux-android14 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target aarch64-linux-android14 %s |& \ +// RUN: grep aarch64-linux-android-ld + +// Test target aarch64-linux-android29 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target aarch64-linux-android29 %s |& \ +// RUN: grep aarch64-linux-android-ld + +// Test target aarch64-unknown-linux-android14 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target aarch64-unknown-linux-android14 %s |& \ +// RUN: grep aarch64-linux-android-ld + +// Test target aarch64-unknown-linux-android29 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target aarch64-unknown-linux-android29 %s |& \ +// RUN: grep aarch64-linux-android-ld + +// Test target i686-linux-android +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target i686-linux-android %s |& \ +// RUN: grep i686-linux-android-ld + +// Test target i686-unknown-linux-android +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target i686-unknown-linux-android %s |& \ +// RUN: grep i686-linux-android-ld + +// Test target i686-linux-android14 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target i686-linux-android14 %s |& \ +// RUN: grep i686-linux-android-ld + +// Test target i686-linux-android29 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target i686-linux-android29 %s |& \ +// RUN: grep i686-linux-android-ld + +// Test target i686-unknown-linux-android14 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target i686-unknown-linux-android14 %s |& \ +// RUN: grep i686-linux-android-ld + +// Test target i686-unknown-linux-android29 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target i686-unknown-linux-android29 %s |& \ +// RUN: grep i686-linux-android-ld + +// Test target mipsel-linux-android +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target mipsel-linux-android %s |& \ +// RUN: grep mipsel-linux-android-ld + +// Test target mipsel-unknown-linux-android +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target mipsel-unknown-linux-android %s |& \ +// RUN: grep mipsel-linux-android-ld + +// Test target mipsel-linux-android14 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target mipsel-linux-android14 %s |& \ +// RUN: grep mipsel-linux-android-ld + +// Test target mipsel-linux-android29 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target mipsel-linux-android29 %s |& \ +// RUN: grep mipsel-linux-android-ld + +// Test target mipsel-unknown-linux-android14 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target mipsel-unknown-linux-android14 %s |& \ +// RUN: grep mipsel-linux-android-ld + +// Test target mipsel-unknown-linux-android29 +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %S/Inputs/basic_android_ndk_tree/bin/clang \ +// RUN: -### -target mipsel-unknown-linux-android29 %s |& \ +// RUN: grep mipsel-linux-android-ld + +// Ensure no execute permissions on .../bin/{target-triple}-ld +// RUN: chmod -x %S/Inputs/basic_android_ndk_tree/bin/arm-linux-androideabi-ld +// RUN: chmod -x %S/Inputs/basic_android_ndk_tree/bin/aarch64-linux-android-ld +// RUN: chmod -x %S/Inputs/basic_android_ndk_tree/bin/i686-linux-android-ld +// RUN: chmod -x %S/Inputs/basic_android_ndk_tree/bin/mipsel-linux-android-ld + +// Unlink clang from the mock NDK. +// RUN: rm -f %S/Inputs/basic_android_ndk_tree/bin/clang \ No newline at end of file