From 1c269286dfdc462243683a3d1822c9306489cdbd Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 14 Oct 2024 08:19:42 -0700 Subject: [PATCH] auto view rules --- src/ctrl/ctrl_core.h | 25 +++-- src/raddbg/generated/raddbg.meta.c | 21 ++-- src/raddbg/generated/raddbg.meta.h | 18 ++-- src/raddbg/raddbg.mdesk | 1 + src/raddbg/raddbg_core.c | 155 +++++++++++++++++++++-------- src/raddbg/raddbg_main.c | 11 +- src/raddbg/raddbg_views.c | 40 ++++++-- 7 files changed, 192 insertions(+), 79 deletions(-) diff --git a/src/ctrl/ctrl_core.h b/src/ctrl/ctrl_core.h index bc63e26e..4d930924 100644 --- a/src/ctrl/ctrl_core.h +++ b/src/ctrl/ctrl_core.h @@ -91,6 +91,8 @@ Y(String8, type(CTRL_CodeString8), function_location, "Function Location")\ Y(String8, type(CTRL_CodeString8), address_location, "Address Location")\ Y(String8, type(CTRL_PathString8), source_path, "Source Path")\ Y(String8, type(CTRL_PathString8), destination_path, "Destination Path")\ +Y(String8, type(CTRL_CodeString8), type, "Type")\ +Y(String8, type(CTRL_CodeString8), view_rule, "View Rule")\ Y(String8, type(CTRL_CodeString8), condition, "Condition")\ X(CTRL_MetaEvalFrameArray, callstack, "Call Stack") #define X(T, name, pretty_name) T name; @@ -146,6 +148,12 @@ struct_members(CTRL_FilePathMapMetaEval) member_lit_comp(CTRL_MetaEval, type(CTRL_PathString8), destination_path, .pretty_name = str8_lit_comp("Destination Path")), }; +struct_members(CTRL_AutoViewRuleMetaEval) +{ + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), type, .pretty_name = str8_lit_comp("Type")), + member_lit_comp(CTRL_MetaEval, type(CTRL_CodeString8), view_rule, .pretty_name = str8_lit_comp("View Rule")), +}; + struct_members(CTRL_MachineMetaEval) { member_lit_comp(CTRL_MetaEval, type(B32), frozen, .pretty_name = str8_lit_comp("Frozen")), @@ -179,14 +187,15 @@ struct_members(CTRL_ThreadMetaEval) member_lit_comp(CTRL_MetaEval, type(CTRL_MetaEvalFrameArray), callstack, .pretty_name = str8_lit_comp("Call Stack")), }; -named_struct_type(CTRL_BreakpointMetaEval, CTRL_MetaEval, .name = str8_lit_comp("breakpoint")); -named_struct_type(CTRL_TargetMetaEval, CTRL_MetaEval, .name = str8_lit_comp("target")); -named_struct_type(CTRL_PinMetaEval, CTRL_MetaEval, .name = str8_lit_comp("pin")); -named_struct_type(CTRL_FilePathMapMetaEval,CTRL_MetaEval, .name = str8_lit_comp("file_path_map")); -named_struct_type(CTRL_MachineMetaEval, CTRL_MetaEval, .name = str8_lit_comp("machine")); -named_struct_type(CTRL_ProcessMetaEval, CTRL_MetaEval, .name = str8_lit_comp("process")); -named_struct_type(CTRL_ModuleMetaEval, CTRL_MetaEval, .name = str8_lit_comp("module")); -named_struct_type(CTRL_ThreadMetaEval, CTRL_MetaEval, .name = str8_lit_comp("thread")); +named_struct_type(CTRL_BreakpointMetaEval, CTRL_MetaEval, .name = str8_lit_comp("breakpoint")); +named_struct_type(CTRL_TargetMetaEval, CTRL_MetaEval, .name = str8_lit_comp("target")); +named_struct_type(CTRL_PinMetaEval, CTRL_MetaEval, .name = str8_lit_comp("pin")); +named_struct_type(CTRL_FilePathMapMetaEval, CTRL_MetaEval, .name = str8_lit_comp("file_path_map")); +named_struct_type(CTRL_AutoViewRuleMetaEval,CTRL_MetaEval, .name = str8_lit_comp("auto_view_rule")); +named_struct_type(CTRL_MachineMetaEval, CTRL_MetaEval, .name = str8_lit_comp("machine")); +named_struct_type(CTRL_ProcessMetaEval, CTRL_MetaEval, .name = str8_lit_comp("process")); +named_struct_type(CTRL_ModuleMetaEval, CTRL_MetaEval, .name = str8_lit_comp("module")); +named_struct_type(CTRL_ThreadMetaEval, CTRL_MetaEval, .name = str8_lit_comp("thread")); //- rjf: meta evaluation array diff --git a/src/raddbg/generated/raddbg.meta.c b/src/raddbg/generated/raddbg.meta.c index c76f5e0d..83fb6cf4 100644 --- a/src/raddbg/generated/raddbg.meta.c +++ b/src/raddbg/generated/raddbg.meta.c @@ -672,13 +672,14 @@ str8_lit_comp("5"), str8_lit_comp("c"), }; -String8 rd_collection_name_table[17] = +String8 rd_collection_name_table[18] = { str8_lit_comp("watches"), str8_lit_comp("targets"), str8_lit_comp("breakpoints"), str8_lit_comp("watch_pins"), str8_lit_comp("file_path_maps"), +str8_lit_comp("auto_view_rules"), str8_lit_comp("machines"), str8_lit_comp("processes"), str8_lit_comp("threads"), @@ -693,13 +694,14 @@ str8_lit_comp("types"), str8_lit_comp("procedures"), }; -RD_EntityKind rd_collection_entity_kind_table[17] = +RD_EntityKind rd_collection_entity_kind_table[18] = { RD_EntityKind_Watch, RD_EntityKind_Target, RD_EntityKind_Breakpoint, RD_EntityKind_WatchPin, RD_EntityKind_FilePathMap, +RD_EntityKind_AutoViewRule, RD_EntityKind_Nil, RD_EntityKind_Nil, RD_EntityKind_Nil, @@ -714,13 +716,14 @@ RD_EntityKind_Nil, RD_EntityKind_Nil, }; -CTRL_EntityKind rd_collection_ctrl_entity_kind_table[17] = +CTRL_EntityKind rd_collection_ctrl_entity_kind_table[18] = { CTRL_EntityKind_Null, CTRL_EntityKind_Null, CTRL_EntityKind_Null, CTRL_EntityKind_Null, CTRL_EntityKind_Null, +CTRL_EntityKind_Null, CTRL_EntityKind_Machine, CTRL_EntityKind_Process, CTRL_EntityKind_Thread, @@ -735,13 +738,14 @@ CTRL_EntityKind_Null, CTRL_EntityKind_Null, }; -EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[17] = +EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[18] = { EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watches), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(targets), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(breakpoints), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(watch_pins), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(file_path_maps), +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(auto_view_rules), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(machines), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(processes), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(threads), @@ -756,13 +760,14 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(types), EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(procedures), }; -EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[17] = +EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[18] = { EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(watches), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(targets), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(breakpoints), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(watch_pins), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(file_path_maps), +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(auto_view_rules), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(machines), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(processes), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(threads), @@ -777,13 +782,14 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(types), EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(procedures), }; -EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[17] = +EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18] = { EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(targets), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(breakpoints), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watch_pins), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(file_path_maps), +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(auto_view_rules), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(machines), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(processes), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(threads), @@ -798,13 +804,14 @@ EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(types), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(procedures), }; -EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[17] = +EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18] = { EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(targets), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(breakpoints), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watch_pins), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(file_path_maps), +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(auto_view_rules), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(machines), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(processes), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(threads), diff --git a/src/raddbg/generated/raddbg.meta.h b/src/raddbg/generated/raddbg.meta.h index c014f2ce..db44feb5 100644 --- a/src/raddbg/generated/raddbg.meta.h +++ b/src/raddbg/generated/raddbg.meta.h @@ -653,6 +653,7 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(targets); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(breakpoints); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(watch_pins); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(file_path_maps); +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(auto_view_rules); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(machines); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(processes); EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(threads); @@ -670,6 +671,7 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(targets); EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(breakpoints); EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(watch_pins); EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(file_path_maps); +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(auto_view_rules); EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(machines); EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(processes); EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(threads); @@ -687,6 +689,7 @@ EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(targets); EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(breakpoints); EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watch_pins); EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(file_path_maps); +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(auto_view_rules); EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(machines); EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(processes); EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(threads); @@ -702,6 +705,7 @@ EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(targets); EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(breakpoints); EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watch_pins); EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(file_path_maps); +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(auto_view_rules); EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(machines); EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(processes); EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(threads); @@ -767,13 +771,13 @@ extern RD_StringBindingPair rd_default_binding_table[110]; extern String8 rd_binding_version_remap_old_name_table[7]; extern String8 rd_binding_version_remap_new_name_table[7]; extern String8 rd_icon_kind_text_table[69]; -extern String8 rd_collection_name_table[17]; -extern RD_EntityKind rd_collection_entity_kind_table[17]; -extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[17]; -extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[17]; -extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[17]; -extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[17]; -extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[17]; +extern String8 rd_collection_name_table[18]; +extern RD_EntityKind rd_collection_entity_kind_table[18]; +extern CTRL_EntityKind rd_collection_ctrl_entity_kind_table[18]; +extern EV_ViewRuleExprExpandInfoHookFunctionType * rd_collection_expr_expand_info_hook_function_table[18]; +extern EV_ViewRuleExprExpandRangeInfoHookFunctionType * rd_collection_expr_expand_range_info_hook_function_table[18]; +extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_id_from_num_hook_function_table[18]; +extern EV_ViewRuleExprExpandIDFromNumHookFunctionType * rd_collection_expr_expand_num_from_id_hook_function_table[18]; extern RD_ViewRuleInfo rd_view_rule_kind_info_table[34]; extern RD_IconKind rd_entity_kind_icon_kind_table[30]; extern String8 rd_theme_preset_display_string_table[9]; diff --git a/src/raddbg/raddbg.mdesk b/src/raddbg/raddbg.mdesk index 72a5c4ae..35446547 100644 --- a/src/raddbg/raddbg.mdesk +++ b/src/raddbg/raddbg.mdesk @@ -829,6 +829,7 @@ RD_CollectionTable: {breakpoints Breakpoint Null x} {watch_pins WatchPin Null x} {file_path_maps FilePathMap Null x} + {auto_view_rules AutoViewRule Null x} //- rjf: control entity groups {machines Nil Machine x} diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 027fb4c9..0046e768 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -1910,12 +1910,12 @@ rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_co Vec4F32 dst_color = color; if(src_string.size == 0) { - src_string = str8_lit("no path"); + src_string = str8_lit("(source path)"); src_color = secondary_color; } if(dst_string.size == 0) { - dst_string = str8_lit("no path"); + dst_string = str8_lit("(destination path)"); dst_color = secondary_color; } dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, src_color, src_string); @@ -1924,6 +1924,40 @@ rd_title_fstrs_from_entity(Arena *arena, RD_Entity *entity, Vec4F32 secondary_co dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Main), size, dst_color, dst_string); } + if(entity->kind == RD_EntityKind_AutoViewRule) + { + String8 src_string = src->string; + Vec4F32 src_color = color; + String8 dst_string = dst->string; + Vec4F32 dst_color = color; + DR_FancyStringList src_fstrs = {0}; + DR_FancyStringList dst_fstrs = {0}; + if(src_string.size == 0) + { + src_string = str8_lit("(type)"); + src_color = secondary_color; + dr_fancy_string_list_push_new(arena, &src_fstrs, rd_font_from_slot(RD_FontSlot_Main), size, color_extrafied, src_string); + } + else RD_Font(RD_FontSlot_Code) + { + src_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, src_color, src_string); + } + if(dst_string.size == 0) + { + dst_string = str8_lit("(view rule)"); + dst_color = secondary_color; + dr_fancy_string_list_push_new(arena, &dst_fstrs, rd_font_from_slot(RD_FontSlot_Main), size, color_extrafied, dst_string); + } + else RD_Font(RD_FontSlot_Code) + { + dst_fstrs = rd_fancy_string_list_from_code_string(arena, 1.f, 0, dst_color, dst_string); + } + dr_fancy_string_list_concat_in_place(&result, &src_fstrs); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Icons), size, secondary_color, rd_icon_kind_text_table[RD_IconKind_RightArrow]); + dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); + dr_fancy_string_list_concat_in_place(&result, &dst_fstrs); + } if((entity->kind == RD_EntityKind_Target || entity->kind == RD_EntityKind_Breakpoint) && entity->disabled) { dr_fancy_string_list_push_new(arena, &result, rd_font_from_slot(RD_FontSlot_Code), size, v4f32(0, 0, 0, 0), str8_lit(" ")); @@ -2184,9 +2218,21 @@ rd_ctrl_meta_eval_from_entity(Arena *arena, RD_Entity *entity) meval->source_location = src_loc_string; meval->address_location = vaddr_loc_string; meval->function_location = function_loc_string; - meval->source_path = src->string; - meval->destination_path = dst->string; meval->condition = cnd_string; + switch(entity->kind) + { + default:{}break; + case RD_EntityKind_FilePathMap: + { + meval->source_path = src->string; + meval->destination_path = dst->string; + }break; + case RD_EntityKind_AutoViewRule: + { + meval->type = src->string; + meval->view_rule = dst->string; + }break; + } ProfEnd(); return meval; } @@ -2441,6 +2487,8 @@ rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range) StringMemberCase(entry_point) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_EntryPoint), str8_cstring_capped(in, (U8 *)in + 4096));} StringMemberCase(source_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Source), str8_cstring_capped(in, (U8 *)in + 4096));} StringMemberCase(destination_path) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Dest), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(type) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Source), str8_cstring_capped(in, (U8 *)in + 4096));} + StringMemberCase(view_rule) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Dest), str8_cstring_capped(in, (U8 *)in + 4096));} StringMemberCase(condition) {result = 1; rd_entity_equip_name(rd_entity_child_from_kind_or_alloc(entity, RD_EntityKind_Condition), str8_cstring_capped(in, (U8 *)in + 4096));} StringMemberCase(source_location) { @@ -4098,14 +4146,14 @@ rd_window_frame(RD_Window *ws) // rjf: filter controls if(view->spec->flags & RD_ViewRuleInfoFlag_CanFilter) { - if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_Filter].display_name))) + if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_Filter].string))) { - rd_cmd(RD_CmdKind_Filter, .view = rd_handle_from_view(view)); + rd_cmd(RD_CmdKind_Filter, .panel = rd_handle_from_panel(panel), .view = rd_handle_from_view(view)); ui_ctx_menu_close(); } - if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_ClearFilter].display_name))) + if(ui_clicked(rd_cmd_spec_button(rd_cmd_kind_info_table[RD_CmdKind_ClearFilter].string))) { - rd_cmd(RD_CmdKind_ClearFilter, .view = rd_handle_from_view(view)); + rd_cmd(RD_CmdKind_ClearFilter, .panel = rd_handle_from_panel(panel), .view = rd_handle_from_view(view)); ui_ctx_menu_close(); } } @@ -4199,45 +4247,12 @@ rd_window_frame(RD_Window *ws) } // rjf: copy name - if(ctrl_entity->kind == CTRL_EntityKind_Thread && - ui_clicked(rd_icon_buttonf(RD_IconKind_Clipboard, 0, "Copy Name"))) + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Clipboard, 0, "Copy Name"))) { os_set_clipboard_text(ctrl_entity->string); ui_ctx_menu_close(); } - // rjf: selection - if(ctrl_entity->kind == CTRL_EntityKind_Thread) - { - B32 is_selected = ctrl_handle_match(rd_base_regs()->thread, ctrl_entity->handle); - if(is_selected) - { - rd_icon_buttonf(RD_IconKind_Thread, 0, "[Selected]###select_entity"); - } - else if(ui_clicked(rd_icon_buttonf(RD_IconKind_Thread, 0, "Select###select_entity"))) - { - rd_cmd(RD_CmdKind_SelectThread, .thread = ctrl_entity->handle); - ui_ctx_menu_close(); - } - } - - // rjf: freezing - if(ctrl_entity->kind == CTRL_EntityKind_Thread || - ctrl_entity->kind == CTRL_EntityKind_Process || - ctrl_entity->kind == CTRL_EntityKind_Machine) - { - B32 is_frozen = ctrl_entity_tree_is_frozen(ctrl_entity); - ui_set_next_palette(rd_palette_from_code(is_frozen ? RD_PaletteCode_NegativePopButton : RD_PaletteCode_PositivePopButton)); - if(is_frozen && ui_clicked(rd_icon_buttonf(RD_IconKind_Locked, 0, "Thaw###freeze_thaw"))) - { - rd_cmd(RD_CmdKind_ThawThread, .ctrl_entity = ctrl_entity->handle); - } - if(!is_frozen && ui_clicked(rd_icon_buttonf(RD_IconKind_Unlocked, 0, "Freeze###freeze_thaw"))) - { - rd_cmd(RD_CmdKind_FreezeThread, .ctrl_entity = ctrl_entity->handle); - } - } - // rjf: copy ID if((ctrl_entity->kind == CTRL_EntityKind_Thread || ctrl_entity->kind == CTRL_EntityKind_Process) && @@ -4308,9 +4323,41 @@ rd_window_frame(RD_Window *ws) } } - RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); + // rjf: selection + if(ctrl_entity->kind == CTRL_EntityKind_Thread) + { + B32 is_selected = ctrl_handle_match(rd_base_regs()->thread, ctrl_entity->handle); + if(is_selected) + { + rd_icon_buttonf(RD_IconKind_Thread, 0, "[Selected]###select_entity"); + } + else if(ui_clicked(rd_icon_buttonf(RD_IconKind_Thread, 0, "Select###select_entity"))) + { + rd_cmd(RD_CmdKind_SelectThread, .thread = ctrl_entity->handle); + ui_ctx_menu_close(); + } + } + + // rjf: freezing + if(ctrl_entity->kind == CTRL_EntityKind_Thread || + ctrl_entity->kind == CTRL_EntityKind_Process || + ctrl_entity->kind == CTRL_EntityKind_Machine) + { + B32 is_frozen = ctrl_entity_tree_is_frozen(ctrl_entity); + ui_set_next_palette(rd_palette_from_code(is_frozen ? RD_PaletteCode_NegativePopButton : RD_PaletteCode_PositivePopButton)); + if(is_frozen && ui_clicked(rd_icon_buttonf(RD_IconKind_Locked, 0, "Thaw###freeze_thaw"))) + { + rd_cmd(RD_CmdKind_ThawThread, .ctrl_entity = ctrl_entity->handle); + } + if(!is_frozen && ui_clicked(rd_icon_buttonf(RD_IconKind_Unlocked, 0, "Freeze###freeze_thaw"))) + { + rd_cmd(RD_CmdKind_FreezeThread, .ctrl_entity = ctrl_entity->handle); + } + } // rjf: callstack +#if 0 + RD_Palette(RD_PaletteCode_Floating) ui_divider(ui_em(1.f, 1.f)); if(ctrl_entity->kind == CTRL_EntityKind_Thread) UI_TextPadding(ui_top_font_size()*1.5f) { DI_Scope *di_scope = di_scope_open(); @@ -4375,6 +4422,7 @@ rd_window_frame(RD_Window *ws) } di_scope_close(di_scope); } +#endif // rjf: color editor #if 0 @@ -5387,6 +5435,7 @@ rd_window_frame(RD_Window *ws) rd_cmd_kind_info_table[RD_CmdKind_Breakpoints].string, rd_cmd_kind_info_table[RD_CmdKind_WatchPins].string, rd_cmd_kind_info_table[RD_CmdKind_FilePathMap].string, + rd_cmd_kind_info_table[RD_CmdKind_AutoViewRules].string, rd_cmd_kind_info_table[RD_CmdKind_Settings].string, rd_cmd_kind_info_table[RD_CmdKind_ExceptionFilters].string, rd_cmd_kind_info_table[RD_CmdKind_GettingStarted].string, @@ -5410,6 +5459,7 @@ rd_window_frame(RD_Window *ws) 'b', 'h', 'p', + 'v', 'e', 'g', 0, @@ -8552,6 +8602,10 @@ EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(file_path_maps) { return rd_ev EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_FilePathMap, 1); } EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_FilePathMap, 1); } EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(file_path_maps) { return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_FilePathMap, 1); } +EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(auto_view_rules) { return rd_ev_view_rule_expr_expand_info__meta_entities(arena, view, filter, expr, params, RD_EntityKind_AutoViewRule); } +EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(auto_view_rules) { return rd_ev_view_rule_expr_expand_range_info__meta_entities(arena, view, filter, expr, params, idx_range, user_data, RD_EntityKind_AutoViewRule, 1); } +EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(auto_view_rules){ return rd_ev_view_rule_expr_id_from_num__meta_entities(num, user_data, RD_EntityKind_AutoViewRule, 1); } +EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(auto_view_rules){ return rd_ev_view_rule_expr_num_from_id__meta_entities(id, user_data, RD_EntityKind_AutoViewRule, 1); } //- rjf: control entity groups @@ -11756,6 +11810,7 @@ rd_frame(void) RD_EntityKind_WatchPin, RD_EntityKind_Target, RD_EntityKind_FilePathMap, + RD_EntityKind_AutoViewRule, }; E_TypeKey evallable_kind_types[] = { @@ -11763,6 +11818,7 @@ rd_frame(void) e_type_key_cons_base(type(CTRL_PinMetaEval)), e_type_key_cons_base(type(CTRL_TargetMetaEval)), e_type_key_cons_base(type(CTRL_FilePathMapMetaEval)), + e_type_key_cons_base(type(CTRL_AutoViewRuleMetaEval)), }; for EachElement(idx, evallable_kinds) { @@ -11921,6 +11977,19 @@ rd_frame(void) { ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, collection_type_keys[idx], rd_collection_name_table[idx], 1); } + RD_EntityList auto_view_rules = rd_query_cached_entity_list_with_kind(RD_EntityKind_AutoViewRule); + for(RD_EntityNode *n = auto_view_rules.first; n != 0; n = n->next) + { + RD_Entity *rule = n->entity; + RD_Entity *src = rd_entity_child_from_kind(rule, RD_EntityKind_Source); + RD_Entity *dst = rd_entity_child_from_kind(rule, RD_EntityKind_Dest); + String8 type_string = src->string; + String8 view_rule_string = dst->string; + E_TokenArray tokens = e_token_array_from_text(scratch.arena, type_string); + E_Parse type_parse = e_parse_type_from_text_tokens(scratch.arena, type_string, &tokens); + E_TypeKey type_key = e_type_from_expr(type_parse.expr); + ev_auto_view_rule_table_push_new(scratch.arena, auto_view_rule_table, type_key, view_rule_string, 0); + } } ev_select_auto_view_rule_table(auto_view_rule_table); diff --git a/src/raddbg/raddbg_main.c b/src/raddbg/raddbg_main.c index f06ed625..d5d951ea 100644 --- a/src/raddbg/raddbg_main.c +++ b/src/raddbg/raddbg_main.c @@ -17,8 +17,6 @@ // [ ] empty user file causing failure to launch // [ ] decay arrays to pointers in pointer/value comparison // [ ] debugger readme pass -// [x] global evaluation across DLL boundaries -// [x] mohit-reported callstack-frame-selection bug (with inlines) //////////////////////////////// //~ rjf: post-0.9.12 TODO notes @@ -36,7 +34,6 @@ // [ ] rich hover coverage; bitmap <-> geo <-> memory <-> disassembly <-> text; etc. // [ ] save view column pcts; generalize to being a first-class thing in // RD_View, e.g. by just having a string -> f32 store -// [ ] auto-scroll output window // [ ] visualize all breakpoints everywhere - source view should show up in // disasm, disasm should show up in source view, function should show up in // both, etc. @@ -200,7 +197,6 @@ // [ ] @feature processor/data breakpoints // [ ] @feature automatically snap to search matches when searching source files // [ ] automatically start search query with selected text -// [ ] @feature entity views: filtering & reordering //////////////////////////////// //~ rjf: Cold, Clean-up Tasks That Probably Only Ryan Notices @@ -221,8 +217,6 @@ // [ ] @feature types -> auto view rules (don't statefully fill view rules // given types, just query if no other view rule is present, & autofill // when editing) -// [ ] @feature eval system -> somehow evaluate breakpoint hit counts? "meta" -// variables? // // [ ] @feature disasm view improvement features // [ ] visualize jump destinations in disasm @@ -523,6 +517,11 @@ // overrides, e.g. C:/devel/ -> D:/devel/, but also C:/devel/foo -> // C:/devel/bar, etc. // [x] fix memory view +// [x] global evaluation across DLL boundaries +// [x] mohit-reported callstack-frame-selection bug (with inlines) +// [x] @feature entity views: filtering & reordering +// [x] @feature eval system -> somehow evaluate breakpoint hit counts? "meta" +// variables? //////////////////////////////// //~ rjf: Build Options diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index a177cb0a..07c439a3 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -1261,13 +1261,14 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo } RD_WatchViewRowCtrl row_ctrls_[] = { - {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndRun }, - {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndInit }, - {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_SelectEntity }, - {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, - {RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_EnableEntity }, - {RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, - {RD_EntityKind_FilePathMap,CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndRun }, + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_LaunchAndInit }, + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_SelectEntity }, + {RD_EntityKind_Target, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, + {RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_EnableEntity }, + {RD_EntityKind_Breakpoint, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, + {RD_EntityKind_FilePathMap, CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, + {RD_EntityKind_AutoViewRule,CTRL_EntityKind_Null, RD_CmdKind_RemoveEntity }, {RD_EntityKind_Nil, CTRL_EntityKind_Machine, RD_CmdKind_FreezeEntity }, {RD_EntityKind_Nil, CTRL_EntityKind_Process, RD_CmdKind_Kill }, {RD_EntityKind_Nil, CTRL_EntityKind_Process, RD_CmdKind_FreezeEntity }, @@ -2577,6 +2578,15 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo rd_entity_alloc(rd_entity_root(), RD_EntityKind_FilePathMap); } } + if(rd_entity_is_nil(entity) && collection_entity_kind == RD_EntityKind_AutoViewRule) + UI_Palette(palette) + { + ui_set_next_focus_hot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off); + if(ui_clicked(rd_icon_buttonf(RD_IconKind_Binoculars, 0, "Add Auto View Rule"))) + { + rd_entity_alloc(rd_entity_root(), RD_EntityKind_AutoViewRule); + } + } //- rjf: build entity box if(!rd_entity_is_nil(entity) || ctrl_entity != &ctrl_entity_nil) @@ -2630,6 +2640,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo switch(ctrl_entity->kind) { default:{}break; + case CTRL_EntityKind_Machine:{slot = RD_RegSlot_Machine; rd_regs()->machine = ctrl_entity->handle;}break; case CTRL_EntityKind_Thread: {slot = RD_RegSlot_Thread; rd_regs()->thread = ctrl_entity->handle;}break; case CTRL_EntityKind_Process:{slot = RD_RegSlot_Process; rd_regs()->process = ctrl_entity->handle;}break; case CTRL_EntityKind_Module: {slot = RD_RegSlot_Module; rd_regs()->module = ctrl_entity->handle;}break; @@ -5151,7 +5162,20 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(file_path_map) //////////////////////////////// //~ rjf: auto_view_rules @view_hook_impl -RD_VIEW_RULE_UI_FUNCTION_DEF(auto_view_rules){} +RD_VIEW_RULE_UI_FUNCTION_DEF(auto_view_rules) +{ + ProfBeginFunction(); + RD_WatchViewState *wv = rd_view_state(RD_WatchViewState); + if(!wv->initialized) + { + rd_watch_view_init(wv); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Expr, 0.25f); + rd_watch_view_column_alloc(wv, RD_WatchViewColumnKind_Value, 0.75f, .dequote_string = 1, .is_non_code = 0); + } + rd_watch_view_build(wv, RD_WatchViewFlag_NoHeader|RD_WatchViewFlag_PrettyNameMembers|RD_WatchViewFlag_PrettyEntityRows|RD_WatchViewFlag_DisableCacheLines, + str8_lit("auto_view_rules"), str8_lit("only: type view_rule str"), 1, 10, rect); + ProfEnd(); +} //////////////////////////////// //~ rjf: breakpoints @view_hook_impl