#ifndef __SCC_IR_BUILDER_H__ #define __SCC_IR_BUILDER_H__ #include "ir_ctx.h" #include "ir_def.h" #include typedef struct scc_ir_builder scc_ir_builder_t; /** * @brief IR 构建器上下文 * * 负责管理 IR 构建过程中的所有状态: * - 类型统一化(type uniquing) * - 符号命名分配 * - 内存管理 * - 当前构建位置(函数、基本块) */ struct scc_ir_builder { scc_ir_cprog_ctx_t ctx; /**< 核心上下文 */ scc_ir_cprog_t cprog; // 当前构建位置 scc_ir_func_ref_t current_func; /**< 当前正在构建的函数 */ scc_ir_bblock_ref_t current_bblock; /**< 当前基本块 */ }; /** * @brief 初始化 IR 构建器 */ void scc_ir_builder_init(scc_ir_builder_t *builder); /** * @brief 销毁 IR 构建器及其所有资源 */ void scc_ir_builder_drop(scc_ir_builder_t *builder); /** * @brief 开始构建函数 * @param name 函数名 * @param type 函数类型 * @param param_names 参数名列表(可为NULL) * @return 函数引用 */ scc_ir_func_ref_t scc_ir_builder_begin_func(scc_ir_builder_t *builder, const char *name, scc_ir_type_ref_t type, const char **param_names); /** * @brief 结束当前函数的构建 */ void scc_ir_builder_end_func(scc_ir_builder_t *builder); /** * @brief 获取当前正在构建的函数 */ scc_ir_func_ref_t scc_ir_builder_current_func(scc_ir_builder_t *builder); /** * @brief 开始构建新的基本块 * @param label 基本块标签(可为NULL,自动生成) * @return 基本块引用 */ scc_ir_bblock_ref_t scc_ir_builder_begin_bblock(scc_ir_builder_t *builder, const char *label); /** * @brief 结束当前基本块的构建 */ void scc_ir_builder_end_bblock(scc_ir_builder_t *builder); /** * @brief 设置当前基本块 */ void scc_ir_builder_set_current_bblock(scc_ir_builder_t *builder, scc_ir_bblock_ref_t bblock); /** * @brief 创建alloca指令(在当前基本块中) * @param type 分配的类型 * @param name 变量名(可为NULL) */ scc_ir_node_ref_t scc_ir_builder_alloca(scc_ir_builder_t *builder, scc_ir_type_ref_t type, const char *name); /** * @brief 创建load指令 * @param ptr 指针操作数 */ scc_ir_node_ref_t scc_ir_builder_load(scc_ir_builder_t *builder, scc_ir_node_ref_t ptr); /** * @brief 创建store指令 * @param ptr 目标指针 * @param value 要存储的值 */ scc_ir_node_ref_t scc_ir_builder_store(scc_ir_builder_t *builder, scc_ir_node_ref_t ptr, scc_ir_node_ref_t value); /** * @brief 创建getptr指令(指针运算) * @param ptr 基础指针 * @param index 索引值 */ scc_ir_node_ref_t scc_ir_builder_get_ptr(scc_ir_builder_t *builder, scc_ir_node_ref_t ptr, scc_ir_node_ref_t index); /** * @brief 创建二元运算指令 * @param op 操作符 * @param lhs 左操作数 * @param rhs 右操作数 */ scc_ir_node_ref_t scc_ir_builder_binop(scc_ir_builder_t *builder, scc_ir_op_type_t op, scc_ir_node_ref_t lhs, scc_ir_node_ref_t rhs); /** * @brief 创建比较指令 * @param op 比较操作符 * @param lhs 左操作数 * @param rhs 右操作数 */ scc_ir_node_ref_t scc_ir_builder_cmp(scc_ir_builder_t *builder, scc_ir_op_type_t op, scc_ir_node_ref_t lhs, scc_ir_node_ref_t rhs); /** * @brief 创建跳转指令(无条件) * @param target 目标基本块 */ scc_ir_node_ref_t scc_ir_builder_jump(scc_ir_builder_t *builder, scc_ir_bblock_ref_t target); /** * @brief 创建条件分支指令 * @param cond 条件值 * @param true_target 条件为真时的目标 * @param false_target 条件为假时的目标 */ scc_ir_node_ref_t scc_ir_builder_branch(scc_ir_builder_t *builder, scc_ir_node_ref_t cond, scc_ir_bblock_ref_t true_target, scc_ir_bblock_ref_t false_target); /** * @brief 创建函数调用指令 * @param callee 被调用函数 * @param args 参数列表 * @param arg_count 参数数量 */ scc_ir_node_ref_t scc_ir_builder_call(scc_ir_builder_t *builder, scc_ir_func_ref_t callee, const scc_ir_node_ref_t *args, usize arg_count); /** * @brief 创建返回指令(带返回值) * @param value 返回值 */ scc_ir_node_ref_t scc_ir_builder_ret(scc_ir_builder_t *builder, scc_ir_node_ref_t value); /** * @brief 创建返回指令(void返回) */ scc_ir_node_ref_t scc_ir_builder_ret_void(scc_ir_builder_t *builder); #endif /* __SCC_IR_BUILDER_H__ */