diff --git a/src/linker/lnk.c b/src/linker/lnk.c index b101dd40..39919007 100644 --- a/src/linker/lnk.c +++ b/src/linker/lnk.c @@ -118,6 +118,7 @@ #include "lnk_error.h" #include "lnk_log.h" #include "lnk_timer.h" +#include "lnk_io.h" #include "lnk_cmd_line.h" #include "lnk_config.h" #include "lnk_chunk.h" @@ -135,6 +136,7 @@ #include "lnk_error.c" #include "lnk_log.c" #include "lnk_timer.c" +#include "lnk_io.c" #include "lnk_cmd_line.c" #include "lnk_config.c" #include "lnk_chunk.c" @@ -214,41 +216,6 @@ lnk_input_import_compar(const void *raw_a, const void *raw_b) //////////////////////////////// -internal void -lnk_write_data_list_to_file_path(String8 path, String8List data) -{ -#if PROFILE_TELEMETRY - { - Temp scratch = scratch_begin(0, 0); - String8 size_str = str8_from_memory_size2(scratch.arena, data.total_size); - ProfBeginDynamic("Write %.*s to %.*s", str8_varg(size_str), str8_varg(path)); - scratch_end(scratch); - } -#endif - B32 is_written = os_write_data_list_to_file_path(path, data); - if (is_written) { - if (lnk_get_log_status(LNK_Log_IO)) { - Temp scratch = scratch_begin(0,0); - String8 size_str = str8_from_memory_size2(scratch.arena, data.total_size); - lnk_log(LNK_Log_IO, "File \"%S\" %S written", path, size_str); - scratch_end(scratch); - } - } else { - lnk_error(LNK_Error_NoAccess, "don't have access to write to %S", path); - } - ProfEnd(); -} - -internal void -lnk_write_data_to_file_path(String8 path, String8 data) -{ - Temp scratch = scratch_begin(0,0); - String8List data_list = {0}; - str8_list_push(scratch.arena, &data_list, data); - lnk_write_data_list_to_file_path(path, data_list); - scratch_end(scratch); -} - internal String8 lnk_make_full_path(Arena *arena, String8 work_dir, PathStyle system_path_style, String8 path) { @@ -396,7 +363,7 @@ lnk_manifest_from_inputs(Arena *arena, lnk_merge_manifest_files(mt_path, merged_manifest_path, input_manifest_path_list); // read mt.exe output from disk - manifest_data = os_data_from_file_path(arena, merged_manifest_path); + manifest_data = lnk_read_data_from_file_path(arena, merged_manifest_path); if (manifest_data.size == 0) { lnk_error(LNK_Error_Mt, "unable to find mt.exe output manifest on disk, expected path \"%S\"", merged_manifest_path); } @@ -1194,7 +1161,7 @@ THREAD_POOL_TASK_FUNC(lnk_load_thin_objs_task) { LNK_InputObj *input = ((LNK_InputObj **)raw_task)[task_id]; if (input->is_thin) { - input->data = os_data_from_file_path(arena, input->path); + input->data = lnk_read_data_from_file_path(arena, input->path); input->has_disk_read_failed = (input->data.size == 0); } } @@ -3760,7 +3727,7 @@ l.count += 1; \ { ProfBegin("Disk Read Libs"); String8Array path_arr = str8_array_from_list(scratch.arena, &unique_input_lib_list); - String8Array data_arr = os_data_from_file_path_parallel(tp, tp_arena->v[0], path_arr); + String8Array data_arr = lnk_read_data_from_file_path_parallel(tp, tp_arena->v[0], path_arr); ProfEnd(); ProfBegin("Lib Init"); @@ -3851,7 +3818,7 @@ l.count += 1; \ ProfBegin("Load .res files from disk"); for (String8Node *node = config->input_list[LNK_Input_Res].first; node != 0; node = node->next) { - String8 res_data = os_data_from_file_path(scratch.arena, node->string); + String8 res_data = lnk_read_data_from_file_path(scratch.arena, node->string); if (res_data.size > 0) { if (pe_is_res(res_data)) { str8_list_push(scratch.arena, &res_data_list, res_data); diff --git a/src/linker/lnk.h b/src/linker/lnk.h index 871be5dc..d8e5c28d 100644 --- a/src/linker/lnk.h +++ b/src/linker/lnk.h @@ -238,9 +238,6 @@ internal LNK_InputImportList lnk_list_from_input_import_arr(LNK_InputImport **ar //////////////////////////////// // Helpers -internal void lnk_write_data_list_to_file_path(String8 path, String8List list); -internal void lnk_write_data_to_file_path(String8 path, String8 data); - internal String8 lnk_make_full_path(Arena *arena, String8 work_dir, PathStyle system_path_style, String8 path); internal String8 lnk_get_lib_name(String8 path); diff --git a/src/linker/lnk_cmd_line.c b/src/linker/lnk_cmd_line.c index 69942dd9..d7f9b89d 100644 --- a/src/linker/lnk_cmd_line.c +++ b/src/linker/lnk_cmd_line.c @@ -202,7 +202,7 @@ lnk_unwrap_rsp(Arena *arena, String8List arg_list) if (os_file_path_exists(name)) { // read rsp from disk - String8 file = os_data_from_file_path(scratch.arena, name); + String8 file = lnk_read_data_from_file_path(scratch.arena, name); // parse rsp String8List rsp_args = lnk_arg_list_parse_windows_rules(scratch.arena, file); diff --git a/src/linker/lnk_config.c b/src/linker/lnk_config.c index e8d26fd5..d3f1a7c5 100644 --- a/src/linker/lnk_config.c +++ b/src/linker/lnk_config.c @@ -1487,6 +1487,9 @@ lnk_config_from_cmd_line(Arena *arena, String8List raw_cmd_line) for (U64 ilog = 0; ilog < LNK_Log_Count; ilog += 1) { lnk_set_log_status((LNK_LogType)ilog, 1); } + } else if (str8_match(cmd->value_strings.first->string, str8_lit("io"), StringMatchFlag_CaseInsensitive)) { + lnk_set_log_status(LNK_Log_IO_Read, 1); + lnk_set_log_status(LNK_Log_IO_Write, 1); } else { LNK_LogType log_type = lnk_log_type_from_string(cmd->value_strings.first->string); if (log_type == LNK_Log_Null) { diff --git a/src/linker/lnk_debug_info.c b/src/linker/lnk_debug_info.c index e24f314f..a9589880 100644 --- a/src/linker/lnk_debug_info.c +++ b/src/linker/lnk_debug_info.c @@ -690,7 +690,7 @@ lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, String8List lib_dir // read type servers from disk in parallel { ProfBegin("Read External Type Servers"); - String8Array msf_data_arr = os_data_from_file_path_parallel(tp, scratch.arena, ts_path_arr); + String8Array msf_data_arr = lnk_read_data_from_file_path_parallel(tp, scratch.arena, ts_path_arr); ProfEnd(); MSF_Parsed **msf_parse_arr = lnk_msf_parsed_from_data_parallel(tp_arena, tp, msf_data_arr); @@ -3098,7 +3098,7 @@ lnk_build_pdb(TP_Context *tp, ProfBegin("Build NatVis"); { String8Array natvis_file_path_arr = str8_array_from_list(scratch.arena, &natvis_list); - String8Array natvis_file_data_arr = os_data_from_file_path_parallel(tp, scratch.arena, natvis_file_path_arr); + String8Array natvis_file_data_arr = lnk_read_data_from_file_path_parallel(tp, scratch.arena, natvis_file_path_arr); for (U64 i = 0; i < natvis_file_data_arr.count; ++i) { String8 natvis_file_path = natvis_file_path_arr.v[i]; diff --git a/src/linker/lnk_io.c b/src/linker/lnk_io.c new file mode 100644 index 00000000..4c5b5c4f --- /dev/null +++ b/src/linker/lnk_io.c @@ -0,0 +1,66 @@ +internal void +lnk_log_read(String8 path, U64 size) +{ + Temp scratch = scratch_begin(0,0); + String8 size_str = str8_from_memory_size2(scratch.arena, size); + lnk_log(LNK_Log_IO_Read, "Read from \"%S\" %S", path, size_str); + scratch_end(scratch); +} + +internal String8 +lnk_read_data_from_file_path(Arena *arena, String8 path) +{ + String8 data = os_data_from_file_path(arena, path); + if (lnk_get_log_status(LNK_Log_IO_Read)) { + lnk_log_read(path, data.size); + } + return data; +} + +internal String8Array +lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, String8Array path_arr) +{ + String8Array result = os_data_from_file_path_parallel(tp, arena, path_arr); + if (lnk_get_log_status(LNK_Log_IO_Read)) { + for (U64 i = 0; i < result.count; ++i) { + lnk_log_read(path_arr.v[i], result.v[i].size); + } + } + return result; +} + +internal void +lnk_write_data_list_to_file_path(String8 path, String8List data) +{ +#if PROFILE_TELEMETRY + { + Temp scratch = scratch_begin(0, 0); + String8 size_str = str8_from_memory_size2(scratch.arena, data.total_size); + ProfBeginDynamic("Write %.*s to %.*s", str8_varg(size_str), str8_varg(path)); + scratch_end(scratch); + } +#endif + B32 is_written = os_write_data_list_to_file_path(path, data); + if (is_written) { + if (lnk_get_log_status(LNK_Log_IO_Write)) { + Temp scratch = scratch_begin(0,0); + String8 size_str = str8_from_memory_size2(scratch.arena, data.total_size); + lnk_log(LNK_Log_IO_Write, "File \"%S\" %S written", path, size_str); + scratch_end(scratch); + } + } else { + lnk_error(LNK_Error_NoAccess, "don't have access to write to %S", path); + } + ProfEnd(); +} + +internal void +lnk_write_data_to_file_path(String8 path, String8 data) +{ + Temp scratch = scratch_begin(0,0); + String8List data_list = {0}; + str8_list_push(scratch.arena, &data_list, data); + lnk_write_data_list_to_file_path(path, data_list); + scratch_end(scratch); +} + diff --git a/src/linker/lnk_io.h b/src/linker/lnk_io.h new file mode 100644 index 00000000..473173de --- /dev/null +++ b/src/linker/lnk_io.h @@ -0,0 +1,9 @@ +#pragma once + +internal String8 lnk_read_data_from_file_path(Arena *arena, String8 path); +internal String8Array lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, String8Array path_arr); + +internal void lnk_write_data_list_to_file_path(String8 path, String8List list); +internal void lnk_write_data_to_file_path(String8 path, String8 data); + + diff --git a/src/linker/lnk_log.c b/src/linker/lnk_log.c index a90c2dec..368387f2 100644 --- a/src/linker/lnk_log.c +++ b/src/linker/lnk_log.c @@ -40,7 +40,8 @@ lnk_log_type_from_string(String8 string) "Debug", LNK_Log_Debug, "InputObj", LNK_Log_InputObj, "InputLib", LNK_Log_InputLib, - "IO", LNK_Log_IO, + "IO_Read", LNK_Log_IO_Read, + "IO_Write", LNK_Log_IO_Write, "SizeBreakdown", LNK_Log_SizeBreakdown, "LinkStats", LNK_Log_LinkStats, "Timers", LNK_Log_Timers, diff --git a/src/linker/lnk_log.h b/src/linker/lnk_log.h index fe0f27d1..cc0d8544 100644 --- a/src/linker/lnk_log.h +++ b/src/linker/lnk_log.h @@ -9,7 +9,8 @@ typedef enum LNK_Log_Debug, LNK_Log_InputObj, LNK_Log_InputLib, - LNK_Log_IO, + LNK_Log_IO_Read, + LNK_Log_IO_Write, LNK_Log_SizeBreakdown, LNK_Log_LinkStats, LNK_Log_Timers,