stage1 实现部分ast2ir内容
This commit is contained in:
1 parent
f1d86b6e34
commit
3d57260f3f
6 files changed
+296
-146
No files matched your search
+72
-17
@@ -1,7 +1,12 @@
|
|||||||
#include "spl_ast2ir.h"
|
#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) {
|
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;
|
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();
|
TODO();
|
||||||
break;
|
break;
|
||||||
case SPL_AST_FN_DEFINE: {
|
case SPL_AST_FN_DEFINE: {
|
||||||
spl_def_node_t *def = spl_type_def(sema->type, n->resolved_def_id);
|
spl_type_id_t tid = tid_from_def(sema, n->resolved_def_id);
|
||||||
Assert(def != NULL);
|
spl_type_node_t *fn_type = spl_type_node(sema->type, tid);
|
||||||
spl_ir_builder_fn_new(ir, n->fn_decl.name, def->type_id);
|
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)); }
|
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;
|
} break;
|
||||||
case SPL_AST_TYPE_DECL:
|
case SPL_AST_TYPE_DECL:
|
||||||
TODO();
|
TODO();
|
||||||
break;
|
break;
|
||||||
case SPL_AST_VAR_DECL: {
|
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();
|
TODO();
|
||||||
} break;
|
} break;
|
||||||
case SPL_AST_CONST_DECL:
|
|
||||||
case SPL_AST_MEMBER_DECL:
|
case SPL_AST_MEMBER_DECL:
|
||||||
TODO();
|
TODO();
|
||||||
break;
|
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:
|
case SPL_AST_PARAM_DECL:
|
||||||
break;
|
break;
|
||||||
case SPL_AST_ATTR_ITEM:
|
case SPL_AST_ATTR_ITEM:
|
||||||
case SPL_AST_ARGG_INIT_ITEM:
|
case SPL_AST_ARGG_INIT_ITEM: {
|
||||||
case SPL_AST_IF_STATEMENT:
|
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_IFVAR_STATEMENT:
|
||||||
case SPL_AST_WHILE_STATEMENT:
|
case SPL_AST_WHILE_STATEMENT:
|
||||||
case SPL_AST_LOOP_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_FLOAT_LIT:
|
||||||
case SPL_AST_EXPR_CHAR_LIT:
|
case SPL_AST_EXPR_CHAR_LIT:
|
||||||
case SPL_AST_EXPR_STRING_LIT:
|
case SPL_AST_EXPR_STRING_LIT: {
|
||||||
case SPL_AST_EXPR_TRUE:
|
TODO();
|
||||||
case SPL_AST_EXPR_FALSE:
|
} break;
|
||||||
case SPL_AST_EXPR_NULL:
|
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:
|
case SPL_AST_EXPR_UNDEFINED:
|
||||||
break;
|
break;
|
||||||
case SPL_AST_EXPR_IDENT: {
|
case SPL_AST_EXPR_IDENT: {
|
||||||
} break;
|
} break;
|
||||||
case SPL_AST_ARGGREGATE_INIT:
|
case SPL_AST_ARGGREGATE_INIT: {
|
||||||
case SPL_AST_EXPR_EXPR:
|
vec_for(n->primary_expr.aggregate_init.expr, i) {
|
||||||
case SPL_AST_ARRAY_LIT:
|
transit(ir, sema, vec_at(n->primary_expr.aggregate_init.expr, i));
|
||||||
case SPL_AST_BUILTIN_EXPR:
|
}
|
||||||
case SPL_AST_BLOCK_EXPR:
|
} 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_FN:
|
||||||
case SPL_AST_BASE_TYPE_PATH:
|
case SPL_AST_BASE_TYPE_PATH:
|
||||||
TODO();
|
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__F64:
|
||||||
case SPL_AST_TYPE_ANY:
|
case SPL_AST_TYPE_ANY:
|
||||||
case SPL_AST_TYPE_IDENT:
|
case SPL_AST_TYPE_IDENT:
|
||||||
TODO();
|
|
||||||
break;
|
break;
|
||||||
case SPL_AST_COUNT:
|
case SPL_AST_COUNT:
|
||||||
UNREACHABLE();
|
UNREACHABLE();
|
||||||
|
|||||||
+151
-82
@@ -14,8 +14,8 @@ const char *spl_ir_kind_name(spl_ir_kind_t kind) {
|
|||||||
void spl_ir_init(spl_ir_t *ir) {
|
void spl_ir_init(spl_ir_t *ir) {
|
||||||
vec_init(ir->funcs);
|
vec_init(ir->funcs);
|
||||||
vec_push(ir->funcs, (spl_ir_func_t){0});
|
vec_push(ir->funcs, (spl_ir_func_t){0});
|
||||||
vec_init(ir->gdata);
|
// vec_init(ir->gdata);
|
||||||
vec_push(ir->gdata, (spl_ir_node_t){0});
|
// vec_push(ir->gdata, (spl_ir_node_t){0});
|
||||||
}
|
}
|
||||||
|
|
||||||
static void node_drop_vecs(spl_ir_node_t *n) {
|
static void node_drop_vecs(spl_ir_node_t *n) {
|
||||||
@@ -38,43 +38,52 @@ void spl_ir_drop(spl_ir_t *ir) {
|
|||||||
spl_ir_func_t *f = &vec_at(ir->funcs, i);
|
spl_ir_func_t *f = &vec_at(ir->funcs, i);
|
||||||
vec_for(f->nodes, j) { node_drop_vecs(&vec_at(f->nodes, j)); }
|
vec_for(f->nodes, j) { node_drop_vecs(&vec_at(f->nodes, j)); }
|
||||||
vec_free(f->nodes);
|
vec_free(f->nodes);
|
||||||
vec_free(f->labels);
|
|
||||||
}
|
}
|
||||||
vec_free(ir->funcs);
|
vec_free(ir->funcs);
|
||||||
vec_for(ir->gdata, i) { node_drop_vecs(&vec_at(ir->gdata, i)); }
|
// vec_for(ir->gdata, i) { node_drop_vecs(&vec_at(ir->gdata, i)); }
|
||||||
vec_free(ir->gdata);
|
// vec_free(ir->gdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 申请空的 ir_func 返回 id
|
||||||
spl_ir_func_ref_t spl_ir_alloc_fn(spl_ir_t *ir) {
|
spl_ir_func_ref_t spl_ir_alloc_fn(spl_ir_t *ir) {
|
||||||
|
if (ir == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
spl_ir_func_t f = {0};
|
spl_ir_func_t f = {0};
|
||||||
vec_init(f.nodes);
|
vec_init(f.nodes);
|
||||||
vec_init(f.labels);
|
vec_push(f.nodes, (spl_ir_node_t){0});
|
||||||
vec_push(f.nodes, (spl_ir_node_t){0}); /* 0 = error 哨兵 */
|
|
||||||
vec_push(ir->funcs, f);
|
vec_push(ir->funcs, f);
|
||||||
return vec_size(ir->funcs) - 1;
|
return vec_size(ir->funcs) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 从 fn_id 申请空的 ir_node 返回 id
|
||||||
spl_ir_node_ref_t spl_ir_alloc_node(spl_ir_t *ir, spl_ir_func_ref_t fn_id) {
|
spl_ir_node_ref_t spl_ir_alloc_node(spl_ir_t *ir, spl_ir_func_ref_t fn_id) {
|
||||||
if (!fn_id || fn_id >= vec_size(ir->funcs))
|
if (!fn_id || fn_id >= vec_size(ir->funcs)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
spl_ir_func_t *f = &vec_at(ir->funcs, fn_id);
|
spl_ir_func_t *f = &vec_at(ir->funcs, fn_id);
|
||||||
spl_ir_node_t n = {0};
|
spl_ir_node_t n = {0};
|
||||||
vec_push(f->nodes, n);
|
vec_push(f->nodes, n);
|
||||||
return vec_size(f->nodes) - 1;
|
return vec_size(f->nodes) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 从 fn_id 里通过 node_id 获取 ir_node
|
||||||
spl_ir_node_t *spl_ir_node(spl_ir_t *ir, spl_ir_func_ref_t fn_id, spl_ir_node_ref_t node_id) {
|
spl_ir_node_t *spl_ir_node(spl_ir_t *ir, spl_ir_func_ref_t fn_id, spl_ir_node_ref_t node_id) {
|
||||||
if (!fn_id || fn_id >= vec_size(ir->funcs))
|
if (!fn_id || fn_id >= vec_size(ir->funcs)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
spl_ir_func_t *f = &vec_at(ir->funcs, fn_id);
|
spl_ir_func_t *f = &vec_at(ir->funcs, fn_id);
|
||||||
if (!node_id || node_id >= vec_size(f->nodes))
|
if (!node_id || node_id >= vec_size(f->nodes)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
return &vec_at(f->nodes, node_id);
|
return &vec_at(f->nodes, node_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 从 fn_id 获取 ir_func
|
||||||
spl_ir_func_t *spl_ir_func(spl_ir_t *ir, spl_ir_func_ref_t fn_id) {
|
spl_ir_func_t *spl_ir_func(spl_ir_t *ir, spl_ir_func_ref_t fn_id) {
|
||||||
if (!fn_id || fn_id >= vec_size(ir->funcs))
|
if (!fn_id || fn_id >= vec_size(ir->funcs)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
return &vec_at(ir->funcs, fn_id);
|
return &vec_at(ir->funcs, fn_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -279,102 +288,126 @@ void spl_ir_dump(spl_ir_t *ir, const spl_type_t *ty) {
|
|||||||
if (vec_size(func->nodes) == 0)
|
if (vec_size(func->nodes) == 0)
|
||||||
printf(" (extern)\n");
|
printf(" (extern)\n");
|
||||||
}
|
}
|
||||||
if (vec_size(ir->gdata) > 1) {
|
// if (vec_size(ir->gdata) > 1) {
|
||||||
printf("gdata:\n");
|
// printf("gdata:\n");
|
||||||
vec_for(ir->gdata, i) {
|
// vec_for(ir->gdata, i) {
|
||||||
if (i == 0)
|
// if (i == 0)
|
||||||
continue;
|
// continue;
|
||||||
spl_ir_node_t *node = &vec_at(ir->gdata, i);
|
// spl_ir_node_t *node = &vec_at(ir->gdata, i);
|
||||||
printf(" #%zu ", i);
|
// printf(" #%zu ", i);
|
||||||
printf("%s", spl_ir_kind_name(node->kind));
|
// printf("%s", spl_ir_kind_name(node->kind));
|
||||||
ir_dump_node(ty, node);
|
// ir_dump_node(ty, node);
|
||||||
printf("\n");
|
// printf("\n");
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
// IR Builder
|
// IR Builder
|
||||||
|
|
||||||
|
// 从当前 fn 申请新的 node 并注入到当前基本块
|
||||||
static spl_ir_node_ref_t builder_alloc_node(spl_ir_builder_t *b, spl_ir_kind_t kind) {
|
static spl_ir_node_ref_t builder_alloc_node(spl_ir_builder_t *b, spl_ir_kind_t kind) {
|
||||||
|
Assert(!b->terminated && "emit into a terminated block");
|
||||||
spl_ir_node_ref_t ref = spl_ir_alloc_node(&b->ir, b->current_fn);
|
spl_ir_node_ref_t ref = spl_ir_alloc_node(&b->ir, b->current_fn);
|
||||||
Assert(ref != 0);
|
Assert(ref != 0);
|
||||||
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
||||||
n->kind = kind;
|
n->kind = kind;
|
||||||
n->dbg = b->dbg;
|
n->dbg = b->dbg;
|
||||||
b->current_node = ref;
|
if (b->current_block < vec_size(b->blocks)) {
|
||||||
|
vec_at(b->blocks, b->current_block) = ref;
|
||||||
|
} else {
|
||||||
|
Panic("unknown bblock");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
static spl_ir_func_t *builder_cur_func(spl_ir_builder_t *b) {
|
|
||||||
return spl_ir_func(&b->ir, b->current_fn);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void builder_reloc_add(spl_ir_builder_t *b, spl_ir_node_ref_t label) {
|
|
||||||
if (label == 0) {
|
|
||||||
LOG_WARN("reloc null lable");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
spl_ir_func_t *f = builder_cur_func(b);
|
|
||||||
if (f && label < vec_size(f->nodes)) {
|
|
||||||
// resolved
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
vec_for(b->reloc_label, i) {
|
|
||||||
if (vec_at(b->reloc_label, i) == label) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
vec_push(b->reloc_label, label);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void builder_reloc_check(spl_ir_builder_t *b) {
|
|
||||||
spl_ir_func_t *f = builder_cur_func(b);
|
|
||||||
if (!f)
|
|
||||||
return;
|
|
||||||
vec_for(b->reloc_label, i) {
|
|
||||||
spl_ir_node_ref_t label = vec_at(b->reloc_label, i);
|
|
||||||
if (label >= vec_size(f->nodes)) {
|
|
||||||
LOG_ERROR("fn `%s`: forward label %%%zu unresolved", f->name ? f->name : "?", label);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
b->reloc_label.size = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void spl_ir_builder_init(spl_ir_builder_t *b) {
|
void spl_ir_builder_init(spl_ir_builder_t *b) {
|
||||||
spl_ir_init(&b->ir);
|
spl_ir_init(&b->ir);
|
||||||
b->current_fn = 0;
|
b->current_fn = 0;
|
||||||
b->current_node = 0;
|
|
||||||
b->dbg = (spl_dbg_node_t){0};
|
b->dbg = (spl_dbg_node_t){0};
|
||||||
vec_init(b->reloc_label);
|
vec_init(b->blocks);
|
||||||
|
b->current_block = 0;
|
||||||
|
vec_init(b->fixups);
|
||||||
|
b->terminated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spl_ir_builder_drop(spl_ir_builder_t *b) {
|
void spl_ir_builder_drop(spl_ir_builder_t *b) {
|
||||||
spl_ir_drop(&b->ir);
|
spl_ir_drop(&b->ir);
|
||||||
vec_free(b->reloc_label);
|
vec_free(b->blocks);
|
||||||
|
vec_free(b->fixups);
|
||||||
}
|
}
|
||||||
|
|
||||||
spl_ir_func_ref_t spl_ir_builder_fn_new(spl_ir_builder_t *b, const char *name,
|
spl_ir_func_ref_t spl_ir_builder_fn_begin(spl_ir_builder_t *b, const char *name,
|
||||||
spl_type_id_t fn_tid) {
|
spl_type_id_t fn_tid, spl_ir_attr_t attr) {
|
||||||
if (b->current_fn) {
|
if (b->current_fn) {
|
||||||
builder_reloc_check(b);
|
spl_ir_builder_fn_end(b);
|
||||||
}
|
}
|
||||||
spl_ir_func_ref_t fid = spl_ir_alloc_fn(&b->ir);
|
spl_ir_func_ref_t fid = spl_ir_alloc_fn(&b->ir);
|
||||||
spl_ir_func_t *f = spl_ir_func(&b->ir, fid);
|
spl_ir_func_t *f = spl_ir_func(&b->ir, fid);
|
||||||
f->name = name;
|
f->name = name;
|
||||||
|
f->attr = attr;
|
||||||
f->fn_tid = fn_tid;
|
f->fn_tid = fn_tid;
|
||||||
|
|
||||||
b->current_fn = fid;
|
b->current_fn = fid;
|
||||||
b->current_node = 0;
|
b->current_block = 0;
|
||||||
|
b->blocks.size = 0;
|
||||||
|
b->fixups.size = 0;
|
||||||
|
b->terminated = false;
|
||||||
return fid;
|
return fid;
|
||||||
}
|
}
|
||||||
|
|
||||||
spl_ir_func_ref_t spl_ir_builder_cur_fn(const spl_ir_builder_t *b) { return b->current_fn; }
|
void spl_ir_builder_fn_end(spl_ir_builder_t *b) {
|
||||||
|
spl_ir_func_t *f = spl_ir_func(&b->ir, b->current_fn);
|
||||||
|
if (!f) {
|
||||||
|
Panic("ir func not found");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
void spl_ir_builder_set_dbg(spl_ir_builder_t *b, spl_dbg_node_t dbg) { b->dbg = dbg; }
|
vec_for(b->fixups, i) {
|
||||||
|
spl_ir_fix_t *fx = &vec_at(b->fixups, i);
|
||||||
|
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, fx->node);
|
||||||
|
if (!n) {
|
||||||
|
SPL_ERROR(&n->dbg, "unknown node in func");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
spl_ir_node_ref_t target = 0;
|
||||||
|
if (fx->block < vec_size(b->blocks)) {
|
||||||
|
target = vec_at(b->blocks, fx->block);
|
||||||
|
}
|
||||||
|
if (target == 0) {
|
||||||
|
Panic("unknown reloc target bblock");
|
||||||
|
}
|
||||||
|
switch (fx->slot) {
|
||||||
|
case SPL_IR_FIX_BR_TRUE:
|
||||||
|
n->control_br.true_label = target;
|
||||||
|
break;
|
||||||
|
case SPL_IR_FIX_BR_FALSE:
|
||||||
|
n->control_br.false_label = target;
|
||||||
|
break;
|
||||||
|
case SPL_IR_FIX_JMP:
|
||||||
|
n->control_jmp.label = target;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
spl_ir_node_ref_t spl_ir_builder_block_new(spl_ir_builder_t *b) {
|
b->current_block = 0;
|
||||||
spl_ir_func_t *f = builder_cur_func(b);
|
b->blocks.size = 0;
|
||||||
Assert(f != NULL);
|
b->fixups.size = 0;
|
||||||
return vec_size(f->nodes);
|
b->terminated = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
usize spl_ir_builder_block_begin(spl_ir_builder_t *b) {
|
||||||
|
vec_push(b->blocks, (spl_ir_block_t){0});
|
||||||
|
usize block = vec_size(b->blocks) - 1;
|
||||||
|
b->current_block = block;
|
||||||
|
b->terminated = false;
|
||||||
|
return block;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spl_ir_builder_block_end(spl_ir_builder_t *b) {
|
||||||
|
if (!b->terminated) {
|
||||||
|
Panic("bblock must be end of terminated");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define X(name, kind) \
|
#define X(name, kind) \
|
||||||
@@ -510,6 +543,22 @@ spl_ir_node_ref_t spl_ir_builder_mem_set(spl_ir_builder_t *b, spl_type_id_t tid,
|
|||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spl_ir_node_ref_t spl_ir_builder_type_const_bool(spl_ir_builder_t *b, spl_type_id_t tid, bool val) {
|
||||||
|
spl_ir_node_ref_t ref = builder_alloc_node(b, SPL_IR_TYPE_CONST);
|
||||||
|
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
||||||
|
n->type_const.tid = tid;
|
||||||
|
n->type_const.bool_lit = val;
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
spl_ir_node_ref_t spl_ir_builder_type_const_ptr(spl_ir_builder_t *b, spl_type_id_t tid, void *val) {
|
||||||
|
spl_ir_node_ref_t ref = builder_alloc_node(b, SPL_IR_TYPE_CONST);
|
||||||
|
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
||||||
|
n->type_const.tid = tid;
|
||||||
|
n->type_const.ptr_lit = val;
|
||||||
|
return ref;
|
||||||
|
}
|
||||||
|
|
||||||
spl_ir_node_ref_t spl_ir_builder_type_const_int(spl_ir_builder_t *b, spl_type_id_t tid, usize val) {
|
spl_ir_node_ref_t spl_ir_builder_type_const_int(spl_ir_builder_t *b, spl_type_id_t tid, usize val) {
|
||||||
spl_ir_node_ref_t ref = builder_alloc_node(b, SPL_IR_TYPE_CONST);
|
spl_ir_node_ref_t ref = builder_alloc_node(b, SPL_IR_TYPE_CONST);
|
||||||
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
||||||
@@ -640,27 +689,46 @@ spl_ir_node_ref_t spl_ir_builder_control_select(spl_ir_builder_t *b, spl_type_id
|
|||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
spl_ir_node_ref_t spl_ir_builder_control_br(spl_ir_builder_t *b, spl_ir_node_ref_t cond,
|
spl_ir_node_ref_t spl_ir_builder_control_br(spl_ir_builder_t *b, spl_ir_node_ref_t cond) {
|
||||||
spl_ir_node_ref_t true_label,
|
|
||||||
spl_ir_node_ref_t false_label) {
|
|
||||||
builder_reloc_add(b, true_label);
|
|
||||||
builder_reloc_add(b, false_label);
|
|
||||||
spl_ir_node_ref_t ref = builder_alloc_node(b, SPL_IR_CONTROL_BR);
|
spl_ir_node_ref_t ref = builder_alloc_node(b, SPL_IR_CONTROL_BR);
|
||||||
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
||||||
n->control_br.cond = cond;
|
n->control_br.cond = cond;
|
||||||
n->control_br.true_label = true_label;
|
n->control_br.true_label = 0;
|
||||||
n->control_br.false_label = false_label;
|
n->control_br.false_label = 0;
|
||||||
|
b->terminated = true;
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
spl_ir_node_ref_t spl_ir_builder_control_jmp(spl_ir_builder_t *b, spl_ir_node_ref_t label) {
|
void spl_ir_builder_control_br_fixup(spl_ir_builder_t *b, spl_ir_node_ref_t ref, usize true_block,
|
||||||
builder_reloc_add(b, label);
|
usize false_block) {
|
||||||
|
spl_ir_node_t *node = spl_ir_node(&b->ir, b->current_fn, ref);
|
||||||
|
if (!(node && node->kind == SPL_IR_CONTROL_BR)) {
|
||||||
|
Panic("fixup must be valid jmp ir node");
|
||||||
|
}
|
||||||
|
spl_ir_fix_t f1 = {.node = ref, .slot = SPL_IR_FIX_BR_TRUE, .block = true_block};
|
||||||
|
vec_push(b->fixups, f1);
|
||||||
|
spl_ir_fix_t f2 = {.node = ref, .slot = SPL_IR_FIX_BR_FALSE, .block = false_block};
|
||||||
|
vec_push(b->fixups, f2);
|
||||||
|
}
|
||||||
|
|
||||||
|
spl_ir_node_ref_t spl_ir_builder_control_jmp(spl_ir_builder_t *b) {
|
||||||
spl_ir_node_ref_t ref = builder_alloc_node(b, SPL_IR_CONTROL_JMP);
|
spl_ir_node_ref_t ref = builder_alloc_node(b, SPL_IR_CONTROL_JMP);
|
||||||
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
||||||
n->control_jmp.label = label;
|
n->control_jmp.label = 0;
|
||||||
|
b->terminated = true;
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void spl_ir_builder_control_jmp_fixup(spl_ir_builder_t *b, spl_ir_node_ref_t ref,
|
||||||
|
usize target_block) {
|
||||||
|
spl_ir_node_t *node = spl_ir_node(&b->ir, b->current_fn, ref);
|
||||||
|
if (!(node && node->kind == SPL_IR_CONTROL_JMP)) {
|
||||||
|
Panic("fixup must be valid jmp ir node");
|
||||||
|
}
|
||||||
|
spl_ir_fix_t fx = {.node = ref, .slot = SPL_IR_FIX_JMP, .block = target_block};
|
||||||
|
vec_push(b->fixups, fx);
|
||||||
|
}
|
||||||
|
|
||||||
spl_ir_node_ref_t spl_ir_builder_control_call(spl_ir_builder_t *b, spl_type_id_t tid,
|
spl_ir_node_ref_t spl_ir_builder_control_call(spl_ir_builder_t *b, spl_type_id_t tid,
|
||||||
spl_ir_node_ref_t func) {
|
spl_ir_node_ref_t func) {
|
||||||
spl_ir_node_ref_t ref = builder_alloc_node(b, SPL_IR_CONTROL_CALL);
|
spl_ir_node_ref_t ref = builder_alloc_node(b, SPL_IR_CONTROL_CALL);
|
||||||
@@ -693,6 +761,7 @@ spl_ir_node_ref_t spl_ir_builder_control_ret(spl_ir_builder_t *b, spl_type_id_t
|
|||||||
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
spl_ir_node_t *n = spl_ir_node(&b->ir, b->current_fn, ref);
|
||||||
n->control_ret.tid = tid;
|
n->control_ret.tid = tid;
|
||||||
n->control_ret.val = val;
|
n->control_ret.val = val;
|
||||||
|
b->terminated = true;
|
||||||
return ref;
|
return ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+41
-15
@@ -141,6 +141,8 @@ typedef struct {
|
|||||||
struct {
|
struct {
|
||||||
spl_type_id_t tid;
|
spl_type_id_t tid;
|
||||||
union {
|
union {
|
||||||
|
bool bool_lit;
|
||||||
|
void *ptr_lit;
|
||||||
usize int_lit;
|
usize int_lit;
|
||||||
double float_lit;
|
double float_lit;
|
||||||
const char *cstr_lit;
|
const char *cstr_lit;
|
||||||
@@ -231,14 +233,21 @@ typedef struct {
|
|||||||
spl_ir_attr_t attr;
|
spl_ir_attr_t attr;
|
||||||
spl_type_id_t fn_tid;
|
spl_type_id_t fn_tid;
|
||||||
spl_ir_node_vec_t nodes;
|
spl_ir_node_vec_t nodes;
|
||||||
spl_ir_node_ref_vec_t labels;
|
|
||||||
} spl_ir_func_t;
|
} spl_ir_func_t;
|
||||||
|
|
||||||
typedef VEC(spl_ir_func_t) spl_ir_func_vec_t;
|
typedef VEC(spl_ir_func_t) spl_ir_func_vec_t;
|
||||||
|
|
||||||
|
typedef spl_ir_node_ref_t spl_ir_block_t;
|
||||||
|
typedef VEC(spl_ir_block_t) spl_ir_block_vec_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
spl_ir_node_ref_t node;
|
||||||
|
enum { SPL_IR_FIX_BR_TRUE, SPL_IR_FIX_BR_FALSE, SPL_IR_FIX_JMP } slot;
|
||||||
|
spl_ir_node_ref_t block;
|
||||||
|
} spl_ir_fix_t;
|
||||||
|
typedef VEC(spl_ir_fix_t) spl_ir_fix_vec_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
spl_ir_func_vec_t funcs;
|
spl_ir_func_vec_t funcs;
|
||||||
spl_ir_node_vec_t gdata;
|
|
||||||
} spl_ir_t;
|
} spl_ir_t;
|
||||||
|
|
||||||
void spl_ir_init(spl_ir_t *ir);
|
void spl_ir_init(spl_ir_t *ir);
|
||||||
@@ -255,10 +264,12 @@ const char *spl_ir_kind_name(spl_ir_kind_t kind);
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
spl_ir_t ir;
|
spl_ir_t ir;
|
||||||
spl_ir_func_ref_t current_fn;
|
|
||||||
spl_ir_node_ref_t current_node;
|
|
||||||
spl_ir_node_ref_vec_t reloc_label;
|
|
||||||
spl_dbg_node_t dbg;
|
spl_dbg_node_t dbg;
|
||||||
|
spl_ir_func_ref_t current_fn; /* 当前函数 */
|
||||||
|
spl_ir_node_ref_t current_block; /* 当前发射块(0 = 未设) */
|
||||||
|
spl_ir_block_vec_t blocks; /* 当前函数的基本块表 */
|
||||||
|
spl_ir_fix_vec_t fixups; /* 跳转回填表 */
|
||||||
|
bool terminated; /* 当前块已以 br/jmp/ret 终止 */
|
||||||
} spl_ir_builder_t;
|
} spl_ir_builder_t;
|
||||||
|
|
||||||
/* clang-format off */
|
/* clang-format off */
|
||||||
@@ -300,12 +311,12 @@ typedef struct {
|
|||||||
void spl_ir_builder_init(spl_ir_builder_t *b);
|
void spl_ir_builder_init(spl_ir_builder_t *b);
|
||||||
void spl_ir_builder_drop(spl_ir_builder_t *b);
|
void spl_ir_builder_drop(spl_ir_builder_t *b);
|
||||||
|
|
||||||
spl_ir_func_ref_t spl_ir_builder_fn_new(spl_ir_builder_t *b, const char *name,
|
spl_ir_func_ref_t spl_ir_builder_fn_begin(spl_ir_builder_t *b, const char *name,
|
||||||
spl_type_id_t fn_tid);
|
spl_type_id_t fn_tid, spl_ir_attr_t attr);
|
||||||
spl_ir_func_ref_t spl_ir_builder_cur_fn(const spl_ir_builder_t *b);
|
void spl_ir_builder_fn_end(spl_ir_builder_t *b);
|
||||||
void spl_ir_builder_set_dbg(spl_ir_builder_t *b, spl_dbg_node_t dbg);
|
|
||||||
|
|
||||||
spl_ir_node_ref_t spl_ir_builder_block_new(spl_ir_builder_t *b);
|
usize spl_ir_builder_block_begin(spl_ir_builder_t *b);
|
||||||
|
void spl_ir_builder_block_end(spl_ir_builder_t *b);
|
||||||
|
|
||||||
#define X(name, kind) \
|
#define X(name, kind) \
|
||||||
spl_ir_node_ref_t spl_ir_builder_##name(spl_ir_builder_t *b, spl_type_id_t tid, \
|
spl_ir_node_ref_t spl_ir_builder_##name(spl_ir_builder_t *b, spl_type_id_t tid, \
|
||||||
@@ -331,6 +342,8 @@ SPL_IR_CMP_TABLE
|
|||||||
SPL_IR_CAST_TABLE
|
SPL_IR_CAST_TABLE
|
||||||
#undef X
|
#undef X
|
||||||
|
|
||||||
|
/* memory */
|
||||||
|
|
||||||
spl_ir_node_ref_t spl_ir_builder_mem_alloca(spl_ir_builder_t *b, spl_type_id_t tid,
|
spl_ir_node_ref_t spl_ir_builder_mem_alloca(spl_ir_builder_t *b, spl_type_id_t tid,
|
||||||
spl_ir_node_ref_t count);
|
spl_ir_node_ref_t count);
|
||||||
spl_ir_node_ref_t spl_ir_builder_mem_global_alloc(spl_ir_builder_t *b, spl_type_id_t tid,
|
spl_ir_node_ref_t spl_ir_builder_mem_global_alloc(spl_ir_builder_t *b, spl_type_id_t tid,
|
||||||
@@ -350,6 +363,10 @@ spl_ir_node_ref_t spl_ir_builder_mem_set(spl_ir_builder_t *b, spl_type_id_t tid,
|
|||||||
spl_ir_node_ref_t dst, spl_ir_node_ref_t val,
|
spl_ir_node_ref_t dst, spl_ir_node_ref_t val,
|
||||||
spl_ir_node_ref_t size);
|
spl_ir_node_ref_t size);
|
||||||
|
|
||||||
|
/* type const */
|
||||||
|
|
||||||
|
spl_ir_node_ref_t spl_ir_builder_type_const_ptr(spl_ir_builder_t *b, spl_type_id_t tid, void *val);
|
||||||
|
spl_ir_node_ref_t spl_ir_builder_type_const_bool(spl_ir_builder_t *b, spl_type_id_t tid, bool val);
|
||||||
spl_ir_node_ref_t spl_ir_builder_type_const_int(spl_ir_builder_t *b, spl_type_id_t tid, usize val);
|
spl_ir_node_ref_t spl_ir_builder_type_const_int(spl_ir_builder_t *b, spl_type_id_t tid, usize val);
|
||||||
spl_ir_node_ref_t spl_ir_builder_type_const_float(spl_ir_builder_t *b, spl_type_id_t tid,
|
spl_ir_node_ref_t spl_ir_builder_type_const_float(spl_ir_builder_t *b, spl_type_id_t tid,
|
||||||
double val);
|
double val);
|
||||||
@@ -358,6 +375,9 @@ spl_ir_node_ref_t spl_ir_builder_type_const_cstr(spl_ir_builder_t *b, spl_type_i
|
|||||||
spl_ir_node_ref_t spl_ir_builder_type_const_char(spl_ir_builder_t *b, spl_type_id_t tid, char val);
|
spl_ir_node_ref_t spl_ir_builder_type_const_char(spl_ir_builder_t *b, spl_type_id_t tid, char val);
|
||||||
spl_ir_node_ref_t spl_ir_builder_type_const_fn(spl_ir_builder_t *b, spl_type_id_t tid,
|
spl_ir_node_ref_t spl_ir_builder_type_const_fn(spl_ir_builder_t *b, spl_type_id_t tid,
|
||||||
spl_ir_func_ref_t val);
|
spl_ir_func_ref_t val);
|
||||||
|
|
||||||
|
/* type */
|
||||||
|
|
||||||
spl_ir_node_ref_t spl_ir_builder_type_bitsizeof(spl_ir_builder_t *b, spl_type_id_t tid);
|
spl_ir_node_ref_t spl_ir_builder_type_bitsizeof(spl_ir_builder_t *b, spl_type_id_t tid);
|
||||||
spl_ir_node_ref_t spl_ir_builder_type_sizeof(spl_ir_builder_t *b, spl_type_id_t tid);
|
spl_ir_node_ref_t spl_ir_builder_type_sizeof(spl_ir_builder_t *b, spl_type_id_t tid);
|
||||||
spl_ir_node_ref_t spl_ir_builder_type_alignof(spl_ir_builder_t *b, spl_type_id_t tid);
|
spl_ir_node_ref_t spl_ir_builder_type_alignof(spl_ir_builder_t *b, spl_type_id_t tid);
|
||||||
@@ -365,6 +385,8 @@ spl_ir_node_ref_t spl_ir_builder_type_offsetof(spl_ir_builder_t *b, spl_type_id_
|
|||||||
spl_ir_node_ref_t field_idx);
|
spl_ir_node_ref_t field_idx);
|
||||||
spl_ir_node_ref_t spl_ir_builder_type_field_count(spl_ir_builder_t *b, spl_type_id_t tid);
|
spl_ir_node_ref_t spl_ir_builder_type_field_count(spl_ir_builder_t *b, spl_type_id_t tid);
|
||||||
|
|
||||||
|
/* agg */
|
||||||
|
|
||||||
spl_ir_node_ref_t spl_ir_builder_agg_construct(spl_ir_builder_t *b, spl_type_id_t tid);
|
spl_ir_node_ref_t spl_ir_builder_agg_construct(spl_ir_builder_t *b, spl_type_id_t tid);
|
||||||
void spl_ir_builder_agg_construct_field(spl_ir_builder_t *b, spl_ir_node_ref_t node,
|
void spl_ir_builder_agg_construct_field(spl_ir_builder_t *b, spl_ir_node_ref_t node,
|
||||||
spl_ir_node_ref_t field);
|
spl_ir_node_ref_t field);
|
||||||
@@ -374,13 +396,17 @@ spl_ir_node_ref_t spl_ir_builder_agg_extract(spl_ir_builder_t *b, spl_type_id_t
|
|||||||
spl_ir_node_ref_t spl_ir_builder_agg_insert(spl_ir_builder_t *b, spl_type_id_t tid, usize field_idx,
|
spl_ir_node_ref_t spl_ir_builder_agg_insert(spl_ir_builder_t *b, spl_type_id_t tid, usize field_idx,
|
||||||
spl_ir_node_ref_t agg, spl_ir_node_ref_t field);
|
spl_ir_node_ref_t agg, spl_ir_node_ref_t field);
|
||||||
|
|
||||||
|
/* control */
|
||||||
|
|
||||||
spl_ir_node_ref_t spl_ir_builder_control_select(spl_ir_builder_t *b, spl_type_id_t tid,
|
spl_ir_node_ref_t spl_ir_builder_control_select(spl_ir_builder_t *b, spl_type_id_t tid,
|
||||||
spl_ir_node_ref_t cond, spl_ir_node_ref_t true_val,
|
spl_ir_node_ref_t cond, spl_ir_node_ref_t true_val,
|
||||||
spl_ir_node_ref_t false_val);
|
spl_ir_node_ref_t false_val);
|
||||||
spl_ir_node_ref_t spl_ir_builder_control_br(spl_ir_builder_t *b, spl_ir_node_ref_t cond,
|
spl_ir_node_ref_t spl_ir_builder_control_br(spl_ir_builder_t *b, spl_ir_node_ref_t cond);
|
||||||
spl_ir_node_ref_t true_label,
|
void spl_ir_builder_control_br_fixup(spl_ir_builder_t *b, spl_ir_node_ref_t ref, usize true_block,
|
||||||
spl_ir_node_ref_t false_label);
|
usize false_block);
|
||||||
spl_ir_node_ref_t spl_ir_builder_control_jmp(spl_ir_builder_t *b, spl_ir_node_ref_t label);
|
spl_ir_node_ref_t spl_ir_builder_control_jmp(spl_ir_builder_t *b);
|
||||||
|
void spl_ir_builder_control_jmp_fixup(spl_ir_builder_t *b, spl_ir_node_ref_t ref,
|
||||||
|
usize target_block);
|
||||||
spl_ir_node_ref_t spl_ir_builder_control_call(spl_ir_builder_t *b, spl_type_id_t tid,
|
spl_ir_node_ref_t spl_ir_builder_control_call(spl_ir_builder_t *b, spl_type_id_t tid,
|
||||||
spl_ir_node_ref_t func);
|
spl_ir_node_ref_t func);
|
||||||
void spl_ir_builder_control_call_param(spl_ir_builder_t *b, spl_ir_node_ref_t node,
|
void spl_ir_builder_control_call_param(spl_ir_builder_t *b, spl_ir_node_ref_t node,
|
||||||
|
|||||||
+21
-21
@@ -29,7 +29,7 @@ bool spl_scope_insert(spl_scope_t *scope, spl_scope_id_t id, spl_symbol_t symbol
|
|||||||
spl_symbol_t old = {0};
|
spl_symbol_t old = {0};
|
||||||
spl_scope_node_t *node = &vec_at(scope->scopes, id);
|
spl_scope_node_t *node = &vec_at(scope->scopes, id);
|
||||||
if (map_get(node->symbols, symbol.name, &old)) {
|
if (map_get(node->symbols, symbol.name, &old)) {
|
||||||
// spl_type_def(sema->type, old); TODO debug node
|
// spl_def_node(sema->type, old); TODO debug node
|
||||||
SPL_ERROR(&(spl_dbg_node_t){0}, "find same symbol %s", symbol.name);
|
SPL_ERROR(&(spl_dbg_node_t){0}, "find same symbol %s", symbol.name);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -61,7 +61,7 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
case SPL_AST_CONTAINER_MEMBERS: {
|
case SPL_AST_CONTAINER_MEMBERS: {
|
||||||
symbol.name = "$file";
|
symbol.name = "$file";
|
||||||
symbol.kind = SPL_SYMBOL_KIND_TYPE;
|
symbol.kind = SPL_SYMBOL_KIND_TYPE;
|
||||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_AGG, "$file", n->dbg, ref);
|
symbol.node = spl_def_alloc(sema->type, SPL_DEF_AGG, "$file", n->dbg, ref);
|
||||||
n->resolved_def_id = symbol.node;
|
n->resolved_def_id = symbol.node;
|
||||||
|
|
||||||
spl_scope_id_t scope_id = spl_scope_alloc(sema->scope);
|
spl_scope_id_t scope_id = spl_scope_alloc(sema->scope);
|
||||||
@@ -86,7 +86,7 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
case SPL_AST_TYPE_UNION:
|
case SPL_AST_TYPE_UNION:
|
||||||
case SPL_AST_TYPE_ENUM:
|
case SPL_AST_TYPE_ENUM:
|
||||||
case SPL_AST_TYPE_SHAPE: /* TODO for shape */
|
case SPL_AST_TYPE_SHAPE: /* TODO for shape */
|
||||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_AGG, symbol.name, te->dbg, ref);
|
symbol.node = spl_def_alloc(sema->type, SPL_DEF_AGG, symbol.name, te->dbg, ref);
|
||||||
n->resolved_def_id = symbol.node;
|
n->resolved_def_id = symbol.node;
|
||||||
spl_scope_id_t scope_id = spl_scope_alloc(sema->scope);
|
spl_scope_id_t scope_id = spl_scope_alloc(sema->scope);
|
||||||
spl_scope_id_t old_id = sema->scope->current_scope;
|
spl_scope_id_t old_id = sema->scope->current_scope;
|
||||||
@@ -99,7 +99,7 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
sema->scope->current_scope = old_id;
|
sema->scope->current_scope = old_id;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_SCALAR, symbol.name, te->dbg, ref);
|
symbol.node = spl_def_alloc(sema->type, SPL_DEF_SCALAR, symbol.name, te->dbg, ref);
|
||||||
n->resolved_def_id = symbol.node;
|
n->resolved_def_id = symbol.node;
|
||||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||||
break;
|
break;
|
||||||
@@ -109,7 +109,7 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
case SPL_AST_FN_DEFINE: {
|
case SPL_AST_FN_DEFINE: {
|
||||||
symbol.name = n->fn_decl.name;
|
symbol.name = n->fn_decl.name;
|
||||||
symbol.kind = SPL_SYMBOL_KIND_FN;
|
symbol.kind = SPL_SYMBOL_KIND_FN;
|
||||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_FN_PARAMS, symbol.name, n->dbg, ref);
|
symbol.node = spl_def_alloc(sema->type, SPL_DEF_FN, symbol.name, n->dbg, ref);
|
||||||
n->resolved_def_id = symbol.node;
|
n->resolved_def_id = symbol.node;
|
||||||
// TODO same type avaliable insert twice for decl and define but define must only once
|
// TODO same type avaliable insert twice for decl and define but define must only once
|
||||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||||
@@ -118,7 +118,7 @@ static void sema_collect(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
case SPL_AST_CONST_DECL: {
|
case SPL_AST_CONST_DECL: {
|
||||||
symbol.name = n->var_const_decl.name;
|
symbol.name = n->var_const_decl.name;
|
||||||
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
||||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
symbol.node = spl_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
||||||
n->resolved_def_id = symbol.node;
|
n->resolved_def_id = symbol.node;
|
||||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||||
} break;
|
} break;
|
||||||
@@ -304,7 +304,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
spl_type_id_t fntid = spl_type_builder_fn(
|
spl_type_id_t fntid = spl_type_builder_fn(
|
||||||
sema->type, ret_id, vec_unsafe_get_data(params_type), vec_size(params_type));
|
sema->type, ret_id, vec_unsafe_get_data(params_type), vec_size(params_type));
|
||||||
// Move params_type don't need free
|
// Move params_type don't need free
|
||||||
spl_type_def_resolve(sema->type, n->resolved_def_id, fntid);
|
spl_def_resolve(sema->type, n->resolved_def_id, fntid);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPL_AST_FN_DEFINE: {
|
case SPL_AST_FN_DEFINE: {
|
||||||
@@ -329,7 +329,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
vec_push(params_type, tid);
|
vec_push(params_type, tid);
|
||||||
|
|
||||||
if (node->resolved_def_id) {
|
if (node->resolved_def_id) {
|
||||||
spl_type_def_resolve(sema->type, node->resolved_def_id, tid);
|
spl_def_resolve(sema->type, node->resolved_def_id, tid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spl_type_id_t ret_id = sema_parse(sema, n->fn_decl.type_expr);
|
spl_type_id_t ret_id = sema_parse(sema, n->fn_decl.type_expr);
|
||||||
@@ -337,7 +337,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
spl_type_id_t fntid = spl_type_builder_fn(
|
spl_type_id_t fntid = spl_type_builder_fn(
|
||||||
sema->type, ret_id, vec_unsafe_get_data(params_type), vec_size(params_type));
|
sema->type, ret_id, vec_unsafe_get_data(params_type), vec_size(params_type));
|
||||||
// Move params_type don't need free
|
// Move params_type don't need free
|
||||||
spl_type_def_resolve(sema->type, n->resolved_def_id, fntid);
|
spl_def_resolve(sema->type, n->resolved_def_id, fntid);
|
||||||
|
|
||||||
spl_type_id_t old_ret = sema->current_fn_ret_tid;
|
spl_type_id_t old_ret = sema->current_fn_ret_tid;
|
||||||
sema->current_fn_ret_tid = ret_id;
|
sema->current_fn_ret_tid = ret_id;
|
||||||
@@ -384,7 +384,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
spl_type_builder_int(sema->type, 32, 1), layout);
|
spl_type_builder_int(sema->type, 32, 1), layout);
|
||||||
// Move members don't need free
|
// Move members don't need free
|
||||||
|
|
||||||
spl_type_def_resolve(sema->type, n->resolved_def_id, tid);
|
spl_def_resolve(sema->type, n->resolved_def_id, tid);
|
||||||
/* 第二遍:方法 body(struct 类型已 resolve,可引用自身类型) */
|
/* 第二遍:方法 body(struct 类型已 resolve,可引用自身类型) */
|
||||||
vec_for(te->type_expr.aggregate_list, i) {
|
vec_for(te->type_expr.aggregate_list, i) {
|
||||||
spl_ast_node_ref_t mref = vec_at(te->type_expr.aggregate_list, i);
|
spl_ast_node_ref_t mref = vec_at(te->type_expr.aggregate_list, i);
|
||||||
@@ -401,7 +401,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
break;
|
break;
|
||||||
default: {
|
default: {
|
||||||
spl_type_id_t tid = sema_parse(sema, n->type_decl.type_expr);
|
spl_type_id_t tid = sema_parse(sema, n->type_decl.type_expr);
|
||||||
spl_type_def_resolve(sema->type, n->resolved_def_id, tid);
|
spl_def_resolve(sema->type, n->resolved_def_id, tid);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -412,7 +412,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
spl_symbol_t symbol = {0};
|
spl_symbol_t symbol = {0};
|
||||||
symbol.name = n->var_const_decl.name;
|
symbol.name = n->var_const_decl.name;
|
||||||
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
||||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
symbol.node = spl_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
||||||
n->resolved_def_id = symbol.node;
|
n->resolved_def_id = symbol.node;
|
||||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||||
}
|
}
|
||||||
@@ -431,7 +431,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
SPL_ERROR(&n->dbg, "decl type must not none %d");
|
SPL_ERROR(&n->dbg, "decl type must not none %d");
|
||||||
sema->error_count += 1;
|
sema->error_count += 1;
|
||||||
}
|
}
|
||||||
spl_type_def_resolve(sema->type, n->resolved_def_id, decl_tid);
|
spl_def_resolve(sema->type, n->resolved_def_id, decl_tid);
|
||||||
} break;
|
} break;
|
||||||
case SPL_AST_MEMBER_DECL: {
|
case SPL_AST_MEMBER_DECL: {
|
||||||
/* 字段/变体不建 def, 类型由 TYPE_DECL 组装成员时统一构造 */
|
/* 字段/变体不建 def, 类型由 TYPE_DECL 组装成员时统一构造 */
|
||||||
@@ -449,7 +449,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
spl_symbol_t symbol = {0};
|
spl_symbol_t symbol = {0};
|
||||||
symbol.name = n->param_decl.name;
|
symbol.name = n->param_decl.name;
|
||||||
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
||||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
symbol.node = spl_def_alloc(sema->type, SPL_DEF_VAR, symbol.name, n->dbg, ref);
|
||||||
n->resolved_def_id = symbol.node;
|
n->resolved_def_id = symbol.node;
|
||||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||||
}
|
}
|
||||||
@@ -457,7 +457,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
if (n->param_decl.type_expr) {
|
if (n->param_decl.type_expr) {
|
||||||
ptid = sema_parse(sema, n->param_decl.type_expr);
|
ptid = sema_parse(sema, n->param_decl.type_expr);
|
||||||
}
|
}
|
||||||
spl_type_def_resolve(sema->type, n->resolved_def_id, ptid);
|
spl_def_resolve(sema->type, n->resolved_def_id, ptid);
|
||||||
return ptid;
|
return ptid;
|
||||||
} break;
|
} break;
|
||||||
case SPL_AST_ATTR_ITEM:
|
case SPL_AST_ATTR_ITEM:
|
||||||
@@ -526,8 +526,8 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
spl_symbol_t symbol = {0};
|
spl_symbol_t symbol = {0};
|
||||||
symbol.name = vname;
|
symbol.name = vname;
|
||||||
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
symbol.kind = SPL_SYMBOL_KIND_VAR;
|
||||||
symbol.node = spl_type_def_alloc(sema->type, SPL_DEF_VAR, vname, n->dbg, eref);
|
symbol.node = spl_def_alloc(sema->type, SPL_DEF_VAR, vname, n->dbg, eref);
|
||||||
spl_type_def_resolve(sema->type, symbol.node, etid);
|
spl_def_resolve(sema->type, symbol.node, etid);
|
||||||
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
spl_scope_insert(sema->scope, sema->scope->current_scope, symbol);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -894,7 +894,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
}
|
}
|
||||||
Assert(symbol.node != 0);
|
Assert(symbol.node != 0);
|
||||||
n->resolved_def_id = symbol.node;
|
n->resolved_def_id = symbol.node;
|
||||||
spl_def_node_t *d = spl_type_def(sema->type, symbol.node);
|
spl_def_node_t *d = spl_def_node(sema->type, symbol.node);
|
||||||
Assert(d != 0);
|
Assert(d != 0);
|
||||||
return d->type_id;
|
return d->type_id;
|
||||||
}
|
}
|
||||||
@@ -911,7 +911,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
sema->error_count++;
|
sema->error_count++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
spl_def_node_t *d = spl_type_def(sema->type, sym.node);
|
spl_def_node_t *d = spl_def_node(sema->type, sym.node);
|
||||||
spl_type_id_t tid = d ? d->type_id : 0;
|
spl_type_id_t tid = d ? d->type_id : 0;
|
||||||
spl_type_node_t *tn = spl_type_node(sema->type, tid);
|
spl_type_node_t *tn = spl_type_node(sema->type, tid);
|
||||||
if (!tn || (tn->kind != SPL_TYPE_STRUCT && tn->kind != SPL_TYPE_UNION)) {
|
if (!tn || (tn->kind != SPL_TYPE_STRUCT && tn->kind != SPL_TYPE_UNION)) {
|
||||||
@@ -987,7 +987,7 @@ static spl_type_id_t sema_parse(spl_sema_t *sema, spl_ast_node_ref_t ref) {
|
|||||||
if (vec_size(n->type_expr.type_path.ident_vec) == 1) {
|
if (vec_size(n->type_expr.type_path.ident_vec) == 1) {
|
||||||
spl_symbol_t sym = {0};
|
spl_symbol_t sym = {0};
|
||||||
if (spl_scope_find(sema->scope, tname, &sym)) {
|
if (spl_scope_find(sema->scope, tname, &sym)) {
|
||||||
spl_def_node_t *d = spl_type_def(sema->type, sym.node);
|
spl_def_node_t *d = spl_def_node(sema->type, sym.node);
|
||||||
if (d && d->type_id) {
|
if (d && d->type_id) {
|
||||||
n->resolved_type_id = d->type_id;
|
n->resolved_type_id = d->type_id;
|
||||||
return d->type_id;
|
return d->type_id;
|
||||||
@@ -1136,7 +1136,7 @@ void spl_sema_dump(spl_sema_t *sema) {
|
|||||||
vec_for(sema->type->def_table, i) {
|
vec_for(sema->type->def_table, i) {
|
||||||
printf(" def#%zu ", i);
|
printf(" def#%zu ", i);
|
||||||
spl_type_def_dump(sema->type, i);
|
spl_type_def_dump(sema->type, i);
|
||||||
spl_def_node_t *d = spl_type_def(sema->type, i);
|
spl_def_node_t *d = spl_def_node(sema->type, i);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+7
-7
@@ -304,7 +304,7 @@ spl_type_id_t spl_type_builder_agg(spl_type_t *type, spl_type_node_kind_t tk,
|
|||||||
return spl_type_node_push(type, &tn);
|
return spl_type_node_push(type, &tn);
|
||||||
}
|
}
|
||||||
|
|
||||||
spl_def_id_t spl_type_def_alloc(spl_type_t *type, spl_def_node_kind_t kind, const char *name,
|
spl_def_id_t spl_def_alloc(spl_type_t *type, spl_def_node_kind_t kind, const char *name,
|
||||||
spl_dbg_node_t dbg, usize ast_node_ref) {
|
spl_dbg_node_t dbg, usize ast_node_ref) {
|
||||||
spl_def_node_t n = {0};
|
spl_def_node_t n = {0};
|
||||||
n.kind = kind;
|
n.kind = kind;
|
||||||
@@ -315,8 +315,8 @@ spl_def_id_t spl_type_def_alloc(spl_type_t *type, spl_def_node_kind_t kind, cons
|
|||||||
return vec_size(type->def_table) - 1;
|
return vec_size(type->def_table) - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void spl_type_def_resolve(spl_type_t *type, spl_def_id_t id, spl_type_id_t tid) {
|
void spl_def_resolve(spl_type_t *type, spl_def_id_t id, spl_type_id_t tid) {
|
||||||
spl_def_node_t *d = spl_type_def(type, id);
|
spl_def_node_t *d = spl_def_node(type, id);
|
||||||
if (!d) {
|
if (!d) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -383,7 +383,7 @@ spl_type_node_t *spl_type_node(spl_type_t *type, spl_type_id_t id) {
|
|||||||
return &vec_at(type->type_table, id);
|
return &vec_at(type->type_table, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
spl_def_node_t *spl_type_def(spl_type_t *type, spl_def_id_t id) {
|
spl_def_node_t *spl_def_node(spl_type_t *type, spl_def_id_t id) {
|
||||||
if (!id || id >= vec_size(type->def_table))
|
if (!id || id >= vec_size(type->def_table))
|
||||||
return NULL;
|
return NULL;
|
||||||
return &vec_at(type->def_table, id);
|
return &vec_at(type->def_table, id);
|
||||||
@@ -497,7 +497,7 @@ void spl_type_pure_dump(spl_type_t *type, spl_type_id_t id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void spl_type_def_dump(spl_type_t *type, spl_def_id_t id) {
|
void spl_type_def_dump(spl_type_t *type, spl_def_id_t id) {
|
||||||
spl_def_node_t *node = spl_type_def(type, id);
|
spl_def_node_t *node = spl_def_node(type, id);
|
||||||
if (!node) {
|
if (!node) {
|
||||||
printf("none");
|
printf("none");
|
||||||
return;
|
return;
|
||||||
@@ -517,8 +517,8 @@ void spl_type_def_dump(spl_type_t *type, spl_def_id_t id) {
|
|||||||
case SPL_DEF_VAR:
|
case SPL_DEF_VAR:
|
||||||
def_kind_name = "var";
|
def_kind_name = "var";
|
||||||
break;
|
break;
|
||||||
case SPL_DEF_FN_PARAMS:
|
case SPL_DEF_FN:
|
||||||
def_kind_name = "fn_params";
|
def_kind_name = "fn";
|
||||||
break;
|
break;
|
||||||
case SPL_DEF_AGG:
|
case SPL_DEF_AGG:
|
||||||
def_kind_name = "agg";
|
def_kind_name = "agg";
|
||||||
|
|||||||
+4
-4
@@ -83,7 +83,7 @@ typedef enum {
|
|||||||
SPL_DEF_SCALAR,
|
SPL_DEF_SCALAR,
|
||||||
SPL_DEF_MEMBER,
|
SPL_DEF_MEMBER,
|
||||||
SPL_DEF_VAR,
|
SPL_DEF_VAR,
|
||||||
SPL_DEF_FN_PARAMS,
|
SPL_DEF_FN,
|
||||||
SPL_DEF_AGG, // include enum variants
|
SPL_DEF_AGG, // include enum variants
|
||||||
SPL_DEF_DISTINCT, // newtype
|
SPL_DEF_DISTINCT, // newtype
|
||||||
SPL_DEF_ALIAS, // sametypes
|
SPL_DEF_ALIAS, // sametypes
|
||||||
@@ -112,11 +112,11 @@ void spl_type_def_dump(spl_type_t *type, spl_def_id_t id);
|
|||||||
void spl_type_pure_dump(spl_type_t *type, spl_type_id_t id);
|
void spl_type_pure_dump(spl_type_t *type, spl_type_id_t id);
|
||||||
|
|
||||||
spl_type_node_t *spl_type_node(spl_type_t *type, spl_type_id_t id);
|
spl_type_node_t *spl_type_node(spl_type_t *type, spl_type_id_t id);
|
||||||
spl_def_node_t *spl_type_def(spl_type_t *type, spl_def_id_t id);
|
spl_def_node_t *spl_def_node(spl_type_t *type, spl_def_id_t id);
|
||||||
|
|
||||||
spl_type_id_t spl_type_def_alloc(spl_type_t *type, spl_def_node_kind_t kind, const char *name,
|
spl_type_id_t spl_def_alloc(spl_type_t *type, spl_def_node_kind_t kind, const char *name,
|
||||||
spl_dbg_node_t dbg, usize ast_node_ref);
|
spl_dbg_node_t dbg, usize ast_node_ref);
|
||||||
void spl_type_def_resolve(spl_type_t *type, spl_def_id_t id, spl_type_id_t tid);
|
void spl_def_resolve(spl_type_t *type, spl_def_id_t id, spl_type_id_t tid);
|
||||||
|
|
||||||
spl_type_id_t spl_type_fn_param_tid(spl_type_t *type, spl_type_id_t fn_tid, usize idx);
|
spl_type_id_t spl_type_fn_param_tid(spl_type_t *type, spl_type_id_t fn_tid, usize idx);
|
||||||
const spl_type_member_t *spl_type_agg_member(spl_type_t *type, spl_type_id_t tid, const char *name);
|
const spl_type_member_t *spl_type_agg_member(spl_type_t *type, spl_type_id_t tid, const char *name);
|
||||||
|
|||||||
Reference in new issue
Block a user