2021SC@SDUSC
MIRLower类定义在src/maple_ir/include/mir_lower.h和src/maple_ir/src/mir_lower.cpp之中。MIRLower类中主要是定义一些向下转换的操作,之前我们也做过控制流语句的具体向下转换的分析,都是属于MIRLower类的具体的成员函数。
LabelIdx MIRLower::CreateCondGotoStmt(Opcode op, BlockNode &blk, const IfStmtNode &ifStmt) {
auto *brStmt = mirModule.CurFuncCodeMemPool()->New(op);
brStmt->SetOpnd(ifStmt.Opnd(), 0);
brStmt->SetSrcPos(ifStmt.GetSrcPos());
LabelIdx lableIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel();
(void)mirModule.CurFunction()->GetLabelTab()->AddToStringLabelMap(lableIdx);
brStmt->SetOffset(lableIdx);
blk.AddStatement(brStmt);
bool thenEmpty = (ifStmt.GetThenPart() == nullptr) || (ifStmt.GetThenPart()->GetFirst() == nullptr);
if (thenEmpty) {
blk.AppendStatementsFromBlock(*ifStmt.GetElsePart());
} else {
blk.AppendStatementsFromBlock(*ifStmt.GetThenPart());
}
return lableIdx;
}
创建条件语句对象
BlockNode *MIRLower::LowerIfStmt(IfStmtNode &ifStmt, bool recursive) {
bool thenEmpty = (ifStmt.GetThenPart() == nullptr) || (ifStmt.GetThenPart()->GetFirst() == nullptr);
bool elseEmpty = (ifStmt.GetElsePart() == nullptr) || (ifStmt.GetElsePart()->GetFirst() == nullptr);
if (recursive) {
if (!thenEmpty) {
ifStmt.SetThenPart(LowerBlock(*ifStmt.GetThenPart()));
}
if (!elseEmpty) {
ifStmt.SetElsePart(LowerBlock(*ifStmt.GetElsePart()));
}
}
auto *blk = mirModule.CurFuncCodeMemPool()->New();
if (thenEmpty && elseEmpty) {
// generate EVAL statement
auto *evalStmt = mirModule.CurFuncCodeMemPool()->New(OP_eval);
evalStmt->SetOpnd(ifStmt.Opnd(), 0);
evalStmt->SetSrcPos(ifStmt.GetSrcPos());
blk->AddStatement(evalStmt);
} else if (elseEmpty) {
// brfalse
//
// label
CreateBrFalseStmt(*blk, ifStmt);
} else if (thenEmpty) {
// brtrue
//
// label
CreateBrTrueStmt(*blk, ifStmt);
} else {
// brfalse
//
// goto
// label
//
// label
CreateBrFalseAndGotoStmt(*blk, ifStmt);
}
return blk;
}
向下转译条件对象
BlockNode *MIRLower::LowerWhileStmt(WhileStmtNode &whileStmt) {
ASSERT(whileStmt.GetBody() != nullptr, “nullptr check”);
whileStmt.SetBody(LowerBlock(*whileStmt.GetBody()));
auto *blk = mirModule.CurFuncCodeMemPool()->New();
auto *brFalseStmt = mirModule.CurFuncCodeMemPool()->New(OP_brfalse);
brFalseStmt->SetOpnd(whileStmt.Opnd(0), 0);
brFalseStmt->SetSrcPos(whileStmt.GetSrcPos());
LabelIdx lalbeIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel();
(void)mirModule.CurFunction()->GetLabelTab()->AddToStringLabelMap(lalbeIdx);
brFalseStmt->SetOffset(lalbeIdx);
blk->AddStatement(brFalseStmt);
LabelIdx bodyLableIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel();
(void)mirModule.CurFunction()->GetLabelTab()->AddToStringLabelMap(bodyLableIdx);
auto *lableStmt = mirModule.CurFuncCodeMemPool()->New();
lableStmt->SetLabelIdx(bodyLableIdx);
blk->AddStatement(lableStmt);
blk->AppendStatementsFromBlock(*whileStmt.GetBody());
auto *brTrueStmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue);
brTrueStmt->SetOpnd(whileStmt.Opnd(0)->CloneTree(mirModule.GetCurFuncCodeMPAllocator()), 0);
brTrueStmt->SetOffset(bodyLableIdx);
blk->AddStatement(brTrueStmt);
lableStmt = mirModule.CurFuncCodeMemPool()->New();
lableStmt->SetLabelIdx(lalbeIdx);
blk->AddStatement(lableStmt);
return blk;
}
如果是条件语句就循环向下
BlockNode *MIRLower::LowerDowhileStmt(WhileStmtNode &doWhileStmt) {
ASSERT(doWhileStmt.GetBody() != nullptr, “nullptr check”);
doWhileStmt.SetBody(LowerBlock(*doWhileStmt.GetBody()));
auto *blk = mirModule.CurFuncCodeMemPool()->New();
LabelIdx lIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel();
(void)mirModule.CurFunction()->GetLabelTab()->AddToStringLabelMap(lIdx);
auto *labelStmt = mirModule.CurFuncCodeMemPool()->New();
labelStmt->SetLabelIdx(lIdx);
blk->AddStatement(labelStmt);
blk->AppendStatementsFromBlock(*doWhileStmt.GetBody());
auto *brTrueStmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue);
brTrueStmt->SetOpnd(doWhileStmt.Opnd(0), 0);
brTrueStmt->SetOffset(lIdx);
blk->AddStatement(brTrueStmt);
return blk;
}
如果是条件语句就执行循环向下操作
方舟编译器_5
最新推荐文章于 2024-10-13 19:04:04 发布