/** * @file scc_lir_module.h * @brief LIR 模块:管理函数定义、全局符号和声明 */ #ifndef __SCC_LIR_MODULE_H__ #define __SCC_LIR_MODULE_H__ #include "scc_lir.h" #include #include typedef enum scc_lir_symbol_kind { SCC_LIR_SYMBOL_FUNC, // 函数符号 SCC_LIR_SYMBOL_DATA, // 数据符号(全局变量、常量) SCC_LIR_SYMBOL_EXTERN, // 外部符号(未定义,需链接器解析) } scc_lir_symbol_kind_t; typedef struct scc_lir_symbol { const char *name; // 符号名(驻留字符串或前端管理) scc_lir_symbol_kind_t kind; // 符号类型 scc_lir_attr_t attr; // 属性(static, weak 等) union { struct { scc_lir_func_t *func; // 指向函数体(若为定义) } func; struct { u8 *init_data; // 初始化数据(若为 NULL 则零初始化) usize size; // 数据大小(字节) int align; // 对齐要求 } data; }; } scc_lir_symbol_t; typedef struct scc_lir_module { SCC_VEC(scc_lir_func_t *) funcs; // 所有函数定义(按添加顺序) SCC_VEC(scc_lir_symbol_t) symbols; // 所有全局符号(包含声明和定义) scc_hashtable_t symbol_map; // name -> 索引 (usize) 在 symbols 向量中 } scc_lir_module_t; /** * @brief 初始化 LIR 模块 */ void scc_lir_module_init(scc_lir_module_t *module); /** * @brief 销毁 LIR 模块,释放所有函数和符号资源 */ void scc_lir_module_drop(scc_lir_module_t *module); /** * @brief 添加一个函数定义到模块 * @param mod 模块 * @param func 函数定义(所有权转移给模块) * @return 符号指针(内部持有,不可释放) */ const scc_lir_symbol_t *scc_lir_module_add_func_def(scc_lir_module_t *module, scc_lir_func_t *func); /** * @brief 添加一个函数声明(外部或未定义) * @param mod 模块 * @param name 函数名 * @param attr 属性 * @return 符号指针 */ const scc_lir_symbol_t *scc_lir_module_add_func_decl(scc_lir_module_t *module, const char *name, scc_lir_attr_t attr); /** * @brief 添加一个全局数据符号(定义或外部) * @param mod 模块 * @param name 符号名 * @param kind 种类(DATA 或 EXTERN) * @param init_data 初始化数据(若为 DATA 定义;若为 NULL 则零初始化) * @param size 数据大小(若为 EXTERN 可为 0) * @param align 对齐要求 * @param attr 属性 * @return 符号指针 */ const scc_lir_symbol_t *scc_lir_module_add_data(scc_lir_module_t *module, const char *name, scc_lir_symbol_kind_t kind, const u8 *init_data, usize size, u32 align, scc_lir_attr_t attr); /** * @brief 通过名称查找符号 * @param mod 模块 * @param name 符号名 * @return 符号指针,未找到返回 nullptr */ const scc_lir_symbol_t * scc_lir_module_lookup_symbol(const scc_lir_module_t *module, const char *name); #endif /* __SCC_LIR_MODULE_H__ */