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)

This commit is contained in:
Ryan Fleury
2024-08-06 08:58:30 -07:00
parent 26f75fe7c1
commit 24d398e3c0
3 changed files with 53 additions and 32 deletions
+16 -2
View File
@@ -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->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->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->member_map = df_query_cached_member_map_from_dbgi_key_voff(&primary_dbgi_key, rip_voff);
ctx->macro_map = &e_string2expr_map_nil; ctx->macro_map = push_array(arena, E_String2ExprMap, 1);
// TODO(rjf): ctx->macro_map = ...; ctx->macro_map[0] = e_string2expr_map_make(arena, 512);
ctx->memory_read_user_data = process; ctx->memory_read_user_data = process;
ctx->memory_read = df_eval_memory_read; 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); 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 = 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); ctx->tls_base[0] = df_query_cached_tls_base_vaddr_from_process_root_rip(process, tls_root_vaddr, rip_vaddr);
e_select_ctx(ctx); 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(); ProfEnd();
+1 -1
View File
@@ -8547,7 +8547,7 @@ df_single_line_eval_value_strings_from_eval(Arena *arena, DF_EvalVizStringFlags
// rjf: descend to pointed-at thing // rjf: descend to pointed-at thing
else if(direct_type_has_content && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules)) else if(direct_type_has_content && (flags & DF_EvalVizStringFlag_ReadOnlyDisplayRules))
{ {
if(depth < 3) if(depth < 5)
{ {
E_Eval pted_eval = zero_struct; E_Eval pted_eval = zero_struct;
pted_eval.type_key = direct_type_key; pted_eval.type_key = direct_type_key;
+36 -29
View File
@@ -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_container = atom;
E_Expr *member_expr = e_push_expr(arena, E_ExprKind_LeafMember, member_name.str); 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); atom = e_push_expr(arena, E_ExprKind_MemberAccess, token_string.str);
e_expr_push_child(atom, member_container); e_expr_push_child(atom, member_container);
e_expr_push_child(atom, member_expr); 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 //- rjf: address => resolve into value, if leaf
case E_Mode_Addr: 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); E_TypeKind type_kind = e_type_kind_from_key(type_key);
U64 type_byte_size = e_type_byte_size_from_key(type_key); if(type_kind == E_TypeKind_Array)
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))
{ {
eval.mode = E_Mode_Value; eval.mode = E_Mode_Value;
}
// rjf: mask&shift, for bitfields else if(e_state->ctx->memory_read != 0)
if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64)) {
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); eval.mode = E_Mode_Value;
E_Type *type = e_type_from_key(scratch.arena, type_key);
U64 valid_bits_mask = 0; // rjf: mask&shift, for bitfields
for(U64 idx = 0; idx < type->count; idx += 1) if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64))
{ {
valid_bits_mask |= (1<<idx); 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)
{
valid_bits_mask |= (1<<idx);
}
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;
} }
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; }break;