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:
62
libs/abi/src/scc_type_abi.c
Normal file
62
libs/abi/src/scc_type_abi.c
Normal file
@@ -0,0 +1,62 @@
|
||||
#include <scc_ast.h>
|
||||
#include <scc_ir.h>
|
||||
#include <scc_type_abi.h>
|
||||
|
||||
void scc_abi_compute_ast_type_layout(const scc_abi_type_calc_t *ctx, void *type,
|
||||
scc_abi_type_layout_t *layout) {
|
||||
scc_ast_type_t *ast_type = type;
|
||||
scc_abi_base_type_kind_t kind = SCC_ABI_TYPE_VOID;
|
||||
switch (ast_type->builtin.type) {
|
||||
case SCC_AST_BUILTIN_TYPE_VOID:
|
||||
kind = SCC_ABI_TYPE_VOID;
|
||||
case SCC_AST_BUILTIN_TYPE_CHAR:
|
||||
kind = SCC_ABI_TYPE_CHAR;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_UNSIGNED_CHAR:
|
||||
kind = SCC_ABI_TYPE_U_CHAR;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_SIGNED_CHAR:
|
||||
kind = SCC_ABI_TYPE_I_CHAR;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_SHORT:
|
||||
kind = SCC_ABI_TYPE_I_SHORT;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_SIGNED_SHORT:
|
||||
kind = SCC_ABI_TYPE_I_SHORT;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_UNSIGNED_SHORT:
|
||||
kind = SCC_ABI_TYPE_U_SHORT;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_INT:
|
||||
kind = SCC_ABI_TYPE_I_INT;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_SIGNED_INT:
|
||||
kind = SCC_ABI_TYPE_I_INT;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_UNSIGNED_INT:
|
||||
kind = SCC_ABI_TYPE_U_INT;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_LONG:
|
||||
kind = SCC_ABI_TYPE_I_LONG;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_SIGNED_LONG:
|
||||
kind = SCC_ABI_TYPE_I_LONG;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_UNSIGNED_LONG:
|
||||
kind = SCC_ABI_TYPE_U_LONG;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_LONG_LONG:
|
||||
kind = SCC_ABI_TYPE_I_LONG_LONG;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_SIGNED_LONG_LONG:
|
||||
kind = SCC_ABI_TYPE_I_LONG_LONG;
|
||||
break;
|
||||
case SCC_AST_BUILTIN_TYPE_UNSIGNED_LONG_LONG:
|
||||
kind = SCC_ABI_TYPE_U_LONG_LONG;
|
||||
break;
|
||||
default:
|
||||
Panic("Unsupported AST type: %d", ast_type->builtin.type);
|
||||
break;
|
||||
}
|
||||
scc_abi_get_base_type_layout(ctx->impls, kind, layout);
|
||||
}
|
||||
Reference in New Issue
Block a user