- 新增mir库模块,包含scc_mir、scc_mir_module、scc_mir_dump等组件 - 添加LIR到MIR的转换接口scc_lir2mir - 定义MIR操作数类型和指令结构,支持虚拟寄存器、物理寄存器、立即数等 - 实现x86_64指令选择器,将LIR指令转换为MIR指令 - 重构LIR模块中函数参数命名,统一使用lir_module参数名 - 移除LIR中物理寄存器相关的代码和注释 - 更新cbuild.toml依赖配置,添加mir模块依赖
61 lines
2.0 KiB
C
61 lines
2.0 KiB
C
// scc_mir.h (示意)
|
||
|
||
#ifndef __SCC_MIR_H__
|
||
#define __SCC_MIR_H__
|
||
|
||
#include <scc_lir.h> // 复用 VREG 概念和一些基础类型
|
||
// #include "scc_target_desc.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 scc_cfg_func_t scc_mir_func_t;
|
||
typedef struct scc_mir_func_meta {
|
||
// 栈帧信息 (由 FrameLayout Pass 填充)
|
||
int frame_size;
|
||
int stack_alignment;
|
||
// 寄存器分配信息
|
||
SCC_VEC(int) vreg_alloc; // vreg -> phys reg 映射
|
||
} scc_mir_func_meta_t;
|
||
#define SCC_MIR_FUNC_META(func) ((scc_mir_func_meta_t *)(func)->meta)
|
||
|
||
#endif /* __SCC_MIR_H__ */
|