#ifndef __SCC_CFG_H__ #define __SCC_CFG_H__ #include #include #define SCC_CFG_ID_nullptr (0) typedef usize scc_cfg_id_t; typedef scc_cfg_id_t scc_cfg_bblock_id_t; typedef scc_cfg_id_t scc_cfg_func_id_t; typedef scc_cfg_id_t scc_cfg_symbol_id_t; typedef SCC_VEC(scc_cfg_bblock_id_t) scc_cfg_bblock_id_vec_t; typedef SCC_VEC(void *) scc_cfg_value_vec_t; typedef struct scc_cfg_module scc_cfg_module_t; typedef struct scc_cfg_func scc_cfg_func_t; typedef struct scc_cfg_bblock scc_cfg_bblock_t; typedef struct scc_cfg_symbol scc_cfg_symbol_t; struct scc_cfg_bblock { scc_cfg_bblock_id_t id; const char *name; scc_cfg_bblock_id_vec_t preds; // 前驱 scc_cfg_bblock_id_vec_t succs; // 后继 scc_cfg_value_vec_t values; // using cast void *meta; }; struct scc_cfg_func { const char *name; scc_cfg_bblock_id_t next_bblock_id; scc_cfg_bblock_id_vec_t bblocks; scc_hashtable_t bblock_map; // id -> index scc_cfg_bblock_id_t entry_bblock_id; // maybe it will always 0 void *meta; }; typedef enum { SCC_CFG_SYMBOL_KIND_FUNC, SCC_CFG_SYMBOL_KIND_DATA, SCC_CFG_SYMBOL_KIND_EXTERN, } scc_cfg_symbol_kind_t; typedef enum { SCC_CFG_SYMBOL_LINK_GLOABL, SCC_CFG_SYMBOL_LINK_LOCAL, } scc_cfg_symbol_linkage_t; struct scc_cfg_symbol { const char *name; scc_cfg_symbol_kind_t kind; scc_cfg_symbol_linkage_t linkage; void *meta; }; typedef SCC_VEC(scc_cfg_bblock_t) scc_cfg_bblock_vec_t; typedef SCC_VEC(scc_cfg_func_t) scc_cfg_func_vec_t; typedef SCC_VEC(scc_cfg_symbol_t) scc_cfg_symbol_vec_t; struct scc_cfg_module { scc_cfg_bblock_vec_t bblocks; scc_cfg_func_vec_t funcs; /* 所有函数定义(按添加顺序) */ scc_cfg_symbol_vec_t symbols; /* 全局符号表 */ scc_hashtable_t symbol_map; /* 名称 -> 索引 */ }; void scc_cfg_module_init(scc_cfg_module_t *module); /** * @brief * * @param module * @warning 由于void*存在可能导致严重内存泄漏 */ void scc_cfg_module_drop(scc_cfg_module_t *module); scc_cfg_func_id_t scc_cfg_module_add_func(scc_cfg_module_t *module, const scc_cfg_func_t *func); scc_cfg_func_t *scc_cfg_module_unsafe_get_func(scc_cfg_module_t *module, scc_cfg_func_id_t id); scc_cfg_bblock_id_t scc_cfg_module_add_bblock(scc_cfg_module_t *module, const scc_cfg_bblock_t *bblock); scc_cfg_bblock_t *scc_cfg_module_unsafe_get_bblock(scc_cfg_module_t *module, scc_cfg_bblock_id_t id); scc_cfg_symbol_id_t scc_cfg_module_add_symbol(scc_cfg_module_t *module, const scc_cfg_symbol_t *symbol); scc_cfg_symbol_t *scc_cfg_module_unsafe_get_symbol(scc_cfg_module_t *module, scc_cfg_symbol_id_t id); scc_cfg_symbol_id_t scc_cfg_module_lookup_symbol(const scc_cfg_module_t *module, const char *name); static inline const scc_cfg_symbol_t * scc_cfg_module_unsafe_lookup_symbol(const scc_cfg_module_t *module, const char *name) { scc_cfg_id_t idx = scc_cfg_module_lookup_symbol(module, name); if (idx == 0) { Panic("Can't find symbol %s", name); return nullptr; } return &scc_vec_at(module->symbols, idx); } // scc_cfg_bblock_id_t scc_cfg_func_add_bblock(scc_cfg_func_t *func, // const scc_cfg_bblock_t *bblock); // scc_cfg_bblock_t *scc_cfg_func_unsafe_get_bblock(scc_cfg_func_t *func, // scc_cfg_bblock_id_t id); // scc_cfg_bblock_t *scc_cfg_func_unsafe_entry_bblock(scc_cfg_func_t *func); void scc_cfg_bblock_add_pred(scc_cfg_bblock_t *bb, scc_cfg_bblock_id_t pred_id); void scc_cfg_bblock_remove_pred(scc_cfg_bblock_t *bb, scc_cfg_bblock_id_t pred_id); void scc_cfg_bblock_clear_pred(scc_cfg_bblock_t *bb); void scc_cfg_bblock_add_succ(scc_cfg_bblock_t *bb, scc_cfg_bblock_id_t succ_id); void scc_cfg_bblock_remove_succ(scc_cfg_bblock_t *bb, scc_cfg_bblock_id_t succ_id); void scc_cfg_bblock_clear_succs(scc_cfg_bblock_t *bb); #endif /* __SCC_CFG_H__ */