Skip to content

Commit

Permalink
[MinGW] Implicitly add .exe suffix if not provided
Browse files Browse the repository at this point in the history
GCC implicitly adds an .exe suffix if it is given an output file name,
but the file name doesn't contain a suffix, and there are certain
users of GCC that rely on this behaviour (and run into issues when
trying to use Clang instead of GCC). And MSVC's cl.exe also does the
same (but not link.exe).

However, GCC only does this when actually running on windows, not when
operating as a cross compiler.

As GCC doesn't have this behaviour when cross compiling, we definitely
shouldn't introduce the behaviour in such cases (as it would break
at least as many cases as this fixes).

Differential Revision: https://reviews.llvm.org/D71400
  • Loading branch information
mstorsjo committed Dec 17, 2019
1 parent 891a865 commit ee0a3b5
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 1 deletion.
14 changes: 13 additions & 1 deletion clang/lib/Driver/ToolChains/MinGW.cpp
Expand Up @@ -160,7 +160,19 @@ void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
}

CmdArgs.push_back("-o");
CmdArgs.push_back(Output.getFilename());
const char *OutputFile = Output.getFilename();
// GCC implicitly adds an .exe extension if it is given an output file name
// that lacks an extension. However, GCC only does this when actually
// running on windows, not when operating as a cross compiler. As some users
// have come to rely on this behaviour, try to replicate it.
#ifdef _WIN32
if (!llvm::sys::path::has_extension(OutputFile))
CmdArgs.push_back(Args.MakeArgString(Twine(OutputFile) + ".exe"));
else
CmdArgs.push_back(OutputFile);
#else
CmdArgs.push_back(OutputFile);
#endif

Args.AddAllArgs(CmdArgs, options::OPT_e);
// FIXME: add -N, -n flags
Expand Down
9 changes: 9 additions & 0 deletions clang/test/Driver/mingw-implicit-extension-cross.c
@@ -0,0 +1,9 @@
// Test how an implicit .exe extension is added. If not running the compiler
// on windows, no implicit extension is added. (Therefore, this test is skipped
// when running on windows.)

// UNSUPPORTED: system-windows

// RUN: %clang -target i686-windows-gnu -### --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s -o outputname 2>&1 | FileCheck %s

// CHECK: "-o" "outputname"
14 changes: 14 additions & 0 deletions clang/test/Driver/mingw-implicit-extension-windows.c
@@ -0,0 +1,14 @@
// Test how an implicit .exe extension is added. If running the compiler
// on windows, an implicit extension is added if none is provided in the
// given name. (Therefore, this test is skipped when not running on windows.)

// REQUIRES: system-windows

// RUN: %clang -target i686-windows-gnu -### --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s -o outputname 2>&1 | FileCheck %s --check-prefix=CHECK-OUTPUTNAME-EXE

// RUN: %clang -target i686-windows-gnu -### --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s -o outputname.exe 2>&1 | FileCheck %s --check-prefix=CHECK-OUTPUTNAME-EXE

// RUN: %clang -target i686-windows-gnu -### --sysroot=%S/Inputs/mingw_clang_tree/mingw32 %s -o outputname.q 2>&1 | FileCheck %s --check-prefix=CHECK-OUTPUTNAME-Q

// CHECK-OUTPUTNAME-EXE: "-o" "outputname.exe"
// CHECK-OUTPUTNAME-Q: "-o" "outputname.q"

0 comments on commit ee0a3b5

Please sign in to comment.