raddbgi_from_pdb: offload c13 line info parsing to task threads

This commit is contained in:
Ryan Fleury
2024-02-20 13:16:52 -08:00
parent e7ab92e07c
commit b8a4aeac39
2 changed files with 37 additions and 27 deletions
+26 -27
View File
@@ -578,6 +578,15 @@ p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p)
return out;
}
internal void *
p2r_c13_stream_parse_task__entry_point(Arena *arena, void *p)
{
P2R_C13StreamParseIn *in = (P2R_C13StreamParseIn *)p;
void *out = 0;
ProfScope("parse c13 stream") out = cv_c13_from_data(arena, in->data, in->strtbl, in->coff_sections);
return out;
}
internal void *
p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p)
{
@@ -1848,43 +1857,33 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
}
//////////////////////////////////////////////////////////////
//- rjf: parse syms for each compilation unit
//- rjf: parse syms & line info for each compilation unit
//
CV_SymParsed **sym_for_unit = push_array(arena, CV_SymParsed*, comp_unit_count);
if(comp_units != 0) ProfScope("parse syms for each compilation unit")
CV_SymParsed **sym_for_unit = push_array(arena, CV_SymParsed *, comp_unit_count);
CV_C13Parsed **c13_for_unit = push_array(arena, CV_C13Parsed *, comp_unit_count);
if(comp_units != 0) ProfScope("parse syms & line info for each compilation unit")
{
//- rjf: kick off parsing tasks
P2R_SymbolStreamParseIn *tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamParseIn, comp_unit_count);
TS_Ticket *tasks_tickets = push_array(scratch.arena, TS_Ticket, comp_unit_count);
//- rjf: kick off tasks
P2R_SymbolStreamParseIn *sym_tasks_inputs = push_array(scratch.arena, P2R_SymbolStreamParseIn, comp_unit_count);
TS_Ticket *sym_tasks_tickets = push_array(scratch.arena, TS_Ticket, comp_unit_count);
P2R_C13StreamParseIn *c13_tasks_inputs = push_array(scratch.arena, P2R_C13StreamParseIn, comp_unit_count);
TS_Ticket *c13_tasks_tickets = push_array(scratch.arena, TS_Ticket, comp_unit_count);
for(U64 idx = 0; idx < comp_unit_count; idx += 1)
{
PDB_CompUnit *unit = comp_units->units[idx];
tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols);
tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &tasks_inputs[idx]);
sym_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols);
sym_tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &sym_tasks_inputs[idx]);
c13_tasks_inputs[idx].data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_C13);
c13_tasks_inputs[idx].strtbl = strtbl;
c13_tasks_inputs[idx].coff_sections = coff_sections;
c13_tasks_tickets[idx] = ts_kickoff(p2r_c13_stream_parse_task__entry_point, &c13_tasks_inputs[idx]);
}
//- rjf: join tasks
for(U64 idx = 0; idx < comp_unit_count; idx += 1)
{
sym_for_unit[idx] = ts_join_struct(tasks_tickets[idx], max_U64, CV_SymParsed);
}
}
//////////////////////////////////////////////////////////////
//- rjf: parse c13 for each compilation unit
//
CV_C13Parsed **c13_for_unit = push_array(arena, CV_C13Parsed*, comp_unit_count);
if(comp_units != 0) ProfScope("parse c13s")
{
PDB_CompUnit **unit_ptr = comp_units->units;
for(U64 i = 0; i < comp_unit_count; i += 1, unit_ptr += 1)
{
CV_C13Parsed *unit_c13 = 0;
{
String8 c13_data = pdb_data_from_unit_range(msf, *unit_ptr, PDB_DbiCompUnitRange_C13);
unit_c13 = cv_c13_from_data(arena, c13_data, strtbl, coff_sections);
}
c13_for_unit[i] = unit_c13;
sym_for_unit[idx] = ts_join_struct(sym_tasks_tickets[idx], max_U64, CV_SymParsed);
c13_for_unit[idx] = ts_join_struct(c13_tasks_tickets[idx], max_U64, CV_C13Parsed);
}
}
+11
View File
@@ -92,6 +92,16 @@ struct P2R_SymbolStreamParseIn
String8 data;
};
//- rjf: c13 line info stream parsing
typedef struct P2R_C13StreamParseIn P2R_C13StreamParseIn;
struct P2R_C13StreamParseIn
{
String8 data;
PDB_Strtbl *strtbl;
PDB_CoffSectionArray *coff_sections;
};
//- rjf: comp unit parsing
typedef struct P2R_CompUnitParseIn P2R_CompUnitParseIn;
@@ -227,6 +237,7 @@ internal void *p2r_exe_hash_task__entry_point(Arena *arena, void *p);
internal void *p2r_tpi_hash_parse_task__entry_point(Arena *arena, void *p);
internal void *p2r_tpi_leaf_parse_task__entry_point(Arena *arena, void *p);
internal void *p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p);
internal void *p2r_c13_stream_parse_task__entry_point(Arena *arena, void *p);
internal void *p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p);
internal void *p2r_comp_unit_contributions_parse_task__entry_point(Arena *arena, void *p);