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:
@@ -266,58 +266,60 @@ static void emit_load_addr(scc_x86_64_isel_t *isel, scc_x86_operand_value_t dst,
|
||||
i64 offset) {
|
||||
usize size_bits = dst.size_bits;
|
||||
Assert(size_bits == 64);
|
||||
// 前置断言:dst 必须是寄存器
|
||||
Assert(dst.kind == SCC_X86_OPR_REG);
|
||||
// scale 必须是 1,2,4,8 之一
|
||||
Assert(scale == 1 || scale == 2 || scale == 4 || scale == 8);
|
||||
|
||||
// ---- 处理 base ----
|
||||
scc_x86_operand_value_t base_reg = base;
|
||||
switch (base.kind) {
|
||||
case SCC_X86_OPR_REG: {
|
||||
base_reg = base;
|
||||
} break;
|
||||
case SCC_X86_OPR_RELOC: {
|
||||
case SCC_X86_OPR_REG:
|
||||
break;
|
||||
case SCC_X86_OPR_RELOC:
|
||||
Assert(base.reloc.target == SCC_X86_RELOC_TARGET_SYMBOL);
|
||||
base_reg = new_vreg_temp(isel, 64);
|
||||
scc_x86_emit_move(isel, base_reg, base);
|
||||
} break;
|
||||
case SCC_X86_OPR_MEM: {
|
||||
break;
|
||||
case SCC_X86_OPR_MEM:
|
||||
base_reg = new_vreg_temp(isel, 64);
|
||||
scc_x86_emit_move(isel, base_reg, base);
|
||||
} break;
|
||||
default: {
|
||||
break;
|
||||
default:
|
||||
Panic("Unsupported base kind %d in load_addr", base.kind);
|
||||
}
|
||||
}
|
||||
|
||||
scc_x86_operand_value_t index_reg = index;
|
||||
switch (index.kind) {
|
||||
case SCC_X86_OPR_REG: {
|
||||
index_reg = index;
|
||||
} break;
|
||||
case SCC_X86_OPR_RELOC: {
|
||||
Assert(index.reloc.target == SCC_X86_RELOC_TARGET_SYMBOL);
|
||||
index_reg = new_vreg_temp(isel, 64);
|
||||
scc_x86_emit_move(isel, index_reg, index);
|
||||
} break;
|
||||
case SCC_X86_OPR_MEM: {
|
||||
index_reg = new_vreg_temp(isel, 64);
|
||||
scc_x86_emit_move(isel, index_reg, index);
|
||||
} break;
|
||||
case SCC_X86_OPR_IMM: {
|
||||
index_reg = new_vreg_temp(isel, index.size_bits);
|
||||
scc_x86_emit_move(isel, index_reg, index);
|
||||
} break;
|
||||
default: {
|
||||
Panic("Unsupported index kind %d in load_addr", base.kind);
|
||||
}
|
||||
// ---- 处理 index 和 scale ----
|
||||
// scale=0 表示 struct/union 字段 GEP:字段索引已被折叠进 offset,
|
||||
// x86-64 SIB 不支持 scale=0,所以跳 index register,直接用 base+disp
|
||||
scc_x86_reg_t index_reg = SCC_X86_REG_INVALID;
|
||||
int sib_scale = 1;
|
||||
if (scale != 0) {
|
||||
Assert(scale == 1 || scale == 2 || scale == 4 || scale == 8);
|
||||
sib_scale = scale;
|
||||
switch (index.kind) {
|
||||
case SCC_X86_OPR_REG:
|
||||
index_reg = index.reg;
|
||||
break;
|
||||
case SCC_X86_OPR_RELOC:
|
||||
Assert(index.reloc.target == SCC_X86_RELOC_TARGET_SYMBOL);
|
||||
index_reg = new_vreg_temp(isel, 64).reg;
|
||||
scc_x86_emit_move(isel, scc_x86_op_preg(index_reg, 64), index);
|
||||
break;
|
||||
case SCC_X86_OPR_MEM:
|
||||
index_reg = new_vreg_temp(isel, 64).reg;
|
||||
scc_x86_emit_move(isel, scc_x86_op_preg(index_reg, 64), index);
|
||||
break;
|
||||
case SCC_X86_OPR_IMM:
|
||||
index_reg = new_vreg_temp(isel, index.size_bits).reg;
|
||||
scc_x86_emit_move(isel, scc_x86_op_preg(index_reg, 64), index);
|
||||
break;
|
||||
default:
|
||||
Panic("Unsupported index kind %d in load_addr", index.kind);
|
||||
}
|
||||
}
|
||||
|
||||
scc_x86_operand_value_t mem_op =
|
||||
scc_x86_op_mem((scc_x86_mem_t){.base = base_reg.reg,
|
||||
.index = index_reg.reg,
|
||||
.scale = scale,
|
||||
.index = index_reg,
|
||||
.scale = sib_scale,
|
||||
.disp.displacement = offset,
|
||||
.disp.displacement_bits = 8},
|
||||
size_bits);
|
||||
|
||||
Reference in New Issue
Block a user