aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-06-30 10:09:58 +0100
committergingerBill <bill@gingerbill.org>2020-06-30 10:09:58 +0100
commit92363da58ee8d1973bd102878eef4c33942eee0d (patch)
treeef376648532fa37e67082a0fca19659d4489d8ff
parent0ea64182f1a05803a64f5495a9edb740c6d2488e (diff)
Add `-show-system-calls`; Update runtime for windows_386; Fix some minor bugs
-rw-r--r--core/mem/mem.odin2
-rw-r--r--core/os/os_windows.odin4
-rw-r--r--core/runtime/procs_windows_386.odin2
-rw-r--r--src/build_settings.cpp1
-rw-r--r--src/check_decl.cpp3
-rw-r--r--src/llvm_backend.cpp10
-rw-r--r--src/main.cpp35
7 files changed, 48 insertions, 9 deletions
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<String> 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<String> 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);