From d222eefb79b802ca1bc74fe891d9a201a5eb6a78 Mon Sep 17 00:00:00 2001 From: Igor Kudrin Date: Tue, 27 Feb 2018 02:51:30 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@326164 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/ToolChain.cpp | 4 +-- test/Driver/Inputs/fuse_ld_windows/ld.foo.exe | 0 test/Driver/fuse-ld-windows.c | 25 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100755 test/Driver/Inputs/fuse_ld_windows/ld.foo.exe create mode 100644 test/Driver/fuse-ld-windows.c diff --git a/lib/Driver/ToolChain.cpp b/lib/Driver/ToolChain.cpp index d9702c87ec..ed6918fe12 100644 --- a/lib/Driver/ToolChain.cpp +++ b/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/test/Driver/Inputs/fuse_ld_windows/ld.foo.exe b/test/Driver/Inputs/fuse_ld_windows/ld.foo.exe new file mode 100755 index 0000000000..e69de29bb2 diff --git a/test/Driver/fuse-ld-windows.c b/test/Driver/fuse-ld-windows.c new file mode 100644 index 0000000000..089f2961b7 --- /dev/null +++ b/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 -- 2.50.1