brianpl updated this revision to Diff 237691.
brianpl added a comment.

- Search for tools prefixed with GNU target triples.
- Merge branch 'master' of https://github.com/llvm/llvm-project


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D71848/new/

https://reviews.llvm.org/D71848

Files:
  clang/include/clang/Driver/ToolChain.h
  clang/lib/Driver/Driver.cpp
  clang/lib/Driver/ToolChains/Gnu.cpp
  clang/lib/Driver/ToolChains/Linux.cpp
  clang/test/Driver/android-triple-version.c

Index: clang/test/Driver/android-triple-version.c
===================================================================
--- /dev/null
+++ 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
Index: clang/lib/Driver/ToolChains/Linux.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Linux.cpp
+++ 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);
Index: clang/lib/Driver/ToolChains/Gnu.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Gnu.cpp
+++ 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() {}
Index: clang/lib/Driver/Driver.cpp
===================================================================
--- clang/lib/Driver/Driver.cpp
+++ 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<std::string> &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,
Index: clang/include/clang/Driver/ToolChain.h
===================================================================
--- clang/include/clang/Driver/ToolChain.h
+++ clang/include/clang/Driver/ToolChain.h
@@ -88,6 +88,7 @@
 class ToolChain {
 public:
   using path_list = SmallVector<std::string, 16>;
+  using prefix_list = SmallVector<std::string, 16>;
 
   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<Tool> Clang;
   mutable std::unique_ptr<Tool> Flang;
   mutable std::unique_ptr<Tool> 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; }
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to