ScanDirForExecutable on Windows fails to find executables with the "exe" extension in name

When the driver tries to locate a program by its name, e.g. a linker, it
scans the paths provided by the toolchain using the ScanDirForExecutable
function. If the lookup fails, the driver uses
llvm::sys::findProgramByName. Unlike llvm::sys::findProgramByName,
ScanDirForExecutable is not aware of file extensions. If the program has
the "exe" extension in its name, which is very common on Windows,
ScanDirForExecutable won't find it under the toolchain-provided paths.

This patch changes the Windows version of the "`can_execute`" function
called by ScanDirForExecutable to respect file extensions, similarly to
llvm::sys::findProgramByName.

Patch by Oleg Ranevskyy

Reviewers: rnk

Differential Revision: http://reviews.llvm.org/D12711

llvm-svn: 247358
This commit is contained in:
Reid Kleckner 2015-09-10 23:28:06 +00:00
parent c536bd9e73
commit 89d4b1a77c
3 changed files with 10 additions and 3 deletions

View File

@ -378,9 +378,7 @@ inline bool exists(const Twine &Path) {
///
/// @param Path Input path.
/// @returns True if we can execute it, false otherwise.
inline bool can_execute(const Twine &Path) {
return !access(Path, AccessMode::Execute);
}
bool can_execute(const Twine &Path);
/// @brief Can we write this file?
///

View File

@ -325,6 +325,10 @@ std::error_code access(const Twine &Path, AccessMode Mode) {
return std::error_code();
}
bool can_execute(const Twine &Path) {
return !access(Path, AccessMode::Execute);
}
bool equivalent(file_status A, file_status B) {
assert(status_known(A) && status_known(B));
return A.fs_st_dev == B.fs_st_dev &&

View File

@ -302,6 +302,11 @@ std::error_code access(const Twine &Path, AccessMode Mode) {
return std::error_code();
}
bool can_execute(const Twine &Path) {
return !access(Path, AccessMode::Execute) ||
!access(Path + ".exe", AccessMode::Execute);
}
bool equivalent(file_status A, file_status B) {
assert(status_known(A) && status_known(B));
return A.FileIndexHigh == B.FileIndexHigh &&