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