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<MIRFarrayType>(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<const ConstvalNode>(array->GetIndex(0));
if (constvalNode->GetConstVal()->GetKind() == kConstInt) {
const MIRIntConst pIntConst = static_cast<const MIRIntConst>(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