From d68a5a7817dc0d43853d8b84c9185dc24338664f Mon Sep 17 00:00:00 2001 From: Tom Stellard Date: Wed, 6 Oct 2021 05:32:44 +0000 Subject: [PATCH] Driver: Add a gcc equivalent triple to the list of triples to search There are some gcc triples, like x86_64-redhat-linux, that provide the same behavior as a clang triple with a similar name (e.g. x86_64-redhat-linux-gnu). When searching for a gcc install, also search for a gcc equivalent triple if one exists. Differential Revision: https://reviews.llvm.org/D111207 --- clang/lib/Driver/ToolChains/Gnu.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index fe5bda5c6605..fd4a7f72be14 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -1884,6 +1884,18 @@ static llvm::StringRef getGCCToolchainDir(const ArgList &Args, return GCC_INSTALL_PREFIX; } +/// This function takes a 'clang' triple and converts it to an equivalent gcc +/// triple. +static const char *ConvertToGccTriple(StringRef CandidateTriple) { + return llvm::StringSwitch(CandidateTriple) + .Case("aarch64-redhat-linux-gnu", "aarch64-redhat-linux") + .Case("i686-redhat-linux-gnu", "i686-redhat-linux") + .Case("ppc64le-redhat-linux-gnu", "ppc64le-redhat-linux") + .Case("s390x-redhat-linux-gnu", "s390x-redhat-linux") + .Case("x86_64-redhat-linux-gnu", "x86_64-redhat-linux") + .Default(NULL); +} + /// Initialize a GCCInstallationDetector from the driver. /// /// This performs all of the autodetection and sets up the various paths. @@ -1904,6 +1916,16 @@ void Generic_GCC::GCCInstallationDetector::init( // The compatible GCC triples for this particular architecture. SmallVector CandidateTripleAliases; SmallVector CandidateBiarchTripleAliases; + + // In some cases gcc uses a slightly different triple than clang for the + // same target. Convert the clang triple to the gcc equivalent and use that + // to search for the gcc install. + const char *ConvertedTriple = ConvertToGccTriple(TargetTriple.str()); + if (ConvertedTriple) { + CandidateTripleAliases.push_back(ConvertedTriple); + CandidateBiarchTripleAliases.push_back(ConvertedTriple); + } + CollectLibDirsAndTriples(TargetTriple, BiarchVariantTriple, CandidateLibDirs, CandidateTripleAliases, CandidateBiarchLibDirs, CandidateBiarchTripleAliases); -- 2.26.2