further raddbgi -> rdi naming pass

This commit is contained in:
Ryan Fleury
2024-02-13 15:56:30 -08:00
parent b9f010dff6
commit 816f94ef71
17 changed files with 597 additions and 597 deletions
+118 -118
View File
@@ -331,7 +331,7 @@ eval_type_group_from_kind(TG_Kind kind){
}
internal TG_Key
eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key)
{
TG_Key result = key;
for(B32 good = 1; good;)
@@ -339,7 +339,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
TG_Kind kind = tg_kind_from_key(key);
if(kind == TG_Kind_Enum)
{
result = tg_direct_from_graph_rdi_key(graph, rdbg, result);
result = tg_direct_from_graph_rdi_key(graph, rdi, result);
}
else
{
@@ -350,7 +350,7 @@ eval_type_unwrap_enum(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key)
}
internal TG_Key
eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key){
eval_type_promote(TG_Graph *graph, RDI_Parsed *rdi, TG_Key key){
TG_Key result = key;
TG_Kind kind = tg_kind_from_key(key);
if(kind == TG_Kind_Bool ||
@@ -365,17 +365,17 @@ eval_type_promote(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key key){
}
internal TG_Key
eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r){
Assert(eval_kind_is_basic_or_enum(tg_kind_from_key(l)) &&
eval_kind_is_basic_or_enum(tg_kind_from_key(r)));
// replace enums with corresponding ints
TG_Key lt = eval_type_unwrap_enum(graph, rdbg, l);
TG_Key rt = eval_type_unwrap_enum(graph, rdbg, r);
TG_Key lt = eval_type_unwrap_enum(graph, rdi, l);
TG_Key rt = eval_type_unwrap_enum(graph, rdi, r);
// first promote each
TG_Key lp = eval_type_promote(graph, rdbg, lt);
TG_Key rp = eval_type_promote(graph, rdbg, rt);
TG_Key lp = eval_type_promote(graph, rdi, lt);
TG_Key rp = eval_type_promote(graph, rdi, rt);
TG_Kind lk = tg_kind_from_key(lp);
TG_Kind rk = tg_kind_from_key(rp);
@@ -384,12 +384,12 @@ eval_type_coerce(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
}
internal B32
eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
eval_type_match(TG_Graph *graph, RDI_Parsed *rdi, TG_Key l, TG_Key r){
B32 result = 0;
// unwrap
TG_Key lu = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l);
TG_Key ru = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r);
TG_Key lu = tg_unwrapped_from_graph_rdi_key(graph, rdi, l);
TG_Key ru = tg_unwrapped_from_graph_rdi_key(graph, rdi, r);
if (tg_key_match(lu, ru)){
result = 1;
@@ -408,21 +408,21 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
case TG_Kind_LRef:
case TG_Kind_RRef:
{
TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdbg, lu);
TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdbg, ru);
if (eval_type_match(graph, rdbg, lud, rud)){
TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdi, lu);
TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdi, ru);
if (eval_type_match(graph, rdi, lud, rud)){
result = 1;
}
}break;
case TG_Kind_MemberPtr:
{
TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdbg, lu);
TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdbg, ru);
TG_Key luo = tg_owner_from_graph_rdi_key(graph, rdbg, lu);
TG_Key ruo = tg_owner_from_graph_rdi_key(graph, rdbg, ru);
if (eval_type_match(graph, rdbg, lud, rud) &&
eval_type_match(graph, rdbg, luo, ruo)){
TG_Key lud = tg_direct_from_graph_rdi_key(graph, rdi, lu);
TG_Key rud = tg_direct_from_graph_rdi_key(graph, rdi, ru);
TG_Key luo = tg_owner_from_graph_rdi_key(graph, rdi, lu);
TG_Key ruo = tg_owner_from_graph_rdi_key(graph, rdi, ru);
if (eval_type_match(graph, rdi, lud, rud) &&
eval_type_match(graph, rdi, luo, ruo)){
result = 1;
}
}break;
@@ -430,9 +430,9 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
case TG_Kind_Array:
{
Temp scratch = scratch_begin(0, 0);
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r);
if(lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key))
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r);
if(lt->count == rt->count && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key))
{
result = 1;
}
@@ -442,9 +442,9 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
case TG_Kind_Function:
{
Temp scratch = scratch_begin(0, 0);
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r);
if (lt->count == rt->count && eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key))
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r);
if (lt->count == rt->count && eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key))
{
B32 params_match = 1;
TG_Key *lp = lt->param_type_keys;
@@ -452,7 +452,7 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
U64 count = lt->count;
for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1)
{
if(!eval_type_match(graph, rdbg, *lp, *rp))
if(!eval_type_match(graph, rdi, *lp, *rp))
{
params_match = 0;
break;
@@ -466,11 +466,11 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
case TG_Kind_Method:
{
Temp scratch = scratch_begin(0, 0);
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdbg, r);
TG_Type *lt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, l);
TG_Type *rt = tg_type_from_graph_rdi_key(scratch.arena, graph, rdi, r);
if (lt->count == rt->count &&
eval_type_match(graph, rdbg, lt->direct_type_key, rt->direct_type_key) &&
eval_type_match(graph, rdbg, lt->owner_type_key, rt->owner_type_key))
eval_type_match(graph, rdi, lt->direct_type_key, rt->direct_type_key) &&
eval_type_match(graph, rdi, lt->owner_type_key, rt->owner_type_key))
{
B32 params_match = 1;
TG_Key *lp = lt->param_type_keys;
@@ -478,7 +478,7 @@ eval_type_match(TG_Graph *graph, RDI_Parsed *rdbg, TG_Key l, TG_Key r){
U64 count = lt->count;
for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1)
{
if(!eval_type_match(graph, rdbg, *lp, *rp))
if(!eval_type_match(graph, rdi, *lp, *rp))
{
params_match = 0;
break;
@@ -589,8 +589,8 @@ eval_irtree_bytecode_no_copy(Arena *arena, String8 bytecode){
//~ allen: EVAL IR-Tree High Level Helpers
internal EVAL_IRTree*
eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){
U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key);
eval_irtree_mem_read_type(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key){
U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key);
EVAL_IRTree *result = &eval_irtree_nil;
if (0 < byte_size && byte_size <= 8){
// build the read node
@@ -629,9 +629,9 @@ eval_irtree_convert_lo(Arena *arena, EVAL_IRTree *c, RDI_EvalTypeGroup out, RDI_
}
internal EVAL_IRTree*
eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key type_key){
eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key type_key){
EVAL_IRTree *result = c;
U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key);
U64 byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key);
if (byte_size < 64){
RDI_EvalOp op = RDI_EvalOp_Trunc;
TG_Kind kind = tg_kind_from_key(type_key);
@@ -648,7 +648,7 @@ eval_irtree_trunc(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *
}
internal EVAL_IRTree*
eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRTree *c, TG_Key out, TG_Key in){
eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_IRTree *c, TG_Key out, TG_Key in){
EVAL_IRTree *result = c;
TG_Kind in_kind = tg_kind_from_key(in);
TG_Kind out_kind = tg_kind_from_key(out);
@@ -659,24 +659,24 @@ eval_irtree_convert_hi(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_IRT
{
result = eval_irtree_convert_lo(arena, result, out_group, in_group);
}
U64 in_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, in);
U64 out_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, out);
U64 in_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, in);
U64 out_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, out);
if(out_byte_size < in_byte_size && eval_kind_is_integer(out_kind))
{
result = eval_irtree_trunc(arena, graph, rdbg, result, out);
result = eval_irtree_trunc(arena, graph, rdi, result, out);
}
return(result);
}
internal EVAL_IRTree*
eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_EvalMode from_mode,
eval_irtree_resolve_to_value(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_EvalMode from_mode,
EVAL_IRTree *tree, TG_Key type_key){
EVAL_IRTree *result = tree;
switch (from_mode){
default:{}break;
case EVAL_EvalMode_Addr:
{
result = eval_irtree_mem_read_type(arena, graph, rdbg, tree, type_key);
result = eval_irtree_mem_read_type(arena, graph, rdi, tree, type_key);
}break;
case EVAL_EvalMode_Reg:
{
@@ -715,7 +715,7 @@ eval_push_leaf_ident_exprs_from_expr__in_place(Arena *arena, EVAL_String2ExprMap
}
internal TG_Key
eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_Expr *expr, EVAL_ErrorList *eout){
eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_Expr *expr, EVAL_ErrorList *eout){
TG_Key result = zero_struct;
EVAL_ExprKind kind = expr->kind;
@@ -732,14 +732,14 @@ eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_E
case EVAL_ExprKind_Ptr:
{
TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdbg, expr->children[0], eout);
TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdi, expr->children[0], eout);
result = tg_cons_type_make(graph, TG_Kind_Ptr, direct_type_key, 0);
}break;
case EVAL_ExprKind_Array:
{
EVAL_Expr *child_expr = expr->child_and_constant.child;
TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdbg, child_expr, eout);
TG_Key direct_type_key = eval_type_from_type_expr(arena, graph, rdi, child_expr, eout);
result = tg_cons_type_make(graph, TG_Kind_Array, direct_type_key, expr->child_and_constant.u64);
}break;
@@ -758,7 +758,7 @@ eval_type_from_type_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_E
}
internal EVAL_IRTreeAndType
eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout)
eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdi, EVAL_String2ExprMap *leaf_ident_expr_map, EVAL_Expr *expr, EVAL_ErrorList *eout)
{
ProfBeginFunction();
EVAL_IRTreeAndType result = {0};
@@ -777,12 +777,12 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
EVAL_Expr *exprl = expr->children[0];
EVAL_Expr *exprr = expr->children[1];
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout);
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout);
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout);
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout);
if (l.tree->op != 0 && r.tree->op != 0){
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key);
TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key);
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key);
TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key);
TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
TG_Kind r_restype_kind = tg_kind_from_key(r_restype);
@@ -795,8 +795,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index with this type.");
}
else{
direct_type = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype);
direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct_type);
direct_type = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype);
direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct_type);
if (l_restype_kind == TG_Kind_Ptr){
if (direct_type_size == 0){
eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, exprr->location, "Cannot index into pointers of zero-sized types.");
@@ -829,7 +829,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
// generate ir tree
if (can_generate){
// how to compute the index
EVAL_IRTree *index_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype);
EVAL_IRTree *index_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype);
if (direct_type_size > 1){
EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size);
index_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, index_tree, const_tree);
@@ -838,7 +838,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
// how to compute the base address
EVAL_IRTree *base_tree = l.tree;
if (l_resolve){
base_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, base_tree, l_restype);
base_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, base_tree, l_restype);
}
// how to compute the final address
@@ -857,17 +857,17 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
EVAL_Expr *exprl = expr->children[0];
EVAL_Expr *exprr = expr->children[1];
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout);
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout);
if (l.tree->op != 0 && !tg_key_match(tg_key_zero(), l.type_key)){
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key);
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key);
TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
// determine which type to use
TG_Key check_type_key = l_restype;
TG_Kind check_type_kind = l_restype_kind;
if (l_restype_kind == TG_Kind_Ptr || l_restype_kind == TG_Kind_LRef || l_restype_kind == TG_Kind_RRef){
check_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype);
check_type_key = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype);
check_type_kind = tg_kind_from_key(check_type_key);
}
@@ -921,7 +921,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
if (l_good && r_good){
Temp scratch = scratch_begin(&arena, 1);
TG_MemberArray check_type_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdbg, check_type_key);
TG_MemberArray check_type_members = tg_data_members_from_graph_rdi_key(scratch.arena, graph, rdi, check_type_key);
// lookup member
String8 member_name = exprr->name;
@@ -953,7 +953,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
if (can_generate){
EVAL_IRTree *new_tree = l.tree;
if (l_resolve){
new_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, new_tree, l_restype);
new_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, new_tree, l_restype);
}
if (r_off != 0){
EVAL_IRTree *const_tree = eval_irtree_const_u(arena, r_off);
@@ -975,13 +975,13 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
{
EVAL_Expr *exprc = expr->children[0];
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout);
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout);
if (c.tree->op != 0){
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key);
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, c_restype);
U64 c_restype_direct_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, c_restype_direct);
TG_Key c_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, c_restype);
U64 c_restype_direct_size = tg_byte_size_from_graph_rdi_key(graph, rdi, c_restype_direct);
// analyze situation
B32 can_generate = 0;
@@ -1018,7 +1018,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
if (can_generate){
EVAL_IRTree *new_tree = c.tree;
if (c_resolve){
new_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype);
new_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype);
}
// fill result
@@ -1032,10 +1032,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
case EVAL_ExprKind_Address:
{
EVAL_Expr *exprc = expr->children[0];
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout);
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout);
if(c.tree->op != 0 && !tg_key_match(c.type_key, tg_key_zero()))
{
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key);
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
// analyze situation
@@ -1064,16 +1064,16 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
EVAL_Expr *exprl = expr->children[0];
EVAL_Expr *exprr = expr->children[1];
TG_Key cast_type_key = eval_type_from_type_expr(arena, graph, rdbg, exprl, eout);
TG_Key cast_type_key = eval_type_from_type_expr(arena, graph, rdi, exprl, eout);
TG_Kind cast_type_kind = tg_kind_from_key(cast_type_key);
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout);
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout);
if(cast_type_kind != TG_Kind_Null && c.tree->op != 0)
{
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key);
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
U64 c_restype_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, c_restype);
U64 cast_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, cast_type_key);
U64 c_restype_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, c_restype);
U64 cast_type_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, cast_type_key);
// analyze situation
U8 in_group = eval_type_group_from_kind(c_restype_kind);
@@ -1086,14 +1086,14 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
case RDI_EvalConversionKind_Noop:
case RDI_EvalConversionKind_Legal:
{
EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype);
EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype);
EVAL_IRTree *new_tree = in_tree;
if (conversion_rule == RDI_EvalConversionKind_Legal){
new_tree = eval_irtree_convert_lo(arena, in_tree, out_group, in_group);
}
if (cast_type_byte_size < c_restype_byte_size && eval_kind_is_integer(cast_type_kind)){
new_tree = eval_irtree_trunc(arena, graph, rdbg, in_tree, cast_type_key);
new_tree = eval_irtree_trunc(arena, graph, rdi, in_tree, cast_type_key);
}
result.tree = new_tree;
@@ -1126,13 +1126,13 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
case EVAL_ExprKind_Array:
case EVAL_ExprKind_Func:
{
type_key = eval_type_from_type_expr(arena, graph, rdbg, exprc, eout);
type_key = eval_type_from_type_expr(arena, graph, rdi, exprc, eout);
}break;
// size of value expression
default:
{
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout);
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout);
type_key = c.type_key;
}break;
}
@@ -1141,7 +1141,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
TG_Kind type_kind = tg_kind_from_key(type_key);
if (type_kind != TG_Kind_Null){
can_generate = 1;
size = tg_byte_size_from_graph_rdi_key(graph, rdbg, type_key);
size = tg_byte_size_from_graph_rdi_key(graph, rdi, type_key);
}
// generate ir tree
@@ -1160,10 +1160,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
{
EVAL_Expr *exprc = expr->children[0];
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout);
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout);
if (c.tree->op != 0){
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key);
TG_Key p_type = eval_type_promote(graph, rdbg, c_restype);
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Key p_type = eval_type_promote(graph, rdi, c_restype);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
// analyze situation
@@ -1179,8 +1179,8 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
// generate ir tree
if (can_generate){
EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype);
in_tree = eval_irtree_convert_hi(arena, graph, rdbg, in_tree, p_type, c_restype);
EVAL_IRTree *in_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype);
in_tree = eval_irtree_convert_hi(arena, graph, rdi, in_tree, p_type, c_restype);
EVAL_IRTree *new_tree = eval_irtree_unary_op(arena, op, c_group, in_tree);
@@ -1214,12 +1214,12 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
EVAL_Expr *exprl = expr->children[0];
EVAL_Expr *exprr = expr->children[1];
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout);
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout);
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout);
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout);
if (l.tree->op != 0 && r.tree->op != 0){
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key);
TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key);
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key);
TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key);
TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
TG_Kind r_restype_kind = tg_kind_from_key(r_restype);
@@ -1267,10 +1267,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
arith_path = EVAL_ArithPath_PtrAdd;
}
if (l_is_pointer_like && r_is_pointer_like){
TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype);
TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, r_restype);
U64 l_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, l_restype_direct);
U64 r_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, r_restype_direct);
TG_Key l_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype);
TG_Key r_restype_direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, r_restype);
U64 l_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, l_restype_direct);
U64 r_restype_direct_byte_size = tg_byte_size_from_graph_rdi_key(graph, rdi, r_restype_direct);
if (l_restype_direct_byte_size == r_restype_direct_byte_size){
arith_path = EVAL_ArithPath_PtrSub;
}
@@ -1289,9 +1289,9 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
TG_Key cv_type_key = zero_struct;
if (both_basic){
cv_type_key = eval_type_coerce(graph, rdbg, l_restype, r_restype);
cv_type_key = eval_type_coerce(graph, rdi, l_restype, r_restype);
}
else if (is_comparison && eval_type_match(graph, rdbg, l_restype, r_restype)){
else if (is_comparison && eval_type_match(graph, rdi, l_restype, r_restype)){
cv_type_key = l_restype;
}
@@ -1313,11 +1313,11 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
final_type_key = tg_key_basic(TG_Kind_Bool);
}
EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, l.tree, l_restype);
l_tree = eval_irtree_convert_hi(arena, graph, rdbg, l_tree, cv_type_key, l_restype);
EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype);
l_tree = eval_irtree_convert_hi(arena, graph, rdi, l_tree, cv_type_key, l_restype);
EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype);
r_tree = eval_irtree_convert_hi(arena, graph, rdbg, r_tree, cv_type_key, r_restype);
EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype);
r_tree = eval_irtree_convert_hi(arena, graph, rdi, r_tree, cv_type_key, r_restype);
EVAL_IRTree *new_tree = eval_irtree_binary_op(arena, op, cv_group, l_tree, r_tree);
@@ -1339,16 +1339,16 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
ptr_is_decay = r_is_decay;
}
TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, ptr->type_key);
U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct);
TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, ptr->type_key);
U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct);
// generate ir tree
EVAL_IRTree *ptr_tree = ptr->tree;
if (!ptr_is_decay){
ptr_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, ptr->mode, ptr_tree, ptr->type_key);
ptr_tree = eval_irtree_resolve_to_value(arena, graph, rdi, ptr->mode, ptr_tree, ptr->type_key);
}
EVAL_IRTree *integer_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, integer->mode, integer->tree, integer->type_key);
EVAL_IRTree *integer_tree = eval_irtree_resolve_to_value(arena, graph, rdi, integer->mode, integer->tree, integer->type_key);
if (direct_type_size > 1){
EVAL_IRTree *const_tree = eval_irtree_const_u(arena, direct_type_size);
integer_tree = eval_irtree_binary_op_u(arena, RDI_EvalOp_Mul, integer_tree, const_tree);
@@ -1368,18 +1368,18 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
case EVAL_ArithPath_PtrSub:
{
TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdbg, l_restype);
U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdbg, direct);
TG_Key direct = tg_unwrapped_direct_from_graph_rdi_key(graph, rdi, l_restype);
U64 direct_type_size = tg_byte_size_from_graph_rdi_key(graph, rdi, direct);
// generate ir tree
EVAL_IRTree *l_tree = l.tree;
if (!l_is_decay){
l_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, l.tree, l_restype);
l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype);
}
EVAL_IRTree *r_tree = r.tree;
if (!r_is_decay){
r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype);
r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype);
}
EVAL_IRTree *op_tree = eval_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, l_tree, r_tree);
@@ -1404,15 +1404,15 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
EVAL_Expr *exprl = expr->children[1];
EVAL_Expr *exprr = expr->children[2];
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprc, eout);
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprl, eout);
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, exprr, eout);
EVAL_IRTreeAndType c = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprc, eout);
EVAL_IRTreeAndType l = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprl, eout);
EVAL_IRTreeAndType r = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, exprr, eout);
if (l.tree->op != 0 && r.tree->op != 0 && c.tree->op != 0){
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, c.type_key);
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, l.type_key);
TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdbg, r.type_key);
TG_Key c_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, c.type_key);
TG_Key l_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, l.type_key);
TG_Key r_restype = tg_unwrapped_from_graph_rdi_key(graph, rdi, r.type_key);
TG_Kind c_restype_kind = tg_kind_from_key(c_restype);
TG_Kind l_restype_kind = tg_kind_from_key(l_restype);
TG_Kind r_restype_kind = tg_kind_from_key(r_restype);
@@ -1427,10 +1427,10 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
if (eval_kind_is_basic_or_enum(l_restype_kind) &&
eval_kind_is_basic_or_enum(r_restype_kind)){
can_generate = 1;
final_type = eval_type_coerce(graph, rdbg, l_restype, r_restype);
final_type = eval_type_coerce(graph, rdi, l_restype, r_restype);
}
else{
if (eval_type_match(graph, rdbg, l_restype, r_restype)){
if (eval_type_match(graph, rdi, l_restype, r_restype)){
if (l_restype_kind == TG_Kind_Ptr){
can_generate = 1;
final_type = l_restype;
@@ -1447,13 +1447,13 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
// generate ir tree
if (can_generate){
EVAL_IRTree *c_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, c.mode, c.tree, c_restype);
EVAL_IRTree *c_tree = eval_irtree_resolve_to_value(arena, graph, rdi, c.mode, c.tree, c_restype);
EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, l.mode, l.tree, l_restype);
l_tree = eval_irtree_convert_hi(arena, graph, rdbg, l_tree, final_type, l_restype);
EVAL_IRTree *l_tree = eval_irtree_resolve_to_value(arena, graph, rdi, l.mode, l.tree, l_restype);
l_tree = eval_irtree_convert_hi(arena, graph, rdi, l_tree, final_type, l_restype);
EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdbg, r.mode, r.tree, r_restype);
r_tree = eval_irtree_convert_hi(arena, graph, rdbg, r_tree, final_type, r_restype);
EVAL_IRTree *r_tree = eval_irtree_resolve_to_value(arena, graph, rdi, r.mode, r.tree, r_restype);
r_tree = eval_irtree_convert_hi(arena, graph, rdi, r_tree, final_type, r_restype);
EVAL_IRTree *new_tree = eval_irtree_conditional(arena, c_tree, l_tree, r_tree);
@@ -1540,7 +1540,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
{
eval_errorf(arena, eout, EVAL_ErrorKind_MalformedInput, expr->location, "Left side of assignment must be an identifier.");
}
result = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, expr->children[1], eout);
result = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, expr->children[1], eout);
}break;
case EVAL_ExprKind_LeafIdent:
{
@@ -1553,7 +1553,7 @@ eval_irtree_and_type_from_expr(Arena *arena, TG_Graph *graph, RDI_Parsed *rdbg,
else
{
eval_string2expr_map_inc_poison(leaf_ident_expr_map, name);
result = eval_irtree_and_type_from_expr(arena, graph, rdbg, leaf_ident_expr_map, leaf_ident_expr, eout);
result = eval_irtree_and_type_from_expr(arena, graph, rdi, leaf_ident_expr_map, leaf_ident_expr, eout);
eval_string2expr_map_dec_poison(leaf_ident_expr_map, name);
}
}break;