Skip to content

Commit

Permalink
eliminate expr resolution hook in eval visualization layer; now succe…
Browse files Browse the repository at this point in the history
…eded by irgen hook
  • Loading branch information
ryanfleury committed Feb 2, 2025
1 parent 07c9268 commit 5bbd9f1
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 327 deletions.
3 changes: 1 addition & 2 deletions src/eval_visualization/eval_visualization.mdesk
Original file line number Diff line number Diff line change
Expand Up @@ -115,13 +115,12 @@ EV_ViewRuleTable:

@gen
{
@expand(EV_ViewRuleTable a) `$(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(" .. a.name_lower .. ");")`;
@expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`;
@expand(EV_ViewRuleTable a) `$(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(" .. a.name_lower .. ");")`;
}

@data(EV_ViewRuleInfo) @c_file ev_builtin_view_rule_info_table:
{
@expand(EV_ViewRuleTable a)
```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xr == "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME("..a.name_lower..")") $(a.xr != "x" -> "EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil)"), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }```;
```{str8_lit_comp("$(a.string)"), (EV_ViewRuleInfoFlag_Inherited*$(a.ih == "x"))|(EV_ViewRuleInfoFlag_Expandable*$(a.ex == "x")), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil)"), $(a.xe == "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME("..a.name_lower..")") $(a.xe != "x" -> "EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil)"), EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity), EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity) }```;
}
287 changes: 6 additions & 281 deletions src/eval_visualization/eval_visualization_builtin_view_rules.c
Original file line number Diff line number Diff line change
Expand Up @@ -282,13 +282,13 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default)
//- rjf: fill with lookups
//
else if(accel->lookup_rule != 0)
{
E_LookupRange lookup_range = accel->lookup_rule->range(arena, expr, idx_range, accel->lookup_user_data);
result.row_exprs_count = lookup_range.exprs_count;
result.row_exprs = lookup_range.exprs;
result.row_strings = lookup_range.exprs_strings;
{
E_LookupRange lookup_range = accel->lookup_rule->range(arena, expr, idx_range, accel->lookup_user_data);
result.row_exprs_count = lookup_range.exprs_count;
result.row_exprs = lookup_range.exprs;
result.row_strings = lookup_range.exprs_strings;
result.row_view_rules = push_array(arena, String8, result.row_exprs_count);
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
result.row_members = push_array(arena, E_Member *, result.row_exprs_count);
for EachIndex(row_expr_idx, result.row_exprs_count)
{
result.row_members[row_expr_idx] = &e_member_nil;
Expand All @@ -298,27 +298,6 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(default)
return result;
}

////////////////////////////////
//~ rjf: "array"

EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(array)
{
Temp scratch = scratch_begin(&arena, 1);
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
E_TypeKey type_key = irtree.type_key;
E_TypeKind type_kind = e_type_kind_from_key(type_key);
if(e_type_kind_is_pointer_or_ref(type_kind))
{
E_Value count = ev_value_from_params(params);
E_TypeKey element_type_key = e_type_ptee_from_key(type_key);
E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count.u64);
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0);
expr = e_expr_ref_cast(arena, ptr_type_key, expr);
}
scratch_end(scratch);
return expr;
}

////////////////////////////////
//~ rjf: "list"

Expand All @@ -333,257 +312,3 @@ EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(list)
EV_ExpandRangeInfo info = {0};
return info;
}

////////////////////////////////
//~ rjf: "slice"

EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(slice)
{
Temp scratch = scratch_begin(&arena, 1);
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
E_TypeKind type_kind = e_type_kind_from_key(irtree.type_key);
if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Class)
{
// rjf: unpack members
E_MemberArray members = e_type_data_members_from_key__cached(irtree.type_key);

// rjf: choose base pointer & count members
E_Member *base_ptr_member = 0;
E_Member *count_member = 0;
for(U64 idx = 0; idx < members.count; idx += 1)
{
E_Member *member = &members.v[idx];
E_TypeKey member_type = e_type_unwrap(member->type_key);
E_TypeKind member_type_kind = e_type_kind_from_key(member_type);
if(count_member == 0 && e_type_kind_is_integer(member_type_kind))
{
count_member = member;
}
if(base_ptr_member == 0 && e_type_kind_is_pointer_or_ref(member_type_kind))
{
base_ptr_member = &members.v[idx];
}
if(count_member != 0 && base_ptr_member != 0)
{
break;
}
}

// rjf: evaluate count member, determine count
U64 count = 0;
if(count_member != 0)
{
E_Expr *count_member_expr = e_expr_ref_member_access(scratch.arena, expr, count_member->name);
E_Eval count_member_eval = e_eval_from_expr(scratch.arena, count_member_expr);
E_Eval count_member_value_eval = e_value_eval_from_eval(count_member_eval);
count = count_member_value_eval.value.u64;
}

// rjf: generate new struct slice type
E_TypeKey slice_type_key = zero_struct;
if(base_ptr_member != 0 && count_member != 0)
{
String8 struct_name = e_type_string_from_key(scratch.arena, irtree.type_key);
E_TypeKey element_type_key = e_type_ptee_from_key(base_ptr_member->type_key);
E_TypeKey array_type_key = e_type_key_cons_array(element_type_key, count);
E_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0);
E_MemberList slice_type_members = {0};
e_member_list_push(scratch.arena, &slice_type_members, count_member);
e_member_list_push(scratch.arena, &slice_type_members, &(E_Member){.kind = E_MemberKind_DataField, .type_key = sized_base_ptr_type_key, .name = base_ptr_member->name, .pretty_name = base_ptr_member->pretty_name, .off = base_ptr_member->off});
E_MemberArray slice_type_members_array = e_member_array_from_list(scratch.arena, &slice_type_members);
slice_type_key = e_type_key_cons(.arch = e_type_state->ctx->primary_module->arch,
.kind = E_TypeKind_Struct,
.name = struct_name,
.members = slice_type_members_array.v,
.count = slice_type_members_array.count);
}

// rjf: generate new expression tree - addr of struct, cast-to-ptr, deref
if(base_ptr_member != 0 && count_member != 0)
{
expr = e_expr_ref_addr(arena, expr);
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, slice_type_key, 0), expr);
expr = e_expr_ref_deref(arena, expr);
}
}
scratch_end(scratch);
return expr;
}

////////////////////////////////
//~ rjf: "bswap"

EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(bswap)
{
expr = e_expr_ref_bswap(arena, expr);
return expr;
}

////////////////////////////////
//~ rjf: "cast"

EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(cast)
{
E_TypeKey type_key = ev_type_key_from_params(params);
expr = e_expr_ref_cast(arena, type_key, expr);
return expr;
}

////////////////////////////////
//~ rjf: "wrap"

EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(wrap)
{
String8 wrap_string = md_string_from_children(arena, params);
E_Expr *wrap_expr = e_parse_expr_from_text(arena, wrap_string);
E_Expr *new_root_expr = wrap_expr;
if(wrap_expr != &e_expr_nil)
{
Temp scratch = scratch_begin(&arena, 1);
typedef struct Task Task;
struct Task
{
Task *next;
E_Expr *parent;
E_Expr *expr;
};
Task start_task = {0, &e_expr_nil, wrap_expr};
Task *first_task = &start_task;
Task *last_task = first_task;
for(Task *t = first_task; t != 0; t = t->next)
{
if(t->expr->kind == E_ExprKind_LeafIdent && str8_match(t->expr->string, str8_lit("$expr"), 0))
{
E_Expr *original_expr_ref = e_expr_ref(arena, expr);
if(t->parent != &e_expr_nil)
{
e_expr_insert_child(t->parent, t->expr, original_expr_ref);
e_expr_remove_child(t->parent, t->expr);
}
else
{
new_root_expr = original_expr_ref;
}
}
else for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next)
{
Task *task = push_array(scratch.arena, Task, 1);
SLLQueuePush(first_task, last_task, task);
task->parent = t->expr;
task->expr = child;
}
}
scratch_end(scratch);
}
return new_root_expr;
}

////////////////////////////////
//~ rjf: "only"

EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(only)
{
Temp scratch = scratch_begin(&arena, 1);
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
E_TypeKey type_key = irtree.type_key;
E_TypeKind type_kind = e_type_kind_from_key(type_key);
E_TypeKey direct_type_key = e_type_direct_from_key(type_key);
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
B32 is_ptr = e_type_kind_is_pointer_or_ref(type_kind);
E_TypeKey struct_type_key = is_ptr ? direct_type_key : type_key;
E_TypeKind struct_type_kind = is_ptr ? direct_type_kind : type_kind;
if(struct_type_kind == E_TypeKind_Struct ||
struct_type_kind == E_TypeKind_Union ||
struct_type_kind == E_TypeKind_Class)
{
E_MemberArray current_members = e_type_data_members_from_key__cached(struct_type_key);
E_MemberList new_members = {0};
for MD_EachNode(node, params->first)
{
for EachIndex(idx, current_members.count)
{
if(str8_match(node->string, current_members.v[idx].name, 0))
{
e_member_list_push(scratch.arena, &new_members, &current_members.v[idx]);
break;
}
}
}
E_MemberArray new_members_array = e_member_array_from_list(scratch.arena, &new_members);
E_TypeKey new_type = {0};
if(new_members_array.count == 1 && new_members_array.v[0].off == 0)
{
new_type = new_members_array.v[0].type_key;
}
else
{
String8 struct_name = e_type_string_from_key(scratch.arena, struct_type_key);
new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count);
}
if(!is_ptr)
{
expr = e_expr_ref_addr(arena, expr);
}
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type, 0), expr);
if(!is_ptr)
{
expr = e_expr_ref_deref(arena, expr);
}
}
scratch_end(scratch);
return expr;
}

////////////////////////////////
//~ rjf: "omit"

EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(omit)
{
Temp scratch = scratch_begin(&arena, 1);
E_IRTreeAndType irtree = e_irtree_and_type_from_expr(scratch.arena, expr);
E_TypeKey type_key = irtree.type_key;
E_TypeKind type_kind = e_type_kind_from_key(type_key);
E_TypeKey direct_type_key = e_type_direct_from_key(type_key);
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
B32 is_ptr = e_type_kind_is_pointer_or_ref(type_kind);
E_TypeKey struct_type_key = is_ptr ? direct_type_key : type_key;
E_TypeKind struct_type_kind = is_ptr ? direct_type_kind : type_kind;
if(struct_type_kind == E_TypeKind_Struct ||
struct_type_kind == E_TypeKind_Union ||
struct_type_kind == E_TypeKind_Class)
{
E_MemberArray current_members = e_type_data_members_from_key__cached(struct_type_key);
E_MemberList new_members = {0};
for EachIndex(idx, current_members.count)
{
B32 include = 1;
for MD_EachNode(node, params->first)
{
if(str8_match(node->string, current_members.v[idx].name, 0))
{
include = 0;
break;
}
}
if(include)
{
e_member_list_push(scratch.arena, &new_members, &current_members.v[idx]);
}
}
E_MemberArray new_members_array = e_member_array_from_list(scratch.arena, &new_members);
E_TypeKey new_type = {0};
String8 struct_name = e_type_string_from_key(scratch.arena, struct_type_key);
new_type = e_type_key_cons(.kind = E_TypeKind_Struct, .name = struct_name, .members = new_members_array.v, .count = new_members_array.count);
if(!is_ptr)
{
expr = e_expr_ref_addr(arena, expr);
}
expr = e_expr_ref_cast(arena, e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, new_type, 0), expr);
if(!is_ptr)
{
expr = e_expr_ref_deref(arena, expr);
}
}
scratch_end(scratch);
return expr;
}
13 changes: 0 additions & 13 deletions src/eval_visualization/eval_visualization_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,6 @@
////////////////////////////////
//~ rjf: Nil/Identity View Rule Hooks

EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(identity)
{
return expr;
}

EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil)
{
EV_ExpandInfo info = {0};
Expand Down Expand Up @@ -656,14 +651,6 @@ ev_resolved_from_expr(Arena *arena, E_Expr *expr, EV_ViewRuleList *view_rules)
}
scratch_end(scratch);
}
for(EV_ViewRuleNode *n = view_rules->first; n != 0; n = n->next)
{
EV_ViewRuleInfo *info = ev_view_rule_info_from_string(n->v.root->string);
if(info->expr_resolution != 0)
{
expr = info->expr_resolution(arena, expr, n->v.root);
}
}
ProfEnd();
return expr;
}
Expand Down
8 changes: 0 additions & 8 deletions src/eval_visualization/eval_visualization_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,10 +121,6 @@ struct EV_ExpandRangeInfo
E_Member **row_members;
};

#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(name) E_Expr *name(Arena *arena, E_Expr *expr, MD_Node *params)
#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name) ev_view_rule_expr_resolution__##name
#define EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(name))

#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr, MD_Node *params)
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name) ev_view_rule_expr_expand_info__##name
#define EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(name))
Expand All @@ -141,7 +137,6 @@ struct EV_ExpandRangeInfo
#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name) ev_view_rule_expr_expand_num_from_id_##name
#define EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_DEF(name) internal EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_SIG(EV_VIEW_RULE_EXPR_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name))

typedef EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_SIG(EV_ViewRuleExprResolutionHookFunctionType);
typedef EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandInfoHookFunctionType);
typedef EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_SIG(EV_ViewRuleExprExpandRangeInfoHookFunctionType);
typedef EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_SIG(EV_ViewRuleExprExpandIDFromNumHookFunctionType);
Expand All @@ -159,7 +154,6 @@ struct EV_ViewRuleInfo
{
String8 string;
EV_ViewRuleInfoFlags flags;
EV_ViewRuleExprResolutionHookFunctionType *expr_resolution;
EV_ViewRuleExprExpandInfoHookFunctionType *expr_expand_info;
EV_ViewRuleExprExpandRangeInfoHookFunctionType *expr_expand_range_info;
EV_ViewRuleExprExpandIDFromNumHookFunctionType *expr_expand_id_from_num;
Expand Down Expand Up @@ -329,7 +323,6 @@ enum
////////////////////////////////
//~ rjf: Nil/Identity View Rule Hooks

EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_DEF(identity);
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_DEF(nil);
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_DEF(nil);
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity);
Expand All @@ -342,7 +335,6 @@ global read_only EV_ViewRuleInfo ev_nil_view_rule_info =
{
{0},
0,
EV_VIEW_RULE_EXPR_RESOLUTION_FUNCTION_NAME(identity),
EV_VIEW_RULE_EXPR_EXPAND_INFO_FUNCTION_NAME(nil),
EV_VIEW_RULE_EXPR_EXPAND_RANGE_INFO_FUNCTION_NAME(nil),
EV_VIEW_RULE_EXPR_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity),
Expand Down
Loading

0 comments on commit 5bbd9f1

Please sign in to comment.