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:
Ryan Fleury
2024-02-21 13:43:56 -08:00
parent 25ef98a98c
commit f93b71d8c3
5 changed files with 1918 additions and 1608 deletions
+29 -33
View File
@@ -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, &sections);
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;
}
+12 -42
View File
@@ -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
+12 -22
View File
@@ -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;