summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIgor Kudrin <ikudrin@accesssoftek.com>2018-02-27 02:51:30 +0000
committerIgor Kudrin <ikudrin@accesssoftek.com>2018-02-27 02:51:30 +0000
commita49182aa5a94e5254d2235c8d627805ea0c42fd3 (patch)
treefd1ccf02eea7b52fae0582b0dc7eb651d05245aa
parent8992eddbdf1c831f9e49f256af9f1187be749bc9 (diff)
downloadbcm5719-llvm-a49182aa5a94e5254d2235c8d627805ea0c42fd3.tar.gz
bcm5719-llvm-a49182aa5a94e5254d2235c8d627805ea0c42fd3.zip
[Driver] Allow using a canonical form of '-fuse-ld=' when cross-compiling on Windows.
clang used to require adding an ".exe" suffix when targeting ELF systems on Windows. Differential Revision: https://reviews.llvm.org/D43621 llvm-svn: 326164
-rw-r--r--clang/lib/Driver/ToolChain.cpp4
-rwxr-xr-xclang/test/Driver/Inputs/fuse_ld_windows/ld.foo.exe0
-rw-r--r--clang/test/Driver/fuse-ld-windows.c25
3 files changed, 27 insertions, 2 deletions
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index d9702c87ecd..ed6918fe12f 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -412,7 +412,7 @@ std::string ToolChain::GetLinkerPath() const {
if (llvm::sys::path::is_absolute(UseLinker)) {
// If we're passed what looks like an absolute path, don't attempt to
// second-guess that.
- if (llvm::sys::fs::exists(UseLinker))
+ if (llvm::sys::fs::can_execute(UseLinker))
return UseLinker;
} else if (UseLinker.empty() || UseLinker == "ld") {
// If we're passed -fuse-ld= with no argument, or with the argument ld,
@@ -427,7 +427,7 @@ std::string ToolChain::GetLinkerPath() const {
LinkerName.append(UseLinker);
std::string LinkerPath(GetProgramPath(LinkerName.c_str()));
- if (llvm::sys::fs::exists(LinkerPath))
+ if (llvm::sys::fs::can_execute(LinkerPath))
return LinkerPath;
}
diff --git a/clang/test/Driver/Inputs/fuse_ld_windows/ld.foo.exe b/clang/test/Driver/Inputs/fuse_ld_windows/ld.foo.exe
new file mode 100755
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/clang/test/Driver/Inputs/fuse_ld_windows/ld.foo.exe
diff --git a/clang/test/Driver/fuse-ld-windows.c b/clang/test/Driver/fuse-ld-windows.c
new file mode 100644
index 00000000000..089f2961b75
--- /dev/null
+++ b/clang/test/Driver/fuse-ld-windows.c
@@ -0,0 +1,25 @@
+// REQUIRES: system-windows
+
+// We used to require adding ".exe" suffix when cross-compiling on Windows.
+// RUN: %clang %s -### -o %t.o -target i386-unknown-linux \
+// RUN: -B %S/Inputs/fuse_ld_windows -fuse-ld=foo 2>&1 \
+// RUN: | FileCheck %s
+
+// Check that the old variant still works.
+// RUN: %clang %s -### -o %t.o -target i386-unknown-linux \
+// RUN: -B %S/Inputs/fuse_ld_windows -fuse-ld=foo.exe 2>&1 \
+// RUN: | FileCheck %s
+
+// With the full path, the extension can be omitted, too,
+// because Windows allows that.
+// RUN: %clang %s -### -o %t.o -target i386-unknown-linux \
+// RUN: -fuse-ld=%S/Inputs/fuse_ld_windows/ld.foo 2>&1 \
+// RUN: | FileCheck %s
+
+// Check that the full path with the extension works too.
+// RUN: %clang %s -### -o %t.o -target i386-unknown-linux \
+// RUN: -fuse-ld=%S/Inputs/fuse_ld_windows/ld.foo.exe 2>&1 \
+// RUN: | FileCheck %s
+
+// CHECK-NOT: invalid linker name
+// CHECK: /Inputs/fuse_ld_windows{{/|\\\\}}ld.foo
OpenPOWER on IntegriCloud