From d7ac5fd30b72dae1b3fc333f1d4b163e1ba4cd69 Mon Sep 17 00:00:00 2001 From: zzy <2450266535@qq.com> Date: Sun, 26 Apr 2026 18:22:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(ir2mcode):=20=E6=B7=BB=E5=8A=A0=E4=B8=AD?= =?UTF-8?q?=E9=97=B4=E4=BB=A3=E7=A0=81=E5=88=B0=E7=BB=9F=E4=B8=80=E8=BE=93?= =?UTF-8?q?=E5=87=BA=E6=A0=BC=E5=BC=8F=E8=BD=AC=E6=8D=A2=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在.gitignore中添加*.pdb和*.dmp文件类型以忽略调试符号文件 - 重构libs/README.md文档,为各组件添加详细的功能说明和层级结构 - 创建ir2mcode模块的cbuild.toml配置文件,定义依赖关系 - 实现scc_ir2sccf功能,提供MIR到SCCF格式转换的核心接口 - 添加必要的头文件声明和基础实现框架 --- .gitignore | 2 + libs/README.md | 63 ++++++++++++---- libs/ir2mcode/cbuild.toml | 14 ++++ libs/ir2mcode/include/scc_ir2mcode.h | 4 + libs/ir2mcode/include/scc_ir2sccf.h | 9 +++ libs/ir2mcode/src/scc_ir2sccf.c | 105 +++++++++++++++++++++++++++ libs/ir2mcode/tests/test_run.c | 2 + 7 files changed, 186 insertions(+), 13 deletions(-) create mode 100644 libs/ir2mcode/cbuild.toml create mode 100644 libs/ir2mcode/include/scc_ir2mcode.h create mode 100644 libs/ir2mcode/include/scc_ir2sccf.h create mode 100644 libs/ir2mcode/src/scc_ir2sccf.c create mode 100644 libs/ir2mcode/tests/test_run.c diff --git a/.gitignore b/.gitignore index 7a02213..241a457 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,8 @@ docs *.lib *.dll *.exe +*.pdb +*.dmp # developed notes note.md diff --git a/libs/README.md b/libs/README.md index 5f683df..2764969 100644 --- a/libs/README.md +++ b/libs/README.md @@ -1,28 +1,65 @@ +# lexer -lexer 词法分析 +> (Lexical Analysis) 词法分析 -pproc 预处理器 +# pproc -parser 语法分析 sema 语义分析 +> (Preprocessor) 预处理器 -ast 抽象语法树 +# parser -ir 中间代码标识 +> (Syntax analysis) 语法分析 -- ast2ir +## sema -- ir2mcode +> (Semantic Analysis) 语义分析 -opt 优化器 +# ast -asm 汇编器 +> (Abstract Syntax Tree) 抽象语法树 -mcode 机器码 +# ast2ir -sccf 统一输出格式 +> 抽象语法树到中间代码 -target 目标平台支持 +# ir -- pe +> (Intermediate Representation) 中间代码标识 + +## cfg + +> (Control Flow Graph) 控制流图 + +## hir + +> (High-Level Intermediate Representation) 高级中间代码标识 + +## lir + +> (Low-Level Intermediate Representation) 低级中间代码标识 + +## mir + +> (Machine Intermediate Representation) 机器中间代码标识 + +# ir2mcode + +> 中间代码到机器码 + + + +# mcode + +> (Machine Code) 机器码 + +# sccf + +> 统一输出格式 + +# target + +> 目标平台支持 + +## Windows Portable Executable Format [Windows Portable Executable Format](https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#archive-library-file-format) [中文文档](https://learn.microsoft.com/zh-cn/windows/win32/debug/pe-format#archive-library-file-format) diff --git a/libs/ir2mcode/cbuild.toml b/libs/ir2mcode/cbuild.toml new file mode 100644 index 0000000..2f29331 --- /dev/null +++ b/libs/ir2mcode/cbuild.toml @@ -0,0 +1,14 @@ +[package] +name = "ir2mcode" +version = "0.1.0" +authors = [] +description = "" + +dependencies = [ + { name = "scc_utils", path = "../../runtime/scc_utils" }, + { name = "scc_mir", path = "../ir/mir" }, + { name = "scc_mcode", path = "../mcode" }, + { name = "sccf", path = "../sccf" }, +] +# features = {} +# default_features = [] diff --git a/libs/ir2mcode/include/scc_ir2mcode.h b/libs/ir2mcode/include/scc_ir2mcode.h new file mode 100644 index 0000000..94dbaca --- /dev/null +++ b/libs/ir2mcode/include/scc_ir2mcode.h @@ -0,0 +1,4 @@ +#ifndef __SCC_IR2MCODE_H__ +#define __SCC_IR2MCODE_H__ + +#endif /* __SCC_IR2MCODE_H__ */ diff --git a/libs/ir2mcode/include/scc_ir2sccf.h b/libs/ir2mcode/include/scc_ir2sccf.h new file mode 100644 index 0000000..e2a25de --- /dev/null +++ b/libs/ir2mcode/include/scc_ir2sccf.h @@ -0,0 +1,9 @@ +#ifndef __SCC_IR2SCCF_H__ +#define __SCC_IR2SCCF_H__ + +#include +#include + +void scc_mir2sccf(sccf_builder_t *builder, scc_mir_module_t *mir_module); + +#endif /* __SCC_IR2SCCF_H__ */ diff --git a/libs/ir2mcode/src/scc_ir2sccf.c b/libs/ir2mcode/src/scc_ir2sccf.c new file mode 100644 index 0000000..ba75545 --- /dev/null +++ b/libs/ir2mcode/src/scc_ir2sccf.c @@ -0,0 +1,105 @@ +#include + +static inline void scc_ir_sym_to_sccf_sym(const scc_cfg_symbol_t *symbol, + sccf_sym_t *sym) { + switch (symbol->kind) { + case SCC_CFG_SYMBOL_KIND_DATA: + sym->sccf_sym_type = SCCF_SYM_TYPE_DATA; + break; + case SCC_CFG_SYMBOL_KIND_FUNC: + sym->sccf_sym_type = SCCF_SYM_TYPE_FUNC; + break; + case SCC_CFG_SYMBOL_KIND_EXTERN: + sym->sccf_sym_type = SCCF_SYM_TYPE_EXTERN; + break; + } + + switch (symbol->linkage) { + case SCC_CFG_SYMBOL_LINK_GLOABL: + sym->sccf_sym_bind = SCCF_SYM_BIND_GLOBAL; + break; + case SCC_CFG_SYMBOL_LINK_LOCAL: + sym->sccf_sym_bind = SCCF_SYM_BIND_LOCAL; + break; + default: + break; + } +} + +static inline void scc_ir_symbol_to_sect_data(const scc_cfg_symbol_t *symbol, + sccf_sect_data_t *sect_data) { + // scc_vec_foreach(value->data.const_array.fields, j) { + // scc_vec_push(ctx->sect_data, + // scc_vec_at(value->data.const_array.fields, j)); + // } +} + +void scc_mir2sccf(sccf_builder_t *builder, scc_mir_module_t *mir_module) { + // mir_module->symbol_metas + // mir_module->cfg_module.funcs + sccf_builder_init(builder); + sccf_sect_data_t sect_data; + scc_vec_init(sect_data); + + scc_vec_foreach(mir_module->cfg_module.symbols, i) { + scc_cfg_symbol_t *symbol = + &scc_vec_at(mir_module->cfg_module.symbols, i); + + sccf_sym_t sym = (sccf_sym_t){ + .sccf_sect_offset = scc_vec_size(sect_data), + .sccf_sym_size = + 4, // FIXME on windows using rel32, on linux using ? + }; + + scc_ir_sym_to_sccf_sym(symbol, &sym); + scc_ir_symbol_to_sect_data(symbol, §_data); + + usize sym_idx = sccf_builder_add_symbol(builder, symbol->name, &sym); + Assert(sym_idx != 0); + } + + // scc_vec_foreach(ctx->cprog->func_defs, i) { + // scc_ir_value_ref_t func_ref = scc_vec_at(ctx->cprog->func_defs, i); + // scc_ir_func_t *func = scc_ir_module_get_func(GET_MODULE(ctx), + // func_ref); if (!func) { + // LOG_ERROR("invalid function reference"); + // return; + // } + // sccf_sym_t *sym = + // sccf_builder_get_symbol_unsafe(ctx->builder, func->name); + // Assert(sym != nullptr); + // sym->sccf_sect_offset = scc_vec_size(ctx->sect_mcode.mcode); + // parse_function(ctx, func); + // } + + // u8 *buf = scc_vec_unsafe_get_data(ctx->sect_mcode.mcode); + // scc_vec_foreach(ctx->builder->relocs, i) { + // sccf_reloc_t *reloc = &scc_vec_at(ctx->builder->relocs, i); + // if (reloc->sym_idx == 0) { + // Panic("relocate to an invalid symbol"); + // } + // sccf_sym_t *sym = &scc_vec_at(ctx->builder->symtab, reloc->sym_idx); + // if (sym->sccf_sym_type != SCCF_SYM_TYPE_EXTERN) { + // Assert(reloc->reloc_type == SCCF_RELOC_TYPE_REL); + + // if (sym->sccf_sect_type == SCCF_SECT_CODE && + // sym->sccf_sym_type == SCCF_SYM_TYPE_FUNC) { + // i64 target_off = sym->sccf_sect_offset; + // i64 next_off = reloc->offset + reloc->addend; + // i32 rel = (i32)(target_off - next_off); + // // FIXME 写入到指令的偏移字段(小端) + // *(i32 *)(&buf[reloc->offset]) = rel; + + // reloc->reloc_type = SCCF_RELOC_TYPE_EMPTY; + // } + // } + // } + + // sccf_sect_data_t text_section; + // scc_vec_unsafe_from_buffer(text_section, + // scc_vec_unsafe_get_data(ctx->sect_mcode.mcode), + // scc_vec_size(ctx->sect_mcode.mcode)); + // sccf_builder_add_text_section(ctx->builder, &text_section); + + sccf_builder_add_data_section(builder, §_data); +} diff --git a/libs/ir2mcode/tests/test_run.c b/libs/ir2mcode/tests/test_run.c new file mode 100644 index 0000000..dd0c8a7 --- /dev/null +++ b/libs/ir2mcode/tests/test_run.c @@ -0,0 +1,2 @@ + +int main(void) { return 0; } \ No newline at end of file