fix implicit source code location parameterization w.r.t. disassembly & code file cursors; also fix output view state

This commit is contained in:
Ryan Fleury
2024-10-07 13:40:08 -07:00
parent 71cdc0eab8
commit 084ef67583
3 changed files with 69 additions and 45 deletions
+33 -30
View File
@@ -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;
+28 -7
View File
@@ -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);
+8 -8
View File
@@ -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 = &params->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 = &params->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 = &params->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 = &params->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 = &params->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)))