From bf2d5640fa14209d72008c1a73474fa2e4da30c4 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 13 Jun 2024 10:41:19 -0700 Subject: [PATCH] go back to per-inline-site line tables; eliminate call location for inline tables; these can be encoded via parent line tables; wire up parsed line tables to inline site production from symbol conversion phase --- project.4coder | 3 +- src/demon/demon_core.h | 2 +- src/lib_rdi_format/rdi_format.h | 6 --- src/lib_rdi_make/rdi_make.c | 3 -- src/lib_rdi_make/rdi_make.h | 3 -- src/rdi_dump/rdi_dump.c | 6 --- src/rdi_format/rdi_format.mdesk | 3 -- src/rdi_from_pdb/rdi_from_pdb.c | 83 ++++++++++++++++++++++++--------- src/rdi_from_pdb/rdi_from_pdb.h | 2 + 9 files changed, 65 insertions(+), 46 deletions(-) diff --git a/project.4coder b/project.4coder index 460ed992..5409cda1 100644 --- a/project.4coder +++ b/project.4coder @@ -47,7 +47,8 @@ commands = { .rjf_f1 = { - .win = "build raddbg telemetry", + .win = "build rdi_from_pdb rdi_dump && pushd build && rdi_from_pdb --pdb:mule_main.pdb --out:mule_main.rdi && rdi_dump mule_main.rdi > mule_main.dump && popd", + // .win = "build raddbg telemetry", .linux = "", .out = "*compilation*", .footer_panel = true, diff --git a/src/demon/demon_core.h b/src/demon/demon_core.h index 48a2cb63..53d3ef99 100644 --- a/src/demon/demon_core.h +++ b/src/demon/demon_core.h @@ -15,7 +15,7 @@ typedef struct DMN_CtrlCtx DMN_CtrlCtx; struct DMN_CtrlCtx { - U64 u64 [1]; + U64 u64[1]; }; //////////////////////////////// diff --git a/src/lib_rdi_format/rdi_format.h b/src/lib_rdi_format/rdi_format.h index 9f065ba1..bded37a4 100644 --- a/src/lib_rdi_format/rdi_format.h +++ b/src/lib_rdi_format/rdi_format.h @@ -783,9 +783,6 @@ X(RDI_U32, inline_site_idx)\ #define RDI_InlineSite_XList \ X(RDI_U32, name_string_idx)\ -X(RDI_U32, call_src_file_idx)\ -X(RDI_U32, call_line_num)\ -X(RDI_U32, call_col_num)\ X(RDI_U32, type_idx)\ X(RDI_U32, owner_type_idx)\ X(RDI_U32, line_table_idx)\ @@ -1218,9 +1215,6 @@ typedef struct RDI_InlineSite RDI_InlineSite; struct RDI_InlineSite { RDI_U32 name_string_idx; -RDI_U32 call_src_file_idx; -RDI_U32 call_line_num; -RDI_U32 call_col_num; RDI_U32 type_idx; RDI_U32 owner_type_idx; RDI_U32 line_table_idx; diff --git a/src/lib_rdi_make/rdi_make.c b/src/lib_rdi_make/rdi_make.c index 5dd75247..c106943f 100644 --- a/src/lib_rdi_make/rdi_make.c +++ b/src/lib_rdi_make/rdi_make.c @@ -3435,9 +3435,6 @@ rdim_bake_inline_sites(RDIM_Arena *arena, RDIM_BakeStringMapTight *strings, RDIM RDI_InlineSite *dst = &result.inline_sites[dst_idx]; RDIM_InlineSite *src = &n->v[chunk_idx]; dst->name_string_idx = rdim_bake_idx_from_string(strings, src->name); - dst->call_src_file_idx = (RDI_U32)rdim_idx_from_src_file(src->call_src_file); // TODO(rjf): @u64_to_u32 - dst->call_line_num = src->call_line_num; - dst->call_col_num = src->call_col_num; dst->type_idx = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32 dst->owner_type_idx = (RDI_U32)rdim_idx_from_type(src->owner); // TODO(rjf): @u64_to_u32 dst->line_table_idx = (RDI_U32)rdim_idx_from_line_table(src->line_table); // TODO(rjf): @u64_to_u32 diff --git a/src/lib_rdi_make/rdi_make.h b/src/lib_rdi_make/rdi_make.h index bb70bf42..025e7b2f 100644 --- a/src/lib_rdi_make/rdi_make.h +++ b/src/lib_rdi_make/rdi_make.h @@ -773,9 +773,6 @@ struct RDIM_InlineSite { struct RDIM_InlineSiteChunkNode *chunk; RDIM_String8 name; - RDIM_SrcFile *call_src_file; - RDI_U32 call_line_num; - RDI_U32 call_col_num; RDIM_Type *type; RDIM_Type *owner; RDIM_LineTable *line_table; diff --git a/src/rdi_dump/rdi_dump.c b/src/rdi_dump/rdi_dump.c index 17c21cc8..59284b0e 100644 --- a/src/rdi_dump/rdi_dump.c +++ b/src/rdi_dump/rdi_dump.c @@ -778,13 +778,7 @@ rdi_stringize_inline_site(Arena *arena, String8List *out, RDI_Parsed *rdi, RDI_I { String8 name = {0}; name.str = rdi_string_from_idx(rdi, inline_site->name_string_idx, &name.size); - RDI_SourceFile *source_file = rdi_element_from_name_idx(rdi, SourceFiles, inline_site->call_src_file_idx); - String8 source_file_path = {0}; - source_file_path.str = rdi_normal_path_from_source_file(rdi, source_file, &source_file_path.size); str8_list_pushf(arena, out, "%.*sname='%S'\n", indent_level, rdi_stringize_spaces, name); - str8_list_pushf(arena, out, "%.*scall_src_file_idx=%u ('%S')\n", indent_level, rdi_stringize_spaces, inline_site->call_src_file_idx, source_file_path); - str8_list_pushf(arena, out, "%.*scall_line_num=%u\n", indent_level, rdi_stringize_spaces, inline_site->call_line_num); - str8_list_pushf(arena, out, "%.*scall_col_num=%u\n", indent_level, rdi_stringize_spaces, inline_site->call_col_num); str8_list_pushf(arena, out, "%.*stype_idx=%u\n", indent_level, rdi_stringize_spaces, inline_site->type_idx); str8_list_pushf(arena, out, "%.*sowner_type_idx=%u\n", indent_level, rdi_stringize_spaces, inline_site->owner_type_idx); str8_list_pushf(arena, out, "%.*sline_table_idx=%u\n", indent_level, rdi_stringize_spaces, inline_site->line_table_idx); diff --git a/src/rdi_format/rdi_format.mdesk b/src/rdi_format/rdi_format.mdesk index edc8e813..b6ff7d21 100644 --- a/src/rdi_format/rdi_format.mdesk +++ b/src/rdi_format/rdi_format.mdesk @@ -1016,9 +1016,6 @@ RDI_ScopeMemberTable: RDI_InlineSiteMemberTable: { {name_string_idx RDI_U32 ""} - {call_src_file_idx RDI_U32 ""} - {call_line_num RDI_U32 ""} - {call_col_num RDI_U32 ""} {type_idx RDI_U32 ""} {owner_type_idx RDI_U32 ""} {line_table_idx RDI_U32 ""} diff --git a/src/rdi_from_pdb/rdi_from_pdb.c b/src/rdi_from_pdb/rdi_from_pdb.c index 86a3f139..7393d59e 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.c +++ b/src/rdi_from_pdb/rdi_from_pdb.c @@ -583,7 +583,6 @@ internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) //////////////////////////// //- rjf: pass 1: build per-unit info & per-unit line tables // - RDIM_LineTable **unit_line_tables = push_array(scratch.arena, RDIM_LineTable *, in->comp_units->count); ProfScope("pass 1: build per-unit info & per-unit line tables") for(U64 comp_unit_idx = 0; comp_unit_idx < in->comp_units->count; comp_unit_idx += 1) { @@ -611,8 +610,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) } //- rjf: build this unit's line table, fill out primary line info (inline info added after) - RDIM_LineTable *line_table = rdim_line_table_chunk_list_push(arena, &out->line_tables, 256); - unit_line_tables[comp_unit_idx] = line_table; + RDIM_LineTable *line_table = 0; for(CV_C13SubSectionNode *node = pdb_unit_c13->first_sub_section; node != 0; node = node->next) @@ -657,8 +655,15 @@ internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) } // rjf: push sequence into both line table & source file's line map - RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, &out->line_tables, line_table, src_file_node->src_file, lines->voffs, lines->line_nums, lines->col_nums, lines->line_count); - rdim_src_file_push_line_sequence(arena, &out->src_files, src_file_node->src_file, seq); + if(lines->line_count != 0) + { + if(line_table == 0) + { + line_table = rdim_line_table_chunk_list_push(arena, &out->line_tables, 256); + } + RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, &out->line_tables, line_table, src_file_node->src_file, lines->voffs, lines->line_nums, lines->col_nums, lines->line_count); + rdim_src_file_push_line_sequence(arena, &out->src_files, src_file_node->src_file, seq); + } } } } @@ -692,6 +697,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) //////////////////////////// //- rjf: pass 3: parse all inlinee line tables // + out->units_first_inline_site_line_tables = push_array(arena, RDIM_LineTable *, in->comp_units->count); ProfScope("pass 3: parse all inlinee line tables") for(U64 comp_unit_idx = 0; comp_unit_idx < in->comp_units->count; comp_unit_idx += 1) { @@ -990,8 +996,19 @@ internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) } // rjf: push - RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, &out->line_tables, unit_line_tables[comp_unit_idx], src_file_node->src_file, voffs, line_nums, 0, line_count); - rdim_src_file_push_line_sequence(arena, &out->src_files, src_file_node->src_file, seq); + if(line_count != 0) + { + if(line_table == 0) + { + line_table = rdim_line_table_chunk_list_push(arena, &out->line_tables, 256); + if(out->units_first_inline_site_line_tables[comp_unit_idx] == 0) + { + out->units_first_inline_site_line_tables[comp_unit_idx] = line_table; + } + } + RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, &out->line_tables, line_table, src_file_node->src_file, voffs, line_nums, 0, line_count); + rdim_src_file_push_line_sequence(arena, &out->src_files, src_file_node->src_file, seq); + } // rjf: clear line chunks for subsequent sequences first_line_chunk = last_line_chunk = 0; @@ -1005,11 +1022,6 @@ internal TS_TASK_FUNCTION_DEF(p2r_units_convert_task__entry_point) last_code_offset = code_offset; } } - - // rjf: insert line table to map, for later lookups - { - // TODO(rjf) - } }break; } } @@ -2240,6 +2252,7 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) }; P2R_ScopeNode *top_scope_node = 0; P2R_ScopeNode *free_scope_node = 0; + RDIM_LineTable *inline_site_line_table = in->first_inline_site_line_table; for(CV_RecRange *rec_range = rec_ranges_first; rec_range < rec_ranges_opl; rec_range += 1) @@ -2872,9 +2885,30 @@ internal TS_TASK_FUNCTION_DEF(p2r_symbol_stream_convert_task__entry_point) // rjf: build inline site RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, &sym_inline_sites, sym_inline_sites_chunk_cap); - inline_site->name = name; - inline_site->type = type; - inline_site->owner= owner; + inline_site->name = name; + inline_site->type = type; + inline_site->owner = owner; + inline_site->line_table = inline_site_line_table; + + // rjf: increment to next inline site line table in this unit + if(inline_site_line_table != 0 && inline_site_line_table->chunk != 0) + { + RDIM_LineTableChunkNode *chunk = inline_site_line_table->chunk; + U64 current_idx = (U64)(inline_site_line_table - chunk->v); + if(current_idx+1 < chunk->count) + { + inline_site_line_table += 1; + } + else + { + chunk = chunk->next; + inline_site_line_table = 0; + if(chunk != 0) + { + inline_site_line_table = chunk->v; + } + } + } // rjf: build scope RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, &sym_scopes, sym_scopes_chunk_cap); @@ -3957,12 +3991,14 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) RDIM_UnitChunkList all_units = {0}; RDIM_SrcFileChunkList all_src_files = {0}; RDIM_LineTableChunkList all_line_tables = {0}; + RDIM_LineTable **units_first_inline_site_line_tables = 0; ProfScope("join unit conversion & src file tasks") { P2R_UnitConvertOut *out = ts_join_struct(unit_convert_ticket, max_U64, P2R_UnitConvertOut); all_units = out->units; all_src_files = out->src_files; all_line_tables = out->line_tables; + units_first_inline_site_line_tables = out->units_first_inline_site_line_tables; } ////////////////////////////////////////////////////////////// @@ -3987,14 +4023,14 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) { for(U64 idx = 0; idx < tasks_count; idx += 1) { - tasks_inputs[idx].arch = arch; - tasks_inputs[idx].coff_sections = coff_sections; - tasks_inputs[idx].tpi_hash = tpi_hash; - tasks_inputs[idx].tpi_leaf = tpi_leaf; - tasks_inputs[idx].ipi_leaf = ipi_leaf; - tasks_inputs[idx].itype_fwd_map = itype_fwd_map; - tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; - tasks_inputs[idx].link_name_map = link_name_map; + tasks_inputs[idx].arch = arch; + tasks_inputs[idx].coff_sections = coff_sections; + tasks_inputs[idx].tpi_hash = tpi_hash; + tasks_inputs[idx].tpi_leaf = tpi_leaf; + tasks_inputs[idx].ipi_leaf = ipi_leaf; + tasks_inputs[idx].itype_fwd_map = itype_fwd_map; + tasks_inputs[idx].itype_type_ptrs = itype_type_ptrs; + tasks_inputs[idx].link_name_map = link_name_map; if(idx < global_stream_subdivision_tasks_count) { tasks_inputs[idx].sym = sym; @@ -4007,6 +4043,7 @@ p2r_convert(Arena *arena, P2R_User2Convert *in) tasks_inputs[idx].sym = sym_for_unit[idx-global_stream_subdivision_tasks_count]; tasks_inputs[idx].sym_ranges_first= 0; tasks_inputs[idx].sym_ranges_opl = sym_for_unit[idx-global_stream_subdivision_tasks_count]->sym_ranges.count; + tasks_inputs[idx].first_inline_site_line_table = units_first_inline_site_line_tables[idx-global_stream_subdivision_tasks_count]; } tasks_tickets[idx] = ts_kickoff(p2r_symbol_stream_convert_task__entry_point, 0, &tasks_inputs[idx]); } diff --git a/src/rdi_from_pdb/rdi_from_pdb.h b/src/rdi_from_pdb/rdi_from_pdb.h index fcf73c03..a0a78db5 100644 --- a/src/rdi_from_pdb/rdi_from_pdb.h +++ b/src/rdi_from_pdb/rdi_from_pdb.h @@ -187,6 +187,7 @@ struct P2R_UnitConvertOut RDIM_UnitChunkList units; RDIM_SrcFileChunkList src_files; RDIM_LineTableChunkList line_tables; + RDIM_LineTable **units_first_inline_site_line_tables; }; //- rjf: link name map building tasks @@ -258,6 +259,7 @@ struct P2R_SymbolStreamConvertIn CV_TypeId *itype_fwd_map; RDIM_Type **itype_type_ptrs; P2R_LinkNameMap *link_name_map; + RDIM_LineTable *first_inline_site_line_table; }; typedef struct P2R_SymbolStreamConvertOut P2R_SymbolStreamConvertOut;