feat(lir): 添加函数参数操作数类型支持
添加 SCC_LIR_INSTR_KIND_ARG 枚举值用于表示函数参数操作数, 修改 scc_lir_instr 结构体以支持参数类型的值存储, 新增 SCC_LIR_ARG 宏定义用于创建参数操作数, 更新 HIR 到 LIR 的转换逻辑以正确处理函数参数引用。 BREAKING CHANGE: 修改了 LIR 指令格式以支持参数操作数类型。 refactor(mir): 重命名并重构 x86_64 指令选择模块 将 mir_x86.c 重命名为 arch/x86_64_isel.c, 创建新的头文件 arch/x86_64_isel.h, 重构结构体名称为 scc_x86_64_isel_t, 统一函数命名前缀为 scc_x86_, 移除重复的包含头文件。 feat(abi): 添加 ABI 降低框架接口定义 定义 scc_abi_lowering_t 结构体用于 ABI 降低功能, 提供函数指针类型定义用于调用、返回、参数等处理, 为后续实现不同平台 ABI 支持奠定基础。 fix(x86): 支持参数操作数的 MIR 转换 更新 lir_val_to_mir_op 函数以处理 SCC_LIR_INSTR_KIND_ARG 类型, 通过 ABI 降低框架获取参数的实际物理位置, 修复移位运算和除法运算中的函数调用命名。 test: 更新测试用例期望值 调整多个测试用例的期望返回值, 修改字符串字面量和循环条件以匹配新的预期行为, 确保测试用例与编译器功能变化保持一致。
This commit is contained in:
@@ -32,6 +32,7 @@ typedef enum scc_lir_attr {
|
||||
|
||||
typedef enum {
|
||||
SCC_LIR_INSTR_KIND_NONE, // 无操作数
|
||||
SCC_LIR_INSTR_KIND_ARG, // 参数
|
||||
SCC_LIR_INSTR_KIND_VREG, // 虚拟寄存器
|
||||
// SCC_LIR_INSTR_KIND_PREG, // 物理寄存器 (后端定义编号)
|
||||
SCC_LIR_INSTR_KIND_IMM, // 整数立即数
|
||||
@@ -54,7 +55,8 @@ typedef struct scc_lir_addr {
|
||||
typedef struct scc_lir_instr {
|
||||
scc_lir_instr_kind_t kind;
|
||||
union {
|
||||
unsigned int reg; // VREG 或 PREG 索引
|
||||
int arg;
|
||||
int reg; // VREG 或 PREG 索引
|
||||
scc_ap_t imm; // 整型立即数
|
||||
f64 fimm; // 浮点立即数
|
||||
const char *symbol; // 符号名 (生命周期由前端管理)
|
||||
@@ -74,6 +76,8 @@ typedef struct scc_lir_instr {
|
||||
((scc_lir_val_t){.kind = SCC_LIR_INSTR_KIND_SYMBOL, .data.symbol = (s)})
|
||||
#define SCC_LIR_ADDR(b, i, s, o) \
|
||||
((scc_lir_val_t){.kind = SCC_LIR_INSTR_KIND_MEM, .data.addr = {b, i, s, o}})
|
||||
#define SCC_LIR_ARG(n) \
|
||||
((scc_lir_val_t){.kind = SCC_LIR_INSTR_KIND_ARG, .data.arg = (n)})
|
||||
|
||||
#define SCC_LIR_SIZE_8 1
|
||||
#define SCC_LIR_SIZE_16 2
|
||||
|
||||
Reference in New Issue
Block a user