fill out meta eval info system in frontend; get eval back up and running

This commit is contained in:
Ryan Fleury
2024-09-16 11:51:55 -07:00
parent adc9e0e512
commit c00fede4f1
5 changed files with 251 additions and 210 deletions
+71
View File
@@ -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;
+6
View File
@@ -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
View File
@@ -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
+7 -4
View File
@@ -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
View File
@@ -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();
}