feat(ir2mcode): 添加帧分配器框架和Windows 64位实现
添加了frame_alloc.h头文件定义帧分配器操作接口,实现了Windows 64位 平台的帧分配器实现,包括槽位分配、偏移计算和栈帧布局管理功能。 BREAKING CHANGE: 移除了旧的frame_manager.h接口,采用新的frame_alloc_ops_t 抽象接口。 fix(ast2ir): 修复字符串字面量表达式返回值问题 修复了AST到IR转换过程中字符串字面量表达式的处理,确保正确返回 创建的常量字符串值引用而非直接跳出。 fix(ir): 修复内置memcpy函数参数验证和类型比较逻辑 在IR构建器中为builtin_memcpy函数添加参数空指针检查,在类型比较 函数中添加未知类型的边界条件处理,增强系统稳定性。 refactor(ir2mcode): 重构寄存器分配器接口以支持帧分配器集成 修改寄存器分配器接口以接受帧分配器参数,统一节点到位置的映射表 命名,并提供便捷的栈大小和偏移获取接口。
This commit is contained in:
@@ -64,6 +64,10 @@ static u32 hash_type(const void *_key) {
|
||||
}
|
||||
static int cmp_type(const void *_key1, const void *_key2) {
|
||||
const scc_ir_type_t *key1 = _key1, *key2 = _key2;
|
||||
Assert(key1 != nullptr && key2 != nullptr);
|
||||
if (key1->tag == SCC_IR_TYPE_unknown || key2->tag == SCC_IR_TYPE_unknown) {
|
||||
return 1;
|
||||
}
|
||||
// tag不同
|
||||
if (key1->tag != key2->tag) {
|
||||
return 1;
|
||||
|
||||
@@ -481,9 +481,17 @@ void scc_ir_dump_value_linear(scc_ir_dump_ctx_t *ctx,
|
||||
|
||||
switch (value->tag) {
|
||||
case SCC_IR_VALUE_TAG_BUILTIN: {
|
||||
scc_tree_dump_append(ctx->dump_ctx, "@scc::");
|
||||
switch (value->data.builtin.tag) {
|
||||
case SCC_IR_BUILTIN_TAG_MEMCPY:
|
||||
scc_tree_dump_append(ctx->dump_ctx, "memcpy");
|
||||
scc_tree_dump_append(ctx->dump_ctx, "(");
|
||||
format_ref_or_value(ctx, value->data.builtin.func.memcpy.dest);
|
||||
scc_tree_dump_append(ctx->dump_ctx, ", ");
|
||||
format_ref_or_value(ctx, value->data.builtin.func.memcpy.src);
|
||||
scc_tree_dump_append(ctx->dump_ctx, ", ");
|
||||
format_ref_or_value(ctx, value->data.builtin.func.memcpy.size);
|
||||
scc_tree_dump_append(ctx->dump_ctx, ")");
|
||||
break;
|
||||
case SCC_IR_BUILTIN_TAG_MEMSET:
|
||||
scc_tree_dump_append(ctx->dump_ctx, "memset");
|
||||
@@ -606,7 +614,8 @@ void scc_ir_dump_value_linear(scc_ir_dump_ctx_t *ctx,
|
||||
value->data.arg_ref.idx);
|
||||
break;
|
||||
case SCC_IR_VALUE_TAG_GLOBAL_ALLOC:
|
||||
scc_tree_dump_append_fmt(ctx->dump_ctx, "global %s\n", value->name);
|
||||
scc_tree_dump_append_fmt(ctx->dump_ctx, "global %s", value->name);
|
||||
scc_tree_dump_begin_line(ctx->dump_ctx);
|
||||
scc_ir_dump_value_linear(ctx, value->data.global_alloc.value);
|
||||
return;
|
||||
case SCC_IR_VALUE_TAG_CONST_ARRAY:
|
||||
@@ -699,6 +708,7 @@ void scc_ir_dump_func_linear(scc_ir_dump_ctx_t *ctx, scc_ir_func_ref_t func_ref,
|
||||
|
||||
void scc_ir_dump_cprog_linear(scc_ir_dump_ctx_t *ctx) {
|
||||
for (usize i = 0; i < scc_vec_size(ctx->cprog->global_vals); i++) {
|
||||
scc_tree_dump_begin_line(ctx->dump_ctx);
|
||||
scc_ir_dump_value_linear(ctx, scc_vec_at(ctx->cprog->global_vals, i));
|
||||
}
|
||||
for (usize i = 0; i < scc_vec_size(ctx->cprog->func_decls); i++) {
|
||||
|
||||
Reference in New Issue
Block a user