refactor(ast2ir): 提取模块访问函数并优化类型大小计算

- 添加 scc_ast2ir_mir_module 内联函数统一访问模块
- 替换所有直接访问 ctx->builder.cprog->module 的地方
- 移除重复的 scc_hir_type_size 函数实现
- 添加 scc_hir_module_type_size 函数到模块接口
- 更新所有类型大小计算调用使用新函数

feat(hir): 增强构建器安全性和全局变量处理

- 为 scc_hir_builder_integer 添加空指针检查断言
- 修复 scc_hir_builder_global_alloca 中全局变量类型设置
- 改进 scc_hir_builder_get_elem_ptr 处理空指针索引情况
- 重构字符串常量生成使用 get_elem_ptr 构建器函数

refactor(lir): 简化地址表达式表示并增强内置函数支持

- 移除复杂地址结构体 scc_lir_addr_t
- 简化 scc_lir_instr 结构体中的地址表示
- 移除 STORE_ADDR 操作码
- 添加 memcpy 和 memset 内置函数操作码
- 在符号元数据中使用联合体替代嵌套结构体

feat(hir2lir): 完善 HIR 到 LIR 转换中的内置函数处理

- 添加 ensure_vreg 辅助函数确保虚拟寄存器操作数
- 正确处理全局变量地址符号引用
- 优化 GET_ELEM_PTR 转换使用类型大小计算
- 完整实现所有内置函数(BUILTIN)的 LIR 转换
- 包括 memcpy、memset、va_start、va_arg、va_end、va_copy 等
This commit is contained in:
zzy
2026-05-22 15:15:18 +08:00
parent 41d060d7e7
commit d78b91894e
27 changed files with 1272 additions and 563 deletions

View File

@@ -131,6 +131,7 @@ scc_hir_value_ref_t scc_hir_builder_builtin_memcpy(scc_hir_builder_t *builder,
static inline scc_hir_value_ref_t
scc_hir_builder_integer(scc_hir_builder_t *builder, scc_hir_type_ref_t type,
scc_ap_t *val) {
Assert(builder != nullptr && val != nullptr);
scc_hir_value_t value;
scc_hir_value_init(&value, nullptr, SCC_HIR_VALUE_TAG_INTEGER);
// FIXME assign

View File

@@ -38,6 +38,7 @@ scc_hir_bblock_t *scc_hir_module_get_bblock(scc_hir_module_t *ctx,
scc_hir_bblock_ref_t ref);
scc_hir_func_t *scc_hir_module_get_func(scc_hir_module_t *ctx,
scc_hir_func_ref_t ref);
usize scc_hir_module_type_size(scc_hir_module_t *ctx, scc_hir_type_t *type);
static inline scc_hir_type_t *
scc_hir_module_get_type_by_value(scc_hir_module_t *ctx,

View File

@@ -287,14 +287,8 @@ scc_hir_value_ref_t scc_hir_builder_const_string(scc_hir_builder_t *builder,
scc_hir_builder_global_alloca(builder, array_type_ref, const_array_ref);
// scc_hashtable_insert(builder);
scc_hir_value_ref_t pointer_to_global_value = scc_hir_module_add_value(
GET_MODULE(builder),
&(scc_hir_value_t){
.tag = SCC_HIR_VALUE_TAG_GET_ELEM_PTR,
.data.get_elem_ptr.src_addr = global_value_ref,
.data.get_elem_ptr.index = SCC_HIR_VALUE_TAG_NULLPTR,
});
scc_hir_builder_add_instr(builder, pointer_to_global_value);
scc_hir_value_ref_t pointer_to_global_value = scc_hir_builder_get_elem_ptr(
builder, global_value_ref, SCC_HIR_VALUE_TAG_NULLPTR);
return pointer_to_global_value;
}
@@ -406,12 +400,18 @@ scc_hir_value_ref_t scc_hir_builder_global_alloca(scc_hir_builder_t *builder,
scc_hir_type_ref_t type,
scc_hir_value_ref_t value) {
SCC_HIR_BUILDER_CHECK_NO_BORROW(builder);
// 全局变量的实际类型是指向 type 的指针
scc_hir_type_t ptr_type = {.tag = SCC_HIR_TYPE_PTR,
.data.pointer.base = type};
scc_hir_type_ref_t ptr_type_ref = scc_hir_builder_type(builder, &ptr_type);
// FIXME
char *name = scc_malloc(32);
scc_hir_value_ref_t global_value_ref = scc_hir_module_add_value(
GET_MODULE(builder), &(scc_hir_value_t){
.name = name,
.tag = SCC_HIR_VALUE_TAG_GLOBAL_ALLOC,
.type = type,
.type = ptr_type_ref, // 类型是指针
.data.global_alloc.value = value,
});
scc_snprintf(name, 32, "$G%u", global_value_ref);
@@ -506,6 +506,12 @@ scc_hir_value_ref_t scc_hir_builder_get_elem_ptr(scc_hir_builder_t *builder,
scc_hir_value_t get_ptr_node = {0};
get_ptr_node.tag = SCC_HIR_VALUE_TAG_GET_ELEM_PTR;
get_ptr_node.data.get_elem_ptr.src_addr = target;
if (index == SCC_HIR_REF_nullptr) {
scc_ap_t ap = {.capacity = -1, .len = 0, .data.digit = 0};
index = scc_hir_builder_integer(builder,
scc_hir_builder_type_u8(builder), &ap);
}
Assert(target != SCC_HIR_REF_nullptr && index != SCC_HIR_REF_nullptr);
get_ptr_node.data.get_elem_ptr.index = index;
// 借用类型信息

View File

@@ -126,3 +126,46 @@ scc_hir_func_t *scc_hir_module_get_func(scc_hir_module_t *ctx,
scc_hir_func_ref_t ref) {
return scc_cfg_module_unsafe_get_func(&ctx->cfg_module, ref);
}
usize scc_hir_module_type_size(scc_hir_module_t *ctx, scc_hir_type_t *type) {
Assert(type != nullptr);
switch (type->tag) {
case SCC_HIR_TYPE_unknown:
case SCC_HIR_TYPE_void:
return 0;
case SCC_HIR_TYPE_i8:
case SCC_HIR_TYPE_u8:
return 1;
case SCC_HIR_TYPE_i16:
case SCC_HIR_TYPE_u16:
return 2;
case SCC_HIR_TYPE_f32:
case SCC_HIR_TYPE_i32:
case SCC_HIR_TYPE_u32:
return 4;
case SCC_HIR_TYPE_f64:
case SCC_HIR_TYPE_i64:
case SCC_HIR_TYPE_u64:
return 8;
case SCC_HIR_TYPE_FUNC:
case SCC_HIR_TYPE_PTR: {
// TODO
// 目标指针大小,可以定义为 864位或从 ABI 获取
// 假设你的目标架构是 64 位
return 8;
}
case SCC_HIR_TYPE_ARRAY: {
usize elem_size = scc_hir_module_type_size(
ctx, scc_hir_module_get_type(ctx, type->data.array.base));
return elem_size * type->data.array.len;
}
case SCC_HIR_TYPE_STRUCT:
case SCC_HIR_TYPE_UNION:
// 暂时无法计算,保守返回 0 或报错
LOG_ERROR("Cannot compute size of struct/union without layout info");
return 0;
default:
LOG_ERROR("Unknown type tag %d", type->tag);
return 0;
}
}