lld-link: Several tweaks to default entry point selection.
authorNico Weber <nicolasweber@gmx.de>
Wed, 3 Oct 2018 17:01:39 +0000 (17:01 +0000)
committerNico Weber <nicolasweber@gmx.de>
Wed, 3 Oct 2018 17:01:39 +0000 (17:01 +0000)
commitd37782627772fe13927baa282276c0af591f2b75
treeb01a8713a53c2e238bd3c0a79d143954992c06e2
parent2c59475c064476d321d9c92bd88e7333e9657ce8
lld-link: Several tweaks to default entry point selection.

Three related changes:

1. link.exe uses the presence of main and wmain to decide if it should call
   mainCRTStartup or wmainCRTStartup, even if /nodefaultlib is passed. For
   compatibility, remove FindMain logic.

2. Default to the non-wide entrypoint if main is not found. This has two effects:

2a. In normal links, lld-link now prints

        lld-link: error: undefined symbol: _main
        >>> referenced by f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:78
        >>>               libcmt.lib(exe_main.obj):("int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ))
        >>> referenced by f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl:283
        >>>               libcmt.lib(exe_main.obj):("int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ))

    instead of

        lld-link: error: entry point must be defined

    This is arguably a better error message, since it now mentions that _main is
    missing. (This matches link.exe's diagnostic in this case.)

2b. With /nodefautlib, we now default to mainCRTStartup if no main() is
    present, again matching link.exe. This makes r337407 obsolete.

This means if you have a cc file containing both mainCRTStartup and
wmainCRTStartup and you pass /nodefaultlib /subsystem:console, lld-link will
now call mainCRTStartup, matching link.exe

3. Print a warning if both main and wmain are present, similar to link.exe's
   LNK4067.

Differential Revision: https://reviews.llvm.org/D52832

llvm-svn: 343698
lld/COFF/Driver.cpp
lld/test/COFF/entry-inference.test
lld/test/COFF/entry-inference4.test