--- a/clang-17.0.6.src/lib/Driver/ToolChains/Gnu.cpp 2023-10-31 14:00:30.000000000 +0600 +++ b/clang-17.0.6.src/lib/Driver/ToolChains/Gnu.cpp 2023-11-21 18:49:10.488706821 +0600 @@ -2061,6 +2061,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. @@ -2081,6 +2093,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);