feat(ast2ir): 添加指针运算支持并修复整数字面量解析
- 实现了指针解引用(*)和取地址(&)操作符的IR转换 - 添加parse_lexme2const_int函数统一处理整数字面量解析 - 支持数组大小表达式的常量解析 - 修复函数缺少返回语句的问题,在函数末尾添加默认ret指令 refactor(ir_builder): 调整函数参数类型处理逻辑 - 修改函数参数以指针形式传递,更新参数类型处理方式 - 优化参数节点创建过程,将参数类型包装为指针类型 fix(ir_dump): 修正IR输出格式问题 - 调整基本块和函数的输出格式,确保正确的换行和缩进 - 统一输出格式,提升可读性 feat(ir2mcode): 添加帧管理器头文件定义 - 定义frame_manager.h接口,包含栈帧分配相关函数声明 - 提供栈槽分配、寄存器保存、偏移计算等功能接口 refactor(reg_alloc): 添加初始栈大小配置 - 在寄存器分配器中增加init_stack_size字段 - 支持初始化栈大小设置,为后续帧管理功能做准备 test: 添加指针操作测试用例 - 新增14_pointer.c测试文件,验证指针取地址和解引用功能 - 在expect.toml中添加对应的期望返回值
This commit is contained in:
@@ -56,13 +56,17 @@ void scc_ir_builder_begin_func(scc_ir_builder_t *builder,
|
||||
return;
|
||||
}
|
||||
|
||||
scc_vec_foreach(func_type->data.function.params, i) {
|
||||
scc_ir_type_ref_t param_type =
|
||||
scc_vec_at(func_type->data.function.params, i);
|
||||
scc_ir_type_ref_vec_t params = func_type->data.function.params;
|
||||
func_type = null;
|
||||
scc_vec_foreach(params, i) {
|
||||
scc_ir_type_ref_t param_type = scc_vec_at(params, i);
|
||||
|
||||
scc_ir_value_t param_node = {0};
|
||||
param_node.tag = SCC_IR_VALUE_TAG_FUNC_ARG_REF; // 参数节点标记
|
||||
param_node.type = param_type;
|
||||
param_node.type = scc_ir_module_add_type(
|
||||
GET_MODULE(builder),
|
||||
&(scc_ir_type_t){.tag = SCC_IR_TYPE_PTR,
|
||||
.data.pointer.base = param_type});
|
||||
param_node.name = param_names ? param_names[i] : null;
|
||||
param_node.data.arg_ref.idx = i;
|
||||
scc_vec_init(param_node.used_by);
|
||||
@@ -71,7 +75,6 @@ void scc_ir_builder_begin_func(scc_ir_builder_t *builder,
|
||||
scc_ir_module_add_value(GET_MODULE(builder), ¶m_node);
|
||||
scc_vec_push(func_ptr->params, param_ref);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -597,10 +597,11 @@ void scc_ir_dump_node_linear(scc_ir_dump_ctx_t *ctx,
|
||||
|
||||
void scc_ir_dump_bblock_linear(scc_ir_dump_ctx_t *ctx,
|
||||
scc_ir_bblock_ref_t bblock_ref) {
|
||||
scc_tree_dump_begin_line(ctx->dump_ctx);
|
||||
scc_ir_bblock_t *bblock =
|
||||
scc_ir_module_get_bblock(GET_MODULE(ctx), bblock_ref);
|
||||
if (!bblock) {
|
||||
scc_tree_dump_append(ctx->dump_ctx, "<invalid block>\n");
|
||||
scc_tree_dump_append(ctx->dump_ctx, "<invalid block>");
|
||||
return;
|
||||
}
|
||||
if (bblock->label && bblock->label[0] != '\0')
|
||||
@@ -610,7 +611,8 @@ void scc_ir_dump_bblock_linear(scc_ir_dump_ctx_t *ctx,
|
||||
scc_tree_dump_append_fmt(ctx->dump_ctx, "%%L%d <unnamed>:", bblock_ref);
|
||||
|
||||
for (usize i = 0; i < scc_vec_size(bblock->instrs); i++) {
|
||||
scc_tree_dump_append(ctx->dump_ctx, "\n ");
|
||||
scc_tree_dump_begin_line(ctx->dump_ctx);
|
||||
scc_tree_dump_append(ctx->dump_ctx, " ");
|
||||
scc_ir_dump_node_linear(ctx, scc_vec_at(bblock->instrs, i));
|
||||
}
|
||||
}
|
||||
@@ -651,16 +653,17 @@ void scc_ir_dump_func_linear(scc_ir_dump_ctx_t *ctx, scc_ir_func_ref_t func_ref,
|
||||
scc_ir_dump_type_linear(ctx, func->type);
|
||||
|
||||
if (is_decl) {
|
||||
scc_tree_dump_append(ctx->dump_ctx, ";\n");
|
||||
scc_tree_dump_append(ctx->dump_ctx, ";");
|
||||
return;
|
||||
}
|
||||
|
||||
scc_tree_dump_append(ctx->dump_ctx, " {\n");
|
||||
scc_tree_dump_append(ctx->dump_ctx, " {");
|
||||
for (usize i = 0; i < scc_vec_size(func->bblocks); i++) {
|
||||
scc_ir_dump_bblock_linear(ctx, scc_vec_at(func->bblocks, i));
|
||||
scc_tree_dump_append(ctx->dump_ctx, "\n");
|
||||
scc_tree_dump_append(ctx->dump_ctx, "");
|
||||
}
|
||||
scc_tree_dump_append(ctx->dump_ctx, "}\n");
|
||||
scc_tree_dump_begin_line(ctx->dump_ctx);
|
||||
scc_tree_dump_append(ctx->dump_ctx, "}");
|
||||
}
|
||||
|
||||
void scc_ir_dump_cprog_linear(scc_ir_dump_ctx_t *ctx) {
|
||||
|
||||
Reference in New Issue
Block a user