[backend] fixed some bugs
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -56,12 +56,14 @@ public:
|
|||||||
std::string code_gen();
|
std::string code_gen();
|
||||||
std::string module_gen();
|
std::string module_gen();
|
||||||
std::string function_gen(Function* func);
|
std::string function_gen(Function* func);
|
||||||
std::string basicBlock_gen(BasicBlock* bb, const RegAllocResult& alloc);
|
// 修改 basicBlock_gen 的声明,添加 int block_idx 参数
|
||||||
|
std::string basicBlock_gen(BasicBlock* bb, const RegAllocResult& alloc, int block_idx);
|
||||||
|
|
||||||
// DAG related
|
// DAG related
|
||||||
std::vector<std::unique_ptr<DAGNode>> build_dag(BasicBlock* bb);
|
std::vector<std::unique_ptr<DAGNode>> build_dag(BasicBlock* bb);
|
||||||
void select_instructions(DAGNode* node, const RegAllocResult& alloc);
|
void select_instructions(DAGNode* node, const RegAllocResult& alloc);
|
||||||
void emit_instructions(DAGNode* node, std::vector<std::string>& insts, const RegAllocResult& alloc, std::set<DAGNode*>& emitted_nodes); // Add emitted_nodes set
|
// 改变 emit_instructions 的参数,使其可以直接添加汇编指令到 main ss
|
||||||
|
void emit_instructions(DAGNode* node, std::stringstream& ss, const RegAllocResult& alloc, std::set<DAGNode*>& emitted_nodes);
|
||||||
|
|
||||||
// Register Allocation related
|
// Register Allocation related
|
||||||
std::map<Instruction*, std::set<std::string>> liveness_analysis(Function* func);
|
std::map<Instruction*, std::set<std::string>> liveness_analysis(Function* func);
|
||||||
@@ -82,6 +84,13 @@ private:
|
|||||||
Module* module;
|
Module* module;
|
||||||
int vreg_counter = 0; // Counter for unique virtual register names
|
int vreg_counter = 0; // Counter for unique virtual register names
|
||||||
int alloca_offset_counter = 0; // Counter for alloca offsets
|
int alloca_offset_counter = 0; // Counter for alloca offsets
|
||||||
|
|
||||||
|
// 新增一个成员变量来存储当前函数的所有 DAGNode,以确保其生命周期贯穿整个函数代码生成
|
||||||
|
// 这样可以在多个 BasicBlock_gen 调用中访问到完整的 DAG 节点
|
||||||
|
std::vector<std::unique_ptr<DAGNode>> current_function_dag_nodes;
|
||||||
|
|
||||||
|
// 为空标签定义一个伪名称前缀,加上块索引以确保唯一性
|
||||||
|
const std::string ENTRY_BLOCK_PSEUDO_NAME = "entry_block_";
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace sysy
|
} // namespace sysy
|
||||||
|
|||||||
Reference in New Issue
Block a user