stage2 更多底层函数 stage1 layout正确使用 内置函数重新编写

This commit is contained in:
zzy committed 2026-09-17 22:03:23 +08:00
1 parent fb0ff9b663
commit 4141e7d574
15 files changed
+2588 -122

No files matched your search

+47 -11
View File
@@ -373,6 +373,40 @@ static spl_ir_node_ref_t ast2ir_intrin_call(spl_ast2ir_t *a, spl_ast_node_t *n,
spl_ast_node_t *arg = spl_ast_node(a->ast, vec_at(*args, 0));
return spl_ir_builder_type_alignof(a->ir, node_ir(a, arg));
}
case SPL_INTRIN_ENUM2INT: {
/* enum 值 -> 其 tag(判别值);field 0 即 tag。 */
spl_ast_node_t *src = spl_ast_node(a->ast, vec_at(*args, 0));
spl_ir_node_ref_t v = emit_expr(a, vec_at(*args, 0));
if (!v)
return 0;
spl_type_id_t agg_t = node_ir(a, src);
spl_type_id_t tag_t = node_ir(a, n);
if (!agg_t || !tag_t)
return 0;
return spl_ir_builder_agg_extract(a->ir, agg_t, tag_t, 0, v);
}
case SPL_INTRIN_FIELD_COUNT: {
spl_ast_node_t *arg = spl_ast_node(a->ast, vec_at(*args, 0));
return spl_ir_builder_type_field_count(a->ir, node_ir(a, arg));
}
case SPL_INTRIN_OFFSETOF: {
spl_ast_node_t *arg = spl_ast_node(a->ast, vec_at(*args, 0));
spl_type_id_t agg_t = node_ir(a, arg);
if (!agg_t)
return 0;
spl_ast_node_t *fnode = spl_ast_node(a->ast, vec_at(*args, 1));
usize idx = 0;
if (fnode && fnode->kind == SPL_AST_EXPR_INT_LIT) {
idx = (usize)fnode->int_lit.bits;
} else if (fnode && fnode->kind == SPL_AST_EXPR_IDENT) {
if (!spl_type_agg_member_idx(&a->sema->type->ir, agg_t, fnode->ident.name, &idx))
return 0;
} else {
return 0;
}
spl_ir_node_ref_t idx_node = const_usize(a, idx);
return spl_ir_builder_type_offsetof(a->ir, agg_t, idx_node);
}
case SPL_INTRIN_ASSERT: {
spl_ir_node_ref_t cond = emit_expr(a, vec_at(*args, 0));
if (!cond)
@@ -420,11 +454,11 @@ static spl_ir_node_ref_t ast2ir_intrin_call(spl_ast2ir_t *a, spl_ast_node_t *n,
case SPL_INTRIN_TRUNCATE:
case SPL_INTRIN_BIT_CAST:
case SPL_INTRIN_FLOAT_CAST:
case SPL_INTRIN_INT_FROM_FLOAT:
case SPL_INTRIN_FLOAT_FROM_INT:
case SPL_INTRIN_INT_FROM_BOOL:
case SPL_INTRIN_INT_FROM_PTR:
case SPL_INTRIN_PTR_FROM_INT:
case SPL_INTRIN_FLOAT2INT:
case SPL_INTRIN_INT2FLOAT:
case SPL_INTRIN_BOOL2INT:
case SPL_INTRIN_PTR2INT:
case SPL_INTRIN_INT2PTR:
case SPL_INTRIN_PTR_CAST:
return ast2ir_intrin_cast(a, n, in, args);
case SPL_INTRIN_BREAKPOINT:
@@ -619,15 +653,15 @@ static spl_ir_node_ref_t ast2ir_emit_cast_builtin(spl_ast2ir_t *a, spl_ast_node_
return spl_ir_builder_cast_ftrunc(a->ir, ft, tt, v);
return spl_ir_builder_cast_fext(a->ir, ft, tt, v);
}
case SPL_INTRIN_INT_FROM_FLOAT:
case SPL_INTRIN_FLOAT2INT:
return spl_ir_builder_case_float2int(a->ir, ft, tt, v);
case SPL_INTRIN_FLOAT_FROM_INT:
case SPL_INTRIN_INT2FLOAT:
return spl_ir_builder_case_int2float(a->ir, ft, tt, v);
case SPL_INTRIN_INT_FROM_BOOL:
case SPL_INTRIN_BOOL2INT:
return spl_ir_builder_cast_bool2int(a->ir, ft, tt, v);
case SPL_INTRIN_INT_FROM_PTR:
case SPL_INTRIN_PTR2INT:
return spl_ir_builder_cast_ptr2int(a->ir, ft, tt, v);
case SPL_INTRIN_PTR_FROM_INT:
case SPL_INTRIN_INT2PTR:
return spl_ir_builder_cast_int2ptr(a->ir, ft, tt, v);
case SPL_INTRIN_PTR_CAST:
return spl_ir_builder_cast_bitcast(a->ir, ft, tt, v);
@@ -1935,10 +1969,12 @@ static spl_ir_node_ref_t emit_implicit_cast(spl_ast2ir_t *a, spl_ast_node_t *n,
static usize spl_int_map_hash(usize k) { return MAP_HASH_INT(k); }
static int spl_int_map_cmp(usize a, usize b) { return MAP_CMP_INT(a, b); }
void spl_ast2ir_init(spl_ast2ir_t *ast2ir, spl_ir_builder_t *ir, const spl_sema_t *sema) {
void spl_ast2ir_init(spl_ast2ir_t *ast2ir, spl_ir_builder_t *ir, spl_layout_t *layout,
const spl_sema_t *sema) {
ast2ir->sema = sema;
ast2ir->ir = ir;
ast2ir->ast = sema->ast;
ast2ir->layout = layout;
map_init(ast2ir->def2ir_map, spl_int_map_hash, spl_int_map_cmp);
vec_init(ast2ir->loop_stack);
vec_init(ast2ir->defer_stack);