mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-06 22:08:41 +00:00
moved IO related code to stand-alone file, piped all read/and writes
through new API, /rad_log now can enable read and/or write logs with "io", "io_reads", "io_writes" parameters.
This commit is contained in:
+6
-39
@@ -118,6 +118,7 @@
|
|||||||
#include "lnk_error.h"
|
#include "lnk_error.h"
|
||||||
#include "lnk_log.h"
|
#include "lnk_log.h"
|
||||||
#include "lnk_timer.h"
|
#include "lnk_timer.h"
|
||||||
|
#include "lnk_io.h"
|
||||||
#include "lnk_cmd_line.h"
|
#include "lnk_cmd_line.h"
|
||||||
#include "lnk_config.h"
|
#include "lnk_config.h"
|
||||||
#include "lnk_chunk.h"
|
#include "lnk_chunk.h"
|
||||||
@@ -135,6 +136,7 @@
|
|||||||
#include "lnk_error.c"
|
#include "lnk_error.c"
|
||||||
#include "lnk_log.c"
|
#include "lnk_log.c"
|
||||||
#include "lnk_timer.c"
|
#include "lnk_timer.c"
|
||||||
|
#include "lnk_io.c"
|
||||||
#include "lnk_cmd_line.c"
|
#include "lnk_cmd_line.c"
|
||||||
#include "lnk_config.c"
|
#include "lnk_config.c"
|
||||||
#include "lnk_chunk.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
|
internal String8
|
||||||
lnk_make_full_path(Arena *arena, String8 work_dir, PathStyle system_path_style, String8 path)
|
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);
|
lnk_merge_manifest_files(mt_path, merged_manifest_path, input_manifest_path_list);
|
||||||
|
|
||||||
// read mt.exe output from disk
|
// 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) {
|
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);
|
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];
|
LNK_InputObj *input = ((LNK_InputObj **)raw_task)[task_id];
|
||||||
if (input->is_thin) {
|
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);
|
input->has_disk_read_failed = (input->data.size == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3760,7 +3727,7 @@ l.count += 1; \
|
|||||||
{
|
{
|
||||||
ProfBegin("Disk Read Libs");
|
ProfBegin("Disk Read Libs");
|
||||||
String8Array path_arr = str8_array_from_list(scratch.arena, &unique_input_lib_list);
|
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();
|
ProfEnd();
|
||||||
|
|
||||||
ProfBegin("Lib Init");
|
ProfBegin("Lib Init");
|
||||||
@@ -3851,7 +3818,7 @@ l.count += 1; \
|
|||||||
|
|
||||||
ProfBegin("Load .res files from disk");
|
ProfBegin("Load .res files from disk");
|
||||||
for (String8Node *node = config->input_list[LNK_Input_Res].first; node != 0; node = node->next) {
|
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 (res_data.size > 0) {
|
||||||
if (pe_is_res(res_data)) {
|
if (pe_is_res(res_data)) {
|
||||||
str8_list_push(scratch.arena, &res_data_list, res_data);
|
str8_list_push(scratch.arena, &res_data_list, res_data);
|
||||||
|
|||||||
@@ -238,9 +238,6 @@ internal LNK_InputImportList lnk_list_from_input_import_arr(LNK_InputImport **ar
|
|||||||
////////////////////////////////
|
////////////////////////////////
|
||||||
// Helpers
|
// 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_make_full_path(Arena *arena, String8 work_dir, PathStyle system_path_style, String8 path);
|
||||||
|
|
||||||
internal String8 lnk_get_lib_name(String8 path);
|
internal String8 lnk_get_lib_name(String8 path);
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ lnk_unwrap_rsp(Arena *arena, String8List arg_list)
|
|||||||
|
|
||||||
if (os_file_path_exists(name)) {
|
if (os_file_path_exists(name)) {
|
||||||
// read rsp from disk
|
// 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
|
// parse rsp
|
||||||
String8List rsp_args = lnk_arg_list_parse_windows_rules(scratch.arena, file);
|
String8List rsp_args = lnk_arg_list_parse_windows_rules(scratch.arena, file);
|
||||||
|
|||||||
@@ -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) {
|
for (U64 ilog = 0; ilog < LNK_Log_Count; ilog += 1) {
|
||||||
lnk_set_log_status((LNK_LogType)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 {
|
} else {
|
||||||
LNK_LogType log_type = lnk_log_type_from_string(cmd->value_strings.first->string);
|
LNK_LogType log_type = lnk_log_type_from_string(cmd->value_strings.first->string);
|
||||||
if (log_type == LNK_Log_Null) {
|
if (log_type == LNK_Log_Null) {
|
||||||
|
|||||||
@@ -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
|
// read type servers from disk in parallel
|
||||||
{
|
{
|
||||||
ProfBegin("Read External Type Servers");
|
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();
|
ProfEnd();
|
||||||
|
|
||||||
MSF_Parsed **msf_parse_arr = lnk_msf_parsed_from_data_parallel(tp_arena, tp, msf_data_arr);
|
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");
|
ProfBegin("Build NatVis");
|
||||||
{
|
{
|
||||||
String8Array natvis_file_path_arr = str8_array_from_list(scratch.arena, &natvis_list);
|
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) {
|
for (U64 i = 0; i < natvis_file_data_arr.count; ++i) {
|
||||||
String8 natvis_file_path = natvis_file_path_arr.v[i];
|
String8 natvis_file_path = natvis_file_path_arr.v[i];
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
@@ -40,7 +40,8 @@ lnk_log_type_from_string(String8 string)
|
|||||||
"Debug", LNK_Log_Debug,
|
"Debug", LNK_Log_Debug,
|
||||||
"InputObj", LNK_Log_InputObj,
|
"InputObj", LNK_Log_InputObj,
|
||||||
"InputLib", LNK_Log_InputLib,
|
"InputLib", LNK_Log_InputLib,
|
||||||
"IO", LNK_Log_IO,
|
"IO_Read", LNK_Log_IO_Read,
|
||||||
|
"IO_Write", LNK_Log_IO_Write,
|
||||||
"SizeBreakdown", LNK_Log_SizeBreakdown,
|
"SizeBreakdown", LNK_Log_SizeBreakdown,
|
||||||
"LinkStats", LNK_Log_LinkStats,
|
"LinkStats", LNK_Log_LinkStats,
|
||||||
"Timers", LNK_Log_Timers,
|
"Timers", LNK_Log_Timers,
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ typedef enum
|
|||||||
LNK_Log_Debug,
|
LNK_Log_Debug,
|
||||||
LNK_Log_InputObj,
|
LNK_Log_InputObj,
|
||||||
LNK_Log_InputLib,
|
LNK_Log_InputLib,
|
||||||
LNK_Log_IO,
|
LNK_Log_IO_Read,
|
||||||
|
LNK_Log_IO_Write,
|
||||||
LNK_Log_SizeBreakdown,
|
LNK_Log_SizeBreakdown,
|
||||||
LNK_Log_LinkStats,
|
LNK_Log_LinkStats,
|
||||||
LNK_Log_Timers,
|
LNK_Log_Timers,
|
||||||
|
|||||||
Reference in New Issue
Block a user