添加 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: 更新测试用例期望值 调整多个测试用例的期望返回值, 修改字符串字面量和循环条件以匹配新的预期行为, 确保测试用例与编译器功能变化保持一致。
73 lines
2.4 KiB
C
73 lines
2.4 KiB
C
// scc_mir.h (示意)
|
||
|
||
#ifndef __SCC_MIR_H__
|
||
#define __SCC_MIR_H__
|
||
|
||
#include <scc_lir.h>
|
||
|
||
typedef enum {
|
||
SCC_MIR_OP_NONE,
|
||
SCC_MIR_OP_MEM, // 内存访问
|
||
SCC_MIR_OP_VREG, // 虚拟寄存器
|
||
SCC_MIR_OP_PREG, // 物理寄存器
|
||
SCC_MIR_OP_IMM, // 立即数
|
||
SCC_MIR_OP_SYMBOL, // 符号地址(用于重定位)
|
||
SCC_MIR_OP_BLOCK // 基本块引用(label)
|
||
} scc_mir_op_kind_t;
|
||
|
||
typedef struct scc_mir_operand {
|
||
scc_mir_op_kind_t kind;
|
||
union {
|
||
int vreg; // 虚拟寄存器索引
|
||
int preg; // 物理寄存器
|
||
i64 imm; // 立即数
|
||
const char *symbol; // 符号名
|
||
int stack_slot; // 栈槽 ID (由 FrameLayout 分配)
|
||
scc_lir_bblock_id_t block_id; // 目标基本块
|
||
};
|
||
} scc_mir_operand_t;
|
||
|
||
typedef enum {
|
||
SCC_MIR_PSUEDO_ALLOCA = -1,
|
||
} scc_mir_psuedo_op_t;
|
||
|
||
typedef struct scc_mir_instr {
|
||
int opcode; // 目标特定的指令编码 (如 X86::ADD32rr)
|
||
int num_operands; // 实际使用的操作数个数
|
||
scc_mir_operand_t
|
||
operands[8]; // 固定小数组,RISC 风格指令通常不超过 4 操作数
|
||
scc_pos_t src_loc; // 调试信息 (继承自 LIR)
|
||
} scc_mir_instr_t;
|
||
typedef SCC_VEC(scc_mir_instr_t) scc_mir_instr_vec_t;
|
||
|
||
typedef scc_cfg_bblock_t scc_mir_bblock_t;
|
||
typedef struct scc_mir_bblock_meta {
|
||
} scc_mir_bblock_meta_t;
|
||
#define SCC_MIR_BBLOCK_VALUES(bblock) \
|
||
((scc_mir_instr_vec_t *)&((bblock)->values))
|
||
|
||
typedef struct scc_mir_stack_slot {
|
||
int slot_id;
|
||
int size; // 通常是 8 字节 (指针大小)
|
||
int alignment; // 对齐要求
|
||
int offset; // 相对于 RSP 的偏移 (最终确定)
|
||
} scc_mir_stack_slot_t;
|
||
typedef SCC_VEC(scc_mir_stack_slot_t) scc_mir_stack_slot_vec_t;
|
||
|
||
typedef scc_cfg_func_t scc_mir_func_t;
|
||
typedef struct scc_mir_func_meta {
|
||
// 栈帧信息 (由 FrameLayout Pass 填充)
|
||
int frame_size;
|
||
int stack_alignment;
|
||
|
||
// 寄存器分配信息
|
||
scc_mir_stack_slot_vec_t stack_slots;
|
||
scc_hashtable_t vreg2preg; // vreg -> phys reg,-1 表示溢出
|
||
scc_hashtable_t vreg2slot; // vreg -> stack slot index
|
||
} scc_mir_func_meta_t;
|
||
#define SCC_MIR_FUNC_META(func) ((scc_mir_func_meta_t *)(func)->meta)
|
||
|
||
void scc_mir_func_meta_init(scc_mir_func_meta_t *func_meta);
|
||
|
||
#endif /* __SCC_MIR_H__ */
|