| author | |
| committer | |
| log | a918ce26b81b8e51c061d85631aa432a025c1ee2 |
| tree | ad8ad8079a40065a9121c397e7d4b41d431dbf70 |
| parent | f49b45b00fbdf3feaea7d8460bdbfd5935ff1ea1 |
| signature | Commit is signed but in an unrecognized format. |
17 files changed, 253 insertions(+), 259 deletions(-)
CMakeLists.txt+1-1| ... | @@ -590,7 +590,7 @@ set(ZIG_STD_FILES | ... | @@ -590,7 +590,7 @@ set(ZIG_STD_FILES |
| 590 | "os/freebsd/x86_64.zig" | 590 | "os/freebsd/x86_64.zig" |
| 591 | "os/path.zig" | 591 | "os/path.zig" |
| 592 | "os/time.zig" | 592 | "os/time.zig" |
| 593 | "os/uefi/index.zig" | 593 | "os/uefi.zig" |
| 594 | "os/windows/advapi32.zig" | 594 | "os/windows/advapi32.zig" |
| 595 | "os/windows/error.zig" | 595 | "os/windows/error.zig" |
| 596 | "os/windows/index.zig" | 596 | "os/windows/index.zig" |
README.md+20-20| ... | @@ -87,26 +87,26 @@ clarity. | ... | @@ -87,26 +87,26 @@ clarity. |
| 87 | 87 | ||
| 88 | #### Support Table | 88 | #### Support Table |
| 89 | 89 | ||
| 90 | | | freestanding | linux | macosx | windows | freebsd | other | | 90 | | | freestanding | linux | macosx | windows | freebsd | UEFI | other | |
| 91 | |--------|--------------|--------|--------|---------|---------|--------| | 91 | |--------|--------------|--------|--------|---------|---------|--------|--------| |
| 92 | |x86_64 | Tier 2 | Tier 1 | Tier 1 | Tier 1 | Tier 2 | Tier 3 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 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 | | 109 | |riscv64 | Tier 4 | Tier 4 | N/A | N/A | Tier 4 | Tier 4 | Tier 4 | |
| 110 | 110 | ||
| 111 | ## Community | 111 | ## Community |
| 112 | 112 |
src/all_types.hpp+1-1| ... | @@ -1750,11 +1750,11 @@ struct CodeGen { | ... | @@ -1750,11 +1750,11 @@ struct CodeGen { |
| 1750 | BuildMode build_mode; | 1750 | BuildMode build_mode; |
| 1751 | OutType out_type; | 1751 | OutType out_type; |
| 1752 | ZigTarget zig_target; | 1752 | ZigTarget zig_target; |
| 1753 | TargetSubsystem subsystem; | ||
| 1753 | bool is_static; | 1754 | bool is_static; |
| 1754 | bool strip_debug_symbols; | 1755 | bool strip_debug_symbols; |
| 1755 | bool is_test_build; | 1756 | bool is_test_build; |
| 1756 | bool is_native_target; | 1757 | bool is_native_target; |
| 1757 | ZigLLVM_MSVCSubsystemType msvc_subsystem; | ||
| 1758 | bool linker_rdynamic; | 1758 | bool linker_rdynamic; |
| 1759 | bool no_rosegment_workaround; | 1759 | bool no_rosegment_workaround; |
| 1760 | bool each_lib_rpath; | 1760 | bool each_lib_rpath; |
src/analyze.cpp+3-5| ... | @@ -3203,22 +3203,20 @@ void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, Buf *symbol_name, GlobalLi | ... | @@ -3203,22 +3203,20 @@ void add_fn_export(CodeGen *g, ZigFn *fn_table_entry, Buf *symbol_name, GlobalLi |
| 3203 | if (ccc) { | 3203 | if (ccc) { |
| 3204 | if (buf_eql_str(symbol_name, "main") && g->libc_link_lib != nullptr) { | 3204 | if (buf_eql_str(symbol_name, "main") && g->libc_link_lib != nullptr) { |
| 3205 | g->have_c_main = true; | 3205 | g->have_c_main = true; |
| 3206 | g->msvc_subsystem = ZigLLVM_MSVC_CONSOLE; | 3206 | g->subsystem = TargetSubsystemConsole; |
| 3207 | } else if (buf_eql_str(symbol_name, "WinMain") && | 3207 | } else if (buf_eql_str(symbol_name, "WinMain") && |
| 3208 | g->zig_target.os == OsWindows) | 3208 | g->zig_target.os == OsWindows) |
| 3209 | { | 3209 | { |
| 3210 | g->have_winmain = true; | 3210 | g->have_winmain = true; |
| 3211 | g->msvc_subsystem = ZigLLVM_MSVC_WINDOWS; | 3211 | g->subsystem = TargetSubsystemWindows; |
| 3212 | } else if (buf_eql_str(symbol_name, "WinMainCRTStartup") && | 3212 | } else if (buf_eql_str(symbol_name, "WinMainCRTStartup") && |
| 3213 | g->zig_target.os == OsWindows) | 3213 | g->zig_target.os == OsWindows) |
| 3214 | { | 3214 | { |
| 3215 | g->have_winmain_crt_startup = true; | 3215 | g->have_winmain_crt_startup = true; |
| 3216 | g->msvc_subsystem = ZigLLVM_MSVC_WINDOWS; | ||
| 3217 | } else if (buf_eql_str(symbol_name, "DllMainCRTStartup") && | 3216 | } else if (buf_eql_str(symbol_name, "DllMainCRTStartup") && |
| 3218 | g->zig_target.os == OsWindows) | 3217 | g->zig_target.os == OsWindows) |
| 3219 | { | 3218 | { |
| 3220 | g->have_dllmain_crt_startup = true; | 3219 | g->have_dllmain_crt_startup = true; |
| 3221 | g->msvc_subsystem = ZigLLVM_MSVC_WINDOWS; | ||
| 3222 | } | 3220 | } |
| 3223 | } | 3221 | } |
| 3224 | 3222 | ||
| ... | @@ -4377,7 +4375,7 @@ ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *r | ... | @@ -4377,7 +4375,7 @@ ImportTableEntry *add_source_file(CodeGen *g, PackageTableEntry *package, Buf *r |
| 4377 | if (is_pub && ok_cc) { | 4375 | if (is_pub && ok_cc) { |
| 4378 | if (buf_eql_str(proto_name, "main")) { | 4376 | if (buf_eql_str(proto_name, "main")) { |
| 4379 | g->have_pub_main = true; | 4377 | g->have_pub_main = true; |
| 4380 | g->msvc_subsystem = ZigLLVM_MSVC_CONSOLE; | 4378 | g->subsystem = TargetSubsystemConsole; |
| 4381 | } else if (buf_eql_str(proto_name, "panic")) { | 4379 | } else if (buf_eql_str(proto_name, "panic")) { |
| 4382 | g->have_pub_panic = true; | 4380 | g->have_pub_panic = true; |
| 4383 | } | 4381 | } |
src/codegen.cpp+3-3| ... | @@ -7231,7 +7231,7 @@ static void init(CodeGen *g) { | ... | @@ -7231,7 +7231,7 @@ static void init(CodeGen *g) { |
| 7231 | } | 7231 | } |
| 7232 | 7232 | ||
| 7233 | if (g->is_test_build) { | 7233 | if (g->is_test_build) { |
| 7234 | g->msvc_subsystem = ZigLLVM_MSVC_CONSOLE; | 7234 | g->subsystem = TargetSubsystemConsole; |
| 7235 | } | 7235 | } |
| 7236 | 7236 | ||
| 7237 | assert(g->root_out_name); | 7237 | assert(g->root_out_name); |
| ... | @@ -7513,7 +7513,7 @@ static void gen_root_source(CodeGen *g) { | ... | @@ -7513,7 +7513,7 @@ static void gen_root_source(CodeGen *g) { |
| 7513 | report_errors_and_maybe_exit(g); | 7513 | report_errors_and_maybe_exit(g); |
| 7514 | 7514 | ||
| 7515 | if (!g->is_test_build && g->zig_target.os != OsFreestanding && | 7515 | if (!g->is_test_build && g->zig_target.os != OsFreestanding && |
| 7516 | g->zig_target.os != OsZen && g->zig_target.os != OsUefi && | 7516 | g->zig_target.os != OsUefi && |
| 7517 | !g->have_c_main && !g->have_winmain && !g->have_winmain_crt_startup && | 7517 | !g->have_c_main && !g->have_winmain && !g->have_winmain_crt_startup && |
| 7518 | ((g->have_pub_main && g->out_type == OutTypeObj) || g->out_type == OutTypeExe)) | 7518 | ((g->have_pub_main && g->out_type == OutTypeObj) || g->out_type == OutTypeExe)) |
| 7519 | { | 7519 | { |
| ... | @@ -8070,11 +8070,11 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) { | ... | @@ -8070,11 +8070,11 @@ static Error check_cache(CodeGen *g, Buf *manifest_dir, Buf *digest) { |
| 8070 | cache_int(ch, g->zig_target.os); | 8070 | cache_int(ch, g->zig_target.os); |
| 8071 | cache_int(ch, g->zig_target.env_type); | 8071 | cache_int(ch, g->zig_target.env_type); |
| 8072 | cache_int(ch, g->zig_target.oformat); | 8072 | cache_int(ch, g->zig_target.oformat); |
| 8073 | cache_int(ch, g->subsystem); | ||
| 8073 | cache_bool(ch, g->is_static); | 8074 | cache_bool(ch, g->is_static); |
| 8074 | cache_bool(ch, g->strip_debug_symbols); | 8075 | cache_bool(ch, g->strip_debug_symbols); |
| 8075 | cache_bool(ch, g->is_test_build); | 8076 | cache_bool(ch, g->is_test_build); |
| 8076 | cache_bool(ch, g->is_native_target); | 8077 | cache_bool(ch, g->is_native_target); |
| 8077 | cache_int(ch, g->msvc_subsystem); | ||
| 8078 | cache_bool(ch, g->linker_rdynamic); | 8078 | cache_bool(ch, g->linker_rdynamic); |
| 8079 | cache_bool(ch, g->no_rosegment_workaround); | 8079 | cache_bool(ch, g->no_rosegment_workaround); |
| 8080 | cache_bool(ch, g->each_lib_rpath); | 8080 | cache_bool(ch, g->each_lib_rpath); |
src/ir.cpp+1-7| ... | @@ -17872,13 +17872,7 @@ static IrInstruction *ir_analyze_instruction_c_import(IrAnalyze *ira, IrInstruct | ... | @@ -17872,13 +17872,7 @@ static IrInstruction *ir_analyze_instruction_c_import(IrAnalyze *ira, IrInstruct |
| 17872 | if (type_is_invalid(cimport_result->value.type)) | 17872 | if (type_is_invalid(cimport_result->value.type)) |
| 17873 | return ira->codegen->invalid_instruction; | 17873 | return ira->codegen->invalid_instruction; |
| 17874 | 17874 | ||
| 17875 | if (ira->codegen->msvc_subsystem != ZigLLVM_MSVC_EFI_APPLICATION && | 17875 | find_libc_include_path(ira->codegen); |
| 17876 | 		ira->codegen->msvc_subsystem != ZigLLVM_MSVC_EFI_BOOT_SERVICE_DRIVER && | ||
| 17877 | 		ira->codegen->msvc_subsystem != ZigLLVM_MSVC_EFI_ROM && | ||
| 17878 | 		ira->codegen->msvc_subsystem != ZigLLVM_MSVC_EFI_RUNTIME_DRIVER) { | ||
| 17879 | |||
| 17880 | 		find_libc_include_path(ira->codegen); | ||
| 17881 | 	} | ||
| 17882 | 17876 | ||
| 17883 | ImportTableEntry *child_import = allocate<ImportTableEntry>(1); | 17877 | ImportTableEntry *child_import = allocate<ImportTableEntry>(1); |
| 17884 | child_import->decls_scope = create_decls_scope(ira->codegen, node, nullptr, nullptr, child_import); | 17878 | child_import->decls_scope = create_decls_scope(ira->codegen, node, nullptr, nullptr, child_import); |
src/link.cpp+161-149| ... | @@ -444,97 +444,20 @@ static bool zig_lld_link(ZigLLVM_ObjectFormatType oformat, const char **args, si | ... | @@ -444,97 +444,20 @@ static bool zig_lld_link(ZigLLVM_ObjectFormatType oformat, const char **args, si |
| 444 | return ZigLLDLink(oformat, args, arg_count, link_diag_callback, diag); | 444 | return ZigLLDLink(oformat, args, arg_count, link_diag_callback, diag); |
| 445 | } | 445 | } |
| 446 | 446 | ||
| 447 | static void construct_linker_job_coff(LinkJob *lj) { | 447 | static void add_uefi_link_args(LinkJob *lj) { |
| 448 | CodeGen *g = lj->codegen; | 448 | lj->args.append("/BASE:0"); |
| 449 | 449 | lj->args.append("/ENTRY:EfiMain"); | |
| 450 | lj->args.append("/ERRORLIMIT:0"); | 450 | lj->args.append("/OPT:REF"); |
| 451 | 451 | lj->args.append("/SAFESEH:NO"); | |
| 452 | if (g->libc_link_lib != nullptr) { | 452 | lj->args.append("/MERGE:.rdata=.data"); |
| 453 | find_libc_lib_path(g); | 453 | lj->args.append("/ALIGN:32"); |
| 454 | } | 454 | lj->args.append("/NODEFAULTLIB"); |
| 455 | 455 | lj->args.append("/SECTION:.xdata,D"); | |
| 456 | lj->args.append("-NOLOGO"); | 456 | } |
| 457 | |||
| 458 | if (!g->strip_debug_symbols && g->zig_target.os != Os::OsUefi) { | ||
| 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 | // The commented out stuff is from when we linked with MinGW | ||
| 470 | // Now that we're linking with LLD it remains to be determined | ||
| 471 | // how to handle --target-environ gnu | ||
| 472 | // These comments are a clue | ||
| 473 | |||
| 474 | bool is_library = g->out_type == OutTypeLib; | ||
| 475 | //bool dll = g->out_type == OutTypeLib; | ||
| 476 | //bool shared = !g->is_static && dll; | ||
| 477 | //if (g->is_static) { | ||
| 478 | // lj->args.append("-Bstatic"); | ||
| 479 | //} else { | ||
| 480 | // if (dll) { | ||
| 481 | // lj->args.append("--dll"); | ||
| 482 | // } else if (shared) { | ||
| 483 | // lj->args.append("--shared"); | ||
| 484 | // } | ||
| 485 | // lj->args.append("-Bdynamic"); | ||
| 486 | // if (dll || shared) { | ||
| 487 | // lj->args.append("-e"); | ||
| 488 | // if (g->zig_target.arch.arch == ZigLLVM_x86) { | ||
| 489 | // lj->args.append("_DllMainCRTStartup@12"); | ||
| 490 | // } else { | ||
| 491 | // lj->args.append("DllMainCRTStartup"); | ||
| 492 | // } | ||
| 493 | // lj->args.append("--enable-auto-image-base"); | ||
| 494 | // } | ||
| 495 | //} | ||
| 496 | |||
| 497 | |||
| 498 | // These are n actual command lines from LINK.EXE UEFI builds (app & driver) to be used as guidance cleaning | ||
| 499 | // up a bit for building the COFF linker args: | ||
| 500 | // /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" | ||
| 501 | // /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" | ||
| 502 | |||
| 503 | // Sorry for the goto(s) :) | ||
| 504 | switch (g->msvc_subsystem) { | ||
| 505 | case ZigLLVM_MSVC_CONSOLE: | ||
| 506 | lj->args.append("/SUBSYSTEM:console"); | ||
| 507 | goto building_nt; | ||
| 508 | case ZigLLVM_MSVC_EFI_APPLICATION: | ||
| 509 | lj->args.append("/SUBSYSTEM:efi_application"); | ||
| 510 | goto building_uefi; | ||
| 511 | case ZigLLVM_MSVC_EFI_BOOT_SERVICE_DRIVER: | ||
| 512 | lj->args.append("/SUBSYSTEM:efi_boot_service_driver"); | ||
| 513 | goto building_uefi; | ||
| 514 | case ZigLLVM_MSVC_EFI_ROM: | ||
| 515 | lj->args.append("/SUBSYSTEM:efi_rom"); | ||
| 516 | goto building_uefi; | ||
| 517 | case ZigLLVM_MSVC_EFI_RUNTIME_DRIVER: | ||
| 518 | lj->args.append("/SUBSYSTEM:efi_runtime_driver"); | ||
| 519 | goto building_uefi; | ||
| 520 | case ZigLLVM_MSVC_NATIVE: | ||
| 521 | lj->args.append("/SUBSYSTEM:native"); | ||
| 522 | goto building_nt; | ||
| 523 | case ZigLLVM_MSVC_POSIX: | ||
| 524 | lj->args.append("/SUBSYSTEM:posix"); | ||
| 525 | goto building_nt; | ||
| 526 | case ZigLLVM_MSVC_WINDOWS: | ||
| 527 | lj->args.append("/SUBSYSTEM:windows"); | ||
| 528 | goto building_nt; | ||
| 529 | case ZigLLVM_MSVC_NONE: | ||
| 530 | goto continuing_build; | ||
| 531 | } | ||
| 532 | 457 | ||
| 533 | building_uefi: | 458 | static void add_nt_link_args(LinkJob *lj, bool is_library) { |
| 534 | lj->args.append("/BASE:\"0\" /ENTRY:\"EfiMain\" /OPT:REF /SAFESEH:NO /MERGE:\".rdata=.data\" /ALIGN:32 /NODEFAULTLIB /SECTION:\".xdata,D\""); | 459 | CodeGen *g = lj->codegen; |
| 535 | goto continuing_build; | ||
| 536 | 460 | ||
| 537 | building_nt: | ||
| 538 | if (lj->link_in_crt) { | 461 | if (lj->link_in_crt) { |
| 539 | const char *lib_str = g->is_static ? "lib" : ""; | 462 | const char *lib_str = g->is_static ? "lib" : ""; |
| 540 | const char *d_str = (g->build_mode == BuildModeDebug) ? "d" : ""; | 463 | const char *d_str = (g->build_mode == BuildModeDebug) ? "d" : ""; |
| ... | @@ -557,17 +480,6 @@ building_nt: | ... | @@ -557,17 +480,6 @@ building_nt: |
| 557 | //https://msdn.microsoft.com/en-us/library/bb531344.aspx | 480 | //https://msdn.microsoft.com/en-us/library/bb531344.aspx |
| 558 | lj->args.append("legacy_stdio_definitions.lib"); | 481 | lj->args.append("legacy_stdio_definitions.lib"); |
| 559 | 482 | ||
| 560 | //if (shared || dll) { | ||
| 561 | // lj->args.append(get_libc_file(g, "dllcrt2.o")); | ||
| 562 | //} else { | ||
| 563 | // if (g->windows_linker_unicode) { | ||
| 564 | // lj->args.append(get_libc_file(g, "crt2u.o")); | ||
| 565 | // } else { | ||
| 566 | // lj->args.append(get_libc_file(g, "crt2.o")); | ||
| 567 | // } | ||
| 568 | //} | ||
| 569 | //lj->args.append(get_libc_static_file(g, "crtbegin.o")); | ||
| 570 | |||
| 571 | // msvcrt depends on kernel32 | 483 | // msvcrt depends on kernel32 |
| 572 | lj->args.append("kernel32.lib"); | 484 | lj->args.append("kernel32.lib"); |
| 573 | } else { | 485 | } else { |
| ... | @@ -580,8 +492,156 @@ building_nt: | ... | @@ -580,8 +492,156 @@ building_nt: |
| 580 | } | 492 | } |
| 581 | } | 493 | } |
| 582 | } | 494 | } |
| 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 | |||
| 586 | static 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"); | ||
| 583 | 596 | ||
| 584 | continuing_build: | 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 | } | ||
| 585 | 645 | ||
| 586 | lj->args.append(buf_ptr(buf_sprintf("-OUT:%s", buf_ptr(&g->output_file_path)))); | 646 | lj->args.append(buf_ptr(buf_sprintf("-OUT:%s", buf_ptr(&g->output_file_path)))); |
| 587 | 647 | ||
| ... | @@ -665,54 +725,6 @@ continuing_build: | ... | @@ -665,54 +725,6 @@ continuing_build: |
| 665 | } | 725 | } |
| 666 | } | 726 | } |
| 667 | 727 | ||
| 668 | //if (g->libc_link_lib != nullptr) { | ||
| 669 | //if (g->is_static) { | ||
| 670 | // lj->args.append("--start-group"); | ||
| 671 | //} | ||
| 672 | |||
| 673 | //lj->args.append("-lmingw32"); | ||
| 674 | |||
| 675 | //lj->args.append("-lgcc"); | ||
| 676 | //bool is_android = (g->zig_target.env_type == ZigLLVM_Android); | ||
| 677 | //bool is_cyg_ming = is_target_cyg_mingw(&g->zig_target); | ||
| 678 | //if (!g->is_static && !is_android) { | ||
| 679 | // if (!is_cyg_ming) { | ||
| 680 | // lj->args.append("--as-needed"); | ||
| 681 | // } | ||
| 682 | // //lj->args.append("-lgcc_s"); | ||
| 683 | // if (!is_cyg_ming) { | ||
| 684 | // lj->args.append("--no-as-needed"); | ||
| 685 | // } | ||
| 686 | //} | ||
| 687 | //if (g->is_static && !is_android) { | ||
| 688 | // //lj->args.append("-lgcc_eh"); | ||
| 689 | //} | ||
| 690 | //if (is_android && !g->is_static) { | ||
| 691 | // lj->args.append("-ldl"); | ||
| 692 | //} | ||
| 693 | |||
| 694 | //lj->args.append("-lmoldname"); | ||
| 695 | //lj->args.append("-lmingwex"); | ||
| 696 | //lj->args.append("-lmsvcrt"); | ||
| 697 | |||
| 698 | |||
| 699 | //if (g->windows_subsystem_windows) { | ||
| 700 | // lj->args.append("-lgdi32"); | ||
| 701 | // lj->args.append("-lcomdlg32"); | ||
| 702 | //} | ||
| 703 | //lj->args.append("-ladvapi32"); | ||
| 704 | //lj->args.append("-lshell32"); | ||
| 705 | //lj->args.append("-luser32"); | ||
| 706 | //lj->args.append("-lkernel32"); | ||
| 707 | |||
| 708 | //if (g->is_static) { | ||
| 709 | // lj->args.append("--end-group"); | ||
| 710 | //} | ||
| 711 | |||
| 712 | //if (lj->link_in_crt) { | ||
| 713 | // lj->args.append(get_libc_static_file(g, "crtend.o")); | ||
| 714 | //} | ||
| 715 | //} | ||
| 716 | } | 728 | } |
| 717 | 729 | ||
| 718 | 730 |
src/main.cpp+35-43| ... | @@ -16,13 +16,6 @@ | ... | @@ -16,13 +16,6 @@ |
| 16 | 16 | ||
| 17 | #include <stdio.h> | 17 | #include <stdio.h> |
| 18 | 18 | ||
| 19 | #ifdef __GNUC__ | ||
| 20 | #include <strings.h> | ||
| 21 | #define STRCASECMP strcasecmp | ||
| 22 | #else | ||
| 23 | #define STRCASECMP stricmp | ||
| 24 | #endif | ||
| 25 | |||
| 26 | static int print_error_usage(const char *arg0) { | 19 | static int print_error_usage(const char *arg0) { |
| 27 | fprintf(stderr, "See `%s help` for detailed usage information\n", arg0); | 20 | fprintf(stderr, "See `%s help` for detailed usage information\n", arg0); |
| 28 | return EXIT_FAILURE; | 21 | return EXIT_FAILURE; |
| ... | @@ -97,8 +90,8 @@ static int print_full_usage(const char *arg0) { | ... | @@ -97,8 +90,8 @@ static int print_full_usage(const char *arg0) { |
| 97 | " -rdynamic add all symbols to the dynamic symbol table\n" | 90 | " -rdynamic add all symbols to the dynamic symbol table\n" |
| 98 | " -rpath [path] add directory to the runtime library search path\n" | 91 | " -rpath [path] add directory to the runtime library search path\n" |
| 99 | " --no-rosegment compromise security to workaround valgrind bug\n" | 92 | " --no-rosegment compromise security to workaround valgrind bug\n" |
| 100 | " --msvc-subsystem [subsystem] (windows/uefi) /SUBSYSTEM:<subsystem> to the linker\n" | 93 | " --subsystem [subsystem] (windows) /SUBSYSTEM:<subsystem> to the linker\n" |
| 101 | 		" -framework [name] (darwin) link against framework\n" | 94 | " -framework [name] (darwin) link against framework\n" |
| 102 | " -mios-version-min [ver] (darwin) set iOS deployment target\n" | 95 | " -mios-version-min [ver] (darwin) set iOS deployment target\n" |
| 103 | " -mmacosx-version-min [ver] (darwin) set Mac OS X deployment target\n" | 96 | " -mmacosx-version-min [ver] (darwin) set Mac OS X deployment target\n" |
| 104 | " --ver-major [ver] dynamic library semver major version\n" | 97 | " --ver-major [ver] dynamic library semver major version\n" |
| ... | @@ -377,8 +370,6 @@ int main(int argc, char **argv) { | ... | @@ -377,8 +370,6 @@ int main(int argc, char **argv) { |
| 377 | const char *target_arch = nullptr; | 370 | const char *target_arch = nullptr; |
| 378 | const char *target_os = nullptr; | 371 | const char *target_os = nullptr; |
| 379 | const char *target_environ = nullptr; | 372 | const char *target_environ = nullptr; |
| 380 | bool mwindows = false; | ||
| 381 | bool mconsole = false; | ||
| 382 | bool rdynamic = false; | 373 | bool rdynamic = false; |
| 383 | const char *mmacosx_version_min = nullptr; | 374 | const char *mmacosx_version_min = nullptr; |
| 384 | const char *mios_version_min = nullptr; | 375 | const char *mios_version_min = nullptr; |
| ... | @@ -401,7 +392,7 @@ int main(int argc, char **argv) { | ... | @@ -401,7 +392,7 @@ int main(int argc, char **argv) { |
| 401 | int runtime_args_start = -1; | 392 | int runtime_args_start = -1; |
| 402 | bool no_rosegment_workaround = false; | 393 | bool no_rosegment_workaround = false; |
| 403 | bool system_linker_hack = false; | 394 | bool system_linker_hack = false; |
| 404 | ZigLLVM_MSVCSubsystemType msvc_subsystem_type = ZigLLVM_MSVC_NONE; | 395 | TargetSubsystem subsystem = TargetSubsystemAuto; |
| 405 | 396 | ||
| 406 | if (argc >= 2 && strcmp(argv[1], "build") == 0) { | 397 | if (argc >= 2 && strcmp(argv[1], "build") == 0) { |
| 407 | Buf zig_exe_path_buf = BUF_INIT; | 398 | Buf zig_exe_path_buf = BUF_INIT; |
| ... | @@ -547,36 +538,6 @@ int main(int argc, char **argv) { | ... | @@ -547,36 +538,6 @@ int main(int argc, char **argv) { |
| 547 | verbose_llvm_ir = true; | 538 | verbose_llvm_ir = true; |
| 548 | } else if (strcmp(arg, "--verbose-cimport") == 0) { | 539 | } else if (strcmp(arg, "--verbose-cimport") == 0) { |
| 549 | verbose_cimport = true; | 540 | verbose_cimport = true; |
| 550 | } else if (strcmp(arg, "--msvc-subsystem") == 0) { | ||
| 551 | if (i + 1 >= argc) { | ||
| 552 | fprintf(stderr, "Expected 1 argument after --msvc-subsystem\n"); | ||
| 553 | return print_error_usage(arg0); | ||
| 554 | } | ||
| 555 | i += 1; | ||
| 556 | if (STRCASECMP(argv[i], "CONSOLE") == 0) { | ||
| 557 | msvc_subsystem_type = ZigLLVM_MSVC_CONSOLE; | ||
| 558 | } else if (STRCASECMP(argv[i], "WINDOWS") == 0) { | ||
| 559 | msvc_subsystem_type = ZigLLVM_MSVC_WINDOWS; | ||
| 560 | } else if (STRCASECMP(argv[i], "POSIX") == 0) { | ||
| 561 | msvc_subsystem_type = ZigLLVM_MSVC_POSIX; | ||
| 562 | } else if (STRCASECMP(argv[i], "NATIVE") == 0) { | ||
| 563 | msvc_subsystem_type = ZigLLVM_MSVC_NATIVE; | ||
| 564 | } else if (STRCASECMP(argv[i], "EFI_APPLICATION") == 0) { | ||
| 565 | msvc_subsystem_type = ZigLLVM_MSVC_EFI_APPLICATION; | ||
| 566 | } else if (STRCASECMP(argv[i], "EFI_BOOT_SERVICE_DRIVER") == 0) { | ||
| 567 | msvc_subsystem_type = ZigLLVM_MSVC_EFI_BOOT_SERVICE_DRIVER; | ||
| 568 | } else if (STRCASECMP(argv[i], "EFI_ROM") == 0) { | ||
| 569 | msvc_subsystem_type = ZigLLVM_MSVC_EFI_ROM; | ||
| 570 | } else if (STRCASECMP(argv[i], "EFI_RUNTIME_DRIVER") == 0) { | ||
| 571 | msvc_subsystem_type = ZigLLVM_MSVC_EFI_RUNTIME_DRIVER; | ||
| 572 | } else { | ||
| 573 | fprintf(stderr, "Unknown format %s for --msvc-subsystem argument\n", argv[i]); | ||
| 574 | return EXIT_FAILURE; | ||
| 575 | } | ||
| 576 | } else if (strcmp(arg, "-mwindows") == 0) { | ||
| 577 | mwindows = true; | ||
| 578 | } else if (strcmp(arg, "-mconsole") == 0) { | ||
| 579 | mconsole = true; | ||
| 580 | } else if (strcmp(arg, "-rdynamic") == 0) { | 541 | } else if (strcmp(arg, "-rdynamic") == 0) { |
| 581 | rdynamic = true; | 542 | rdynamic = true; |
| 582 | } else if (strcmp(arg, "--no-rosegment") == 0) { | 543 | } else if (strcmp(arg, "--no-rosegment") == 0) { |
| ... | @@ -720,6 +681,37 @@ int main(int argc, char **argv) { | ... | @@ -720,6 +681,37 @@ int main(int argc, char **argv) { |
| 720 | ver_patch = atoi(argv[i]); | 681 | ver_patch = atoi(argv[i]); |
| 721 | } else if (strcmp(arg, "--test-cmd") == 0) { | 682 | } else if (strcmp(arg, "--test-cmd") == 0) { |
| 722 | test_exec_args.append(argv[i]); | 683 | 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 | } | ||
| 723 | } else { | 715 | } else { |
| 724 | fprintf(stderr, "Invalid argument: %s\n", arg); | 716 | fprintf(stderr, "Invalid argument: %s\n", arg); |
| 725 | return print_error_usage(arg0); | 717 | return print_error_usage(arg0); |
| ... | @@ -882,7 +874,7 @@ int main(int argc, char **argv) { | ... | @@ -882,7 +874,7 @@ int main(int argc, char **argv) { |
| 882 | buf_out_name = buf_create_from_str("run"); | 874 | buf_out_name = buf_create_from_str("run"); |
| 883 | } | 875 | } |
| 884 | CodeGen *g = codegen_create(zig_root_source_file, target, out_type, build_mode, get_zig_lib_dir()); | 876 | CodeGen *g = codegen_create(zig_root_source_file, target, out_type, build_mode, get_zig_lib_dir()); |
| 885 | g->msvc_subsystem = msvc_subsystem_type; | 877 | g->subsystem = subsystem; |
| 886 | 878 | ||
| 887 | if (disable_pic) { | 879 | if (disable_pic) { |
| 888 | if (out_type != OutTypeLib || !is_static) { | 880 | if (out_type != OutTypeLib || !is_static) { |
src/target.cpp+2-3| ... | @@ -283,6 +283,7 @@ ZigLLVM_OSType get_llvm_os_type(Os os_type) { | ... | @@ -283,6 +283,7 @@ ZigLLVM_OSType get_llvm_os_type(Os os_type) { |
| 283 | case OsSolaris: | 283 | case OsSolaris: |
| 284 | return ZigLLVM_Solaris; | 284 | return ZigLLVM_Solaris; |
| 285 | case OsWindows: | 285 | case OsWindows: |
| 286 | case OsUefi: | ||
| 286 | return ZigLLVM_Win32; | 287 | return ZigLLVM_Win32; |
| 287 | case OsHaiku: | 288 | case OsHaiku: |
| 288 | return ZigLLVM_Haiku; | 289 | return ZigLLVM_Haiku; |
| ... | @@ -316,8 +317,6 @@ ZigLLVM_OSType get_llvm_os_type(Os os_type) { | ... | @@ -316,8 +317,6 @@ ZigLLVM_OSType get_llvm_os_type(Os os_type) { |
| 316 | return ZigLLVM_Contiki; | 317 | return ZigLLVM_Contiki; |
| 317 | case OsAMDPAL: | 318 | case OsAMDPAL: |
| 318 | return ZigLLVM_AMDPAL; | 319 | return ZigLLVM_AMDPAL; |
| 319 | case OsUefi: | ||
| 320 | return ZigLLVM_Uefi; | ||
| 321 | } | 320 | } |
| 322 | zig_unreachable(); | 321 | zig_unreachable(); |
| 323 | } | 322 | } |
| ... | @@ -809,7 +808,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) { | ... | @@ -809,7 +808,7 @@ uint32_t target_c_type_size_in_bits(const ZigTarget *target, CIntType id) { |
| 809 | } | 808 | } |
| 810 | 809 | ||
| 811 | const char *target_o_file_ext(ZigTarget *target) { | 810 | const char *target_o_file_ext(ZigTarget *target) { |
| 812 | if (target->env_type == ZigLLVM_MSVC || (target->os == OsWindows || target->os == OsUefi)) { | 811 | if (target->env_type == ZigLLVM_MSVC || target->os == OsWindows || target->os == OsUefi) { |
| 813 | return ".obj"; | 812 | return ".obj"; |
| 814 | } else { | 813 | } else { |
| 815 | return ".o"; | 814 | return ".o"; |
src/target.hpp+12-1| ... | @@ -54,13 +54,24 @@ enum Os { | ... | @@ -54,13 +54,24 @@ enum Os { |
| 54 | OsUefi, | 54 | OsUefi, |
| 55 | }; | 55 | }; |
| 56 | 56 | ||
| 57 | enum TargetSubsystem { | ||
| 58 | TargetSubsystemAuto, // Zig should infer the subsystem | ||
| 59 | TargetSubsystemConsole, | ||
| 60 | TargetSubsystemWindows, | ||
| 61 | TargetSubsystemPosix, | ||
| 62 | TargetSubsystemNative, | ||
| 63 | TargetSubsystemEfiApplication, | ||
| 64 | TargetSubsystemEfiBootServiceDriver, | ||
| 65 | TargetSubsystemEfiRom, | ||
| 66 | TargetSubsystemEfiRuntimeDriver, | ||
| 67 | }; | ||
| 68 | |||
| 57 | struct ZigTarget { | 69 | struct ZigTarget { |
| 58 | ArchType arch; | 70 | ArchType arch; |
| 59 | ZigLLVM_VendorType vendor; | 71 | ZigLLVM_VendorType vendor; |
| 60 | Os os; | 72 | Os os; |
| 61 | ZigLLVM_EnvironmentType env_type; | 73 | ZigLLVM_EnvironmentType env_type; |
| 62 | ZigLLVM_ObjectFormatType oformat; | 74 | ZigLLVM_ObjectFormatType oformat; |
| 63 | ZigLLVM_MSVCSubsystemType msvc_subsystem = ZigLLVM_MSVC_NONE; | ||
| 64 | }; | 75 | }; |
| 65 | 76 | ||
| 66 | enum CIntType { | 77 | enum CIntType { |
src/translate_c.cpp+1-1| ... | @@ -4749,7 +4749,7 @@ Error parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, const | ... | @@ -4749,7 +4749,7 @@ Error parse_h_file(ImportTableEntry *import, ZigList<ErrorMsg *> *errors, const |
| 4749 | clang_argv.append("-isystem"); | 4749 | clang_argv.append("-isystem"); |
| 4750 | clang_argv.append(buf_ptr(codegen->zig_c_headers_dir)); | 4750 | clang_argv.append(buf_ptr(codegen->zig_c_headers_dir)); |
| 4751 | 4751 | ||
| 4752 | if (codegen->libc_include_dir) { | 4752 | if (codegen->libc_include_dir != nullptr) { |
| 4753 | clang_argv.append("-isystem"); | 4753 | clang_argv.append("-isystem"); |
| 4754 | clang_argv.append(buf_ptr(codegen->libc_include_dir)); | 4754 | clang_argv.append(buf_ptr(codegen->libc_include_dir)); |
| 4755 | } | 4755 | } |
src/zig_llvm.cpp+1-6| ... | @@ -690,12 +690,7 @@ const char *ZigLLVMGetVendorTypeName(ZigLLVM_VendorType vendor) { | ... | @@ -690,12 +690,7 @@ const char *ZigLLVMGetVendorTypeName(ZigLLVM_VendorType vendor) { |
| 690 | } | 690 | } |
| 691 | 691 | ||
| 692 | const char *ZigLLVMGetOSTypeName(ZigLLVM_OSType os) { | 692 | const char *ZigLLVMGetOSTypeName(ZigLLVM_OSType os) { |
| 693 | switch (os) { | 693 | return (const char*)Triple::getOSTypeName((Triple::OSType)os).bytes_begin(); |
| 694 | 	case ZigLLVM_Uefi: | ||
| 695 | 		return "windows"; | ||
| 696 | 	default: | ||
| 697 | 		return (const char*)Triple::getOSTypeName((Triple::OSType)os).bytes_begin(); | ||
| 698 | 	} | ||
| 699 | } | 694 | } |
| 700 | 695 | ||
| 701 | const char *ZigLLVMGetEnvironmentTypeName(ZigLLVM_EnvironmentType env_type) { | 696 | const char *ZigLLVMGetEnvironmentTypeName(ZigLLVM_EnvironmentType env_type) { |
src/zig_llvm.h+2-16| ... | @@ -10,7 +10,6 @@ | ... | @@ -10,7 +10,6 @@ |
| 10 | 10 | ||
| 11 | #include <stdbool.h> | 11 | #include <stdbool.h> |
| 12 | #include <stddef.h> | 12 | #include <stddef.h> |
| 13 | #include <stdint.h> | ||
| 14 | #include <llvm-c/Core.h> | 13 | #include <llvm-c/Core.h> |
| 15 | #include <llvm-c/Analysis.h> | 14 | #include <llvm-c/Analysis.h> |
| 16 | #include <llvm-c/Target.h> | 15 | #include <llvm-c/Target.h> |
| ... | @@ -358,8 +357,8 @@ enum ZigLLVM_OSType { | ... | @@ -358,8 +357,8 @@ enum ZigLLVM_OSType { |
| 358 | ZigLLVM_Mesa3D, | 357 | ZigLLVM_Mesa3D, |
| 359 | ZigLLVM_Contiki, | 358 | ZigLLVM_Contiki, |
| 360 | ZigLLVM_AMDPAL, // AMD PAL Runtime | 359 | ZigLLVM_AMDPAL, // AMD PAL Runtime |
| 361 | ZigLLVM_Uefi, | 360 | |
| 362 | ZigLLVM_LastOSType = ZigLLVM_Uefi | 361 | ZigLLVM_LastOSType = ZigLLVM_AMDPAL |
| 363 | }; | 362 | }; |
| 364 | 363 | ||
| 365 | // Synchronize with target.cpp::environ_list | 364 | // Synchronize with target.cpp::environ_list |
| ... | @@ -398,19 +397,6 @@ enum ZigLLVM_ObjectFormatType { | ... | @@ -398,19 +397,6 @@ enum ZigLLVM_ObjectFormatType { |
| 398 | ZigLLVM_Wasm, | 397 | ZigLLVM_Wasm, |
| 399 | }; | 398 | }; |
| 400 | 399 | ||
| 401 | // For MSVC-supported subsystems | ||
| 402 | enum ZigLLVM_MSVCSubsystemType { | ||
| 403 | ZigLLVM_MSVC_NONE, | ||
| 404 | ZigLLVM_MSVC_CONSOLE, | ||
| 405 | ZigLLVM_MSVC_WINDOWS, | ||
| 406 | ZigLLVM_MSVC_POSIX, | ||
| 407 | ZigLLVM_MSVC_NATIVE, | ||
| 408 | ZigLLVM_MSVC_EFI_APPLICATION, | ||
| 409 | ZigLLVM_MSVC_EFI_BOOT_SERVICE_DRIVER, | ||
| 410 | ZigLLVM_MSVC_EFI_ROM, | ||
| 411 | ZigLLVM_MSVC_EFI_RUNTIME_DRIVER, | ||
| 412 | }; | ||
| 413 | |||
| 414 | ZIG_EXTERN_C const char *ZigLLVMGetArchTypeName(enum ZigLLVM_ArchType arch); | 400 | ZIG_EXTERN_C const char *ZigLLVMGetArchTypeName(enum ZigLLVM_ArchType arch); |
| 415 | ZIG_EXTERN_C const char *ZigLLVMGetSubArchTypeName(enum ZigLLVM_SubArchType sub_arch); | 401 | ZIG_EXTERN_C const char *ZigLLVMGetSubArchTypeName(enum ZigLLVM_SubArchType sub_arch); |
| 416 | ZIG_EXTERN_C const char *ZigLLVMGetVendorTypeName(enum ZigLLVM_VendorType vendor); | 402 | ZIG_EXTERN_C const char *ZigLLVMGetVendorTypeName(enum ZigLLVM_VendorType vendor); |
std/os/index.zig+3-2| ... | @@ -18,7 +18,7 @@ test "std.os" { | ... | @@ -18,7 +18,7 @@ test "std.os" { |
| 18 | _ = @import("test.zig"); | 18 | _ = @import("test.zig"); |
| 19 | _ = @import("time.zig"); | 19 | _ = @import("time.zig"); |
| 20 | _ = @import("windows/index.zig"); | 20 | _ = @import("windows/index.zig"); |
| 21 | _ = @import("uefi/index.zig"); | 21 | _ = @import("uefi.zig"); |
| 22 | _ = @import("get_app_data_dir.zig"); | 22 | _ = @import("get_app_data_dir.zig"); |
| 23 | } | 23 | } |
| 24 | 24 | ||
| ... | @@ -27,7 +27,7 @@ pub const darwin = @import("darwin.zig"); | ... | @@ -27,7 +27,7 @@ pub const darwin = @import("darwin.zig"); |
| 27 | pub const linux = @import("linux/index.zig"); | 27 | pub const linux = @import("linux/index.zig"); |
| 28 | pub const freebsd = @import("freebsd/index.zig"); | 28 | pub const freebsd = @import("freebsd/index.zig"); |
| 29 | pub const zen = @import("zen.zig"); | 29 | pub const zen = @import("zen.zig"); |
| 30 | pub const uefi = @import("uefi/index.zig"); | 30 | pub const uefi = @import("uefi.zig"); |
| 31 | 31 | ||
| 32 | pub const posix = switch (builtin.os) { | 32 | pub const posix = switch (builtin.os) { |
| 33 | Os.linux => linux, | 33 | Os.linux => linux, |
| ... | @@ -192,6 +192,7 @@ pub fn abort() noreturn { | ... | @@ -192,6 +192,7 @@ pub fn abort() noreturn { |
| 192 | windows.ExitProcess(3); | 192 | windows.ExitProcess(3); |
| 193 | }, | 193 | }, |
| 194 | Os.uefi => { | 194 | Os.uefi => { |
| 195 | // TODO there's gotta be a better thing to do here than loop forever | ||
| 195 | while (true) {} | 196 | while (true) {} |
| 196 | }, | 197 | }, |
| 197 | else => @compileError("Unsupported OS"), | 198 | else => @compileError("Unsupported OS"), |
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/os/uefi/index.zig deletedstd/special/panic.zig+5-1| ... | @@ -10,9 +10,13 @@ pub fn panic(msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn | ... | @@ -10,9 +10,13 @@ pub fn panic(msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn |
| 10 | @setCold(true); | 10 | @setCold(true); |
| 11 | switch (builtin.os) { | 11 | switch (builtin.os) { |
| 12 | // TODO: fix panic in zen. | 12 | // TODO: fix panic in zen. |
| 13 | builtin.Os.freestanding, builtin.Os.zen, builtin.Os.uefi => { | 13 | builtin.Os.freestanding, builtin.Os.zen => { |
| 14 | while (true) {} | 14 | while (true) {} |
| 15 | }, | 15 | }, |
| 16 | builtin.Os.uefi => { | ||
| 17 | // TODO look into using the debug info and logging helpful messages | ||
| 18 | std.os.abort(); | ||
| 19 | }, | ||
| 16 | else => { | 20 | else => { |
| 17 | const first_trace_addr = @ptrToInt(@returnAddress()); | 21 | const first_trace_addr = @ptrToInt(@returnAddress()); |
| 18 | std.debug.panicExtra(error_return_trace, first_trace_addr, "{}", msg); | 22 | std.debug.panicExtra(error_return_trace, first_trace_addr, "{}", msg); |