adjust step trap net build in case of memory read failure - ensure we get correct memory read, otherwise we can generate bad trap nets during heavy load. allow high vs. low priority in async rdi loading; use low-priority in pre-emptive case

This commit is contained in:
Ryan Fleury
2025-06-18 08:36:41 -07:00
parent 5de7c06d3b
commit 401f117653
12 changed files with 95 additions and 218 deletions
+56 -174
View File
@@ -38,124 +38,6 @@ p2r_hash_from_voff(U64 voff)
return hash;
}
////////////////////////////////
//~ rjf: Command Line -> Conversion Inputs
#if 0
internal P2R_ConvertParams *
p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline)
{
P2R_ConvertParams *result = push_array(arena, P2R_ConvertParams, 1);
//- rjf: get input pdb
{
String8 input_name = cmd_line_string(cmdline, str8_lit("pdb"));
if(input_name.size == 0)
{
str8_list_push(arena, &result->errors, str8_lit("Missing required parameter: '--pdb:<pdb_file>'"));
}
if(input_name.size > 0)
{
String8 input_data = os_data_from_file_path(arena, input_name);
if(input_data.size == 0)
{
str8_list_pushf(arena, &result->errors, "Could not load input PDB file from '%S'", input_name);
}
if(input_data.size != 0)
{
result->input_pdb_name = input_name;
result->input_pdb_data = input_data;
}
}
}
//- rjf: get input exe
{
String8 input_name = cmd_line_string(cmdline, str8_lit("exe"));
if(input_name.size > 0)
{
String8 input_data = os_data_from_file_path(arena, input_name);
if(input_data.size == 0)
{
str8_list_pushf(arena, &result->errors, "Could not load input EXE file from '%S'", input_name);
}
if(input_data.size != 0)
{
result->input_exe_name = input_name;
result->input_exe_data = input_data;
}
}
}
//- rjf: get output name
{
result->output_name = cmd_line_string(cmdline, str8_lit("out"));
if(result->output_name.size == 0)
{
str8_list_pushf(arena, &result->errors, "Missing required parameter: '--out:<output_path>'");
}
}
//- rjf: define string -> section flag bits
#define FlagNameMapXList \
Case("sections", BinarySections)\
Case("units", Units)\
Case("procedures", Procedures)\
Case("globals", GlobalVariables)\
Case("threadvars", ThreadVariables)\
Case("scopes", Scopes)\
Case("locals", Locals)\
Case("types", Types)\
Case("udts", UDTs)\
Case("lines", LineInfo)\
Case("globals_name_map", GlobalVariableNameMap)\
Case("threadvars_name_map", ThreadVariableNameMap)\
Case("procedure_name_map", ProcedureNameMap)\
Case("type_name_map", TypeNameMap)\
Case("link_name_map", LinkNameProcedureNameMap)\
Case("source_path_name_map",NormalSourcePathNameMap)\
//- rjf: get section flags
{
result->flags = P2R_ConvertFlag_All;
String8List only_names = cmd_line_strings(cmdline, str8_lit("only"));
String8List omit_names = cmd_line_strings(cmdline, str8_lit("only"));
if(only_names.node_count != 0)
{
result->flags = 0;
for(String8Node *n = only_names.first; n != 0; n = n->next)
{
String8 string = n->string;
#define Case(str, flag) if(str8_match(string, str8_lit(str), StringMatchFlag_CaseInsensitive)) {result->flags |= P2R_ConvertFlag_##flag;}
FlagNameMapXList;
#undef Case
}
}
if(omit_names.node_count != 0)
{
for(String8Node *n = omit_names.first; n != 0; n = n->next)
{
String8 string = n->string;
#define Case(str, flag) if(str8_match(string, str8_lit(str), StringMatchFlag_CaseInsensitive)) {result->flags &= ~P2R_ConvertFlag_##flag;}
FlagNameMapXList;
#undef Case
}
}
}
//- rjf: get other flags
{
if(cmd_line_has_flag(cmdline, str8_lit("deterministic")))
{
result->flags |= P2R_ConvertFlag_Deterministic;
}
}
#undef FlagNameMapXList
return result;
}
#endif
////////////////////////////////
//~ rjf: COFF <-> RDI Canonical Conversions
@@ -577,29 +459,29 @@ ASYNC_WORK_DEF(p2r_comp_unit_contributions_parse_work)
ProfScope("parse comp unit contributions") out = pdb_comp_unit_contribution_array_from_data(arena, in->data, in->coff_sections);
ProfEnd();
return out;
}
ASYNC_WORK_DEF(p2r_comp_unit_contributions_bucket_work)
{
ProfBeginFunction();
Arena *arena = async_root_thread_arena(p2r_async_root);
P2R_CompUnitContributionsBucketIn *in = (P2R_CompUnitContributionsBucketIn *)input;
P2R_CompUnitContributionsBucketOut *out = push_array(arena, P2R_CompUnitContributionsBucketOut, 1);
{
out->unit_ranges = push_array(arena, RDIM_Rng1U64ChunkList, in->comp_unit_count);
for(U64 idx = 0; idx < in->contributions.count; idx += 1)
{
PDB_CompUnitContribution *contribution = &in->contributions.contributions[idx];
if(contribution->mod < in->comp_unit_count)
{
RDIM_Rng1U64 r = {contribution->voff_first, contribution->voff_opl};
rdim_rng1u64_chunk_list_push(arena, &out->unit_ranges[contribution->mod], 256, r);
}
}
}
ProfEnd();
return out;
}
}
ASYNC_WORK_DEF(p2r_comp_unit_contributions_bucket_work)
{
ProfBeginFunction();
Arena *arena = async_root_thread_arena(p2r_async_root);
P2R_CompUnitContributionsBucketIn *in = (P2R_CompUnitContributionsBucketIn *)input;
P2R_CompUnitContributionsBucketOut *out = push_array(arena, P2R_CompUnitContributionsBucketOut, 1);
{
out->unit_ranges = push_array(arena, RDIM_Rng1U64ChunkList, in->comp_unit_count);
for(U64 idx = 0; idx < in->contributions.count; idx += 1)
{
PDB_CompUnitContribution *contribution = &in->contributions.contributions[idx];
if(contribution->mod < in->comp_unit_count)
{
RDIM_Rng1U64 r = {contribution->voff_first, contribution->voff_opl};
rdim_rng1u64_chunk_list_push(arena, &out->unit_ranges[contribution->mod], 256, r);
}
}
}
ProfEnd();
return out;
}
////////////////////////////////
//~ rjf: Unit Source File Gathering Tasks
@@ -959,8 +841,8 @@ ASYNC_WORK_DEF(p2r_unit_convert_work)
dst_unit->object_file = obj_name;
dst_unit->archive_file = pdb_unit->group_name;
dst_unit->language = p2r_rdi_language_from_cv_language(pdb_unit_sym->info.language);
dst_unit->line_table = line_table;
dst_unit->voff_ranges = in->comp_unit_ranges;
dst_unit->line_table = line_table;
dst_unit->voff_ranges = in->comp_unit_ranges;
}
////////////////////////////
@@ -3228,11 +3110,11 @@ ASYNC_WORK_DEF(p2r_symbol_stream_convert_work)
U8 *name_ptr = val_ptr + val.encoded_size;
String8 name = str8_cstring_capped(name_ptr, sym_data_opl);
String8 val_data = str8_struct(&val64);
U64 container_name_opl = 0;
if(type != 0)
{
container_name_opl = p2r_end_of_cplusplus_container_name(type->name);
}
U64 container_name_opl = 0;
if(type != 0)
{
container_name_opl = p2r_end_of_cplusplus_container_name(type->name);
}
String8 name_qualified = name;
if(container_name_opl != 0)
{
@@ -3279,8 +3161,8 @@ internal RDIM_BakeParams
p2r_convert(Arena *arena, ASYNC_Root *async_root, P2R_ConvertParams *in)
{
Temp scratch = scratch_begin(&arena, 1);
p2r_async_root = async_root;
p2r_async_root = async_root;
//////////////////////////////////////////////////////////////
//- rjf: parse MSF structure
//
@@ -3451,40 +3333,40 @@ p2r_convert(Arena *arena, ASYNC_Root *async_root, P2R_ConvertParams *in)
//////////////////////////////////////////////////////////////
//- rjf: do compilation unit parse
//
//
PDB_CompUnitArray *comp_units = 0;
U64 comp_unit_count = 0;
{
U64 comp_unit_count = 0;
{
P2R_CompUnitParseIn comp_unit_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo) : str8_zero()};
ASYNC_Task *comp_unit_parse_task = !dbi ? 0 : async_task_launch(scratch.arena, p2r_comp_unit_parse_work, .input = &comp_unit_parse_in);
comp_units = async_task_join_struct(comp_unit_parse_task, PDB_CompUnitArray);
comp_unit_count = comp_units ? comp_units->count : 0;
}
ASYNC_Task *comp_unit_parse_task = !dbi ? 0 : async_task_launch(scratch.arena, p2r_comp_unit_parse_work, .input = &comp_unit_parse_in);
comp_units = async_task_join_struct(comp_unit_parse_task, PDB_CompUnitArray);
comp_unit_count = comp_units ? comp_units->count : 0;
}
//////////////////////////////////////////////////////////////
//- rjf: do compilation unit contributions parse
//
//
PDB_CompUnitContributionArray *comp_unit_contributions = 0;
U64 comp_unit_contribution_count = 0;
{
U64 comp_unit_contribution_count = 0;
{
P2R_CompUnitContributionsParseIn comp_unit_contributions_parse_in = {dbi ? pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon) : str8_zero(), coff_sections};
ASYNC_Task *comp_unit_contributions_parse_task = !dbi ? 0 : async_task_launch(scratch.arena, p2r_comp_unit_contributions_parse_work, .input = &comp_unit_contributions_parse_in);
ASYNC_Task *comp_unit_contributions_parse_task = !dbi ? 0 : async_task_launch(scratch.arena, p2r_comp_unit_contributions_parse_work, .input = &comp_unit_contributions_parse_in);
comp_unit_contributions = async_task_join_struct(comp_unit_contributions_parse_task, PDB_CompUnitContributionArray);
comp_unit_contribution_count = comp_unit_contributions ? comp_unit_contributions->count : 0;
}
comp_unit_contribution_count = comp_unit_contributions ? comp_unit_contributions->count : 0;
}
//////////////////////////////////////////////////////////////
//- rjf: do compilation unit contributions bucket
//
RDIM_Rng1U64ChunkList *unit_ranges = 0;
if(comp_unit_contributions)
{
//
RDIM_Rng1U64ChunkList *unit_ranges = 0;
if(comp_unit_contributions)
{
P2R_CompUnitContributionsBucketIn in = {comp_unit_count, *comp_unit_contributions};
ASYNC_Task *task = async_task_launch(scratch.arena, p2r_comp_unit_contributions_bucket_work, .input = &in);
P2R_CompUnitContributionsBucketOut *out = async_task_join_struct(task, P2R_CompUnitContributionsBucketOut);
unit_ranges = out->unit_ranges;
}
ASYNC_Task *task = async_task_launch(scratch.arena, p2r_comp_unit_contributions_bucket_work, .input = &in);
P2R_CompUnitContributionsBucketOut *out = async_task_join_struct(task, P2R_CompUnitContributionsBucketOut);
unit_ranges = out->unit_ranges;
}
//////////////////////////////////////////////////////////////
//- rjf: parse syms & line info for each compilation unit
//
-7
View File
@@ -283,13 +283,6 @@ global ASYNC_Root *p2r_async_root = 0;
internal U64 p2r_end_of_cplusplus_container_name(String8 str);
internal U64 p2r_hash_from_voff(U64 voff);
////////////////////////////////
//~ rjf: Command Line -> Conversion Inputs
#if 0
internal P2R_ConvertParams *p2r_user2convert_from_cmdln(Arena *arena, CmdLine *cmdline);
#endif
////////////////////////////////
//~ rjf: COFF => RDI Canonical Conversions