summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/Driver.cpp
diff options
context:
space:
mode:
authorDavid Chisnall <csdavec@swan.ac.uk>2011-09-27 22:03:18 +0000
committerDavid Chisnall <csdavec@swan.ac.uk>2011-09-27 22:03:18 +0000
commitddbd68fbd27836b1d59d7a8bfc9706675a77647e (patch)
tree5d8e847681418bdbd3a70b0b1edc770b4497c25c /clang/lib/Driver/Driver.cpp
parenta5d18f2d7e429314d34eec01da041ed09afd1db7 (diff)
downloadbcm5719-llvm-ddbd68fbd27836b1d59d7a8bfc9706675a77647e.tar.gz
bcm5719-llvm-ddbd68fbd27836b1d59d7a8bfc9706675a77647e.zip
Check for GCC paths that have the target triple in them. This is required for a lot of cross-compile toolchains. Also add some slightly better support for -B.
llvm-svn: 140645
Diffstat (limited to 'clang/lib/Driver/Driver.cpp')
-rw-r--r--clang/lib/Driver/Driver.cpp31
1 files changed, 22 insertions, 9 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 121abc8b8bc..ed9e275f7b0 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -1485,33 +1485,46 @@ std::string Driver::GetFilePath(const char *Name, const ToolChain &TC) const {
return Name;
}
+static bool isPathExecutable(llvm::sys::Path &P, bool WantFile) {
+ bool Exists;
+ return (WantFile ? !llvm::sys::fs::exists(P.str(), Exists) && Exists
+ : P.canExecute());
+}
+
std::string Driver::GetProgramPath(const char *Name, const ToolChain &TC,
bool WantFile) const {
+ std::string TargetSpecificExecutable(DefaultHostTriple + "-" + Name);
// Respect a limited subset of the '-Bprefix' functionality in GCC by
// attempting to use this prefix when lokup up program paths.
for (Driver::prefix_list::const_iterator it = PrefixDirs.begin(),
ie = PrefixDirs.end(); it != ie; ++it) {
llvm::sys::Path P(*it);
+ P.appendComponent(TargetSpecificExecutable);
+ if (isPathExecutable(P, WantFile)) return P.str();
+ P.eraseComponent();
P.appendComponent(Name);
- bool Exists;
- if (WantFile ? !llvm::sys::fs::exists(P.str(), Exists) && Exists
- : P.canExecute())
- return P.str();
+ if (isPathExecutable(P, WantFile)) return P.str();
}
const ToolChain::path_list &List = TC.getProgramPaths();
for (ToolChain::path_list::const_iterator
it = List.begin(), ie = List.end(); it != ie; ++it) {
llvm::sys::Path P(*it);
+ P.appendComponent(TargetSpecificExecutable);
+ if (isPathExecutable(P, WantFile)) return P.str();
+ P.eraseComponent();
P.appendComponent(Name);
- bool Exists;
- if (WantFile ? !llvm::sys::fs::exists(P.str(), Exists) && Exists
- : P.canExecute())
- return P.str();
+ if (isPathExecutable(P, WantFile)) return P.str();
}
// If all else failed, search the path.
- llvm::sys::Path P(llvm::sys::Program::FindProgramByName(Name));
+ llvm::sys::Path
+ P(llvm::sys::Program::FindProgramByName(TargetSpecificExecutable));
+ if (!P.empty())
+ return P.str();
+
+ P = llvm::sys::Path(llvm::sys::Program::FindProgramByName(
+ TargetSpecificExecutable));
if (!P.empty())
return P.str();
OpenPOWER on IntegriCloud