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:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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__ */
|
||||
@@ -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);
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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, ";");
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
Reference in New Issue
Block a user