checkpoint in moving to new type-based view rule / synthetic structure hooks

This commit is contained in:
Ryan Fleury
2025-04-09 13:05:29 -07:00
parent ac65d7fc34
commit cde079a14d
9 changed files with 215 additions and 192 deletions
+26 -21
View File
@@ -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;
+5 -4
View File
@@ -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);
+14 -13
View File
@@ -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
+1
View File
@@ -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);}
}
+58 -42
View File
@@ -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);
}
+94 -96
View File
@@ -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
+10 -9
View File
@@ -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
+6 -6
View File
@@ -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))
+1 -1
View File
@@ -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);