feat(ir2mcode): 添加中间代码到统一输出格式转换模块

- 在.gitignore中添加*.pdb和*.dmp文件类型以忽略调试符号文件
- 重构libs/README.md文档,为各组件添加详细的功能说明和层级结构
- 创建ir2mcode模块的cbuild.toml配置文件,定义依赖关系
- 实现scc_ir2sccf功能,提供MIR到SCCF格式转换的核心接口
- 添加必要的头文件声明和基础实现框架
This commit is contained in:
zzy
2026-04-26 18:22:08 +08:00
parent f57ba9bd31
commit d7ac5fd30b
7 changed files with 186 additions and 13 deletions

View File

@@ -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
> 中间代码到机器码
<!-- asm 汇编器 -->
# 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)

14
libs/ir2mcode/cbuild.toml Normal file
View File

@@ -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 = []

View File

@@ -0,0 +1,4 @@
#ifndef __SCC_IR2MCODE_H__
#define __SCC_IR2MCODE_H__
#endif /* __SCC_IR2MCODE_H__ */

View File

@@ -0,0 +1,9 @@
#ifndef __SCC_IR2SCCF_H__
#define __SCC_IR2SCCF_H__
#include <scc_mir_module.h>
#include <sccf_builder.h>
void scc_mir2sccf(sccf_builder_t *builder, scc_mir_module_t *mir_module);
#endif /* __SCC_IR2SCCF_H__ */

View File

@@ -0,0 +1,105 @@
#include <scc_ir2sccf.h>
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, &sect_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, &sect_data);
}

View File

@@ -0,0 +1,2 @@
int main(void) { return 0; }