diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index f33b082d..c9d16e95 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -669,7 +669,7 @@ ctrl_entity_store_alloc(void) store->hash_slots = push_array(arena, CTRL_EntityHashSlot, store->hash_slots_count); for EachEnumVal(CTRL_EntityKind, k) { - store->entity_kind_lists_arenas[k] = arena_alloc(); + store->entity_kind_arrays_arenas[k] = arena_alloc(); } CTRL_Entity *root = store->root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Arch_Null, ctrl_handle_zero(), 0); CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, arch_from_context(), ctrl_handle_make(CTRL_MachineID_Local, dmn_handle_zero()), 0); @@ -1029,10 +1029,10 @@ internal CTRL_EntityList ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityStore *store, DI_Key *dbgi_key) { CTRL_EntityList list = {0}; - CTRL_EntityList all_modules = ctrl_entity_list_from_kind(store, CTRL_EntityKind_Module); - for(CTRL_EntityNode *n = all_modules.first; n != 0; n = n->next) + CTRL_EntityArray all_modules = ctrl_entity_array_from_kind(store, CTRL_EntityKind_Module); + for EachIndex(idx, all_modules.count) { - CTRL_Entity *module = n->v; + CTRL_Entity *module = all_modules.v[idx]; DI_Key module_dbgi_key = ctrl_dbgi_key_from_module(module); if(di_key_match(&module_dbgi_key, dbgi_key)) { @@ -1065,25 +1065,28 @@ ctrl_module_from_thread_candidates(CTRL_EntityStore *store, CTRL_Entity *thread, return module; } -internal CTRL_EntityList -ctrl_entity_list_from_kind(CTRL_EntityStore *store, CTRL_EntityKind kind) +internal CTRL_EntityArray +ctrl_entity_array_from_kind(CTRL_EntityStore *store, CTRL_EntityKind kind) { - if(store->entity_kind_lists_gens[kind] != store->entity_kind_alloc_gens[kind]) + if(store->entity_kind_arrays_gens[kind] != store->entity_kind_alloc_gens[kind]) { - arena_clear(store->entity_kind_lists_arenas[kind]); - MemoryZeroStruct(&store->entity_kind_lists[kind]); + Temp scratch = scratch_begin(0, 0); + CTRL_EntityList entities = {0}; for(CTRL_Entity *e = store->root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, store->root).next) { if(e->kind == kind) { - ctrl_entity_list_push(store->entity_kind_lists_arenas[kind], &store->entity_kind_lists[kind], e); + ctrl_entity_list_push(scratch.arena, &entities, e); } } - store->entity_kind_lists_gens[kind] = store->entity_kind_alloc_gens[kind]; + store->entity_kind_arrays_gens[kind] = store->entity_kind_alloc_gens[kind]; + arena_clear(store->entity_kind_arrays_arenas[kind]); + store->entity_kind_arrays[kind] = ctrl_entity_array_from_list(store->entity_kind_arrays_arenas[kind], &entities); + scratch_end(scratch); } - return store->entity_kind_lists[kind]; + return store->entity_kind_arrays[kind]; } internal U64 @@ -1202,13 +1205,14 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) { ctrl_entity_equip_string(store, thread, str8_lit("main_thread")); } - CTRL_EntityList pending_thread_names = ctrl_entity_list_from_kind(store, CTRL_EntityKind_PendingThreadName); - for(CTRL_EntityNode *n = pending_thread_names.first; n != 0; n = n->next) + CTRL_EntityArray pending_thread_names = ctrl_entity_array_from_kind(store, CTRL_EntityKind_PendingThreadName); + for EachIndex(idx, pending_thread_names.count) { - if(n->v->id == event->entity_id) + CTRL_Entity *entity = pending_thread_names.v[idx]; + if(entity->id == event->entity_id) { - ctrl_entity_equip_string(store, thread, n->v->string); - ctrl_entity_release(store, n->v); + ctrl_entity_equip_string(store, thread, entity->string); + ctrl_entity_release(store, entity); break; } } @@ -4920,7 +4924,7 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) U32 exit_code = msg->exit_code; //- rjf: gather all currently existing processes - CTRL_EntityList initial_processes = ctrl_entity_list_from_kind(ctrl_state->ctrl_thread_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray initial_processes = ctrl_entity_array_from_kind(ctrl_state->ctrl_thread_entity_store, CTRL_EntityKind_Process); typedef struct Task Task; struct Task { @@ -4930,10 +4934,11 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) }; Task *first_task = 0; Task *last_task = 0; - for(CTRL_EntityNode *n = initial_processes.first; n != 0; n = n->next) + for EachIndex(idx, initial_processes.count) { + CTRL_Entity *entity = initial_processes.v[idx]; Task *t = push_array(scratch.arena, Task, 1); - t->process = n->v; + t->process = entity; DLLPushBack(first_task, last_task, t); } @@ -4974,7 +4979,7 @@ ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg) } // rjf: end if all processes are gone - CTRL_EntityList processes = ctrl_entity_list_from_kind(ctrl_state->ctrl_thread_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(ctrl_state->ctrl_thread_entity_store, CTRL_EntityKind_Process); if(processes.count == 0) { done = 1; diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 114834fd..5d5642f8 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -140,10 +140,10 @@ struct CTRL_EntityStore U64 hash_slots_count; CTRL_EntityStringChunkNode *free_string_chunks[ArrayCount(ctrl_entity_string_bucket_chunk_sizes)]; U64 entity_kind_counts[CTRL_EntityKind_COUNT]; - Arena *entity_kind_lists_arenas[CTRL_EntityKind_COUNT]; - U64 entity_kind_lists_gens[CTRL_EntityKind_COUNT]; + Arena *entity_kind_arrays_arenas[CTRL_EntityKind_COUNT]; + U64 entity_kind_arrays_gens[CTRL_EntityKind_COUNT]; U64 entity_kind_alloc_gens[CTRL_EntityKind_COUNT]; - CTRL_EntityList entity_kind_lists[CTRL_EntityKind_COUNT]; + CTRL_EntityArray entity_kind_arrays[CTRL_EntityKind_COUNT]; }; //////////////////////////////// @@ -803,6 +803,7 @@ internal CTRL_EntityList ctrl_entity_list_from_handle_list(Arena *arena, CTRL_En //- rjf: entity array data structure internal CTRL_EntityArray ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list); +#define ctrl_entity_array_first(array) ((array)->count != 0 ? (array)->v[0] : &ctrl_entity_nil) //- rjf: cache creation/destruction internal CTRL_EntityStore *ctrl_entity_store_alloc(void); @@ -829,7 +830,7 @@ internal CTRL_Entity *ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 v internal DI_Key ctrl_dbgi_key_from_module(CTRL_Entity *module); internal CTRL_EntityList ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityStore *store, DI_Key *dbgi_key); internal CTRL_Entity *ctrl_module_from_thread_candidates(CTRL_EntityStore *store, CTRL_Entity *thread, CTRL_EntityList *candidates); -internal CTRL_EntityList ctrl_entity_list_from_kind(CTRL_EntityStore *store, CTRL_EntityKind kind); +internal CTRL_EntityArray ctrl_entity_array_from_kind(CTRL_EntityStore *store, CTRL_EntityKind kind); internal U64 ctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff); internal U64 ctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr); internal Rng1U64 ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range); diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index ee357f51..dec0cf0d 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -1369,10 +1369,10 @@ internal DI_KeyList d_push_active_dbgi_key_list(Arena *arena) { DI_KeyList dbgis = {0}; - CTRL_EntityList modules = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); - for(CTRL_EntityNode *n = modules.first; n != 0; n = n->next) + CTRL_EntityArray modules = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); + for EachIndex(idx, modules.count) { - CTRL_Entity *module = n->v; + CTRL_Entity *module = modules.v[idx]; DI_Key key = ctrl_dbgi_key_from_module(module); di_key_list_push(arena, &dbgis, &key); } @@ -1803,7 +1803,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case CTRL_EventKind_NewProc: { // rjf: the first process? -> clear session output - CTRL_EntityList existing_processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray existing_processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); if(existing_processes.count == 1) { MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit("[new session]\n")}; @@ -1886,10 +1886,10 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P // rjf: build data strings of all param data String8List strings = {0}; { - CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); - for(CTRL_EntityNode *n = threads.first; n != 0; n = n->next) + CTRL_EntityArray threads = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); + for EachIndex(idx, threads.count) { - CTRL_Entity *thread = n->v; + CTRL_Entity *thread = threads.v[idx]; if(thread->is_frozen) { str8_list_push(scratch.arena, &strings, str8_struct(&thread->id)); @@ -2097,12 +2097,13 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_Continue: { B32 good_to_run = 0; - CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); + CTRL_EntityArray threads = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); if(threads.count > 0) { - for(CTRL_EntityNode *n = threads.first; n != 0; n = n->next) + for EachIndex(idx, threads.count) { - if(!n->v->is_frozen) + CTRL_Entity *thread = threads.v[idx]; + if(!thread->is_frozen) { good_to_run = 1; break; @@ -2252,7 +2253,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Run: { - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); if(processes.count != 0) { d_cmd(D_CmdKind_Continue); @@ -2264,7 +2265,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P }break; case D_CmdKind_Restart: { - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); if(processes.count != 0) { d_cmd(D_CmdKind_KillAll); @@ -2274,7 +2275,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P case D_CmdKind_StepInto: case D_CmdKind_StepOver: { - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); if(processes.count != 0) { D_CmdKind step_cmd_kind = (cmd->kind == D_CmdKind_StepInto diff --git a/src/eval/eval_types.c b/src/eval/eval_types.c index b393266b..96773dc3 100644 --- a/src/eval/eval_types.c +++ b/src/eval/eval_types.c @@ -416,6 +416,7 @@ e_type_key_cons_(E_ConsTypeParams *params) node->params.name = push_str8_copy(e_type_state->arena, params->name); if(node->params.expand.info != 0) { + if(node->params.expand.range == 0) {node->params.expand.range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(default);} if(node->params.expand.id_from_num == 0) {node->params.expand.id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity);} if(node->params.expand.num_from_id == 0) {node->params.expand.num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity);} } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index cd21c54e..2f63d32b 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -2280,7 +2280,7 @@ rd_view_ui(Rng2F32 rect) UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null) { RD_CfgList targets = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("target")); - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); //- rjf: icon & info UI_Padding(ui_em(2.f, 1.f)) UI_TagF("weak") @@ -6072,7 +6072,7 @@ rd_window_frame(void) { rd_cmd(RD_CmdKind_AddTarget, .file_path = n->string); } - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); if(processes.count != 0) { rd_cmd(RD_CmdKind_KillAll); @@ -6091,7 +6091,7 @@ rd_window_frame(void) { rd_cmd(RD_CmdKind_AddTarget, .file_path = n->string); } - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); if(processes.count != 0) { rd_cmd(RD_CmdKind_KillAll); @@ -7075,7 +7075,7 @@ rd_window_frame(void) { Temp scratch = scratch_begin(0, 0); RD_CfgList targets = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("target")); - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); B32 have_targets = (targets.count != 0); B32 can_send_signal = !d_ctrl_targets_running(); B32 can_play = (have_targets && (can_send_signal || d_ctrl_last_run_frame_idx()+4 > d_frame_index())); @@ -12201,7 +12201,7 @@ rd_frame(void) CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr); U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr); U64 tls_root_vaddr = ctrl_query_cached_tls_root_vaddr_from_thread(d_state->ctrl_entity_store, thread->handle); - CTRL_EntityList all_modules = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); + CTRL_EntityArray all_modules = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); U64 eval_modules_count = Max(1, all_modules.count); E_Module *eval_modules = push_array(scratch.arena, E_Module, eval_modules_count); E_Module *eval_modules_primary = &eval_modules[0]; @@ -12210,10 +12210,9 @@ rd_frame(void) DI_Key primary_dbgi_key = {0}; ProfScope("produce all eval modules") { - U64 eval_module_idx = 0; - for(CTRL_EntityNode *n = all_modules.first; n != 0; n = n->next, eval_module_idx += 1) + for EachIndex(eval_module_idx, all_modules.count) { - CTRL_Entity *m = n->v; + CTRL_Entity *m = all_modules.v[eval_module_idx]; DI_Key dbgi_key = ctrl_dbgi_key_from_module(m); eval_modules[eval_module_idx].arch = m->arch; eval_modules[eval_module_idx].rdi = di_rdi_from_key(rd_state->frame_di_scope, &dbgi_key, 0); @@ -12376,11 +12375,11 @@ rd_frame(void) { String8 name = evallable_ctrl_names[idx]; CTRL_EntityKind kind = ctrl_entity_kind_from_string(name); - CTRL_EntityList list = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, kind); + CTRL_EntityArray array = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, kind); E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); - for(CTRL_EntityNode *n = list.first; n != 0; n = n->next) + for EachIndex(idx, array.count) { - CTRL_Entity *entity = n->v; + CTRL_Entity *entity = array.v[idx]; E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->space = space; @@ -12446,9 +12445,18 @@ rd_frame(void) .id_from_num = E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(environment), .num_from_id = E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(environment), })); - e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit("call_stack"), - e_type_key_cons(.kind = E_TypeKind_Set, .name = str8_lit("call_stack"))); #endif + e_string2typekey_map_insert(rd_frame_arena(), + rd_state->meta_name2type_map, + str8_lit("call_stack"), + e_type_key_cons(.kind = E_TypeKind_Set, + .name = str8_lit("call_stack"), + .irgen = E_TYPE_IRGEN_FUNCTION_NAME(call_stack), + .access = E_TYPE_ACCESS_FUNCTION_NAME(call_stack), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(call_stack), + })); } //- rjf: add macro for collections with specific lookup rules (but no unique id rules) @@ -12483,7 +12491,6 @@ rd_frame(void) } //- rjf: add macros for debug info table collections -#if 0 // TODO(rjf): @eval String8 debug_info_table_collection_names[] = { str8_lit_comp("procedures"), @@ -12495,16 +12502,18 @@ rd_frame(void) { String8 name = debug_info_table_collection_names[idx]; E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); - expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = name); expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); + expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set, + .name = name, + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(debug_info_table), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(debug_info_table), + .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(debug_info_table), + .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(debug_info_table) + }); e_string2expr_map_insert(scratch.arena, ctx->macro_map, name, expr); - e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, name, - .info = E_LOOKUP_INFO_FUNCTION_NAME(debug_info_table), - .range = E_LOOKUP_RANGE_FUNCTION_NAME(debug_info_table), - .id_from_num = E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(debug_info_table), - .num_from_id = E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(debug_info_table)); } -#endif //- rjf: add macros for all config collections for EachElement(cfg_name_idx, evallable_cfg_names) @@ -12527,23 +12536,26 @@ rd_frame(void) e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); } -#if 0 // TODO(rjf): @eval //- rjf: add macros for all ctrl entity collections for EachElement(ctrl_name_idx, evallable_ctrl_names) { String8 kind_name = evallable_ctrl_names[ctrl_name_idx]; String8 collection_name = rd_plural_from_code_name(kind_name); - E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name); + E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, + .name = collection_name, + .access = E_TYPE_ACCESS_FUNCTION_NAME(ctrl_entities), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(ctrl_entities), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(ctrl_entities) + }); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->type_key = collection_type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); e_string2expr_map_insert(scratch.arena, ctx->macro_map, collection_name, expr); - e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name, - .info = E_LOOKUP_INFO_FUNCTION_NAME(ctrl_entities), - .access = E_LOOKUP_ACCESS_FUNCTION_NAME(ctrl_entities), - .range = E_LOOKUP_RANGE_FUNCTION_NAME(ctrl_entities)); } +#if 0 // TODO(rjf): @eval //- rjf: add macro / lookup rules for unattached processes { String8 collection_name = str8_lit("unattached_processes"); @@ -12556,21 +12568,24 @@ rd_frame(void) .info = E_LOOKUP_INFO_FUNCTION_NAME(unattached_processes), .range = E_LOOKUP_RANGE_FUNCTION_NAME(unattached_processes)); } +#endif //- rjf: add macro for commands { String8 name = str8_lit("commands"); - E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = name); + E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set, + .name = name, + .access = E_TYPE_ACCESS_FUNCTION_NAME(commands), + .expand = + { + .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(commands), + .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(commands), + }); E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0); expr->type_key = type_key; expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery); e_string2expr_map_insert(scratch.arena, ctx->macro_map, name, expr); - e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, name, - .info = E_LOOKUP_INFO_FUNCTION_NAME(commands), - .access = E_LOOKUP_ACCESS_FUNCTION_NAME(commands), - .range = E_LOOKUP_RANGE_FUNCTION_NAME(commands)); } -#endif //- rjf: add macro for output log { @@ -12606,17 +12621,18 @@ rd_frame(void) //- rjf: gather auto-view-rules from loaded modules RD_CfgList immediate_auto_view_rules = {0}; - CTRL_EntityList modules = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); - for(CTRL_EntityNode *n = modules.first; n != 0; n = n->next) + CTRL_EntityArray modules = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Module); + for EachIndex(idx, modules.count) { - String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, n->v->handle); + CTRL_Entity *module = modules.v[idx]; + String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, module->handle); U8 split_char = 0; String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0); for(String8Node *text_n = raddbg_data_text_parts.first; text_n != 0; text_n = text_n->next) { String8 text = text_n->string; RD_CfgList cfgs = rd_cfg_tree_list_from_string(scratch.arena, text); - RD_Cfg *immediate_root = rd_immediate_cfg_from_keyf("module_%S_cfgs", ctrl_string_from_handle(scratch.arena, n->v->handle)); + RD_Cfg *immediate_root = rd_immediate_cfg_from_keyf("module_%S_cfgs", ctrl_string_from_handle(scratch.arena, module->handle)); for(RD_CfgNode *n = cfgs.first; n != 0; n = n->next) { rd_cfg_insert_child(immediate_root, immediate_root->last, n->v); @@ -12757,7 +12773,7 @@ rd_frame(void) case RD_CmdKind_StepOver: case RD_CmdKind_Restart: { - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); if(processes.count == 0 || kind == RD_CmdKind_Restart) { RD_CfgList bps = rd_cfg_top_level_list_from_string(scratch.arena, str8_lit("breakpoint")); @@ -12837,7 +12853,7 @@ rd_frame(void) { // rjf: if control processes are live, but this is not force-confirmed, then // get confirmation from user - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit("lossy_exit_confirmation")); if(processes.count != 0 && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key)) { @@ -16167,7 +16183,7 @@ Z(getting_started) case D_EventKind_ProcessEnd: if(rd_state->quit_after_success) { - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); if(evt->code == 0 && processes.count == 0) { rd_cmd(RD_CmdKind_Exit); @@ -16204,8 +16220,8 @@ Z(getting_started) // rjf: no stop-causing thread, but don't have selected thread? -> snap to first available thread if(need_refocus && thread == &ctrl_entity_nil && selected_thread == &ctrl_entity_nil) { - CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); - CTRL_Entity *first_available_thread = ctrl_entity_list_first(&threads); + CTRL_EntityArray threads = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); + CTRL_Entity *first_available_thread = ctrl_entity_array_first(&threads); rd_cmd(RD_CmdKind_SelectThread, .thread = first_available_thread->handle); } diff --git a/src/raddbg/raddbg_eval.c b/src/raddbg/raddbg_eval.c index 80ae6ae1..98eb4a48 100644 --- a/src/raddbg/raddbg_eval.c +++ b/src/raddbg/raddbg_eval.c @@ -701,25 +701,24 @@ E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(cfgs) return num; } -#if 0 // TODO(rjf): @eval //////////////////////////////// //~ rjf: `call_stack` Type Hooks -typedef struct RD_CallStackLookupAccel RD_CallStackLookupAccel; -struct RD_CallStackLookupAccel +typedef struct RD_CallStackAccel RD_CallStackAccel; +struct RD_CallStackAccel { Arch arch; CTRL_Handle process; CTRL_CallStack call_stack; }; -E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack) +E_TYPE_IRGEN_FUNCTION_DEF(call_stack) { - E_TypeExpandInfo result = {0}; - Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType result = *irtree; + RD_CallStackAccel *accel = push_array(arena, RD_CallStackAccel, 1); { - RD_CallStackLookupAccel *accel = push_array(arena, RD_CallStackLookupAccel, 1); - E_OpList oplist = e_oplist_from_irtree(scratch.arena, lhs->root); + Temp scratch = scratch_begin(&arena, 1); + E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree->root); String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist); E_Interpretation interp = e_interpret(bytecode); CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(interp.space); @@ -730,40 +729,44 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack) accel->arch = entity->arch; accel->process = process->handle; accel->call_stack = ctrl_call_stack_from_unwind(arena, rd_state->frame_di_scope, process, &base_unwind); - result.expr_count = accel->call_stack.count; } - result.user_data = accel; + scratch_end(scratch); } - scratch_end(scratch); + result.user_data = accel; return result; } E_TYPE_ACCESS_FUNCTION_DEF(call_stack) { - E_LookupAccess result = {{&e_irnode_nil}}; - if(kind == E_ExprKind_ArrayIndex) + E_IRTreeAndType result = {&e_irnode_nil}; + if(expr->kind == E_ExprKind_ArrayIndex) { - Temp scratch = scratch_begin(&arena, 1); - E_IRTreeAndType rhs_irtree = e_irtree_and_type_from_expr(scratch.arena, rhs); - E_OpList rhs_oplist = e_oplist_from_irtree(scratch.arena, rhs_irtree.root); - String8 rhs_bytecode = e_bytecode_from_oplist(scratch.arena, &rhs_oplist); - E_Interpretation rhs_interp = e_interpret(rhs_bytecode); - E_Value rhs_value = rhs_interp.value; - RD_CallStackLookupAccel *accel = (RD_CallStackLookupAccel *)user_data; + RD_CallStackAccel *accel = (RD_CallStackAccel *)lhs_irtree->user_data; + E_Value rhs_value = e_value_from_expr(expr->first->next); CTRL_CallStack *call_stack = &accel->call_stack; if(0 <= rhs_value.u64 && rhs_value.u64 < call_stack->count) { CTRL_Entity *process = ctrl_entity_from_handle(d_state->ctrl_entity_store, accel->process); CTRL_CallStackFrame *f = &call_stack->frames[rhs_value.u64]; - result.irtree_and_type.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, RD_EvalSpaceKind_CtrlEntity), e_irtree_const_u(arena, regs_rip_from_arch_block(accel->arch, f->regs))); - result.irtree_and_type.type_key = e_type_key_cons(.arch = process->arch, .kind = E_TypeKind_Ptr, .direct_key = e_type_key_basic(E_TypeKind_Function), .count = 1, .depth = f->inline_depth); - result.irtree_and_type.mode = E_Mode_Value; + result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, RD_EvalSpaceKind_CtrlEntity), e_irtree_const_u(arena, regs_rip_from_arch_block(accel->arch, f->regs))); + result.type_key = e_type_key_cons(.arch = process->arch, .kind = E_TypeKind_Ptr, .direct_key = e_type_key_basic(E_TypeKind_Function), .count = 1, .depth = f->inline_depth); + result.mode = E_Mode_Value; } - scratch_end(scratch); } return result; } +E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack) +{ + RD_CallStackAccel *accel = (RD_CallStackAccel *)irtree->user_data; + E_TypeExpandInfo result = {0}; + result.user_data = accel; + result.expr_count = accel->call_stack.count; + return result; +} + +#if 0 // TODO(rjf): @eval + //////////////////////////////// //~ rjf: `environment` Type Hooks @@ -988,17 +991,57 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(unattached_processes) exprs_out[out_idx] = expr; } } +#endif //////////////////////////////// //~ rjf: Control Entity List Type Hooks (`processes`, `threads`, etc.) +E_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities) +{ + E_IRTreeAndType result = {&e_irnode_nil}; + { + CTRL_Entity *entity = &ctrl_entity_nil; + switch(expr->kind) + { + case E_ExprKind_MemberAccess: + { + String8 rhs_name = expr->first->next->string; + CTRL_Handle handle = ctrl_handle_from_string(rhs_name); + entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, handle); + }break; + case E_ExprKind_ArrayIndex: + { + E_Type *type = e_type_from_key__cached(lhs_irtree->type_key); + CTRL_EntityKind kind = ctrl_entity_kind_from_string(rd_singular_from_code_name_plural(type->name)); + E_Value rhs_value = e_value_from_expr(expr->first->next); + U64 rhs_idx = rhs_value.u64; + CTRL_EntityArray entities = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, kind); + if(0 <= rhs_idx && rhs_idx < entities.count) + { + entity = entities.v[rhs_idx]; + } + }break; + } + if(entity != &ctrl_entity_nil) + { + E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); + String8 name = ctrl_entity_kind_code_name_table[entity->kind]; + E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); + result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0)); + result.type_key = type_key; + result.mode = E_Mode_Offset; + } + } + return result; +} + E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) { E_TypeExpandInfo result = {0}; Temp scratch = scratch_begin(&arena, 1); { //- rjf: determine which entity we're looking under - E_OpList lhs_oplist = e_oplist_from_irtree(scratch.arena, lhs->root); + E_OpList lhs_oplist = e_oplist_from_irtree(scratch.arena, irtree->root); String8 lhs_bytecode = e_bytecode_from_oplist(scratch.arena, &lhs_oplist); E_Interpretation lhs_interp = e_interpret(lhs_bytecode); CTRL_Entity *scoping_entity = &ctrl_entity_nil; @@ -1008,27 +1051,20 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) } //- rjf: determine which type of child we're gathering - E_TypeKey lhs_type_key = lhs->type_key; + E_TypeKey lhs_type_key = irtree->type_key; E_Type *lhs_type = e_type_from_key__cached(lhs_type_key); String8 name = rd_singular_from_code_name_plural(lhs_type->name); - CTRL_EntityKind entity_kind = CTRL_EntityKind_Null; - for EachNonZeroEnumVal(CTRL_EntityKind, k) - { - if(str8_match(name, ctrl_entity_kind_code_name_table[k], 0)) - { - entity_kind = k; - break; - } - } + CTRL_EntityKind entity_kind = ctrl_entity_kind_from_string(name); - //- rjf: gather list of all entities which fit the bill - CTRL_EntityList list = {0}; + //- rjf: gather array of all entities which fit the bill + CTRL_EntityArray array = {0}; if(scoping_entity == &ctrl_entity_nil) { - list = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, entity_kind); + array = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, entity_kind); } else { + CTRL_EntityList list = {0}; for(CTRL_Entity *child = scoping_entity->first; child != &ctrl_entity_nil; child = child->next) { if(child->kind == entity_kind) @@ -1036,16 +1072,17 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) ctrl_entity_list_push(scratch.arena, &list, child); } } + array = ctrl_entity_array_from_list(arena, &list); } - //- rjf: filter the list - CTRL_EntityList list__filtered = list; + //- rjf: filter the array + CTRL_EntityArray array__filtered = array; if(filter.size != 0) { - MemoryZeroStruct(&list__filtered); - for(CTRL_EntityNode *n = list.first; n != 0; n = n->next) + CTRL_EntityList list__filtered = {0}; + for EachIndex(idx, array.count) { - CTRL_Entity *entity = n->v; + CTRL_Entity *entity = array.v[idx]; DR_FStrList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, entity, 1); String8 title_string = dr_string_from_fstrs(scratch.arena, &fstrs); FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, title_string); @@ -1054,67 +1091,29 @@ E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities) ctrl_entity_list_push(scratch.arena, &list__filtered, entity); } } + array__filtered = ctrl_entity_array_from_list(arena, &list__filtered); } //- rjf: list -> array & fill - CTRL_EntityArray *array = push_array(arena, CTRL_EntityArray, 1); - *array = ctrl_entity_array_from_list(arena, &list__filtered); - result.user_data = array; - result.idxed_expr_count = array->count; + CTRL_EntityArray *accel = push_array(arena, CTRL_EntityArray, 1); + *accel = array__filtered; + result.user_data = accel; + result.expr_count = accel->count; } scratch_end(scratch); return result; } -E_LOOKUP_ACCESS_FUNCTION_DEF(ctrl_entities) -{ - Temp scratch = scratch_begin(&arena, 1); - E_LookupAccess result = {{&e_irnode_nil}}; - CTRL_Entity *entity = &ctrl_entity_nil; - if(kind == E_ExprKind_MemberAccess) - { - String8 rhs_name = rhs->string; - CTRL_Handle handle = ctrl_handle_from_string(rhs_name); - entity = ctrl_entity_from_handle(d_state->ctrl_entity_store, handle); - } - else if(kind == E_ExprKind_ArrayIndex) - { - E_IRTreeAndType rhs_irtree = e_irtree_and_type_from_expr(scratch.arena, rhs); - E_OpList rhs_oplist = e_oplist_from_irtree(scratch.arena, rhs_irtree.root); - String8 rhs_bytecode = e_bytecode_from_oplist(scratch.arena, &rhs_oplist); - E_Interpretation rhs_interp = e_interpret(rhs_bytecode); - E_Value rhs_value = rhs_interp.value; - U64 rhs_idx = rhs_value.u64; - CTRL_EntityArray *entities = (CTRL_EntityArray *)user_data; - if(0 <= rhs_idx && rhs_idx < entities->count) - { - entity = entities->v[rhs_idx]; - } - } - if(entity != &ctrl_entity_nil) - { - E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity); - String8 name = ctrl_entity_kind_code_name_table[entity->kind]; - E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); - result.irtree_and_type.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0)); - result.irtree_and_type.type_key = type_key; - result.irtree_and_type.mode = E_Mode_Offset; - } - scratch_end(scratch); - return result; -} - -E_LOOKUP_RANGE_FUNCTION_DEF(ctrl_entities) +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(ctrl_entities) { CTRL_EntityArray *entities = (CTRL_EntityArray *)user_data; - E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs); Rng1U64 legal_range = r1u64(0, entities->count); Rng1U64 read_range = intersect_1u64(legal_range, idx_range); U64 read_count = dim_1u64(read_range); for(U64 out_idx = 0; out_idx < read_count; out_idx += 1) { CTRL_Entity *entity = entities->v[out_idx + read_range.min]; - exprs[out_idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, ctrl_string_from_handle(arena, entity->handle)); + exprs_out[out_idx] = e_expr_irext_member_access(arena, expr, irtree, ctrl_string_from_handle(arena, entity->handle)); } } @@ -1130,14 +1129,14 @@ struct RD_DebugInfoTableLookupAccel DI_SearchItemArray items; }; -E_LOOKUP_INFO_FUNCTION_DEF(debug_info_table) +E_TYPE_EXPAND_INFO_FUNCTION_DEF(debug_info_table) { Temp scratch = scratch_begin(&arena, 1); // rjf: determine which debug info section we're dealing with RDI_SectionKind section = RDI_SectionKind_NULL; { - E_TypeKey lhs_type_key = lhs->type_key; + E_TypeKey lhs_type_key = irtree->type_key; E_Type *lhs_type = e_type_from_key__cached(lhs_type_key); if(0){} else if(str8_match(lhs_type->name, str8_lit("procedures"), 0)) {section = RDI_SectionKind_Procedures;} @@ -1175,12 +1174,12 @@ E_LOOKUP_INFO_FUNCTION_DEF(debug_info_table) rd_request_frame(); } } - E_LookupInfo info = {accel, 0, accel->items.count}; + E_TypeExpandInfo info = {accel, accel->items.count}; scratch_end(scratch); return info; } -E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table) +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table) { RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data; U64 needed_row_count = dim_1u64(idx_range); @@ -1277,11 +1276,11 @@ E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table) } // rjf: fill - exprs[idx] = item_expr; + exprs_out[idx] = item_expr; } } -E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(debug_info_table) +E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(debug_info_table) { RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data; U64 id = 0; @@ -1292,10 +1291,9 @@ E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(debug_info_table) return id; } -E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(debug_info_table) +E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(debug_info_table) { RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data; U64 num = di_search_item_num_from_array_element_idx__linear_search(&accel->items, id-1); return num; } -#endif diff --git a/src/raddbg/raddbg_eval.h b/src/raddbg/raddbg_eval.h index 2ea93701..03e6c830 100644 --- a/src/raddbg/raddbg_eval.h +++ b/src/raddbg/raddbg_eval.h @@ -49,13 +49,14 @@ E_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs); E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(cfgs); E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(cfgs); -#if 0 // TODO(rjf): @eval //////////////////////////////// //~ rjf: `call_stack` Type Hooks -E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack); +E_TYPE_IRGEN_FUNCTION_DEF(call_stack); E_TYPE_ACCESS_FUNCTION_DEF(call_stack); +E_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack); +#if 0 // TODO(rjf): @eval //////////////////////////////// //~ rjf: `environment` Type Hooks @@ -70,21 +71,21 @@ E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(environment); E_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes); E_TYPE_EXPAND_RANGE_FUNCTION_DEF(unattached_processes); +#endif //////////////////////////////// //~ rjf: Control Entity List Type Hooks (`processes`, `threads`, etc.) +E_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities); E_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities); -E_LOOKUP_ACCESS_FUNCTION_DEF(ctrl_entities); -E_LOOKUP_RANGE_FUNCTION_DEF(ctrl_entities); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(ctrl_entities); //////////////////////////////// //~ rjf: Debug Info Tables Eval Hooks -E_LOOKUP_INFO_FUNCTION_DEF(debug_info_table); -E_LOOKUP_RANGE_FUNCTION_DEF(debug_info_table); -E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(debug_info_table); -E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(debug_info_table); -#endif +E_TYPE_EXPAND_INFO_FUNCTION_DEF(debug_info_table); +E_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table); +E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(debug_info_table); +E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(debug_info_table); #endif // RADDBG_EVAL_H diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index b67927c5..8a8ba428 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -260,10 +260,10 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla if(!dasm_lines) ProfScope("find live threads mapping to this file") { CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); - CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); - for(CTRL_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) + CTRL_EntityArray threads = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); + for EachIndex(idx, threads.count) { - CTRL_Entity *thread = thread_n->v; + CTRL_Entity *thread = threads.v[idx]; CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process); U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; U64 inline_depth = (thread == selected_thread) ? rd_regs()->inline_depth : 0; @@ -336,10 +336,10 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla if(dasm_lines) ProfScope("find live threads mapping to this disassembly") { CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); - CTRL_EntityList threads = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); - for(CTRL_EntityNode *thread_n = threads.first; thread_n != 0; thread_n = thread_n->next) + CTRL_EntityArray threads = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Thread); + for EachIndex(idx, threads.count) { - CTRL_Entity *thread = thread_n->v; + CTRL_Entity *thread = threads.v[idx]; U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0; U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count); if(ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process) == process && contains_1u64(dasm_vaddr_range, rip_vaddr)) diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index 51c99ac5..1ec9c77a 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -451,7 +451,7 @@ rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_e if(entity->kind == CTRL_EntityKind_Thread || entity->kind == CTRL_EntityKind_Module) { - CTRL_EntityList processes = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); + CTRL_EntityArray processes = ctrl_entity_array_from_kind(d_state->ctrl_entity_store, CTRL_EntityKind_Process); if(processes.count > 1) { CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process);