diff options
author | Yaron Keren <yaron.keren@gmail.com> | 2015-07-24 20:18:27 +0000 |
---|---|---|
committer | Yaron Keren <yaron.keren@gmail.com> | 2015-07-24 20:18:27 +0000 |
commit | e896939e541762e516b009f1ea9ff90326c6bcd8 (patch) | |
tree | abb8e060d07b65d1f8cb459a72e26590e6e2195e /clang/lib/Driver/MinGWToolChain.cpp | |
parent | 338aef0a078ac8369c00aeead0d1a9d86e410add (diff) | |
download | bcm5719-llvm-e896939e541762e516b009f1ea9ff90326c6bcd8.tar.gz bcm5719-llvm-e896939e541762e516b009f1ea9ff90326c6bcd8.zip |
Select the highest version of the mingw toolchain found using Generic_GCC::GCCVersion
similar to the way Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple works.
llvm-svn: 243153
Diffstat (limited to 'clang/lib/Driver/MinGWToolChain.cpp')
-rw-r--r-- | clang/lib/Driver/MinGWToolChain.cpp | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/clang/lib/Driver/MinGWToolChain.cpp b/clang/lib/Driver/MinGWToolChain.cpp index c4aac045564..6de2c50cfe7 100644 --- a/clang/lib/Driver/MinGWToolChain.cpp +++ b/clang/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; } } |