raddbgi_from_pdb: move top-level compilation unit parsing to asynchronous tasks

This commit is contained in:
Ryan Fleury
2024-02-20 11:30:01 -08:00
parent 6b2e4abe81
commit 66ef1b3eeb
4 changed files with 63 additions and 70 deletions
+28 -31
View File
@@ -578,6 +578,15 @@ p2r_symbol_stream_parse_task__entry_point(Arena *arena, void *p)
return out;
}
internal void *
p2r_comp_unit_parse_task__entry_point(Arena *arena, void *p)
{
P2R_CompUnitParseIn *in = (P2R_CompUnitParseIn *)p;
void *out = 0;
ProfScope("parse comp units") out = pdb_comp_unit_array_from_data(arena, in->data);
return out;
}
////////////////////////////////
//~ rjf: Type Forward Resolution Map Build / Thread
@@ -1567,6 +1576,9 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
CV_LeafParsed *tpi_leaf = 0;
PDB_TpiHashParsed *ipi_hash = 0;
CV_LeafParsed *ipi_leaf = 0;
CV_SymParsed *sym = 0;
PDB_CompUnitArray *comp_units = 0;
U64 comp_unit_count = 0;
ProfScope("do independent parsing & preparation passess")
{
//- rjf: form task inputs
@@ -1595,41 +1607,26 @@ p2r_convert(Arena *arena, P2R_ConvertIn *in)
ipi_leaf_in.leaf_data = pdb_leaf_data_from_tpi(ipi);
ipi_leaf_in.itype_first = ipi->itype_first;
}
P2R_SymbolStreamParseIn sym_parse_in = {dbi ? msf_data_from_stream(msf, dbi->sym_sn) : str8_zero()};
P2R_CompUnitParseIn comp_unit_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo) : str8_zero()};
//- rjf: kick off tasks
TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in);
TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &tpi_hash_in);
TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &tpi_leaf_in);
TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &ipi_hash_in);
TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &ipi_leaf_in);
TS_Ticket exe_hash_ticket = ts_kickoff(p2r_exe_hash_task__entry_point, &exe_hash_in);
TS_Ticket tpi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &tpi_hash_in);
TS_Ticket tpi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &tpi_leaf_in);
TS_Ticket ipi_hash_ticket = ts_kickoff(p2r_tpi_hash_parse_task__entry_point, &ipi_hash_in);
TS_Ticket ipi_leaf_ticket = ts_kickoff(p2r_tpi_leaf_parse_task__entry_point, &ipi_leaf_in);
TS_Ticket sym_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_symbol_stream_parse_task__entry_point, &sym_parse_in);
TS_Ticket comp_unit_parse_ticket = !dbi ? ts_ticket_zero() : ts_kickoff(p2r_comp_unit_parse_task__entry_point, &comp_unit_parse_in);
//- rjf: join tasks
exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64);
tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed);
tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed);
ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed);
ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed);
}
//////////////////////////////////////////////////////////////
//- rjf: parse sym
//
CV_SymParsed *sym = 0;
if(dbi != 0) ProfScope("parse sym")
{
String8 sym_data = msf_data_from_stream(msf, dbi->sym_sn);
sym = cv_sym_from_data(arena, sym_data, 4);
}
//////////////////////////////////////////////////////////////
//- rjf: parse compilation units
//
PDB_CompUnitArray *comp_units = 0;
U64 comp_unit_count = 0;
if(dbi != 0) ProfScope("parse compilation units")
{
String8 mod_info_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo);
comp_units = pdb_comp_unit_array_from_data(arena, mod_info_data);
exe_hash = *ts_join_struct(exe_hash_ticket, max_U64, U64);
tpi_hash = ts_join_struct(tpi_hash_ticket, max_U64, PDB_TpiHashParsed);
tpi_leaf = ts_join_struct(tpi_leaf_ticket, max_U64, CV_LeafParsed);
ipi_hash = ts_join_struct(ipi_hash_ticket, max_U64, PDB_TpiHashParsed);
ipi_leaf = ts_join_struct(ipi_leaf_ticket, max_U64, CV_LeafParsed);
sym = ts_join_struct(sym_parse_ticket, max_U64, CV_SymParsed);
comp_units = ts_join_struct(comp_unit_parse_ticket,max_U64, PDB_CompUnitArray);
comp_unit_count = comp_units->count;
}
+6 -28
View File
@@ -67,14 +67,6 @@ struct P2R_TPIHashParseIn
String8 aux_data;
};
typedef struct P2R_TPIHashParseTask P2R_TPIHashParseTask;
struct P2R_TPIHashParseTask
{
P2R_TPIHashParseIn in;
Arena *out_arena;
PDB_TpiHashParsed *out;
};
//- rjf: tpi leaves parsing
typedef struct P2R_TPILeafParseIn P2R_TPILeafParseIn;
@@ -84,14 +76,6 @@ struct P2R_TPILeafParseIn
CV_TypeId itype_first;
};
typedef struct P2R_TPILeafParseTask P2R_TPILeafParseTask;
struct P2R_TPILeafParseTask
{
P2R_TPILeafParseIn in;
Arena *out_arena;
CV_LeafParsed *out;
};
//- rjf: exe hashing
typedef struct P2R_EXEHashIn P2R_EXEHashIn;
@@ -100,13 +84,6 @@ struct P2R_EXEHashIn
String8 exe_data;
};
typedef struct P2R_EXEHashTask P2R_EXEHashTask;
struct P2R_EXEHashTask
{
P2R_EXEHashIn in;
U64 out;
};
//- rjf: symbol stream parsing
typedef struct P2R_SymbolStreamParseIn P2R_SymbolStreamParseIn;
@@ -115,12 +92,12 @@ struct P2R_SymbolStreamParseIn
String8 data;
};
typedef struct P2R_SymbolStreamParseTask P2R_SymbolStreamParseTask;
struct P2R_SymbolStreamParseTask
//- rjf: comp unit parsing
typedef struct P2R_CompUnitParseIn P2R_CompUnitParseIn;
struct P2R_CompUnitParseIn
{
P2R_SymbolStreamParseIn in;
Arena *out_arena;
CV_SymParsed *sym;
String8 data;
};
////////////////////////////////
@@ -255,6 +232,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_comp_unit_parse_task__entry_point(Arena *arena, void *p);
////////////////////////////////
//~ rjf: Type Forward Resolution Map Build Path & Thread
+24 -11
View File
@@ -1,3 +1,13 @@
////////////////////////////////
//~ rjf: Basic Type Functions
internal TS_Ticket
ts_ticket_zero(void)
{
TS_Ticket ticket = {0};
return ticket;
}
////////////////////////////////
//~ rjf: Top-Level Layer Initialization
@@ -93,21 +103,24 @@ ts_join(TS_Ticket ticket, U64 endt_us)
TS_TaskArtifactSlot *slot = &ts_shared->artifact_slots[slot_idx];
TS_TaskArtifactStripe *stripe = &ts_shared->artifact_stripes[stripe_idx];
TS_TaskArtifact *artifact = (TS_TaskArtifact *)ticket.u64[1];
OS_MutexScopeR(stripe->rw_mutex) for(;;)
if(artifact != 0)
{
B64 task_is_done = artifact->task_is_done;
if(task_is_done)
OS_MutexScopeR(stripe->rw_mutex) for(;;)
{
OS_MutexScopeRWPromote(stripe->rw_mutex)
B64 task_is_done = artifact->task_is_done;
if(task_is_done)
{
result = artifact->result;
SLLStackPush(stripe->free_artifact, artifact);
OS_MutexScopeRWPromote(stripe->rw_mutex)
{
result = artifact->result;
SLLStackPush(stripe->free_artifact, artifact);
}
break;
}
else
{
os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us);
}
break;
}
else
{
os_condition_variable_wait_rw_r(stripe->cv, stripe->rw_mutex, endt_us);
}
}
return result;
+5
View File
@@ -92,6 +92,11 @@ struct TS_Shared
global TS_Shared *ts_shared = 0;
////////////////////////////////
//~ rjf: Basic Type Functions
internal TS_Ticket ts_ticket_zero(void);
////////////////////////////////
//~ rjf: Top-Level Layer Initialization