mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-09 19:11:38 -07:00
checkpoint in moving to new type-based view rule / synthetic structure hooks
This commit is contained in:
+26
-21
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user