diff --git a/src/lib_raddbgi_make/raddbgi_make.c b/src/lib_raddbgi_make/raddbgi_make.c index 9d5c6723..b8bcd0dc 100644 --- a/src/lib_raddbgi_make/raddbgi_make.c +++ b/src/lib_raddbgi_make/raddbgi_make.c @@ -998,8 +998,8 @@ rdim_bake_section_count_from_params(RDIM_BakeParams *params) section_count += params->src_files.total_count; // PER-SOURCE-FILE line map numbers section_count += params->src_files.total_count; // PER-SOURCE-FILE line map ranges section_count += params->src_files.total_count; // PER-SOURCE-FILE line map voffs - section_count += RDI_NameMapKind_COUNT; // PER-NAME-MAP buckets section - section_count += RDI_NameMapKind_COUNT; // PER-NAME-MAP nodes section + section_count += RDI_NameMapKind_COUNT-1; // PER-NAME-MAP buckets section + section_count += RDI_NameMapKind_COUNT-1; // PER-NAME-MAP nodes section } return section_count; } @@ -1054,12 +1054,12 @@ rdim_bake_section_idx_from_params_tag_idx(RDIM_BakeParams *params, RDI_DataSecti case RDI_DataSectionTag_NameMapBuckets: if(idx != 0) { - result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 0*RDI_NameMapKind_COUNT + (idx-1)%RDI_NameMapKind_COUNT; + result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 0*(RDI_NameMapKind_COUNT-1) + (idx-1)%(RDI_NameMapKind_COUNT-1); }break; case RDI_DataSectionTag_NameMapNodes: if(idx != 0) { - result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 1*RDI_NameMapKind_COUNT + (idx-1)%RDI_NameMapKind_COUNT; + result = RDI_DataSectionTag_PRIMARY_COUNT + 3*params->units.total_count + 3*params->src_files.total_count + 1*(RDI_NameMapKind_COUNT-1) + (idx-1)%(RDI_NameMapKind_COUNT-1); }break; } return result; @@ -1693,6 +1693,7 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) for(RDI_U64 idx = 0; idx < n->count; idx += 1) { rdim_bake_string_map_insert(arena, &strings, n->v[idx].name); + rdim_bake_string_map_insert(arena, &strings, n->v[idx].link_name); } } } @@ -1716,15 +1717,111 @@ rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) return strings; } +//- rjf: bake name map building + +RDI_PROC RDIM_BakeNameMap +rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDIM_BakeParams *params) +{ + RDIM_BakeNameMap map = {0}; + switch(kind) + { + default:{}break; + case RDI_NameMapKind_GlobalVariables: + { + map.slots_count = params->global_variables.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_SymbolChunkNode *n = params->global_variables.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_ThreadVariables: + { + map.slots_count = params->thread_variables.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_SymbolChunkNode *n = params->thread_variables.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_Procedures: + { + map.slots_count = params->procedures.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_Types: + { + map.slots_count = params->types.total_count; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_TypeChunkNode *n = params->types.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 type_idx = (RDI_U32)rdim_idx_from_type(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].name, type_idx); + } + } + }break; + case RDI_NameMapKind_LinkNameProcedures: + { + map.slots_count = params->procedures.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_SymbolChunkNode *n = params->procedures.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + if(n->v[idx].link_name.size == 0) {continue;} + RDI_U32 symbol_idx = (RDI_U32)rdim_idx_from_symbol(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].link_name, symbol_idx); + } + } + }break; + case RDI_NameMapKind_NormalSourcePaths: + { + map.slots_count = params->src_files.total_count*2; + map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); + for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next) + { + for(RDI_U64 idx = 0; idx < n->count; idx += 1) + { + RDI_U32 src_file_idx = (RDI_U32)rdim_idx_from_src_file(&n->v[idx]); // TODO(rjf): @u64_to_u32 + rdim_bake_name_map_push(arena, &map, n->v[idx].normal_full_path, src_file_idx); + } + } + }break; + } + return map; +} + //- rjf: idx run map building RDI_PROC RDIM_BakeIdxRunMap rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) { + //- rjf: set up map RDIM_BakeIdxRunMap idx_runs = {0}; idx_runs.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunNode *, idx_runs.slots_count); rdim_bake_idx_run_map_insert(arena, &idx_runs, 0, 0); + + + return idx_runs; } @@ -1738,21 +1835,6 @@ rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params) return tree; } -//- rjf: bake name map building - -RDI_PROC RDIM_BakeNameMap -rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDIM_BakeParams *params) -{ - RDIM_BakeNameMap map = {0}; - map.slots_count = params->procedures.total_count*2 + params->global_variables.total_count*2 + params->thread_variables.total_count*2 + params->types.total_count*2; - map.slots = rdim_push_array(arena, RDIM_BakeNameMapNode *, map.slots_count); - switch(kind) - { - default:{}break; - } - return map; -} - //////////////////////////////// //~ rjf: [Baking] Build Artifacts -> Data Section Lists diff --git a/src/lib_raddbgi_make/raddbgi_make.h b/src/lib_raddbgi_make/raddbgi_make.h index d32adc13..ae92e591 100644 --- a/src/lib_raddbgi_make/raddbgi_make.h +++ b/src/lib_raddbgi_make/raddbgi_make.h @@ -1171,15 +1171,15 @@ RDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, //- rjf: bake string map building RDI_PROC RDIM_BakeStringMap rdim_bake_string_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); +//- rjf: bake name map building +RDI_PROC RDIM_BakeNameMap rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDIM_BakeParams *params); + //- rjf: bake idx run map building RDI_PROC RDIM_BakeIdxRunMap rdim_bake_idx_run_map_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); //- rjf: bake path tree building RDI_PROC RDIM_BakePathTree rdim_bake_path_tree_from_params(RDIM_Arena *arena, RDIM_BakeParams *params); -//- rjf: bake name map building -RDI_PROC RDIM_BakeNameMap rdim_bake_name_map_from_kind_params(RDIM_Arena *arena, RDI_NameMapKind kind, RDIM_BakeParams *params); - //////////////////////////////// //~ rjf: [Baking] Build Artifacts -> Data Section Lists diff --git a/src/raddbgi_from_pdb/raddbgi_from_pdb.c b/src/raddbgi_from_pdb/raddbgi_from_pdb.c index 10fa339b..21a7bd36 100644 --- a/src/raddbgi_from_pdb/raddbgi_from_pdb.c +++ b/src/raddbgi_from_pdb/raddbgi_from_pdb.c @@ -3380,144 +3380,161 @@ internal P2R_Bake2Serialize * p2r_bake(Arena *arena, P2R_Convert2Bake *in) { RDIM_BakeParams *params = &in->bake_params; - - ////////////////////////////// - //- rjf: build interned string map - // - RDIM_BakeStringMap strings = rdim_bake_string_map_from_params(arena, params); - - ////////////////////////////// - //- rjf: build interned idx run map - // - RDIM_BakeIdxRunMap idx_runs = rdim_bake_idx_run_map_from_params(arena, params); - - ////////////////////////////// - //- rjf: build interned path tree - // - RDIM_BakePathTree path_tree = rdim_bake_path_tree_from_params(arena, params); - - ////////////////////////////// - //- rjf: build name maps - // - RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0}; - { - for(RDI_NameMapKind k = (RDI_NameMapKind)0; k < RDI_NameMapKind_COUNT; k = (RDI_NameMapKind)(k+1)) - { - name_maps[k] = rdim_bake_name_map_from_kind_params(arena, k, params); - } - } - - ////////////////////////////// - //- rjf: build all sections - // RDIM_BakeSectionList sections = {0}; + + //- rjf: build interned string map + RDIM_BakeStringMap strings = {0}; + ProfScope("build interned string map") { - //- rjf: top-level info + strings = rdim_bake_string_map_from_params(arena, params); + } + + //- rjf: build name maps + RDIM_BakeNameMap name_maps[RDI_NameMapKind_COUNT] = {0}; + ProfScope("build name maps") + { + for(RDI_NameMapKind k = (RDI_NameMapKind)(RDI_NameMapKind_NULL+1); + k < RDI_NameMapKind_COUNT; + k = (RDI_NameMapKind)(k+1)) { - RDIM_BakeSectionList s = rdim_bake_top_level_info_section_list_from_params(arena, &strings, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: binary sections - { - RDIM_BakeSectionList s = rdim_bake_binary_section_section_list_from_params(arena, &strings, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: units - { - RDIM_BakeSectionList s = rdim_bake_unit_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: unit vmap - { - RDIM_BakeSectionList s = rdim_bake_unit_vmap_section_list_from_params(arena, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: source files - { - RDIM_BakeSectionList s = rdim_bake_src_file_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: type nodes - { - RDIM_BakeSectionList s = rdim_bake_type_node_section_list_from_params(arena, &strings, &idx_runs, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: UDTs - { - RDIM_BakeSectionList s = rdim_bake_udt_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: global variables - { - RDIM_BakeSectionList s = rdim_bake_global_variable_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: global vmap - { - RDIM_BakeSectionList s = rdim_bake_global_vmap_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: thread variables - { - RDIM_BakeSectionList s = rdim_bake_thread_variable_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: procedures - { - RDIM_BakeSectionList s = rdim_bake_procedure_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: scopes - { - RDIM_BakeSectionList s = rdim_bake_scope_section_list_from_params(arena, &strings, &path_tree, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: scope vmap - { - RDIM_BakeSectionList s = rdim_bake_scope_vmap_section_list_from_params(arena, params); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: name maps - { - RDIM_BakeSectionList s = rdim_bake_name_map_section_list_from_params_maps(arena, &strings, &idx_runs, params, name_maps); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: file paths - { - RDIM_BakeSectionList s = rdim_bake_file_path_section_list_from_path_tree(arena, &strings, &path_tree); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: strings - { - RDIM_BakeSectionList s = rdim_bake_string_section_list_from_string_map(arena, &strings); - rdim_bake_section_list_concat_in_place(§ions, &s); - } - - //- rjf: index runs - { - RDIM_BakeSectionList s = rdim_bake_idx_run_section_list_from_idx_run_map(arena, &idx_runs); - rdim_bake_section_list_concat_in_place(§ions, &s); + ProfScope("build name map %i", k) name_maps[k] = rdim_bake_name_map_from_kind_params(arena, k, params); } } - ////////////////////////////// + //- rjf: top-level info + ProfScope("top level info") + { + RDIM_BakeSectionList s = rdim_bake_top_level_info_section_list_from_params(arena, &strings, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: binary sections + ProfScope("binary sections") + { + RDIM_BakeSectionList s = rdim_bake_binary_section_section_list_from_params(arena, &strings, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: build interned path tree + RDIM_BakePathTree path_tree = {0}; + ProfScope("build interned path tree") + { + path_tree = rdim_bake_path_tree_from_params(arena, params); + } + + //- rjf: units + ProfScope("units") + { + RDIM_BakeSectionList s = rdim_bake_unit_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: unit vmap + ProfScope("unit vmap") + { + RDIM_BakeSectionList s = rdim_bake_unit_vmap_section_list_from_params(arena, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: source files + ProfScope("source files") + { + RDIM_BakeSectionList s = rdim_bake_src_file_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: build interned idx run map + RDIM_BakeIdxRunMap idx_runs = {0}; + ProfScope("build interned idx run map") + { + idx_runs = rdim_bake_idx_run_map_from_params(arena, params); + } + + //- rjf: type nodes + ProfScope("type nodes") + { + RDIM_BakeSectionList s = rdim_bake_type_node_section_list_from_params(arena, &strings, &idx_runs, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: UDTs + ProfScope("UDTs") + { + RDIM_BakeSectionList s = rdim_bake_udt_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: global variables + ProfScope("global variables") + { + RDIM_BakeSectionList s = rdim_bake_global_variable_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: global vmap + ProfScope("global vmap") + { + RDIM_BakeSectionList s = rdim_bake_global_vmap_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: thread variables + ProfScope("thread variables") + { + RDIM_BakeSectionList s = rdim_bake_thread_variable_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: procedures + ProfScope("procedures") + { + RDIM_BakeSectionList s = rdim_bake_procedure_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: scopes + ProfScope("scopes") + { + RDIM_BakeSectionList s = rdim_bake_scope_section_list_from_params(arena, &strings, &path_tree, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: scope vmap + ProfScope("scope vmap") + { + RDIM_BakeSectionList s = rdim_bake_scope_vmap_section_list_from_params(arena, params); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: name maps + ProfScope("name map") + { + RDIM_BakeSectionList s = rdim_bake_name_map_section_list_from_params_maps(arena, &strings, &idx_runs, params, name_maps); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: file paths + ProfScope("file paths") + { + RDIM_BakeSectionList s = rdim_bake_file_path_section_list_from_path_tree(arena, &strings, &path_tree); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: strings + ProfScope("strings") + { + RDIM_BakeSectionList s = rdim_bake_string_section_list_from_string_map(arena, &strings); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + + //- rjf: index runs + ProfScope("idx runs") + { + RDIM_BakeSectionList s = rdim_bake_idx_run_section_list_from_idx_run_map(arena, &idx_runs); + rdim_bake_section_list_concat_in_place(§ions, &s); + } + //- rjf: fill & return - // P2R_Bake2Serialize *out = push_array(arena, P2R_Bake2Serialize, 1); out->sections = sections; return out;