方舟编译器_5

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;
}
如果是条件语句就执行循环向下操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值