move more startup code to std lib

This commit is contained in:
Vexu
2019-11-30 15:39:11 +02:00
committed by Andrew Kelley
parent fd7c7be33c
commit a0ca30ce01
6 changed files with 79 additions and 114 deletions

View File

@@ -8229,7 +8229,7 @@ TargetSubsystem detect_subsystem(CodeGen *g) {
if (g->zig_target->os == OsWindows) {
if (g->have_dllmain_crt_startup || (g->out_type == OutTypeLib && g->is_dynamic))
return TargetSubsystemAuto;
if (g->have_c_main || g->have_pub_main || g->is_test_build)
if (g->have_c_main || g->is_test_build)
return TargetSubsystemConsole;
if (g->have_winmain || g->have_winmain_crt_startup)
return TargetSubsystemWindows;
@@ -8375,6 +8375,24 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {
const char *endian_str = g->is_big_endian ? "Endian.Big" : "Endian.Little";
buf_appendf(contents, "pub const endian = %s;\n", endian_str);
}
const char *out_type = nullptr;
switch (g->out_type) {
case OutTypeUnknown:
out_type = "Unknown";
break;
case OutTypeExe:
out_type = "Exe";
break;
case OutTypeLib:
out_type = "Lib";
break;
case OutTypeObj:
out_type = "Obj";
break;
}
buf_appendf(contents, "pub const output_type = OutType.%s;\n", out_type);
const char *link_type = g->is_dynamic ? "Dynamic" : "Static";
buf_appendf(contents, "pub const link_type = LinkType.%s;\n", link_type);
buf_appendf(contents, "pub const is_test = %s;\n", bool_to_str(g->is_test_build));
buf_appendf(contents, "pub const single_threaded = %s;\n", bool_to_str(g->is_single_threaded));
buf_appendf(contents, "pub const os = Os.%s;\n", cur_os);
@@ -9148,38 +9166,6 @@ static Buf *get_resolved_root_src_path(CodeGen *g) {
return resolved_path;
}
static bool want_startup_code(CodeGen *g) {
// Test builds get handled separately.
if (g->is_test_build)
return false;
// WASM freestanding can still have an entry point but other freestanding targets do not.
if (g->zig_target->os == OsFreestanding && !target_is_wasm(g->zig_target))
return false;
// Declaring certain export functions means skipping the start code
if (g->have_c_main || g->have_winmain || g->have_winmain_crt_startup)
return false;
// If there is a pub main in the root source file, that means we need start code.
if (g->have_pub_main) {
return true;
} else {
if (g->zig_target->os == OsUefi)
return false;
}
if (g->out_type == OutTypeExe) {
// For build-exe, we might add start code even though there is no pub main, so that the
// programmer gets the "no pub main" compile error. However if linking libc and there is
// a C source file, that might have main().
return g->c_source_files.length == 0 || g->libc_link_lib == nullptr;
}
// For objects and libraries, and we don't have pub main, no start code.
return false;
}
static void gen_root_source(CodeGen *g) {
Buf *resolved_path = get_resolved_root_src_path(g);
if (resolved_path == nullptr)
@@ -9241,21 +9227,14 @@ static void gen_root_source(CodeGen *g) {
assert(g->panic_fn != nullptr);
}
if (!g->error_during_imports) {
semantic_analyze(g);
}
report_errors_and_maybe_exit(g);
if (want_startup_code(g)) {
if (!g->is_test_build) {
g->start_import = add_special_code(g, create_start_pkg(g, g->root_package), "start.zig");
}
if (g->zig_target->os == OsWindows && !g->have_dllmain_crt_startup &&
g->out_type == OutTypeLib && g->is_dynamic)
{
g->start_import = add_special_code(g, create_start_pkg(g, g->root_package), "start_lib.zig");
}
if (!g->error_during_imports) {
semantic_analyze(g);
}