feat(argparse): 添加枚举类型选项支持

添加了对命令行参数枚举类型的支持,允许用户从预定义的选项中进行选择,
并在解析时进行验证。同时修复了空值检查问题。

refactor(mir): 重构pass管理系统

将原有的pass管理器系统简化为直接的pass执行函数,移除了复杂的
依赖管理和流水线构建机制,使系统更加简洁明了。

chore(ir): 添加Windows x64 ABI实现

实现了Windows x64平台的ABI约定,包括参数传递、寄存器使用和
栈帧布局的处理逻辑。

feat(config): 统一编译阶段控制配置

将多个独立的布尔类型编译阶段控制改为统一的枚举类型,便于
管理和扩展新的编译阶段。
This commit is contained in:
zzy
2026-05-10 15:02:36 +08:00
parent e5cb70732e
commit 902ee6dea3
13 changed files with 486 additions and 345 deletions

View File

@@ -1,7 +1,7 @@
#ifndef __SCC_MIR_PASS_H__
#define __SCC_MIR_PASS_H__
#include "scc_mir.h"
#include "scc_mir_module.h"
/** Pass 的唯一标识符 (枚举) */
typedef enum {
@@ -25,107 +25,6 @@ typedef enum {
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)
void scc_mir_pass(scc_mir_module_t *mir_module, scc_mir_pass_stage_t stage);
#endif /* __SCC_LIR_PASS_H__ */