stage1 重写进行代码设计并重构 提供diag替换老旧错误处理
This commit is contained in:
1 parent
7cbe2d2b9a
commit
e4347cc3ea
14 files changed
+983
-526
No files matched your search
+24
-87
@@ -39,9 +39,8 @@ static spl_ir_node_ref_t ast2ir_emit_cast_builtin(spl_ast2ir_t *a, spl_ast_node_
|
||||
spl_type_id_t tt, spl_ir_node_ref_t v);
|
||||
static spl_ir_node_ref_t emit_cast(spl_ast2ir_t *a, spl_ast_node_t *n);
|
||||
static spl_ir_node_ref_t emit_expr_raw(spl_ast2ir_t *a, spl_ast_node_ref_t ref);
|
||||
static spl_ir_node_ref_t emit_if_expr(spl_ast2ir_t *a, spl_ast_node_ref_t ref);
|
||||
static spl_ir_node_ref_t emit_implicit_cast(spl_ast2ir_t *a, spl_type_id_t ft, spl_type_id_t tt,
|
||||
spl_ir_node_ref_t v);
|
||||
static spl_ir_node_ref_t emit_implicit_cast(spl_ast2ir_t *a, spl_ast_node_t *n, spl_type_id_t ft,
|
||||
spl_type_id_t tt, spl_ir_node_ref_t v);
|
||||
|
||||
static spl_ir_node_ref_t ast2ir_intrin_call(spl_ast2ir_t *a, spl_ast_node_t *n, spl_intrin_t in,
|
||||
spl_ast_node_ref_vec_t *args);
|
||||
@@ -111,6 +110,7 @@ static spl_ir_node_ref_t emit_zero_value(spl_ast2ir_t *a, spl_type_id_t tid) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void copy_attrs_to_ir_node(spl_ast2ir_t *a, spl_ast_node_t *n, spl_ir_node_ref_t ir_ref) {
|
||||
if (!ir_ref || !n || vec_size(n->attrs) == 0)
|
||||
return;
|
||||
@@ -135,7 +135,8 @@ static spl_ir_node_ref_t ast2ir_intrin_cast(spl_ast2ir_t *a, spl_ast_node_t *n,
|
||||
spl_ast_node_ref_vec_t *args) {
|
||||
usize nargs = vec_size(*args);
|
||||
if (nargs < 1) {
|
||||
SPL_ERROR(&n->dbg, "cast builtin requires at least 1 argument");
|
||||
spl_diag_error(a->diag, SPL_DIAG_KIND_INTRIN_ARG_COUNT, &n->dbg,
|
||||
"cast builtin requires at least 1 argument");
|
||||
return 0;
|
||||
}
|
||||
spl_ir_node_ref_t v = emit_expr(a, vec_at(*args, 0));
|
||||
@@ -149,7 +150,6 @@ static spl_ir_node_ref_t ast2ir_intrin_cast(spl_ast2ir_t *a, spl_ast_node_t *n,
|
||||
spl_ast_node_t *targ = spl_ast_node(a->sema->ast, vec_at(*args, 1));
|
||||
tt = node_ir(a, targ);
|
||||
} else {
|
||||
/* 单参数形式:目标类型由 sema 在节点上标好的 resolved 类型给出 */
|
||||
tt = node_ir(a, n);
|
||||
}
|
||||
if (!ft || !tt)
|
||||
@@ -287,7 +287,6 @@ static spl_ir_node_ref_t emit_lvalue(spl_ast2ir_t *a, spl_ast_node_ref_t ref) {
|
||||
case SPL_AST_EXPR_UNARY: {
|
||||
if (n->unary.op != SPL_UNARY_OP_DEREF)
|
||||
return 0;
|
||||
/* *p 作为左值,地址就是指针 p 的值 */
|
||||
return emit_expr(a, n->unary.operand);
|
||||
}
|
||||
case SPL_AST_EXPR_FIELD: {
|
||||
@@ -302,7 +301,7 @@ static spl_ir_node_ref_t emit_lvalue(spl_ast2ir_t *a, spl_ast_node_ref_t ref) {
|
||||
spl_lang_type_id_t obj_elem = (obj_kind == SPL_LANG_TYPE_PTR) ? obj_ln->extra.elem : 0;
|
||||
|
||||
if (spl_intrin_lookup_field(obj_kind, n->field.field) != SPL_INTRIN_NONE)
|
||||
return 0; /* 内建字段不是左值 */
|
||||
return 0;
|
||||
|
||||
spl_ir_node_ref_t base = 0;
|
||||
spl_lang_type_id_t agg_lang = 0;
|
||||
@@ -430,7 +429,7 @@ static spl_ir_node_ref_t ast2ir_emit_cast_builtin(spl_ast2ir_t *a, spl_ast_node_
|
||||
case SPL_INTRIN_PTR_CAST:
|
||||
return spl_ir_builder_cast_bitcast(a->ir, ft, tt, v);
|
||||
default:
|
||||
SPL_ERROR(&n->dbg, "as: unknown cast builtin");
|
||||
spl_diag_error(a->diag, SPL_DIAG_KIND_INTERNAL, &n->dbg, "ast2ir: unknown cast builtin");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@@ -448,7 +447,8 @@ static spl_ir_node_ref_t emit_cast(spl_ast2ir_t *a, spl_ast_node_t *n) {
|
||||
|
||||
spl_intrin_t in = spl_intrin_lookup_cast(a->sema->type, ft, tt);
|
||||
if (in == SPL_INTRIN_NONE) {
|
||||
SPL_ERROR(&n->dbg, "as: no conversion between the given types");
|
||||
spl_diag_error(a->diag, SPL_DIAG_KIND_CAST_INVALID, &n->dbg,
|
||||
"as: no conversion between the given types");
|
||||
return 0;
|
||||
}
|
||||
return ast2ir_emit_cast_builtin(a, n, in, ft, tt, v);
|
||||
@@ -475,7 +475,7 @@ static spl_ir_node_ref_t emit_expr(spl_ast2ir_t *a, spl_ast_node_ref_t ref) {
|
||||
if (!from_ir || !to_ir || from_ir == to_ir)
|
||||
return val;
|
||||
|
||||
return emit_implicit_cast(a, from_ir, to_ir, val);
|
||||
return emit_implicit_cast(a, n, from_ir, to_ir, val);
|
||||
}
|
||||
|
||||
static spl_ir_node_ref_t emit_expr_raw(spl_ast2ir_t *a, spl_ast_node_ref_t ref) {
|
||||
@@ -485,8 +485,6 @@ static spl_ir_node_ref_t emit_expr_raw(spl_ast2ir_t *a, spl_ast_node_ref_t ref)
|
||||
|
||||
switch (n->kind) {
|
||||
case SPL_AST_EXPR_INT_LIT: {
|
||||
/* 节点经 coerce 后 resolved 可能是具体 int 或 float。
|
||||
* 值始终存在 int_lit.bits(补码);按 resolved 决定如何构造 IR 常量。 */
|
||||
spl_type_id_t it = node_ir(a, n);
|
||||
spl_type_node_t *itn = spl_type_node(a->sema->type, it);
|
||||
if (itn && itn->kind == SPL_TYPE_FLOAT) {
|
||||
@@ -673,7 +671,6 @@ static spl_ir_node_ref_t emit_expr_raw(spl_ast2ir_t *a, spl_ast_node_ref_t ref)
|
||||
case SPL_OP_CMP_LE:
|
||||
case SPL_OP_CMP_GT:
|
||||
case SPL_OP_CMP_GE: {
|
||||
/* 比较的操作数类型从左侧子节点读(sema 已 coerce 到共同类型) */
|
||||
spl_ast_node_t *cmln = spl_ast_node(a->sema->ast, n->binary.left);
|
||||
spl_type_id_t op_tid = cmln ? node_ir(a, cmln) : 0;
|
||||
switch (op) {
|
||||
@@ -719,14 +716,12 @@ static spl_ir_node_ref_t emit_expr_raw(spl_ast2ir_t *a, spl_ast_node_ref_t ref)
|
||||
if (!fn)
|
||||
return 0;
|
||||
|
||||
/* 先求所有参数 */
|
||||
usize nargs = vec_size(n->call.args);
|
||||
spl_ir_node_ref_vec_t arg_refs;
|
||||
vec_init(arg_refs);
|
||||
for (usize i = 0; i < nargs; ++i)
|
||||
vec_push(arg_refs, emit_expr(a, vec_at(n->call.args, i)));
|
||||
|
||||
/* 再创建 call 节点 */
|
||||
spl_type_id_t ret_t = node_ir(a, n);
|
||||
spl_ir_node_ref_t call = spl_ir_builder_control_call(a->ir, ret_t, fn);
|
||||
if (!call) {
|
||||
@@ -960,13 +955,10 @@ static spl_ir_node_ref_t emit_expr_raw(spl_ast2ir_t *a, spl_ast_node_ref_t ref)
|
||||
spl_lang_type_id_t usize_lang = spl_lang_make_int(a->sema->type, sizeof(void *) * 8, 0);
|
||||
spl_type_id_t usize_ir = to_ir_type(a, usize_lang);
|
||||
|
||||
/* base = 元素数据首地址 */
|
||||
spl_ir_node_ref_t base = 0;
|
||||
if (obj_kind == SPL_LANG_TYPE_PTR) {
|
||||
/* ptr 值本身就是首元素地址 */
|
||||
base = emit_expr(a, n->slice.obj);
|
||||
} else if (obj_kind == SPL_LANG_TYPE_SLICE) {
|
||||
/* 取 slice 的 ptr 字段 */
|
||||
spl_ir_node_ref_t slice_val = emit_expr(a, n->slice.obj);
|
||||
if (!slice_val)
|
||||
return 0;
|
||||
@@ -974,7 +966,6 @@ static spl_ir_node_ref_t emit_expr_raw(spl_ast2ir_t *a, spl_ast_node_ref_t ref)
|
||||
base = spl_ir_builder_agg_extract(a->ir, obj_ir, ptr_ir, SPL_SLICE_PTR_FIELD_IDX,
|
||||
slice_val);
|
||||
} else {
|
||||
/* ARRAY:&arr 即首元素地址 */
|
||||
base = emit_lvalue(a, n->slice.obj);
|
||||
}
|
||||
if (!base)
|
||||
@@ -1032,60 +1023,6 @@ static spl_ir_node_ref_t emit_expr_raw(spl_ast2ir_t *a, spl_ast_node_ref_t ref)
|
||||
}
|
||||
}
|
||||
|
||||
static spl_ir_node_ref_t emit_if_expr(spl_ast2ir_t *a, spl_ast_node_ref_t ref) {
|
||||
spl_ast_node_t *n = spl_ast_node(a->sema->ast, ref);
|
||||
if (!n || n->kind != SPL_AST_EXPR_IF)
|
||||
return 0;
|
||||
|
||||
spl_type_id_t if_t = node_ir(a, n);
|
||||
spl_type_node_t *if_tn = if_t ? spl_type_node(a->sema->type, if_t) : NULL;
|
||||
/* 只有 when 有非 unit 值时(作为表达式使用),才分配 result_slot */
|
||||
bool need_result = if_tn && if_tn->kind != SPL_TYPE_UNIT;
|
||||
|
||||
spl_ir_node_ref_t result_slot = 0;
|
||||
if (need_result)
|
||||
result_slot = spl_ir_builder_mem_alloca(a->ir, if_t, const_usize(a, 1));
|
||||
|
||||
spl_ir_node_ref_t cond = emit_expr(a, n->if_expr.cond);
|
||||
if (!cond)
|
||||
Panic("if cond emit failed");
|
||||
spl_ir_node_ref_t br = spl_ir_builder_control_br(a->ir, cond);
|
||||
spl_ir_builder_block_end(a->ir);
|
||||
|
||||
usize then_blk = spl_ir_builder_block_begin(a->ir);
|
||||
spl_ir_node_ref_t then_v = 0;
|
||||
if (n->if_expr.then_block)
|
||||
then_v = emit_expr(a, n->if_expr.then_block);
|
||||
if (result_slot && then_v)
|
||||
spl_ir_builder_mem_store(a->ir, if_t, result_slot, then_v);
|
||||
spl_ir_node_ref_t then_end = 0;
|
||||
if (!a->ir->terminated)
|
||||
then_end = spl_ir_builder_control_jmp(a->ir);
|
||||
spl_ir_builder_block_end(a->ir);
|
||||
|
||||
usize else_blk = spl_ir_builder_block_begin(a->ir);
|
||||
spl_ir_node_ref_t else_v = 0;
|
||||
if (n->if_expr.else_branch)
|
||||
else_v = emit_expr(a, n->if_expr.else_branch);
|
||||
if (result_slot && else_v)
|
||||
spl_ir_builder_mem_store(a->ir, if_t, result_slot, else_v);
|
||||
spl_ir_node_ref_t else_end = 0;
|
||||
if (!a->ir->terminated)
|
||||
else_end = spl_ir_builder_control_jmp(a->ir);
|
||||
spl_ir_builder_block_end(a->ir);
|
||||
|
||||
usize merge_blk = spl_ir_builder_block_begin(a->ir);
|
||||
spl_ir_builder_control_br_fixup(a->ir, br, then_blk, else_blk);
|
||||
if (then_end)
|
||||
spl_ir_builder_control_jmp_fixup(a->ir, then_end, merge_blk);
|
||||
if (else_end)
|
||||
spl_ir_builder_control_jmp_fixup(a->ir, else_end, merge_blk);
|
||||
|
||||
if (!result_slot)
|
||||
return 0;
|
||||
return spl_ir_builder_mem_load(a->ir, if_t, result_slot);
|
||||
}
|
||||
|
||||
static spl_ir_node_ref_t emit_if_like(spl_ast2ir_t *a, spl_ast_node_ref_t ref) {
|
||||
spl_ast_node_t *n = spl_ast_node(a->sema->ast, ref);
|
||||
if (!n)
|
||||
@@ -1179,8 +1116,6 @@ static spl_ir_node_ref_t emit_loop_like(spl_ast2ir_t *a, spl_ast_node_ref_t ref)
|
||||
pre_jmp = spl_ir_builder_control_jmp(a->ir);
|
||||
spl_ir_builder_block_end(a->ir);
|
||||
|
||||
/* while 需要独立 head 块(含 cond + br);
|
||||
loop 没有头块,body_blk 同时是入口和回跳目标 */
|
||||
usize head_blk = 0;
|
||||
spl_ir_node_ref_t br = 0;
|
||||
|
||||
@@ -1198,7 +1133,6 @@ static spl_ir_node_ref_t emit_loop_like(spl_ast2ir_t *a, spl_ast_node_ref_t ref)
|
||||
|
||||
spl_loop_ctx_t ctx = {0};
|
||||
ctx.cont_blk = cont_blk;
|
||||
ctx.brk_blk = 0;
|
||||
ctx.label = NULL;
|
||||
ctx.result_slot = result_slot;
|
||||
ctx.result_tid = result_t;
|
||||
@@ -1272,7 +1206,6 @@ static void emit_break_stmt(spl_ast2ir_t *a, spl_ast_node_t *n) {
|
||||
if (!target)
|
||||
return;
|
||||
|
||||
/* 有值 loop:先把 break 值写入 result_slot 再跳转 */
|
||||
if (n->statement_break.expr && target->result_slot) {
|
||||
spl_ir_node_ref_t bv = emit_expr(a, n->statement_break.expr);
|
||||
if (bv)
|
||||
@@ -1292,12 +1225,10 @@ static void emit_stmt(spl_ast2ir_t *a, spl_ast_node_ref_t ref) {
|
||||
case SPL_AST_STATEMENT_RET: {
|
||||
spl_type_id_t ret_ir = to_ir_type(a, a->cur_ret_lang);
|
||||
|
||||
/* 先求值 ret 表达式,结果保存在 v 中 */
|
||||
spl_ir_node_ref_t v = 0;
|
||||
if (n->statement_ret.expr)
|
||||
v = emit_expr(a, n->statement_ret.expr);
|
||||
|
||||
/* 再执行 defer(LIFO),只清空当前函数注册的 defer */
|
||||
while (vec_size(a->defer_stack) > a->cur_defer_base) {
|
||||
spl_ast_node_ref_t d = vec_pop(a->defer_stack);
|
||||
emit_stmt(a, d);
|
||||
@@ -1620,8 +1551,8 @@ static void emit_container_body(spl_ast2ir_t *a, spl_ast_node_ref_t ref) {
|
||||
}
|
||||
}
|
||||
|
||||
static spl_ir_node_ref_t emit_implicit_cast(spl_ast2ir_t *a, spl_type_id_t ft, spl_type_id_t tt,
|
||||
spl_ir_node_ref_t v) {
|
||||
static spl_ir_node_ref_t emit_implicit_cast(spl_ast2ir_t *a, spl_ast_node_t *n, spl_type_id_t ft,
|
||||
spl_type_id_t tt, spl_ir_node_ref_t v) {
|
||||
if (!ft || !tt || ft == tt)
|
||||
return v;
|
||||
spl_type_node_t *fs = spl_type_node(a->sema->type, ft);
|
||||
@@ -1638,10 +1569,6 @@ static spl_ir_node_ref_t emit_implicit_cast(spl_ast2ir_t *a, spl_type_id_t ft, s
|
||||
return spl_ir_builder_cast_sext(a->ir, ft, tt, v);
|
||||
return spl_ir_builder_cast_zext(a->ir, ft, tt, v);
|
||||
}
|
||||
if (fs->kind == SPL_TYPE_INT && ts->kind == SPL_TYPE_FLOAT)
|
||||
return spl_ir_builder_case_int2float(a->ir, ft, tt, v);
|
||||
if (fs->kind == SPL_TYPE_FLOAT && ts->kind == SPL_TYPE_INT)
|
||||
return spl_ir_builder_case_float2int(a->ir, ft, tt, v);
|
||||
if (fs->kind == SPL_TYPE_FLOAT && ts->kind == SPL_TYPE_FLOAT) {
|
||||
if (fs->float_type.bits > ts->float_type.bits)
|
||||
return spl_ir_builder_cast_ftrunc(a->ir, ft, tt, v);
|
||||
@@ -1649,11 +1576,20 @@ static spl_ir_node_ref_t emit_implicit_cast(spl_ast2ir_t *a, spl_type_id_t ft, s
|
||||
}
|
||||
if (fs->kind == SPL_TYPE_BOOL && ts->kind == SPL_TYPE_INT)
|
||||
return spl_ir_builder_cast_bool2int(a->ir, ft, tt, v);
|
||||
|
||||
/* 指针之间:IR 层不区分 pointee,值语义相同,直接透传。
|
||||
覆盖 *never -> *T(null 字面量)和 *T -> *any。 */
|
||||
if (fs->kind == SPL_TYPE_PTR && ts->kind == SPL_TYPE_PTR)
|
||||
return v;
|
||||
|
||||
if (fs->kind == SPL_TYPE_PTR && ts->kind == SPL_TYPE_INT)
|
||||
return spl_ir_builder_cast_ptr2int(a->ir, ft, tt, v);
|
||||
if (fs->kind == SPL_TYPE_INT && ts->kind == SPL_TYPE_PTR)
|
||||
return spl_ir_builder_cast_int2ptr(a->ir, ft, tt, v);
|
||||
return spl_ir_builder_cast_bitcast(a->ir, ft, tt, v);
|
||||
|
||||
spl_diag_fatal(a->diag, SPL_DIAG_KIND_IMPLICIT_CAST_FAIL, &n->dbg,
|
||||
"implicit cast: cannot convert type#%zu -> type#%zu", ft, tt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static usize spl_int_map_hash(usize k) { return MAP_HASH_INT(k); }
|
||||
@@ -1665,9 +1601,10 @@ void spl_ast2ir_init(spl_ast2ir_t *ast2ir, spl_ir_builder_t *ir, const spl_sema_
|
||||
map_init(ast2ir->def2ir_map, spl_int_map_hash, spl_int_map_cmp);
|
||||
vec_init(ast2ir->loop_stack);
|
||||
vec_init(ast2ir->defer_stack);
|
||||
ast2ir->err_count = 0;
|
||||
ast2ir->cur_ret_lang = 0;
|
||||
ast2ir->cur_defer_base = 0;
|
||||
|
||||
ast2ir->diag = NULL;
|
||||
}
|
||||
|
||||
void spl_ast2ir_drop(spl_ast2ir_t *ast2ir) {
|
||||
|
||||
Reference in new issue
Block a user