[PATCH] D52931: [LLD] [COFF] Do MinGW specific entry/subsystem inference
Martin Storsjö via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 5 12:38:02 PDT 2018
mstorsjo updated this revision to Diff 168506.
mstorsjo retitled this revision from "[LLD] [COFF] Don't warn about both main and wmain in MinGW configurations" to "[LLD] [COFF] Do MinGW specific entry/subsystem inference".
mstorsjo edited the summary of this revision.
mstorsjo added a comment.
Emulating the ld.bfd behaviour much more closely.
https://reviews.llvm.org/D52931
Files:
COFF/Driver.cpp
test/COFF/entry-inference-mingw.s
test/COFF/subsystem-inference-mingw.s
Index: test/COFF/subsystem-inference-mingw.s
===================================================================
--- /dev/null
+++ test/COFF/subsystem-inference-mingw.s
@@ -0,0 +1,17 @@
+# REQUIRES: x86
+# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.o
+
+# RUN: lld-link -lldmingw %t.o -out:%t.exe
+# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
+
+# CHECK: AddressOfEntryPoint: 0x1001
+# CHECK: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI (0x3)
+
+ .text
+ .globl foo
+ .globl mainCRTStartup
+foo:
+ ret
+mainCRTStartup:
+ call foo
+ ret
Index: test/COFF/entry-inference-mingw.s
===================================================================
--- /dev/null
+++ test/COFF/entry-inference-mingw.s
@@ -0,0 +1,44 @@
+# REQUIRES: x86
+# RUN: llvm-mc -triple=x86_64-windows-gnu %s -filetype=obj -o %t.o
+
+# RUN: lld-link -lldmingw %t.o -out:%t-default.exe 2>&1 | FileCheck -allow-empty -check-prefix=LINK %s
+# RUN: lld-link -lldmingw %t.o -out:%t-cui.exe -subsystem:console 2>&1 | FileCheck -allow-empty -check-prefix=LINK %s
+# RUN: lld-link -lldmingw %t.o -out:%t-gui.exe -subsystem:windows 2>&1 | FileCheck -allow-empty -check-prefix=LINK %s
+
+# RUN: llvm-readobj -file-headers %t-default.exe | FileCheck -check-prefix=CUI %s
+# RUN: llvm-readobj -file-headers %t-cui.exe | FileCheck -check-prefix=CUI %s
+# RUN: llvm-readobj -file-headers %t-gui.exe | FileCheck -check-prefix=GUI %s
+
+# Check that this doesn't print any warnings.
+# LINK-NOT: found both wmain and main
+
+# CUI: AddressOfEntryPoint: 0x1001
+# CUI: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI (0x3)
+
+# GUI: AddressOfEntryPoint: 0x1002
+# GUI: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_GUI (0x2)
+
+
+ .text
+ .globl mainCRTStartup
+ .globl WinMainCRTStartup
+# MinGW only uses the entry points above, these other ones aren't
+# used as entry.
+ .globl main
+ .globl wmain
+ .globl wmainCRTStartup
+ .globl wWinMainCRTStartup
+foo:
+ ret
+mainCRTStartup:
+ ret
+WinMainCRTStartup:
+ ret
+main:
+ ret
+wmain:
+ ret
+wmainCRTStartup:
+ ret
+wWinMainCRTStartup:
+ ret
Index: COFF/Driver.cpp
===================================================================
--- COFF/Driver.cpp
+++ COFF/Driver.cpp
@@ -430,6 +430,11 @@
assert(Config->Subsystem != IMAGE_SUBSYSTEM_UNKNOWN &&
"must handle /subsystem before calling this");
+ if (Config->MinGW)
+ return mangle(Config->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI
+ ? "WinMainCRTStartup"
+ : "mainCRTStartup");
+
if (Config->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI) {
if (findUnderscoreMangle("wWinMain")) {
if (!findUnderscoreMangle("WinMain"))
@@ -449,6 +454,8 @@
WindowsSubsystem LinkerDriver::inferSubsystem() {
if (Config->DLL)
return IMAGE_SUBSYSTEM_WINDOWS_GUI;
+ if (Config->MinGW)
+ return IMAGE_SUBSYSTEM_WINDOWS_CUI;
// Note that link.exe infers the subsystem from the presence of these
// functions even if /entry: or /nodefaultlib are passed which causes them
// to not be called.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52931.168506.patch
Type: text/x-patch
Size: 3160 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181005/4dc2db19/attachment.bin>
More information about the llvm-commits
mailing list