From 084ef6758310bcbd2299309c2aaa598878997e2f Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 7 Oct 2024 13:40:08 -0700 Subject: [PATCH] fix implicit source code location parameterization w.r.t. disassembly & code file cursors; also fix output view state --- src/raddbg/raddbg_core.c | 63 +++++++++++++++++++------------------ src/raddbg/raddbg_views.c | 35 ++++++++++++++++----- src/raddbg/raddbg_widgets.c | 16 +++++----- 3 files changed, 69 insertions(+), 45 deletions(-) diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index dfe03360..60581c73 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -11333,7 +11333,7 @@ rd_frame(void) // rjf: command simply executes - just no-op in this layer if(!(info->query.flags & RD_QueryFlag_Required)) { - rd_push_cmd(cmd->regs->string, rd_regs()); + RD_RegsScope(.string = str8_zero()) rd_push_cmd(cmd->regs->string, rd_regs()); } // rjf: command has required query -> prep query @@ -14310,41 +14310,44 @@ rd_frame(void) TxtPt pt = rd_regs()->cursor; String8 string = rd_regs()->string; U64 vaddr = rd_regs()->vaddr; - B32 removed_already_existing = 0; - if(kind == RD_CmdKind_ToggleBreakpoint) + if(file_path.size != 0 || string.size != 0 || vaddr != 0) { - RD_EntityList bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint); - for(RD_EntityNode *n = bps.first; n != 0; n = n->next) + B32 removed_already_existing = 0; + if(kind == RD_CmdKind_ToggleBreakpoint) { - RD_Entity *bp = n->entity; - RD_Entity *loc = rd_entity_child_from_kind(bp, RD_EntityKind_Location); - if((loc->flags & RD_EntityFlag_HasTextPoint && path_match_normalized(loc->string, file_path) && loc->text_point.line == pt.line) || - (loc->flags & RD_EntityFlag_HasVAddr && loc->vaddr == vaddr) || - (!(loc->flags & RD_EntityFlag_HasTextPoint) && str8_match(loc->string, string, 0))) + RD_EntityList bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint); + for(RD_EntityNode *n = bps.first; n != 0; n = n->next) { - rd_entity_mark_for_deletion(bp); - removed_already_existing = 1; - break; + RD_Entity *bp = n->entity; + RD_Entity *loc = rd_entity_child_from_kind(bp, RD_EntityKind_Location); + if((loc->flags & RD_EntityFlag_HasTextPoint && path_match_normalized(loc->string, file_path) && loc->text_point.line == pt.line) || + (loc->flags & RD_EntityFlag_HasVAddr && loc->vaddr == vaddr) || + (!(loc->flags & RD_EntityFlag_HasTextPoint) && str8_match(loc->string, string, 0))) + { + rd_entity_mark_for_deletion(bp); + removed_already_existing = 1; + break; + } } } - } - if(!removed_already_existing) - { - RD_Entity *bp = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Breakpoint); - rd_entity_equip_cfg_src(bp, RD_CfgSrc_Project); - RD_Entity *loc = rd_entity_alloc(bp, RD_EntityKind_Location); - if(file_path.size != 0 && pt.line != 0) + if(!removed_already_existing) { - rd_entity_equip_name(loc, file_path); - rd_entity_equip_txt_pt(loc, pt); - } - else if(string.size != 0) - { - rd_entity_equip_name(loc, string); - } - else if(vaddr != 0) - { - rd_entity_equip_vaddr(loc, vaddr); + RD_Entity *bp = rd_entity_alloc(rd_entity_root(), RD_EntityKind_Breakpoint); + rd_entity_equip_cfg_src(bp, RD_CfgSrc_Project); + RD_Entity *loc = rd_entity_alloc(bp, RD_EntityKind_Location); + if(vaddr != 0) + { + rd_entity_equip_vaddr(loc, vaddr); + } + else if(string.size != 0) + { + rd_entity_equip_name(loc, string); + } + else if(file_path.size != 0 && pt.line != 0) + { + rd_entity_equip_name(loc, file_path); + rd_entity_equip_txt_pt(loc, pt); + } } } }break; diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 4586cba9..5779e1c3 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -201,7 +201,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla } // rjf: find visible breakpoints for source code - ProfScope("find visible breakpoints") + if(!dasm_lines) ProfScope("find visible breakpoints for source code") { RD_EntityList bps = rd_query_cached_entity_list_with_kind(RD_EntityKind_Breakpoint); for(RD_EntityNode *n = bps.first; n != 0; n = n->next) @@ -218,7 +218,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla } // rjf: find live threads mapping to source code - ProfScope("find live threads mapping to this file") + if(!dasm_lines) ProfScope("find live threads mapping to this file") { String8 file_path = rd_regs()->file_path; CTRL_Entity *selected_thread = ctrl_entity_from_handle(d_state->ctrl_entity_store, rd_regs()->thread); @@ -247,7 +247,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla } // rjf: find visible watch pins for source code - ProfScope("find visible watch pins") + if(!dasm_lines) ProfScope("find visible watch pins for source code") { RD_EntityList wps = rd_query_cached_entity_list_with_kind(RD_EntityKind_WatchPin); for(RD_EntityNode *n = wps.first; n != 0; n = n->next) @@ -264,7 +264,7 @@ rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags fla } // rjf: find all src -> dasm info - ProfScope("find all src -> dasm info") + if(!dasm_lines) ProfScope("find all src -> dasm info for source code") { String8 file_path = rd_regs()->file_path; D_LineListArray lines_array = d_lines_array_from_file_path_line_range(scratch.arena, file_path, visible_line_num_range); @@ -5980,10 +5980,11 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(text) ////////////////////////////// //- rjf: unpack parameterization info // - rd_regs()->cursor.line = rd_value_from_params_key(params, str8_lit("cursor_line")).s64; + rd_regs()->vaddr = 0; + rd_regs()->cursor.line = rd_value_from_params_key(params, str8_lit("cursor_line")).s64; rd_regs()->cursor.column = rd_value_from_params_key(params, str8_lit("cursor_column")).s64; - rd_regs()->mark.line = rd_value_from_params_key(params, str8_lit("mark_line")).s64; - rd_regs()->mark.column = rd_value_from_params_key(params, str8_lit("mark_column")).s64; + rd_regs()->mark.line = rd_value_from_params_key(params, str8_lit("mark_line")).s64; + rd_regs()->mark.column = rd_value_from_params_key(params, str8_lit("mark_column")).s64; String8 path = rd_file_path_from_eval_string(scratch.arena, string); E_Eval eval = e_eval_from_string(scratch.arena, string); Rng1U64 range = rd_range_from_eval_params(eval, params); @@ -6200,6 +6201,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(disasm) F32 bottom_bar_height = ui_top_font_size()*2.f; Rng2F32 code_area_rect = r2f32p(rect.x0, rect.y0, rect.x1, rect.y1 - bottom_bar_height); Rng2F32 bottom_bar_rect = r2f32p(rect.x0, rect.y1 - bottom_bar_height, rect.x1, rect.y1); + rd_regs()->file_path = str8_zero(); rd_regs()->cursor = dv->cursor; rd_regs()->mark = dv->mark; @@ -6311,6 +6313,7 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(disasm) if(!is_loading && has_disasm) { U64 off = dasm_line_array_code_off_from_idx(&dasm_info.lines, rd_regs()->cursor.line-1); + rd_regs()->vaddr = base_vaddr+off; rd_regs()->vaddr_range = r1u64(base_vaddr+off, base_vaddr+off); rd_regs()->voff_range = ctrl_voff_range_from_vaddr_range(dasm_module, rd_regs()->vaddr_range); rd_regs()->lines = d_lines_from_dbgi_key_voff(rd_frame_arena(), &dbgi_key, rd_regs()->voff_range.min); @@ -6372,6 +6375,16 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(output) Rng2F32 code_area_rect = r2f32p(rect.x0, rect.y0, rect.x1, rect.y1 - bottom_bar_height); Rng2F32 bottom_bar_rect = r2f32p(rect.x0, rect.y1 - bottom_bar_height, rect.x1, rect.y1); + ////////////////////////////// + //- rjf: unpack parameterization info + // + rd_regs()->file_path = str8_zero(); + rd_regs()->vaddr = 0; + rd_regs()->cursor.line = rd_value_from_params_key(params, str8_lit("cursor_line")).s64; + rd_regs()->cursor.column = rd_value_from_params_key(params, str8_lit("cursor_column")).s64; + rd_regs()->mark.line = rd_value_from_params_key(params, str8_lit("mark_line")).s64; + rd_regs()->mark.column = rd_value_from_params_key(params, str8_lit("mark_column")).s64; + ////////////////////////////// //- rjf: unpack text info // @@ -6414,6 +6427,14 @@ RD_VIEW_RULE_UI_FUNCTION_DEF(output) } } + ////////////////////////////// + //- rjf: store params + // + rd_store_view_param_s64(str8_lit("cursor_line"), rd_regs()->cursor.line); + rd_store_view_param_s64(str8_lit("cursor_column"), rd_regs()->cursor.column); + rd_store_view_param_s64(str8_lit("mark_line"), rd_regs()->mark.line); + rd_store_view_param_s64(str8_lit("mark_column"), rd_regs()->mark.column); + txt_scope_close(txt_scope); hs_scope_close(hs_scope); scratch_end(scratch); diff --git a/src/raddbg/raddbg_widgets.c b/src/raddbg/raddbg_widgets.c index f998482e..74c29b37 100644 --- a/src/raddbg/raddbg_widgets.c +++ b/src/raddbg/raddbg_widgets.c @@ -1294,7 +1294,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe // rjf: fill out progress t (progress into range of current line's // voff range) - if(rd_regs()->file_path.size != 0 && params->line_infos[line_idx].first != 0) + if(params->line_vaddrs[line_idx] == 0 && params->line_infos[line_idx].first != 0) { D_LineList *lines = ¶ms->line_infos[line_idx]; D_Line *line = 0; @@ -1362,7 +1362,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe bp_draw->hover_t = ui_anim(ui_key_from_stringf(ui_key_zero(), "bp_hover_t_%p", bp), (F32)!!is_hovering, .rate = entity_hover_t_rate); bp_draw->do_lines = rd_setting_val_from_code(RD_SettingCode_BreakpointLines).s32; bp_draw->do_glow = rd_setting_val_from_code(RD_SettingCode_BreakpointGlow).s32; - if(rd_regs()->file_path.size != 0) + if(params->line_vaddrs[line_idx] == 0) { D_LineList *lines = ¶ms->line_infos[line_idx]; for(D_LineNode *n = lines->first; n != 0; n = n->next) @@ -1477,8 +1477,8 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe if(ui_clicked(line_margin_sig)) { rd_cmd(RD_CmdKind_AddBreakpoint, - .file_path = rd_regs()->file_path, - .cursor = txt_pt(line_num, 1), + .file_path = params->line_vaddrs[line_idx] ? str8_zero() : rd_regs()->file_path, + .cursor = params->line_vaddrs[line_idx] ? txt_pt(0, 0) : txt_pt(line_num, 1), .vaddr = params->line_vaddrs[line_idx]); } } @@ -1522,7 +1522,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { if(n->v.dbgi_key.min_timestamp >= best_stamp) { - has_line_info = (n->v.pt.line == line_num || rd_regs()->file_path.size == 0); + has_line_info = (n->v.pt.line == line_num || params->line_vaddrs[line_idx] != 0); line_info_line_num = n->v.pt.line; best_stamp = n->v.dbgi_key.min_timestamp; } @@ -1895,7 +1895,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe U64 line_vaddr = params->line_vaddrs[line_idx]; CTRL_Entity *thread = line_drag_ctrl_entity; U64 new_rip_vaddr = line_vaddr; - if(rd_regs()->file_path.size != 0) + if(params->line_vaddrs[line_idx] == 0) { D_LineList *lines = ¶ms->line_infos[line_idx]; for(D_LineNode *n = lines->first; n != 0; n = n->next) @@ -1966,7 +1966,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe { U64 line_slice_idx = mouse_pt.line-params->line_num_range.min; D_LineList *lines = ¶ms->line_infos[line_slice_idx]; - if(lines->first != 0 && (rd_regs()->file_path.size == 0 || lines->first->v.pt.line == mouse_pt.line)) + if(lines->first != 0 && (params->line_vaddrs[line_slice_idx] != 0 || lines->first->v.pt.line == mouse_pt.line)) { RD_RegsScope(.process = selected_thread_process->handle, .vaddr_range = ctrl_vaddr_range_from_voff_range(selected_thread_module, lines->first->v.voff_range), @@ -2351,7 +2351,7 @@ rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *prefe D_LineList *lines = ¶ms->line_infos[line_idx]; for(D_LineNode *n = lines->first; n != 0; n = n->next) { - if((n->v.pt.line == line_num || rd_regs()->file_path.size == 0) && + if((n->v.pt.line == line_num || params->line_vaddrs[line_idx] != 0) && ((di_key_match(&n->v.dbgi_key, &hover_regs->dbgi_key) && n->v.voff_range.min <= hover_voff_range.min && hover_voff_range.min < n->v.voff_range.max) || (params->line_vaddrs[line_idx] == hover_regs->vaddr_range.min && hover_regs->vaddr_range.min != 0)))