mirror of
https://github.com/Ed94/raddebugger.git
synced 2026-07-23 16:07:50 +00:00
pipe through space information through eval compiler/interpreter
This commit is contained in:
+39
-28
@@ -3689,8 +3689,9 @@ df_ctrl_last_stop_event(void)
|
||||
//~ rjf: Evaluation Context
|
||||
|
||||
internal B32
|
||||
df_eval_memory_read(void *u, void *out, Rng1U64 vaddr_range)
|
||||
df_eval_memory_read(void *u, E_Space space, void *out, Rng1U64 vaddr_range)
|
||||
{
|
||||
// TODO(rjf): @spaces pick the correct process from space
|
||||
B32 result = 0;
|
||||
DF_Entity *process = (DF_Entity *)u;
|
||||
if(process->kind == DF_EntityKind_Process)
|
||||
@@ -4314,27 +4315,30 @@ df_commit_eval_value(E_Eval dst_eval, E_Eval src_eval)
|
||||
//- rjf: commit
|
||||
if(result && commit_data.size != 0)
|
||||
{
|
||||
switch(dst_eval.mode)
|
||||
if(dst_eval.mode == E_Mode_Offset)
|
||||
{
|
||||
default:{}break;
|
||||
case E_Mode_Addr:
|
||||
switch(dst_eval.space)
|
||||
{
|
||||
ctrl_process_write(process->ctrl_machine_id, process->ctrl_handle, r1u64(dst_eval.value.u64, dst_eval.value.u64+commit_data.size), commit_data.str);
|
||||
}break;
|
||||
case E_Mode_Reg:
|
||||
{
|
||||
CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread);
|
||||
Architecture arch = df_architecture_from_entity(thread);
|
||||
U64 reg_block_size = regs_block_size_from_architecture(arch);
|
||||
if(unwind.frames.count != 0 &&
|
||||
(0 <= dst_eval.value.u64 && dst_eval.value.u64+commit_data.size < reg_block_size))
|
||||
case E_Space_Regs:
|
||||
{
|
||||
void *new_regs = push_array(scratch.arena, U8, reg_block_size);
|
||||
MemoryCopy(new_regs, unwind.frames.v[0].regs, reg_block_size);
|
||||
MemoryCopy((U8 *)new_regs+dst_eval.value.u64, commit_data.str, commit_data.size);
|
||||
result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, new_regs);
|
||||
}
|
||||
}break;
|
||||
CTRL_Unwind unwind = df_query_cached_unwind_from_thread(thread);
|
||||
Architecture arch = df_architecture_from_entity(thread);
|
||||
U64 reg_block_size = regs_block_size_from_architecture(arch);
|
||||
if(unwind.frames.count != 0 &&
|
||||
(0 <= dst_eval.value.u64 && dst_eval.value.u64+commit_data.size < reg_block_size))
|
||||
{
|
||||
void *new_regs = push_array(scratch.arena, U8, reg_block_size);
|
||||
MemoryCopy(new_regs, unwind.frames.v[0].regs, reg_block_size);
|
||||
MemoryCopy((U8 *)new_regs+dst_eval.value.u64, commit_data.str, commit_data.size);
|
||||
result = ctrl_thread_write_reg_block(thread->ctrl_machine_id, thread->ctrl_handle, new_regs);
|
||||
}
|
||||
}break;
|
||||
default:
|
||||
{
|
||||
// TODO(rjf): @spaces pick the right process, from the space
|
||||
ctrl_process_write(process->ctrl_machine_id, process->ctrl_handle, r1u64(dst_eval.value.u64, dst_eval.value.u64+commit_data.size), commit_data.str);
|
||||
}break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4445,7 +4449,6 @@ df_eval_link_base_chunk_list_from_eval(Arena *arena, E_TypeKey link_member_type_
|
||||
chunk->count = 0;
|
||||
SLLQueuePush(list.first, list.last, chunk);
|
||||
}
|
||||
chunk->b[chunk->count].mode = base_eval.mode;
|
||||
chunk->b[chunk->count].offset = base_eval.value.u64;
|
||||
chunk->count += 1;
|
||||
list.count += 1;
|
||||
@@ -4455,14 +4458,15 @@ df_eval_link_base_chunk_list_from_eval(Arena *arena, E_TypeKey link_member_type_
|
||||
E_Eval link_member_eval =
|
||||
{
|
||||
.value = {.u64 = base_eval.value.u64 + link_member_off},
|
||||
base_eval.mode,
|
||||
.mode = E_Mode_Offset,
|
||||
.space = base_eval.space,
|
||||
.type_key = link_member_type_key,
|
||||
};
|
||||
E_Eval link_member_value_eval = e_value_eval_from_eval(link_member_eval);
|
||||
|
||||
// rjf: advance to next link
|
||||
last_eval = base_eval;
|
||||
base_eval.mode = E_Mode_Addr;
|
||||
base_eval.mode = E_Mode_Offset;
|
||||
base_eval.value.u64 = link_member_value_eval.value.u64;
|
||||
}
|
||||
return list;
|
||||
@@ -4609,7 +4613,8 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex
|
||||
direct_type_kind == E_TypeKind_IncompleteClass))
|
||||
{
|
||||
udt_eval.type_key = direct_type_key;
|
||||
udt_eval.mode = E_Mode_Addr;
|
||||
udt_eval.mode = E_Mode_Offset;
|
||||
udt_eval.space = ptr_val_eval.space;
|
||||
udt_eval.value = ptr_val_eval.value;
|
||||
udt_type_kind = e_type_kind_from_key(direct_type_key);
|
||||
}
|
||||
@@ -4618,7 +4623,8 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex
|
||||
if(direct_type_kind == E_TypeKind_Array)
|
||||
{
|
||||
arr_eval.type_key = direct_type_key;
|
||||
arr_eval.mode = E_Mode_Addr;
|
||||
arr_eval.mode = E_Mode_Offset;
|
||||
arr_eval.space = ptr_val_eval.space;
|
||||
arr_eval.value = ptr_val_eval.value;
|
||||
arr_type_kind = e_type_kind_from_key(direct_type_key);
|
||||
}
|
||||
@@ -4627,7 +4633,8 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex
|
||||
if(direct_type_kind == E_TypeKind_Ptr || direct_type_kind == E_TypeKind_LRef || direct_type_kind == E_TypeKind_RRef)
|
||||
{
|
||||
ptr_eval.type_key = direct_type_key;
|
||||
ptr_eval.mode = E_Mode_Addr;
|
||||
ptr_eval.mode = E_Mode_Offset;
|
||||
ptr_eval.space = ptr_val_eval.space;
|
||||
ptr_eval.value = ptr_val_eval.value;
|
||||
ptr_type_kind = e_type_kind_from_key(direct_type_key);
|
||||
}
|
||||
@@ -4748,8 +4755,9 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex
|
||||
E_Member *member = &filtered_data_members.v[child_idx];
|
||||
E_Eval child_eval = zero_struct;
|
||||
{
|
||||
child_eval.type_key = member->type_key;
|
||||
child_eval.mode = udt_eval.mode;
|
||||
child_eval.type_key = member->type_key;
|
||||
child_eval.mode = udt_eval.mode;
|
||||
child_eval.space = udt_eval.space;
|
||||
child_eval.value.u64 = udt_eval.value.u64 + member->off;
|
||||
}
|
||||
df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, member->name, child_eval, member, &child_cfg, depth+1, list_out);
|
||||
@@ -4867,7 +4875,8 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex
|
||||
E_Eval child_eval = zero_struct;
|
||||
{
|
||||
child_eval.type_key = udt_eval.type_key;
|
||||
child_eval.mode = link_base.mode;
|
||||
child_eval.mode = E_Mode_Offset;
|
||||
child_eval.space = udt_eval.space;
|
||||
child_eval.value.u64= link_base.offset;
|
||||
}
|
||||
df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out);
|
||||
@@ -4926,6 +4935,7 @@ df_append_viz_blocks_for_parent__rec(Arena *arena, DF_EvalView *eval_view, DF_Ex
|
||||
{
|
||||
child_eval.type_key = element_type_key;
|
||||
child_eval.mode = arr_eval.mode;
|
||||
child_eval.space = arr_eval.space;
|
||||
child_eval.value.u64= arr_eval.value.u64 + child_idx*element_type_byte_size;
|
||||
}
|
||||
df_append_viz_blocks_for_parent__rec(arena, eval_view, key, child->key, push_str8f(arena, "[%I64u]", child_idx), child_eval, 0, &child_cfg, depth+1, list_out);
|
||||
@@ -8322,6 +8332,7 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt)
|
||||
ctx->arch = arch;
|
||||
ctx->memory_read_user_data = process;
|
||||
ctx->memory_read = df_eval_memory_read;
|
||||
ctx->primary_space = eval_modules_primary->space;
|
||||
ctx->reg_size = regs_block_size_from_architecture(ctx->arch);
|
||||
ctx->reg_data = push_array(arena, U8, ctx->reg_size);
|
||||
ctx->module_base = push_array(arena, U64, 1);
|
||||
|
||||
@@ -650,7 +650,6 @@ struct DF_EvalViewCache
|
||||
typedef struct DF_EvalLinkBase DF_EvalLinkBase;
|
||||
struct DF_EvalLinkBase
|
||||
{
|
||||
E_Mode mode;
|
||||
U64 offset;
|
||||
};
|
||||
|
||||
@@ -1564,7 +1563,7 @@ internal CTRL_Event df_ctrl_last_stop_event(void);
|
||||
////////////////////////////////
|
||||
//~ rjf: Evaluation Context
|
||||
|
||||
internal B32 df_eval_memory_read(void *u, void *out, Rng1U64 vaddr_range);
|
||||
internal B32 df_eval_memory_read(void *u, E_Space space, void *out, Rng1U64 vaddr_range);
|
||||
internal E_Eval df_eval_from_eval_cfg_table(Arena *arena, E_Eval eval, DF_CfgTable *cfg);
|
||||
|
||||
////////////////////////////////
|
||||
|
||||
+12
-5
@@ -6133,7 +6133,7 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds)
|
||||
DF_ExpandKey parent_key = df_expand_key_make(5381, 1);
|
||||
DF_ExpandKey key = df_expand_key_make(df_hash_from_expand_key(parent_key), 1);
|
||||
DF_EvalVizBlockList viz_blocks = df_eval_viz_block_list_from_eval_view_expr_keys(scratch.arena, eval_view, expr, parent_key, key);
|
||||
U32 default_radix = (eval.mode == E_Mode_Reg ? 16 : 10);
|
||||
U32 default_radix = (eval.space == E_Space_Regs ? 16 : 10);
|
||||
DF_EvalVizWindowedRowList viz_rows = df_eval_viz_windowed_row_list_from_viz_block_list(scratch.arena, scope, eval_view, default_radix, ui_top_font(), ui_top_font_size(), r1s64(0, 50), &viz_blocks);
|
||||
|
||||
//- rjf: animate
|
||||
@@ -6221,8 +6221,9 @@ df_window_update_and_render(Arena *arena, DF_Window *ws, DF_CmdList *cmds)
|
||||
switch(row->eval.mode)
|
||||
{
|
||||
default:{}break;
|
||||
case E_Mode_Addr:
|
||||
case E_Mode_Offset:
|
||||
{
|
||||
// TODO(rjf): @spaces pick the right process from the eval's space
|
||||
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);
|
||||
@@ -8455,7 +8456,8 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
|
||||
{
|
||||
E_Eval pted_eval = zero_struct;
|
||||
pted_eval.type_key = direct_type_key;
|
||||
pted_eval.mode = E_Mode_Addr;
|
||||
pted_eval.mode = E_Mode_Offset;
|
||||
pted_eval.space = value_eval.space;
|
||||
pted_eval.value = value_eval.value;
|
||||
String8List pted_strs = df_single_line_eval_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, pted_eval, opt_member, cfg_table);
|
||||
if(pted_strs.total_size == 0)
|
||||
@@ -8512,8 +8514,9 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
|
||||
switch(eval.mode)
|
||||
{
|
||||
default:{}break;
|
||||
case E_Mode_Addr:
|
||||
case E_Mode_Offset:
|
||||
{
|
||||
// TODO(rjf): @spaces pick the right process from the eval's space
|
||||
CTRL_ProcessMemorySlice text_slice = ctrl_query_cached_zero_terminated_data_from_process_vaddr_limit(arena, process->ctrl_machine_id, process->ctrl_handle, eval.value.u64, 256, element_size, 0);
|
||||
text_data = text_slice.data;
|
||||
}break;
|
||||
@@ -8612,6 +8615,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
|
||||
E_Eval member_eval = zero_struct;
|
||||
member_eval.type_key = mem->type_key;
|
||||
member_eval.mode = eval.mode;
|
||||
member_eval.space = eval.space;
|
||||
member_eval.value = eval.value;
|
||||
member_eval.value.u64 += mem->off;
|
||||
String8List member_strs = df_single_line_eval_value_strings_from_eval(arena, flags, default_radix, font, font_size, max_size-space_taken, depth+1, member_eval, opt_member, cfg_table);
|
||||
@@ -8820,6 +8824,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope,
|
||||
{
|
||||
member_eval.type_key = member->type_key;
|
||||
member_eval.mode = block->eval.mode;
|
||||
member_eval.space = block->eval.space;
|
||||
member_eval.value = block->eval.value;
|
||||
member_eval.value.u64 += member->off;
|
||||
}
|
||||
@@ -8876,6 +8881,7 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope,
|
||||
{
|
||||
eval.type_key = block->eval.type_key;
|
||||
eval.mode = E_Mode_Value;
|
||||
eval.space = block->eval.space;
|
||||
eval.value.u64 = enum_val->val;
|
||||
}
|
||||
|
||||
@@ -8971,7 +8977,8 @@ df_eval_viz_windowed_row_list_from_viz_block_list(Arena *arena, DI_Scope *scope,
|
||||
E_Eval link_eval = zero_struct;
|
||||
{
|
||||
link_eval.type_key = block->eval.type_key;
|
||||
link_eval.mode = link_base->mode;
|
||||
link_eval.mode = E_Mode_Offset;
|
||||
link_eval.space = block->eval.space;
|
||||
link_eval.value.u64= link_base->offset;
|
||||
}
|
||||
|
||||
|
||||
@@ -147,7 +147,7 @@ df_vr_rgba_from_eval(E_Eval eval, DF_Entity *process)
|
||||
|
||||
// rjf: extract r/g/b/a values from array
|
||||
case E_TypeKind_Array:
|
||||
if(eval.mode == E_Mode_Addr)
|
||||
if(eval.mode == E_Mode_Offset)
|
||||
{
|
||||
U64 array_total_size = e_type_byte_size_from_key(type_key);
|
||||
U64 array_total_size_capped = ClampTop(array_total_size, 64);
|
||||
@@ -184,7 +184,7 @@ df_vr_rgba_from_eval(E_Eval eval, DF_Entity *process)
|
||||
case E_TypeKind_Struct:
|
||||
case E_TypeKind_Class:
|
||||
case E_TypeKind_Union:
|
||||
if(eval.mode == E_Mode_Addr)
|
||||
if(eval.mode == E_Mode_Offset)
|
||||
{
|
||||
U64 struct_total_size = e_type_byte_size_from_key(type_key);
|
||||
U64 struct_total_size_capped = ClampTop(struct_total_size, 64);
|
||||
|
||||
@@ -2377,8 +2377,9 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
|
||||
switch(row->eval.mode)
|
||||
{
|
||||
default:{}break;
|
||||
case E_Mode_Addr:
|
||||
case E_Mode_Offset:
|
||||
{
|
||||
// TODO(rjf): @spaces pick the right process from the eval's space
|
||||
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);
|
||||
@@ -2485,7 +2486,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
|
||||
////////////////////
|
||||
//- rjf: draw start of cache lines in expansions
|
||||
//
|
||||
if((row->eval.mode == E_Mode_Addr || row->eval.mode == E_Mode_Null) &&
|
||||
if((row->eval.mode == E_Mode_Offset || row->eval.mode == E_Mode_Null) &&
|
||||
row->eval.msgs.count == 0 &&
|
||||
row->eval.value.u64%64 == 0 && row->depth > 0 &&
|
||||
!row_expanded)
|
||||
@@ -2500,7 +2501,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
|
||||
////////////////////
|
||||
//- rjf: draw mid-row cache line boundaries in expansions
|
||||
//
|
||||
if((row->eval.mode == E_Mode_Addr || row->eval.mode == E_Mode_Null) &&
|
||||
if((row->eval.mode == E_Mode_Offset || row->eval.mode == E_Mode_Null) &&
|
||||
row->eval.msgs.max_kind == E_MsgKind_Null &&
|
||||
row->eval.value.u64%64 != 0 &&
|
||||
row->depth > 0 &&
|
||||
@@ -2695,6 +2696,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
|
||||
{
|
||||
default:{}break;
|
||||
case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break;
|
||||
case E_IRExtKind_SetSpace:{op_string = str8_lit("SetSpace");}break;
|
||||
#define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break;
|
||||
RDI_EvalOp_XList
|
||||
#undef X
|
||||
@@ -2720,6 +2722,7 @@ df_watch_view_build(DF_Window *ws, DF_Panel *panel, DF_View *view, DF_WatchViewS
|
||||
{
|
||||
default:{}break;
|
||||
case E_IRExtKind_Bytecode:{op_string = str8_lit("Bytecode");}break;
|
||||
case E_IRExtKind_SetSpace:{op_string = str8_lit("SetSpace");}break;
|
||||
#define X(name) case RDI_EvalOp_##name:{op_string = str8_lit(#name);}break;
|
||||
RDI_EvalOp_XList
|
||||
#undef X
|
||||
@@ -7532,7 +7535,7 @@ DF_VIEW_UI_FUNCTION_DEF(Memory)
|
||||
{
|
||||
String8 local_name = n->string;
|
||||
E_Eval local_eval = e_eval_from_string(scratch.arena, local_name);
|
||||
if(local_eval.mode == E_Mode_Addr)
|
||||
if(local_eval.mode == E_Mode_Offset)
|
||||
{
|
||||
E_TypeKind local_eval_type_kind = e_type_kind_from_key(local_eval.type_key);
|
||||
U64 local_eval_type_size = e_type_byte_size_from_key(local_eval.type_key);
|
||||
|
||||
Reference in New Issue
Block a user