feat(ir): 启用LIR模块并重构HIR组件结构

- 在cbuild.toml中启用lir依赖项,取消注释相关配置
- 重构libs/README.md文档,添加详细的库说明和层级结构
- 重命名头文件以统一命名规范:ast_def.h → scc_ast_def.h,
  ast_dump.h → scc_ast_dump.h, hir相关文件添加scc前缀
- 更新include路径以匹配新的文件命名
- 在cfg模块中添加symbol ID类型和linkage枚举,完善符号表功能
- 实现cfg模块中的符号添加、查找和获取功能
- 修改HIR中meta字段替换原有的attribute字段,更新相关访问宏
- 修复HIR构建器中的函数元数据访问错误
- 为LIR模块创建完整的头文件结构,包括指令定义、转换器等组件
This commit is contained in:
zzy
2026-04-21 20:35:37 +08:00
parent 0fbfb36262
commit e850b5c981
30 changed files with 1588 additions and 2627 deletions

View File

@@ -1,8 +1,8 @@
#ifndef __SCC_HIR_H__
#define __SCC_HIR_H__
#include "hir_def.h"
#include "hir_prog.h"
#include "scc_hir_def.h"
#include "scc_hir_prog.h"
void scc_hir_type_init(scc_hir_type_t *in, scc_hir_type_tag_t tag);
void scc_hir_bblock_init(scc_hir_bblock_t *in, const char *label);

View File

@@ -1,8 +1,8 @@
#ifndef __SCC_HIR_BUILDER_H__
#define __SCC_HIR_BUILDER_H__
#include "hir_prog.h"
#include "scc_hir.h"
#include "scc_hir_prog.h"
typedef struct scc_hir_builder scc_hir_builder_t;

View File

@@ -246,10 +246,9 @@ typedef struct scc_hir_func_meta {
} scc_hir_func_meta_t;
#define SCC_HIR_BBLOCK_VALUES(bblock) \
(*(scc_hir_value_ref_vec_t *)&((bblock).values))
((scc_hir_value_ref_vec_t *)&((bblock)->values))
#define SCC_HIR_BBLOCK_META(bblock) \
((scc_hir_bblock_meta_t *)((bblock).attribute))
#define SCC_HIR_FUNC_META(func) ((scc_hir_func_meta_t *)((func).attribute))
#define SCC_HIR_BBLOCK_META(bblock) ((scc_hir_bblock_meta_t *)((bblock)->meta))
#define SCC_HIR_FUNC_META(func) ((scc_hir_func_meta_t *)((func)->meta))
#endif /* __SCC_HIR_DEF_H__ */

View File

@@ -1,7 +1,7 @@
#ifndef __SCC_HIR_DUMP_H__
#define __SCC_HIR_DUMP_H__
#include "hir_prog.h"
#include "scc_hir_prog.h"
#include <scc_tree_dump.h>
typedef struct {
@@ -9,8 +9,8 @@ typedef struct {
scc_tree_dump_t *dump_ctx;
} scc_hir_dump_t;
void scc_hir_dump_ctx_init(scc_hir_dump_t *ctx, scc_tree_dump_t *tree_dump,
scc_hir_cprog_t *cprog);
void scc_hir_dump_init(scc_hir_dump_t *ctx, scc_tree_dump_t *tree_dump,
scc_hir_cprog_t *cprog);
void scc_hir_dump_value(scc_hir_dump_t *ctx, scc_hir_value_ref_t node_ref);
void scc_hir_dump_type(scc_hir_dump_t *ctx, scc_hir_type_ref_t type_ref);
void scc_hir_dump_bblock(scc_hir_dump_t *ctx, scc_hir_bblock_ref_t bblock_ref);

View File

@@ -1,7 +1,7 @@
#ifndef __SCC_HIR_MODULE_H__
#define __SCC_HIR_MODULE_H__
#include "hir_def.h"
#include "scc_hir_def.h"
#include <scc_cfg.h>
#include <scc_hashtable.h>

View File

@@ -1,8 +1,8 @@
#ifndef __SCC_HIR_PROG_H__
#define __SCC_HIR_PROG_H__
#include "hir_def.h"
#include "hir_module.h"
#include "scc_hir_def.h"
#include "scc_hir_module.h"
typedef struct scc_hir_cprog {
scc_hir_module_t module;

View File

@@ -54,7 +54,7 @@ void scc_hir_func_init(scc_hir_func_t *in, const char *name) {
Assert(in != nullptr);
Assert(name != nullptr);
in->name = name;
scc_hir_func_meta_t *meta = SCC_HIR_FUNC_META(*in);
scc_hir_func_meta_t *meta = SCC_HIR_FUNC_META(in);
meta->type = SCC_HIR_REF_nullptr;
scc_vec_init(in->bblocks);
scc_vec_init(meta->params);

View File

@@ -1,6 +1,6 @@
#include <hir_builder.h>
#include <hir_def.h>
#include <hir_prog.h>
#include <scc_hir_builder.h>
#include <scc_hir_def.h>
#include <scc_hir_prog.h>
#define GET_MODULE(builder) (&(builder->cprog->module))
@@ -175,7 +175,7 @@ scc_hir_func_ref_t scc_hir_builder_func(scc_hir_builder_t *builder,
scc_hir_func_t func;
scc_hir_func_meta_t *meta = scc_malloc(sizeof(scc_hir_func_meta_t));
Assert(meta != nullptr);
func.attribute = meta;
func.meta = meta;
scc_hir_func_init(&func, name);
meta->type = type_ref;
@@ -197,8 +197,8 @@ scc_hir_bblock_ref_t scc_hir_builder_bblock(scc_hir_builder_t *builder,
}
// scc_hir_bblock_meta_t bblock_meta = {0};
// FIXME 当前没有bblock meta
bblock.attribute = nullptr;
scc_vec_init(SCC_HIR_BBLOCK_VALUES(bblock));
bblock.meta = nullptr;
scc_vec_init(*SCC_HIR_BBLOCK_VALUES(&bblock));
scc_hir_bblock_ref_t bblock_ref =
scc_hir_module_add_bblock(GET_MODULE(builder), &bblock);
@@ -298,7 +298,7 @@ void scc_hir_builder_begin_func(scc_hir_builder_t *builder,
SCC_HIR_BUILDER_BEGIN_BORROW(
builder, func_type,
scc_hir_module_get_type(GET_MODULE(builder),
SCC_HIR_FUNC_META(*func_ptr)->type));
SCC_HIR_FUNC_META(func_ptr)->type));
if (func_type == nullptr || func_type->tag != SCC_HIR_TYPE_FUNC) {
LOG_ERROR("Invalid function type");
@@ -313,7 +313,7 @@ void scc_hir_builder_begin_func(scc_hir_builder_t *builder,
return;
}
if (scc_vec_size(func_ptr->bblocks) != 0 ||
scc_vec_size(SCC_HIR_FUNC_META(*func_ptr)->params) != 0) {
scc_vec_size(SCC_HIR_FUNC_META(func_ptr)->params) != 0) {
LOG_FATAL("Multiple function definitions");
SCC_HIR_BUILDER_END_BORROW(builder); // func_type
SCC_HIR_BUILDER_END_BORROW(builder); // func_ptr
@@ -381,7 +381,7 @@ void scc_hir_builder_add_instr(scc_hir_builder_t *builder,
scc_hir_module_get_bblock(GET_MODULE(builder),
builder->current_bblock));
if (current_bblock) {
scc_vec_push(SCC_HIR_BBLOCK_VALUES(*current_bblock), instr);
scc_vec_push(*SCC_HIR_BBLOCK_VALUES(current_bblock), instr);
} else {
LOG_ERROR("Current basic block is not set");
}
@@ -628,7 +628,7 @@ scc_hir_value_ref_t scc_hir_builder_call(scc_hir_builder_t *builder,
SCC_HIR_BUILDER_BEGIN_BORROW(
builder, func_type,
scc_hir_module_get_type(GET_MODULE(builder),
SCC_HIR_FUNC_META(*callee_func)->type));
SCC_HIR_FUNC_META(callee_func)->type));
if (func_type && func_type->tag == SCC_HIR_TYPE_FUNC) {
call_node.type = func_type->data.function.ret_type;
}

View File

@@ -1,5 +1,5 @@
#include <hir_dump.h>
#include <hir_prog.h>
#include <scc_hir_dump.h>
#include <scc_hir_prog.h>
#include <scc_tree_dump.h>
#define GET_MODULE(ctx) (&(ctx->cprog->module))
@@ -192,10 +192,10 @@ static void dump_ret_node(scc_hir_dump_t *ctx, const scc_hir_value_t *value) {
dump_child_node_ref(ctx, value->data.ret.ret_val, true);
}
void scc_hir_dump_ctx_init(scc_hir_dump_t *ctx, scc_tree_dump_t *td,
scc_hir_cprog_t *cprog) {
ctx->cprog = cprog;
void scc_hir_dump_init(scc_hir_dump_t *ctx, scc_tree_dump_t *td,
scc_hir_cprog_t *cprog) {
ctx->dump_ctx = td;
ctx->cprog = cprog;
}
void scc_hir_dump_value(scc_hir_dump_t *ctx, scc_hir_value_ref_t value_ref) {
@@ -327,10 +327,11 @@ void scc_hir_dump_bblock(scc_hir_dump_t *ctx, scc_hir_bblock_ref_t bblock_ref) {
bblock->name ? bblock->name : "<unnamed>");
scc_tree_dump_append(ctx->dump_ctx, "\n");
for (usize i = 0; i < scc_vec_size(SCC_HIR_BBLOCK_VALUES(*bblock)); i++) {
cbool is_last = (i + 1 == scc_vec_size(SCC_HIR_BBLOCK_VALUES(*bblock)));
scc_hir_value_ref_vec_t *values = SCC_HIR_BBLOCK_VALUES(bblock);
scc_vec_foreach(*values, i) {
cbool is_last = (i + 1 == scc_vec_size(*values));
scc_tree_dump_push(ctx->dump_ctx, is_last);
scc_hir_dump_value(ctx, scc_vec_at(SCC_HIR_BBLOCK_VALUES(*bblock), i));
scc_hir_dump_value(ctx, scc_vec_at(*values, i));
scc_tree_dump_pop(ctx->dump_ctx);
}
}
@@ -347,17 +348,16 @@ void scc_hir_dump_func(scc_hir_dump_t *ctx, scc_hir_func_ref_t func_ref) {
func->name ? func->name : "<unnamed>");
scc_tree_dump_append(ctx->dump_ctx, "\n");
if (SCC_HIR_FUNC_META(*func)->type) {
if (SCC_HIR_FUNC_META(func)->type) {
scc_tree_dump_push(ctx->dump_ctx, false);
scc_hir_dump_type(ctx, SCC_HIR_FUNC_META(*func)->type);
scc_hir_dump_type(ctx, SCC_HIR_FUNC_META(func)->type);
scc_tree_dump_pop(ctx->dump_ctx);
}
for (usize i = 0; i < scc_vec_size(SCC_HIR_FUNC_META(*func)->params); i++) {
for (usize i = 0; i < scc_vec_size(SCC_HIR_FUNC_META(func)->params); i++) {
cbool is_last =
(i + 1 == scc_vec_size(SCC_HIR_FUNC_META(*func)->params));
(i + 1 == scc_vec_size(SCC_HIR_FUNC_META(func)->params));
scc_tree_dump_push(ctx->dump_ctx, is_last);
scc_hir_dump_value(ctx,
scc_vec_at(SCC_HIR_FUNC_META(*func)->params, i));
scc_hir_dump_value(ctx, scc_vec_at(SCC_HIR_FUNC_META(func)->params, i));
scc_tree_dump_pop(ctx->dump_ctx);
}
for (usize i = 0; i < scc_vec_size(func->bblocks); i++) {
@@ -630,11 +630,11 @@ void scc_hir_dump_bblock_linear(scc_hir_dump_t *ctx,
else
scc_tree_dump_append_fmt(ctx->dump_ctx, "%%L%d <unnamed>:", bblock_ref);
for (usize i = 0; i < scc_vec_size(SCC_HIR_BBLOCK_VALUES(*bblock)); i++) {
scc_hir_value_ref_vec_t *values = SCC_HIR_BBLOCK_VALUES(bblock);
for (usize i = 0; i < scc_vec_size(*values); i++) {
scc_tree_dump_begin_line(ctx->dump_ctx);
scc_tree_dump_append(ctx->dump_ctx, " ");
scc_hir_dump_value_linear(
ctx, scc_vec_at(SCC_HIR_BBLOCK_VALUES(*bblock), i));
scc_hir_dump_value_linear(ctx, scc_vec_at(*values, i));
}
}
@@ -650,14 +650,14 @@ void scc_hir_dump_func_linear(scc_hir_dump_t *ctx, scc_hir_func_ref_t func_ref,
(func->name && func->name[0]) ? func->name
: "<unnamed>");
if (scc_vec_size(SCC_HIR_FUNC_META(*func)->params) > 0) {
if (scc_vec_size(SCC_HIR_FUNC_META(func)->params) > 0) {
scc_tree_dump_append(ctx->dump_ctx, "(");
for (usize i = 0; i < scc_vec_size(SCC_HIR_FUNC_META(*func)->params);
for (usize i = 0; i < scc_vec_size(SCC_HIR_FUNC_META(func)->params);
i++) {
if (i > 0)
scc_tree_dump_append(ctx->dump_ctx, ", ");
scc_hir_value_ref_t param_ref =
scc_vec_at(SCC_HIR_FUNC_META(*func)->params, i);
scc_vec_at(SCC_HIR_FUNC_META(func)->params, i);
scc_hir_value_t *param_node =
scc_hir_module_get_value(GET_MODULE(ctx), param_ref);
scc_tree_dump_append(ctx->dump_ctx, "%");
@@ -673,7 +673,7 @@ void scc_hir_dump_func_linear(scc_hir_dump_t *ctx, scc_hir_func_ref_t func_ref,
}
scc_tree_dump_append(ctx->dump_ctx, ": ");
scc_hir_dump_type_linear(ctx, SCC_HIR_FUNC_META(*func)->type);
scc_hir_dump_type_linear(ctx, SCC_HIR_FUNC_META(func)->type);
if (is_decl) {
scc_tree_dump_append(ctx->dump_ctx, ";");

View File

@@ -1,4 +1,4 @@
#include <hir_module.h>
#include <scc_hir_module.h>
void scc_hir_module_init(scc_hir_module_t *ctx) {
scc_cfg_module_init(&ctx->cfg_module);
@@ -89,7 +89,7 @@ scc_hir_bblock_ref_t scc_hir_module_add_bblock(scc_hir_module_t *ctx,
scc_hir_func_ref_t scc_hir_module_add_func(scc_hir_module_t *ctx,
const scc_hir_func_t *func) {
scc_hir_func_ref_t ref = scc_cfg_module_add_func(&ctx->cfg_module, func);
scc_vec_push(ctx->funcs_meta, func->attribute);
scc_vec_push(ctx->funcs_meta, func->meta);
return ref;
}

View File

@@ -1,4 +1,4 @@
#include <hir_prog.h>
#include <scc_hir_prog.h>
void scc_hir_cprog_init(scc_hir_cprog_t *in) {
scc_vec_init(in->func_decls);