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:
131
libs/ir/mir/include/scc_mir_pass.h
Normal file
131
libs/ir/mir/include/scc_mir_pass.h
Normal file
@@ -0,0 +1,131 @@
|
||||
#ifndef __SCC_MIR_PASS_H__
|
||||
#define __SCC_MIR_PASS_H__
|
||||
|
||||
#include "scc_mir.h"
|
||||
|
||||
/** Pass 的唯一标识符 (枚举) */
|
||||
typedef enum {
|
||||
SCC_MIR_PASS_ABI_LOWERING, // ABI 物理化 (核心)
|
||||
SCC_MIR_PASS_REG_ALLOC, // 寄存器分配 (核心)
|
||||
SCC_MIR_PASS_FRAME_LAYOUT, // 栈帧布局 (核心)
|
||||
SCC_MIR_PASS_PROLOGUE_EPILOGUE, // 序言/尾声插入 (核心)
|
||||
SCC_MIR_PASS_DEAD_CODE_ELIM, // 死代码消除 (优化)
|
||||
SCC_MIR_PASS_CONST_PROP, // 常量传播 (优化)
|
||||
SCC_MIR_PASS_PEEPHOLE, // 窥孔优化 (优化)
|
||||
SCC_MIR_PASS_CFG_SIMPLIFY, // CFG 简化 (优化)
|
||||
SCC_MIR_PASS_COPY_PROP, // 复制传播 (优化)
|
||||
SCC_MIR_PASS_COUNT
|
||||
} scc_mir_pass_id_t;
|
||||
|
||||
/** Pass 运行阶段 (用于自动排序) */
|
||||
typedef enum {
|
||||
SCC_MIR_STAGE_ANY, // 无特殊阶段要求
|
||||
SCC_MIR_STAGE_PRE_REGALLOC, // 寄存器分配前
|
||||
SCC_MIR_STAGE_REGALLOC, // 寄存器分配本身
|
||||
SCC_MIR_STAGE_POST_REGALLOC // 寄存器分配后
|
||||
} scc_mir_pass_stage_t;
|
||||
|
||||
/**
|
||||
* @brief Pass 执行函数原型
|
||||
* @param func 输入的 MIR 函数 (Pass 可修改或替换)
|
||||
* @param ctx 可选的上下文指针 (如目标机器信息、调试标志)
|
||||
* @return 执行后的 MIR 函数指针 (若未修改可返回原指针,若需替换可返回新指针)
|
||||
* @warning Pass 应负责释放不再使用的旧函数资源
|
||||
*/
|
||||
typedef scc_mir_func_t *(*scc_mir_pass_fn_t)(scc_mir_func_t *func, void *ctx);
|
||||
|
||||
typedef struct scc_lir_pass_desc {
|
||||
scc_mir_pass_id_t id; // 唯一标识
|
||||
const char *name; // 可读名称
|
||||
scc_mir_pass_stage_t stage; // 所属阶段
|
||||
scc_mir_pass_id_t *deps; // 依赖的 Pass ID 数组 (可为 NULL)
|
||||
usize num_deps; // 依赖数量
|
||||
scc_mir_pass_fn_t run; // 执行函数
|
||||
cbool required; // 是否为核心必需 Pass
|
||||
} scc_mir_pass_desc_t;
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* Pass 管理器
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
typedef struct scc_lir_pass_manager {
|
||||
SCC_VEC(scc_mir_pass_desc_t) passes; // 所有已注册 Pass
|
||||
SCC_VEC(scc_mir_pass_id_t) pipeline; // 当前流水线顺序
|
||||
void *ctx; // 传递给每个 Pass 的上下文
|
||||
} scc_mir_pass_manager_t;
|
||||
|
||||
/**
|
||||
* @brief 初始化 Pass 管理器
|
||||
* @param pm 管理器指针
|
||||
* @param ctx 全局上下文 (如 scc_target_t*)
|
||||
*/
|
||||
void scc_mir_pass_manager_init(scc_mir_pass_manager_t *pm, void *ctx);
|
||||
|
||||
/**
|
||||
* @brief 销毁 Pass 管理器,释放资源
|
||||
*/
|
||||
void scc_mir_pass_manager_drop(scc_mir_pass_manager_t *pm);
|
||||
|
||||
/**
|
||||
* @brief 注册一个 Pass (通常在编译器初始化时调用)
|
||||
* @param pm 管理器
|
||||
* @param desc Pass 描述符
|
||||
*/
|
||||
void scc_mir_pass_register(scc_mir_pass_manager_t *pm,
|
||||
const scc_mir_pass_desc_t *desc);
|
||||
|
||||
/**
|
||||
* @brief 构建默认的核心流水线 (仅包含 required=true 的 Pass)
|
||||
* @param pm 管理器
|
||||
*
|
||||
* 自动按阶段排序并解析依赖。
|
||||
*/
|
||||
void scc_mir_pass_build_core_pipeline(scc_mir_pass_manager_t *pm);
|
||||
|
||||
/**
|
||||
* @brief 向流水线追加一个可选 Pass
|
||||
* @param pm 管理器
|
||||
* @param id 要添加的 Pass ID
|
||||
* @return 成功返回 true,若依赖不满足或 ID 无效返回 false
|
||||
*/
|
||||
cbool scc_mir_pass_add_to_pipeline(scc_mir_pass_manager_t *pm,
|
||||
scc_mir_pass_id_t id);
|
||||
|
||||
/**
|
||||
* @brief 对指定函数运行当前流水线中的所有 Pass
|
||||
* @param pm 管理器
|
||||
* @param func 要处理的 LIR 函数
|
||||
* @return 最终处理后的函数指针
|
||||
*/
|
||||
scc_lir_func_t *scc_mir_pass_run_pipeline(scc_mir_pass_manager_t *pm,
|
||||
scc_lir_func_t *func);
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* 便捷宏:声明并注册一个 Pass
|
||||
* -------------------------------------------------------------------------- */
|
||||
|
||||
/**
|
||||
* @brief 在模块内部声明并注册一个 Pass
|
||||
* @param pm 管理器指针
|
||||
* @param id Pass ID 枚举值
|
||||
* @param name_str Pass 名称字符串
|
||||
* @param stage 运行阶段
|
||||
* @param deps_arr 依赖数组 (可为 NULL)
|
||||
* @param num_deps 依赖数量
|
||||
* @param fn 执行函数
|
||||
* @param req 是否必需
|
||||
*/
|
||||
#define SCC_MIR_REGISTER_PASS(pm, id, name_str, stage, deps_arr, num_deps, fn, \
|
||||
req) \
|
||||
do { \
|
||||
scc_mir_pass_desc_t desc = {.id = (id), \
|
||||
.name = (name_str), \
|
||||
.stage = (stage), \
|
||||
.deps = (deps_arr), \
|
||||
.num_deps = (num_deps), \
|
||||
.run = (fn), \
|
||||
.required = (req)}; \
|
||||
scc_mir_pass_register((pm), &desc); \
|
||||
} while (0)
|
||||
|
||||
#endif /* __SCC_LIR_PASS_H__ */
|
||||
Reference in New Issue
Block a user