feat(abi): 新增ABI类型布局描述接口和Windows x64实现
- 新增scc_abi包,包含基础类型布局描述接口 - 实现Windows x64 ABI类型布局计算功能 - 定义基本类型枚举和布局信息结构体 - 提供类型布局计算的核心接口函数 refactor(ast2ir): 使用新的ABI接口替换旧的类型转换实现 - 将旧的scc_type_abi_t替换为新的scc_abi_type_calc_t - 更新AST到IR的类型转换逻辑,使用新的ABI计算接口 - 修改上下文初始化和类型解析相关代码 - 移除废弃的头文件和相关实现 refactor(ir): 统一IR节点引用类型命名并完善构建器功能 - 将scc_ir_node_ref_vec_t重命名为scc_ir_value_ref_vec_t保持一致性 - 更新聚合类型的字段名称从elements到fields - 添加全局变量分配构建器函数scc_ir_builder_global_alloca - 清理构建器中多余的注释和代码
This commit is contained in:
@@ -42,6 +42,19 @@ scc_ir_type_ref_t scc_ir_builder_type(scc_ir_builder_t *builder,
|
||||
void scc_ir_builder_add_instr(scc_ir_builder_t *builder,
|
||||
scc_ir_value_ref_t instr);
|
||||
|
||||
scc_ir_value_ref_t scc_ir_builder_global_alloca(scc_ir_builder_t *builder,
|
||||
scc_ir_type_ref_t type,
|
||||
scc_ir_value_ref_t value);
|
||||
|
||||
/**
|
||||
* @brief 创建alloca指令(在当前基本块中)
|
||||
* @param type 分配的类型
|
||||
* @param name 变量名(可为nullptr)
|
||||
*/
|
||||
scc_ir_value_ref_t scc_ir_builder_alloca(scc_ir_builder_t *builder,
|
||||
scc_ir_type_ref_t type,
|
||||
const char *name);
|
||||
|
||||
#define SCC_IR_BUILDER_TYPE_FUNC(scc_type) \
|
||||
[[maybe_unused]] static inline scc_ir_type_ref_t \
|
||||
scc_ir_builder_type_##scc_type(scc_ir_builder_t *builder) { \
|
||||
@@ -122,25 +135,15 @@ scc_ir_builder_const_string(scc_ir_builder_t *builder, const char *str,
|
||||
buff[i - 1] = str[i];
|
||||
}
|
||||
buff[len - 2] = '\0';
|
||||
scc_vec_unsafe_from_buffer(const_array_value.data.const_array.elements,
|
||||
scc_vec_unsafe_from_buffer(const_array_value.data.const_array.fields,
|
||||
(u8 *)buff, len - 1);
|
||||
scc_ir_value_ref_t const_array_ref =
|
||||
scc_ir_module_add_value(builder->ctx.module, &const_array_value);
|
||||
Assert(const_array_ref != SCC_IR_REF_nullptr);
|
||||
|
||||
// 3. 创建全局变量节点,类型为指针,初始值指向常量数组
|
||||
char *name = scc_malloc(32);
|
||||
// FIXME MAYBE MEMORY LEAK
|
||||
|
||||
scc_ir_value_ref_t global_value_ref = scc_ir_module_add_value(
|
||||
builder->ctx.module, &(scc_ir_value_t){
|
||||
.name = name,
|
||||
.tag = SCC_IR_VALUE_TAG_GLOBAL_ALLOC,
|
||||
.type = array_type_ref,
|
||||
.data.global_alloc.value = const_array_ref,
|
||||
});
|
||||
scc_snprintf(name, 32, "$G%u", global_value_ref);
|
||||
scc_vec_push(builder->cprog->global_vals, global_value_ref);
|
||||
scc_ir_value_ref_t global_value_ref =
|
||||
scc_ir_builder_global_alloca(builder, array_type_ref, const_array_ref);
|
||||
// scc_hashtable_insert(builder);
|
||||
|
||||
scc_ir_value_ref_t pointer_to_global_value = scc_ir_module_add_value(
|
||||
@@ -203,15 +206,6 @@ scc_ir_func_ref_t scc_ir_builder_current_bblock(scc_ir_builder_t *builder);
|
||||
void scc_ir_builder_set_current_bblock(scc_ir_builder_t *builder,
|
||||
scc_ir_bblock_ref_t bblock);
|
||||
|
||||
/**
|
||||
* @brief 创建alloca指令(在当前基本块中)
|
||||
* @param type 分配的类型
|
||||
* @param name 变量名(可为nullptr)
|
||||
*/
|
||||
scc_ir_value_ref_t scc_ir_builder_alloca(scc_ir_builder_t *builder,
|
||||
scc_ir_type_ref_t type,
|
||||
const char *name);
|
||||
|
||||
scc_ir_value_ref_t scc_ir_builder_func_arg_ref(scc_ir_builder_t *builder,
|
||||
scc_ir_type_ref_t type,
|
||||
const char *name, usize arg_idx);
|
||||
|
||||
@@ -12,7 +12,7 @@ typedef SCC_VEC(u8) scc_ir_buffer_t;
|
||||
|
||||
typedef struct scc_ir_value scc_ir_value_t;
|
||||
typedef ir_handle_t scc_ir_value_ref_t;
|
||||
typedef SCC_VEC(scc_ir_value_ref_t) scc_ir_node_ref_vec_t;
|
||||
typedef SCC_VEC(scc_ir_value_ref_t) scc_ir_value_ref_vec_t;
|
||||
|
||||
typedef struct scc_ir_type scc_ir_type_t;
|
||||
typedef ir_handle_t scc_ir_type_ref_t;
|
||||
@@ -63,7 +63,7 @@ struct scc_ir_type {
|
||||
scc_ir_type_ref_t base;
|
||||
} pointer;
|
||||
struct {
|
||||
scc_ir_type_ref_vec_t elements;
|
||||
scc_ir_type_ref_vec_t fields;
|
||||
} aggregate;
|
||||
struct {
|
||||
scc_ir_type_ref_vec_t params;
|
||||
@@ -74,14 +74,14 @@ struct scc_ir_type {
|
||||
|
||||
struct scc_ir_bblock {
|
||||
scc_ir_label_t label;
|
||||
scc_ir_node_ref_vec_t instrs;
|
||||
scc_ir_value_ref_vec_t instrs;
|
||||
// ir_arr_t used_by;
|
||||
}; // basic block
|
||||
|
||||
struct scc_ir_func {
|
||||
scc_ir_label_t name;
|
||||
scc_ir_type_ref_t type;
|
||||
scc_ir_node_ref_vec_t params;
|
||||
scc_ir_value_ref_vec_t params;
|
||||
scc_ir_bblock_ref_vec_t bblocks;
|
||||
};
|
||||
|
||||
@@ -225,7 +225,7 @@ typedef enum {
|
||||
struct scc_ir_value {
|
||||
scc_ir_type_ref_t type;
|
||||
scc_ir_label_t name;
|
||||
scc_ir_node_ref_vec_t used_by;
|
||||
scc_ir_value_ref_vec_t used_by;
|
||||
scc_ir_value_tag_t tag;
|
||||
union {
|
||||
scc_ir_builtin_t builtin;
|
||||
@@ -234,10 +234,10 @@ struct scc_ir_value {
|
||||
scc_ir_const_float_t const_float;
|
||||
struct {
|
||||
scc_ir_value_ref_t base_type;
|
||||
scc_ir_buffer_t elements;
|
||||
scc_ir_buffer_t fields;
|
||||
} const_array;
|
||||
struct {
|
||||
scc_ir_node_ref_vec_t elements;
|
||||
scc_ir_value_ref_vec_t fields;
|
||||
} aggregate;
|
||||
struct {
|
||||
usize idx;
|
||||
@@ -276,7 +276,7 @@ struct scc_ir_value {
|
||||
} jump;
|
||||
struct {
|
||||
scc_ir_func_ref_t callee; // TODO function pointer call
|
||||
scc_ir_node_ref_vec_t args;
|
||||
scc_ir_value_ref_vec_t args;
|
||||
} call;
|
||||
struct {
|
||||
scc_ir_value_ref_t ret_val;
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
|
||||
typedef struct scc_ir_cprog {
|
||||
scc_ir_module_t module;
|
||||
scc_ir_node_ref_vec_t global_vals; /* 全局变量 */
|
||||
scc_ir_func_ref_vec_t func_defs; /* 所有函数定义 */
|
||||
scc_ir_func_ref_vec_t func_decls; /* 所有函数包括定义的声明 */
|
||||
scc_ir_value_ref_vec_t global_vals; /* 全局变量 */
|
||||
scc_ir_func_ref_vec_t func_defs; /* 所有函数定义 */
|
||||
scc_ir_func_ref_vec_t func_decls; /* 所有函数包括定义的声明 */
|
||||
} scc_ir_cprog_t;
|
||||
|
||||
void scc_ir_cprog_init(scc_ir_cprog_t *in);
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#include "ir_def.h"
|
||||
#include <ir_builder.h>
|
||||
#include <ir_prog.h>
|
||||
|
||||
@@ -147,6 +148,24 @@ void scc_ir_builder_add_instr(scc_ir_builder_t *builder,
|
||||
}
|
||||
}
|
||||
|
||||
scc_ir_value_ref_t scc_ir_builder_global_alloca(scc_ir_builder_t *builder,
|
||||
scc_ir_type_ref_t type,
|
||||
scc_ir_value_ref_t value) {
|
||||
// FIXME MAYBE MEMORY LEAK
|
||||
char *name = scc_malloc(32);
|
||||
scc_ir_value_ref_t global_value_ref = scc_ir_module_add_value(
|
||||
builder->ctx.module, &(scc_ir_value_t){
|
||||
.name = name,
|
||||
.tag = SCC_IR_VALUE_TAG_GLOBAL_ALLOC,
|
||||
.type = type,
|
||||
.data.global_alloc.value = value,
|
||||
});
|
||||
scc_snprintf(name, 32, "$G%u", global_value_ref);
|
||||
|
||||
scc_vec_push(builder->cprog->global_vals, global_value_ref);
|
||||
return global_value_ref;
|
||||
}
|
||||
|
||||
scc_ir_value_ref_t scc_ir_builder_alloca(scc_ir_builder_t *builder,
|
||||
scc_ir_type_ref_t type,
|
||||
const char *name) {
|
||||
@@ -160,9 +179,7 @@ scc_ir_value_ref_t scc_ir_builder_alloca(scc_ir_builder_t *builder,
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &alloc_node);
|
||||
|
||||
// 添加到当前基本块
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
|
||||
return value_ref;
|
||||
}
|
||||
|
||||
@@ -178,7 +195,7 @@ scc_ir_value_ref_t scc_ir_builder_func_arg_ref(scc_ir_builder_t *builder,
|
||||
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &value);
|
||||
// 添加到当前基本块
|
||||
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
return value_ref;
|
||||
}
|
||||
@@ -203,9 +220,7 @@ scc_ir_value_ref_t scc_ir_builder_load(scc_ir_builder_t *builder,
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &load_node);
|
||||
|
||||
// 添加到当前基本块
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
|
||||
return value_ref;
|
||||
}
|
||||
|
||||
@@ -221,9 +236,7 @@ scc_ir_value_ref_t scc_ir_builder_store(scc_ir_builder_t *builder,
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &store_node);
|
||||
|
||||
// 添加到当前基本块
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
|
||||
return value_ref;
|
||||
}
|
||||
|
||||
@@ -259,9 +272,7 @@ scc_ir_value_ref_t scc_ir_builder_get_elem_ptr(scc_ir_builder_t *builder,
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &get_ptr_node);
|
||||
|
||||
// 添加到当前基本块
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
|
||||
return value_ref;
|
||||
}
|
||||
|
||||
@@ -285,9 +296,7 @@ scc_ir_value_ref_t scc_ir_builder_binop(scc_ir_builder_t *builder,
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &binop_node);
|
||||
|
||||
// 添加到当前基本块
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
|
||||
return value_ref;
|
||||
}
|
||||
|
||||
@@ -323,9 +332,7 @@ scc_ir_value_ref_t scc_ir_builder_jump(scc_ir_builder_t *builder,
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &jump_node);
|
||||
|
||||
// 添加到当前基本块
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
|
||||
return value_ref;
|
||||
}
|
||||
|
||||
@@ -342,9 +349,7 @@ scc_ir_value_ref_t scc_ir_builder_branch(scc_ir_builder_t *builder,
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &branch_node);
|
||||
|
||||
// 添加到当前基本块
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
|
||||
return value_ref;
|
||||
}
|
||||
|
||||
@@ -375,9 +380,7 @@ scc_ir_value_ref_t scc_ir_builder_call(scc_ir_builder_t *builder,
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &call_node);
|
||||
|
||||
// 添加到当前基本块
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
|
||||
return value_ref;
|
||||
}
|
||||
|
||||
@@ -390,9 +393,7 @@ scc_ir_value_ref_t scc_ir_builder_ret(scc_ir_builder_t *builder,
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &ret_node);
|
||||
|
||||
// 添加到当前基本块
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
|
||||
return value_ref;
|
||||
}
|
||||
|
||||
@@ -404,7 +405,6 @@ scc_ir_value_ref_t scc_ir_builder_ret_void(scc_ir_builder_t *builder) {
|
||||
scc_ir_value_ref_t value_ref =
|
||||
scc_ir_module_add_value(GET_MODULE(builder), &ret_node);
|
||||
|
||||
// 添加到当前基本块
|
||||
scc_ir_builder_add_instr(builder, value_ref);
|
||||
return value_ref;
|
||||
}
|
||||
|
||||
@@ -535,9 +535,9 @@ void scc_ir_dump_value_linear(scc_ir_dump_ctx_t *ctx,
|
||||
break;
|
||||
case SCC_IR_VALUE_TAG_AGGREGATE:
|
||||
// 聚合类型:递归输出每个元素(每个占一行)
|
||||
scc_vec_foreach(value->data.aggregate.elements, i) {
|
||||
scc_vec_foreach(value->data.aggregate.fields, i) {
|
||||
scc_ir_dump_value_linear(
|
||||
ctx, scc_vec_at(value->data.aggregate.elements, i));
|
||||
ctx, scc_vec_at(value->data.aggregate.fields, i));
|
||||
scc_tree_dump_append(ctx->dump_ctx, "\n");
|
||||
}
|
||||
return;
|
||||
@@ -618,8 +618,8 @@ void scc_ir_dump_value_linear(scc_ir_dump_ctx_t *ctx,
|
||||
scc_tree_dump_append(ctx->dump_ctx, "const_array ");
|
||||
scc_ir_dump_type_linear(ctx, value->data.const_array.base_type);
|
||||
scc_tree_dump_append(ctx->dump_ctx, " [");
|
||||
scc_vec_foreach(value->data.const_array.elements, i) {
|
||||
u8 ch = scc_vec_at(value->data.const_array.elements, i);
|
||||
scc_vec_foreach(value->data.const_array.fields, i) {
|
||||
u8 ch = scc_vec_at(value->data.const_array.fields, i);
|
||||
scc_tree_dump_append_fmt(ctx->dump_ctx, " `%c`, ", ch ? ch : ' ');
|
||||
}
|
||||
scc_tree_dump_append(ctx->dump_ctx, " ]");
|
||||
|
||||
@@ -33,6 +33,10 @@ void scc_ir_type_init(scc_ir_type_t *in, scc_ir_type_tag_t tag) {
|
||||
scc_vec_init(in->data.function.params);
|
||||
in->data.function.ret_type = 0;
|
||||
break;
|
||||
case SCC_IR_TYPE_UNION:
|
||||
case SCC_IR_TYPE_STRUCT:
|
||||
scc_vec_init(in->data.aggregate.fields);
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user