Files
scc/libs/ir/mir/include/scc_mir_pass.h
zzy f57ba9bd31 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模块依赖
2026-04-26 17:38:30 +08:00

132 lines
5.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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__ */