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:
@@ -1,5 +1,7 @@
|
||||
#include <scc_ast2ir.h>
|
||||
|
||||
static inline void parse_struct_union_layout(scc_ast_type_t *type) {}
|
||||
|
||||
static inline void parse_lexme2const_int(const char *lexme,
|
||||
scc_ir_const_int_t *value) {
|
||||
// FIXME
|
||||
@@ -430,7 +432,7 @@ scc_ir_value_ref_t scc_ast2ir_expr(scc_ast2ir_ctx_t *ctx, scc_ast_expr_t *expr,
|
||||
scc_ast2ir_expr(ctx, expr->subscript.index, false);
|
||||
// 3. 生成 getptr(GEP)
|
||||
scc_ir_value_ref_t elem_ptr =
|
||||
scc_ir_builder_get_ptr(&ctx->builder, base_ptr, index);
|
||||
scc_ir_builder_get_elem_ptr(&ctx->builder, base_ptr, index);
|
||||
// 4. 根据左值/右值返回
|
||||
if (is_lvalue) {
|
||||
return elem_ptr; // 作为左值:返回地址
|
||||
@@ -523,8 +525,8 @@ scc_ir_value_ref_t scc_ast2ir_expr(scc_ast2ir_ctx_t *ctx, scc_ast_expr_t *expr,
|
||||
ctx->builder.ctx.module, ir_type->data.pointer.base);
|
||||
if (target_type->tag == SCC_IR_TYPE_ARRAY) {
|
||||
// 生成 getptr 获取数组首地址
|
||||
return scc_ir_builder_get_ptr(&ctx->builder, in,
|
||||
SCC_IR_REF_nullptr);
|
||||
return scc_ir_builder_get_elem_ptr(&ctx->builder, in,
|
||||
SCC_IR_REF_nullptr);
|
||||
} else {
|
||||
// 标量类型:加载值
|
||||
return scc_ir_builder_load(&ctx->builder, in);
|
||||
|
||||
Reference in New Issue
Block a user