From: Yaron Keren Date: Fri, 24 Jul 2015 20:18:27 +0000 (+0000) Subject: Select the highest version of the mingw toolchain found using Generic_GCC::GCCVersion X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=106ce7f150f6a2b730a4e03deef1877d34c82b37;p=clang Select the highest version of the mingw toolchain found using Generic_GCC::GCCVersion similar to the way Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple works. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243153 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/MinGWToolChain.cpp b/lib/Driver/MinGWToolChain.cpp index c4aac04556..6de2c50cfe 100644 --- a/lib/Driver/MinGWToolChain.cpp +++ b/lib/Driver/MinGWToolChain.cpp @@ -21,18 +21,24 @@ using namespace clang; using namespace llvm::opt; namespace { +// Simplified from Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple. bool findGccVersion(StringRef LibDir, std::string &GccLibDir, std::string &Ver) { + Generic_GCC::GCCVersion Version = Generic_GCC::GCCVersion::Parse("0.0.0"); std::error_code EC; - llvm::sys::fs::directory_iterator Entry(LibDir, EC); - while (!EC) { - GccLibDir = Entry->path(); - Ver = llvm::sys::path::filename(GccLibDir); - if (Ver.size() && isdigit(Ver[0])) - return true; - Entry.increment(EC); + for (llvm::sys::fs::directory_iterator LI(LibDir, EC), LE; !EC && LI != LE; + LI = LI.increment(EC)) { + StringRef VersionText = llvm::sys::path::filename(LI->path()); + Generic_GCC::GCCVersion CandidateVersion = + Generic_GCC::GCCVersion::Parse(VersionText); + if (CandidateVersion.Major == -1) + continue; + if (CandidateVersion <= Version) + continue; + Ver = VersionText; + GccLibDir = LI->path(); } - return false; + return Ver.size(); } } @@ -44,12 +50,12 @@ void MinGW::findGccLibDir() { Arch = "unknown"; // lib: Arch Linux, Ubuntu, Windows // lib64: openSUSE Linux - for (StringRef Lib : {"lib", "lib64"}) { - for (StringRef MaybeArch : Archs) { + for (StringRef CandidateLib : {"lib", "lib64"}) { + for (StringRef CandidateArch : Archs) { llvm::SmallString<1024> LibDir(Base); - llvm::sys::path::append(LibDir, Lib, "gcc", MaybeArch); + llvm::sys::path::append(LibDir, CandidateLib, "gcc", CandidateArch); if (findGccVersion(LibDir, GccLibDir, Ver)) { - Arch = MaybeArch; + Arch = CandidateArch; return; } } diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index 2d1e7897ab..8e6267428c 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -29,7 +29,7 @@ namespace toolchains { /// all subcommands; this relies on gcc translating the majority of /// command line options. class LLVM_LIBRARY_VISIBILITY Generic_GCC : public ToolChain { -protected: +public: /// \brief Struct to store and manipulate GCC versions. /// /// We rely on assumptions about the form and structure of GCC version @@ -147,6 +147,7 @@ protected: bool NeedsBiarchSuffix = false); }; +protected: GCCInstallationDetector GCCInstallation; public: