eval_visualization: eliminate expansion-range hook; move expansions & block tree building completely to new eval hooks for lookups

This commit is contained in:
Ryan Fleury
2025-02-02 14:39:43 -08:00
parent 5bbd9f1c7e
commit eab5c7c971
20 changed files with 384 additions and 1278 deletions
+2 -2
View File
@@ -61,7 +61,7 @@ e_autoresolved_eval_from_eval(E_Eval eval)
if(string_idx == 0) { string_idx = gvar->name_string_idx; }
if(string_idx != 0)
{
eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 0);
eval.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, e_type_key_basic(E_TypeKind_Void), 1, 0);
}
}
return eval;
@@ -127,7 +127,7 @@ e_dynamically_typed_eval_from_eval(E_Eval eval)
RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx);
RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);
E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, rdi_idx);
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 0);
E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0);
eval.type_key = ptr_to_derived_type_key;
}
}
+66 -28
View File
@@ -130,14 +130,10 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key);
if(e_type_kind_is_pointer_or_ref(lhs_type_kind))
{
lookup_info.idxed_expr_count = 1;
E_Type *type = e_type_from_key(scratch.arena, lhs_type_key);
lookup_info.idxed_expr_count = type->count;
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(lhs_irtree.type_key));
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
if(direct_type_kind == E_TypeKind_Array)
{
E_Type *direct_type = e_type_from_key(scratch.arena, direct_type_key);
lookup_info.idxed_expr_count = direct_type->count;
}
if(direct_type_kind == E_TypeKind_Struct ||
direct_type_kind == E_TypeKind_Class ||
direct_type_kind == E_TypeKind_Union ||
@@ -155,6 +151,11 @@ E_LOOKUP_INFO_FUNCTION_DEF(default)
E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key);
lookup_info.named_expr_count = lhs_type->count;
}
else if(lhs_type_kind == E_TypeKind_Array)
{
E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key);
lookup_info.idxed_expr_count = lhs_type->count;
}
}
scratch_end(scratch);
return lookup_info;
@@ -405,44 +406,83 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(default)
E_LOOKUP_RANGE_FUNCTION_DEF(default)
{
E_LookupRange result = {0};
Temp scratch = scratch_begin(&arena, 1);
{
//- rjf: unpack type of expression
E_IRTreeAndType lhs_irtree = e_irtree_and_type_from_expr(scratch.arena, lhs);
E_TypeKey lhs_type_key = lhs_irtree.type_key;
E_TypeKind lhs_type_kind = e_type_kind_from_key(lhs_type_key);
if(lhs_type_kind == E_TypeKind_Struct ||
lhs_type_kind == E_TypeKind_Union ||
lhs_type_kind == E_TypeKind_Class ||
lhs_type_kind == E_TypeKind_Enum)
E_TypeKey direct_type_key = e_type_unwrap(e_type_direct_from_key(lhs_type_key));
E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);
//- rjf: pull out specific kinds of types
B32 do_struct_range = 0;
B32 do_index_range = 0;
E_TypeKey struct_type_key = zero_struct;
E_TypeKind struct_type_kind = E_TypeKind_Null;
if(e_type_kind_is_pointer_or_ref(lhs_type_kind))
{
E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key);
if(lhs_type->count == 1 &&
(direct_type_kind == E_TypeKind_Struct ||
direct_type_kind == E_TypeKind_Union ||
direct_type_kind == E_TypeKind_Class ||
direct_type_kind == E_TypeKind_Enum))
{
struct_type_key = direct_type_key;
struct_type_kind = direct_type_kind;
do_struct_range = 1;
}
else
{
do_index_range = 1;
}
}
else if(lhs_type_kind == E_TypeKind_Struct ||
lhs_type_kind == E_TypeKind_Union ||
lhs_type_kind == E_TypeKind_Class ||
lhs_type_kind == E_TypeKind_Enum)
{
struct_type_key = lhs_type_key;
struct_type_kind = lhs_type_kind;
do_struct_range = 1;
}
else if(lhs_type_kind == E_TypeKind_Set)
{
do_index_range = 1;
}
else if(lhs_type_kind == E_TypeKind_Array)
{
do_index_range = 1;
}
//- rjf: struct case -> the lookup-range will return a range of members
if(do_struct_range)
{
E_Type *lhs_type = e_type_from_key(scratch.arena, lhs_type_key);
Rng1U64 legal_idx_range = r1u64(0, lhs_type->count);
Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);
U64 read_range_count = dim_1u64(read_range);
result.exprs_count = read_range_count;
result.exprs = push_array(arena, E_Expr *, result.exprs_count);
for(U64 idx = 0; idx < result.exprs_count; idx += 1)
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
U64 member_idx = idx + read_range.min;
String8 member_name = (lhs_type->members ? lhs_type->members[member_idx].name :
lhs_type->enum_vals ? lhs_type->enum_vals[member_idx].name : str8_lit(""));
result.exprs[idx] = e_expr_ref_member_access(arena, lhs, member_name);
exprs[idx] = e_expr_ref_member_access(arena, lhs, member_name);
}
}
else if(lhs_type_kind == E_TypeKind_Set)
//- rjf: ptr case -> the lookup-range will return a range of dereferences
else if(do_index_range)
{
result.exprs_count = dim_1u64(idx_range);
result.exprs = push_array(arena, E_Expr *, result.exprs_count);
result.exprs_strings = push_array(arena, String8, result.exprs_count);
for(U64 idx = 0; idx < result.exprs_count; idx += 1)
U64 read_range_count = dim_1u64(idx_range);
for(U64 idx = 0; idx < read_range_count; idx += 1)
{
result.exprs[idx] = e_expr_ref_array_index(arena, lhs, idx_range.min + idx);
exprs[idx] = e_expr_ref_array_index(arena, lhs, idx_range.min + idx);
}
}
}
scratch_end(scratch);
return result;
}
E_LOOKUP_ID_FROM_NUM_FUNCTION_DEF(default)
@@ -486,8 +526,7 @@ E_IRGEN_FUNCTION_DEF(array)
Temp scratch = scratch_begin(&arena, 1);
E_Eval count_eval = e_eval_from_expr(scratch.arena, tag->first->next);
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_eval.value.u64);
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, array_type_key, 0);
E_TypeKey ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count_eval.value.u64, 0);
irtree.type_key = ptr_type_key;
scratch_end(scratch);
}
@@ -542,8 +581,7 @@ E_IRGEN_FUNCTION_DEF(slice)
{
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_TypeKey sized_base_ptr_type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, element_type_key, count, 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});
@@ -1055,7 +1093,7 @@ E_IRGEN_FUNCTION_DEF(default)
// rjf: generate
result.root = r_tree.root;
result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 0);
result.type_key = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, r_type_unwrapped, 1, 0);
result.mode = E_Mode_Value;
}break;
@@ -1414,7 +1452,7 @@ E_IRGEN_FUNCTION_DEF(default)
E_TypeKey ptr_type = ptr_tree->type_key;
if(ptr_is_decay)
{
ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type, 0);
ptr_type = e_type_key_cons_ptr(e_type_state->ctx->primary_module->arch, direct_type, 1, 0);
}
E_IRNode *new_root = e_irtree_binary_op_u(arena, op, ptr_root, int_root);
result.root = new_root;
+1 -9
View File
@@ -73,14 +73,6 @@ struct E_LookupAccess
E_IRTreeAndType irtree_and_type;
};
typedef struct E_LookupRange E_LookupRange;
struct E_LookupRange
{
U64 exprs_count;
E_Expr **exprs;
String8 *exprs_strings;
};
#define E_LOOKUP_INFO_FUNCTION_SIG(name) E_LookupInfo name(Arena *arena, E_Expr *lhs, String8 filter)
#define E_LOOKUP_INFO_FUNCTION_NAME(name) e_lookup_info_##name
#define E_LOOKUP_INFO_FUNCTION_DEF(name) internal E_LOOKUP_INFO_FUNCTION_SIG(E_LOOKUP_INFO_FUNCTION_NAME(name))
@@ -93,7 +85,7 @@ E_LOOKUP_INFO_FUNCTION_DEF(default);
typedef E_LOOKUP_ACCESS_FUNCTION_SIG(E_LookupAccessFunctionType);
E_LOOKUP_ACCESS_FUNCTION_DEF(default);
#define E_LOOKUP_RANGE_FUNCTION_SIG(name) E_LookupRange name(Arena *arena, E_Expr *lhs, Rng1U64 idx_range, void *user_data)
#define E_LOOKUP_RANGE_FUNCTION_SIG(name) void name(Arena *arena, E_Expr *lhs, Rng1U64 idx_range, E_Expr **exprs, String8 *exprs_strings, void *user_data)
#define E_LOOKUP_RANGE_FUNCTION_NAME(name) e_lookup_range_##name
#define E_LOOKUP_RANGE_FUNCTION_DEF(name) internal E_LOOKUP_RANGE_FUNCTION_SIG(E_LOOKUP_RANGE_FUNCTION_NAME(name))
typedef E_LOOKUP_RANGE_FUNCTION_SIG(E_LookupRangeFunctionType);
+2 -2
View File
@@ -1041,7 +1041,7 @@ e_type_from_expr(E_Expr *expr)
case E_ExprKind_Ptr:
{
E_TypeKey direct_type_key = e_type_from_expr(expr->first);
result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key, 0);
result = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, direct_type_key, 1, 0);
}break;
case E_ExprKind_Array:
{
@@ -1356,7 +1356,7 @@ e_parse_expr_from_text_tokens__prec(Arena *arena, String8 text, E_TokenArray *to
else
{
E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token_string.str);
type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 0);
type->type_key = e_type_key_cons_ptr(e_parse_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0);
E_Expr *casted = atom;
E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token_string.str);
e_expr_push_child(cast, type);
+3 -9
View File
@@ -456,19 +456,12 @@ e_type_key_cons_array(E_TypeKey element_type_key, U64 count)
}
internal E_TypeKey
e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags)
e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags)
{
E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .flags = flags, .direct_key = element_type_key);
return key;
}
internal E_TypeKey
e_type_key_cons_space_ptr(E_TypeKey direct_type_key)
{
E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_SpacePtr, .direct_key = direct_type_key);
return key;
}
internal E_TypeKey
e_type_key_cons_base(Type *type)
{
@@ -489,7 +482,7 @@ e_type_key_cons_base(Type *type)
if(type->flags & TypeFlag_IsPlainText){ flags |= E_TypeFlag_IsPlainText; }
if(type->flags & TypeFlag_IsCodeText) { flags |= E_TypeFlag_IsCodeText; }
if(type->flags & TypeFlag_IsPathText) { flags |= E_TypeFlag_IsPathText; }
result = e_type_key_cons_ptr(arch_from_context(), direct_type, flags);
result = e_type_key_cons_ptr(arch_from_context(), direct_type, 1, flags);
}break;
case TypeKind_Array:
{
@@ -804,6 +797,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
type->kind = kind;
type->direct_type_key = direct_type_key;
type->byte_size = bit_size_from_arch(e_type_state->ctx->modules[rdi_idx].arch)/8;
type->count = 1;
}break;
case RDI_TypeKind_Array:
+1 -2
View File
@@ -318,8 +318,7 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params);
//- rjf: constructed type construction helpers
internal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count);
internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, E_TypeFlags flags);
internal E_TypeKey e_type_key_cons_space_ptr(E_TypeKey direct_type_key);
internal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags);
internal E_TypeKey e_type_key_cons_base(Type *type);
//- rjf: basic type key functions