authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-12-26 15:26:53-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-12-26 15:26:53-05:00
log2b7e29f791146e901e0479d2af20f1a91ec7165b
treead8ad8079a40065a9121c397e7d4b41d431dbf70
parent280187031a68c577e84c72add037271153d27c62
parenta918ce26b81b8e51c061d85631aa432a025c1ee2
signature Commit is signed but in an unrecognized format.

Merge branch 'nebulaeonline-nebulaeonline'

Zig gains the UEFI OS target

16 files changed, 284 insertions(+), 181 deletions(-)

CMakeLists.txt+1
......@@ -590,6 +590,7 @@ set(ZIG_STD_FILES
590590 "os/freebsd/x86_64.zig"
591591 "os/path.zig"
592592 "os/time.zig"
593 "os/uefi.zig"
593594 "os/windows/advapi32.zig"
594595 "os/windows/error.zig"
595596 "os/windows/index.zig"
README.md+20-20
......@@ -87,26 +87,26 @@ clarity.
8787
8888#### Support Table
8989
90| | freestanding | linux | macosx | windows | freebsd | other |
91|--------|--------------|--------|--------|---------|---------|--------|
92|x86_64 | Tier 2 | Tier 1 | Tier 1 | Tier 1 | Tier 2 | Tier 3 |
93|i386 | Tier 2 | Tier 2 | Tier 2 | Tier 2 | Tier 3 | Tier 3 |
94|arm | Tier 2 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
95|arm64 | Tier 2 | Tier 2 | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
96|bpf | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 |
97|hexagon | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 |
98|mips | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 |
99|powerpc | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 |
100|r600 | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 |
101|amdgcn | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 |
102|sparc | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 |
103|s390x | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 |
104|spir | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 |
105|lanai | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 |
106|wasm32 | Tier 4 | N/A | N/A | N/A | N/A | N/A |
107|wasm64 | Tier 4 | N/A | N/A | N/A | N/A | N/A |
108|riscv32 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 |
109|riscv64 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 |
90| | freestanding | linux | macosx | windows | freebsd | UEFI | other |
91|--------|--------------|--------|--------|---------|---------|--------|--------|
92|x86_64 | Tier 2 | Tier 1 | Tier 1 | Tier 1 | Tier 2 | Tier 2 | Tier 3 |
93|i386 | Tier 2 | Tier 2 | Tier 2 | Tier 2 | Tier 3 | Tier 3 | Tier 3 |
94|arm | Tier 2 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
95|arm64 | Tier 2 | Tier 2 | Tier 3 | Tier 3 | Tier 3 | Tier 3 | Tier 3 |
96|bpf | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 |
97|hexagon | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 |
98|mips | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 |
99|powerpc | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 |
100|r600 | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 |
101|amdgcn | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 |
102|sparc | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 |
103|s390x | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 |
104|spir | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 |
105|lanai | Tier 3 | Tier 3 | N/A | N/A | Tier 3 | Tier 3 | Tier 3 |
106|wasm32 | Tier 4 | N/A | N/A | N/A | N/A | N/A | N/A |
107|wasm64 | Tier 4 | N/A | N/A | N/A | N/A | N/A | N/A |
108|riscv32 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | Tier 4 |
109|riscv64 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | Tier 4 |
110110
111111## Community
112112
src-self-hosted/target.zig+1-1
......@@ -520,7 +520,7 @@ pub const Target = union(enum) {
520520 => return 64,
521521 },
522522
523 builtin.Os.windows => switch (id) {
523 builtin.Os.windows, builtin.Os.uefi => switch (id) {
524524 CInt.Id.Short,
525525 CInt.Id.UShort,
526526 => return 16,
src/all_types.hpp+1-2
......@@ -1750,12 +1750,11 @@ struct CodeGen {
17501750 BuildMode build_mode;
17511751 OutType out_type;
17521752 ZigTarget zig_target;
1753 TargetSubsystem subsystem;
17531754 bool is_static;
17541755 bool strip_debug_symbols;
17551756 bool is_test_build;
17561757 bool is_native_target;
1757 bool windows_subsystem_windows;
1758 bool windows_subsystem_console;
17591758 bool linker_rdynamic;
17601759 bool no_rosegment_workaround;
17611760 bool each_lib_rpath;
src/analyze.cpp+4-6
......@@ -3203,14 +3203,12 @@ void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, Buf *symbol_name, GlobalLi
32033203 if (ccc) {
32043204 if (buf_eql_str(symbol_name, "main") && g->libc_link_lib != nullptr) {
32053205 g->have_c_main = true;
3206 g->windows_subsystem_windows = false;
3207 g->windows_subsystem_console = true;
3206 g->subsystem = TargetSubsystemConsole;
32083207 } else if (buf_eql_str(symbol_name, "WinMain") &&
32093208 g->zig_target.os == OsWindows)
32103209 {
32113210 g->have_winmain = true;
3212 g->windows_subsystem_windows = true;
3213 g->windows_subsystem_console = false;
3211 g->subsystem = TargetSubsystemWindows;
32143212 } else if (buf_eql_str(symbol_name, "WinMainCRTStartup") &&
32153213 g->zig_target.os == OsWindows)
32163214 {
......@@ -3221,6 +3219,7 @@ void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, Buf *symbol_name, GlobalLi
32213219 g->have_dllmain_crt_startup = true;
32223220 }
32233221 }
3222
32243223 FnExport *fn_export = fn_table_entry->export_list.add_one();
32253224 memset(fn_export, 0, sizeof(FnExport));
32263225 buf_init_from_buf(&fn_export->name, symbol_name);
......@@ -4376,8 +4375,7 @@ ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *r
43764375 if (is_pub && ok_cc) {
43774376 if (buf_eql_str(proto_name, "main")) {
43784377 g->have_pub_main = true;
4379 g->windows_subsystem_windows = false;
4380 g->windows_subsystem_console = true;
4378 g->subsystem = TargetSubsystemConsole;
43814379 } else if (buf_eql_str(proto_name, "panic")) {
43824380 g->have_pub_panic = true;
43834381 }
src/codegen.cpp+4-10
......@@ -291,11 +291,6 @@ void codegen_add_framework(CodeGen *g, const char *framework) {
291291 g->darwin_frameworks.append(buf_create_from_str(framework));
292292}
293293
294void codegen_set_windows_subsystem(CodeGen *g, bool mwindows, bool mconsole) {
295 g->windows_subsystem_windows = mwindows;
296 g->windows_subsystem_console = mconsole;
297}
298
299294void codegen_set_mmacosx_version_min(CodeGen *g, Buf *mmacosx_version_min) {
300295 g->mmacosx_version_min = mmacosx_version_min;
301296}
......@@ -7236,8 +7231,7 @@ static void init(CodeGen *g) {
72367231 }
72377232
72387233 if (g->is_test_build) {
7239 g->windows_subsystem_windows = false;
7240 g->windows_subsystem_console = true;
7234 g->subsystem = TargetSubsystemConsole;
72417235 }
72427236
72437237 assert(g->root_out_name);
......@@ -7273,7 +7267,7 @@ static void init(CodeGen *g) {
72737267 // LLVM creates invalid binaries on Windows sometimes.
72747268 // See https://github.com/ziglang/zig/issues/508
72757269 // As a workaround we do not use target native features on Windows.
7276 if (g->zig_target.os == OsWindows) {
7270 if (g->zig_target.os == OsWindows || g->zig_target.os == OsUefi) {
72777271 target_specific_cpu_args = "";
72787272 target_specific_features = "";
72797273 } else {
......@@ -7519,6 +7513,7 @@ static void gen_root_source(CodeGen *g) {
75197513 report_errors_and_maybe_exit(g);
75207514
75217515 if (!g->is_test_build && g->zig_target.os != OsFreestanding &&
7516 g->zig_target.os != OsUefi &&
75227517 !g->have_c_main && !g->have_winmain && !g->have_winmain_crt_startup &&
75237518 ((g->have_pub_main && g->out_type == OutTypeObj) || g->out_type == OutTypeExe))
75247519 {
......@@ -8075,12 +8070,11 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) {
80758070 cache_int(ch, g->zig_target.os);
80768071 cache_int(ch, g->zig_target.env_type);
80778072 cache_int(ch, g->zig_target.oformat);
8073 cache_int(ch, g->subsystem);
80788074 cache_bool(ch, g->is_static);
80798075 cache_bool(ch, g->strip_debug_symbols);
80808076 cache_bool(ch, g->is_test_build);
80818077 cache_bool(ch, g->is_native_target);
8082 cache_bool(ch, g->windows_subsystem_windows);
8083 cache_bool(ch, g->windows_subsystem_console);
80848078 cache_bool(ch, g->linker_rdynamic);
80858079 cache_bool(ch, g->no_rosegment_workaround);
80868080 cache_bool(ch, g->each_lib_rpath);
src/codegen.hpp-1
......@@ -33,7 +33,6 @@ void codegen_set_libc_include_dir(CodeGen *codegen, Buf *libc_include_dir);
3333void codegen_set_msvc_lib_dir(CodeGen *g, Buf *msvc_lib_dir);
3434void codegen_set_kernel32_lib_dir(CodeGen *codegen, Buf *kernel32_lib_dir);
3535void codegen_set_dynamic_linker(CodeGen *g, Buf *dynamic_linker);
36void codegen_set_windows_subsystem(CodeGen *g, bool mwindows, bool mconsole);
3736void codegen_add_lib_dir(CodeGen *codegen, const char *dir);
3837void codegen_add_forbidden_lib(CodeGen *codegen, Buf *lib);
3938LinkLib *codegen_add_link_lib(CodeGen *codegen, Buf *lib);
src/link.cpp+177-127
......@@ -444,72 +444,19 @@ static bool zig_lld_link(ZigLLVM_ObjectFormatType oformat, const char **args, si
444444 return ZigLLDLink(oformat, args, arg_count, link_diag_callback, diag);
445445}
446446
447static void construct_linker_job_coff(LinkJob *lj) {
448 CodeGen *g = lj->codegen;
449
450 lj->args.append("/ERRORLIMIT:0");
451
452 if (g->libc_link_lib != nullptr) {
453 find_libc_lib_path(g);
454 }
455
456 lj->args.append("-NOLOGO");
457
458 if (!g->strip_debug_symbols) {
459 lj->args.append("-DEBUG");
460 }
461
462 if (g->out_type == OutTypeExe) {
463 // TODO compile time stack upper bound detection
464 lj->args.append("/STACK:16777216");
465 }
466
467 coff_append_machine_arg(g, &lj->args);
468
469 if (g->windows_subsystem_windows) {
470 lj->args.append("/SUBSYSTEM:windows");
471 } else if (g->windows_subsystem_console) {
472 lj->args.append("/SUBSYSTEM:console");
473 }
474 // The commented out stuff is from when we linked with MinGW
475 // Now that we're linking with LLD it remains to be determined
476 // how to handle --target-environ gnu
477 // These comments are a clue
478
479 bool is_library = g->out_type == OutTypeLib;
480 //bool dll = g->out_type == OutTypeLib;
481 //bool shared = !g->is_static && dll;
482 //if (g->is_static) {
483 // lj->args.append("-Bstatic");
484 //} else {
485 // if (dll) {
486 // lj->args.append("--dll");
487 // } else if (shared) {
488 // lj->args.append("--shared");
489 // }
490 // lj->args.append("-Bdynamic");
491 // if (dll || shared) {
492 // lj->args.append("-e");
493 // if (g->zig_target.arch.arch == ZigLLVM_x86) {
494 // lj->args.append("_DllMainCRTStartup@12");
495 // } else {
496 // lj->args.append("DllMainCRTStartup");
497 // }
498 // lj->args.append("--enable-auto-image-base");
499 // }
500 //}
501
502 lj->args.append(buf_ptr(buf_sprintf("-OUT:%s", buf_ptr(&g->output_file_path))));
503
504 if (g->libc_link_lib != nullptr) {
505 lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->msvc_lib_dir))));
506 lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->kernel32_lib_dir))));
447static void add_uefi_link_args(LinkJob *lj) {
448 lj->args.append("/BASE:0");
449 lj->args.append("/ENTRY:EfiMain");
450 lj->args.append("/OPT:REF");
451 lj->args.append("/SAFESEH:NO");
452 lj->args.append("/MERGE:.rdata=.data");
453 lj->args.append("/ALIGN:32");
454 lj->args.append("/NODEFAULTLIB");
455 lj->args.append("/SECTION:.xdata,D");
456}
507457
508 lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->libc_lib_dir))));
509 if (g->libc_static_lib_dir != nullptr) {
510 lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->libc_static_lib_dir))));
511 }
512 }
458static void add_nt_link_args(LinkJob *lj, bool is_library) {
459 CodeGen *g = lj->codegen;
513460
514461 if (lj->link_in_crt) {
515462 const char *lib_str = g->is_static ? "lib" : "";
......@@ -533,29 +480,180 @@ static void construct_linker_job_coff(LinkJob *lj) {
533480 //https://msdn.microsoft.com/en-us/library/bb531344.aspx
534481 lj->args.append("legacy_stdio_definitions.lib");
535482
536 //if (shared || dll) {
537 // lj->args.append(get_libc_file(g, "dllcrt2.o"));
538 //} else {
539 // if (g->windows_linker_unicode) {
540 // lj->args.append(get_libc_file(g, "crt2u.o"));
541 // } else {
542 // lj->args.append(get_libc_file(g, "crt2.o"));
543 // }
544 //}
545 //lj->args.append(get_libc_static_file(g, "crtbegin.o"));
546
547483 // msvcrt depends on kernel32
548484 lj->args.append("kernel32.lib");
549485 } else {
550 lj->args.append("-NODEFAULTLIB");
486 lj->args.append("/NODEFAULTLIB");
551487 if (!is_library) {
552488 if (g->have_winmain) {
553 lj->args.append("-ENTRY:WinMain");
489 lj->args.append("/ENTRY:WinMain");
554490 } else {
555 lj->args.append("-ENTRY:WinMainCRTStartup");
491 lj->args.append("/ENTRY:WinMainCRTStartup");
556492 }
557493 }
558494 }
495}
496
497// These are n actual command lines from LINK.EXE UEFI builds (app & driver) to be used as guidance cleaning
498// up a bit for building the COFF linker args:
499// /OUT:"J:\coding\nebulae\k\x64\Release\k.efi" /LTCG:incremental /Driver /PDB:"J:\coding\nebulae\k\x64\Release\k.pdb" "UefiApplicationEntryPoint.lib" "UefiRuntimeLib.lib" "UefiHiiLib.lib" "UefiHiiServicesLib.lib" "UefiSortLib.lib" "UefiShellLib.lib" "GlueLib.lib" "BaseLib.lib" "BaseDebugPrintErrorLevelLib.lib" "BasePrintLib.lib" "UefiLib.lib" "UefiBootServicesTableLib.lib" "UefiRuntimeServicesTableLib.lib" "UefiDevicePathLibDevicePathProtocol.lib" "UefiDebugLibConOut.lib" "UefiMemoryLib.lib" "UefiMemoryAllocationLib.lib" "BaseSynchronizationLib.lib" "UefiFileHandleLib.lib" /IMPLIB:"J:\coding\nebulae\k\x64\Release\k.lib" /DEBUG:FASTLINK /BASE:"0" /MACHINE:X64 /ENTRY:"EfiMain" /OPT:REF /SAFESEH:NO /SUBSYSTEM:EFI_APPLICATION /MERGE:".rdata=.data" /NOLOGO /ALIGN:32 /NODEFAULTLIB /SECTION:".xdata,D"
500// /OUT:"J:\coding\VisualUefi\samples\x64\Release\UefiDriver.efi" /LTCG:incremental /Driver /PDB:"J:\coding\VisualUefi\samples\x64\Release\UefiDriver.pdb" "UefiDriverEntryPoint.lib" "UefiHiiLib.lib" "UefiHiiServicesLib.lib" "UefiSortLib.lib" "UefiShellLib.lib" "GlueLib.lib" "BaseLib.lib" "BaseDebugPrintErrorLevelLib.lib" "BasePrintLib.lib" "UefiLib.lib" "UefiBootServicesTableLib.lib" "UefiRuntimeServicesTableLib.lib" "UefiDevicePathLibDevicePathProtocol.lib" "UefiDebugLibConOut.lib" "UefiMemoryLib.lib" "UefiMemoryAllocationLib.lib" "BaseSynchronizationLib.lib" "UefiFileHandleLib.lib" /IMPLIB:"J:\coding\VisualUefi\samples\x64\Release\UefiDriver.lib" /DEBUG:FASTLINK /BASE:"0" /MACHINE:X64 /ENTRY:"EfiMain" /OPT:REF /SAFESEH:NO /SUBSYSTEM:EFI_BOOT_SERVICE_DRIVER /MERGE:".rdata=.data" /NOLOGO /ALIGN:32 /NODEFAULTLIB /SECTION:".xdata,D"
501// This commented out stuff is from when we linked with MinGW
502// Now that we're linking with LLD it remains to be determined
503// how to handle --target-environ gnu
504// These comments are a clue
505//bool dll = g->out_type == OutTypeLib;
506//bool shared = !g->is_static && dll;
507//if (g->is_static) {
508// lj->args.append("-Bstatic");
509//} else {
510// if (dll) {
511// lj->args.append("--dll");
512// } else if (shared) {
513// lj->args.append("--shared");
514// }
515// lj->args.append("-Bdynamic");
516// if (dll || shared) {
517// lj->args.append("-e");
518// if (g->zig_target.arch.arch == ZigLLVM_x86) {
519// lj->args.append("_DllMainCRTStartup@12");
520// } else {
521// lj->args.append("DllMainCRTStartup");
522// }
523// lj->args.append("--enable-auto-image-base");
524// }
525//}
526//if (shared || dll) {
527// lj->args.append(get_libc_file(g, "dllcrt2.o"));
528//} else {
529// if (g->windows_linker_unicode) {
530// lj->args.append(get_libc_file(g, "crt2u.o"));
531// } else {
532// lj->args.append(get_libc_file(g, "crt2.o"));
533// }
534//}
535//lj->args.append(get_libc_static_file(g, "crtbegin.o"));
536//if (g->libc_link_lib != nullptr) {
537//if (g->is_static) {
538// lj->args.append("--start-group");
539//}
540
541//lj->args.append("-lmingw32");
542
543//lj->args.append("-lgcc");
544//bool is_android = (g->zig_target.env_type == ZigLLVM_Android);
545//bool is_cyg_ming = is_target_cyg_mingw(&g->zig_target);
546//if (!g->is_static && !is_android) {
547// if (!is_cyg_ming) {
548// lj->args.append("--as-needed");
549// }
550// //lj->args.append("-lgcc_s");
551// if (!is_cyg_ming) {
552// lj->args.append("--no-as-needed");
553// }
554//}
555//if (g->is_static && !is_android) {
556// //lj->args.append("-lgcc_eh");
557//}
558//if (is_android && !g->is_static) {
559// lj->args.append("-ldl");
560//}
561
562//lj->args.append("-lmoldname");
563//lj->args.append("-lmingwex");
564//lj->args.append("-lmsvcrt");
565
566
567//if (g->windows_subsystem_windows) {
568// lj->args.append("-lgdi32");
569// lj->args.append("-lcomdlg32");
570//}
571//lj->args.append("-ladvapi32");
572//lj->args.append("-lshell32");
573//lj->args.append("-luser32");
574//lj->args.append("-lkernel32");
575
576//if (g->is_static) {
577// lj->args.append("--end-group");
578//}
579
580//if (lj->link_in_crt) {
581// lj->args.append(get_libc_static_file(g, "crtend.o"));
582//}
583//}
584
585
586static void construct_linker_job_coff(LinkJob *lj) {
587 CodeGen *g = lj->codegen;
588
589 lj->args.append("/ERRORLIMIT:0");
590
591 if (g->libc_link_lib != nullptr) {
592 find_libc_lib_path(g);
593 }
594
595 lj->args.append("/NOLOGO");
596
597 if (!g->strip_debug_symbols) {
598 lj->args.append("/DEBUG");
599 }
600
601 if (g->out_type == OutTypeExe) {
602 // TODO compile time stack upper bound detection
603 lj->args.append("/STACK:16777216");
604 }
605
606 coff_append_machine_arg(g, &lj->args);
607
608 bool is_library = g->out_type == OutTypeLib;
609 switch (g->subsystem) {
610 case TargetSubsystemAuto:
611 break;
612 case TargetSubsystemConsole:
613 lj->args.append("/SUBSYSTEM:console");
614 add_nt_link_args(lj, is_library);
615 break;
616 case TargetSubsystemEfiApplication:
617 lj->args.append("/SUBSYSTEM:efi_application");
618 add_uefi_link_args(lj);
619 break;
620 case TargetSubsystemEfiBootServiceDriver:
621 lj->args.append("/SUBSYSTEM:efi_boot_service_driver");
622 add_uefi_link_args(lj);
623 break;
624 case TargetSubsystemEfiRom:
625 lj->args.append("/SUBSYSTEM:efi_rom");
626 add_uefi_link_args(lj);
627 break;
628 case TargetSubsystemEfiRuntimeDriver:
629 lj->args.append("/SUBSYSTEM:efi_runtime_driver");
630 add_uefi_link_args(lj);
631 break;
632 case TargetSubsystemNative:
633 lj->args.append("/SUBSYSTEM:native");
634 add_nt_link_args(lj, is_library);
635 break;
636 case TargetSubsystemPosix:
637 lj->args.append("/SUBSYSTEM:posix");
638 add_nt_link_args(lj, is_library);
639 break;
640 case TargetSubsystemWindows:
641 lj->args.append("/SUBSYSTEM:windows");
642 add_nt_link_args(lj, is_library);
643 break;
644 }
645
646 lj->args.append(buf_ptr(buf_sprintf("-OUT:%s", buf_ptr(&g->output_file_path))));
647
648 if (g->libc_link_lib != nullptr) {
649 lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->msvc_lib_dir))));
650 lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->kernel32_lib_dir))));
651
652 lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->libc_lib_dir))));
653 if (g->libc_static_lib_dir != nullptr) {
654 lj->args.append(buf_ptr(buf_sprintf("-LIBPATH:%s", buf_ptr(g->libc_static_lib_dir))));
655 }
656 }
559657
560658 if (is_library && !g->is_static) {
561659 lj->args.append("-DLL");
......@@ -627,54 +725,6 @@ static void construct_linker_job_coff(LinkJob *lj) {
627725 }
628726 }
629727
630 //if (g->libc_link_lib != nullptr) {
631 //if (g->is_static) {
632 // lj->args.append("--start-group");
633 //}
634
635 //lj->args.append("-lmingw32");
636
637 //lj->args.append("-lgcc");
638 //bool is_android = (g->zig_target.env_type == ZigLLVM_Android);
639 //bool is_cyg_ming = is_target_cyg_mingw(&g->zig_target);
640 //if (!g->is_static && !is_android) {
641 // if (!is_cyg_ming) {
642 // lj->args.append("--as-needed");
643 // }
644 // //lj->args.append("-lgcc_s");
645 // if (!is_cyg_ming) {
646 // lj->args.append("--no-as-needed");
647 // }
648 //}
649 //if (g->is_static && !is_android) {
650 // //lj->args.append("-lgcc_eh");
651 //}
652 //if (is_android && !g->is_static) {
653 // lj->args.append("-ldl");
654 //}
655
656 //lj->args.append("-lmoldname");
657 //lj->args.append("-lmingwex");
658 //lj->args.append("-lmsvcrt");
659
660
661 //if (g->windows_subsystem_windows) {
662 // lj->args.append("-lgdi32");
663 // lj->args.append("-lcomdlg32");
664 //}
665 //lj->args.append("-ladvapi32");
666 //lj->args.append("-lshell32");
667 //lj->args.append("-luser32");
668 //lj->args.append("-lkernel32");
669
670 //if (g->is_static) {
671 // lj->args.append("--end-group");
672 //}
673
674 //if (lj->link_in_crt) {
675 // lj->args.append(get_libc_static_file(g, "crtend.o"));
676 //}
677 //}
678728}
679729
680730
src/main.cpp+35-9
......@@ -90,8 +90,7 @@ static int print_full_usage(const char *arg0) {
9090 " -rdynamic add all symbols to the dynamic symbol table\n"
9191 " -rpath [path] add directory to the runtime library search path\n"
9292 " --no-rosegment compromise security to workaround valgrind bug\n"
93 " -mconsole (windows) --subsystem console to the linker\n"
94 " -mwindows (windows) --subsystem windows to the linker\n"
93 " --subsystem [subsystem] (windows) /SUBSYSTEM:<subsystem> to the linker\n"
9594 " -framework [name] (darwin) link against framework\n"
9695 " -mios-version-min [ver] (darwin) set iOS deployment target\n"
9796 " -mmacosx-version-min [ver] (darwin) set Mac OS X deployment target\n"
......@@ -371,8 +370,6 @@ int main(int argc, char **argv) {
371370 const char *target_arch = nullptr;
372371 const char *target_os = nullptr;
373372 const char *target_environ = nullptr;
374 bool mwindows = false;
375 bool mconsole = false;
376373 bool rdynamic = false;
377374 const char *mmacosx_version_min = nullptr;
378375 const char *mios_version_min = nullptr;
......@@ -395,6 +392,7 @@ int main(int argc, char **argv) {
395392 int runtime_args_start = -1;
396393 bool no_rosegment_workaround = false;
397394 bool system_linker_hack = false;
395 TargetSubsystem subsystem = TargetSubsystemAuto;
398396
399397 if (argc >= 2 && strcmp(argv[1], "build") == 0) {
400398 Buf zig_exe_path_buf = BUF_INIT;
......@@ -540,10 +538,6 @@ int main(int argc, char **argv) {
540538 verbose_llvm_ir = true;
541539 } else if (strcmp(arg, "--verbose-cimport") == 0) {
542540 verbose_cimport = true;
543 } else if (strcmp(arg, "-mwindows") == 0) {
544 mwindows = true;
545 } else if (strcmp(arg, "-mconsole") == 0) {
546 mconsole = true;
547541 } else if (strcmp(arg, "-rdynamic") == 0) {
548542 rdynamic = true;
549543 } else if (strcmp(arg, "--no-rosegment") == 0) {
......@@ -687,6 +681,37 @@ int main(int argc, char **argv) {
687681 ver_patch = atoi(argv[i]);
688682 } else if (strcmp(arg, "--test-cmd") == 0) {
689683 test_exec_args.append(argv[i]);
684 } else if (strcmp(arg, "--subsystem") == 0) {
685 if (strcmp(argv[i], "console") == 0) {
686 subsystem = TargetSubsystemConsole;
687 } else if (strcmp(argv[i], "windows") == 0) {
688 subsystem = TargetSubsystemWindows;
689 } else if (strcmp(argv[i], "posix") == 0) {
690 subsystem = TargetSubsystemPosix;
691 } else if (strcmp(argv[i], "native") == 0) {
692 subsystem = TargetSubsystemNative;
693 } else if (strcmp(argv[i], "efi_application") == 0) {
694 subsystem = TargetSubsystemEfiApplication;
695 } else if (strcmp(argv[i], "efi_boot_service_driver") == 0) {
696 subsystem = TargetSubsystemEfiBootServiceDriver;
697 } else if (strcmp(argv[i], "efi_rom") == 0) {
698 subsystem = TargetSubsystemEfiRom;
699 } else if (strcmp(argv[i], "efi_runtime_driver") == 0) {
700 subsystem = TargetSubsystemEfiRuntimeDriver;
701 } else {
702 fprintf(stderr, "invalid: --subsystem %s\n"
703 "Options are:\n"
704 " console\n"
705 " windows\n"
706 " posix\n"
707 " native\n"
708 " efi_application\n"
709 " efi_boot_service_driver\n"
710 " efi_rom\n"
711 " efi_runtime_driver\n"
712 , argv[i]);
713 return EXIT_FAILURE;
714 }
690715 } else {
691716 fprintf(stderr, "Invalid argument: %s\n", arg);
692717 return print_error_usage(arg0);
......@@ -849,6 +874,8 @@ int main(int argc, char **argv) {
849874 buf_out_name = buf_create_from_str("run");
850875 }
851876 CodeGen *g = codegen_create(zig_root_source_file, target, out_type, build_mode, get_zig_lib_dir());
877 g->subsystem = subsystem;
878
852879 if (disable_pic) {
853880 if (out_type != OutTypeLib || !is_static) {
854881 fprintf(stderr, "--disable-pic only applies to static libraries");
......@@ -909,7 +936,6 @@ int main(int argc, char **argv) {
909936 codegen_add_rpath(g, rpath_list.at(i));
910937 }
911938
912 codegen_set_windows_subsystem(g, mwindows, mconsole);
913939 codegen_set_rdynamic(g, rdynamic);
914940 g->no_rosegment_workaround = no_rosegment_workaround;
915941 if (mmacosx_version_min && mios_version_min) {
src/target.cpp+9-2
......@@ -174,6 +174,7 @@ static const Os os_list[] = {
174174 OsContiki,
175175 OsAMDPAL,
176176 OsZen,
177 OsUefi,
177178};
178179
179180// Coordinate with zig_llvm.h
......@@ -282,6 +283,7 @@ ZigLLVM_OSType get_llvm_os_type(Os os_type) {
282283 case OsSolaris:
283284 return ZigLLVM_Solaris;
284285 case OsWindows:
286 case OsUefi:
285287 return ZigLLVM_Win32;
286288 case OsHaiku:
287289 return ZigLLVM_Haiku;
......@@ -394,6 +396,8 @@ const char *get_target_os_name(Os os_type) {
394396 return "freestanding";
395397 case OsZen:
396398 return "zen";
399 case OsUefi:
400 return "uefi";
397401 case OsAnanas:
398402 case OsCloudABI:
399403 case OsDragonFly:
......@@ -756,6 +760,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) {
756760 case CIntTypeCount:
757761 zig_unreachable();
758762 }
763 case OsUefi:
759764 case OsWindows:
760765 switch (id) {
761766 case CIntTypeShort:
......@@ -803,7 +808,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) {
803808}
804809
805810const char *target_o_file_ext(ZigTarget *target) {
806 if (target->env_type == ZigLLVM_MSVC || target->os == OsWindows) {
811 if (target->env_type == ZigLLVM_MSVC || target->os == OsWindows || target->os == OsUefi) {
807812 return ".obj";
808813 } else {
809814 return ".o";
......@@ -821,13 +826,15 @@ const char *target_llvm_ir_file_ext(ZigTarget *target) {
821826const char *target_exe_file_ext(ZigTarget *target) {
822827 if (target->os == OsWindows) {
823828 return ".exe";
829 } else if (target->os == OsUefi) {
830 return ".efi";
824831 } else {
825832 return "";
826833 }
827834}
828835
829836const char *target_lib_file_ext(ZigTarget *target, bool is_static, size_t version_major, size_t version_minor, size_t version_patch) {
830 if (target->os == OsWindows) {
837 if (target->os == OsWindows || target->os == OsUefi) {
831838 if (is_static) {
832839 return ".lib";
833840 } else {
src/target.hpp+13
......@@ -51,6 +51,19 @@ enum Os {
5151 OsContiki,
5252 OsAMDPAL,
5353 OsZen,
54 OsUefi,
55};
56
57enum TargetSubsystem {
58 TargetSubsystemAuto, // Zig should infer the subsystem
59 TargetSubsystemConsole,
60 TargetSubsystemWindows,
61 TargetSubsystemPosix,
62 TargetSubsystemNative,
63 TargetSubsystemEfiApplication,
64 TargetSubsystemEfiBootServiceDriver,
65 TargetSubsystemEfiRom,
66 TargetSubsystemEfiRuntimeDriver,
5467};
5568
5669struct ZigTarget {
src/translate_c.cpp+4-2
......@@ -4749,8 +4749,10 @@ Error parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, const
47494749 clang_argv.append("-isystem");
47504750 clang_argv.append(buf_ptr(codegen->zig_c_headers_dir));
47514751
4752 clang_argv.append("-isystem");
4753 clang_argv.append(buf_ptr(codegen->libc_include_dir));
4752 if (codegen->libc_include_dir != nullptr) {
4753 clang_argv.append("-isystem");
4754 clang_argv.append(buf_ptr(codegen->libc_include_dir));
4755 }
47544756
47554757 // windows c runtime requires -D_DEBUG if using debug libraries
47564758 if (codegen->build_mode == BuildModeDebug) {
std/debug/index.zig+1-1
......@@ -1135,7 +1135,7 @@ pub const DebugInfo = switch (builtin.os) {
11351135 return self.ofiles.allocator;
11361136 }
11371137 },
1138 builtin.Os.windows => struct {
1138 builtin.Os.uefi, builtin.Os.windows => struct {
11391139 pdb: pdb.Pdb,
11401140 coff: *coff.Coff,
11411141 sect_contribs: []pdb.SectionContribEntry,
std/os/index.zig+8
......@@ -18,6 +18,7 @@ test "std.os" {
1818 _ = @import("test.zig");
1919 _ = @import("time.zig");
2020 _ = @import("windows/index.zig");
21 _ = @import("uefi.zig");
2122 _ = @import("get_app_data_dir.zig");
2223}
2324
......@@ -26,6 +27,8 @@ pub const darwin = @import("darwin.zig");
2627pub const linux = @import("linux/index.zig");
2728pub const freebsd = @import("freebsd/index.zig");
2829pub const zen = @import("zen.zig");
30pub const uefi = @import("uefi.zig");
31
2932pub const posix = switch (builtin.os) {
3033 Os.linux => linux,
3134 Os.macosx, Os.ios => darwin,
......@@ -33,6 +36,7 @@ pub const posix = switch (builtin.os) {
3336 Os.zen => zen,
3437 else => @compileError("Unsupported OS"),
3538};
39
3640pub const net = @import("net.zig");
3741
3842pub const ChildProcess = @import("child_process.zig").ChildProcess;
......@@ -187,6 +191,10 @@ pub fn abort() noreturn {
187191 }
188192 windows.ExitProcess(3);
189193 },
194 Os.uefi => {
195 // TODO there's gotta be a better thing to do here than loop forever
196 while (true) {}
197 },
190198 else => @compileError("Unsupported OS"),
191199 }
192200}
std/os/uefi.zig created+2
......@@ -0,0 +1,2 @@
1// TODO this is where the extern declarations go. For example, see
2// inc/efilib.h in gnu-efi-code
std/special/panic.zig+4
......@@ -13,6 +13,10 @@ pub fn panic(msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn
1313 builtin.Os.freestanding, builtin.Os.zen => {
1414 while (true) {}
1515 },
16 builtin.Os.uefi => {
17 // TODO look into using the debug info and logging helpful messages
18 std.os.abort();
19 },
1620 else => {
1721 const first_trace_addr = @ptrToInt(@returnAddress());
1822 std.debug.panicExtra(error_return_trace, first_trace_addr, "{}", msg);