Skip to content

Commit 863d98c

Browse files
committed
do the same reuse of the computed irtree for array-index expr extensions
1 parent 50b195d commit 863d98c

File tree

6 files changed

+63
-32
lines changed

6 files changed

+63
-32
lines changed

src/eval/eval_ir.c

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(default)
491491
U64 read_range_count = dim_1u64(idx_range);
492492
for(U64 idx = 0; idx < read_range_count; idx += 1)
493493
{
494-
exprs[idx] = e_expr_ref_array_index(arena, lhs, idx_range.min + idx);
494+
exprs[idx] = e_expr_irext_array_index(arena, lhs, &lhs_irtree, idx_range.min + idx);
495495
}
496496
}
497497
}
@@ -2291,7 +2291,7 @@ e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtre
22912291
E_Expr *root = e_push_expr(arena, E_ExprKind_MemberAccess, 0);
22922292
E_Expr *lhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, lhs->location);
22932293
E_OpList lhs_oplist = e_oplist_from_irtree(arena, lhs_irtree->root);
2294-
lhs_bytecode->string = lhs->string;
2294+
lhs_bytecode->string = e_string_from_expr(arena, lhs);
22952295
lhs_bytecode->space = lhs->space;
22962296
lhs_bytecode->mode = lhs_irtree->mode;
22972297
lhs_bytecode->type_key = lhs_irtree->type_key;
@@ -2303,6 +2303,57 @@ e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtre
23032303
return root;
23042304
}
23052305

2306+
internal E_Expr *
2307+
e_expr_irext_array_index(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, U64 index)
2308+
{
2309+
E_Expr *root = e_push_expr(arena, E_ExprKind_ArrayIndex, 0);
2310+
E_Expr *lhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, lhs->location);
2311+
E_OpList lhs_oplist = e_oplist_from_irtree(arena, lhs_irtree->root);
2312+
lhs_bytecode->string = e_string_from_expr(arena, lhs);
2313+
lhs_bytecode->space = lhs->space;
2314+
lhs_bytecode->mode = lhs_irtree->mode;
2315+
lhs_bytecode->type_key = lhs_irtree->type_key;
2316+
lhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &lhs_oplist);
2317+
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafU64, 0);
2318+
rhs->value.u64 = index;
2319+
e_expr_push_child(root, lhs_bytecode);
2320+
e_expr_push_child(root, rhs);
2321+
return root;
2322+
}
2323+
2324+
internal E_Expr *
2325+
e_expr_irext_deref(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree)
2326+
{
2327+
E_Expr *root = e_push_expr(arena, E_ExprKind_Deref, 0);
2328+
E_Expr *rhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, rhs->location);
2329+
E_OpList rhs_oplist = e_oplist_from_irtree(arena, rhs_irtree->root);
2330+
rhs_bytecode->string = e_string_from_expr(arena, rhs);
2331+
rhs_bytecode->space = rhs->space;
2332+
rhs_bytecode->mode = rhs_irtree->mode;
2333+
rhs_bytecode->type_key = rhs_irtree->type_key;
2334+
rhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &rhs_oplist);
2335+
e_expr_push_child(root, rhs_bytecode);
2336+
return root;
2337+
}
2338+
2339+
internal E_Expr *
2340+
e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree, E_TypeKey type_key)
2341+
{
2342+
E_Expr *root = e_push_expr(arena, E_ExprKind_Cast, 0);
2343+
E_Expr *rhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, rhs->location);
2344+
E_OpList rhs_oplist = e_oplist_from_irtree(arena, rhs_irtree->root);
2345+
rhs_bytecode->string = e_string_from_expr(arena, rhs);
2346+
rhs_bytecode->space = rhs->space;
2347+
rhs_bytecode->mode = rhs_irtree->mode;
2348+
rhs_bytecode->type_key = rhs_irtree->type_key;
2349+
rhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &rhs_oplist);
2350+
E_Expr *lhs = e_push_expr(arena, E_ExprKind_TypeIdent, 0);
2351+
lhs->type_key = type_key;
2352+
e_expr_push_child(root, lhs);
2353+
e_expr_push_child(root, rhs_bytecode);
2354+
return root;
2355+
}
2356+
23062357
////////////////////////////////
23072358
//~ rjf: IRified Expression Cache
23082359

src/eval/eval_ir.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,9 @@ internal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist);
422422

423423
//- rjf: leaf-bytecode expression extensions
424424
internal E_Expr *e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, String8 member_name);
425+
internal E_Expr *e_expr_irext_array_index(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, U64 index);
426+
internal E_Expr *e_expr_irext_deref(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree);
427+
internal E_Expr *e_expr_irext_cast(Arena *arena, E_Expr *rhs, E_IRTreeAndType *rhs_irtree, E_TypeKey type_key);
425428

426429
////////////////////////////////
427430
//~ rjf: IRified Expression Cache

src/eval/eval_parse.c

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -698,30 +698,6 @@ e_expr_ref(Arena *arena, E_Expr *ref)
698698
return expr;
699699
}
700700

701-
internal E_Expr *
702-
e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name)
703-
{
704-
E_Expr *root = e_push_expr(arena, E_ExprKind_MemberAccess, 0);
705-
E_Expr *lhs_ref = e_expr_ref(arena, lhs);
706-
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafMember, 0);
707-
rhs->string = push_str8_copy(arena, member_name);
708-
e_expr_push_child(root, lhs_ref);
709-
e_expr_push_child(root, rhs);
710-
return root;
711-
}
712-
713-
internal E_Expr *
714-
e_expr_ref_array_index(Arena *arena, E_Expr *lhs, U64 index)
715-
{
716-
E_Expr *root = e_push_expr(arena, E_ExprKind_ArrayIndex, 0);
717-
E_Expr *lhs_ref = e_expr_ref(arena, lhs);
718-
E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafU64, 0);
719-
rhs->value.u64 = index;
720-
e_expr_push_child(root, lhs_ref);
721-
e_expr_push_child(root, rhs);
722-
return root;
723-
}
724-
725701
internal E_Expr *
726702
e_expr_ref_deref(Arena *arena, E_Expr *rhs)
727703
{

src/eval/eval_parse.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,6 @@ internal void e_expr_push_child(E_Expr *parent, E_Expr *child);
269269
internal void e_expr_remove_child(E_Expr *parent, E_Expr *child);
270270
internal void e_expr_push_tag(E_Expr *parent, E_Expr *child);
271271
internal E_Expr *e_expr_ref(Arena *arena, E_Expr *ref);
272-
internal E_Expr *e_expr_ref_member_access(Arena *arena, E_Expr *lhs, String8 member_name);
273-
internal E_Expr *e_expr_ref_array_index(Arena *arena, E_Expr *lhs, U64 index);
274272
internal E_Expr *e_expr_ref_deref(Arena *arena, E_Expr *rhs);
275273
internal E_Expr *e_expr_ref_cast(Arena *arena, E_TypeKey type_key, E_Expr *rhs);
276274
internal E_Expr *e_expr_copy(Arena *arena, E_Expr *src);

src/eval_visualization/eval_visualization_core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -427,7 +427,7 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr)
427427
RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
428428
E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx);
429429
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0);
430-
expr = e_expr_ref_cast(arena, ptr_to_derived_type_key, expr);
430+
expr = e_expr_irext_cast(arena, ptr_to_derived_type_key);
431431
}
432432
}
433433
}

src/raddbg/raddbg_core.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8544,17 +8544,19 @@ E_LOOKUP_RANGE_FUNCTION_DEF(top_level_cfg)
85448544
Rng1U64 cmds_idx_range = accel->cmds_idx_range;
85458545
Rng1U64 cfgs_idx_range = accel->cfgs_idx_range;
85468546
U64 dst_idx = 0;
8547+
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs);
85478548

85488549
// rjf: fill commands
85498550
{
85508551
Rng1U64 read_range = intersect_1u64(cmds_idx_range, idx_range);
85518552
U64 read_count = dim_1u64(read_range);
85528553
E_Expr *commands = e_parse_expr_from_text(arena, str8_lit("query:commands"));
8554+
E_IRTreeAndType commands_irtree = e_irtree_and_type_from_expr(arena, commands);
85538555
for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1)
85548556
{
85558557
String8 cmd_name = accel->cmds.v[idx + read_range.min - cmds_idx_range.min];
85568558
RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name);
8557-
exprs[dst_idx] = e_expr_ref_array_index(arena, commands, (U64)cmd_kind-1);
8559+
exprs[dst_idx] = e_expr_irext_array_index(arena, commands, &commands_irtree, (U64)cmd_kind-1);
85588560
}
85598561
}
85608562

@@ -8564,7 +8566,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(top_level_cfg)
85648566
U64 read_count = dim_1u64(read_range);
85658567
for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1)
85668568
{
8567-
exprs[dst_idx] = e_expr_ref_array_index(arena, lhs, idx + read_range.min - cfgs_idx_range.min);
8569+
exprs[dst_idx] = e_expr_irext_array_index(arena, lhs, &lhs_irtree, idx + read_range.min - cfgs_idx_range.min);
85688570
}
85698571
}
85708572
}
@@ -8813,6 +8815,7 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(environment)
88138815
E_LOOKUP_RANGE_FUNCTION_DEF(environment)
88148816
{
88158817
RD_CfgArray *cfgs = (RD_CfgArray *)user_data;
8818+
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(arena, lhs);
88168819
Rng1U64 legal_idx_range = r1u64(0, cfgs->count);
88178820
Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range);
88188821
U64 read_range_count = dim_1u64(read_range);
@@ -8821,7 +8824,7 @@ E_LOOKUP_RANGE_FUNCTION_DEF(environment)
88218824
U64 cfg_idx = read_range.min + idx;
88228825
if(cfg_idx < cfgs->count)
88238826
{
8824-
exprs[idx] = e_expr_ref_array_index(arena, lhs, cfg_idx);
8827+
exprs[idx] = e_expr_irext_array_index(arena, lhs, &lhs_irtree, cfg_idx);
88258828
}
88268829
}
88278830
}

0 commit comments

Comments
 (0)