From 5933708bdb9ff2dac9972696581ea7cf9983ee88 Mon Sep 17 00:00:00 2001 From: Ryan Fleury Date: Thu, 10 Oct 2024 08:13:58 -0700 Subject: [PATCH] fix cacheline boundary visualization & other various fixes in eval / eval viz --- src/eval/eval.mdesk | 4 +-- src/eval/eval_ir.c | 33 ++++++++----------- src/eval/generated/eval.meta.c | 4 +-- .../eval_visualization_core.c | 32 +++++++++++++++++- src/raddbg/raddbg_views.c | 2 +- 5 files changed, 49 insertions(+), 26 deletions(-) diff --git a/src/eval/eval.mdesk b/src/eval/eval.mdesk index 01945b3d..5e107647 100644 --- a/src/eval/eval.mdesk +++ b/src/eval/eval.mdesk @@ -86,8 +86,8 @@ E_ExprKindTable: { Address UnaryPrefix 2 "&" "&" "" "" } { Cast Null 1 "cast" "(" ")" "" } - { Sizeof UnaryPrefix 1 "sizeof" "sizeof" "" "" } - { Typeof UnaryPrefix 1 "typeof" "typeof" "" "" } + { Sizeof UnaryPrefix 1 "sizeof" "sizeof" "(" ")"} + { Typeof UnaryPrefix 1 "typeof" "typeof" "(" ")"} { ByteSwap UnaryPrefix 1 "bswap" "bswap" "(" ")"} { Neg UnaryPrefix 2 "-" "-" "" "" } diff --git a/src/eval/eval_ir.c b/src/eval/eval_ir.c index 01203435..aeffc6eb 100644 --- a/src/eval/eval_ir.c +++ b/src/eval/eval_ir.c @@ -441,13 +441,9 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) { switch(l.mode) { - // rjf: null (types) -> just resolve to new type - case E_Mode_Null: - { - }break; - // rjf: offsets -> read from base offset default: + case E_Mode_Null: case E_Mode_Offset: { // rjf: ops to compute the offset @@ -590,20 +586,17 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) // rjf: build tree E_IRNode *new_tree = l.root; E_Mode mode = l.mode; - if(l.root != &e_irnode_nil) + if(l_restype_kind == E_TypeKind_Ptr || + l_restype_kind == E_TypeKind_LRef || + l_restype_kind == E_TypeKind_RRef) { - if(l_restype_kind == E_TypeKind_Ptr || - l_restype_kind == E_TypeKind_LRef || - l_restype_kind == E_TypeKind_RRef) - { - new_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, new_tree, l_restype); - mode = E_Mode_Offset; - } - if(r_value != 0 && !r_is_constant_value) - { - E_IRNode *const_tree = e_irtree_const_u(arena, r_value); - new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, new_tree, const_tree); - } + new_tree = e_irtree_resolve_to_value(arena, l.space, l.mode, new_tree, l_restype); + mode = E_Mode_Offset; + } + if(r_value != 0 && !r_is_constant_value) + { + E_IRNode *const_tree = e_irtree_const_u(arena, r_value); + new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, new_tree, const_tree); } else if(r_is_constant_value) { @@ -815,7 +808,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs); // rjf: fill output - result.root = &e_irnode_nil; + result.root = e_irtree_const_u(arena, 0); result.type_key = r_tree.type_key; result.mode = E_Mode_Null; result.space = r_tree.space; @@ -1323,7 +1316,7 @@ e_irtree_and_type_from_expr(Arena *arena, E_Expr *expr) //- rjf: types case E_ExprKind_TypeIdent: { - result.root = &e_irnode_nil; + result.root = e_irtree_const_u(arena, 0); result.type_key = expr->type_key; result.mode = E_Mode_Null; result.space = expr->space; diff --git a/src/eval/generated/eval.meta.c b/src/eval/generated/eval.meta.c index e5e004d7..ef0b1966 100644 --- a/src/eval/generated/eval.meta.c +++ b/src/eval/generated/eval.meta.c @@ -89,8 +89,8 @@ E_OpInfo e_expr_kind_op_info_table[47] = { E_OpKind_UnaryPrefix, 2, str8_lit_comp("*"), str8_lit_comp(""), str8_lit_comp("") }, { E_OpKind_UnaryPrefix, 2, str8_lit_comp("&"), str8_lit_comp(""), str8_lit_comp("") }, { E_OpKind_Null, 1, str8_lit_comp("("), str8_lit_comp(")"), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("sizeof"), str8_lit_comp(""), str8_lit_comp("") }, -{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("typeof"), str8_lit_comp(""), str8_lit_comp("") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("sizeof"), str8_lit_comp("("), str8_lit_comp(")") }, +{ E_OpKind_UnaryPrefix, 1, str8_lit_comp("typeof"), str8_lit_comp("("), str8_lit_comp(")") }, { E_OpKind_UnaryPrefix, 1, str8_lit_comp("bswap"), str8_lit_comp("("), str8_lit_comp(")") }, { E_OpKind_UnaryPrefix, 2, str8_lit_comp("-"), str8_lit_comp(""), str8_lit_comp("") }, { E_OpKind_UnaryPrefix, 2, str8_lit_comp("!"), str8_lit_comp(""), str8_lit_comp("") }, diff --git a/src/eval_visualization/eval_visualization_core.c b/src/eval_visualization/eval_visualization_core.c index 96924f11..34c30025 100644 --- a/src/eval_visualization/eval_visualization_core.c +++ b/src/eval_visualization/eval_visualization_core.c @@ -1078,6 +1078,20 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 // rjf: no expansion operator applied -> push row for block expression; pass through block info if(expand_range_info.row_exprs_count == 0) { + E_Member *member = &e_member_nil; + if(n->v.block->expr->kind == E_ExprKind_MemberAccess) + { + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, n->v.block->expr->first); + E_TypeKey lhs_type_key = lhs_irtree.type_key; + E_Member expr_member = e_type_member_from_key_name__cached(lhs_type_key, n->v.block->expr->last->string); + if(expr_member.kind != E_MemberKind_Null) + { + member = push_array(arena, E_Member, 1); + MemoryCopyStruct(member, &expr_member); + } + scratch_end(scratch); + } EV_Row *row = push_array(arena, EV_Row, 1); SLLQueuePush(rows.first, rows.last, row); rows.count += 1; @@ -1088,7 +1102,7 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 row->visual_size_chopped = num_chopped; row->string = n->v.block->string; row->expr = n->v.block->expr; - row->member = &e_member_nil; + row->member = member; row->view_rules = n->v.block->view_rules; } @@ -1129,6 +1143,22 @@ ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, String8 row->expr = row_expr__resolved; row->member = expand_range_info.row_members[idx]; row->view_rules = row_view_rules; + if(row->member == &e_member_nil || row->member == 0) + { + if(row->expr->kind == E_ExprKind_MemberAccess) + { + Temp scratch = scratch_begin(&arena, 1); + E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, row->expr->first); + E_TypeKey lhs_type_key = lhs_irtree.type_key; + E_Member expr_member = e_type_member_from_key_name__cached(lhs_type_key, row->expr->last->string); + if(expr_member.kind != E_MemberKind_Null) + { + row->member = push_array(arena, E_Member, 1); + MemoryCopyStruct(row->member, &expr_member); + } + scratch_end(scratch); + } + } if(expand_range_info.row_view_rules[idx].size != 0) { ev_key_set_view_rule(view, row->key, expand_range_info.row_view_rules[idx]); diff --git a/src/raddbg/raddbg_views.c b/src/raddbg/raddbg_views.c index 56d8c565..22e32b34 100644 --- a/src/raddbg/raddbg_views.c +++ b/src/raddbg/raddbg_views.c @@ -2673,7 +2673,7 @@ rd_watch_view_build(RD_WatchViewState *ewv, RD_WatchViewFlags flags, String8 roo { U64 row_offset = row_eval.value.u64; if((row_eval.mode == E_Mode_Offset || row_eval.mode == E_Mode_Null) && - row_offset%64 == 0 && row_depth > 0 && !row_expanded) + row_offset%64 == 0 && row_depth > 0) { ui_set_next_fixed_x(0); ui_set_next_fixed_y(0);