feat(ir2mcode): 添加帧分配器框架和Windows 64位实现
添加了frame_alloc.h头文件定义帧分配器操作接口,实现了Windows 64位 平台的帧分配器实现,包括槽位分配、偏移计算和栈帧布局管理功能。 BREAKING CHANGE: 移除了旧的frame_manager.h接口,采用新的frame_alloc_ops_t 抽象接口。 fix(ast2ir): 修复字符串字面量表达式返回值问题 修复了AST到IR转换过程中字符串字面量表达式的处理,确保正确返回 创建的常量字符串值引用而非直接跳出。 fix(ir): 修复内置memcpy函数参数验证和类型比较逻辑 在IR构建器中为builtin_memcpy函数添加参数空指针检查,在类型比较 函数中添加未知类型的边界条件处理,增强系统稳定性。 refactor(ir2mcode): 重构寄存器分配器接口以支持帧分配器集成 修改寄存器分配器接口以接受帧分配器参数,统一节点到位置的映射表 命名,并提供便捷的栈大小和偏移获取接口。
This commit is contained in:
@@ -470,11 +470,12 @@ scc_ir_value_ref_t scc_ast2ir_expr(scc_ast2ir_ctx_t *ctx, scc_ast_expr_t *expr,
|
||||
}
|
||||
case SCC_AST_EXPR_STRING_LITERAL: {
|
||||
// FIXME
|
||||
scc_ir_builder_const_string(&ctx->builder, expr->literal.lexme,
|
||||
scc_strlen(expr->literal.lexme));
|
||||
scc_ir_value_ref_t value =
|
||||
scc_ir_builder_const_string(&ctx->builder, expr->literal.lexme,
|
||||
scc_strlen(expr->literal.lexme));
|
||||
if (is_lvalue)
|
||||
TODO();
|
||||
break;
|
||||
return value;
|
||||
}
|
||||
case SCC_AST_EXPR_IDENTIFIER: {
|
||||
if (expr->identifier._target == nullptr) {
|
||||
@@ -718,28 +719,35 @@ void scc_ast2ir_decl(scc_ast2ir_ctx_t *ctx, scc_ast_decl_t *decl) {
|
||||
}
|
||||
scc_ir_value_ref_t init_val_node =
|
||||
scc_ast2ir_expr(ctx, decl->var.init, false);
|
||||
Assert(init_val_node != nullptr);
|
||||
|
||||
// FIXME array auto calucate size
|
||||
scc_ir_type_t *ir_type =
|
||||
scc_ir_module_get_type(ctx->builder.ctx.module, ir_type_ref);
|
||||
if (ir_type->tag == SCC_IR_TYPE_ARRAY && ir_type->data.array.len == 0) {
|
||||
scc_ast_expr_t *init_expr = decl->var.init;
|
||||
if (init_expr->base.type == SCC_AST_EXPR_COMPOUND) {
|
||||
Panic("TODO: init_expr->base.type == SCC_AST_EXPR_COMPOUND");
|
||||
} else if (init_expr->base.type == SCC_AST_EXPR_STRING_LITERAL) {
|
||||
ir_type->data.array.len =
|
||||
scc_strlen(init_expr->literal.lexme) + 1;
|
||||
if (ir_type->tag == SCC_IR_TYPE_ARRAY) {
|
||||
if (ir_type->data.array.len == 0) {
|
||||
scc_ast_expr_t *init_expr = decl->var.init;
|
||||
if (init_expr->base.type == SCC_AST_EXPR_COMPOUND) {
|
||||
Panic(
|
||||
"TODO: init_expr->base.type == SCC_AST_EXPR_COMPOUND");
|
||||
} else if (init_expr->base.type ==
|
||||
SCC_AST_EXPR_STRING_LITERAL) {
|
||||
ir_type->data.array.len =
|
||||
scc_strlen(init_expr->literal.lexme) + 1;
|
||||
|
||||
scc_ir_const_int_t len = {.int64 = ir_type->data.array.len};
|
||||
scc_ir_value_ref_t len_ref = scc_ir_builder_const_int(
|
||||
&ctx->builder, scc_ir_builder_type_u64(&ctx->builder), len);
|
||||
scc_ir_builder_builtin_memcpy(&ctx->builder, alloc_val_node,
|
||||
init_val_node, len_ref);
|
||||
} else {
|
||||
Panic("unknown init expr in array decl");
|
||||
scc_ir_const_int_t len = {.int64 = ir_type->data.array.len};
|
||||
scc_ir_value_ref_t len_ref = scc_ir_builder_const_int(
|
||||
&ctx->builder, scc_ir_builder_type_u64(&ctx->builder),
|
||||
len);
|
||||
scc_ir_builder_builtin_memcpy(&ctx->builder, alloc_val_node,
|
||||
init_val_node, len_ref);
|
||||
} else {
|
||||
Panic("unknown init expr in array decl");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
scc_ir_builder_store(&ctx->builder, alloc_val_node, init_val_node);
|
||||
}
|
||||
scc_ir_builder_store(&ctx->builder, alloc_val_node, init_val_node);
|
||||
break;
|
||||
}
|
||||
case SCC_AST_DECL_FUNC: {
|
||||
|
||||
Reference in New Issue
Block a user