summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/MinGWToolChain.cpp
diff options
context:
space:
mode:
authorYaron Keren <yaron.keren@gmail.com>2015-07-24 20:18:27 +0000
committerYaron Keren <yaron.keren@gmail.com>2015-07-24 20:18:27 +0000
commite896939e541762e516b009f1ea9ff90326c6bcd8 (patch)
treeabb8e060d07b65d1f8cb459a72e26590e6e2195e /clang/lib/Driver/MinGWToolChain.cpp
parent338aef0a078ac8369c00aeead0d1a9d86e410add (diff)
downloadbcm5719-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.cpp30
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;
}
}
OpenPOWER on IntegriCloud