Index: lld/trunk/COFF/Driver.cpp =================================================================== --- lld/trunk/COFF/Driver.cpp +++ lld/trunk/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. Index: lld/trunk/test/COFF/entry-inference-mingw.s =================================================================== --- lld/trunk/test/COFF/entry-inference-mingw.s +++ lld/trunk/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: lld/trunk/test/COFF/subsystem-inference-mingw.s =================================================================== --- lld/trunk/test/COFF/subsystem-inference-mingw.s +++ lld/trunk/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