stage2 更多底层函数 stage1 layout正确使用 内置函数重新编写
This commit is contained in:
1 parent
fb0ff9b663
commit
4141e7d574
15 files changed
+2588
-122
No files matched your search
+47
-11
@@ -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);
|
||||
|
||||
Reference in new issue
Block a user