stage1 实现部分ast2ir内容
This commit is contained in:
1 parent
f1d86b6e34
commit
3d57260f3f
6 files changed
+298
-148
No files matched your search
+72
-17
@@ -1,7 +1,12 @@
|
||||
#include "spl_ast2ir.h"
|
||||
|
||||
static spl_ir_node_ref_t spl_ir_const_comptime_int(spl_ir_builder_t *ir, const spl_sema_t *sema,
|
||||
usize i) {
|
||||
return spl_ir_builder_type_const_int(ir, spl_type_builder_int(sema->type, 0, 0), i);
|
||||
}
|
||||
|
||||
static spl_type_id_t tid_from_def(const spl_sema_t *sema, spl_def_id_t def) {
|
||||
spl_def_node_t *d = spl_type_def(sema->type, def);
|
||||
spl_def_node_t *d = spl_def_node(sema->type, def);
|
||||
return d ? d->type_id : 0;
|
||||
}
|
||||
|
||||
@@ -25,18 +30,35 @@ static spl_ir_node_ref_t transit(spl_ir_builder_t *ir, const spl_sema_t *sema,
|
||||
TODO();
|
||||
break;
|
||||
case SPL_AST_FN_DEFINE: {
|
||||
spl_def_node_t *def = spl_type_def(sema->type, n->resolved_def_id);
|
||||
Assert(def != NULL);
|
||||
spl_ir_builder_fn_new(ir, n->fn_decl.name, def->type_id);
|
||||
spl_type_id_t tid = tid_from_def(sema, n->resolved_def_id);
|
||||
spl_type_node_t *fn_type = spl_type_node(sema->type, tid);
|
||||
Assert(fn_type && fn_type->kind == SPL_TYPE_FN);
|
||||
// n->fn_decl.attr_list; TODO @extern(vm) using extern attribute
|
||||
spl_ir_builder_fn_begin(ir, n->fn_decl.name, tid, (spl_ir_attr_t){0} /*TODO*/);
|
||||
|
||||
spl_ir_builder_block_begin(ir);
|
||||
vec_for(n->fn_decl.block, i) { transit(ir, sema, vec_at(n->fn_decl.block, i)); }
|
||||
if (!ir->terminated) {
|
||||
spl_ir_builder_control_ret(ir, n->fn_decl.type_expr, 0);
|
||||
}
|
||||
spl_ir_builder_block_end(ir);
|
||||
spl_ir_builder_fn_end(ir);
|
||||
|
||||
} break;
|
||||
case SPL_AST_TYPE_DECL:
|
||||
TODO();
|
||||
break;
|
||||
case SPL_AST_VAR_DECL: {
|
||||
spl_type_id_t tid = tid_from_def(sema, n->resolved_def_id);
|
||||
spl_ir_node_ref_t var_ref =
|
||||
spl_ir_builder_mem_alloca(ir, tid, spl_ir_const_comptime_int(ir, sema, 1));
|
||||
if (n->var_const_decl.expr) {
|
||||
spl_ir_builder_mem_store(ir, tid, var_ref, transit(ir, sema, n->var_const_decl.expr));
|
||||
}
|
||||
} break;
|
||||
case SPL_AST_CONST_DECL: {
|
||||
TODO();
|
||||
} break;
|
||||
case SPL_AST_CONST_DECL:
|
||||
case SPL_AST_MEMBER_DECL:
|
||||
TODO();
|
||||
break;
|
||||
@@ -45,8 +67,18 @@ static spl_ir_node_ref_t transit(spl_ir_builder_t *ir, const spl_sema_t *sema,
|
||||
case SPL_AST_PARAM_DECL:
|
||||
break;
|
||||
case SPL_AST_ATTR_ITEM:
|
||||
case SPL_AST_ARGG_INIT_ITEM:
|
||||
case SPL_AST_IF_STATEMENT:
|
||||
case SPL_AST_ARGG_INIT_ITEM: {
|
||||
TODO();
|
||||
} break;
|
||||
case SPL_AST_IF_STATEMENT: {
|
||||
spl_ir_node_ref_t ref = transit(ir, sema, n->if_statement.expr);
|
||||
ref = spl_ir_builder_control_br(ir, ref);
|
||||
spl_ir_builder_block_end(ir);
|
||||
usize true_block = spl_ir_builder_block_begin(ir);
|
||||
|
||||
usize false_block = spl_ir_builder_block_begin(ir);
|
||||
spl_ir_builder_control_br_fixup(ir, ref, true_block, false_block);
|
||||
} break;
|
||||
case SPL_AST_IFVAR_STATEMENT:
|
||||
case SPL_AST_WHILE_STATEMENT:
|
||||
case SPL_AST_LOOP_STATEMENT:
|
||||
@@ -116,19 +148,43 @@ static spl_ir_node_ref_t transit(spl_ir_builder_t *ir, const spl_sema_t *sema,
|
||||
}
|
||||
case SPL_AST_EXPR_FLOAT_LIT:
|
||||
case SPL_AST_EXPR_CHAR_LIT:
|
||||
case SPL_AST_EXPR_STRING_LIT:
|
||||
case SPL_AST_EXPR_TRUE:
|
||||
case SPL_AST_EXPR_FALSE:
|
||||
case SPL_AST_EXPR_NULL:
|
||||
case SPL_AST_EXPR_STRING_LIT: {
|
||||
TODO();
|
||||
} break;
|
||||
case SPL_AST_EXPR_TRUE: {
|
||||
return spl_ir_builder_type_const_bool(
|
||||
ir, spl_type_builder_simple(sema->type, SPL_TYPE_BOOL), true);
|
||||
} break;
|
||||
case SPL_AST_EXPR_FALSE: {
|
||||
return spl_ir_builder_type_const_bool(
|
||||
ir, spl_type_builder_simple(sema->type, SPL_TYPE_BOOL), false);
|
||||
}
|
||||
case SPL_AST_EXPR_NULL: {
|
||||
return spl_ir_builder_type_const_bool(ir, n->resolved_type_id, 0);
|
||||
} break;
|
||||
case SPL_AST_EXPR_UNDEFINED:
|
||||
break;
|
||||
case SPL_AST_EXPR_IDENT: {
|
||||
} break;
|
||||
case SPL_AST_ARGGREGATE_INIT:
|
||||
case SPL_AST_EXPR_EXPR:
|
||||
case SPL_AST_ARRAY_LIT:
|
||||
case SPL_AST_BUILTIN_EXPR:
|
||||
case SPL_AST_BLOCK_EXPR:
|
||||
case SPL_AST_ARGGREGATE_INIT: {
|
||||
vec_for(n->primary_expr.aggregate_init.expr, i) {
|
||||
transit(ir, sema, vec_at(n->primary_expr.aggregate_init.expr, i));
|
||||
}
|
||||
} break;
|
||||
case SPL_AST_EXPR_EXPR: {
|
||||
transit(ir, sema, n->primary_expr.expr);
|
||||
} break;
|
||||
case SPL_AST_ARRAY_LIT: {
|
||||
TODO();
|
||||
} break;
|
||||
case SPL_AST_BUILTIN_EXPR: {
|
||||
TODO();
|
||||
} break;
|
||||
case SPL_AST_BLOCK_EXPR: {
|
||||
vec_for(n->primary_expr.block_expr, i) {
|
||||
transit(ir, sema, vec_at(n->primary_expr.block_expr, i));
|
||||
}
|
||||
} break;
|
||||
case SPL_AST_BASE_TYPE_FN:
|
||||
case SPL_AST_BASE_TYPE_PATH:
|
||||
TODO();
|
||||
@@ -157,7 +213,6 @@ static spl_ir_node_ref_t transit(spl_ir_builder_t *ir, const spl_sema_t *sema,
|
||||
case SPL_AST_TYPE__F64:
|
||||
case SPL_AST_TYPE_ANY:
|
||||
case SPL_AST_TYPE_IDENT:
|
||||
TODO();
|
||||
break;
|
||||
case SPL_AST_COUNT:
|
||||
UNREACHABLE();
|
||||
|
||||
Reference in new issue
Block a user