Procházet zdrojové kódy

Add `-show-system-calls`; Update runtime for windows_386; Fix some minor bugs

gingerBill před 5 roky
rodič
revize
92363da58e

+ 1 - 1
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));
 }
 
 

+ 3 - 1
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);
 }
 

+ 2 - 0
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" () -> ! {

+ 1 - 0
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;

+ 3 - 0
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;
 	}

+ 9 - 1
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
 }

+ 29 - 6
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);