From f3c17a4e2cc75f67cfed536de1c12092b959fd35 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 10 Feb 2025 15:32:48 -0800 Subject: [PATCH] target environment string editing --- src/raddbg/raddbg_core.c | 149 ++++++++++++++++++++++---------------- src/raddbg/raddbg_views.c | 51 +++++++++---- src/raddbg/raddbg_views.h | 3 +- 3 files changed, 123 insertions(+), 80 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index dea44896..757ace7f 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1827,7 +1827,17 @@ rd_eval_blob_from_cfg(Arena *arena, RD_Cfg *cfg) String8 result = {0}; String8 name = cfg->string; E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name); - if(!e_type_key_match(e_type_key_zero(), type_key)) + if(e_type_key_match(e_type_key_zero(), type_key)) + { + String8List parts = {0}; + U64 offset = 8; + String8Node offset_node = {0, str8_struct(&offset)}; + String8Node string_node = {0, cfg->first->string}; + str8_list_push_node(&parts, &offset_node); + str8_list_push_node(&parts, &string_node); + result = str8_list_join(arena, &parts, 0); + } + else { Temp scratch = scratch_begin(&arena, 1); MD_Node *schema = rd_schema_from_name(scratch.arena, name); @@ -2236,6 +2246,14 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) } } + // rjf: if no members? -> treat this as a commit to the cfg's children + if(type->members == 0) + { + String8 new_string = str8_cstring_capped(in, (U8 *)in + dim_1u64(range)); + rd_cfg_new_replace(cfg, new_string); + result = 1; + } + // rjf: commit to the eval blob cache { RD_Cfg2EvalBlobMap *map = rd_state->cfg2evalblob_map; @@ -8624,6 +8642,13 @@ EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(scheduler_process) } #endif +//- rjf: commands + +E_LOOKUP_INFO_FUNCTION_DEF(commands) +{ + +} + //- rjf: watch expressions E_LOOKUP_INFO_FUNCTION_DEF(watches) @@ -8843,7 +8868,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(top_level_cfg) accel->cfgs = rd_cfg_array_from_list(arena, &cfgs_list); accel->cmds = str8_array_from_list(arena, &cmds_list); accel->cmds_idx_range = r1u64(0, accel->cmds.count); - accel->cfgs_idx_range = r1u64(accel->cmds.count, accel->cmds.count + accel->cfgs.count); + accel->cfgs_idx_range = r1u64(accel->cmds_idx_range.max, accel->cmds_idx_range.max + accel->cfgs.count); result.user_data = accel; result.idxed_expr_count = accel->cfgs.count + accel->cmds.count; } @@ -8863,19 +8888,9 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(top_level_cfg) 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; - if(contains_1u64(accel->cmds_idx_range, rhs_value.u64)) + if(rhs_value.u64 < accel->cfgs.count) { - String8 cmd_name = accel->cmds.v[rhs_value.u64 - accel->cmds_idx_range.min]; - RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name); - E_TypeKey type_key = e_type_key_basic(E_TypeKind_U64); - E_Space cmd_space = e_space_make(RD_EvalSpaceKind_MetaCmd); - result.irtree_and_type.root = e_irtree_set_space(arena, cmd_space, e_irtree_const_u(arena, cmd_kind)); - result.irtree_and_type.type_key = type_key; - result.irtree_and_type.mode = E_Mode_Value; - } - else if(contains_1u64(accel->cfgs_idx_range, rhs_value.u64)) - { - RD_Cfg *cfg = accel->cfgs.v[rhs_value.u64 - accel->cfgs_idx_range.min]; + RD_Cfg *cfg = accel->cfgs.v[rhs_value.u64]; E_Space cfg_space = rd_eval_space_from_cfg(cfg); String8 cfg_name = cfg->string; E_TypeKey cfg_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, cfg_name); @@ -8888,61 +8903,41 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(top_level_cfg) return result; } -E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(top_level_cfg) +E_LOOKUP_RANGE_FUNCTION_DEF(top_level_cfg) { - U64 id = 0; RD_TopLevelCfgLookupAccel *accel = (RD_TopLevelCfgLookupAccel *)user_data; - if(num != 0) + Rng1U64 cmds_idx_range = accel->cmds_idx_range; + Rng1U64 cfgs_idx_range = accel->cfgs_idx_range; + U64 dst_idx = 0; + + // rjf: fill commands { - U64 idx = (num-1); - if(contains_1u64(accel->cfgs_idx_range, idx)) + Rng1U64 read_range = intersect_1u64(cmds_idx_range, idx_range); + U64 read_count = dim_1u64(read_range); + for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1) { - id = accel->cfgs.v[idx - accel->cfgs_idx_range.min]->id; - } - else if(contains_1u64(accel->cmds_idx_range, idx)) - { - String8 cmd_name = accel->cmds.v[idx - accel->cmds_idx_range.min]; - RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name); - id = (U64)cmd_kind; - id |= (1ull<<63); } } - return id; + + // rjf: fill cfgs + { + Rng1U64 read_range = intersect_1u64(cfgs_idx_range, idx_range); + U64 read_count = dim_1u64(read_range); + for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1) + { + exprs[dst_idx] = e_expr_ref_array_index(arena, lhs, idx + read_range.min - cfgs_idx_range.min); + } + } +} + +E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(top_level_cfg) +{ + return num; } E_LOOKUP_NUM_FROM_ID_FUNCTION_DEF(top_level_cfg) { - U64 num = 0; - RD_TopLevelCfgLookupAccel *accel = (RD_TopLevelCfgLookupAccel *)user_data; - if(id != 0) - { - if(id & (1ull<<63)) - { - for EachIndex(idx, accel->cmds.count) - { - String8 cmd_name = accel->cmds.v[idx - accel->cmds_idx_range.min]; - RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name); - U64 cmd_id = (U64)cmd_kind; - cmd_id |= (1ull<<63); - if(cmd_id == id) - { - num = idx+1+accel->cmds_idx_range.min; - } - } - } - else - { - for EachIndex(idx, accel->cfgs.count) - { - if(accel->cfgs.v[idx]->id == id) - { - num = idx+1+accel->cfgs_idx_range.min; - break; - } - } - } - } - return num; + return id; } //- rjf: threads / callstacks @@ -9101,11 +9096,13 @@ E_LOOKUP_INFO_FUNCTION_DEF(environment) E_Interpretation interpret = e_interpret(bytecode); RD_CfgID id = interpret.value.u64; RD_Cfg *target = rd_cfg_from_id(id); - RD_Cfg *env = rd_cfg_child_from_string(target, str8_lit("environment")); RD_CfgList env_strings = {0}; - for(RD_Cfg *child = env->first; child != &rd_nil_cfg; child = child->next) + for(RD_Cfg *child = target->first; child != &rd_nil_cfg; child = child->next) { - rd_cfg_list_push(scratch.arena, &env_strings, child); + if(str8_match(child->string, str8_lit("environment"), 0)) + { + rd_cfg_list_push(scratch.arena, &env_strings, child); + } } RD_CfgArray *accel = push_array(arena, RD_CfgArray, 1); *accel = rd_cfg_array_from_list(arena, &env_strings); @@ -9116,6 +9113,30 @@ E_LOOKUP_INFO_FUNCTION_DEF(environment) return result; } +E_LOOKUP_ACCESS_FUNCTION_DEF(environment) +{ + E_LookupAccess result = {{&e_irnode_nil}}; + if(kind == E_ExprKind_ArrayIndex) + { + Temp scratch = scratch_begin(&arena, 1); + RD_CfgArray *cfgs = (RD_CfgArray *)user_data; + 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; + if(0 <= rhs_value.u64 && rhs_value.u64 < cfgs->count) + { + RD_Cfg *cfg = cfgs->v[rhs_value.u64]; + result.irtree_and_type.root = e_irtree_set_space(arena, rd_eval_space_from_cfg(cfg), e_irtree_const_u(arena, 0)); + result.irtree_and_type.type_key = e_type_key_cons_ptr(arch_from_context(), e_type_key_basic(E_TypeKind_U8), 1, E_TypeFlag_IsCodeText); + result.irtree_and_type.mode = E_Mode_Offset; + } + scratch_end(scratch); + } + return result; +} + E_LOOKUP_RANGE_FUNCTION_DEF(environment) { RD_CfgArray *cfgs = (RD_CfgArray *)user_data; @@ -9127,7 +9148,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(environment) U64 cfg_idx = read_range.min + idx; if(cfg_idx < cfgs->count) { - + exprs[idx] = e_expr_ref_array_index(arena, lhs, cfg_idx); } } } @@ -13196,6 +13217,7 @@ rd_frame(void) { e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, str8_lit("environment"), .info = E_LOOKUP_INFO_FUNCTION_NAME(environment), + .access = E_LOOKUP_ACCESS_FUNCTION_NAME(environment), .range = E_LOOKUP_RANGE_FUNCTION_NAME(environment), .id_from_num = E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(environment), .num_from_id = E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(environment)); @@ -13264,6 +13286,7 @@ rd_frame(void) e_lookup_rule_map_insert_new(scratch.arena, ctx->lookup_rule_map, collection_name, .info = E_LOOKUP_INFO_FUNCTION_NAME(top_level_cfg), .access = E_LOOKUP_ACCESS_FUNCTION_NAME(top_level_cfg), + .range = E_LOOKUP_RANGE_FUNCTION_NAME(top_level_cfg), .id_from_num = E_LOOKUP_ID_FROM_NUM_FUNCTION_NAME(top_level_cfg), .num_from_id = E_LOOKUP_NUM_FROM_ID_FUNCTION_NAME(top_level_cfg)); } diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 4cd17116..d9385ea7 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -888,7 +888,8 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) RD_WatchRowInfo info = { .module = &ctrl_entity_nil, - .group_cfg = &rd_nil_cfg, + .group_cfg_parent = &rd_nil_cfg, + .group_cfg_child = &rd_nil_cfg, .group_entity = &ctrl_entity_nil, .callstack_thread = &ctrl_entity_nil, .view_ui_rule = &rd_nil_view_ui_rule, @@ -929,15 +930,24 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) } } - // rjf: determine cfg group name + // rjf: determine cfg group name / parent { - E_IRTreeAndType block_irtree = e_irtree_and_type_from_expr(scratch.arena, row->block->expr); - E_TypeKey block_type_key = block_irtree.type_key; + E_Eval block_eval = e_eval_from_expr(scratch.arena, row->block->expr); + E_TypeKey block_type_key = block_eval.type_key; E_TypeKind block_type_kind = e_type_kind_from_key(block_type_key); if(block_type_kind == E_TypeKind_Set) { + info.group_cfg_parent = rd_cfg_from_id(block_eval.value.u64); E_Type *block_type = e_type_from_key__cached(block_type_key); - info.group_cfg_name = rd_singular_from_code_name_plural(block_type->name); + String8 singular_name = rd_singular_from_code_name_plural(block_type->name); + if(singular_name.size != 0) + { + info.group_cfg_name = singular_name; + } + else + { + info.group_cfg_name = block_type->name; + } } } @@ -945,7 +955,7 @@ rd_watch_row_info_from_row(Arena *arena, EV_Row *row) if(info.group_cfg_name.size != 0) { RD_CfgID id = row->key.child_id; - info.group_cfg = rd_cfg_from_id(id); + info.group_cfg_child = rd_cfg_from_id(id); } // rjf: determine view ui rule @@ -1941,11 +1951,20 @@ RD_VIEW_UI_FUNCTION_DEF(watch) { case RD_WatchCellKind_Expr: { - RD_Cfg *cfg = row_info.group_cfg; + RD_Cfg *cfg = row_info.group_cfg_child; + String8 child_key = str8_lit("expression"); if(cfg == &rd_nil_cfg && editing_complete && new_string.size != 0) { - RD_CfgList all_cfgs = rd_cfg_top_level_list_from_string(scratch.arena, row_info.group_cfg_name); - RD_Cfg *new_cfg_parent = rd_cfg_list_last(&all_cfgs)->parent; + RD_Cfg *new_cfg_parent = row_info.group_cfg_parent; + if(new_cfg_parent != &rd_nil_cfg) + { + child_key = str8_zero(); + } + if(new_cfg_parent == &rd_nil_cfg) + { + RD_CfgList all_cfgs = rd_cfg_top_level_list_from_string(scratch.arena, row_info.group_cfg_name); + new_cfg_parent = rd_cfg_list_last(&all_cfgs)->parent; + } if(new_cfg_parent == &rd_nil_cfg) { new_cfg_parent = rd_cfg_child_from_string(rd_state->root_cfg, str8_lit("project")); @@ -1956,7 +1975,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch) } if(cfg != &rd_nil_cfg) { - RD_Cfg *expr = rd_cfg_child_from_string_or_alloc(cfg, str8_lit("expression")); + RD_Cfg *expr = child_key.size != 0 ? rd_cfg_child_from_string_or_alloc(cfg, child_key) : cfg; rd_cfg_new_replace(expr, new_string); } }break; @@ -1964,7 +1983,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch) if(editing_complete) { ev_key_set_view_rule(eval_view, pt.key, new_string); - RD_Cfg *cfg = row_info.group_cfg; + RD_Cfg *cfg = row_info.group_cfg_child; if(cfg != &rd_nil_cfg && new_string.size != 0) { RD_Cfg *view_rule = rd_cfg_child_from_string_or_alloc(cfg, str8_lit("view_rule")); @@ -2086,7 +2105,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch) default:{}break; case RD_WatchCellKind_Expr: { - RD_Cfg *cfg = row_info.group_cfg; + RD_Cfg *cfg = row_info.group_cfg_child; if(cfg != &rd_nil_cfg) { rd_cfg_list_push(scratch.arena, &cfgs_to_remove, cfg); @@ -2116,9 +2135,9 @@ RD_VIEW_UI_FUNCTION_DEF(watch) }break; case RD_WatchCellKind_Tag: { - if(row_info.group_cfg != &rd_nil_cfg) + if(row_info.group_cfg_child != &rd_nil_cfg) { - rd_cfg_release(rd_cfg_child_from_string(row_info.group_cfg, str8_lit("view_rule"))); + rd_cfg_release(rd_cfg_child_from_string(row_info.group_cfg_child, str8_lit("view_rule"))); } ev_key_set_view_rule(eval_view, row->key, str8_zero()); state_dirty = 1; @@ -2527,7 +2546,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch) //////////////////// //- rjf: draw start of cache lines in expansions // - if(row_info.view_ui_rule == &rd_nil_view_ui_rule) + if(row_info.eval.space.kind == RD_EvalSpaceKind_CtrlEntity && row_info.view_ui_rule == &rd_nil_view_ui_rule) { U64 row_offset = row_info.eval.value.u64; if((row_info.eval.mode == E_Mode_Offset || row_info.eval.mode == E_Mode_Null) && @@ -2544,7 +2563,7 @@ RD_VIEW_UI_FUNCTION_DEF(watch) //////////////////// //- rjf: draw mid-row cache line boundaries in expansions // - if(row_info.view_ui_rule == &rd_nil_view_ui_rule) + if(row_info.eval.space.kind == RD_EvalSpaceKind_CtrlEntity && row_info.view_ui_rule == &rd_nil_view_ui_rule) { if((row_info.eval.mode == E_Mode_Offset || row_info.eval.mode == E_Mode_Null) && row_info.eval.value.u64%64 != 0 && diff --git a/src/raddbg/raddbg_views.h b/src/raddbg/raddbg_views.h index 8d724f2b..e75b5c75 100644 --- a/src/raddbg/raddbg_views.h +++ b/src/raddbg/raddbg_views.h @@ -74,7 +74,8 @@ struct RD_WatchRowInfo E_Eval eval; CTRL_Entity *module; String8 group_cfg_name; - RD_Cfg *group_cfg; + RD_Cfg *group_cfg_parent; + RD_Cfg *group_cfg_child; CTRL_Entity *group_entity; CTRL_Entity *callstack_thread; U64 callstack_unwind_index;