mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-08-04 12:58:41 +00:00
raddbgi_from_pdb: untangle all baking stages - move almost all baking stages to a strictly read-only path of strings, idx runs, and so on. make section layout, given some loose input baking params, completely deterministic & well-defined, such that section list building for each stage of baking can be completely independent
This commit is contained in:
@@ -36,10 +36,10 @@ p2r_hash_from_voff(U64 voff)
|
||||
////////////////////////////////
|
||||
//~ rjf: Command Line -> Conversion Inputs
|
||||
|
||||
internal P2R_ConvertIn *
|
||||
p2r_convert_in_from_cmd_line(Arena *arena, CmdLine *cmdline)
|
||||
internal P2R_User2Convert *
|
||||
p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline)
|
||||
{
|
||||
P2R_ConvertIn *result = push_array(arena, P2R_ConvertIn, 1);
|
||||
P2R_User2Convert *result = push_array(arena, P2R_User2Convert, 1);
|
||||
|
||||
//- rjf: get input pdb
|
||||
{
|
||||
@@ -1740,8 +1740,8 @@ p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p)
|
||||
////////////////////////////////
|
||||
//~ rjf: Top-Level Conversion Entry Point
|
||||
|
||||
internal P2R_ConvertOut *
|
||||
p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
||||
internal P2R_Convert2Bake *
|
||||
p2r_convert(Arena *arena, P2R_User2Convert *in)
|
||||
{
|
||||
Temp scratch = scratch_begin(&arena, 1);
|
||||
|
||||
@@ -3355,18 +3355,18 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
||||
//////////////////////////////////////////////////////////////
|
||||
//- rjf: fill output
|
||||
//
|
||||
P2R_ConvertOut *out = push_array(arena, P2R_ConvertOut, 1);
|
||||
P2R_Convert2Bake *out = push_array(arena, P2R_Convert2Bake, 1);
|
||||
{
|
||||
out->top_level_info = top_level_info;
|
||||
out->binary_sections = binary_sections;
|
||||
out->units = all_units;
|
||||
out->types = all_types;
|
||||
out->udts = all_udts;
|
||||
out->src_files = all_src_files;
|
||||
out->global_variables = all_global_variables;
|
||||
out->thread_variables = all_thread_variables;
|
||||
out->procedures = all_procedures;
|
||||
out->scopes = all_scopes;
|
||||
out->bake_params.top_level_info = top_level_info;
|
||||
out->bake_params.binary_sections = binary_sections;
|
||||
out->bake_params.units = all_units;
|
||||
out->bake_params.types = all_types;
|
||||
out->bake_params.udts = all_udts;
|
||||
out->bake_params.src_files = all_src_files;
|
||||
out->bake_params.global_variables = all_global_variables;
|
||||
out->bake_params.thread_variables = all_thread_variables;
|
||||
out->bake_params.procedures = all_procedures;
|
||||
out->bake_params.scopes = all_scopes;
|
||||
}
|
||||
|
||||
scratch_end(scratch);
|
||||
@@ -3376,25 +3376,21 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
|
||||
////////////////////////////////
|
||||
//~ rjf: Top-Level Baking Entry Point
|
||||
|
||||
internal P2R_BakeOut *
|
||||
p2r_bake(Arena *arena, P2R_BakeIn *in)
|
||||
internal P2R_Bake2Serialize *
|
||||
p2r_bake(Arena *arena, P2R_Convert2Bake *in)
|
||||
{
|
||||
RDIM_BakeParams bake_params = {0};
|
||||
//////////////////////////////
|
||||
//- rjf: build all sections
|
||||
//
|
||||
RDIM_BakeSectionList sections = {0};
|
||||
{
|
||||
bake_params.top_level_info = in->top_level_info;
|
||||
bake_params.binary_sections = in->binary_sections;
|
||||
bake_params.units = in->units;
|
||||
bake_params.types = in->types;
|
||||
bake_params.udts = in->udts;
|
||||
bake_params.src_files = in->src_files;
|
||||
bake_params.global_variables = in->global_variables;
|
||||
bake_params.thread_variables = in->thread_variables;
|
||||
bake_params.procedures = in->procedures;
|
||||
bake_params.scopes = in->scopes;
|
||||
|
||||
}
|
||||
RDIM_BakeSectionList sections = rdim_bake_sections_from_params(arena, &bake_params);
|
||||
String8List bake_strings = rdim_blobs_from_bake_sections(arena, §ions);
|
||||
P2R_BakeOut *out = push_array(arena, P2R_BakeOut, 1);
|
||||
out->blobs = bake_strings;
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: fill & return
|
||||
//
|
||||
P2R_Bake2Serialize *out = push_array(arena, P2R_Bake2Serialize, 1);
|
||||
out->sections = sections;
|
||||
return out;
|
||||
}
|
||||
|
||||
@@ -5,17 +5,16 @@
|
||||
#define RADDBGI_FROM_PDB_H
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Conversion Inputs/Outputs
|
||||
//~ rjf: Conversion Stage Inputs/Outputs
|
||||
|
||||
typedef struct P2R_ConvertIn P2R_ConvertIn;
|
||||
struct P2R_ConvertIn
|
||||
typedef struct P2R_User2Convert P2R_User2Convert;
|
||||
struct P2R_User2Convert
|
||||
{
|
||||
String8 input_pdb_name;
|
||||
String8 input_pdb_data;
|
||||
String8 input_exe_name;
|
||||
String8 input_exe_data;
|
||||
String8 output_name;
|
||||
|
||||
struct
|
||||
{
|
||||
B8 input;
|
||||
@@ -23,7 +22,6 @@ struct P2R_ConvertIn
|
||||
B8 parsing;
|
||||
B8 converting;
|
||||
} hide_errors;
|
||||
|
||||
B8 dump;
|
||||
B8 dump__first;
|
||||
B8 dump_coff_sections;
|
||||
@@ -35,47 +33,19 @@ struct P2R_ConvertIn
|
||||
B8 dump_contributions;
|
||||
B8 dump_table_diagnostics;
|
||||
B8 dump__last;
|
||||
|
||||
String8List errors;
|
||||
};
|
||||
|
||||
typedef struct P2R_ConvertOut P2R_ConvertOut;
|
||||
struct P2R_ConvertOut
|
||||
typedef struct P2R_Convert2Bake P2R_Convert2Bake;
|
||||
struct P2R_Convert2Bake
|
||||
{
|
||||
RDIM_TopLevelInfo top_level_info;
|
||||
RDIM_BinarySectionList binary_sections;
|
||||
RDIM_UnitChunkList units;
|
||||
RDIM_TypeChunkList types;
|
||||
RDIM_UDTChunkList udts;
|
||||
RDIM_SrcFileChunkList src_files;
|
||||
RDIM_SymbolChunkList global_variables;
|
||||
RDIM_SymbolChunkList thread_variables;
|
||||
RDIM_SymbolChunkList procedures;
|
||||
RDIM_ScopeChunkList scopes;
|
||||
RDIM_BakeParams bake_params;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Baking Inputs/Outputs
|
||||
|
||||
typedef struct P2R_BakeIn P2R_BakeIn;
|
||||
struct P2R_BakeIn
|
||||
typedef struct P2R_Bake2Serialize P2R_Bake2Serialize;
|
||||
struct P2R_Bake2Serialize
|
||||
{
|
||||
RDIM_TopLevelInfo top_level_info;
|
||||
RDIM_BinarySectionList binary_sections;
|
||||
RDIM_UnitChunkList units;
|
||||
RDIM_TypeChunkList types;
|
||||
RDIM_UDTChunkList udts;
|
||||
RDIM_SrcFileChunkList src_files;
|
||||
RDIM_SymbolChunkList global_variables;
|
||||
RDIM_SymbolChunkList thread_variables;
|
||||
RDIM_SymbolChunkList procedures;
|
||||
RDIM_ScopeChunkList scopes;
|
||||
};
|
||||
|
||||
typedef struct P2R_BakeOut P2R_BakeOut;
|
||||
struct P2R_BakeOut
|
||||
{
|
||||
String8List blobs;
|
||||
RDIM_BakeSectionList sections;
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
@@ -258,7 +228,7 @@ internal U64 p2r_hash_from_voff(U64 voff);
|
||||
////////////////////////////////
|
||||
//~ rjf: Command Line -> Conversion Inputs
|
||||
|
||||
internal P2R_ConvertIn *p2r_convert_in_from_cmd_line(Arena *arena, CmdLine *cmdline);
|
||||
internal P2R_User2Convert *p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: COFF => RADDBGI Canonical Conversions
|
||||
@@ -311,11 +281,11 @@ internal void *p2r_symbol_stream_convert_task__entry_point(Arena *arena, void *p
|
||||
////////////////////////////////
|
||||
//~ rjf: Top-Level Conversion Entry Point
|
||||
|
||||
internal P2R_ConvertOut *p2r_convert(Arena *arena, P2R_ConvertIn *in);
|
||||
internal P2R_Convert2Bake *p2r_convert(Arena *arena, P2R_User2Convert *in);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Top-Level Baking Entry Point
|
||||
|
||||
internal P2R_BakeOut *p2r_bake(Arena *arena, P2R_BakeIn *in);
|
||||
internal P2R_Bake2Serialize *p2r_bake(Arena *arena, P2R_Convert2Bake *in);
|
||||
|
||||
#endif // RADDBGI_FROM_PDB_H
|
||||
|
||||
@@ -57,7 +57,7 @@ main(int argc, char **argv)
|
||||
String8List args = os_string_list_from_argcv(arena, argc, argv);
|
||||
CmdLine cmdline = cmd_line_from_string_list(arena, args);
|
||||
B32 should_capture = cmd_line_has_flag(&cmdline, str8_lit("capture"));
|
||||
P2R_ConvertIn *convert_in = p2r_convert_in_from_cmd_line(arena, &cmdline);
|
||||
P2R_User2Convert *user2convert = p2r_user2convert_from_cmdln(arena, &cmdline);
|
||||
|
||||
//- rjf: begin capture
|
||||
if(should_capture)
|
||||
@@ -66,47 +66,37 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
//- rjf: display errors with input
|
||||
if(convert_in->errors.node_count > 0 && !convert_in->hide_errors.input)
|
||||
if(user2convert->errors.node_count > 0 && !user2convert->hide_errors.input)
|
||||
{
|
||||
for(String8Node *n = convert_in->errors.first; n != 0; n = n->next)
|
||||
for(String8Node *n = user2convert->errors.first; n != 0; n = n->next)
|
||||
{
|
||||
fprintf(stderr, "error(input): %.*s\n", str8_varg(n->string));
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: convert
|
||||
P2R_ConvertOut *convert_out = 0;
|
||||
P2R_Convert2Bake *convert2bake = 0;
|
||||
ProfScope("convert")
|
||||
{
|
||||
convert_out = p2r_convert(arena, convert_in);
|
||||
convert2bake = p2r_convert(arena, user2convert);
|
||||
}
|
||||
|
||||
//- rjf: bake
|
||||
P2R_BakeOut *bake_out = 0;
|
||||
P2R_Bake2Serialize *bake2srlz = 0;
|
||||
ProfScope("bake")
|
||||
{
|
||||
P2R_BakeIn bake_in = {0};
|
||||
{
|
||||
bake_in.top_level_info = convert_out->top_level_info;
|
||||
bake_in.binary_sections = convert_out->binary_sections;
|
||||
bake_in.units = convert_out->units;
|
||||
bake_in.types = convert_out->types;
|
||||
bake_in.udts = convert_out->udts;
|
||||
bake_in.src_files = convert_out->src_files;
|
||||
bake_in.global_variables = convert_out->global_variables;
|
||||
bake_in.thread_variables = convert_out->thread_variables;
|
||||
bake_in.procedures = convert_out->procedures;
|
||||
bake_in.scopes = convert_out->scopes;
|
||||
}
|
||||
bake_out = p2r_bake(arena, &bake_in);
|
||||
bake2srlz = p2r_bake(arena, convert2bake);
|
||||
}
|
||||
|
||||
//- rjf: serialize
|
||||
String8List serialize_out = rdim_serialized_strings_from_params_bake_section_list(arena, &convert2bake->bake_params, &bake2srlz->sections);
|
||||
|
||||
//- rjf: write
|
||||
ProfScope("write")
|
||||
{
|
||||
OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, convert_in->output_name);
|
||||
OS_Handle output_file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_Write, user2convert->output_name);
|
||||
U64 off = 0;
|
||||
for(String8Node *n = bake_out->blobs.first; n != 0; n = n->next)
|
||||
for(String8Node *n = serialize_out.first; n != 0; n = n->next)
|
||||
{
|
||||
os_file_write(output_file, r1u64(off, off+n->string.size), n->string.str);
|
||||
off += n->string.size;
|
||||
|
||||
Reference in New Issue
Block a user