feat(ast): 重构AST节点类型定义并实现数组下标访问
- 将scc_ast_node_type_t重命名为scc_ast_node_kind_t以提高语义清晰度 - 为scc_ast_node结构体添加名称定义 - 更新所有相关头文件中的类型引用 - 实现数组下标表达式的IR转换逻辑 - 添加对sizeof和alignof表达式的基本支持 fix(ast2ir): 修复表达式求值和类型处理问题 - 修复数组类型退化为指针的逻辑 - 修复变量声明初始化值检查条件 - 添加结构体和枚举类型的IR生成支持 - 移除未使用的代码段 refactor(ir): 完善IR上下文错误处理 - 为未处理的类型标签添加恐慌处理 - 修复联合类型的哈希计算 chore(build): 更新依赖项配置 - 修正lexer模块中的依赖项名称 style(parser): 清理解析器代码 - 移除未使用的类型哈希表 - 更新语义分析回调函数签名 - 添加属性语法的占位符实现 - 完善内存清理逻辑 test: 添加数组下标和枚举测试用例 - 新增15_array_subscript.c测试数组下标访问 - 新增16_enum.c测试枚举类型功能 - 更新期望结果配置文件
This commit is contained in:
@@ -77,11 +77,10 @@ static void win64_finalize(scc_frame_alloc_ops_t *ops) {
|
||||
current_offset -= (align - rem);
|
||||
}
|
||||
|
||||
current_offset -= slot->size;
|
||||
slot->offset = current_offset;
|
||||
scc_hashtable_set(&self->offset_cache, (void *)(intptr_t)slot->slot_id,
|
||||
(void *)(intptr_t)slot->offset);
|
||||
|
||||
current_offset -= slot->size;
|
||||
}
|
||||
|
||||
int total_size = -current_offset + 32; // 加上影子空间
|
||||
|
||||
@@ -294,38 +294,46 @@ static void parse_value(scc_ir2mcode_ctx_t *ctx, scc_ir_bblock_ref_t node_ref,
|
||||
scc_ir_value_t *src_addr = scc_ir_module_get_value(
|
||||
GET_MODULE(ctx), value->data.get_ptr.src_addr);
|
||||
Assert(src_addr != nullptr);
|
||||
if (value->data.get_ptr.index == 0) {
|
||||
if (src_addr->tag == SCC_IR_VALUE_TAG_GLOBAL_ALLOC) {
|
||||
// 全局变量:RIP相对寻址
|
||||
scc_mcode_amd64_lea_r64_rip_rel32(&ctx->sect_mcode,
|
||||
SCC_AMD64_RAX, 0);
|
||||
usize sym_idx =
|
||||
sccf_builder_get_symbol_idx(ctx->builder, src_addr->name);
|
||||
Assert(sym_idx != 0);
|
||||
sccf_builder_add_reloc(
|
||||
ctx->builder,
|
||||
(sccf_reloc_t){
|
||||
.reloc_type = SCCF_RELOC_TYPE_REL,
|
||||
.offset = scc_vec_size(ctx->sect_mcode.mcode) - 4,
|
||||
.addend = 4,
|
||||
.sect_type = SCCF_SECT_CODE,
|
||||
.sym_idx = sym_idx,
|
||||
});
|
||||
} else if (src_addr->tag == SCC_IR_VALUE_TAG_ALLOC) {
|
||||
// 栈上变量:地址为 rbp - offset
|
||||
scc_reg_loc_t src_loc;
|
||||
parse_location(ctx, &src_loc, value->data.get_ptr.src_addr);
|
||||
src_loc.kind = SCC_REG_KIND_STACK_ADDR;
|
||||
load_value_to_reg(ctx, &src_loc, SCC_AMD64_RAX);
|
||||
} else {
|
||||
// 其他情况(如链式
|
||||
// getptr):源地址值已经存储在某个位置,直接加载到 RAX
|
||||
scc_reg_loc_t src_loc;
|
||||
parse_location(ctx, &src_loc, value->data.get_ptr.src_addr);
|
||||
load_value_to_reg(ctx, &src_loc, SCC_AMD64_RAX);
|
||||
}
|
||||
|
||||
if (src_addr->tag == SCC_IR_VALUE_TAG_GLOBAL_ALLOC) {
|
||||
// 全局变量:RIP相对寻址
|
||||
scc_mcode_amd64_lea_r64_rip_rel32(&ctx->sect_mcode, SCC_AMD64_RAX,
|
||||
0);
|
||||
usize sym_idx =
|
||||
sccf_builder_get_symbol_idx(ctx->builder, src_addr->name);
|
||||
Assert(sym_idx != 0);
|
||||
sccf_builder_add_reloc(
|
||||
ctx->builder,
|
||||
(sccf_reloc_t){
|
||||
.reloc_type = SCCF_RELOC_TYPE_REL,
|
||||
.offset = scc_vec_size(ctx->sect_mcode.mcode) - 4,
|
||||
.addend = 4,
|
||||
.sect_type = SCCF_SECT_CODE,
|
||||
.sym_idx = sym_idx,
|
||||
});
|
||||
} else if (src_addr->tag == SCC_IR_VALUE_TAG_ALLOC) {
|
||||
// 栈上变量:地址为 rbp - offset
|
||||
scc_reg_loc_t src_loc;
|
||||
parse_location(ctx, &src_loc, value->data.get_ptr.src_addr);
|
||||
src_loc.kind = SCC_REG_KIND_STACK_ADDR;
|
||||
load_value_to_reg(ctx, &src_loc, SCC_AMD64_RAX);
|
||||
store_value_from_reg(ctx, &loc_res, SCC_AMD64_RAX);
|
||||
} else {
|
||||
// 其他情况(如链式 getptr):源地址值已经存储在某个位置,直接加载到
|
||||
// RAX
|
||||
scc_reg_loc_t src_loc;
|
||||
parse_location(ctx, &src_loc, value->data.get_ptr.src_addr);
|
||||
load_value_to_reg(ctx, &src_loc, SCC_AMD64_RAX);
|
||||
// TODO
|
||||
scc_ir_value_t *index = scc_ir_module_get_value(
|
||||
GET_MODULE(ctx), value->data.get_ptr.index);
|
||||
Assert(index != nullptr &&
|
||||
index->tag == SCC_IR_VALUE_TAG_CONST_INT);
|
||||
}
|
||||
|
||||
store_value_from_reg(ctx, &loc_res, SCC_AMD64_RAX);
|
||||
break;
|
||||
}
|
||||
case SCC_IR_VALUE_TAG_GET_ELEM_PTR: ///< 获取元素指针(used by array)
|
||||
|
||||
@@ -9,7 +9,10 @@ void scc_ir2mcode_init(scc_ir2mcode_ctx_t *ctx, scc_ir_cprog_t *cprog,
|
||||
sccf_builder_init(ctx->builder);
|
||||
}
|
||||
|
||||
void scc_ir2mcode_drop(scc_ir2mcode_ctx_t *ctx) {}
|
||||
void scc_ir2mcode_drop(scc_ir2mcode_ctx_t *ctx) {
|
||||
// TODO drop all objs
|
||||
scc_ir_cprog_drop(ctx->cprog);
|
||||
}
|
||||
|
||||
void scc_ir2amd64(scc_ir2mcode_ctx_t *ctx);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user