feat(ir): 重构指针操作API并优化数组访问逻辑
- 将scc_ir_builder_get_ptr重命名为scc_ir_builder_get_elem_ptr以更好地反映其功能 - 移除旧的GET_PTR相关枚举和结构体定义 - 更新IR构建器中指针类型的处理逻辑,支持数组元素指针计算 - 在代码生成阶段正确处理元素指针操作的索引计算 fix(ast2ir): 修正数组下标表达式的指针获取操作 - 将数组访问中的get_ptr调用替换为get_elem_ptr - 确保数组元素访问使用正确的IR指令 perf(runtime): 优化fprintf函数的大字符串处理性能 - 实现动态缓冲区分配策略,小字符串使用栈缓冲区,大字符串使用堆分配 - 避免固定大小缓冲区可能导致的截断问题 - 添加适当的内存清理机制
This commit is contained in:
@@ -287,14 +287,14 @@ static void parse_value(scc_ir2mcode_ctx_t *ctx, scc_ir_bblock_ref_t node_ref,
|
||||
break;
|
||||
}
|
||||
///< 获取指针
|
||||
case SCC_IR_VALUE_TAG_GET_PTR: {
|
||||
case SCC_IR_VALUE_TAG_GET_ELEM_PTR: {
|
||||
scc_reg_loc_t loc_res;
|
||||
parse_location(ctx, &loc_res, node_ref);
|
||||
|
||||
scc_ir_value_t *src_addr = scc_ir_module_get_value(
|
||||
GET_MODULE(ctx), value->data.get_ptr.src_addr);
|
||||
GET_MODULE(ctx), value->data.get_elem_ptr.src_addr);
|
||||
Assert(src_addr != nullptr);
|
||||
if (value->data.get_ptr.index == 0) {
|
||||
if (value->data.get_elem_ptr.index == 0) {
|
||||
if (src_addr->tag == SCC_IR_VALUE_TAG_GLOBAL_ALLOC) {
|
||||
// 全局变量:RIP相对寻址
|
||||
scc_mcode_amd64_lea_r64_rip_rel32(&ctx->sect_mcode,
|
||||
@@ -314,30 +314,35 @@ static void parse_value(scc_ir2mcode_ctx_t *ctx, scc_ir_bblock_ref_t node_ref,
|
||||
} 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);
|
||||
parse_location(ctx, &src_loc,
|
||||
value->data.get_elem_ptr.src_addr);
|
||||
src_loc.kind = SCC_REG_KIND_STACK_ADDR;
|
||||
load_value_to_reg(ctx, &src_loc, SCC_AMD64_RAX);
|
||||
} else {
|
||||
// 其他情况(如链式
|
||||
// getptr):源地址值已经存储在某个位置,直接加载到 RAX
|
||||
// 其他情况(如链式getptr):源地址值已经存储在某个位置,直接加载到
|
||||
// RAX
|
||||
scc_reg_loc_t src_loc;
|
||||
parse_location(ctx, &src_loc, value->data.get_ptr.src_addr);
|
||||
parse_location(ctx, &src_loc,
|
||||
value->data.get_elem_ptr.src_addr);
|
||||
load_value_to_reg(ctx, &src_loc, SCC_AMD64_RAX);
|
||||
}
|
||||
|
||||
store_value_from_reg(ctx, &loc_res, SCC_AMD64_RAX);
|
||||
} else {
|
||||
// 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);
|
||||
}
|
||||
parse_value(ctx, value->data.get_elem_ptr.index, patches);
|
||||
|
||||
scc_reg_loc_t src_loc;
|
||||
scc_reg_loc_t idx_loc;
|
||||
parse_location(ctx, &src_loc, value->data.get_elem_ptr.src_addr);
|
||||
parse_location(ctx, &idx_loc, value->data.get_elem_ptr.index);
|
||||
src_loc.kind = SCC_REG_KIND_STACK_ADDR;
|
||||
load_value_to_reg(ctx, &src_loc, SCC_AMD64_RAX);
|
||||
load_value_to_reg(ctx, &idx_loc, SCC_AMD64_RDX);
|
||||
scc_mcode_amd64_lea_r64_m64_sib(&ctx->sect_mcode, SCC_AMD64_RAX,
|
||||
SCC_AMD64_RAX, SCC_AMD64_RDX, 1, 0);
|
||||
}
|
||||
store_value_from_reg(ctx, &loc_res, SCC_AMD64_RAX);
|
||||
break;
|
||||
}
|
||||
case SCC_IR_VALUE_TAG_GET_ELEM_PTR: ///< 获取元素指针(used by array)
|
||||
TODO();
|
||||
///< 二元运算
|
||||
case SCC_IR_VALUE_TAG_OP: {
|
||||
scc_reg_loc_t loc_lhs;
|
||||
|
||||
@@ -49,7 +49,6 @@ void scc_reg_alloc_strategy_pure_stack(scc_reg_alloc_t *ctx,
|
||||
switch (node->tag) {
|
||||
case SCC_IR_VALUE_TAG_LOAD:
|
||||
case SCC_IR_VALUE_TAG_OP:
|
||||
case SCC_IR_VALUE_TAG_GET_PTR:
|
||||
case SCC_IR_VALUE_TAG_GET_ELEM_PTR:
|
||||
case SCC_IR_VALUE_TAG_CALL: // 返回值
|
||||
loc.kind = SCC_REG_KIND_STACK;
|
||||
|
||||
Reference in New Issue
Block a user