diff --git a/src/dbgi/dbgi.c b/src/dbgi/dbgi.c index fa787b57..0198fe16 100644 --- a/src/dbgi/dbgi.c +++ b/src/dbgi/dbgi.c @@ -110,6 +110,47 @@ dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemAr return fuzzy_item_num; } +internal String8 +dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RADDBG_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx) +{ + String8 result = {0}; + switch(target) + { + // NOTE(rjf): no default - warn if we miss a case + case DBGI_FuzzySearchTarget_Procedures: + { + RADDBG_Procedure *proc = raddbg_element_from_idx(rdbg, procedures, element_idx); + U64 name_size = 0; + U8 *name_base = raddbg_string_from_idx(rdbg, proc->name_string_idx, &name_size); + result = str8(name_base, name_size); + }break; + case DBGI_FuzzySearchTarget_GlobalVariables: + { + RADDBG_GlobalVariable *gvar = raddbg_element_from_idx(rdbg, global_variables, element_idx); + U64 name_size = 0; + U8 *name_base = raddbg_string_from_idx(rdbg, gvar->name_string_idx, &name_size); + result = str8(name_base, name_size); + }break; + case DBGI_FuzzySearchTarget_ThreadVariables: + { + RADDBG_ThreadVariable *tvar = raddbg_element_from_idx(rdbg, thread_variables, element_idx); + U64 name_size = 0; + U8 *name_base = raddbg_string_from_idx(rdbg, tvar->name_string_idx, &name_size); + result = str8(name_base, name_size); + }break; + case DBGI_FuzzySearchTarget_UDTs: + { + RADDBG_UDT *udt = raddbg_element_from_idx(rdbg, udts, element_idx); + RADDBG_TypeNode *type_node = raddbg_element_from_idx(rdbg, type_nodes, udt->self_type_idx); + U64 name_size = 0; + U8 *name_base = raddbg_string_from_idx(rdbg, type_node->user_defined.name_string_idx, &name_size); + result = str8(name_base, name_size); + }break; + case DBGI_FuzzySearchTarget_COUNT:{}break; + } + return result; +} + //////////////////////////////// //~ rjf: Forced Override Cache Functions diff --git a/src/dbgi/dbgi.h b/src/dbgi/dbgi.h index 598cc64c..50511f79 100644 --- a/src/dbgi/dbgi.h +++ b/src/dbgi/dbgi.h @@ -379,6 +379,7 @@ internal void dbgi_ensure_tctx_inited(void); internal U64 dbgi_hash_from_string(String8 string); internal U64 dbgi_fuzzy_item_num_from_array_element_idx__linear_search(DBGI_FuzzySearchItemArray *array, U64 element_idx); +internal String8 dbgi_fuzzy_item_string_from_rdbg_target_element_idx(RADDBG_Parsed *rdbg, DBGI_FuzzySearchTarget target, U64 element_idx); //////////////////////////////// //~ rjf: Forced Override Cache Functions diff --git a/src/df/core/df_core.h b/src/df/core/df_core.h index 8dffd362..a395aec0 100644 --- a/src/df/core/df_core.h +++ b/src/df/core/df_core.h @@ -721,6 +721,7 @@ struct DF_EvalVizBlock // rjf: info about ranges that this block spans Rng1U64 visual_idx_range; Rng1U64 semantic_idx_range; + DBGI_FuzzySearchTarget dbgi_target; DBGI_FuzzySearchItemArray backing_search_items; // rjf: visualization config extensions diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index a8223f14..4516f951 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -7529,12 +7529,8 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DBGI_Scope *scop DF_Entity *module = df_module_from_process_vaddr(process, thread_rip_unwind_vaddr); for(U64 idx = visible_idx_range.min; idx < visible_idx_range.max; idx += 1) { - // rjf: unpack type info - RADDBG_UDT *udt = raddbg_element_from_idx(parse_ctx->rdbg, udts, block->backing_search_items.v[idx].idx); - RADDBG_TypeNode *type_node = raddbg_element_from_idx(parse_ctx->rdbg, type_nodes, udt->self_type_idx); - U64 name_size = 0; - U8 *name_base = raddbg_string_from_idx(parse_ctx->rdbg, type_node->user_defined.name_string_idx, &name_size); - String8 name = str8(name_base, name_size); + // rjf: unpack info about this row + String8 name = dbgi_fuzzy_item_string_from_rdbg_target_element_idx(parse_ctx->rdbg, block->dbgi_target, block->backing_search_items.v[idx].idx); // rjf: get keys for this row DF_ExpandKey parent_key = block->parent_key; diff --git a/src/df/gfx/df_views.c b/src/df/gfx/df_views.c index 7b207c0e..1f59227a 100644 --- a/src/df/gfx/df_views.c +++ b/src/df/gfx/df_views.c @@ -641,6 +641,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF DF_EvalViewKey eval_view_key = df_eval_view_key_from_eval_watch_view(ews); DF_EvalView *eval_view = df_eval_view_from_key(eval_view_key); String8 filter = str8(view->query_buffer, view->query_string_size); + DBGI_FuzzySearchTarget dbgi_target = DBGI_FuzzySearchTarget_UDTs; switch(ews->fill_kind) { //////////////////////////// @@ -717,9 +718,10 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF //////////////////////////// //- rjf: debug info table fill -> build split debug info table blocks // - case DF_EvalWatchViewFillKind_Globals: - case DF_EvalWatchViewFillKind_ThreadLocals: - case DF_EvalWatchViewFillKind_Types: + case DF_EvalWatchViewFillKind_Globals: dbgi_target = DBGI_FuzzySearchTarget_GlobalVariables; goto dbgi_table; + case DF_EvalWatchViewFillKind_ThreadLocals: dbgi_target = DBGI_FuzzySearchTarget_ThreadVariables; goto dbgi_table; + case DF_EvalWatchViewFillKind_Types: dbgi_target = DBGI_FuzzySearchTarget_UDTs; goto dbgi_table; + dbgi_table:; { //- rjf: unpack context DF_Entity *thread = df_entity_from_handle(ctrl_ctx->thread); @@ -740,7 +742,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF //- rjf: query all filtered items from dbgi searching system U128 fuzzy_search_key = {(U64)view, df_hash_from_string(str8_struct(&view))}; B32 items_stale = 0; - DBGI_FuzzySearchItemArray items = dbgi_fuzzy_search_items_from_key_exe_query(scope, fuzzy_search_key, exe_path, filter, DBGI_FuzzySearchTarget_UDTs, os_now_microseconds()+100, &items_stale); + DBGI_FuzzySearchItemArray items = dbgi_fuzzy_search_items_from_key_exe_query(scope, fuzzy_search_key, exe_path, filter, dbgi_target, os_now_microseconds()+100, &items_stale); if(items_stale) { df_gfx_request_frame(); @@ -811,6 +813,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF DF_EvalVizBlock *last_vb = df_eval_viz_block_begin(arena, DF_EvalVizBlockKind_DebugInfoTable, parent_key, root_key, 0); { last_vb->visual_idx_range = last_vb->semantic_idx_range = r1u64(0, items.count); + last_vb->dbgi_target = dbgi_target; last_vb->backing_search_items = items; } for(U64 sub_expand_idx = 0; sub_expand_idx < sub_expand_keys_count; sub_expand_idx += 1) @@ -819,11 +822,7 @@ df_eval_viz_block_list_from_watch_view_state(Arena *arena, DBGI_Scope *scope, DF last_vb = df_eval_viz_block_split_and_continue(arena, &blocks, last_vb, sub_expand_item_idxs[sub_expand_idx]); // rjf: grab name for the expanded row - RADDBG_UDT *udt = raddbg_element_from_idx(parse_ctx->rdbg, udts, sub_expand_keys[sub_expand_idx].child_num); - RADDBG_TypeNode *type_node = raddbg_element_from_idx(parse_ctx->rdbg, type_nodes, udt->self_type_idx); - U64 name_size = 0; - U8 *name_base = raddbg_string_from_idx(parse_ctx->rdbg, type_node->user_defined.name_string_idx, &name_size); - String8 name = str8(name_base, name_size); + String8 name = dbgi_fuzzy_item_string_from_rdbg_target_element_idx(&dbgi->rdbg, dbgi_target, sub_expand_keys[sub_expand_idx].child_num); // rjf: recurse for sub-expansion {