feat(argparse): 支持列表类型参数解析
当参数指定为列表类型时,验证和处理逻辑现在会检查 vec_store 是否为空或大小为0,而不是检查 str_store。 fix(hir): 初始化聚合类型值的数据结构 在 HIR 值初始化过程中,为聚合类型添加适当的初始化逻辑, 确保其字段向量被正确初始化。 refactor(hir_builder): 优化指针类型创建和GEP操作实现 - 简化全局分配器中的指针类型创建代码 - 扩展 GEP 操作以支持结构体和联合体字段访问 - 添加字段偏移计算支持 feat(hir_dump): 增强HIR类型和值的线性转储功能 - 实现类型定义的线性转储输出 - 改进结构体和联合体的转储格式 - 优化聚合值的转储表示 perf(hir_layout): 优化类型布局计算性能 改进结构体、联合体和聚合类型的对齐和大小计算算法, 提高字段偏移计算的准确性。 fix(hir_module): 完善模块资源清理机制 在模块析构时正确释放结构体和联合体类型的字段向量内存。 docs(lir): 更新文档注释中的空值表示 将初始化数据参数的空值描述从 NULL 统一为 nullptr。 refactor(hir2lir): 改进HIR到LIR的类型转换逻辑 - 重构类型到LIR大小扩展的转换函数 - 修复STORE指令的类型推导逻辑 - 增强GEP指令的规模因子和偏移量计算 - 添加对结构体/联合体字段访问的支持 refactor(x86_isel): 优化x86-64地址加载指令生成 改进LOAD_ADDR指令生成,更好地支持结构体字段访问的零比例因子。 docs(ir2mcode): 统一空值表示文档注释 更新初始化数据参数的空值描述为nullptr。 refactor(lexer): 简化词法分析器非空白标记预览逻辑 优化非空白标记预览函数,减少不必要的标记消费和销毁操作。
This commit is contained in:
@@ -9,7 +9,7 @@ typedef struct scc_type_abi scc_type_abi_t;
|
||||
struct scc_type_abi {
|
||||
int ptr_size;
|
||||
int ptr_align;
|
||||
int endian; // 0 = little, 1 = big
|
||||
int endian; // 0 = little, 1 = big
|
||||
|
||||
// C 类型大小 (AST → HIR 时需要)
|
||||
int char_size;
|
||||
@@ -22,30 +22,30 @@ struct scc_type_abi {
|
||||
int long_double_size;
|
||||
int va_list_size;
|
||||
|
||||
// byte_size → 对齐。NULL = 自然对齐 (return byte_size)
|
||||
// byte_size → 对齐。nullptr = 自然对齐 (return byte_size)
|
||||
int (*type_align)(int byte_size);
|
||||
|
||||
// 字段对齐覆盖。NULL = 用 type_align 的值
|
||||
// 字段对齐覆盖。nullptr = 用 type_align 的值
|
||||
int (*field_align)(int field_size, int natural_align);
|
||||
|
||||
// 聚合体总对齐。NULL = max 字段 align
|
||||
// 聚合体总对齐。nullptr = max 字段 align
|
||||
int (*aggregate_align)(int max_field_align);
|
||||
};
|
||||
|
||||
static inline int scc_type_abi_get_type_align(const scc_type_abi_t *abi,
|
||||
int byte_size) {
|
||||
int byte_size) {
|
||||
return abi->type_align ? abi->type_align(byte_size) : byte_size;
|
||||
}
|
||||
|
||||
static inline int scc_type_abi_get_field_align(const scc_type_abi_t *abi,
|
||||
int field_size,
|
||||
int natural_align) {
|
||||
int field_size,
|
||||
int natural_align) {
|
||||
return abi->field_align ? abi->field_align(field_size, natural_align)
|
||||
: natural_align;
|
||||
}
|
||||
|
||||
static inline int scc_type_abi_get_aggregate_align(const scc_type_abi_t *abi,
|
||||
int max_field_align) {
|
||||
int max_field_align) {
|
||||
return abi->aggregate_align ? abi->aggregate_align(max_field_align)
|
||||
: max_field_align;
|
||||
}
|
||||
|
||||
@@ -12,16 +12,17 @@ static const scc_type_abi_t SCC_TYPE_ABI_SYSTEMV_X64 = {
|
||||
.char_size = 1,
|
||||
.short_size = 2,
|
||||
.int_size = 4,
|
||||
.long_size = 8, // SysV: long = 8 bytes
|
||||
.long_size = 8, // SysV: long = 8 bytes
|
||||
.long_long_size = 8,
|
||||
.float_size = 4,
|
||||
.double_size = 8,
|
||||
.long_double_size = 16, // SysV x86-64: long double = 80-bit extended precision, padded to 16
|
||||
.long_double_size = 16, // SysV x86-64: long double = 80-bit extended
|
||||
// precision, padded to 16
|
||||
.va_list_size = 8,
|
||||
|
||||
.type_align = NULL,
|
||||
.field_align = NULL,
|
||||
.aggregate_align = NULL,
|
||||
.type_align = nullptr,
|
||||
.field_align = nullptr,
|
||||
.aggregate_align = nullptr,
|
||||
};
|
||||
|
||||
#endif /* __SCC_TYPE_ABI_SYSTEMV_X64_H__ */
|
||||
|
||||
@@ -27,9 +27,9 @@ static const scc_type_abi_t SCC_TYPE_ABI_WIN_X64 = {
|
||||
.long_double_size = 8,
|
||||
.va_list_size = 4,
|
||||
|
||||
.type_align = NULL,
|
||||
.type_align = nullptr,
|
||||
.field_align = scc_win64_field_align,
|
||||
.aggregate_align = NULL,
|
||||
.aggregate_align = nullptr,
|
||||
};
|
||||
|
||||
#endif /* __SCC_TYPE_ABI_WIN_X64_H__ */
|
||||
|
||||
Reference in New Issue
Block a user