修复break,continue的IR生成
This commit is contained in:
@ -310,7 +310,7 @@ std::any SysYIRGenerator::visitIfStmt(SysYParser::IfStmtContext *ctx) {
|
||||
builder.popTrueBlock();
|
||||
builder.popFalseBlock();
|
||||
|
||||
labelstring << "then.L" << builder.getLabelIndex();
|
||||
labelstring << "if_then.L" << builder.getLabelIndex();
|
||||
thenBlock->setName(labelstring.str());
|
||||
labelstring.str("");
|
||||
function->addBasicBlock(thenBlock);
|
||||
@ -329,7 +329,7 @@ std::any SysYIRGenerator::visitIfStmt(SysYParser::IfStmtContext *ctx) {
|
||||
builder.createUncondBrInst(exitBlock, {});
|
||||
BasicBlock::conectBlocks(builder.getBasicBlock(), exitBlock);
|
||||
|
||||
labelstring << "else.L" << builder.getLabelIndex();
|
||||
labelstring << "if_else.L" << builder.getLabelIndex();
|
||||
elseBlock->setName(labelstring.str());
|
||||
labelstring.str("");
|
||||
function->addBasicBlock(elseBlock);
|
||||
@ -346,7 +346,7 @@ std::any SysYIRGenerator::visitIfStmt(SysYParser::IfStmtContext *ctx) {
|
||||
builder.createUncondBrInst(exitBlock, {});
|
||||
BasicBlock::conectBlocks(builder.getBasicBlock(), exitBlock);
|
||||
|
||||
labelstring << "exit.L" << builder.getLabelIndex();
|
||||
labelstring << "if_exit.L" << builder.getLabelIndex();
|
||||
exitBlock->setName(labelstring.str());
|
||||
labelstring.str("");
|
||||
function->addBasicBlock(exitBlock);
|
||||
@ -359,7 +359,7 @@ std::any SysYIRGenerator::visitIfStmt(SysYParser::IfStmtContext *ctx) {
|
||||
builder.popTrueBlock();
|
||||
builder.popFalseBlock();
|
||||
|
||||
labelstring << "then.L" << builder.getLabelIndex();
|
||||
labelstring << "if_then.L" << builder.getLabelIndex();
|
||||
thenBlock->setName(labelstring.str());
|
||||
labelstring.str("");
|
||||
function->addBasicBlock(thenBlock);
|
||||
@ -375,7 +375,7 @@ std::any SysYIRGenerator::visitIfStmt(SysYParser::IfStmtContext *ctx) {
|
||||
}
|
||||
BasicBlock::conectBlocks(builder.getBasicBlock(), exitBlock);
|
||||
|
||||
labelstring << "exit.L" << builder.getLabelIndex();
|
||||
labelstring << "if_exit.L" << builder.getLabelIndex();
|
||||
exitBlock->setName(labelstring.str());
|
||||
labelstring.str("");
|
||||
function->addBasicBlock(exitBlock);
|
||||
@ -391,7 +391,7 @@ std::any SysYIRGenerator::visitWhileStmt(SysYParser::WhileStmtContext *ctx) {
|
||||
Function* function = builder.getBasicBlock()->getParent();
|
||||
|
||||
std::stringstream labelstring;
|
||||
labelstring << "head.L" << builder.getLabelIndex();
|
||||
labelstring << "while_head.L" << builder.getLabelIndex();
|
||||
BasicBlock *headBlock = function->addBasicBlock(labelstring.str());
|
||||
labelstring.str("");
|
||||
BasicBlock::conectBlocks(curBlock, headBlock);
|
||||
@ -407,7 +407,7 @@ std::any SysYIRGenerator::visitWhileStmt(SysYParser::WhileStmtContext *ctx) {
|
||||
builder.popTrueBlock();
|
||||
builder.popFalseBlock();
|
||||
|
||||
labelstring << "body.L" << builder.getLabelIndex();
|
||||
labelstring << "while_body.L" << builder.getLabelIndex();
|
||||
bodyBlock->setName(labelstring.str());
|
||||
labelstring.str("");
|
||||
function->addBasicBlock(bodyBlock);
|
||||
@ -431,7 +431,7 @@ std::any SysYIRGenerator::visitWhileStmt(SysYParser::WhileStmtContext *ctx) {
|
||||
builder.popBreakBlock();
|
||||
builder.popContinueBlock();
|
||||
|
||||
labelstring << "exit.L" << builder.getLabelIndex();
|
||||
labelstring << "while_exit.L" << builder.getLabelIndex();
|
||||
exitBlock->setName(labelstring.str());
|
||||
labelstring.str("");
|
||||
function->addBasicBlock(exitBlock);
|
||||
@ -442,7 +442,7 @@ std::any SysYIRGenerator::visitWhileStmt(SysYParser::WhileStmtContext *ctx) {
|
||||
|
||||
std::any SysYIRGenerator::visitBreakStmt(SysYParser::BreakStmtContext *ctx) {
|
||||
BasicBlock* breakBlock = builder.getBreakBlock();
|
||||
builder.pushBreakBlock(breakBlock);
|
||||
builder.createUncondBrInst(breakBlock, {});
|
||||
BasicBlock::conectBlocks(builder.getBasicBlock(), breakBlock);
|
||||
return std::any();
|
||||
}
|
||||
@ -450,6 +450,7 @@ std::any SysYIRGenerator::visitBreakStmt(SysYParser::BreakStmtContext *ctx) {
|
||||
std::any SysYIRGenerator::visitContinueStmt(SysYParser::ContinueStmtContext *ctx) {
|
||||
BasicBlock* continueBlock = builder.getContinueBlock();
|
||||
builder.createUncondBrInst(continueBlock, {});
|
||||
BasicBlock::conectBlocks(builder.getBasicBlock(), continueBlock);
|
||||
return std::any();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user