aboutsummaryrefslogtreecommitdiff
path: root/lib/Driver/ToolChains.cpp
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2011-10-04 23:17:12 +0000
committerChandler Carruth <chandlerc@gmail.com>2011-10-04 23:17:12 +0000
commite089088b4ae51a1b7e1803739660c6039505dfee (patch)
treeb48a8f4469292456e4799c2273af80e5d1f606f8 /lib/Driver/ToolChains.cpp
parent50f3cade2a87bda005ae08d42b51c5b960b07779 (diff)
Hoist the other messy part out of an inner loop and into a helper
function, cleaning up along the way. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141134 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Driver/ToolChains.cpp')
-rw-r--r--lib/Driver/ToolChains.cpp88
1 files changed, 45 insertions, 43 deletions
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index 084056a30b..493dc97ddc 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -1590,7 +1590,6 @@ public:
// Loop over the various components which exist and select the best GCC
// installation available. GCC installs are ranked by version number.
- static const GCCVersion MinVersion = { 4, 1, 1 };
GCCVersion BestVersion = {};
for (unsigned i = 0, ie = Prefixes.size(); i < ie; ++i) {
if (!PathExists(Prefixes[i]))
@@ -1599,48 +1598,8 @@ public:
const std::string LibDir = Prefixes[i] + CandidateLibDirs[j].str();
if (!PathExists(LibDir))
continue;
- for (unsigned k = 0, ke = CandidateTriples.size(); k < ke; ++k) {
- StringRef CandidateTriple = CandidateTriples[k];
- const std::string TripleDir = LibDir + "/" + CandidateTriple.str();
- if (!PathExists(TripleDir))
- continue;
-
- // There are various different suffixes on the triple directory we
- // check for. We also record what is necessary to walk from each back
- // up to the lib directory.
- const std::string Suffixes[] = { "", "/gcc/" + CandidateTriple.str(),
- "/gcc/i686-linux-gnu" };
- const std::string InstallSuffixes[] = { "/../../..", "/../../../..",
- "/../../../.." };
- const unsigned NumSuffixes = (llvm::array_lengthof(Suffixes) -
- (CandidateTriple != "i386-linux-gnu"));
- for (unsigned l = 0; l < NumSuffixes; ++l) {
- StringRef Suffix = Suffixes[l];
- llvm::error_code EC;
- for (llvm::sys::fs::directory_iterator LI(TripleDir + Suffix, EC),
- LE;
- !EC && LI != LE; LI = LI.increment(EC)) {
- StringRef VersionText = llvm::sys::path::filename(LI->path());
- GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
- if (CandidateVersion < MinVersion)
- continue;
- if (CandidateVersion <= BestVersion)
- continue;
- if (!PathExists(LI->path() + "/crtbegin.o"))
- continue;
-
- BestVersion = CandidateVersion;
- GccTriple = CandidateTriple.str();
- // FIXME: We hack together the directory name here instead of
- // using LI to ensure stable path separators across Windows and
- // Linux.
- GccInstallPath = (TripleDir + Suffixes[l] + "/" +
- VersionText.str());
- GccParentLibPath = GccInstallPath + InstallSuffixes[l];
- IsValid = true;
- }
- }
- }
+ for (unsigned k = 0, ke = CandidateTriples.size(); k < ke; ++k)
+ ScanLibDirForGCCTriple(LibDir, CandidateTriples[k], BestVersion);
}
}
}
@@ -1723,6 +1682,49 @@ private:
PPC64Triples + llvm::array_lengthof(PPC64Triples));
}
}
+
+ void ScanLibDirForGCCTriple(const std::string &LibDir,
+ StringRef CandidateTriple,
+ GCCVersion &BestVersion) {
+ const std::string TripleDir = LibDir + "/" + CandidateTriple.str();
+ if (!PathExists(TripleDir))
+ return;
+
+ // There are various different suffixes on the triple directory we
+ // check for. We also record what is necessary to walk from each back
+ // up to the lib directory.
+ const std::string Suffixes[] = { "", "/gcc/" + CandidateTriple.str(),
+ "/gcc/i686-linux-gnu" };
+ const std::string InstallSuffixes[] = { "/../../..", "/../../../..",
+ "/../../../.." };
+ const unsigned NumSuffixes = (llvm::array_lengthof(Suffixes) -
+ (CandidateTriple != "i386-linux-gnu"));
+ for (unsigned i = 0; i < NumSuffixes; ++i) {
+ StringRef Suffix = Suffixes[i];
+ llvm::error_code EC;
+ for (llvm::sys::fs::directory_iterator LI(TripleDir + Suffix, EC), LE;
+ !EC && LI != LE; LI = LI.increment(EC)) {
+ StringRef VersionText = llvm::sys::path::filename(LI->path());
+ GCCVersion CandidateVersion = GCCVersion::Parse(VersionText);
+ static const GCCVersion MinVersion = { 4, 1, 1 };
+ if (CandidateVersion < MinVersion)
+ continue;
+ if (CandidateVersion <= BestVersion)
+ continue;
+ if (!PathExists(LI->path() + "/crtbegin.o"))
+ continue;
+
+ BestVersion = CandidateVersion;
+ GccTriple = CandidateTriple.str();
+ // FIXME: We hack together the directory name here instead of
+ // using LI to ensure stable path separators across Windows and
+ // Linux.
+ GccInstallPath = TripleDir + Suffixes[i] + "/" + VersionText.str();
+ GccParentLibPath = GccInstallPath + InstallSuffixes[i];
+ IsValid = true;
+ }
+ }
+ }
};
}