| ... | ... | @@ -3333,21 +3333,15 @@ void add_var_export(CodeGen *g, ZigVar *var, const char *symbol_name, GlobalLink |
| 3333 | 3333 | global_export->linkage = linkage; |
| 3334 | 3334 | } |
| 3335 | 3335 | |
| 3336 | | void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, const char *symbol_name, GlobalLinkageId linkage, bool ccc) { |
| 3337 | | if (ccc) { |
| 3338 | | if (strcmp(symbol_name, "main") == 0 && g->libc_link_lib != nullptr) { |
| 3339 | | g->have_c_main = true; |
| 3340 | | } else if (strcmp(symbol_name, "WinMain") == 0 && |
| 3341 | | g->zig_target->os == OsWindows) |
| 3342 | | { |
| 3336 | void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, const char *symbol_name, GlobalLinkageId linkage, CallingConvention cc) { |
| 3337 | if (cc == CallingConventionC && strcmp(symbol_name, "main") == 0 && g->libc_link_lib != nullptr) { |
| 3338 | g->have_c_main = true; |
| 3339 | } else if (cc == CallingConventionStdcall && g->zig_target->os == OsWindows) { |
| 3340 | if (strcmp(symbol_name, "WinMain") == 0) { |
| 3343 | 3341 | g->have_winmain = true; |
| 3344 | | } else if (strcmp(symbol_name, "WinMainCRTStartup") == 0 && |
| 3345 | | g->zig_target->os == OsWindows) |
| 3346 | | { |
| 3342 | } else if (strcmp(symbol_name, "WinMainCRTStartup") == 0) { |
| 3347 | 3343 | g->have_winmain_crt_startup = true; |
| 3348 | | } else if (strcmp(symbol_name, "DllMainCRTStartup") == 0 && |
| 3349 | | g->zig_target->os == OsWindows) |
| 3350 | | { |
| 3344 | } else if (strcmp(symbol_name, "DllMainCRTStartup") == 0) { |
| 3351 | 3345 | g->have_dllmain_crt_startup = true; |
| 3352 | 3346 | } |
| 3353 | 3347 | } |
| ... | ... | @@ -3377,8 +3371,24 @@ static void resolve_decl_fn(CodeGen *g, TldFn *tld_fn) { |
| 3377 | 3371 | } |
| 3378 | 3372 | |
| 3379 | 3373 | if (fn_proto->is_export) { |
| 3380 | | bool ccc = (fn_proto->cc == CallingConventionUnspecified || fn_proto->cc == CallingConventionC); |
| 3381 | | add_fn_export(g, fn_table_entry, buf_ptr(&fn_table_entry->symbol_name), GlobalLinkageIdStrong, ccc); |
| 3374 | switch (fn_proto->cc) { |
| 3375 | case CallingConventionAsync: { |
| 3376 | add_node_error(g, fn_def_node, |
| 3377 | buf_sprintf("exported function cannot be async")); |
| 3378 | } break; |
| 3379 | case CallingConventionC: |
| 3380 | case CallingConventionNaked: |
| 3381 | case CallingConventionCold: |
| 3382 | case CallingConventionStdcall: |
| 3383 | case CallingConventionUnspecified: |
| 3384 | // An exported function without a specific calling |
| 3385 | // convention defaults to C |
| 3386 | CallingConvention cc = (fn_proto->cc != CallingConventionUnspecified) ? |
| 3387 | fn_proto->cc : CallingConventionC; |
| 3388 | add_fn_export(g, fn_table_entry, buf_ptr(&fn_table_entry->symbol_name), |
| 3389 | GlobalLinkageIdStrong, cc); |
| 3390 | break; |
| 3391 | } |
| 3382 | 3392 | } |
| 3383 | 3393 | |
| 3384 | 3394 | if (!is_extern) { |