[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