[backend]重构了后端
This commit is contained in:
61
src/include/RISCv64ISel.h
Normal file
61
src/include/RISCv64ISel.h
Normal file
@@ -0,0 +1,61 @@
|
||||
#ifndef RISCV64_ISEL_H
|
||||
#define RISCV64_ISEL_H
|
||||
|
||||
#include "IR.h"
|
||||
#include "RISCv64LLIR.h"
|
||||
#include <memory>
|
||||
#include <map>
|
||||
|
||||
namespace sysy {
|
||||
|
||||
class RISCv64ISel {
|
||||
public:
|
||||
RISCv64ISel();
|
||||
// 模块主入口:将一个高层IR函数转换为底层LLIR函数
|
||||
std::unique_ptr<MachineFunction> runOnFunction(Function* func);
|
||||
|
||||
private:
|
||||
// DAG节点定义,作为ISel的内部实现细节
|
||||
struct DAGNode {
|
||||
enum NodeKind { CONSTANT, LOAD, STORE, BINARY, CALL, RETURN, BRANCH, ALLOCA_ADDR, UNARY, MEMSET };
|
||||
NodeKind kind;
|
||||
Value* value = nullptr;
|
||||
std::vector<DAGNode*> operands;
|
||||
DAGNode(NodeKind k) : kind(k) {}
|
||||
};
|
||||
|
||||
// 为当前函数生成LLIR
|
||||
void select();
|
||||
|
||||
// 为单个基本块生成指令
|
||||
void selectBasicBlock(BasicBlock* bb);
|
||||
|
||||
// 核心函数:为DAG节点选择并生成MachineInstr
|
||||
void selectNode(DAGNode* node);
|
||||
|
||||
// --- DAG 构建相关函数 (从原RISCv64Backend迁移) ---
|
||||
std::vector<std::unique_ptr<DAGNode>> build_dag(BasicBlock* bb);
|
||||
DAGNode* get_operand_node(Value* val_ir, std::map<Value*, DAGNode*>& value_to_node, std::vector<std::unique_ptr<DAGNode>>& nodes_storage);
|
||||
DAGNode* create_node(DAGNode::NodeKind kind, Value* val, std::map<Value*, DAGNode*>& value_to_node, std::vector<std::unique_ptr<DAGNode>>& nodes_storage);
|
||||
|
||||
// --- 辅助函数 ---
|
||||
// 为一个IR Value获取/分配一个虚拟寄存器号
|
||||
unsigned getVReg(Value* val);
|
||||
|
||||
Function* F; // 当前处理的高层IR函数
|
||||
std::unique_ptr<MachineFunction> MFunc; // 正在构建的底层LLIR函数
|
||||
|
||||
MachineBasicBlock* CurMBB; // 当前正在处理的机器基本块
|
||||
|
||||
// 映射关系
|
||||
std::map<Value*, unsigned> vreg_map;
|
||||
std::map<const BasicBlock*, MachineBasicBlock*> bb_map;
|
||||
std::map<Value*, DAGNode*> value_to_node_map; // 用于selectNode中查找
|
||||
|
||||
unsigned vreg_counter;
|
||||
int local_label_counter;
|
||||
};
|
||||
|
||||
} // namespace sysy
|
||||
|
||||
#endif // RISCV64_ISEL_H
|
||||
Reference in New Issue
Block a user