authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-05-29 17:14:34-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-05-29 17:14:34-04:00
log6dbaae4c461ed4e8d6b087366b6069ba8dba628f
treea8f243036d9ab2699351c561ca0f83b2c9c471fc
parent7017388e9ea9a5b144780c0a5c090bb7a221c9b6
parent3819654c3931b762b0d3dac3b79d58eb791a646d
signaturelock-open Commit is signed but in an unrecognized format.

Merge branch 'emekoi-builtin-subsystem'


6 files changed, 74 insertions(+), 12 deletions(-)

src/all_types.hpp+1-1
...@@ -1857,7 +1857,7 @@ struct CodeGen {...@@ -1857,7 +1857,7 @@ struct CodeGen {
1857 BuildMode build_mode;1857 BuildMode build_mode;
1858 OutType out_type;1858 OutType out_type;
1859 const ZigTarget *zig_target;1859 const ZigTarget *zig_target;
1860 TargetSubsystem subsystem;1860 TargetSubsystem subsystem; // careful using this directly; see detect_subsystem
1861 ValgrindSupport valgrind_support;1861 ValgrindSupport valgrind_support;
1862 bool strip_debug_symbols;1862 bool strip_debug_symbols;
1863 bool is_test_build;1863 bool is_test_build;
src/analyze.cpp-3
...@@ -2722,12 +2722,10 @@ void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, Buf *symbol_name, GlobalLi...@@ -2722,12 +2722,10 @@ void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, Buf *symbol_name, GlobalLi
2722 if (ccc) {2722 if (ccc) {
2723 if (buf_eql_str(symbol_name, "main") && g->libc_link_lib != nullptr) {2723 if (buf_eql_str(symbol_name, "main") && g->libc_link_lib != nullptr) {
2724 g->have_c_main = true;2724 g->have_c_main = true;
2725 g->subsystem = g->subsystem == TargetSubsystemAuto ? TargetSubsystemConsole : g->subsystem;
2726 } else if (buf_eql_str(symbol_name, "WinMain") &&2725 } else if (buf_eql_str(symbol_name, "WinMain") &&
2727 g->zig_target->os == OsWindows)2726 g->zig_target->os == OsWindows)
2728 {2727 {
2729 g->have_winmain = true;2728 g->have_winmain = true;
2730 g->subsystem = g->subsystem == TargetSubsystemAuto ? TargetSubsystemWindows : g->subsystem;
2731 } else if (buf_eql_str(symbol_name, "WinMainCRTStartup") &&2729 } else if (buf_eql_str(symbol_name, "WinMainCRTStartup") &&
2732 g->zig_target->os == OsWindows)2730 g->zig_target->os == OsWindows)
2733 {2731 {
...@@ -3966,7 +3964,6 @@ ZigType *add_source_file(CodeGen *g, ZigPackage *package, Buf *resolved_path, Bu...@@ -3966,7 +3964,6 @@ ZigType *add_source_file(CodeGen *g, ZigPackage *package, Buf *resolved_path, Bu
3966 if (is_pub) {3964 if (is_pub) {
3967 if (buf_eql_str(proto_name, "main")) {3965 if (buf_eql_str(proto_name, "main")) {
3968 g->have_pub_main = true;3966 g->have_pub_main = true;
3969 g->subsystem = g->subsystem == TargetSubsystemAuto ? TargetSubsystemConsole : g->subsystem;
3970 } else if (buf_eql_str(proto_name, "panic")) {3967 } else if (buf_eql_str(proto_name, "panic")) {
3971 g->have_pub_panic = true;3968 g->have_pub_panic = true;
3972 }3969 }
src/codegen.cpp+64-5
...@@ -100,6 +100,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget...@@ -100,6 +100,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget
100100
101 codegen_add_time_event(g, "Initialize");101 codegen_add_time_event(g, "Initialize");
102102
103 g->subsystem = TargetSubsystemAuto;
103 g->libc = libc;104 g->libc = libc;
104 g->zig_target = target;105 g->zig_target = target;
105 g->cache_dir = cache_dir;106 g->cache_dir = cache_dir;
...@@ -7417,6 +7418,21 @@ static const char *build_mode_to_str(BuildMode build_mode) {...@@ -7417,6 +7418,21 @@ static const char *build_mode_to_str(BuildMode build_mode) {
7417 zig_unreachable();7418 zig_unreachable();
7418}7419}
74197420
7421static const char *subsystem_to_str(TargetSubsystem subsystem) {
7422 switch (subsystem) {
7423 case TargetSubsystemConsole: return "Console";
7424 case TargetSubsystemWindows: return "Windows";
7425 case TargetSubsystemPosix: return "Posix";
7426 case TargetSubsystemNative: return "Native";
7427 case TargetSubsystemEfiApplication: return "EfiApplication";
7428 case TargetSubsystemEfiBootServiceDriver: return "EfiBootServiceDriver";
7429 case TargetSubsystemEfiRom: return "EfiRom";
7430 case TargetSubsystemEfiRuntimeDriver: return "EfiRuntimeDriver";
7431 case TargetSubsystemAuto: zig_unreachable();
7432 }
7433 zig_unreachable();
7434}
7435
7420static bool detect_dynamic_link(CodeGen *g) {7436static bool detect_dynamic_link(CodeGen *g) {
7421 if (g->is_dynamic)7437 if (g->is_dynamic)
7422 return true;7438 return true;
...@@ -7462,6 +7478,23 @@ static bool detect_stack_probing(CodeGen *g) {...@@ -7462,6 +7478,23 @@ static bool detect_stack_probing(CodeGen *g) {
7462 zig_unreachable();7478 zig_unreachable();
7463}7479}
74647480
7481// Returns TargetSubsystemAuto to mean "no subsystem"
7482TargetSubsystem detect_subsystem(CodeGen *g) {
7483 if (g->subsystem != TargetSubsystemAuto)
7484 return g->subsystem;
7485 if (g->zig_target->os == OsWindows) {
7486 if (g->have_dllmain_crt_startup || (g->out_type == OutTypeLib && g->is_dynamic))
7487 return TargetSubsystemAuto;
7488 if (g->have_c_main || g->have_pub_main || g->is_test_build)
7489 return TargetSubsystemConsole;
7490 if (g->have_winmain || g->have_winmain_crt_startup)
7491 return TargetSubsystemWindows;
7492 } else if (g->zig_target->os == OsUefi) {
7493 return TargetSubsystemEfiApplication;
7494 }
7495 return TargetSubsystemAuto;
7496}
7497
7465static bool detect_single_threaded(CodeGen *g) {7498static bool detect_single_threaded(CodeGen *g) {
7466 if (g->want_single_threaded)7499 if (g->want_single_threaded)
7467 return true;7500 return true;
...@@ -7869,6 +7902,28 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {...@@ -7869,6 +7902,28 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {
7869 //assert(EndianBig == 0);7902 //assert(EndianBig == 0);
7870 //assert(EndianLittle == 1);7903 //assert(EndianLittle == 1);
7871 }7904 }
7905 {
7906 buf_appendf(contents,
7907 "pub const SubSystem = enum {\n"
7908 " Console,\n"
7909 " Windows,\n"
7910 " Posix,\n"
7911 " Native,\n"
7912 " EfiApplication,\n"
7913 " EfiBootServiceDriver,\n"
7914 " EfiRom,\n"
7915 " EfiRuntimeDriver,\n"
7916 "};\n\n");
7917
7918 assert(TargetSubsystemConsole == 0);
7919 assert(TargetSubsystemWindows == 1);
7920 assert(TargetSubsystemPosix == 2);
7921 assert(TargetSubsystemNative == 3);
7922 assert(TargetSubsystemEfiApplication == 4);
7923 assert(TargetSubsystemEfiBootServiceDriver == 5);
7924 assert(TargetSubsystemEfiRom == 6);
7925 assert(TargetSubsystemEfiRuntimeDriver == 7);
7926 }
7872 {7927 {
7873 const char *endian_str = g->is_big_endian ? "Endian.Big" : "Endian.Little";7928 const char *endian_str = g->is_big_endian ? "Endian.Big" : "Endian.Little";
7874 buf_appendf(contents, "pub const endian = %s;\n", endian_str);7929 buf_appendf(contents, "pub const endian = %s;\n", endian_str);
...@@ -7885,6 +7940,13 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {...@@ -7885,6 +7940,13 @@ Buf *codegen_generate_builtin_source(CodeGen *g) {
7885 buf_appendf(contents, "pub const valgrind_support = %s;\n", bool_to_str(want_valgrind_support(g)));7940 buf_appendf(contents, "pub const valgrind_support = %s;\n", bool_to_str(want_valgrind_support(g)));
7886 buf_appendf(contents, "pub const position_independent_code = %s;\n", bool_to_str(g->have_pic));7941 buf_appendf(contents, "pub const position_independent_code = %s;\n", bool_to_str(g->have_pic));
78877942
7943 {
7944 TargetSubsystem detected_subsystem = detect_subsystem(g);
7945 if (detected_subsystem != TargetSubsystemAuto) {
7946 buf_appendf(contents, "pub const subsystem = SubSystem.%s;\n", subsystem_to_str(detected_subsystem));
7947 }
7948 }
7949
7888 if (g->is_test_build) {7950 if (g->is_test_build) {
7889 buf_appendf(contents,7951 buf_appendf(contents,
7890 "const TestFn = struct {\n"7952 "const TestFn = struct {\n"
...@@ -7928,6 +7990,7 @@ static Error define_builtin_compile_vars(CodeGen *g) {...@@ -7928,6 +7990,7 @@ static Error define_builtin_compile_vars(CodeGen *g) {
7928 cache_bool(&cache_hash, g->have_err_ret_tracing);7990 cache_bool(&cache_hash, g->have_err_ret_tracing);
7929 cache_bool(&cache_hash, g->libc_link_lib != nullptr);7991 cache_bool(&cache_hash, g->libc_link_lib != nullptr);
7930 cache_bool(&cache_hash, g->valgrind_support);7992 cache_bool(&cache_hash, g->valgrind_support);
7993 cache_int(&cache_hash, detect_subsystem(g));
79317994
7932 Buf digest = BUF_INIT;7995 Buf digest = BUF_INIT;
7933 buf_resize(&digest, 0);7996 buf_resize(&digest, 0);
...@@ -7995,10 +8058,6 @@ static void init(CodeGen *g) {...@@ -7995,10 +8058,6 @@ static void init(CodeGen *g) {
7995 g->is_single_threaded = true;8058 g->is_single_threaded = true;
7996 }8059 }
79978060
7998 if (g->is_test_build) {
7999 g->subsystem = g->subsystem == TargetSubsystemAuto ? TargetSubsystemConsole : g->subsystem;
8000 }
8001
8002 assert(g->root_out_name);8061 assert(g->root_out_name);
8003 g->module = LLVMModuleCreateWithName(buf_ptr(g->root_out_name));8062 g->module = LLVMModuleCreateWithName(buf_ptr(g->root_out_name));
80048063
...@@ -9352,7 +9411,7 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) {...@@ -9352,7 +9411,7 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) {
9352 cache_int(ch, g->zig_target->vendor);9411 cache_int(ch, g->zig_target->vendor);
9353 cache_int(ch, g->zig_target->os);9412 cache_int(ch, g->zig_target->os);
9354 cache_int(ch, g->zig_target->abi);9413 cache_int(ch, g->zig_target->abi);
9355 cache_int(ch, g->subsystem);9414 cache_int(ch, detect_subsystem(g));
9356 cache_bool(ch, g->strip_debug_symbols);9415 cache_bool(ch, g->strip_debug_symbols);
9357 cache_bool(ch, g->is_test_build);9416 cache_bool(ch, g->is_test_build);
9358 if (g->is_test_build) {9417 if (g->is_test_build) {
src/codegen.hpp+2
...@@ -56,4 +56,6 @@ void codegen_translate_c(CodeGen *g, Buf *full_path, FILE *out_file, bool use_us...@@ -56,4 +56,6 @@ void codegen_translate_c(CodeGen *g, Buf *full_path, FILE *out_file, bool use_us
5656
57Buf *codegen_generate_builtin_source(CodeGen *g);57Buf *codegen_generate_builtin_source(CodeGen *g);
5858
59TargetSubsystem detect_subsystem(CodeGen *g);
60
59#endif61#endif
src/link.cpp+2-2
...@@ -1225,7 +1225,7 @@ static void add_mingw_link_args(LinkJob *lj, bool is_library) {...@@ -1225,7 +1225,7 @@ static void add_mingw_link_args(LinkJob *lj, bool is_library) {
1225 lj->args.append(get_libc_file(g->libc, "libmingwex.a"));1225 lj->args.append(get_libc_file(g->libc, "libmingwex.a"));
1226 lj->args.append(get_libc_file(g->libc, "libmsvcrt.a"));1226 lj->args.append(get_libc_file(g->libc, "libmsvcrt.a"));
12271227
1228 if (g->subsystem == TargetSubsystemWindows) {1228 if (detect_subsystem(g) == TargetSubsystemWindows) {
1229 lj->args.append(get_libc_file(g->libc, "libgdi32.a"));1229 lj->args.append(get_libc_file(g->libc, "libgdi32.a"));
1230 lj->args.append(get_libc_file(g->libc, "libcomdlg32.a"));1230 lj->args.append(get_libc_file(g->libc, "libcomdlg32.a"));
1231 }1231 }
...@@ -1307,7 +1307,7 @@ static void construct_linker_job_coff(LinkJob *lj) {...@@ -1307,7 +1307,7 @@ static void construct_linker_job_coff(LinkJob *lj) {
1307 lj->args.append((const char *)buf_ptr(g->link_objects.at(i)));1307 lj->args.append((const char *)buf_ptr(g->link_objects.at(i)));
1308 }1308 }
13091309
1310 switch (g->subsystem) {1310 switch (detect_subsystem(g)) {
1311 case TargetSubsystemAuto:1311 case TargetSubsystemAuto:
1312 if (g->zig_target->os == OsUefi) {1312 if (g->zig_target->os == OsUefi) {
1313 add_uefi_link_args(lj);1313 add_uefi_link_args(lj);
src/target.hpp+5-1
...@@ -62,7 +62,6 @@ enum SubArchList {...@@ -62,7 +62,6 @@ enum SubArchList {
62};62};
6363
64enum TargetSubsystem {64enum TargetSubsystem {
65 TargetSubsystemAuto, // Zig should infer the subsystem
66 TargetSubsystemConsole,65 TargetSubsystemConsole,
67 TargetSubsystemWindows,66 TargetSubsystemWindows,
68 TargetSubsystemPosix,67 TargetSubsystemPosix,
...@@ -71,6 +70,11 @@ enum TargetSubsystem {...@@ -71,6 +70,11 @@ enum TargetSubsystem {
71 TargetSubsystemEfiBootServiceDriver,70 TargetSubsystemEfiBootServiceDriver,
72 TargetSubsystemEfiRom,71 TargetSubsystemEfiRom,
73 TargetSubsystemEfiRuntimeDriver,72 TargetSubsystemEfiRuntimeDriver,
73
74 // This means Zig should infer the subsystem.
75 // It's last so that the indexes of other items can line up
76 // with the enum in builtin.zig.
77 TargetSubsystemAuto
74};78};
7579
76struct ZigTarget {80struct ZigTarget {