// scc_mir.h (示意) #ifndef __SCC_MIR_H__ #define __SCC_MIR_H__ #include 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; 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); #endif /* __SCC_MIR_H__ */