diff --git a/core/mem/mem.odin b/core/mem/mem.odin index 0c27cfdee..4751a77a3 100644 --- a/core/mem/mem.odin +++ b/core/mem/mem.odin @@ -13,7 +13,7 @@ zero_item :: inline proc(item: $P/^$T) { set(item, 0, size_of(T)); } zero_slice :: proc(data: $T/[]$E) { - zero(raw_data(data), size_of(E)*n); + zero(raw_data(data), size_of(E)*len(data)); } diff --git a/core/os/os_windows.odin b/core/os/os_windows.odin index 4efa1d8ee..06aea24ed 100644 --- a/core/os/os_windows.odin +++ b/core/os/os_windows.odin @@ -203,7 +203,9 @@ stderr := get_std_handle(uint(win32.STD_ERROR_HANDLE)); get_std_handle :: proc "contextless" (h: uint) -> Handle { fd := win32.GetStdHandle(win32.DWORD(h)); - win32.SetHandleInformation(fd, win32.HANDLE_FLAG_INHERIT, 0); + when size_of(uintptr) == 8 { + win32.SetHandleInformation(fd, win32.HANDLE_FLAG_INHERIT, 0); + } return Handle(fd); } diff --git a/core/runtime/procs_windows_386.odin b/core/runtime/procs_windows_386.odin index fc7bbcf98..e73f0ced0 100644 --- a/core/runtime/procs_windows_386.odin +++ b/core/runtime/procs_windows_386.odin @@ -1,5 +1,7 @@ package runtime +@require foreign import "system:int64.lib" + foreign import kernel32 "system:Kernel32.lib" windows_trap_array_bounds :: proc "contextless" () -> ! { diff --git a/src/build_settings.cpp b/src/build_settings.cpp index 171fca756..9f30a07ac 100644 --- a/src/build_settings.cpp +++ b/src/build_settings.cpp @@ -130,6 +130,7 @@ struct BuildContext { i32 optimization_level; bool show_timings; bool show_more_timings; + bool show_system_calls; bool keep_temp_files; bool ignore_unknown_attributes; bool no_bounds_check; diff --git a/src/check_decl.cpp b/src/check_decl.cpp index 9e719756e..a74e18ebc 100644 --- a/src/check_decl.cpp +++ b/src/check_decl.cpp @@ -519,6 +519,9 @@ bool sig_compare(TypeCheckSig *a, TypeCheckSig *b, Type *x, Type *y) { } bool signature_parameter_similar_enough(Type *x, Type *y) { + x = core_type(x); + y = core_type(y); + if (sig_compare(is_type_pointer, x, y)) { return true; } diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 1d5cf83f7..e2727f10c 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -12204,7 +12204,10 @@ void lb_generate_code(lbGenerator *gen) { for_array(i, global_variables) { auto *var = &global_variables[i]; if (var->decl->init_expr != nullptr) { - var->init = lb_build_expr(p, var->decl->init_expr); + lbValue init = lb_build_expr(p, var->decl->init_expr); + if (!lb_is_const(init)) { + var->init = init; + } } Entity *e = var->decl->entity; @@ -12441,5 +12444,10 @@ void lb_generate_code(lbGenerator *gen) { array_add(&gen->output_object_paths, filepath_obj); + for_array(i, m->info->required_foreign_imports_through_force) { + Entity *e = m->info->required_foreign_imports_through_force[i]; + lb_add_foreign_library_path(m, e); + } + #undef TIME_SECTION } diff --git a/src/main.cpp b/src/main.cpp index 450dcdf48..381373cd2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -43,13 +43,16 @@ i32 system_exec_command_line_app(char const *name, char const *fmt, ...) { #if defined(GB_SYSTEM_WINDOWS) STARTUPINFOW start_info = {gb_size_of(STARTUPINFOW)}; PROCESS_INFORMATION pi = {0}; - char cmd_line[4*1024] = {0}; - isize cmd_len; + isize cmd_len = 0; + isize cmd_cap = 1024; + char *cmd_line = cast(char *)calloc(1, cmd_cap); va_list va; gbTempArenaMemory tmp; String16 cmd; i32 exit_code = 0; + defer (free(cmd_line)); + start_info.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; start_info.wShowWindow = SW_SHOW; start_info.hStdInput = GetStdHandle(STD_INPUT_HANDLE); @@ -57,10 +60,21 @@ i32 system_exec_command_line_app(char const *name, char const *fmt, ...) { start_info.hStdError = GetStdHandle(STD_ERROR_HANDLE); va_start(va, fmt); - cmd_len = gb_snprintf_va(cmd_line, gb_size_of(cmd_line), fmt, va); + for (;;) { + cmd_len = gb_snprintf_va(cmd_line, cmd_cap-1, fmt, va); + if (cmd_len < 0) { + cmd_cap *= 2; + cmd_line = cast(char *)realloc(cmd_line, cmd_cap); + continue; + } + break; + } va_end(va); - // gb_printf_err("%.*s\n", cast(int)cmd_len, cmd_line); + if (build_context.show_system_calls) { + gb_printf_err("[SYSTEM CALL] %s\n", name); + gb_printf_err("%.*s\n\n", cast(int)cmd_len, cmd_line); + } tmp = gb_temp_arena_memory_begin(&string_buffer_arena); defer (gb_temp_arena_memory_end(tmp)); @@ -95,8 +109,11 @@ i32 system_exec_command_line_app(char const *name, char const *fmt, ...) { va_end(va); cmd = make_string(cast(u8 *)&cmd_line, cmd_len-1); - // printf("do: %s\n", cmd_line); - exit_code = system(&cmd_line[0]); + if (build_context.show_system_calls) { + gb_printf_err("[SYSTEM CALL] %s\n", name); + gb_printf_err("%s\n\n", cmd_line); + exit_code = system(&cmd_line[0]); + } // pid_t pid = fork(); // int status = 0; @@ -554,6 +571,7 @@ enum BuildFlagKind { BuildFlag_OptimizationLevel, BuildFlag_ShowTimings, BuildFlag_ShowMoreTimings, + BuildFlag_ShowSystemCalls, BuildFlag_ThreadCount, BuildFlag_KeepTempFiles, BuildFlag_Collection, @@ -648,6 +666,7 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_OptimizationLevel, str_lit("opt"), BuildFlagParam_Integer); add_flag(&build_flags, BuildFlag_ShowTimings, str_lit("show-timings"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_ShowMoreTimings, str_lit("show-more-timings"), BuildFlagParam_None); + add_flag(&build_flags, BuildFlag_ShowSystemCalls, str_lit("show-system-calls"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_ThreadCount, str_lit("thread-count"), BuildFlagParam_Integer); add_flag(&build_flags, BuildFlag_KeepTempFiles, str_lit("keep-temp-files"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_Collection, str_lit("collection"), BuildFlagParam_String); @@ -836,6 +855,10 @@ bool parse_build_flags(Array args) { build_context.show_timings = true; build_context.show_more_timings = true; break; + case BuildFlag_ShowSystemCalls: + GB_ASSERT(value.kind == ExactValue_Invalid); + build_context.show_system_calls = true; + break; case BuildFlag_ThreadCount: { GB_ASSERT(value.kind == ExactValue_Integer); isize count = cast(isize)big_int_to_i64(&value.value_integer);