feat(ir): 添加MIR中间表示层并重构LIR相关代码

- 新增mir库模块,包含scc_mir、scc_mir_module、scc_mir_dump等组件
- 添加LIR到MIR的转换接口scc_lir2mir
- 定义MIR操作数类型和指令结构,支持虚拟寄存器、物理寄存器、立即数等
- 实现x86_64指令选择器,将LIR指令转换为MIR指令
- 重构LIR模块中函数参数命名,统一使用lir_module参数名
- 移除LIR中物理寄存器相关的代码和注释
- 更新cbuild.toml依赖配置,添加mir模块依赖
This commit is contained in:
zzy
2026-04-26 17:38:30 +08:00
parent e850b5c981
commit f57ba9bd31
21 changed files with 830 additions and 54 deletions

View File

@@ -144,9 +144,9 @@ static void dump_operand(scc_lir_dump_ctx_t *ctx, const scc_lir_val_t *op) {
case SCC_LIR_INSTR_KIND_VREG:
scc_tree_dump_append_fmt(td, "%%%u", op->data.reg);
break;
case SCC_LIR_INSTR_KIND_PREG:
scc_tree_dump_append_fmt(td, "Phy%u", op->data.reg);
break;
// case SCC_LIR_INSTR_KIND_PREG:
// scc_tree_dump_append_fmt(td, "Phy%u", op->data.reg);
// break;
case SCC_LIR_INSTR_KIND_IMM:
// TODO hack ap
scc_tree_dump_append_fmt(td, "%lld", op->data.imm.data.digit);
@@ -295,7 +295,7 @@ void scc_lir_dump_ins(scc_lir_dump_ctx_t *ctx, const scc_lir_instr_t *ins) {
break;
case SCC_LIR_JMP:
scc_tree_dump_append_fmt(td, "BB#%zu", ins->metadata.jmp_target);
scc_tree_dump_append_fmt(td, "#BB%d", ins->metadata.jmp_target);
break;
case SCC_LIR_JMP_INDIRECT:
@@ -395,7 +395,7 @@ void scc_lir_dump_bblock(scc_lir_dump_ctx_t *ctx, const scc_lir_bblock_t *bb) {
// 基本块头部
scc_tree_dump_begin_line(td);
scc_tree_dump_node(td, "BB%zu", bb->id);
scc_tree_dump_node(td, "#BB%zu", bb->id);
if (bb->name) {
scc_tree_dump_append_fmt(td, " (%s)", bb->name);
}
@@ -430,10 +430,10 @@ void scc_lir_dump_func(scc_lir_dump_ctx_t *ctx, const scc_lir_func_t *func) {
scc_tree_dump_append(td, " {");
// 输出所有基本块
for (usize i = 0; i < scc_vec_size(func->bblocks); ++i) {
scc_vec_foreach(func->bblocks, i) {
scc_cfg_bblock_id_t id = scc_vec_at(func->bblocks, i);
const scc_cfg_bblock_t *bb =
scc_cfg_module_unsafe_get_bblock(&ctx->module->cfg_module, id);
scc_cfg_module_unsafe_get_bblock(&ctx->lir_module->cfg_module, id);
scc_lir_dump_bblock(ctx, bb);
}
@@ -442,18 +442,20 @@ void scc_lir_dump_func(scc_lir_dump_ctx_t *ctx, const scc_lir_func_t *func) {
}
void scc_lir_dump_module(scc_lir_dump_ctx_t *ctx) {
scc_vec_foreach(ctx->module->cfg_module.symbols, i) {
scc_vec_foreach(ctx->lir_module->cfg_module.symbols, i) {
// FIXME 0 is null
if (i == 0)
continue;
scc_lir_symbol_t *sym = &scc_vec_at(ctx->module->cfg_module.symbols, i);
scc_lir_symbol_t *sym =
&scc_vec_at(ctx->lir_module->cfg_module.symbols, i);
scc_tree_dump_begin_line(ctx->dump_ctx);
scc_tree_dump_node(ctx->dump_ctx, "symbol");
scc_tree_dump_append_fmt(ctx->dump_ctx, " %s", sym->name);
}
scc_vec_foreach(ctx->module->cfg_module.funcs, i) {
scc_vec_foreach(ctx->lir_module->cfg_module.funcs, i) {
if (i == 0)
continue;
scc_lir_dump_func(ctx, &scc_vec_at(ctx->module->cfg_module.funcs, i));
scc_lir_dump_func(ctx,
&scc_vec_at(ctx->lir_module->cfg_module.funcs, i));
}
}