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 @@ -1884,6 +1884,18 @@ 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 @@ // 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);