- 将 MIR 中的 SCC_MIR_OP_MEM 替换为更精确的 SCC_MIR_OP_STACK_SLOT 和 SCC_MIR_OP_STACK_OFFSET 类型 - 在 x86_64 指令选择中更新相应的内存操作数处理逻辑 - 修改寄存器分配器中的栈槽操作数类型检查 - 更新 IR 转机器码过程中的内存操作数转换 refactor(hir): 使用 tree_dump_node 输出函数节点 - 将 hir_dump 中的函数名输出从 append 改为 node 类型 refactor(frame-layout): 重构栈帧布局传递实现结构 - 引入函数指针实现方式替代直接函数实现 - 将栈帧分配功能集成到 MIR 传递流程中 - 移除独立的 frame_layout 实现文件 refactor(prolog-epilog): 添加函数序言/尾声传递框架 - 为 Windows x64 平台初始化序言/尾声生成器 - 在 MIR 传递阶段添加序言/尾声处理步骤 refactor(win64): 更新 Windows x64 目标平台接口 - 重命名寄存器分配填充函数为 scc_win_pc_x64_reg_alloc_fill - 添加栈帧分配和序言/尾声初始化函数 - 修正参数传递中的栈槽操作数类型 refactor(dump): 改进 MIR 输出格式 - 将基本块显示改为分支节点类型 - 更新操作数类型的显示处理 chore: 添加 x86 编码相关数据结构定义 - 新增 scc_x86_encode.h 头文件包含内存操作数和指令编码接口定义
90 lines
3.0 KiB
C
90 lines
3.0 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_STACK_OFFSET, // 已分配的内存
|
||
SCC_MIR_OP_STACK_SLOT, // 栈空间
|
||
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 分配)
|
||
int stack_offset; // 栈偏移
|
||
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;
|
||
int vregs_count;
|
||
|
||
// 寄存器分配信息
|
||
scc_mir_stack_slot_vec_t stack_slots;
|
||
// vreg -> phys reg and stack slot index
|
||
// positive means stack slot index
|
||
// negative means physic register
|
||
scc_hashtable_t vreg2physic;
|
||
} 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);
|
||
|
||
int scc_mir_alloc_vreg(scc_mir_func_t *func);
|
||
void scc_mir_vreg_op(const scc_mir_func_t *func, int vreg,
|
||
scc_mir_operand_t *out);
|
||
|
||
void scc_mir_vreg_map2preg(scc_mir_func_t *func, int vreg, int preg);
|
||
int scc_mir_vreg_map2slot(scc_mir_func_t *func, int vreg, int size, int align);
|
||
static inline scc_mir_stack_slot_t *
|
||
scc_mir_unsafe_slot(const scc_mir_func_t *func, int slot) {
|
||
Assert(slot > 0);
|
||
return &scc_vec_at(SCC_MIR_FUNC_META(func)->stack_slots, slot);
|
||
}
|
||
|
||
#endif /* __SCC_MIR_H__ */
|