Index: clang/include/clang/Driver/Distro.h =================================================================== --- clang/include/clang/Driver/Distro.h +++ clang/include/clang/Driver/Distro.h @@ -134,6 +134,8 @@ bool IsGentoo() const { return DistroVal == Gentoo; } + bool IsArchLinux() const { return DistroVal == ArchLinux; } + /// @} }; Index: clang/lib/Driver/Distro.cpp =================================================================== --- clang/lib/Driver/Distro.cpp +++ clang/lib/Driver/Distro.cpp @@ -205,9 +205,16 @@ static Distro::DistroType GetDistro(llvm::vfs::FileSystem &VFS, const llvm::Triple &TargetOrHost) { + + // Sometimes the OS can't be detected from the triplet due to ambiguity, for + // eg. ArchLinux uses aarch64-linux-gnu which results in Uknonwn OS & distro, + // so normalize the triplet which results in aarch64-unknown-linux-gnu, such + // that the Linux OS and distro are properly detected in this cases. + llvm::Triple NormTargetOrHost = llvm::Triple(Twine(TargetOrHost.normalize())); + // If we don't target Linux, no need to check the distro. This saves a few // OS calls. - if (!TargetOrHost.isOSLinux()) + if (!NormTargetOrHost.isOSLinux()) return Distro::UnknownDistro; // True if we're backed by a real file system. Index: clang/lib/Driver/ToolChains/Linux.cpp =================================================================== --- clang/lib/Driver/ToolChains/Linux.cpp +++ clang/lib/Driver/ToolChains/Linux.cpp @@ -370,6 +370,16 @@ return std::string(); } + const Distro Distro(getDriver().getVFS(), getTriple()); + const StringRef InstallDir = GCCInstallation.getInstallPath(); + const StringRef TripleStr = GCCInstallation.getTriple().str(); + + if (Distro.IsArchLinux()) { + std::string Path = (InstallDir + "/../../../../" + TripleStr).str(); + if (getVFS().exists(Path)) + return Path; + } + if (!GCCInstallation.isValid() || !getTriple().isMIPS()) return std::string(); @@ -377,8 +387,6 @@ // and put it into different places. Here we try to check some known // variants. - const StringRef InstallDir = GCCInstallation.getInstallPath(); - const StringRef TripleStr = GCCInstallation.getTriple().str(); const Multilib &Multilib = GCCInstallation.getMultilib(); std::string Path =