@@ -340,7 +340,6 @@ std::any SysYIRGenerator::visitFuncType(SysYParser::FuncTypeContext *ctx) {
std : : any SysYIRGenerator : : visitFuncDef ( SysYParser : : FuncDefContext * ctx ) {
std : : any SysYIRGenerator : : visitFuncDef ( SysYParser : : FuncDefContext * ctx ) {
// 更新作用域
// 更新作用域
module - > enterNewScope ( ) ;
module - > enterNewScope ( ) ;
HasReturnInst = false ;
auto name = ctx - > Ident ( ) - > getText ( ) ;
auto name = ctx - > Ident ( ) - > getText ( ) ;
std : : vector < Type * > paramTypes ;
std : : vector < Type * > paramTypes ;
@@ -376,22 +375,34 @@ std::any SysYIRGenerator::visitFuncDef(SysYParser::FuncDefContext *ctx){
module - > addVariable ( paramNames [ i ] , alloca ) ;
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 ( ) ) {
for ( auto item : ctx - > blockStmt ( ) - > blockItem ( ) ) {
visitBlockItem ( item ) ;
visitBlockItem ( item ) ;
}
}
if ( HasReturnInst = = false ) {
// 如果函数没有显式的返回语句,且返回类型不是 void, 则需要添加一个默认的返回值
// 如果没有return语句, 则默认返回0
ReturnInst * retinst = nullptr ;
if ( r eturnType ! = Type : : getVoidType ( ) ) {
retinst = dynamic_cast < R eturnInst * > ( builder . getBasicBlock ( ) - > terminator ( ) - > get ( ) ) ;
Value * returnValue = ConstantInteger : : get ( 0 ) ;
if ( returnType = = Type : : g etFloatType ( ) ) {
if ( ! r etinst ) {
returnValue = ConstantFloating : : get ( 0.0f ) ;
if ( returnType - > isVoid ( ) ) {
}
builder . createReturnInst ( ) ;
builder . c reateReturn Ins t( returnValue ) ;
} else if ( returnType - > is Int ( ) ) {
builder . createReturnInst ( ConstantInteger : : get ( 0 ) ) ; // 默认返回 0
} else if ( returnType - > isFloat ( ) ) {
builder . createReturnInst ( ConstantFloating : : get ( 0.0f ) ) ; // 默认返回 0.0f
} else {
} else {
build er. createReturnInst ( ) ;
ass ert ( false & & " Function with no explicit return and non-void type should return a value. " ) ;
}
}
}
}
module - > leaveScope ( ) ;
module - > leaveScope ( ) ;
return std : : any ( ) ;
return std : : any ( ) ;
@@ -549,6 +560,7 @@ std::any SysYIRGenerator::visitIfStmt(SysYParser::IfStmtContext *ctx) {
ctx - > stmt ( 0 ) - > accept ( this ) ;
ctx - > stmt ( 0 ) - > accept ( this ) ;
module - > leaveScope ( ) ;
module - > leaveScope ( ) ;
}
}
builder . createUncondBrInst ( exitBlock , { } ) ;
BasicBlock : : conectBlocks ( builder . getBasicBlock ( ) , exitBlock ) ;
BasicBlock : : conectBlocks ( builder . getBasicBlock ( ) , exitBlock ) ;
labelstring < < " if_exit.L " < < builder . getLabelIndex ( ) ;
labelstring < < " if_exit.L " < < builder . getLabelIndex ( ) ;
@@ -570,6 +582,7 @@ std::any SysYIRGenerator::visitWhileStmt(SysYParser::WhileStmtContext *ctx) {
labelstring < < " while_head.L " < < builder . getLabelIndex ( ) ;
labelstring < < " while_head.L " < < builder . getLabelIndex ( ) ;
BasicBlock * headBlock = function - > addBasicBlock ( labelstring . str ( ) ) ;
BasicBlock * headBlock = function - > addBasicBlock ( labelstring . str ( ) ) ;
labelstring . str ( " " ) ;
labelstring . str ( " " ) ;
builder . createUncondBrInst ( headBlock , { } ) ;
BasicBlock : : conectBlocks ( curBlock , headBlock ) ;
BasicBlock : : conectBlocks ( curBlock , headBlock ) ;
builder . setPosition ( headBlock , headBlock - > end ( ) ) ;
builder . setPosition ( headBlock , headBlock - > end ( ) ) ;
@@ -654,7 +667,7 @@ std::any SysYIRGenerator::visitReturnStmt(SysYParser::ReturnStmtContext *ctx) {
}
}
}
}
builder . createReturnInst ( returnValue ) ;
builder . createReturnInst ( returnValue ) ;
HasReturnInst = true ;
return std : : any ( ) ;
return std : : any ( ) ;
}
}