From adc9e0e512265d099b181d1b4c1513ed06300b30 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 16 Sep 2024 10:36:22 -0700 Subject: [PATCH] begin sketching out meta eval info, to allow for debugger meta evaluations on both ctrl thread & on ui thread - e.g. breakpoint hit count evaluation in conditional bps --- src/ctrl/ctrl_core.c | 25 ++++++++++++++++ src/ctrl/ctrl_core.h | 46 ++++++++++++++++++++++++++++++ src/dbg_engine/dbg_engine_core.c | 7 ++++- src/dbg_engine/dbg_engine_core.h | 2 +- src/raddbg/generated/raddbg.meta.c | 4 +-- src/raddbg/raddbg.mdesk | 4 +-- src/raddbg/raddbg_core.c | 14 +++++++-- src/raddbg/raddbg_core.h | 10 ------- 8 files changed, 93 insertions(+), 19 deletions(-) diff --git a/src/ctrl/ctrl_core.c b/src/ctrl/ctrl_core.c index b15404ae..c600a286 100644 --- a/src/ctrl/ctrl_core.c +++ b/src/ctrl/ctrl_core.c @@ -1127,6 +1127,31 @@ ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list) } } +//////////////////////////////// +//~ rjf: Meta-Eval Functions + +internal E_TypeKey +ctrl_meta_eval_type_key(void) +{ + Temp scratch = scratch_begin(0, 0); + E_MemberList members = {0}; + { + e_member_list_push_new(scratch.arena, &members, .name = str8_lit("enabled"), .off = 0, .type_key = e_type_key_basic(E_TypeKind_S64)); + e_member_list_push_new(scratch.arena, &members, .name = str8_lit("hit_count"),.off = 0+8, .type_key = e_type_key_basic(E_TypeKind_U64)); + e_member_list_push_new(scratch.arena, &members, .name = str8_lit("label"), .off = 0+8+8, .type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8))); + e_member_list_push_new(scratch.arena, &members, .name = str8_lit("location"), .off = 0+8+8+8, .type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8))); + e_member_list_push_new(scratch.arena, &members, .name = str8_lit("condition"),.off = 0+8+8+8+8,.type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_Char8))); + } + E_MemberArray members_array = e_member_array_from_list(scratch.arena, &members); + E_TypeKey meta_eval_type_key = e_type_key_cons(.arch = arch_from_context(), + .kind = E_TypeKind_Struct, + .name = str8_lit("Meta"), + .members = members_array.v, + .count = members_array.count); + scratch_end(scratch); + return meta_eval_type_key; +} + //////////////////////////////// //~ rjf: Main Layer Initialization diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index 9bdb17ff..53fd93a4 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -263,6 +263,43 @@ struct CTRL_UserBreakpointList U64 count; }; +//////////////////////////////// +//~ rjf: Meta Evaluation Types + +typedef struct CTRL_MetaEvalInfo CTRL_MetaEvalInfo; +struct CTRL_MetaEvalInfo +{ + B64 enabled; + U64 hit_count; + String8 label; + String8 location; + String8 condition; +}; + +typedef struct CTRL_MetaEvalInfoArray CTRL_MetaEvalInfoArray; +struct CTRL_MetaEvalInfoArray +{ + CTRL_MetaEvalInfo *v; + U64 count; +}; + +typedef struct CTRL_MetaEval CTRL_MetaEval; +struct CTRL_MetaEval +{ + B64 enabled; + U64 hit_count; + U64 label_off; + U64 location_off; + U64 condition_off; +}; + +typedef struct CTRL_MetaEvalArray CTRL_MetaEvalArray; +struct CTRL_MetaEvalArray +{ + CTRL_MetaEval *v; + U64 count; +}; + //////////////////////////////// //~ rjf: Evaluation Spaces @@ -270,6 +307,7 @@ typedef U64 CTRL_EvalSpaceKind; enum { CTRL_EvalSpaceKind_Entity = E_SpaceKind_FirstUserDefined, + CTRL_EvalSpaceKind_Meta, }; //////////////////////////////// @@ -321,6 +359,7 @@ struct CTRL_Msg String8List env_string_list; CTRL_TrapList traps; CTRL_UserBreakpointList user_bps; + CTRL_MetaEvalInfoArray meta_eval_infos; }; typedef struct CTRL_MsgNode CTRL_MsgNode; @@ -637,6 +676,8 @@ struct CTRL_State DMN_EventNode *free_dmn_event_node; Arena *user_entry_point_arena; String8List user_entry_points; + Arena *user_meta_eval_arena; + CTRL_MetaEvalArray *user_meta_evals; U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]; U64 process_counter; @@ -774,6 +815,11 @@ internal CTRL_EntityRec ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_En //- rjf: applying events to entity caches internal void ctrl_entity_store_apply_events(CTRL_EntityStore *store, CTRL_EventList *list); +//////////////////////////////// +//~ rjf: Meta-Eval Functions + +internal E_TypeKey ctrl_meta_eval_type_key(void); + //////////////////////////////// //~ rjf: Main Layer Initialization diff --git a/src/dbg_engine/dbg_engine_core.c b/src/dbg_engine/dbg_engine_core.c index 99034c22..0a91d9e1 100644 --- a/src/dbg_engine/dbg_engine_core.c +++ b/src/dbg_engine/dbg_engine_core.c @@ -1570,7 +1570,7 @@ d_init(void) } internal D_EventList -d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]) +d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64], CTRL_MetaEvalInfoArray *meta_eval_infos) { ProfBeginFunction(); Temp scratch = scratch_begin(&arena, 1); @@ -2124,6 +2124,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->cmd_line_string_list = cmdln_strings; msg->env_inherit = 1; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_eval_infos, meta_eval_infos); str8_list_push(scratch.arena, &msg->entry_points, custom_entry_point_name); msg->env_string_list = env; } @@ -2163,6 +2164,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->exit_code = 1; msg->entity = process->handle; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_eval_infos, meta_eval_infos); } } @@ -2189,6 +2191,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->kind = CTRL_MsgKind_Detach; msg->entity = n->v->handle; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_eval_infos, meta_eval_infos); } }break; case D_CmdKind_Continue: @@ -2453,6 +2456,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->kind = CTRL_MsgKind_Attach; msg->entity_id = pid; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_eval_infos, meta_eval_infos); } }break; } @@ -2474,6 +2478,7 @@ d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_P msg->entity = run_thread->handle; msg->parent = process->handle; MemoryCopyArray(msg->exception_code_filters, exception_code_filters); + MemoryCopyStruct(&msg->meta_eval_infos, meta_eval_infos); MemoryCopyStruct(&msg->traps, &run_traps); D_BreakpointArray *bp_batches[] = { diff --git a/src/dbg_engine/dbg_engine_core.h b/src/dbg_engine/dbg_engine_core.h index eb1365c0..28e1c677 100644 --- a/src/dbg_engine/dbg_engine_core.h +++ b/src/dbg_engine/dbg_engine_core.h @@ -520,6 +520,6 @@ internal B32 d_next_cmd(D_Cmd **cmd); //~ rjf: Main Layer Top-Level Calls internal void d_init(void); -internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]); +internal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64], CTRL_MetaEvalInfoArray *meta_eval_infos); #endif // DBG_ENGINE_CORE_H diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index 353ea4d0..9d9287a8 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -568,8 +568,8 @@ RD_StringBindingPair rd_default_binding_table[110] = {str8_lit_comp("goto_name_at_cursor"), {OS_Key_F12, 0 }}, {str8_lit_comp("toggle_watch_expr_at_cursor"), {OS_Key_W, 0 |OS_EventFlag_Alt}}, {str8_lit_comp("toggle_watch_expr_at_mouse"), {OS_Key_D, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("toggle_watch_pin_at_cursor"), {OS_Key_F9, 0 |OS_EventFlag_Ctrl }}, -{str8_lit_comp("toggle_breakpoint_cursor"), {OS_Key_F9, 0 }}, +{str8_lit_comp("toggle_watch_pin"), {OS_Key_F9, 0 |OS_EventFlag_Ctrl }}, +{str8_lit_comp("toggle_breakpoint"), {OS_Key_F9, 0 }}, {str8_lit_comp("add_target"), {OS_Key_T, 0 |OS_EventFlag_Ctrl }}, {str8_lit_comp("attach"), {OS_Key_F6, 0 |OS_EventFlag_Shift }}, {str8_lit_comp("filter"), {OS_Key_Slash, 0 |OS_EventFlag_Ctrl }}, diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index f323a616..815b95fe 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -680,10 +680,10 @@ RD_DefaultBindingTable: //- rjf: watch expressions { "toggle_watch_expr_at_cursor" W 0 0 alt } { "toggle_watch_expr_at_mouse" D ctrl 0 0 } - { "toggle_watch_pin_at_cursor" F9 ctrl 0 0 } + { "toggle_watch_pin" F9 ctrl 0 0 } //- rjf: breakpoints - { "toggle_breakpoint_cursor" F9 0 0 0 } + { "toggle_breakpoint" F9 0 0 0 } //- rjf: targets { "add_target" T ctrl 0 0 } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 1773f05b..04b9762e 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1744,11 +1744,11 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range) } hs_scope_close(scope); }break; - case RD_EvalSpaceKind_CtrlEntity: + case CTRL_EvalSpaceKind_Entity: { }break; - case RD_EvalSpaceKind_CfgEntity: + case CTRL_EvalSpaceKind_Meta: { }break; @@ -14100,11 +14100,19 @@ rd_frame(void) // TODO(rjf): @msgs } + //////////////////////////// + //- rjf: gather meta eval infos + // + CTRL_MetaEvalInfoArray meta_eval_infos = {0}; + { + // TODO(rjf): @msgs + } + //////////////////////////// //- rjf: tick debug engine // U64 cmd_count_pre_tick = rd_state->cmds[0].count; - D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters); + D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters, &meta_eval_infos); //////////////////////////// //- rjf: no selected thread? -> try to snap to any existing thread diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 22e4ee80..15311a9a 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -85,16 +85,6 @@ enum RD_EntityFlag_MarkedForDeletion = (1<<31), }; -//////////////////////////////// -//~ rjf: Evaluation Spaces - -typedef U64 RD_EvalSpaceKind; -enum -{ - RD_EvalSpaceKind_CtrlEntity = E_SpaceKind_FirstUserDefined, - RD_EvalSpaceKind_CfgEntity, -}; - //////////////////////////////// //~ rjf: Binding Types