From 5134d1ce4c0bfd3f6ad0944b0eae55137ffab7de Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Mon, 28 Jul 2025 14:32:47 -0700 Subject: [PATCH] adjust eval -> space range mapping to fix a few edge cases --- src/eval/eval_core.c | 53 +++++++++++++++++++++------------------ src/eval/eval_core.h | 3 +-- src/raddbg/raddbg_core.c | 12 +++++++++ src/raddbg/raddbg_core.h | 1 + src/raddbg/raddbg_views.c | 34 ++++++------------------- 5 files changed, 49 insertions(+), 54 deletions(-) diff --git a/src/eval/eval_core.c b/src/eval/eval_core.c index fa02c57e..a1f3c268 100644 --- a/src/eval/eval_core.c +++ b/src/eval/eval_core.c @@ -1350,38 +1350,41 @@ e_key_wrapf(E_Key key, char *fmt, ...) //////////////////////////////// //~ rjf: Eval Info Extraction -internal U64 -e_base_offset_from_eval(E_Eval eval) +internal Rng1U64 +e_range_from_eval(E_Eval eval) { - if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative)))) + // rjf: choose base offset + U64 base_offset = 0; { - eval = e_value_eval_from_eval(eval); - } - return eval.value.u64; -} - -internal U64 -e_range_size_from_eval(E_Eval eval) -{ - U64 result = KB(16); - { - E_TypeKey type_core = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative); - E_TypeKind type_core_kind = e_type_kind_from_key(type_core); - B32 got_size = 0; - - // rjf: try getting size from intrinsic type (e.g. arrays/etc.) - if(!got_size) + E_Eval base_off_eval = eval; + if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(e_type_key_unwrap(base_off_eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative)))) { - if(type_core_kind == E_TypeKind_Array || - type_core_kind == E_TypeKind_Struct || - type_core_kind == E_TypeKind_Union || - type_core_kind == E_TypeKind_Class) + base_off_eval = e_value_eval_from_eval(base_off_eval); + } + base_offset = base_off_eval.value.u64; + } + + // rjf: choose size + U64 size = KB(16); + { + E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative); + E_TypeKind type_kind = e_type_kind_from_key(type_key); + if(type_kind == E_TypeKind_Ptr) + { + E_Eval ptee_eval = e_eval_wrapf(eval, "*$"); + U64 ptee_size = e_type_byte_size_from_key(ptee_eval.irtree.type_key); + if(ptee_size > 8) { - result = e_type_byte_size_from_key(type_core); - got_size = 1; + size = ptee_size; } } + else + { + size = e_type_byte_size_from_key(type_key); + } } + + Rng1U64 result = r1u64(base_offset, base_offset+size); return result; } diff --git a/src/eval/eval_core.h b/src/eval/eval_core.h index d439979a..0de42d9d 100644 --- a/src/eval/eval_core.h +++ b/src/eval/eval_core.h @@ -1294,8 +1294,7 @@ internal E_Key e_key_wrapf(E_Key key, char *fmt, ...); //////////////////////////////// //~ rjf: Eval Info Extraction -internal U64 e_base_offset_from_eval(E_Eval eval); -internal U64 e_range_size_from_eval(E_Eval eval); +internal Rng1U64 e_range_from_eval(E_Eval eval); //////////////////////////////// //~ rjf: Debug Functions diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index 60a32c6a..08186ae4 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -5640,6 +5640,18 @@ rd_view_setting_f32_from_name(String8 name) //- rjf: evaluation & tag (a view's 'call') parameter extraction +internal Rng1U64 +rd_space_range_from_eval(E_Eval eval) +{ + Rng1U64 range = e_range_from_eval(eval); + U64 size_setting = rd_view_setting_value_from_name(str8_lit("size")).u64; + if(size_setting != 0) + { + range.max = range.min + size_setting; + } + return range; +} + internal TXT_LangKind rd_lang_kind_from_eval(E_Eval eval) { diff --git a/src/raddbg/raddbg_core.h b/src/raddbg/raddbg_core.h index 1555917f..adc9f532 100644 --- a/src/raddbg/raddbg_core.h +++ b/src/raddbg/raddbg_core.h @@ -934,6 +934,7 @@ internal U64 rd_view_setting_u64_from_name(String8 string); internal F32 rd_view_setting_f32_from_name(String8 string); //- rjf: evaluation & tag (a view's 'call') parameter extraction +internal Rng1U64 rd_space_range_from_eval(E_Eval eval); internal TXT_LangKind rd_lang_kind_from_eval(E_Eval eval); internal Arch rd_arch_from_eval(E_Eval eval); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 2d874959..2d9275ae 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2061,13 +2061,7 @@ RD_VIEW_UI_FUNCTION_DEF(text) if(rd_regs()->cursor.column == 0) { rd_regs()->cursor.column = 1; } if(rd_regs()->mark.line == 0) { rd_regs()->mark.line = 1; } if(rd_regs()->mark.column == 0) { rd_regs()->mark.column = 1; } - U64 base_offset = e_base_offset_from_eval(eval); - U64 size = rd_view_setting_value_from_name(str8_lit("size")).u64; - if(size == 0) - { - size = e_range_size_from_eval(eval); - } - Rng1U64 range = r1u64(base_offset, base_offset+size); + Rng1U64 range = rd_space_range_from_eval(eval); rd_regs()->text_key = rd_key_from_eval_space_range(eval.space, range, 1); String8 lang = rd_view_setting_from_name(str8_lit("lang")); if(lang.size == 0) @@ -2346,13 +2340,7 @@ RD_VIEW_UI_FUNCTION_DEF(disasm) { space = auto_space; } - U64 base_offset = e_base_offset_from_eval(eval); - U64 size = rd_view_setting_value_from_name(str8_lit("size")).u64; - if(size == 0) - { - size = e_range_size_from_eval(eval); - } - Rng1U64 range = r1u64(base_offset, base_offset+size); + Rng1U64 range = rd_space_range_from_eval(eval); Arch arch = rd_arch_from_eval(eval); CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(space); CTRL_Entity *dasm_module = &ctrl_entity_nil; @@ -2535,22 +2523,12 @@ RD_VIEW_UI_FUNCTION_DEF(memory) Vec4F32 main_tx_color_rgba = ui_color_from_name(str8_lit("text")); Vec4F32 main_tx_color_hsva = hsva_from_rgba(main_tx_color_rgba); F32 main_font_size = ui_bottom_font_size(); - U64 base_offset = e_base_offset_from_eval(eval); - U64 size = rd_view_setting_value_from_name(str8_lit("size")).u64; - if(size == 0) - { - size = e_range_size_from_eval(eval); - } - Rng1U64 view_range = r1u64(base_offset, base_offset+size); + Rng1U64 view_range = rd_space_range_from_eval(eval); if(eval.space.kind == 0) { eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process), RD_EvalSpaceKind_CtrlEntity); view_range = rd_whole_range_from_eval_space(eval.space); } - if(eval.space.kind == RD_EvalSpaceKind_CtrlEntity && dim_1u64(view_range) == KB(16)) - { - view_range = r1u64(0, 0x7FFFFFFFFFFFull); - } U64 cursor_base_vaddr = rd_view_setting_u64_from_name(str8_lit("cursor")); U64 mark_base_vaddr = rd_view_setting_u64_from_name(str8_lit("mark")); U64 cursor_size = rd_view_setting_u64_from_name(str8_lit("cursor_size")); @@ -3848,7 +3826,8 @@ RD_VIEW_UI_FUNCTION_DEF(bitmap) break; } } - U64 base_offset = e_base_offset_from_eval(eval); + Rng1U64 eval_range = e_range_from_eval(eval); + U64 base_offset = eval_range.min; U64 expected_size = dim.x*dim.y*r_tex2d_format_bytes_per_pixel_table[fmt]; Rng1U64 offset_range = r1u64(base_offset, base_offset + expected_size); @@ -4361,7 +4340,8 @@ RD_VIEW_UI_FUNCTION_DEF(geo3d) ////////////////////////////// //- rjf: evaluate & unpack expression // - U64 base_offset = e_base_offset_from_eval(eval); + Rng1U64 eval_range = e_range_from_eval(eval); + U64 base_offset = eval_range.min; Rng1U64 idxs_range = r1u64(base_offset, base_offset+count*sizeof(U32)); Rng1U64 vtxs_range = r1u64(vtx_base_off, vtx_base_off+vtx_size); HS_Key idxs_key = rd_key_from_eval_space_range(eval.space, idxs_range, 0);