mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-06-23 04:04:59 -07:00
fill out meta eval info system in frontend; get eval back up and running
This commit is contained in:
@@ -185,6 +185,42 @@ ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src)
|
||||
return dst;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Meta Evaluation Type Functions
|
||||
|
||||
internal CTRL_MetaEval *
|
||||
ctrl_meta_eval_from_info(Arena *arena, CTRL_MetaEvalInfo *info)
|
||||
{
|
||||
CTRL_MetaEval *eval = push_array(arena, CTRL_MetaEval, 1);
|
||||
{
|
||||
String8 label_string = push_str8_copy(arena, info->label);
|
||||
String8 loc_string = push_str8_copy(arena, info->location);
|
||||
String8 cnd_string = push_str8_copy(arena, info->condition);
|
||||
eval->enabled = info->enabled;
|
||||
eval->hit_count = info->hit_count;
|
||||
eval->label_off = (U64)((U8 *)label_string.str - (U8 *)eval);
|
||||
eval->location_off = (U64)((U8 *)loc_string.str - (U8 *)eval);
|
||||
eval->condition_off= (U64)((U8 *)cnd_string.str - (U8 *)eval);
|
||||
}
|
||||
return eval;
|
||||
}
|
||||
|
||||
internal CTRL_MetaEvalInfoArray
|
||||
ctrl_meta_eval_info_array_copy(Arena *arena, CTRL_MetaEvalInfoArray *src)
|
||||
{
|
||||
CTRL_MetaEvalInfoArray dst = {0};
|
||||
dst.count = src->count;
|
||||
dst.v = push_array(arena, CTRL_MetaEvalInfo, dst.count);
|
||||
MemoryCopy(dst.v, src->v, sizeof(dst.v[0])*dst.count);
|
||||
for(U64 idx = 0; idx < dst.count; idx += 1)
|
||||
{
|
||||
dst.v[idx].label = push_str8_copy(arena, dst.v[idx].label);
|
||||
dst.v[idx].location = push_str8_copy(arena, dst.v[idx].location);
|
||||
dst.v[idx].condition= push_str8_copy(arena, dst.v[idx].condition);
|
||||
}
|
||||
return dst;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Message Type Functions
|
||||
|
||||
@@ -200,6 +236,7 @@ ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src)
|
||||
dst->env_string_list = str8_list_copy(arena, &src->env_string_list);
|
||||
dst->traps = ctrl_trap_list_copy(arena, &src->traps);
|
||||
dst->user_bps = ctrl_user_breakpoint_list_copy(arena, &src->user_bps);
|
||||
dst->meta_eval_infos = ctrl_meta_eval_info_array_copy(arena, &src->meta_eval_infos);
|
||||
}
|
||||
|
||||
//- rjf: list building
|
||||
@@ -321,6 +358,21 @@ ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs)
|
||||
str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->condition.size);
|
||||
str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->condition.str, bp->condition.size);
|
||||
}
|
||||
|
||||
// rjf: write meta-eval-info array
|
||||
str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->meta_eval_infos.count);
|
||||
for(U64 idx = 0; idx < msg->meta_eval_infos.count; idx += 1)
|
||||
{
|
||||
CTRL_MetaEvalInfo *mei = &msg->meta_eval_infos.v[idx];
|
||||
str8_serial_push_struct(scratch.arena, &msgs_srlzed, &mei->enabled);
|
||||
str8_serial_push_struct(scratch.arena, &msgs_srlzed, &mei->hit_count);
|
||||
str8_serial_push_struct(scratch.arena, &msgs_srlzed, &mei->label.size);
|
||||
str8_serial_push_string(scratch.arena, &msgs_srlzed, mei->label);
|
||||
str8_serial_push_struct(scratch.arena, &msgs_srlzed, &mei->location.size);
|
||||
str8_serial_push_string(scratch.arena, &msgs_srlzed, mei->location);
|
||||
str8_serial_push_struct(scratch.arena, &msgs_srlzed, &mei->condition.size);
|
||||
str8_serial_push_string(scratch.arena, &msgs_srlzed, mei->condition);
|
||||
}
|
||||
}
|
||||
}
|
||||
String8 string = str8_serial_end(arena, &msgs_srlzed);
|
||||
@@ -432,6 +484,25 @@ ctrl_msg_list_from_serialized_string(Arena *arena, String8 string)
|
||||
bp->condition.str = push_array_no_zero(arena, U8, bp->condition.size);
|
||||
read_off += str8_deserial_read(string, read_off, bp->condition.str, bp->condition.size, 1);
|
||||
}
|
||||
|
||||
// rjf: read meta-eval-info array
|
||||
read_off += str8_deserial_read_struct(string, read_off, &msg->meta_eval_infos.count);
|
||||
msg->meta_eval_infos.v = push_array(arena, CTRL_MetaEvalInfo, msg->meta_eval_infos.count);
|
||||
for(U64 idx = 0; idx < msg->meta_eval_infos.count; idx += 1)
|
||||
{
|
||||
CTRL_MetaEvalInfo *mei = &msg->meta_eval_infos.v[idx];
|
||||
read_off += str8_deserial_read_struct(string, read_off, &mei->enabled);
|
||||
read_off += str8_deserial_read_struct(string, read_off, &mei->hit_count);
|
||||
read_off += str8_deserial_read_struct(string, read_off, &mei->label.size);
|
||||
mei->label.str = push_array_no_zero(arena, U8, mei->label.size);
|
||||
read_off += str8_deserial_read(string, read_off, mei->label.str, mei->location.size, 1);
|
||||
read_off += str8_deserial_read_struct(string, read_off, &mei->location.size);
|
||||
mei->location.str = push_array_no_zero(arena, U8, mei->location.size);
|
||||
read_off += str8_deserial_read(string, read_off, mei->location.str, mei->location.size, 1);
|
||||
read_off += str8_deserial_read_struct(string, read_off, &mei->condition.size);
|
||||
mei->condition.str = push_array_no_zero(arena, U8, mei->condition.size);
|
||||
read_off += str8_deserial_read(string, read_off, mei->condition.str, mei->condition.size, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
return msgs;
|
||||
|
||||
@@ -742,6 +742,12 @@ internal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src);
|
||||
internal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp);
|
||||
internal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Meta Evaluation Type Functions
|
||||
|
||||
internal CTRL_MetaEval *ctrl_meta_eval_from_info(Arena *arena, CTRL_MetaEvalInfo *info);
|
||||
internal CTRL_MetaEvalInfoArray ctrl_meta_eval_info_array_copy(Arena *arena, CTRL_MetaEvalInfoArray *src);
|
||||
|
||||
////////////////////////////////
|
||||
//~ rjf: Message Type Functions
|
||||
|
||||
|
||||
+151
-173
@@ -1686,35 +1686,17 @@ internal CTRL_Entity *
|
||||
rd_ctrl_entity_from_eval_space(E_Space space)
|
||||
{
|
||||
CTRL_Entity *entity = &ctrl_entity_nil;
|
||||
// TODO(rjf): @msgs
|
||||
if(space.kind == CTRL_EvalSpaceKind_Entity)
|
||||
{
|
||||
entity = (CTRL_Entity *)space.u64_0;
|
||||
}
|
||||
return entity;
|
||||
}
|
||||
|
||||
internal E_Space
|
||||
rd_eval_space_from_ctrl_entity(CTRL_Entity *entity)
|
||||
{
|
||||
E_Space space = {0};
|
||||
// TODO(rjf): @msgs
|
||||
return space;
|
||||
}
|
||||
|
||||
//- rjf: entity <-> eval space
|
||||
|
||||
internal RD_Entity *
|
||||
rd_entity_from_eval_space(E_Space space)
|
||||
{
|
||||
RD_Entity *entity = &d_nil_entity;
|
||||
if(space.u64_0 != 0)
|
||||
{
|
||||
entity = (RD_Entity *)space.u64_0;
|
||||
}
|
||||
return entity;
|
||||
}
|
||||
|
||||
internal E_Space
|
||||
rd_eval_space_from_entity(RD_Entity *entity)
|
||||
{
|
||||
E_Space space = {0};
|
||||
E_Space space = e_space_make(CTRL_EvalSpaceKind_Entity);
|
||||
space.u64_0 = (U64)entity;
|
||||
return space;
|
||||
}
|
||||
@@ -1746,44 +1728,49 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range)
|
||||
}break;
|
||||
case CTRL_EvalSpaceKind_Entity:
|
||||
{
|
||||
|
||||
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space);
|
||||
switch(entity->kind)
|
||||
{
|
||||
default:{}break;
|
||||
case CTRL_EntityKind_Process:
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, entity->handle, range, d_state->frame_eval_memread_endt_us);
|
||||
String8 data = slice.data;
|
||||
if(data.size == dim_1u64(range))
|
||||
{
|
||||
result = 1;
|
||||
MemoryCopy(out, data.str, data.size);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
case CTRL_EntityKind_Thread:
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity);
|
||||
U64 frame_idx = e_interpret_ctx->reg_unwind_count;
|
||||
if(frame_idx < unwind.frames.count)
|
||||
{
|
||||
CTRL_UnwindFrame *f = &unwind.frames.v[frame_idx];
|
||||
U64 regs_size = regs_block_size_from_arch(e_interpret_ctx->reg_arch);
|
||||
Rng1U64 legal_range = r1u64(0, regs_size);
|
||||
Rng1U64 read_range = intersect_1u64(legal_range, range);
|
||||
U64 read_size = dim_1u64(read_range);
|
||||
MemoryCopy(out, (U8 *)f->regs + read_range.min, read_size);
|
||||
result = (read_size == dim_1u64(range));
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
}
|
||||
}break;
|
||||
case CTRL_EvalSpaceKind_Meta:
|
||||
if(space.u64_0 < rd_state->meta_eval_infos.count)
|
||||
{
|
||||
|
||||
}break;
|
||||
}
|
||||
|
||||
#if 0 // TODO(rjf): @msgs
|
||||
RD_Entity *entity = rd_entity_from_eval_space(space);
|
||||
switch(entity->kind)
|
||||
{
|
||||
//- rjf: nil-space -> fall back to file system
|
||||
case RD_EntityKind_Nil:
|
||||
{
|
||||
U128 key = space.u128;
|
||||
U128 hash = hs_hash_from_key(key, 0);
|
||||
HS_Scope *scope = hs_scope_open();
|
||||
{
|
||||
String8 data = hs_data_from_hash(scope, hash);
|
||||
Rng1U64 legal_range = r1u64(0, data.size);
|
||||
Rng1U64 read_range = intersect_1u64(range, legal_range);
|
||||
if(read_range.min < read_range.max)
|
||||
{
|
||||
result = 1;
|
||||
MemoryCopy(out, data.str + read_range.min, dim_1u64(read_range));
|
||||
}
|
||||
}
|
||||
hs_scope_close(scope);
|
||||
}break;
|
||||
|
||||
//- rjf: default -> evaluating a debugger entity; read from entity POD evaluation
|
||||
default:
|
||||
{
|
||||
CTRL_MetaEvalInfo *info = &rd_state->meta_eval_infos.v[space.u64_0];
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
arena_push(scratch.arena, 0, 64);
|
||||
U64 pos_min = arena_pos(scratch.arena);
|
||||
RD_EntityEval *eval = rd_eval_from_entity(scratch.arena, entity);
|
||||
CTRL_MetaEval *eval = ctrl_meta_eval_from_info(scratch.arena, info);
|
||||
U64 pos_opl = arena_pos(scratch.arena);
|
||||
Rng1U64 legal_range = r1u64(0, pos_opl-pos_min);
|
||||
if(contains_1u64(legal_range, range.min))
|
||||
@@ -1799,41 +1786,7 @@ rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range)
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
|
||||
//- rjf: process -> reading process memory
|
||||
case RD_EntityKind_Process:
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, entity->ctrl_handle, range, d_state->frame_eval_memread_endt_us);
|
||||
String8 data = slice.data;
|
||||
if(data.size == dim_1u64(range))
|
||||
{
|
||||
result = 1;
|
||||
MemoryCopy(out, data.str, data.size);
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
|
||||
//- rjf: thread -> reading from thread register block
|
||||
case RD_EntityKind_Thread:
|
||||
{
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
CTRL_Unwind unwind = d_query_cached_unwind_from_thread(entity);
|
||||
U64 frame_idx = e_interpret_ctx->reg_unwind_count;
|
||||
if(frame_idx < unwind.frames.count)
|
||||
{
|
||||
CTRL_UnwindFrame *f = &unwind.frames.v[frame_idx];
|
||||
U64 regs_size = regs_block_size_from_arch(e_interpret_ctx->reg_arch);
|
||||
Rng1U64 legal_range = r1u64(0, regs_size);
|
||||
Rng1U64 read_range = intersect_1u64(legal_range, range);
|
||||
U64 read_size = dim_1u64(read_range);
|
||||
MemoryCopy(out, (U8 *)f->regs + read_range.min, read_size);
|
||||
result = (read_size == dim_1u64(range));
|
||||
}
|
||||
scratch_end(scratch);
|
||||
}break;
|
||||
}
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1923,26 +1876,15 @@ rd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated)
|
||||
{
|
||||
result = space.u128;
|
||||
}break;
|
||||
}
|
||||
#if 0 // TODO(rjf): @msgs
|
||||
RD_Entity *entity = rd_entity_from_eval_space(space);
|
||||
switch(entity->kind)
|
||||
{
|
||||
default:{}break;
|
||||
|
||||
//- rjf: nil space -> filesystem key encoded inside of `space`
|
||||
case RD_EntityKind_Nil:
|
||||
case CTRL_EvalSpaceKind_Entity:
|
||||
{
|
||||
result = space.u128;
|
||||
}break;
|
||||
|
||||
//- rjf: process space -> query
|
||||
case RD_EntityKind_Process:
|
||||
{
|
||||
result = ctrl_hash_store_key_from_process_vaddr_range(entity->ctrl_handle, range, zero_terminated);
|
||||
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space);
|
||||
if(entity->kind == CTRL_EntityKind_Process)
|
||||
{
|
||||
result = ctrl_hash_store_key_from_process_vaddr_range(entity->handle, range, zero_terminated);
|
||||
}
|
||||
}break;
|
||||
}
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -1951,16 +1893,10 @@ rd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated)
|
||||
internal Rng1U64
|
||||
rd_whole_range_from_eval_space(E_Space space)
|
||||
{
|
||||
// TODO(rjf): @msgs
|
||||
Rng1U64 result = r1u64(0, 0);
|
||||
#if 0
|
||||
RD_Entity *entity = rd_entity_from_eval_space(space);
|
||||
switch(entity->kind)
|
||||
Rng1U64 result = {0};
|
||||
switch(space.kind)
|
||||
{
|
||||
default:{}break;
|
||||
|
||||
//- rjf: nil space -> filesystem key encoded inside of `space`
|
||||
case RD_EntityKind_Nil:
|
||||
case E_SpaceKind_FileSystem:
|
||||
{
|
||||
HS_Scope *scope = hs_scope_open();
|
||||
U128 hash = {0};
|
||||
@@ -1976,12 +1912,15 @@ rd_whole_range_from_eval_space(E_Space space)
|
||||
result = r1u64(0, data.size);
|
||||
hs_scope_close(scope);
|
||||
}break;
|
||||
case RD_EntityKind_Process:
|
||||
case CTRL_EvalSpaceKind_Entity:
|
||||
{
|
||||
result = r1u64(0, 0x7FFFFFFFFFFFull);
|
||||
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space);
|
||||
if(entity->kind == CTRL_EntityKind_Process)
|
||||
{
|
||||
result = r1u64(0, 0x7FFFFFFFFFFFull);
|
||||
}
|
||||
}break;
|
||||
}
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -2176,6 +2115,7 @@ rd_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params)
|
||||
|
||||
//- rjf: eval -> entity
|
||||
|
||||
#if 0 // TODO(rjf): @msgs
|
||||
internal RD_Entity *
|
||||
rd_entity_from_eval_string(String8 string)
|
||||
{
|
||||
@@ -2195,6 +2135,7 @@ rd_eval_string_from_entity(Arena *arena, RD_Entity *entity)
|
||||
String8 eval_string = push_str8f(arena, "macro:`$%I64u`", entity->id);
|
||||
return eval_string;
|
||||
}
|
||||
#endif
|
||||
|
||||
//- rjf: eval <-> file path
|
||||
|
||||
@@ -2772,6 +2713,7 @@ rd_window_frame(RD_Window *ws)
|
||||
//////////////////////////////
|
||||
//- rjf: auto-close tabs which have parameter entities that've been deleted
|
||||
//
|
||||
#if 0 // TODO(rjf): @msgs
|
||||
for(RD_Panel *panel = ws->root_panel;
|
||||
!rd_panel_is_nil(panel);
|
||||
panel = rd_panel_rec_depth_first_pre(panel).next)
|
||||
@@ -2790,6 +2732,7 @@ rd_window_frame(RD_Window *ws)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//////////////////////////////
|
||||
//- rjf: panels with no selected tabs? -> select.
|
||||
@@ -3932,18 +3875,15 @@ rd_window_frame(RD_Window *ws)
|
||||
UI_TextRasterFlags(rd_raster_flags_from_slot(RD_FontSlot_Main)) UI_FontSize(ui_top_font_size()*2.f) UI_PrefHeight(ui_em(3.f, 1.f)) ui_label(rd_state->popup_title);
|
||||
UI_PrefHeight(ui_em(3.f, 1.f)) UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(rd_state->popup_desc);
|
||||
ui_spacer(ui_em(1.5f, 1.f));
|
||||
UI_Row UI_Padding(ui_pct(1.f, 0.f)) UI_WidthFill UI_PrefHeight(ui_em(5.f, 1.f))
|
||||
UI_Row UI_Padding(ui_pct(1.f, 0.f)) UI_PrefWidth(ui_em(16.f, 1.f)) UI_PrefHeight(ui_em(3.5f, 1.f)) UI_CornerRadius(ui_top_font_size()*0.5f)
|
||||
{
|
||||
UI_CornerRadius00(ui_top_font_size()*0.25f)
|
||||
UI_CornerRadius01(ui_top_font_size()*0.25f)
|
||||
RD_Palette(RD_PaletteCode_NeutralPopButton)
|
||||
RD_Palette(RD_PaletteCode_NeutralPopButton)
|
||||
if(ui_clicked(ui_buttonf("OK")) || (ui_key_match(bg_box->default_nav_focus_hot_key, ui_key_zero()) && ui_slot_press(UI_EventActionSlot_Accept)))
|
||||
{
|
||||
rd_cmd(RD_CmdKind_PopupAccept);
|
||||
}
|
||||
UI_CornerRadius10(ui_top_font_size()*0.25f)
|
||||
UI_CornerRadius11(ui_top_font_size()*0.25f)
|
||||
if(ui_clicked(ui_buttonf("Cancel")) || ui_slot_press(UI_EventActionSlot_Cancel))
|
||||
ui_spacer(ui_em(1.f, 1.f));
|
||||
if(ui_clicked(ui_buttonf("Cancel")) || ui_slot_press(UI_EventActionSlot_Cancel))
|
||||
{
|
||||
rd_cmd(RD_CmdKind_PopupCancel);
|
||||
}
|
||||
@@ -5531,8 +5471,8 @@ rd_window_frame(RD_Window *ws)
|
||||
EV_Key parent_key = ev_key_make(5381, 1);
|
||||
EV_Key key = ev_key_make(ev_hash_from_key(parent_key), 1);
|
||||
EV_BlockList viz_blocks = ev_block_list_from_view_expr_keys(scratch.arena, ev_view, &top_level_view_rules, expr, parent_key, key);
|
||||
RD_Entity *entity = rd_entity_from_eval_space(eval.space);
|
||||
U32 default_radix = (entity->kind == RD_EntityKind_Thread ? 16 : 10);
|
||||
CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space);
|
||||
U32 default_radix = (entity->kind == CTRL_EntityKind_Thread ? 16 : 10);
|
||||
EV_WindowedRowList viz_rows = ev_windowed_row_list_from_block_list(scratch.arena, ev_view, r1s64(0, 50), &viz_blocks);
|
||||
|
||||
//- rjf: animate
|
||||
@@ -5638,13 +5578,13 @@ rd_window_frame(RD_Window *ws)
|
||||
default:{}break;
|
||||
case E_Mode_Offset:
|
||||
{
|
||||
RD_Entity *space_entity = rd_entity_from_eval_space(row_eval.space);
|
||||
if(space_entity->kind == RD_EntityKind_Process)
|
||||
CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(row_eval.space);
|
||||
if(space_entity->kind == CTRL_EntityKind_Process)
|
||||
{
|
||||
U64 size = e_type_byte_size_from_key(row_eval.type_key);
|
||||
size = Min(size, 64);
|
||||
Rng1U64 vaddr_rng = r1u64(row_eval.value.u64, row_eval.value.u64+size);
|
||||
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, space_entity->ctrl_handle, vaddr_rng, 0);
|
||||
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, space_entity->handle, vaddr_rng, 0);
|
||||
for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1)
|
||||
{
|
||||
if(slice.byte_changed_flags[idx] != 0)
|
||||
@@ -9966,6 +9906,71 @@ rd_frame(void)
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build meta eval infos
|
||||
//
|
||||
{
|
||||
RD_EntityKind evallable_entity_kinds[] =
|
||||
{
|
||||
RD_EntityKind_Breakpoint,
|
||||
RD_EntityKind_WatchPin,
|
||||
RD_EntityKind_Target,
|
||||
};
|
||||
CTRL_EntityKind evallable_ctrl_entity_kinds[] =
|
||||
{
|
||||
CTRL_EntityKind_Machine,
|
||||
CTRL_EntityKind_Process,
|
||||
CTRL_EntityKind_Thread,
|
||||
CTRL_EntityKind_Module,
|
||||
};
|
||||
U64 meta_eval_info_count = 0;
|
||||
for(U64 idx = 0; idx < ArrayCount(evallable_entity_kinds); idx += 1)
|
||||
{
|
||||
RD_EntityList list = rd_query_cached_entity_list_with_kind(evallable_entity_kinds[idx]);
|
||||
meta_eval_info_count += list.count;
|
||||
}
|
||||
for(U64 idx = 0; idx < ArrayCount(evallable_ctrl_entity_kinds); idx += 1)
|
||||
{
|
||||
CTRL_EntityList list = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, evallable_ctrl_entity_kinds[idx]);
|
||||
meta_eval_info_count += list.count;
|
||||
}
|
||||
rd_state->meta_eval_infos.count = meta_eval_info_count;
|
||||
rd_state->meta_eval_infos.v = push_array(scratch.arena, CTRL_MetaEvalInfo, rd_state->meta_eval_infos.count);
|
||||
U64 meta_eval_info_idx = 0;
|
||||
for(U64 idx = 0; idx < ArrayCount(evallable_entity_kinds); idx += 1)
|
||||
{
|
||||
RD_EntityList list = rd_query_cached_entity_list_with_kind(evallable_entity_kinds[idx]);
|
||||
switch(evallable_entity_kinds[idx])
|
||||
{
|
||||
default:{}break;
|
||||
case RD_EntityKind_Breakpoint:{rd_state->meta_eval_infos_bps_idx_range.min = idx;}break;
|
||||
case RD_EntityKind_WatchPin:{rd_state->meta_eval_infos_wps_idx_range.min = idx;}break;
|
||||
}
|
||||
for(RD_EntityNode *n = list.first; n != 0; n = n->next)
|
||||
{
|
||||
RD_Entity *entity = n->entity;
|
||||
// TODO(rjf): @msgs
|
||||
meta_eval_info_idx += 1;
|
||||
}
|
||||
switch(evallable_entity_kinds[idx])
|
||||
{
|
||||
default:{}break;
|
||||
case RD_EntityKind_Breakpoint:{rd_state->meta_eval_infos_bps_idx_range.max = idx;}break;
|
||||
case RD_EntityKind_WatchPin:{rd_state->meta_eval_infos_wps_idx_range.max = idx;}break;
|
||||
}
|
||||
}
|
||||
for(U64 idx = 0; idx < ArrayCount(evallable_ctrl_entity_kinds); idx += 1)
|
||||
{
|
||||
CTRL_EntityList list = ctrl_entity_list_from_kind(d_state->ctrl_entity_store, evallable_ctrl_entity_kinds[idx]);
|
||||
for(CTRL_EntityNode *n = list.first; n != 0; n = n->next)
|
||||
{
|
||||
CTRL_Entity *entity = n->v;
|
||||
// TODO(rjf): @msgs
|
||||
meta_eval_info_idx += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: build eval type context
|
||||
//
|
||||
@@ -10028,43 +10033,22 @@ rd_frame(void)
|
||||
}
|
||||
}
|
||||
|
||||
//- rjf: add macros for entities
|
||||
//- rjf: add macros for meta evaluations
|
||||
{
|
||||
E_MemberList entity_members = {0};
|
||||
E_TypeKey meta_eval_type_key = ctrl_meta_eval_type_key();
|
||||
for(U64 idx = 0; idx < rd_state->meta_eval_infos.count; idx += 1)
|
||||
{
|
||||
e_member_list_push_new(scratch.arena, &entity_members, .name = str8_lit("enabled"), .off = 0, .type_key = e_type_key_basic(E_TypeKind_S64));
|
||||
e_member_list_push_new(scratch.arena, &entity_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, &entity_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, &entity_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, &entity_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 entity_members_array = e_member_array_from_list(scratch.arena, &entity_members);
|
||||
E_TypeKey entity_type = e_type_key_cons(.arch = arch_from_context(),
|
||||
.kind = E_TypeKind_Struct,
|
||||
.name = str8_lit("Entity"),
|
||||
.members = entity_members_array.v,
|
||||
.count = entity_members_array.count);
|
||||
RD_EntityKind evallable_kinds[] =
|
||||
{
|
||||
RD_EntityKind_Breakpoint,
|
||||
RD_EntityKind_WatchPin,
|
||||
RD_EntityKind_Target,
|
||||
};
|
||||
for(U64 idx = 0; idx < ArrayCount(evallable_kinds); idx += 1)
|
||||
{
|
||||
RD_EntityList entities = rd_query_cached_entity_list_with_kind(evallable_kinds[idx]);
|
||||
for(RD_EntityNode *n = entities.first; n != 0; n = n->next)
|
||||
CTRL_MetaEvalInfo *mei = &rd_state->meta_eval_infos.v[idx];
|
||||
E_Space space = e_space_make(CTRL_EvalSpaceKind_Meta);
|
||||
space.u64_0 = idx;
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->space = space;
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = meta_eval_type_key;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64u", idx), expr);
|
||||
if(mei->label.size != 0)
|
||||
{
|
||||
RD_Entity *entity = n->entity;
|
||||
E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
expr->space = rd_eval_space_from_entity(entity);
|
||||
expr->mode = E_Mode_Offset;
|
||||
expr->type_key = entity_type;
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, push_str8f(scratch.arena, "$%I64u", entity->id), expr);
|
||||
if(entity->string.size != 0)
|
||||
{
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, entity->string, expr);
|
||||
}
|
||||
e_string2expr_map_insert(scratch.arena, ctx->macro_map, mei->label, expr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11912,6 +11896,7 @@ rd_frame(void)
|
||||
case RD_CmdKind_OpenTab:
|
||||
{
|
||||
RD_Panel *panel = rd_panel_from_handle(rd_regs()->panel);
|
||||
#if 0 // TODO(rjf): @msgs
|
||||
RD_ViewSpec *spec = rd_view_spec_from_string(rd_regs()->string);
|
||||
RD_Entity *entity = &d_nil_entity;
|
||||
if(spec->info.flags & RD_ViewSpecFlag_ParameterizedByEntity)
|
||||
@@ -11937,6 +11922,7 @@ rd_frame(void)
|
||||
rd_view_equip_spec(view, spec, query, rd_regs()->params_tree);
|
||||
rd_panel_insert_tab_view(panel, panel->last_tab_view, view);
|
||||
}
|
||||
#endif
|
||||
}break;
|
||||
case RD_CmdKind_CloseTab:
|
||||
{
|
||||
@@ -14100,19 +14086,11 @@ 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, &meta_eval_infos);
|
||||
D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters, &rd_state->meta_eval_infos);
|
||||
|
||||
////////////////////////////
|
||||
//- rjf: no selected thread? -> try to snap to any existing thread
|
||||
|
||||
@@ -891,6 +891,11 @@ struct RD_State
|
||||
// rjf: frame parameters
|
||||
F32 frame_dt;
|
||||
|
||||
// rjf: meta evaluation info
|
||||
CTRL_MetaEvalInfoArray meta_eval_infos;
|
||||
Rng1U64 meta_eval_infos_bps_idx_range;
|
||||
Rng1U64 meta_eval_infos_wps_idx_range;
|
||||
|
||||
// rjf: registers stack
|
||||
RD_RegsNode base_regs;
|
||||
RD_RegsNode *top_regs;
|
||||
@@ -1283,10 +1288,6 @@ internal RD_Entity *rd_entity_from_name_and_kind(String8 string, RD_EntityKind k
|
||||
internal CTRL_Entity *rd_ctrl_entity_from_eval_space(E_Space space);
|
||||
internal E_Space rd_eval_space_from_ctrl_entity(CTRL_Entity *entity);
|
||||
|
||||
//- rjf: entity <-> eval space
|
||||
internal RD_Entity *rd_entity_from_eval_space(E_Space space);
|
||||
internal E_Space rd_eval_space_from_entity(RD_Entity *entity);
|
||||
|
||||
//- rjf: eval space reads/writes
|
||||
internal B32 rd_eval_space_read(void *u, E_Space space, void *out, Rng1U64 range);
|
||||
internal B32 rd_eval_space_write(void *u, E_Space space, void *in, Rng1U64 range);
|
||||
@@ -1313,8 +1314,10 @@ internal Vec2S32 rd_dim2s32_from_eval_params(E_Eval eval, MD_Node *params);
|
||||
internal R_Tex2DFormat rd_tex2dformat_from_eval_params(E_Eval eval, MD_Node *params);
|
||||
|
||||
//- rjf: eval <-> entity
|
||||
#if 0 // TODO(rjf): @msgs
|
||||
internal RD_Entity *rd_entity_from_eval_string(String8 string);
|
||||
internal String8 rd_eval_string_from_entity(Arena *arena, RD_Entity *entity);
|
||||
#endif
|
||||
|
||||
//- rjf: eval <-> file path
|
||||
internal String8 rd_file_path_from_eval_string(Arena *arena, String8 string);
|
||||
|
||||
+16
-33
@@ -1033,10 +1033,12 @@ rd_watch_view_build(RD_View *view, RD_WatchViewState *ewv, B32 modifiable, U32 d
|
||||
//
|
||||
case RD_WatchViewFillKind_Breakpoints:
|
||||
{
|
||||
E_TypeKey meta_eval_type = ctrl_meta_eval_type_key();
|
||||
mutable_entity_kind = RD_EntityKind_Breakpoint;
|
||||
ev_view_rule_list_push_string(scratch.arena, &top_level_view_rules, str8_lit("no_addr"));
|
||||
RD_EntityList bps = rd_query_cached_entity_list_with_kind(mutable_entity_kind);
|
||||
for(RD_EntityNode *n = bps.first; n != 0; n = n->next)
|
||||
U64 idx = rd_state->meta_eval_infos_bps_idx_range.min;
|
||||
for(RD_EntityNode *n = bps.first; n != 0; n = n->next, idx += 1)
|
||||
{
|
||||
RD_Entity *bp = n->entity;
|
||||
if(bp->flags & RD_EntityFlag_MarkedForDeletion)
|
||||
@@ -1049,21 +1051,9 @@ rd_watch_view_build(RD_View *view, RD_WatchViewState *ewv, B32 modifiable, U32 d
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, title);
|
||||
if(matches.count == matches.needle_part_count)
|
||||
{
|
||||
E_MemberList bp_members = {0};
|
||||
{
|
||||
e_member_list_push_new(scratch.arena, &bp_members, .name = str8_lit("enabled"), .off = 0, .type_key = e_type_key_basic(E_TypeKind_S64));
|
||||
e_member_list_push_new(scratch.arena, &bp_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, &bp_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, &bp_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, &bp_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 bp_members_array = e_member_array_from_list(scratch.arena, &bp_members);
|
||||
E_TypeKey bp_type = e_type_key_cons(.arch = arch_from_context(), .kind = E_TypeKind_Struct, .name = str8_lit("Breakpoint"), .members = bp_members_array.v, .count = bp_members_array.count);
|
||||
E_Expr *bp_expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
bp_expr->type_key = bp_type;
|
||||
bp_expr->mode = E_Mode_Offset;
|
||||
bp_expr->space = rd_eval_space_from_entity(bp);
|
||||
ev_append_expr_blocks__rec(scratch.arena, eval_view, parent_key, key, title, bp_expr, &top_level_view_rules, 0, &blocks);
|
||||
String8 expr_string = push_str8f(scratch.arena, "$%I64u", idx);
|
||||
EV_BlockList watch_blocks = ev_block_list_from_view_expr_keys(scratch.arena, eval_view, &top_level_view_rules, expr_string, parent_key, key);
|
||||
ev_block_list_concat__in_place(&blocks, &watch_blocks);
|
||||
}
|
||||
}
|
||||
}break;
|
||||
@@ -1075,7 +1065,8 @@ rd_watch_view_build(RD_View *view, RD_WatchViewState *ewv, B32 modifiable, U32 d
|
||||
{
|
||||
mutable_entity_kind = RD_EntityKind_WatchPin;
|
||||
RD_EntityList wps = rd_query_cached_entity_list_with_kind(mutable_entity_kind);
|
||||
for(RD_EntityNode *n = wps.first; n != 0; n = n->next)
|
||||
U64 idx = rd_state->meta_eval_infos_wps_idx_range.min;
|
||||
for(RD_EntityNode *n = wps.first; n != 0; n = n->next, idx += 1)
|
||||
{
|
||||
RD_Entity *wp = n->entity;
|
||||
if(wp->flags & RD_EntityFlag_MarkedForDeletion)
|
||||
@@ -1088,17 +1079,9 @@ rd_watch_view_build(RD_View *view, RD_WatchViewState *ewv, B32 modifiable, U32 d
|
||||
FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, title);
|
||||
if(matches.count == matches.needle_part_count)
|
||||
{
|
||||
E_MemberList wp_members = {0};
|
||||
{
|
||||
e_member_list_push_new(scratch.arena, &wp_members, .name = str8_lit("Location"), .off = 0, .type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_Char8), 256));
|
||||
}
|
||||
E_MemberArray wp_members_array = e_member_array_from_list(scratch.arena, &wp_members);
|
||||
E_TypeKey wp_type = e_type_key_cons(.arch = arch_from_context(), .kind = E_TypeKind_Struct, .name = str8_lit("Watch Pin"), .members = wp_members_array.v, .count = wp_members_array.count);
|
||||
E_Expr *wp_expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, 0);
|
||||
wp_expr->type_key = wp_type;
|
||||
wp_expr->mode = E_Mode_Offset;
|
||||
wp_expr->space = rd_eval_space_from_entity(wp);
|
||||
ev_append_expr_blocks__rec(scratch.arena, eval_view, parent_key, key, title, wp_expr, &top_level_view_rules, 0, &blocks);
|
||||
String8 expr_string = push_str8f(scratch.arena, "$%I64u", idx);
|
||||
EV_BlockList watch_blocks = ev_block_list_from_view_expr_keys(scratch.arena, eval_view, &top_level_view_rules, expr_string, parent_key, key);
|
||||
ev_block_list_concat__in_place(&blocks, &watch_blocks);
|
||||
}
|
||||
}
|
||||
}break;
|
||||
@@ -2216,13 +2199,13 @@ rd_watch_view_build(RD_View *view, RD_WatchViewState *ewv, B32 modifiable, U32 d
|
||||
default:{}break;
|
||||
case E_Mode_Offset:
|
||||
{
|
||||
RD_Entity *space_entity = rd_entity_from_eval_space(row_eval.space);
|
||||
if(space_entity->kind == RD_EntityKind_Process)
|
||||
CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(row_eval.space);
|
||||
if(space_entity->kind == CTRL_EntityKind_Process)
|
||||
{
|
||||
U64 size = e_type_byte_size_from_key(row_eval.type_key);
|
||||
size = Min(size, 64);
|
||||
Rng1U64 vaddr_rng = r1u64(row_eval.value.u64, row_eval.value.u64+size);
|
||||
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, space_entity->ctrl_handle, vaddr_rng, 0);
|
||||
CTRL_ProcessMemorySlice slice = ctrl_query_cached_data_from_process_vaddr_range(scratch.arena, space_entity->handle, vaddr_rng, 0);
|
||||
for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1)
|
||||
{
|
||||
if(slice.byte_changed_flags[idx] != 0)
|
||||
@@ -4648,11 +4631,11 @@ RD_VIEW_UI_FUNCTION_DEF(target)
|
||||
{
|
||||
ProfBeginFunction();
|
||||
Temp scratch = scratch_begin(0, 0);
|
||||
#if 0 // TODO(rjf): @msgs
|
||||
RD_Entity *entity = rd_entity_from_eval_string(string);
|
||||
RD_EntityList custom_entry_points = rd_push_entity_child_list_with_kind(scratch.arena, entity, RD_EntityKind_EntryPoint);
|
||||
F32 row_height_px = floor_f32(ui_top_font_size()*2.5f);
|
||||
|
||||
#if 0 // TODO(rjf): @msgs
|
||||
RD_TargetViewState *tv = rd_view_user_state(view, RD_TargetViewState);
|
||||
RD_Entity *entity = rd_entity_from_eval_string(string);
|
||||
// rjf: process commands
|
||||
@@ -4688,7 +4671,6 @@ RD_VIEW_UI_FUNCTION_DEF(target)
|
||||
}break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
//- rjf: grab state
|
||||
RD_TargetViewState *tv = rd_view_user_state(view, RD_TargetViewState);
|
||||
@@ -4943,6 +4925,7 @@ RD_VIEW_UI_FUNCTION_DEF(target)
|
||||
//- rjf: apply moves to selection
|
||||
tv->cursor = next_cursor;
|
||||
|
||||
#endif
|
||||
scratch_end(scratch);
|
||||
ProfEnd();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user