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:
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user