summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/MinGWToolChain.cpp
diff options
context:
space:
mode:
authorYaron Keren <yaron.keren@gmail.com>2015-07-24 11:01:45 +0000
committerYaron Keren <yaron.keren@gmail.com>2015-07-24 11:01:45 +0000
commit8cb250ad9d9791b0c3823530c2d7ed6d033a9eaf (patch)
treef826775812a30b2b7000a344a6f483b538e6252d /clang/lib/Driver/MinGWToolChain.cpp
parent7340e1f8da2f1d037d4b978acc18bb9930cc1d0a (diff)
downloadbcm5719-llvm-8cb250ad9d9791b0c3823530c2d7ed6d033a9eaf.tar.gz
bcm5719-llvm-8cb250ad9d9791b0c3823530c2d7ed6d033a9eaf.zip
Apparently some of the bots add .svn dirs inside the test/Driver/Inputs
directory structure. Try to make mingw toolchain resilient to such surprises. llvm-svn: 243105
Diffstat (limited to 'clang/lib/Driver/MinGWToolChain.cpp')
-rw-r--r--clang/lib/Driver/MinGWToolChain.cpp50
1 files changed, 28 insertions, 22 deletions
diff --git a/clang/lib/Driver/MinGWToolChain.cpp b/clang/lib/Driver/MinGWToolChain.cpp
index a53c5c6a4b3..d68c8afdd78 100644
--- a/clang/lib/Driver/MinGWToolChain.cpp
+++ b/clang/lib/Driver/MinGWToolChain.cpp
@@ -20,28 +20,38 @@ using namespace clang::driver::toolchains;
using namespace clang;
using namespace llvm::opt;
+namespace {
+bool findGccVersion(StringRef LibDir, std::string &GccLibDir,
+ std::string &Ver) {
+ 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);
+ }
+ return false;
+}
+}
+
void MinGW::findGccLibDir() {
+ llvm::SmallVector<llvm::SmallString<32>, 2> Archs;
+ Archs.emplace_back(getTriple().getArchName());
+ Archs[0] += "-w64-mingw32";
+ Archs.emplace_back("mingw32");
+ Arch = "unknown";
// lib: Arch Linux, Ubuntu, Windows
// lib64: openSUSE Linux
- llvm::SmallString<1024> LibDir;
for (StringRef Lib : {"lib", "lib64"}) {
- LibDir = Base;
- llvm::sys::path::append(LibDir, Lib, "gcc");
- LibDir += llvm::sys::path::get_separator();
- std::error_code EC;
- // First look for mingw-w64.
- llvm::sys::fs::directory_iterator MingW64Entry(LibDir + Arch, EC);
- if (!EC) {
- GccLibDir = MingW64Entry->path();
- break;
- }
- // If mingw-w64 not found, try looking for mingw.org.
- llvm::sys::fs::directory_iterator MingwOrgEntry(LibDir + "mingw32", EC);
- if (!EC) {
- GccLibDir = MingwOrgEntry->path();
- // Replace Arch with mingw32 arch.
- Arch = "mingw32";
- break;
+ for (StringRef MaybeArch : Archs) {
+ llvm::SmallString<1024> LibDir(Base);
+ llvm::sys::path::append(LibDir, Lib, "gcc", MaybeArch);
+ if (findGccVersion(LibDir, GccLibDir, Ver)) {
+ Arch = MaybeArch;
+ return;
+ }
}
}
}
@@ -50,9 +60,6 @@ MinGW::MinGW(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
: ToolChain(D, Triple, Args) {
getProgramPaths().push_back(getDriver().getInstalledDir());
- // Default Arch is mingw-w64.
- Arch = (getTriple().getArchName() + "-w64-mingw32").str();
-
// In Windows there aren't any standard install locations, we search
// for gcc on the PATH. In Linux the base is always /usr.
#ifdef LLVM_ON_WIN32
@@ -73,7 +80,6 @@ MinGW::MinGW(const Driver &D, const llvm::Triple &Triple, const ArgList &Args)
Base += llvm::sys::path::get_separator();
findGccLibDir();
- Ver = llvm::sys::path::filename(GccLibDir);
// GccLibDir must precede Base/lib so that the
// correct crtbegin.o ,cetend.o would be found.
getFilePaths().push_back(GccLibDir);
OpenPOWER on IntegriCloud