Files
scc/libs/ir/cfg/include/scc_cfg.h
zzy 0fbfb36262 feat(cbuild): 更新项目配置以支持HIR中间表示
- 统一包名格式化,添加空格对齐
- 将依赖项从ir和lir重命名为hir,移除lir注释
- 为ast2ir模块添加正确的包名称"scc_ast2ir"
- 更新依赖引用路径指向新的HIR库结构
- 移除注释掉的ir2mcode和sccf2target依赖项

refactor(ast2ir): 迁移到HIR中间表示替换IR表示

- 更新头文件包含,使用hir_builder.h替代ir_builder.h
- 修改上下文结构体,将scc_ir_builder_t替换为scc_hir_builder_t
- 更新函数签名,将参数类型从scc_ir_*转换为scc_hir_*
- 调整返回值类型,将scc_ir_value_ref_t和scc_ir_type_ref_t
  分别替换为scc_hir_value_ref_t和scc_hir_type_ref_t
- 重新排列头文件包含顺序以满足依赖关系
2026-04-21 14:05:21 +08:00

109 lines
3.9 KiB
C

#ifndef __SCC_CFG_H__
#define __SCC_CFG_H__
#include <scc_core.h>
#include <scc_hashtable.h>
#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_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 *attribute;
};
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 *attribute;
};
typedef enum {
SCC_CFG_SYMBOL_KIND_FUNC,
SCC_CFG_SYMBOL_KIND_DATA,
SCC_CFG_SYMBOL_KIND_EXTERN,
} scc_cfg_symbol_kind_t;
struct scc_cfg_symbol {
const char *name;
scc_cfg_symbol_kind_t kind;
void *attribute;
};
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);
void scc_cfg_module_add_symbol(scc_cfg_module_t *module,
const scc_cfg_symbol_t *symbol);
scc_cfg_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__ */