From f58c13b3a0861c4d38e6ca62667aa041883924d1 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 13 Feb 2025 15:26:21 -0800 Subject: [PATCH] plug full data member calculation path & padding member visualization back in --- src/eval/eval_ir.c | 48 +++++++++++++++++++++++++++++++--------- src/raddbg/raddbg_core.c | 11 +++++++++ 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 6f6c5544..2ff4ff15 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -152,8 +152,12 @@ E_LOOKUP_INFO_FUNCTION_DEF(default) E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key); if(direct_type_kind == E_TypeKind_Struct || direct_type_kind == E_TypeKind_Class || - direct_type_kind == E_TypeKind_Union || - direct_type_kind == E_TypeKind_Enum) + direct_type_kind == E_TypeKind_Union) + { + E_MemberArray data_members = e_type_data_members_from_key__cached(direct_type_key); + lookup_info.named_expr_count = data_members.count; + } + else if(direct_type_kind == E_TypeKind_Enum) { E_Type *direct_type = e_type_from_key__cached(direct_type_key); lookup_info.named_expr_count = direct_type->count; @@ -430,7 +434,9 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default) //- rjf: pull out specific kinds of types B32 do_struct_range = 0; + B32 do_enum_range = 0; B32 do_index_range = 0; + E_TypeKey enum_type_key = zero_struct; E_TypeKey struct_type_key = zero_struct; E_TypeKind struct_type_kind = E_TypeKind_Null; if(e_type_kind_is_pointer_or_ref(lhs_type_kind)) @@ -439,13 +445,17 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default) if(lhs_type->count == 1 && (direct_type_kind == E_TypeKind_Struct || direct_type_kind == E_TypeKind_Union || - direct_type_kind == E_TypeKind_Class || - direct_type_kind == E_TypeKind_Enum)) + direct_type_kind == E_TypeKind_Class)) { struct_type_key = direct_type_key; struct_type_kind = direct_type_kind; do_struct_range = 1; } + else if(lhs_type->count == 1 && direct_type_kind == E_TypeKind_Enum) + { + do_enum_range = 1; + enum_type_key = direct_type_key; + } else { do_index_range = 1; @@ -453,13 +463,17 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default) } else if(lhs_type_kind == E_TypeKind_Struct || lhs_type_kind == E_TypeKind_Union || - lhs_type_kind == E_TypeKind_Class || - lhs_type_kind == E_TypeKind_Enum) + lhs_type_kind == E_TypeKind_Class) { struct_type_key = lhs_type_key; struct_type_kind = lhs_type_kind; do_struct_range = 1; } + else if(lhs_type_kind == E_TypeKind_Enum) + { + enum_type_key = lhs_type_key; + do_enum_range = 1; + } else if(lhs_type_kind == E_TypeKind_Set) { do_index_range = 1; @@ -472,15 +486,29 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default) //- rjf: struct case -> the lookup-range will return a range of members if(do_struct_range) { - E_Type *struct_type = e_type_from_key__cached(struct_type_key); - Rng1U64 legal_idx_range = r1u64(0, struct_type->count); + E_MemberArray data_members = e_type_data_members_from_key__cached(struct_type_key); + Rng1U64 legal_idx_range = r1u64(0, data_members.count); Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range); U64 read_range_count = dim_1u64(read_range); for(U64 idx = 0; idx < read_range_count; idx += 1) { U64 member_idx = idx + read_range.min; - String8 member_name = (struct_type->members ? struct_type->members[member_idx].name : - struct_type->enum_vals ? struct_type->enum_vals[member_idx].name : str8_lit("")); + String8 member_name = data_members.v[member_idx].name; + exprs[idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, member_name); + } + } + + //- rjf: enum case -> the lookup-range will return a range of enum constants + else if(do_enum_range) + { + E_Type *type = e_type_from_key__cached(enum_type_key); + Rng1U64 legal_idx_range = r1u64(0, type->count); + Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range); + U64 read_range_count = dim_1u64(read_range); + for(U64 idx = 0; idx < read_range_count; idx += 1) + { + U64 member_idx = idx + read_range.min; + String8 member_name = type->enum_vals[member_idx].name; exprs[idx] = e_expr_irext_member_access(arena, lhs, &lhs_irtree, member_name); } } diff --git a/src/raddbg/raddbg_core.c b/src/raddbg/raddbg_core.c index b005a611..702d4d6b 100644 --- a/src/raddbg/raddbg_core.c +++ b/src/raddbg/raddbg_core.c @@ -9282,6 +9282,17 @@ rd_append_value_strings_from_eval(Arena *arena, EV_StringFlags flags, U32 defaul } } + //- rjf: force no_string, if we are looking at padding members + if(eval.expr->kind == E_ExprKind_MemberAccess) + { + E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, eval.expr->first); + E_Member member = e_type_member_from_key_name__cached(irtree.type_key, eval.expr->last->string); + if(member.kind == E_MemberKind_Padding) + { + no_string = 1; + } + } + //- rjf: type evaluations -> display type string if(eval.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.type_key)) {