pass over cfg meta evaluations; instead of forming artificial 'eval blob', just use sets/queries/hooks to do the lookups. eliminate cfg -> eval blob cache. switch to 'enabled' rather than 'disabled' as the cfg default. more convergences/fixes/tweaks.

This commit is contained in:
Ryan Fleury
2025-03-25 13:49:59 -07:00
parent 87e4b8b3f8
commit ef1685adc9
12 changed files with 419 additions and 284 deletions
+35 -3
View File
@@ -322,7 +322,7 @@ E_LOOKUP_ACCESS_FUNCTION_DEF(file)
E_Space space = e_space_make(E_SpaceKind_File);
space.u64_0 = e_id_from_string(accel->file_path);
result.irtree_and_type.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0));
result.irtree_and_type.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), accel->props.size);
result.irtree_and_type.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), accel->props.size, 0);
result.irtree_and_type.mode = E_Mode_Offset;
}
}
@@ -2102,7 +2102,6 @@ E_IRGEN_FUNCTION_DEF(default)
result = e_irtree_and_type_from_expr(arena, expr->first);
}break;
case E_ExprKind_Neg:
case E_ExprKind_LogNot:
case E_ExprKind_BitNot:
{
// rjf: unpack operand
@@ -2136,6 +2135,39 @@ E_IRGEN_FUNCTION_DEF(default)
result.mode = E_Mode_Value;
}
}break;
case E_ExprKind_LogNot:
{
// rjf: unpack operand
E_Expr *r_expr = expr->first;
E_IRTreeAndType r_tree = e_irtree_and_type_from_expr(arena, r_expr);
E_TypeKey r_type = e_type_unwrap(r_tree.type_key);
E_TypeKind r_type_kind = e_type_kind_from_key(r_type);
RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind);
E_TypeKey r_type_promoted = e_type_key_basic(E_TypeKind_Bool);
RDI_EvalOp op = e_opcode_from_expr_kind(kind);
e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);
// rjf: bad conditions? -> error if applicable, exit
if(r_tree.root->op == 0)
{
break;
}
else if(!rdi_eval_op_typegroup_are_compatible(op, r_type_group))
{
e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->location, "Cannot use this operator on this type.");
break;
}
// rjf: generate
{
E_IRNode *in_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);
in_tree = e_irtree_convert_hi(arena, in_tree, r_type_promoted, r_type);
E_IRNode *new_tree = e_irtree_unary_op(arena, op, r_type_group, in_tree);
result.root = new_tree;
result.type_key = r_type_promoted;
result.mode = E_Mode_Value;
}
}break;
//- rjf: binary operations
case E_ExprKind_Mul:
@@ -2449,7 +2481,7 @@ E_IRGEN_FUNCTION_DEF(default)
case E_ExprKind_LeafStringLiteral:
{
String8 string = expr->string;
E_TypeKey type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_UChar8), string.size);
E_TypeKey type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_UChar8), string.size, 0);
E_IRNode *new_tree = e_irtree_string_literal(arena, string);
result.root = new_tree;
result.type_key = type_key;
+1 -1
View File
@@ -1034,7 +1034,7 @@ e_type_from_expr(E_Expr *expr)
{
E_Expr *child_expr = expr->first;
E_TypeKey direct_type_key = e_type_from_expr(child_expr);
result = e_type_key_cons_array(direct_type_key, expr->value.u64);
result = e_type_key_cons_array(direct_type_key, expr->value.u64, 0);
}break;
}
return result;
+11 -11
View File
@@ -450,9 +450,9 @@ e_type_key_cons_(E_ConsTypeParams *params)
//- rjf: constructed type helpers
internal E_TypeKey
e_type_key_cons_array(E_TypeKey element_type_key, U64 count)
e_type_key_cons_array(E_TypeKey element_type_key, U64 count, E_TypeFlags flags)
{
E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_Array, .direct_key = element_type_key, .count = count);
E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_Array, .direct_key = element_type_key, .count = count, .flags = flags);
return key;
}
@@ -488,7 +488,7 @@ e_type_key_cons_base(Type *type)
case TypeKind_Array:
{
E_TypeKey direct_type = e_type_key_cons_base(type->direct);
result = e_type_key_cons_array(direct_type, type->count);
result = e_type_key_cons_array(direct_type, type->count, 0);
}break;
case TypeKind_Struct:
{
@@ -1065,7 +1065,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("u128s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U128), reg_byte_count/16);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U128), reg_byte_count/16, 0);
}
if(type->byte_size > 8 && type->byte_size%8 == 0)
{
@@ -1075,7 +1075,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("u64s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U64), reg_byte_count/8);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U64), reg_byte_count/8, 0);
}
if(type->byte_size > 4 && type->byte_size%4 == 0)
{
@@ -1085,7 +1085,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("u32s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U32), reg_byte_count/4);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U32), reg_byte_count/4, 0);
}
if(type->byte_size > 2 && type->byte_size%2 == 0)
{
@@ -1095,7 +1095,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("u16s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U16), reg_byte_count/2);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U16), reg_byte_count/2, 0);
}
if(type->byte_size > 1)
{
@@ -1105,7 +1105,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("u8s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), reg_byte_count);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), reg_byte_count, 0);
}
if(type->byte_size > 4 && type->byte_size%4 == 0)
{
@@ -1115,7 +1115,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("f32s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F32), reg_byte_count/4);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F32), reg_byte_count/4, 0);
}
if(type->byte_size > 8 && type->byte_size%8 == 0)
{
@@ -1125,7 +1125,7 @@ e_type_from_key(Arena *arena, E_TypeKey key)
E_Member *mem = &n->v;
mem->kind = E_MemberKind_DataField;
mem->name = str8_lit("f64s");
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F64), reg_byte_count/8);
mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F64), reg_byte_count/8, 0);
}
}
}
@@ -1573,7 +1573,7 @@ e_type_data_members_from_key(Arena *arena, E_TypeKey key)
E_Member *padding_member = &new_members.v[n->prev_member_idx+padding_idx+1];
MemoryZeroStruct(padding_member);
padding_member->kind = E_MemberKind_Padding;
padding_member->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), n->size);
padding_member->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), n->size, 0);
padding_member->off = n->off;
padding_member->name = push_str8f(arena, "[padding %I64u]", padding_idx);
padding_idx += 1;
+1 -1
View File
@@ -359,7 +359,7 @@ internal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params);
#define e_type_key_cons(...) e_type_key_cons_(&(E_ConsTypeParams){.kind = E_TypeKind_Null, __VA_ARGS__})
//- 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_array(E_TypeKey element_type_key, U64 count, E_TypeFlags flags);
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);