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:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
// 借用类型信息
|
||||
|
||||
@@ -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
|
||||
// 目标指针大小,可以定义为 8(64位)或从 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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user