feat(ir2mcode): 添加IR到机器码转换功能并修复函数命名
添加了完整的scc_ir2mcode实现,将MIR指令转换为机器码, 同时修复了头文件中的函数命名错误(scc_mir2sccf改为scc_ir2sccf)。 BREAKING CHANGE: 函数名从scc_mir2sccf更改为scc_ir2sccf fix(vec): 修复向量循环和内存释放问题 修改了scc_vec_foreach宏使用+= 1避免潜在的编译器警告, 并添加了空指针检查以防止重复释放内存导致的崩溃。 refactor(hashtable): 优化哈希表接口设计 将scc_hashtable_get参数改为const类型,提供更好的只读访问安全性。 test: 添加break/continue和goto语句测试用例 新增18_break_continue.c和19_goto.c测试用例, 并对齐expect.toml文件格式以便于维护。
This commit is contained in:
38
libs/ir2mcode/src/scc_ir2mcode.c
Normal file
38
libs/ir2mcode/src/scc_ir2mcode.c
Normal file
@@ -0,0 +1,38 @@
|
||||
#include <scc_ir2mcode.h>
|
||||
#include <scc_mcode.h>
|
||||
#include <scc_mir_module.h>
|
||||
|
||||
#include <x86/scc_x86_encode.h>
|
||||
#include <x86/scc_x86_iform.h>
|
||||
#include <x86/scc_x86_reg.h>
|
||||
|
||||
void mir_x86_to_mcode(scc_mcode_t *mcode, const scc_mir_instr_t *ins) {
|
||||
// scc_x86_operand_value_t ops[8] = {0};
|
||||
// for (int i = 0; i < ins->num_operands; i += 1) {
|
||||
// }
|
||||
scc_x86_encode_inst(mcode, ins->opcode, (void *)&ins->operands);
|
||||
}
|
||||
|
||||
static void scc_emit_mcode(scc_mcode_t *mcode,
|
||||
const scc_mir_instr_t *mir_instr) {
|
||||
// TODO
|
||||
mir_x86_to_mcode(mcode, mir_instr);
|
||||
}
|
||||
|
||||
void scc_ir2mcode(scc_mcode_t *mcode, const scc_mir_module_t *mir_module) {
|
||||
scc_vec_foreach(mir_module->cfg_module.funcs, i) {
|
||||
if (i == 0)
|
||||
continue;
|
||||
scc_mir_func_t *func = &scc_vec_at(mir_module->cfg_module.funcs, 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(&mir_module->cfg_module, id);
|
||||
scc_mir_instr_vec_t *instrs = SCC_MIR_BBLOCK_VALUES(bb);
|
||||
scc_vec_foreach(*instrs, i) {
|
||||
const scc_mir_instr_t *ins = &scc_vec_at(*instrs, i);
|
||||
scc_emit_mcode(mcode, ins);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,7 @@ static inline void scc_ir_symbol_to_sect_data(const scc_cfg_symbol_t *symbol,
|
||||
// }
|
||||
}
|
||||
|
||||
void scc_mir2sccf(sccf_builder_t *builder, scc_mir_module_t *mir_module) {
|
||||
void scc_ir2sccf(sccf_builder_t *builder, scc_mir_module_t *mir_module) {
|
||||
// mir_module->symbol_metas
|
||||
// mir_module->cfg_module.funcs
|
||||
sccf_builder_init(builder);
|
||||
|
||||
Reference in New Issue
Block a user