upgrade eval space reads with staleness/bad/change info, to expand process memory cache reading abilities to all evaluation spaces; unmapped address visualization (both memory view & single line eval)

This commit is contained in:
Ryan Fleury
2026-05-13 14:48:00 -07:00
parent e6d83f7450
commit 58caf0d3d5
13 changed files with 130 additions and 46 deletions
+16 -2
View File
@@ -736,7 +736,7 @@ rd_eval_space_gen(E_Space space)
}
internal B32
rd_eval_space_read(E_Space space, void *out, Rng1U64 range)
rd_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 range)
{
Temp scratch = scratch_begin(0, 0);
B32 result = 0;
@@ -744,7 +744,7 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range)
{
default:
{
result = d_ctrl_eval_space_read(space, out, range);
result = d_ctrl_eval_space_read(space, out, out_range_info, range);
}break;
//- rjf: interior control entity reads (inside process address space or thread register block)
@@ -762,6 +762,20 @@ rd_eval_space_read(E_Space space, void *out, Rng1U64 range)
{
result = 1;
MemoryCopy(out, data.str, data.size);
if(out_range_info != 0 && out_range_info->byte_bad_flags)
{
MemoryCopy(out_range_info->byte_bad_flags, slice.byte_bad_flags, sizeof(U64) * (dim_1u64(range)+63)/64);
}
if(out_range_info != 0 && out_range_info->byte_changed_flags)
{
MemoryCopy(out_range_info->byte_changed_flags, slice.byte_changed_flags, sizeof(U64) * ((dim_1u64(range)+63)/64));
}
if(out_range_info != 0)
{
out_range_info->flags |= E_SpaceRangeFlag_Stale*!!slice.stale;
out_range_info->flags |= E_SpaceRangeFlag_AnyByteChanged*!!slice.any_byte_changed;
out_range_info->flags |= E_SpaceRangeFlag_AnyByteBad*!!slice.any_byte_bad;
}
}
}break;
case D_EntityKind_Thread:
+1 -1
View File
@@ -658,7 +658,7 @@ internal String8 rd_cmd_name_from_eval(E_Eval eval);
//- rjf: eval space reads/writes
internal U64 rd_eval_space_gen(E_Space space);
internal B32 rd_eval_space_read(E_Space space, void *out, Rng1U64 range);
internal B32 rd_eval_space_read(E_Space space, void *out, E_SpaceRangeInfo *out_range_info, Rng1U64 range);
internal B32 rd_eval_space_write(E_Space space, void *in, Rng1U64 range);
//- rjf: asynchronous streamed reads -> hashes from spaces
+1 -4
View File
@@ -4,9 +4,6 @@
////////////////////////////////
//~ rjf: post-0.9.26 TODO notes
//
// [ ] single-line bad address visualization
// [ ] memory view show unmapped memory as non-zeros
//
// [ ] "autos" collection, which can be evaluated
// [ ] show "autos" inline in source code near thread?
// [ ] memory_size(...) view for quickly evaluating memory sizes
@@ -28,7 +25,6 @@
// [ ] no selected thread -> causing evaluation failures, e.g. with go-to-definition
//
//- evaluation space coverage pass
// [ ] eval space reads/writes -> needs staleness/badness info - replace ctrl layer, to apply to all spaces
// [ ] need concrete ways of referring into a space at any offset - e.g. `process.memory + 0x1234`, `file:"foo".data + 0x1234`, `thread.regs + 0x80`, etc.
// [ ] memory view needs to take advantage of above when peeking; ensure peeking works on files etc.
// [ ] need to eliminate accelerators from evaluation context, and build them on the fly instead -
@@ -273,6 +269,7 @@
// by default go to "untitled" in default user path
// [x] memory view mutation controls
// [x] step-over/step-into doesn't step successfully in many cases, just causes a continue
// [x] eval space reads/writes -> needs staleness/badness info - replace ctrl layer, to apply to all spaces
////////////////////////////////
//~ rjf: Build Options
+3 -12
View File
@@ -2869,7 +2869,7 @@ RD_VIEW_UI_FUNCTION_DEF(memory)
String8 data = {0};
data.size = dim_1u64(range);
data.str = push_array(scratch.arena, U8, data.size);
if(!e_space_read(eval.space, data.str, range))
if(!e_space_read(eval.space, data.str, 0, range))
{
log_user_errorf("Could not successfully read memory.");
}
@@ -3224,17 +3224,8 @@ RD_VIEW_UI_FUNCTION_DEF(memory)
U64 *visible_memory_change_flags = push_array(scratch.arena, U64, (visible_memory_size+63)/64);
U64 *visible_memory_bad_flags = push_array(scratch.arena, U64, (visible_memory_size+63)/64);
{
e_space_read(eval.space, visible_memory, viz_range_bytes);
}
if(eval.space.kind == D_EvalSpaceKind_Entity)
{
D_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space);
if(entity->kind == D_EntityKind_Process)
{
D_ProcessMemorySlice slice = d_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, viz_range_bytes, 0, 0);
visible_memory_change_flags = slice.byte_changed_flags;
visible_memory_bad_flags = slice.byte_bad_flags;
}
E_SpaceRangeInfo range_info = {visible_memory_bad_flags, visible_memory_change_flags};
e_space_read(eval.space, visible_memory, &range_info, viz_range_bytes);
}
//////////////////////////////