forked from OSchip/llvm-project
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:
parent
c536bd9e73
commit
89d4b1a77c
|
@ -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?
|
||||
///
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -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 &&
|
||||
|
|
Loading…
Reference in New Issue