#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__ */