#include void scc_lir_module_init(scc_lir_module_t *lir_module) { // FIXME // lir_module->lir_module scc_vec_init(lir_module->func_metas); scc_vec_init(lir_module->symbol_metas); } void scc_lir_module_drop(scc_lir_module_t *lir_module) { // FIXME memory leak scc_vec_free(lir_module->func_metas); scc_vec_free(lir_module->symbol_metas); } scc_lir_symbol_id_t scc_lir_module_add_func_decl(scc_lir_module_t *lir_module, const char *name) { if (!lir_module || !name) return SCC_CFG_ID_nullptr; scc_lir_symbol_meta_t *meta = scc_malloc(sizeof(scc_lir_symbol_meta_t)); Assert(meta != nullptr); scc_lir_symbol_t sym = {.name = name, .kind = SCC_CFG_SYMBOL_KIND_FUNC, .linkage = SCC_CFG_SYMBOL_LINK_GLOABL, .meta = meta}; meta->func.func = nullptr; scc_vec_push(lir_module->symbol_metas, meta); scc_cfg_symbol_id_t id = scc_cfg_module_add_symbol(&lir_module->cfg_module, &sym); if (id == SCC_CFG_ID_nullptr) { Panic("scc_lir: add func decl '%s' failed", name); } return id; } scc_lir_symbol_id_t scc_lir_module_add_data(scc_lir_module_t *lir_module, const char *name, scc_cfg_symbol_kind_t kind, const u8 *init_data, usize size, u32 align) { if (!lir_module || !name) return SCC_CFG_ID_nullptr; if (kind != SCC_CFG_SYMBOL_KIND_DATA && kind != SCC_CFG_SYMBOL_KIND_EXTERN) return SCC_CFG_ID_nullptr; scc_lir_symbol_meta_t *meta = scc_malloc(sizeof(scc_lir_symbol_meta_t)); Assert(meta != nullptr); scc_lir_symbol_t sym = {.name = name, .kind = kind, .meta = meta}; *meta = (scc_lir_symbol_meta_t){ .data = {.init_data = nullptr, .size = size, .align = align}, }; /* 对于数据定义,复制初始化数据(若有) */ if (kind == SCC_CFG_SYMBOL_KIND_DATA && init_data && size > 0) { meta->data.init_data = scc_malloc(size); if (!meta->data.init_data) { LOG_FATAL("out of memory for data symbol '%s'", name); } scc_memcpy(meta->data.init_data, init_data, size); } else if (kind == SCC_CFG_SYMBOL_KIND_DATA && !init_data) { /* 零初始化:分配并清零 */ meta->data.init_data = scc_calloc(1, size); if (!meta->data.init_data) { LOG_FATAL("out of memory for data symbol '%s'", name); } } scc_vec_push(lir_module->symbol_metas, meta); scc_cfg_symbol_id_t id = scc_cfg_module_add_symbol(&lir_module->cfg_module, &sym); if (id == SCC_CFG_ID_nullptr) { /* 冲突时释放已分配的数据 */ scc_free(meta->data.init_data); return SCC_CFG_ID_nullptr; } return id; }