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 @@ -4690,6 +4690,24 @@ std::string DefaultTargetTriple = llvm::sys::getDefaultTargetTriple(); if (DefaultTargetTriple != TargetTriple) Names.emplace_back((DefaultTargetTriple + "-" + Tool).str()); + + // Allow discovery of the Android NDK toolchain triples. + llvm::Triple ToolchainTriple = TC.getTriple(); + if (ToolchainTriple.isAndroid()) { + std::string ArchName = ToolchainTriple.getArchName(); + std::string VendorName = ToolchainTriple.getVendorName(); + std::string OSName = ToolchainTriple.getOSName(); + std::string ToolName = Tool; + if (ArchName == "arm" && VendorName == "unknown") { + Names.emplace_back("arm-" + OSName + "-android-" + ToolName); + Names.emplace_back("arm-" + OSName + "-androideabi-" + ToolName); + } else if (VendorName == "unknown") { + Names.emplace_back(ArchName + "-" + OSName + "-android-" + ToolName); + } else { + Names.emplace_back(ArchName + "-" + VendorName + "-" + OSName + + "-android-" + ToolName); + } + } } static bool ScanDirForExecutable(SmallString<128> &Dir, 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,141 @@ +// 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 + +// Test target arm-linux-androideabi +// RUN: env "PATH=%S/Inputs/basic_android_ndk_tree/bin" \ +// RUN: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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: %clang -### -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