authorgravatar for 1668550+Jared-Miller@users.noreply.github.comJared Miller <1668550+Jared-Miller@users.noreply.github.com> 2020-02-07 16:04:50-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-02-07 22:52:40-05:00
logb55bc5eb266f2dc62cf520e8b572893adf5f979c
tree98620a5ddedb9bbfdf39c1d3776279dc536b3f00
parent0e7461d4a34272a94acba20b09aaee283e88a806

Add wWinMain and wWinMainCRTStartup to fix #4376


5 files changed, 13 insertions(+), 3 deletions(-)

lib/std/start.zig+1-1
...@@ -21,7 +21,7 @@ comptime {...@@ -21,7 +21,7 @@ comptime {
21 @export(main, .{ .name = "main", .linkage = .Weak });21 @export(main, .{ .name = "main", .linkage = .Weak });
22 }22 }
23 } else if (builtin.os == .windows) {23 } else if (builtin.os == .windows) {
24 if (!@hasDecl(root, "WinMain") and !@hasDecl(root, "WinMainCRTStartup")) {24 if (!@hasDecl(root, "WinMain") and !@hasDecl(root, "WinMainCRTStartup") and !@hasDecl(root, "wWinMain") and !@hasDecl(root, "wWinMainCRTStartup")) {
25 @export(WinMainCRTStartup, .{ .name = "WinMainCRTStartup" });25 @export(WinMainCRTStartup, .{ .name = "WinMainCRTStartup" });
26 }26 }
27 } else if (builtin.os == .uefi) {27 } else if (builtin.os == .uefi) {
src/all_types.hpp+2
...@@ -2175,7 +2175,9 @@ struct CodeGen {...@@ -2175,7 +2175,9 @@ struct CodeGen {
2175 bool is_big_endian;2175 bool is_big_endian;
2176 bool have_c_main;2176 bool have_c_main;
2177 bool have_winmain;2177 bool have_winmain;
2178 bool have_wwinmain;
2178 bool have_winmain_crt_startup;2179 bool have_winmain_crt_startup;
2180 bool have_wwinmain_crt_startup;
2179 bool have_dllmain_crt_startup;2181 bool have_dllmain_crt_startup;
2180 bool have_err_ret_tracing;2182 bool have_err_ret_tracing;
2181 bool link_eh_frame_hdr;2183 bool link_eh_frame_hdr;
src/analyze.cpp+4
...@@ -3419,8 +3419,12 @@ void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, const char *symbol_name, G...@@ -3419,8 +3419,12 @@ void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, const char *symbol_name, G
3419 } else if (cc == CallingConventionStdcall && g->zig_target->os == OsWindows) {3419 } else if (cc == CallingConventionStdcall && g->zig_target->os == OsWindows) {
3420 if (strcmp(symbol_name, "WinMain") == 0) {3420 if (strcmp(symbol_name, "WinMain") == 0) {
3421 g->have_winmain = true;3421 g->have_winmain = true;
3422 } else if (strcmp(symbol_name, "wWinMain") == 0) {
3423 g->have_wwinmain = true;
3422 } else if (strcmp(symbol_name, "WinMainCRTStartup") == 0) {3424 } else if (strcmp(symbol_name, "WinMainCRTStartup") == 0) {
3423 g->have_winmain_crt_startup = true;3425 g->have_winmain_crt_startup = true;
3426 } else if (strcmp(symbol_name, "wWinMainCRTStartup") == 0) {
3427 g->have_wwinmain_crt_startup = true;
3424 } else if (strcmp(symbol_name, "DllMainCRTStartup") == 0) {3428 } else if (strcmp(symbol_name, "DllMainCRTStartup") == 0) {
3425 g->have_dllmain_crt_startup = true;3429 g->have_dllmain_crt_startup = true;
3426 }3430 }
src/codegen.cpp+2-2
...@@ -8340,9 +8340,9 @@ TargetSubsystem detect_subsystem(CodeGen *g) {...@@ -8340,9 +8340,9 @@ TargetSubsystem detect_subsystem(CodeGen *g) {
8340 if (g->zig_target->os == OsWindows) {8340 if (g->zig_target->os == OsWindows) {
8341 if (g->have_dllmain_crt_startup || (g->out_type == OutTypeLib && g->is_dynamic))8341 if (g->have_dllmain_crt_startup || (g->out_type == OutTypeLib && g->is_dynamic))
8342 return TargetSubsystemAuto;8342 return TargetSubsystemAuto;
8343 if (g->have_c_main || g->is_test_build || g->have_winmain_crt_startup)8343 if (g->have_c_main || g->is_test_build || g->have_winmain_crt_startup || g->have_wwinmain_crt_startup)
8344 return TargetSubsystemConsole;8344 return TargetSubsystemConsole;
8345 if (g->have_winmain)8345 if (g->have_winmain || g->have_wwinmain)
8346 return TargetSubsystemWindows;8346 return TargetSubsystemWindows;
8347 } else if (g->zig_target->os == OsUefi) {8347 } else if (g->zig_target->os == OsUefi) {
8348 return TargetSubsystemEfiApplication;8348 return TargetSubsystemEfiApplication;
src/link.cpp+4
...@@ -2205,6 +2205,10 @@ static void add_win_link_args(LinkJob *lj, bool is_library, bool *have_windows_d...@@ -2205,6 +2205,10 @@ static void add_win_link_args(LinkJob *lj, bool is_library, bool *have_windows_d
2205 if (!is_library) {2205 if (!is_library) {
2206 if (lj->codegen->have_winmain) {2206 if (lj->codegen->have_winmain) {
2207 lj->args.append("-ENTRY:WinMain");2207 lj->args.append("-ENTRY:WinMain");
2208 } else if (lj->codegen->have_wwinmain) {
2209 lj->args.append("-ENTRY:wWinMain");
2210 } else if (lj->codegen->have_wwinmain_crt_startup) {
2211 lj->args.append("-ENTRY:wWinMainCRTStartup");
2208 } else {2212 } else {
2209 lj->args.append("-ENTRY:WinMainCRTStartup");2213 lj->args.append("-ENTRY:WinMainCRTStartup");
2210 }2214 }