From 88604c1f94449b0089f7de6884a5d20edafa0cad Mon Sep 17 00:00:00 2001 From: rain2133 <1370973498@qq.com> Date: Sun, 20 Jul 2025 18:23:48 +0800 Subject: [PATCH] =?UTF-8?q?[IR]=E6=B6=88=E9=99=A4Falltrhough=E7=8E=B0?= =?UTF-8?q?=E8=B1=A1=20[IR]=E4=BC=98=E5=8C=96=E7=94=9F=E6=88=90Ret?= =?UTF-8?q?=E6=8C=87=E4=BB=A4=E9=80=BB=E8=BE=91=20[README]=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0TODO=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 ++++++++++- src/SysYIRGenerator.cpp | 35 ++++++++++++++++++++++++----------- src/include/SysYIRGenerator.h | 2 -- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 65660b9..085b55b 100644 --- a/README.md +++ b/README.md @@ -37,4 +37,13 @@ mysysy/ $ bash setup.sh ``` ### 配套脚本 - (TODO: 需要完善) \ No newline at end of file + (TODO: 需要完善) + + +### TODO_list: + +除开注释中的TODO后续时间充足可以考虑的TODO: + +- store load指令由于gep指令的引入, 维度信息的记录是非必须的, 考虑删除 + +- use def关系经过mem2reg和phi函数明确转换为ssa形式, 以及函数参数通过value数组明确定义, 使得基本块的args参数信息记录非必须, 考虑删除 \ No newline at end of file diff --git a/src/SysYIRGenerator.cpp b/src/SysYIRGenerator.cpp index 6302aa5..1122b3e 100644 --- a/src/SysYIRGenerator.cpp +++ b/src/SysYIRGenerator.cpp @@ -340,7 +340,6 @@ std::any SysYIRGenerator::visitFuncType(SysYParser::FuncTypeContext *ctx) { std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){ // 更新作用域 module->enterNewScope(); - HasReturnInst = false; auto name = ctx->Ident()->getText(); std::vector paramTypes; @@ -376,22 +375,34 @@ std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){ module->addVariable(paramNames[i], alloca); } + // 在处理函数体之前,创建一个新的基本块作为函数体的实际入口 + // 这样 entryBB 就可以在完成初始化后跳转到这里 + BasicBlock* funcBodyEntry = function->addBasicBlock("funcBodyEntry"); + + // 从 entryBB 无条件跳转到 funcBodyEntry + builder.createUncondBrInst(funcBodyEntry, {}); + builder.setPosition(funcBodyEntry,funcBodyEntry->end()); // 将插入点设置到 funcBodyEntry + for (auto item : ctx->blockStmt()->blockItem()) { visitBlockItem(item); } - if(HasReturnInst == false) { - // 如果没有return语句,则默认返回0 - if (returnType != Type::getVoidType()) { - Value* returnValue = ConstantInteger::get(0); - if (returnType == Type::getFloatType()) { - returnValue = ConstantFloating::get(0.0f); - } - builder.createReturnInst(returnValue); + // 如果函数没有显式的返回语句,且返回类型不是 void,则需要添加一个默认的返回值 + ReturnInst* retinst = nullptr; + retinst = dynamic_cast(builder.getBasicBlock()->terminator()->get()); + + if (!retinst) { + if (returnType->isVoid()) { + builder.createReturnInst(); + } else if (returnType->isInt()) { + builder.createReturnInst(ConstantInteger::get(0)); // 默认返回 0 + } else if (returnType->isFloat()) { + builder.createReturnInst(ConstantFloating::get(0.0f)); // 默认返回 0.0f } else { - builder.createReturnInst(); + assert(false && "Function with no explicit return and non-void type should return a value."); } } + module->leaveScope(); return std::any(); @@ -549,6 +560,7 @@ std::any SysYIRGenerator::visitIfStmt(SysYParser::IfStmtContext *ctx) { ctx->stmt(0)->accept(this); module->leaveScope(); } + builder.createUncondBrInst(exitBlock, {}); BasicBlock::conectBlocks(builder.getBasicBlock(), exitBlock); labelstring << "if_exit.L" << builder.getLabelIndex(); @@ -570,6 +582,7 @@ std::any SysYIRGenerator::visitWhileStmt(SysYParser::WhileStmtContext *ctx) { labelstring << "while_head.L" << builder.getLabelIndex(); BasicBlock *headBlock = function->addBasicBlock(labelstring.str()); labelstring.str(""); + builder.createUncondBrInst(headBlock, {}); BasicBlock::conectBlocks(curBlock, headBlock); builder.setPosition(headBlock, headBlock->end()); @@ -654,7 +667,7 @@ std::any SysYIRGenerator::visitReturnStmt(SysYParser::ReturnStmtContext *ctx) { } } builder.createReturnInst(returnValue); - HasReturnInst = true; + return std::any(); } diff --git a/src/include/SysYIRGenerator.h b/src/include/SysYIRGenerator.h index 9dfd7c5..66ce11c 100644 --- a/src/include/SysYIRGenerator.h +++ b/src/include/SysYIRGenerator.h @@ -62,8 +62,6 @@ private: public: SysYIRGenerator() = default; - bool HasReturnInst; - public: Module *get() const { return module.get(); } IRBuilder *getBuilder(){ return &builder; }