From 24d398e3c0bf7f77e899a60ed713b15cdb6c642a Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Tue, 6 Aug 2024 08:58:30 -0700 Subject: [PATCH] fix resolution to address value in array case; reintroduce macro map building (but this time it is frontend-wide rather than locked to a watch window) --- src/df/core/df_core.c | 18 ++++++++++-- src/df/gfx/df_gfx.c | 2 +- src/eval2/eval2.c | 65 ++++++++++++++++++++++++------------------- 3 files changed, 53 insertions(+), 32 deletions(-) diff --git a/src/df/core/df_core.c b/src/df/core/df_core.c index 17fd17a3..059ed976 100644 --- a/src/df/core/df_core.c +++ b/src/df/core/df_core.c @@ -8655,8 +8655,8 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) ctx->reg_alias_map = ctrl_string2alias_from_arch(ctx->arch); ctx->locals_map = df_query_cached_locals_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff); ctx->member_map = df_query_cached_member_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff); - ctx->macro_map = &e_string2expr_map_nil; - // TODO(rjf): ctx->macro_map = ...; + ctx->macro_map = push_array(arena, E_String2ExprMap, 1); + ctx->macro_map[0] = e_string2expr_map_make(arena, 512); ctx->memory_read_user_data = process; ctx->memory_read = df_eval_memory_read; ctx->reg_data = ctrl_query_cached_reg_block_from_thread(arena, df_state->ctrl_entity_store, thread->ctrl_machine_id, thread->ctrl_handle); @@ -8666,6 +8666,20 @@ df_core_begin_frame(Arena *arena, DF_CmdList *cmds, F32 dt) ctx->tls_base = push_array(arena, U64, 1); ctx->tls_base[0] = df_query_cached_tls_base_vaddr_from_process_root_rip(process, tls_root_vaddr, rip_vaddr); e_select_ctx(ctx); + { + DF_EntityList watches = df_query_cached_entity_list_with_kind(DF_EntityKind_Watch); + for(DF_EntityNode *n = watches.first; n != 0; n = n->next) + { + DF_Entity *watch = n->entity; + String8 expr = watch->name; + E_TokenArray tokens = e_token_array_from_text(arena, expr); + E_Parse parse = e_parse_expr_from_text_tokens(arena, expr, &tokens); + if(parse.msgs.max_kind == E_MsgKind_Null) + { + e_push_leaf_ident_exprs_from_expr__in_place(arena, ctx->macro_map, parse.expr); + } + } + } } ProfEnd(); diff --git a/src/df/gfx/df_gfx.c b/src/df/gfx/df_gfx.c index 41e0e674..ac90ab74 100644 --- a/src/df/gfx/df_gfx.c +++ b/src/df/gfx/df_gfx.c @@ -8547,7 +8547,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags // rjf: descend to pointed-at thing else if(direct_type_has_content && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) { - if(depth < 3) + if(depth < 5) { E_Eval pted_eval = zero_struct; pted_eval.type_key = direct_type_key; diff --git a/src/eval2/eval2.c b/src/eval2/eval2.c index 0c320211..a0cc5e97 100644 --- a/src/eval2/eval2.c +++ b/src/eval2/eval2.c @@ -3225,6 +3225,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to { E_Expr *member_container = atom; E_Expr *member_expr = e_push_expr(arena, E_ExprKind_LeafMember, member_name.str); + member_expr->string = member_name; atom = e_push_expr(arena, E_ExprKind_MemberAccess, token_string.str); e_expr_push_child(atom, member_container); e_expr_push_child(atom, member_expr); @@ -5492,42 +5493,48 @@ e_value_eval_from_eval(E_Eval eval) //- rjf: address => resolve into value, if leaf case E_Mode_Addr: - if(e_state->ctx->memory_read != 0) { - E_TypeKey type_key = eval.type_key; + E_TypeKey type_key = e_type_unwrap(eval.type_key); E_TypeKind type_kind = e_type_kind_from_key(type_key); - U64 type_byte_size = e_type_byte_size_from_key(type_key); - Rng1U64 value_vaddr_range = r1u64(eval.value.u64, eval.value.u64 + type_byte_size); - MemoryZeroStruct(&eval.value); - if(!e_type_key_match(type_key, e_type_key_zero()) && - type_byte_size <= sizeof(E_Value) && - e_state->ctx->memory_read(e_state->ctx->memory_read_user_data, &eval.value, value_vaddr_range)) + if(type_kind == E_TypeKind_Array) { eval.mode = E_Mode_Value; - - // rjf: mask&shift, for bitfields - if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64)) + } + else if(e_state->ctx->memory_read != 0) + { + U64 type_byte_size = e_type_byte_size_from_key(type_key); + Rng1U64 value_vaddr_range = r1u64(eval.value.u64, eval.value.u64 + type_byte_size); + MemoryZeroStruct(&eval.value); + if(!e_type_key_match(type_key, e_type_key_zero()) && + type_byte_size <= sizeof(E_Value) && + e_state->ctx->memory_read(e_state->ctx->memory_read_user_data, &eval.value, value_vaddr_range)) { - Temp scratch = scratch_begin(0, 0); - E_Type *type = e_type_from_key(scratch.arena, type_key); - U64 valid_bits_mask = 0; - for(U64 idx = 0; idx < type->count; idx += 1) + eval.mode = E_Mode_Value; + + // rjf: mask&shift, for bitfields + if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64)) { - valid_bits_mask |= (1<count; idx += 1) + { + valid_bits_mask |= (1<> type->off; + eval.value.u64 = eval.value.u64 & valid_bits_mask; + eval.type_key = type->direct_type_key; + scratch_end(scratch); + } + + // rjf: manually sign-extend + switch(type_kind) + { + default: break; + case E_TypeKind_S8: {eval.value.s64 = (S64)*((S8 *)&eval.value.u64);}break; + case E_TypeKind_S16: {eval.value.s64 = (S64)*((S16 *)&eval.value.u64);}break; + case E_TypeKind_S32: {eval.value.s64 = (S64)*((S32 *)&eval.value.u64);}break; } - eval.value.u64 = eval.value.u64 >> type->off; - eval.value.u64 = eval.value.u64 & valid_bits_mask; - eval.type_key = type->direct_type_key; - scratch_end(scratch); - } - - // rjf: manually sign-extend - switch(type_kind) - { - default: break; - case E_TypeKind_S8: {eval.value.s64 = (S64)*((S8 *)&eval.value.u64);}break; - case E_TypeKind_S16: {eval.value.s64 = (S64)*((S16 *)&eval.value.u64);}break; - case E_TypeKind_S32: {eval.value.s64 = (S64)*((S32 *)&eval.value.u64);}break; } } }break;