栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

方舟编译器

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

方舟编译器

2021SC@SDUSC
MIRLower类中主要是定义一些向下转换的操作,之前我们也做过控制流语句的具体向下转换的分析,都是属于MIRLower类的具体的成员函数。
void MIRLower::LowerFunc(MIRFunction &func) {
mirModule.SetCurFunction(&func);
if (IsLowerExpandArray()) {
ExpandArrayMrt(func);
}
BlockNode *origBody = func.GetBody();
ASSERT(origBody != nullptr, “nullptr check”);
BlockNode *newBody = LowerBlock(*origBody);
ASSERT(newBody != nullptr, “nullptr check”);
if (!InLFO()) {
LowerCandCior(*newBody);
}
func.SetBody(newBody);
}
向下转译方法
baseNode *MIRLower::LowerFarray(ArrayNode *array) {
auto farrayType = static_cast>(array->GetArrayType(GlobalTables::GetTypeTable()));
size_t eSize = GlobalTables::GetTypeTable().GetTypeFromTyIdx(farrayType->GetElemTyIdx())->GetSize();
MIRType &arrayType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx(array->GetPrimType()));
/
how about multi-dimension array? */
if (array->GetIndex(0)->GetOpCode() == OP_constval) {
const ConstvalNode constvalNode = static_cast>(array->GetIndex(0));
if (constvalNode->GetConstVal()->GetKind() == kConstInt) {
const MIRIntConst pIntConst = static_cast>(constvalNode->GetConstVal());
CHECK_FATAL(mirModule.IsJavaModule() || pIntConst->GetValue() >= 0, “Array index should >= 0.”);
int64 eleOffset = pIntConst->GetValue() * eSize;

baseNode *baseNode = array->Getbase();
if (eleOffset == 0) {
return baseNode;
}

MIRIntConst *eleConst =
GlobalTables::GetIntConstTable().GetOrCreateIntConst(eleOffset, arrayType);
baseNode *offsetNode = mirModule.CurFuncCodeMemPool()->New(eleConst);
offsetNode->SetPrimType(array->GetPrimType());

baseNode *rAdd = mirModule.CurFuncCodeMemPool()->New(OP_add);
rAdd->SetPrimType(array->GetPrimType());
rAdd->SetOpnd(baseNode, 0);
rAdd->SetOpnd(offsetNode, 1);
return rAdd;
}
}

baseNode *rMul = nullptr;

baseNode *baseNode = array->Getbase();

baseNode *rAdd = mirModule.CurFuncCodeMemPool()->New(OP_add);
rAdd->SetPrimType(array->GetPrimType());
rAdd->SetOpnd(baseNode, 0);
rAdd->SetOpnd(rMul, 1);
auto *newAdd = ConstantFold(mirModule).Fold(rAdd);
rAdd = (newAdd != nullptr ? newAdd : rAdd);
return rAdd;
}
向下转译Farray

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号