stage1 vm abi更新 修复更多问题
This commit is contained in:
1 parent
09d05e3a34
commit
f6a0bce9f0
6 files changed
+124
-60
No files matched your search
+27
-1
@@ -630,6 +630,16 @@ static spl_ir_node_ref_t emit_expr_raw(spl_ast2ir_t *a, spl_ast_node_ref_t ref)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
case SPL_OP_BOOL_OR: {
|
||||
spl_ast_node_t *bmln = spl_ast_node(a->sema->ast, n->binary.left);
|
||||
spl_type_id_t op_tid = bmln ? node_ir(a, bmln) : 0;
|
||||
return spl_ir_builder_arith_or(a->ir, op_tid, l, r);
|
||||
}
|
||||
case SPL_OP_BOOL_AND: {
|
||||
spl_ast_node_t *bmln = spl_ast_node(a->sema->ast, n->binary.left);
|
||||
spl_type_id_t op_tid = bmln ? node_ir(a, bmln) : 0;
|
||||
return spl_ir_builder_arith_and(a->ir, op_tid, l, r);
|
||||
}
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
@@ -888,7 +898,23 @@ 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);
|
||||
|
||||
spl_ir_node_ref_t base = emit_lvalue(a, n->slice.obj);
|
||||
/* 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;
|
||||
spl_type_id_t ptr_ir = spl_type_builder_ptr((spl_type_t *)a->sema->type, elem_ir);
|
||||
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)
|
||||
return 0;
|
||||
|
||||
|
||||
Reference in new issue
Block a user