From 118c14c2d57510e0b716b8aeb4676c815f5ebb18 Mon Sep 17 00:00:00 2001 From: binaryfz Date: Mon, 12 Apr 2021 16:48:49 +0800 Subject: [PATCH] [mplfe] Fix array type issue,[buildsystem]mod bounds_checking_function include cfg,[sync after gerrit test]PR522 PR507 PR517 --- Makefile | 2 +- .../include/cg/aarch64/aarch64_args.h | 2 +- .../include/cg/aarch64/aarch64_cgfunc.h | 4 +- .../src/cg/aarch64/aarch64_cgfunc.cpp | 17 +- .../src/cg/aarch64/aarch64_memlayout.cpp | 4 +- src/mapleall/maple_me/include/alias_class.h | 2 +- src/mapleall/maple_me/include/ssa_mir_nodes.h | 3 +- src/mapleall/maple_me/src/alias_class.cpp | 69 ++-- src/mplfe/ast_input/include/ast_expr.h | 195 +++++---- src/mplfe/ast_input/lib/ast_interface.h | 4 + src/mplfe/ast_input/src/ast_expr.cpp | 369 +++++++++++++----- src/mplfe/ast_input/src/ast_parser.cpp | 40 +- src/mplfe/ast_input/src/ast_stmt.cpp | 11 +- src/mplfe/bc_input/src/bc_instruction.cpp | 2 +- src/mplfe/common/include/feir_builder.h | 7 +- src/mplfe/common/include/feir_node_kind.def | 4 +- src/mplfe/common/include/feir_stmt.h | 28 +- src/mplfe/common/src/feir_builder.cpp | 18 + src/mplfe/common/src/feir_stmt.cpp | 26 ++ src/mplfe/common/src/feir_type.cpp | 2 + src/mplfe/dex_input/src/dex_op.cpp | 6 +- 21 files changed, 569 insertions(+), 246 deletions(-) diff --git a/Makefile b/Makefile index 4de0b8b361..10f3ce783f 100644 --- a/Makefile +++ b/Makefile @@ -99,7 +99,7 @@ java-core-def: install $(MAKE) gen-def OPT=$(OPT) DEBUG=$(DEBUG) OPS_ANDROID=$(OPS_ANDROID) .PHONY: install -install: maple dex2mpl_install irbuild +install: maple dex2mpl_install irbuild mplfe $(shell mkdir -p $(INSTALL_DIR)/ops/linker/; \ rsync -a -L $(MRT_ROOT)/maplert/linker/maplelld.so.lds $(INSTALL_DIR)/ops/linker/; \ rsync -a -L $(MAPLE_ROOT)/build/java2d8 $(INSTALL_DIR)/bin; \ diff --git a/src/mapleall/maple_be/include/cg/aarch64/aarch64_args.h b/src/mapleall/maple_be/include/cg/aarch64/aarch64_args.h index 8e65824e2e..88b91e20e0 100644 --- a/src/mapleall/maple_be/include/cg/aarch64/aarch64_args.h +++ b/src/mapleall/maple_be/include/cg/aarch64/aarch64_args.h @@ -1,5 +1,5 @@ /* - * Copyright (c) [2020] Huawei Technologies Co.,Ltd.All rights reserved. + * Copyright (c) [2020-2021] Huawei Technologies Co.,Ltd.All rights reserved. * * OpenArkCompiler is licensed under Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan PSL v2. diff --git a/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h b/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h index 9fcce913b8..94a31e94d9 100644 --- a/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h +++ b/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h @@ -280,7 +280,7 @@ class AArch64CGFunc : public CGFunc { } RegOperand &GenStructParamIndex(RegOperand &base, const BaseNode &indexExpr, int shift, PrimType baseType, - PrimType targetType); + PrimType targetType); MemOperand &GetOrCreateMemOpnd(const MIRSymbol &symbol, int32 offset, uint32 size, bool forLocalRef = false); @@ -303,7 +303,7 @@ class AArch64CGFunc : public CGFunc { AArch64isa::MemoryOrdering memOrd = AArch64isa::kMoNone); MemOperand *CreateMemOpndOrNull(PrimType ptype, const BaseNode &parent, BaseNode &addrExpr, int32 offset = 0, - AArch64isa::MemoryOrdering memOrd = AArch64isa::kMoNone); + AArch64isa::MemoryOrdering memOrd = AArch64isa::kMoNone); CondOperand &GetCondOperand(AArch64CC_t op) { return ccOperands[op]; diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp index 65594061b6..30dc17766a 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp @@ -5609,6 +5609,9 @@ void AArch64CGFunc::SelectParmListPreprocessLargeStruct(BaseNode &argExpr, int32 if (symSize > kParmMemcpySize) { CreateCallStructParamMemcpy(sym, nullptr, symSize, structCopyOffset, rhsOffset); structCopyOffset += RoundUp(symSize, kSizeOfPtr); + } else if (symSize > k16ByteSize) { + uint32 numMemOp = static_cast(RoundUp(symSize, kSizeOfPtr) / kSizeOfPtr); + structCopyOffset += (numMemOp * kSizeOfPtr); } } else if (argExpr.GetOpCode() == OP_iread) { IreadNode &iread = static_cast(argExpr); @@ -5630,6 +5633,9 @@ void AArch64CGFunc::SelectParmListPreprocessLargeStruct(BaseNode &argExpr, int32 CreateCallStructParamMemcpy(nullptr, addrOpnd, symSize, structCopyOffset, rhsOffset); structCopyOffset += RoundUp(symSize, kSizeOfPtr); + } else if (symSize > k16ByteSize) { + uint32 numMemOp = static_cast(RoundUp(symSize, kSizeOfPtr) / kSizeOfPtr); + structCopyOffset += (numMemOp * kSizeOfPtr); } } } @@ -6446,7 +6452,8 @@ MemOperand &AArch64CGFunc::CreateMemOpnd(RegOperand &baseOpnd, int32 offset, uin return *memPool->New(AArch64MemOperand::kAddrModeBOi, size, baseOpnd, nullptr, &offsetOpnd, &sym); } -RegOperand &AArch64CGFunc::GenStructParamIndex(RegOperand &base, const BaseNode &indexExpr, int shift, PrimType baseType, PrimType targetType) { +RegOperand &AArch64CGFunc::GenStructParamIndex(RegOperand &base, const BaseNode &indexExpr, int shift, + PrimType baseType, PrimType targetType) { RegOperand *index = &LoadIntoRegister(*HandleExpr(indexExpr, *(indexExpr.Opnd(0))), PTY_a64); RegOperand *srcOpnd = &CreateRegisterOperandOfType(PTY_a64); ImmOperand *imm = &CreateImmOperand(PTY_a64, shift); @@ -6458,8 +6465,8 @@ RegOperand &AArch64CGFunc::GenStructParamIndex(RegOperand &base, const BaseNode AArch64MemOperand &mo = GetOrCreateMemOpnd(AArch64MemOperand::kAddrModeBOi, k64BitSize, result, nullptr, offopnd, nullptr); RegOperand &structAddr = CreateVirtualRegisterOperand(NewVReg(kRegTyInt, k8ByteSize)); - GetCurBB()->AppendInsn(cg->BuildInstruction(PickLdInsn(GetPrimTypeBitSize(baseType), targetType), structAddr, mo)); - + GetCurBB()->AppendInsn(cg->BuildInstruction(PickLdInsn(GetPrimTypeBitSize(baseType), targetType), + structAddr, mo)); return structAddr; } @@ -6524,7 +6531,7 @@ MemOperand *AArch64CGFunc::CheckAndCreateExtendMemOpnd(PrimType ptype, BaseNode } MemOperand &AArch64CGFunc::CreateNonExtendMemOpnd(PrimType ptype, const BaseNode &parent, BaseNode &addrExpr, - int32 offset) { + int32 offset) { Operand *addrOpnd = HandleExpr(parent, addrExpr); addrOpnd = static_cast(&LoadIntoRegister(*addrOpnd, PTY_a64)); if ((addrExpr.GetOpCode() == OP_CG_array_elem_add) && (offset == 0) && GetCurBB() && GetCurBB()->GetLastInsn() && @@ -6558,7 +6565,7 @@ MemOperand &AArch64CGFunc::CreateMemOpnd(PrimType ptype, const BaseNode &parent, } MemOperand *AArch64CGFunc::CreateMemOpndOrNull(PrimType ptype, const BaseNode &parent, BaseNode &addrExpr, int32 offset, - AArch64isa::MemoryOrdering memOrd) { + AArch64isa::MemoryOrdering memOrd) { MemOperand *memOpnd = CheckAndCreateExtendMemOpnd(ptype, addrExpr, offset, memOrd); if (memOpnd != nullptr) { return memOpnd; diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp index 3e06f38bbd..ff13844819 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_memlayout.cpp @@ -268,8 +268,8 @@ void AArch64MemLayout::LayoutLocalVariales(std::vector &tempVar, std symLoc->SetMemSegment(segLocals); MIRType *ty = GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx); uint32 align = be.GetTypeAlign(tyIdx); - if (ty->GetPrimType() == PTY_agg && align < 8) { - segLocals.SetSize(RoundUp(segLocals.GetSize(), 8)); + if (ty->GetPrimType() == PTY_agg && align < k8BitSize) { + segLocals.SetSize(RoundUp(segLocals.GetSize(), k8BitSize)); } else { segLocals.SetSize(RoundUp(segLocals.GetSize(), align)); } diff --git a/src/mapleall/maple_me/include/alias_class.h b/src/mapleall/maple_me/include/alias_class.h index 8257766244..2f21e41e51 100644 --- a/src/mapleall/maple_me/include/alias_class.h +++ b/src/mapleall/maple_me/include/alias_class.h @@ -87,7 +87,7 @@ class AliasElem { class AliasInfo { public: AliasElem *ae; - FieldID fieldID; // corresponds to fieldID in OP-addrof/OP_iaddrof + FieldID fieldID; // corresponds to fieldID in OP-addrof/OP_iaddrof AliasInfo() : ae(nullptr), fieldID(0) {} AliasInfo(AliasElem *ae0, FieldID fld) : ae(ae0), fieldID(fld) {} diff --git a/src/mapleall/maple_me/include/ssa_mir_nodes.h b/src/mapleall/maple_me/include/ssa_mir_nodes.h index 3d7773ef2a..6b5af97e95 100644 --- a/src/mapleall/maple_me/include/ssa_mir_nodes.h +++ b/src/mapleall/maple_me/include/ssa_mir_nodes.h @@ -62,12 +62,11 @@ class MayDefNode { LogInfo::MapleLogger() << ")\n"; } + VersionSt *base = nullptr; // only provided if indirectLev is 1 and attached to iassign private: VersionSt *opnd; VersionSt *result; StmtNode *stmt; - public: - VersionSt *base = nullptr; // only provided if indirectLev is 1 and attached to iassign }; class MayUseNode { diff --git a/src/mapleall/maple_me/src/alias_class.cpp b/src/mapleall/maple_me/src/alias_class.cpp index 5f381bb184..da3588ef33 100644 --- a/src/mapleall/maple_me/src/alias_class.cpp +++ b/src/mapleall/maple_me/src/alias_class.cpp @@ -30,7 +30,7 @@ inline bool IsReadOnlyOst(const OriginalSt &ost) { return ost.GetMIRSymbol()->HasAddrOfValues(); } -inline bool IsPotentialAddress(PrimType primType, MIRModule *mirModule) { +inline bool IsPotentialAddress(PrimType primType, const MIRModule *mirModule) { return IsAddress(primType) || IsPrimitiveDynType(primType) || (primType == PTY_u64 && mirModule->IsCModule()); } @@ -122,9 +122,7 @@ AliasElem *AliasClass::FindOrCreateAliasElem(OriginalSt &ost) { aliasElem = acMemPool.New(id2Elem.size(), ost); if (ost.IsSymbolOst() && ost.GetIndirectLev() >= 0) { const MIRSymbol *sym = ost.GetMIRSymbol(); - if (sym->IsGlobal() && - (mirModule.IsCModule() || - (!sym->HasAddrOfValues() && !sym->GetIsTmp()))) { + if (sym->IsGlobal() && (mirModule.IsCModule() || (!sym->HasAddrOfValues() && !sym->GetIsTmp()))) { (void)globalsMayAffectedByClinitCheck.insert(ostIdx); if (!sym->IsReflectionClassInfo()) { if (!ost.IsFinal() || InConstructorLikeFunc()) { @@ -163,17 +161,19 @@ AliasElem *AliasClass::FindOrCreateExtraLevAliasElem(BaseNode &expr, TyIdx tyIdx } } else { if (ainfo.ae == nullptr || - (fieldId && ainfo.ae->GetOriginalSt().GetIndirectLev() != -1 && ainfo.ae->GetOriginalSt().GetTyIdx() != tyIdx)) { + (fieldId && (ainfo.ae->GetOriginalSt().GetIndirectLev() != -1) && + (ainfo.ae->GetOriginalSt().GetTyIdx() != tyIdx))) { return FindOrCreateDummyNADSAe(); } } OriginalSt *newOst = nullptr; if (mirModule.IsCModule() && ainfo.ae->GetOriginalSt().GetTyIdx() != tyIdx) { - newOst = GetAliasAnalysisTable()->FindOrCreateExtraLevOriginalSt(ainfo.ae->GetOriginalSt(), ainfo.ae->GetOriginalSt().GetTyIdx(), 0); + newOst = GetAliasAnalysisTable()->FindOrCreateExtraLevOriginalSt( + ainfo.ae->GetOriginalSt(), ainfo.ae->GetOriginalSt().GetTyIdx(), 0); } else { - newOst = GetAliasAnalysisTable()->FindOrCreateExtraLevOriginalSt(ainfo.ae->GetOriginalSt(), - ainfo.fieldID ? ainfo.ae->GetOriginalSt().GetTyIdx() : tyIdx, - fieldId + ainfo.fieldID); + newOst = GetAliasAnalysisTable()->FindOrCreateExtraLevOriginalSt( + ainfo.ae->GetOriginalSt(), ainfo.fieldID ? ainfo.ae->GetOriginalSt().GetTyIdx() : tyIdx, + fieldId + ainfo.fieldID); } CHECK_FATAL(newOst != nullptr, "null ptr check"); if (newOst->GetIndex() == osym2Elem.size()) { @@ -212,7 +212,8 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { } case OP_iread: { auto &iread = static_cast(expr); - return AliasInfo(FindOrCreateExtraLevAliasElem(utils::ToRef(iread.Opnd(0)), iread.GetTyIdx(), iread.GetFieldID()), 0); + return AliasInfo( + FindOrCreateExtraLevAliasElem(utils::ToRef(iread.Opnd(0)), iread.GetTyIdx(), iread.GetFieldID()), 0); } case OP_iaddrof: { auto &iread = static_cast(expr); @@ -224,12 +225,12 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { case OP_array: case OP_retype: { for (size_t i = 1; i < expr.NumOpnds(); ++i) { - CreateAliasElemsExpr(*expr.Opnd(i)); + (void)CreateAliasElemsExpr(*expr.Opnd(i)); } return CreateAliasElemsExpr(*expr.Opnd(0)); } case OP_select: { - CreateAliasElemsExpr(*expr.Opnd(0)); + (void)CreateAliasElemsExpr(*expr.Opnd(0)); AliasInfo ainfo = CreateAliasElemsExpr(*expr.Opnd(1)); AliasInfo ainfo2 = CreateAliasElemsExpr(*expr.Opnd(2)); if (!OpCanFormAddress(expr.Opnd(1)->GetOpCode()) || !OpCanFormAddress(expr.Opnd(2)->GetOpCode())) { @@ -256,7 +257,7 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { [[clang::fallthrough]]; default: for (size_t i = 0; i < expr.NumOpnds(); ++i) { - CreateAliasElemsExpr(*expr.Opnd(i)); + (void)CreateAliasElemsExpr(*expr.Opnd(i)); } } return AliasInfo(); @@ -277,7 +278,7 @@ void AliasClass::ApplyUnionForDassignCopy(const AliasElem &lhsAe, const AliasEle aliasElem->SetNextLevNotAllDefsSeen(true); return; } - if (!IsPotentialAddress(rhs.GetPrimType(), &mirModule) || + if (!IsPotentialAddress(rhs.GetPrimType(), &mirModule) || kOpcodeInfo.NotPure(rhs.GetOpCode()) || HasMallocOpnd(&rhs) || (rhs.GetOpCode() == OP_addrof && IsReadOnlyOst(rhsAe->GetOriginalSt()))) { @@ -315,10 +316,11 @@ void AliasClass::CreateMirroringAliasElems(OriginalSt *ost1, OriginalSt *ost2) { } MapleVector *nextLevelNodes = GetAliasAnalysisTable()->GetNextLevelNodes(*ost1); MapleVector::iterator it = nextLevelNodes->begin(); - for (; it != nextLevelNodes->end(); it++) { + for (; it != nextLevelNodes->end(); ++it) { OriginalSt *nextLevelOst1 = *it; AliasElem *ae1 = FindOrCreateAliasElem(*nextLevelOst1); - OriginalSt *nextLevelOst2 = GetAliasAnalysisTable()->FindOrCreateExtraLevOriginalSt(*ost2, ost2->GetTyIdx(), nextLevelOst1->GetFieldID()); + OriginalSt *nextLevelOst2 = GetAliasAnalysisTable()->FindOrCreateExtraLevOriginalSt( + *ost2, ost2->GetTyIdx(), nextLevelOst1->GetFieldID()); if (nextLevelOst2->GetIndex() == osym2Elem.size()) { osym2Elem.push_back(nullptr); ssaTab.GetVersionStTable().CreateZeroVersionSt(nextLevelOst2); @@ -347,7 +349,8 @@ void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { } // at p = x, if the next level of either side exists, create other // side's next level - if (mirModule.IsCModule() && rhsAinfo.ae && lhsAe->GetOriginalSt().GetTyIdx() == rhsAinfo.ae->GetOriginalSt().GetTyIdx()) { + if (mirModule.IsCModule() && rhsAinfo.ae && + (lhsAe->GetOriginalSt().GetTyIdx() == rhsAinfo.ae->GetOriginalSt().GetTyIdx())) { CreateMirroringAliasElems(&rhsAinfo.ae->GetOriginalSt(), &lhsAe->GetOriginalSt()); CreateMirroringAliasElems(&lhsAe->GetOriginalSt(), &rhsAinfo.ae->GetOriginalSt()); } @@ -843,7 +846,8 @@ void AliasClass::CollectMayUseFromNADS(std::set &mayUseOsts) { } else { for (unsigned int elemID : *(notAllDefsSeenAE->GetClassSet())) { AliasElem *aliasElem = id2Elem[elemID]; - if (!mirModule.IsCModule() && aliasElem->GetOriginalSt().GetIndirectLev() == 0 && OriginalStIsAuto(&aliasElem->GetOriginalSt())) { + if (!mirModule.IsCModule() && aliasElem->GetOriginalSt().GetIndirectLev() == 0 && + OriginalStIsAuto(&aliasElem->GetOriginalSt())) { continue; } (void)mayUseOsts.insert(&aliasElem->GetOriginalSt()); @@ -988,8 +992,9 @@ void AliasClass::CollectMayDefForDassign(const StmtNode &stmt, std::setHasFields()) { - if (ostOfAliasAe->GetFieldID() < ostOfLhsAe->GetFieldID() || - ostOfAliasAe->GetFieldID() > (ostOfLhsAe->GetFieldID() + (int32)lhsAeType->NumberOfFieldIDs())) { + if ((ostOfAliasAe->GetFieldID() < ostOfLhsAe->GetFieldID()) || + (ostOfAliasAe->GetFieldID() > + (ostOfLhsAe->GetFieldID() + static_cast(lhsAeType->NumberOfFieldIDs())))) { if (!aliasAeType->HasFields()) { continue; } @@ -997,7 +1002,7 @@ void AliasClass::CollectMayDefForDassign(const StmtNode &stmt, std::setHasFields()) { if (fldIDA < fldIDB || - fldIDA > (fldIDB + (int32)aliasAeType->NumberOfFieldIDs())) { + fldIDA > (fldIDB + static_cast(aliasAeType->NumberOfFieldIDs()))) { if (!lhsAeType->HasFields()) { continue; } @@ -1036,13 +1041,13 @@ void AliasClass::CollectMayDefForIassign(StmtNode &stmt, std::set & AliasInfo baseAinfo = CreateAliasElemsExpr(*iassignNode.Opnd(0)); AliasElem *lhsAe = nullptr; if (baseAinfo.ae != nullptr && - (!mirModule.IsCModule() || - iassignNode.GetFieldID() == 0 || - baseAinfo.ae->GetOriginalSt().GetIndirectLev() == -1 || + (!mirModule.IsCModule() || + iassignNode.GetFieldID() == 0 || + baseAinfo.ae->GetOriginalSt().GetIndirectLev() == -1 || baseAinfo.ae->GetOriginalSt().GetTyIdx() == iassignNode.GetTyIdx())) { // get the next-level-ost that will be assigned to FieldID fldOfIass = iassignNode.GetFieldID() + baseAinfo.fieldID; - if (mirModule.IsCModule() && + if (mirModule.IsCModule() && baseAinfo.ae->GetOriginalSt().GetTyIdx() != iassignNode.GetTyIdx()) { fldOfIass = 0; } @@ -1089,13 +1094,15 @@ void AliasClass::CollectMayDefForIassign(StmtNode &stmt, std::set & continue; } if (lhsAeType->HasFields()) { - if (ostOfAliasAE.GetFieldID() < ostOfLhsAe->GetFieldID() || - ostOfAliasAE.GetFieldID() > (ostOfLhsAe->GetFieldID() + (int32)lhsAeType->NumberOfFieldIDs())) { + if ((ostOfAliasAE.GetFieldID() < ostOfLhsAe->GetFieldID()) || + (ostOfAliasAE.GetFieldID() > + (ostOfLhsAe->GetFieldID() + static_cast(lhsAeType->NumberOfFieldIDs())))) { continue; } } else { - if (ostOfLhsAe->GetFieldID() < ostOfAliasAE.GetFieldID() || - ostOfLhsAe->GetFieldID() > (ostOfAliasAE.GetFieldID() + (int32)aliasAeType->NumberOfFieldIDs())) { + if ((ostOfLhsAe->GetFieldID() < ostOfAliasAE.GetFieldID()) || + (ostOfLhsAe->GetFieldID() > + (ostOfAliasAE.GetFieldID() + static_cast(aliasAeType->NumberOfFieldIDs())))) { continue; } } @@ -1129,7 +1136,7 @@ void AliasClass::InsertMayDefIassign(StmtNode &stmt, BBId bbid) { ASSERT(!mayDefNodes.empty(), "AliasClass::InsertMayUseIassign(): iassign cannot have empty maydef"); // go thru inserted MayDefNode to add the base info TypeOfMayDefList::iterator it = mayDefNodes.begin(); - for (; it != mayDefNodes.end(); it++) { + for (; it != mayDefNodes.end(); ++it) { MayDefNode &mayDef = *it; OriginalSt *ost = mayDef.GetResult()->GetOst(); if (ost->GetIndirectLev() == 1) { @@ -1328,7 +1335,7 @@ void AliasClass::InsertMayDefUseIntrncall(StmtNode &stmt, BBId bbid) { std::set mayDefUseOsts; // 1. collect mayDefs and mayUses caused by not_all_defs_seen_ae if (!mirModule.IsCModule()) { - for (int32 i = 0; i < stmt.NumOpnds(); i++) { + for (uint32 i = 0; i < stmt.NumOpnds(); ++i) { InsertMayUseExpr(*stmt.Opnd(i)); } } else { diff --git a/src/mplfe/ast_input/include/ast_expr.h b/src/mplfe/ast_input/include/ast_expr.h index f7a6ffed05..b5009e4903 100644 --- a/src/mplfe/ast_input/include/ast_expr.h +++ b/src/mplfe/ast_input/include/ast_expr.h @@ -23,10 +23,14 @@ class ASTExpr { public: explicit ASTExpr(ASTOp o) : op(o) {} virtual ~ASTExpr() = default; - UniqueFEIRExpr Emit2FEExpr() const; + UniqueFEIRExpr Emit2FEExpr(std::list &stmts) const; + + ASTOp GetASTOp() { + return op; + } protected: - virtual UniqueFEIRExpr Emit2FEExprImpl() const = 0; + virtual UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const = 0; ASTOp op; }; @@ -44,14 +48,14 @@ class ASTImplicitCastExpr : public ASTExpr { } protected: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *child = nullptr; }; -class ASTRefExpr : public ASTExpr { +class ASTDeclRefExpr : public ASTExpr { public: - ASTRefExpr() : ASTExpr(kASTOpRef) {} - ~ASTRefExpr() = default; + ASTDeclRefExpr() : ASTExpr(kASTOpRef) {} + ~ASTDeclRefExpr() = default; void SetASTDecl(ASTDecl *astDecl); ASTDecl *GetASTDecl() const { @@ -59,7 +63,7 @@ class ASTRefExpr : public ASTExpr { } protected: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTDecl *var = nullptr; }; @@ -68,9 +72,41 @@ class ASTUnaryOperatorExpr : public ASTExpr { explicit ASTUnaryOperatorExpr(ASTOp o) : ASTExpr(o) {} ~ASTUnaryOperatorExpr() = default; void SetUOExpr(ASTExpr*); + void SetSubType(MIRType *type); + void SetRefName(std::string name) { + refName = name; + } + + std::string GetRefName() { + return refName; + } + + MIRType *GetMIRType() { + return subType; + } + + MIRType *SetUOType(MIRType *type) { + return uoType = type; + } + + MIRType *GetUOType() { + return uoType; + } + + void SetPointeeLen(int64 len) { + pointeeLen = len; + } + + int64 GetPointeeLen() { + return pointeeLen; + } protected: ASTExpr *expr = nullptr; + MIRType *subType; + MIRType *uoType; + std::string refName; + int64 pointeeLen; }; class ASTUOMinusExpr: public ASTUnaryOperatorExpr { @@ -79,7 +115,7 @@ class ASTUOMinusExpr: public ASTUnaryOperatorExpr { ~ASTUOMinusExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUONotExpr: public ASTUnaryOperatorExpr { @@ -88,7 +124,7 @@ class ASTUONotExpr: public ASTUnaryOperatorExpr { ~ASTUONotExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUOLNotExpr: public ASTUnaryOperatorExpr { @@ -97,7 +133,7 @@ class ASTUOLNotExpr: public ASTUnaryOperatorExpr { ~ASTUOLNotExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUOPostIncExpr: public ASTUnaryOperatorExpr { @@ -106,7 +142,7 @@ class ASTUOPostIncExpr: public ASTUnaryOperatorExpr { ~ASTUOPostIncExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUOPostDecExpr: public ASTUnaryOperatorExpr { @@ -115,7 +151,7 @@ class ASTUOPostDecExpr: public ASTUnaryOperatorExpr { ~ASTUOPostDecExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUOPreIncExpr: public ASTUnaryOperatorExpr { @@ -124,7 +160,7 @@ class ASTUOPreIncExpr: public ASTUnaryOperatorExpr { ~ASTUOPreIncExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUOPreDecExpr: public ASTUnaryOperatorExpr { @@ -133,7 +169,7 @@ class ASTUOPreDecExpr: public ASTUnaryOperatorExpr { ~ASTUOPreDecExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUOAddrOfExpr: public ASTUnaryOperatorExpr { @@ -142,7 +178,7 @@ class ASTUOAddrOfExpr: public ASTUnaryOperatorExpr { ~ASTUOAddrOfExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUODerefExpr: public ASTUnaryOperatorExpr { @@ -151,7 +187,7 @@ class ASTUODerefExpr: public ASTUnaryOperatorExpr { ~ASTUODerefExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUOPlusExpr: public ASTUnaryOperatorExpr { @@ -160,7 +196,7 @@ class ASTUOPlusExpr: public ASTUnaryOperatorExpr { ~ASTUOPlusExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUORealExpr: public ASTUnaryOperatorExpr { @@ -169,7 +205,7 @@ class ASTUORealExpr: public ASTUnaryOperatorExpr { ~ASTUORealExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUOImagExpr: public ASTUnaryOperatorExpr { @@ -178,7 +214,7 @@ class ASTUOImagExpr: public ASTUnaryOperatorExpr { ~ASTUOImagExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUOExtensionExpr: public ASTUnaryOperatorExpr { @@ -187,7 +223,7 @@ class ASTUOExtensionExpr: public ASTUnaryOperatorExpr { ~ASTUOExtensionExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTUOCoawaitExpr: public ASTUnaryOperatorExpr { @@ -196,7 +232,7 @@ class ASTUOCoawaitExpr: public ASTUnaryOperatorExpr { ~ASTUOCoawaitExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTPredefinedExpr : public ASTExpr { @@ -206,7 +242,7 @@ class ASTPredefinedExpr : public ASTExpr { void SetASTExpr(ASTExpr*); private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *child; }; @@ -217,7 +253,7 @@ class ASTOpaqueValueExpr : public ASTExpr { void SetASTExpr(ASTExpr*); private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *child; }; @@ -228,7 +264,7 @@ class ASTNoInitExpr : public ASTExpr { void SetNoInitType(MIRType *type); private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; MIRType *noInitType; }; @@ -240,7 +276,7 @@ class ASTCompoundLiteralExpr : public ASTExpr { void SetASTExpr(ASTExpr*); private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *child = nullptr; MIRType *compoundLiteralType; }; @@ -253,7 +289,7 @@ class ASTOffsetOfExpr : public ASTExpr { void SetFieldName(std::string); private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; MIRType *structType; std::string fieldName; }; @@ -266,7 +302,7 @@ class ASTInitListExpr : public ASTExpr { void SetInitListType(MIRType *type); private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; std::vector fillers; MIRType *initListType; }; @@ -280,7 +316,7 @@ class ASTBinaryConditionalOperator : public ASTExpr { void SetFalseExpr(ASTExpr*); private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; MIRType *retType; ASTExpr *cExpr = nullptr; ASTExpr *fExpr = nullptr; @@ -319,7 +355,7 @@ class ASTImplicitValueInitExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; MIRType *type; }; @@ -349,7 +385,7 @@ class ASTStringLiteral : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; MIRType *type; size_t length; std::vector codeUnits; @@ -369,7 +405,7 @@ class ASTArraySubscriptExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *baseExpr; ASTExpr *idxExpr; }; @@ -392,7 +428,7 @@ class ASTExprUnaryExprOrTypeTraitExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; bool isType; MIRType *argType; ASTExpr *argExpr; @@ -416,7 +452,7 @@ class ASTMemberExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *baseExpr; std::string memberName; bool isArrow; @@ -436,7 +472,7 @@ class ASTDesignatedInitUpdateExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *baseExpr; ASTExpr *updaterExpr; }; @@ -447,7 +483,7 @@ class ASTBOAddExpr : public ASTBinaryOperatorExpr { ~ASTBOAddExpr() override = default; protected: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOMulExpr : public ASTBinaryOperatorExpr { @@ -456,7 +492,7 @@ class ASTBOMulExpr : public ASTBinaryOperatorExpr { ~ASTBOMulExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBODivExpr : public ASTBinaryOperatorExpr { @@ -465,7 +501,7 @@ class ASTBODivExpr : public ASTBinaryOperatorExpr { ~ASTBODivExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBORemExpr : public ASTBinaryOperatorExpr { @@ -474,7 +510,7 @@ class ASTBORemExpr : public ASTBinaryOperatorExpr { ~ASTBORemExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOSubExpr : public ASTBinaryOperatorExpr { @@ -483,7 +519,7 @@ class ASTBOSubExpr : public ASTBinaryOperatorExpr { ~ASTBOSubExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOShlExpr : public ASTBinaryOperatorExpr { @@ -492,7 +528,7 @@ class ASTBOShlExpr : public ASTBinaryOperatorExpr { ~ASTBOShlExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOShrExpr : public ASTBinaryOperatorExpr { @@ -501,7 +537,7 @@ class ASTBOShrExpr : public ASTBinaryOperatorExpr { ~ASTBOShrExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOLTExpr : public ASTBinaryOperatorExpr { @@ -510,7 +546,7 @@ class ASTBOLTExpr : public ASTBinaryOperatorExpr { ~ASTBOLTExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOGTExpr : public ASTBinaryOperatorExpr { @@ -519,7 +555,7 @@ class ASTBOGTExpr : public ASTBinaryOperatorExpr { ~ASTBOGTExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOLEExpr : public ASTBinaryOperatorExpr { @@ -528,7 +564,7 @@ class ASTBOLEExpr : public ASTBinaryOperatorExpr { ~ASTBOLEExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOGEExpr : public ASTBinaryOperatorExpr { @@ -537,7 +573,7 @@ class ASTBOGEExpr : public ASTBinaryOperatorExpr { ~ASTBOGEExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOEQExpr : public ASTBinaryOperatorExpr { @@ -546,7 +582,7 @@ class ASTBOEQExpr : public ASTBinaryOperatorExpr { ~ASTBOEQExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBONEExpr : public ASTBinaryOperatorExpr { @@ -555,7 +591,7 @@ class ASTBONEExpr : public ASTBinaryOperatorExpr { ~ASTBONEExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOAndExpr : public ASTBinaryOperatorExpr { @@ -564,7 +600,7 @@ class ASTBOAndExpr : public ASTBinaryOperatorExpr { ~ASTBOAndExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOXorExpr : public ASTBinaryOperatorExpr { @@ -573,7 +609,7 @@ class ASTBOXorExpr : public ASTBinaryOperatorExpr { ~ASTBOXorExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOOrExpr : public ASTBinaryOperatorExpr { @@ -582,7 +618,7 @@ class ASTBOOrExpr : public ASTBinaryOperatorExpr { ~ASTBOOrExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOLAndExpr : public ASTBinaryOperatorExpr { @@ -591,7 +627,7 @@ class ASTBOLAndExpr : public ASTBinaryOperatorExpr { ~ASTBOLAndExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOLOrExpr : public ASTBinaryOperatorExpr { @@ -600,7 +636,7 @@ class ASTBOLOrExpr : public ASTBinaryOperatorExpr { ~ASTBOLOrExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOEqExpr : public ASTBinaryOperatorExpr { @@ -609,7 +645,7 @@ class ASTBOEqExpr : public ASTBinaryOperatorExpr { ~ASTBOEqExpr() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOAssign : public ASTBinaryOperatorExpr { @@ -619,7 +655,7 @@ class ASTBOAssign : public ASTBinaryOperatorExpr { ~ASTBOAssign() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOComma : public ASTBinaryOperatorExpr { @@ -628,7 +664,7 @@ class ASTBOComma : public ASTBinaryOperatorExpr { ~ASTBOComma() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOPtrMemD : public ASTBinaryOperatorExpr { @@ -637,7 +673,7 @@ class ASTBOPtrMemD : public ASTBinaryOperatorExpr { ~ASTBOPtrMemD() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTBOPtrMemI : public ASTBinaryOperatorExpr { @@ -646,7 +682,7 @@ class ASTBOPtrMemI : public ASTBinaryOperatorExpr { ~ASTBOPtrMemI() override = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTCallExpr : public ASTExpr { @@ -686,7 +722,7 @@ class ASTCallExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; std::vector args; ASTExpr *calleeExpr = nullptr; @@ -704,7 +740,7 @@ class ASTParenExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *child = nullptr; }; @@ -726,7 +762,7 @@ class ASTIntegerLiteral : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; uint64 val; PrimType type; @@ -745,9 +781,18 @@ class ASTFloatingLiteral : public ASTExpr { val = valIn; } + void SetFlag(bool tf) { + isFloat = tf; + } + + bool GetFlag() { + return isFloat; + } + private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; double val; + bool isFloat; }; class ASTCharacterLiteral : public ASTExpr { @@ -756,7 +801,7 @@ class ASTCharacterLiteral : public ASTExpr { ~ASTCharacterLiteral() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTVAArgExpr : public ASTExpr { @@ -770,7 +815,7 @@ class ASTVAArgExpr : public ASTExpr { private: ASTExpr *child = nullptr; - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTCompoundAssignOperatorExpr : public ASTBinaryOperatorExpr { @@ -779,7 +824,7 @@ class ASTCompoundAssignOperatorExpr : public ASTBinaryOperatorExpr { ~ASTCompoundAssignOperatorExpr() override = default; protected: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; @@ -793,7 +838,7 @@ class ASTConstantExpr : public ASTExpr { private: ASTExpr *child = nullptr; - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTImaginaryLiteral : public ASTExpr { @@ -806,7 +851,7 @@ class ASTImaginaryLiteral : public ASTExpr { private: ASTExpr *child = nullptr; - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTConditionalOperator : public ASTExpr { @@ -827,7 +872,7 @@ class ASTConditionalOperator : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *condExpr = nullptr; ASTExpr *trueExpr = nullptr; ASTExpr *falseExpr = nullptr; @@ -859,7 +904,7 @@ class ASTCStyleCastExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *child = nullptr; MIRType *srcType; MIRType *destType; @@ -879,7 +924,7 @@ class ASTArrayInitLoopExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr* commonExpr = nullptr; }; @@ -905,7 +950,7 @@ class ASTArrayInitIndexExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; MIRType *primType; std::string value; }; @@ -924,7 +969,7 @@ class ASTExprWithCleanups : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; ASTExpr *subExpr = nullptr; }; @@ -934,7 +979,7 @@ class ASTMaterializeTemporaryExpr : public ASTExpr { ~ASTMaterializeTemporaryExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTSubstNonTypeTemplateParmExpr : public ASTExpr { @@ -943,7 +988,7 @@ class ASTSubstNonTypeTemplateParmExpr : public ASTExpr { ~ASTSubstNonTypeTemplateParmExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTDependentScopeDeclRefExpr : public ASTExpr { @@ -952,7 +997,7 @@ class ASTDependentScopeDeclRefExpr : public ASTExpr { ~ASTDependentScopeDeclRefExpr() = default; private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; }; class ASTAtomicExpr : public ASTExpr { @@ -985,7 +1030,7 @@ class ASTAtomicExpr : public ASTExpr { } private: - UniqueFEIRExpr Emit2FEExprImpl() const override; + UniqueFEIRExpr Emit2FEExprImpl(std::list &stmts) const override; MIRType *type; MIRType *refType; ASTAtomicOp atomicOp; diff --git a/src/mplfe/ast_input/lib/ast_interface.h b/src/mplfe/ast_input/lib/ast_interface.h index 5d0cf012e1..9ab9e0468b 100644 --- a/src/mplfe/ast_input/lib/ast_interface.h +++ b/src/mplfe/ast_input/lib/ast_interface.h @@ -69,6 +69,10 @@ class LibAstFile { MIRType *CvtRecordType(const clang::QualType srcType); MIRType *CvtFieldType(const clang::NamedDecl &decl); + const clang::ASTContext *GetContext() { + return astContext; + } + private: using RecordDeclMap = std::map; RecordDeclMap recordDeclMap; diff --git a/src/mplfe/ast_input/src/ast_expr.cpp b/src/mplfe/ast_input/src/ast_expr.cpp index 72a2adb42b..c44c8f8353 100644 --- a/src/mplfe/ast_input/src/ast_expr.cpp +++ b/src/mplfe/ast_input/src/ast_expr.cpp @@ -18,15 +18,16 @@ #include "feir_stmt.h" #include "feir_builder.h" #include "fe_utils_ast.h" +#include "feir_type_helper.h" namespace maple { // ---------- ASTExpr ---------- -UniqueFEIRExpr ASTExpr::Emit2FEExpr() const { - return Emit2FEExprImpl(); +UniqueFEIRExpr ASTExpr::Emit2FEExpr(std::list &stmts) const { + return Emit2FEExprImpl(stmts); } // ---------- ASTRefExpr --------- -UniqueFEIRExpr ASTRefExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTDeclRefExpr::Emit2FEExprImpl(std::list &stmts) const { PrimType primType = var->GetTypeDesc().front()->GetPrimType(); // A method is required to determine whether the var is global, need to update UniqueFEIRVar feirVar = FEIRBuilder::CreateVarName(var->GetName(), primType, true, false); @@ -35,16 +36,16 @@ UniqueFEIRExpr ASTRefExpr::Emit2FEExprImpl() const { } // ---------- ASTCallExpr ---------- -UniqueFEIRExpr ASTCallExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTCallExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTImplicitCastExpr ---------- -UniqueFEIRExpr ASTImplicitCastExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTImplicitCastExpr::Emit2FEExprImpl(std::list &stmts) const { const ASTExpr *childExpr = child; CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); - UniqueFEIRExpr feirImplicitCastExpr = childExpr->Emit2FEExpr(); + UniqueFEIRExpr feirImplicitCastExpr = childExpr->Emit2FEExpr(stmts); return feirImplicitCastExpr; } @@ -53,80 +54,226 @@ void ASTUnaryOperatorExpr::SetUOExpr(ASTExpr *astExpr) { expr = astExpr; } -UniqueFEIRExpr ASTUOMinusExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; -} - -UniqueFEIRExpr ASTUONotExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +void ASTUnaryOperatorExpr::SetSubType(MIRType *type) { + subType = type; } -UniqueFEIRExpr ASTUOLNotExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; -} - -UniqueFEIRExpr ASTUOPostIncExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTUOMinusExpr::Emit2FEExprImpl(std::list &stmts) const { + ASTExpr *childExpr = expr; + CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); + UniqueFEIRExpr childFEIRExpr = childExpr->Emit2FEExpr(stmts); + UniqueFEIRExpr minusExpr = FEIRBuilder::CreateExprMathUnary(OP_neg, std::move(childFEIRExpr)); + return minusExpr; } -UniqueFEIRExpr ASTUOPostDecExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTUOPlusExpr::Emit2FEExprImpl(std::list &stmts) const { + ASTExpr *childExpr = expr; + CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); + UniqueFEIRExpr plusExpr = childExpr->Emit2FEExpr(stmts); + return plusExpr; } -UniqueFEIRExpr ASTUOPreIncExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTUONotExpr::Emit2FEExprImpl(std::list &stmts) const { + ASTExpr *childExpr = expr; + CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); + UniqueFEIRExpr childFEIRExpr = childExpr->Emit2FEExpr(stmts); + UniqueFEIRExpr notExpr = FEIRBuilder::CreateExprMathUnary(OP_bnot, std::move(childFEIRExpr)); + return notExpr; } -UniqueFEIRExpr ASTUOPreDecExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTUOLNotExpr::Emit2FEExprImpl(std::list &stmts) const { + ASTExpr *childExpr = expr; + CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); + UniqueFEIRExpr childFEIRExpr = childExpr->Emit2FEExpr(stmts); + UniqueFEIRExpr lnotExpr = FEIRBuilder::CreateExprMathUnary(OP_lnot, std::move(childFEIRExpr)); + return lnotExpr; } -UniqueFEIRExpr ASTUOAddrOfExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTUOPostIncExpr::Emit2FEExprImpl(std::list &stmts) const { + ASTExpr *childExpr = expr; + CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); + PrimType subPrimType = subType->GetPrimType(); + + // postinc_1 = a, subVar attr need update + UniqueFEIRVar selfVar = FEIRBuilder::CreateVarName(refName, subPrimType, true, false); + UniqueFEIRVar selfMoveVar = selfVar->Clone(); + UniqueFEIRVar tempVar = FEIRBuilder::CreateVarName(FEUtils::GetSequentialName("postinc_"), subPrimType); + UniqueFEIRVar tempMoveVar = tempVar->Clone(); + UniqueFEIRExpr readSelfExpr = FEIRBuilder::CreateExprDRead(std::move(selfMoveVar)); + UniqueFEIRStmt readSelfstmt = FEIRBuilder::CreateStmtDAssign(std::move(tempMoveVar), std::move(readSelfExpr)); + stmts.emplace_back(std::move(readSelfstmt)); + + // a = a + 1 + UniqueFEIRExpr childFEIRExpr = childExpr->Emit2FEExpr(stmts); + UniqueFEIRExpr incDecExpr; + if (subPrimType == PTY_f32) { + incDecExpr = FEIRBuilder::CreateExprConstI32(1); + } else if(subPrimType == PTY_ptr) { + incDecExpr = std::make_unique(static_cast(childExpr)->GetPointeeLen(), + PTY_ptr); + } else { + incDecExpr = std::make_unique((subType->GetKind() == kTypeScalar) ? + 1 : static_cast(subType->GetSize()), subType->GetPrimType()); + } + CHECK_FATAL(incDecExpr != nullptr, "incDecExpr is nullptr"); + UniqueFEIRExpr selfAddExpr = FEIRBuilder::CreateExprMathBinary(OP_add, std::move(childFEIRExpr), + std::move(incDecExpr)); + UniqueFEIRStmt selfAddStmt = FEIRBuilder::CreateStmtDAssign(std::move(selfVar), std::move(selfAddExpr)); + stmts.emplace_back(std::move(selfAddStmt)); + + // return postinc_1 + UniqueFEIRExpr readTempExpr = FEIRBuilder::CreateExprDRead(std::move(tempVar)); + return readTempExpr; +} + +UniqueFEIRExpr ASTUOPostDecExpr::Emit2FEExprImpl(std::list &stmts) const { + ASTExpr *childExpr = expr; + CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); + PrimType subPrimType = subType->GetPrimType(); + + // postdec_1 = a, selfVar attr need update + UniqueFEIRVar selfVar = FEIRBuilder::CreateVarName(refName, subPrimType, true, false); + UniqueFEIRVar selfMoveVar = selfVar->Clone(); + UniqueFEIRVar tempVar = FEIRBuilder::CreateVarName(FEUtils::GetSequentialName("postinc_"), subPrimType); + UniqueFEIRVar tempMoveVar = tempVar->Clone(); + UniqueFEIRExpr readSelfExpr = FEIRBuilder::CreateExprDRead(std::move(selfMoveVar)); + UniqueFEIRStmt readSelfstmt = FEIRBuilder::CreateStmtDAssign(std::move(tempMoveVar), + std::move(readSelfExpr)); + stmts.emplace_back(std::move(readSelfstmt)); + + // a = a - 1 + UniqueFEIRExpr childFEIRExpr = childExpr->Emit2FEExpr(stmts); + UniqueFEIRExpr incDecExpr; + if (subPrimType == PTY_f32) { + incDecExpr = FEIRBuilder::CreateExprConstI32(1); + } else if(subPrimType == PTY_ptr) { + incDecExpr = std::make_unique(static_cast(childExpr)->GetPointeeLen(), + PTY_ptr); + } else { + incDecExpr = std::make_unique((subType->GetKind() == kTypeScalar) ? + 1 : static_cast(subType->GetSize()), subType->GetPrimType()); + } + CHECK_FATAL(incDecExpr != nullptr, "incDecExpr is nullptr"); + UniqueFEIRExpr selfAddExpr = FEIRBuilder::CreateExprMathBinary(OP_sub, std::move(childFEIRExpr), + std::move(incDecExpr)); + UniqueFEIRStmt selfAddStmt = FEIRBuilder::CreateStmtDAssign(std::move(selfVar), std::move(selfAddExpr)); + stmts.emplace_back(std::move(selfAddStmt)); + + // return postdec_1 + UniqueFEIRExpr readTempExpr = FEIRBuilder::CreateExprDRead(std::move(tempVar)); + return readTempExpr; +} + +UniqueFEIRExpr ASTUOPreIncExpr::Emit2FEExprImpl(std::list &stmts) const { + ASTExpr *childExpr = expr; + CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); + UniqueFEIRExpr childFEIRExpr = childExpr->Emit2FEExpr(stmts); + UniqueFEIRExpr incDecExpr; + PrimType subPrimType = subType->GetPrimType(); + if (subPrimType == PTY_f32) { + incDecExpr = FEIRBuilder::CreateExprConstI32(1); + } else if(subPrimType == PTY_ptr) { + incDecExpr = std::make_unique(static_cast(childExpr)->GetPointeeLen(), + PTY_ptr); + } else { + incDecExpr = std::make_unique((subType->GetKind() == kTypeScalar) ? + 1 : static_cast(subType->GetSize()), subType->GetPrimType()); + } + // a = a + 1, selfVar attr need update + UniqueFEIRExpr astUOPreIncExpr = FEIRBuilder::CreateExprMathBinary(OP_add, std::move(childFEIRExpr), + std::move(incDecExpr)); + UniqueFEIRVar selfVar = FEIRBuilder::CreateVarName(refName, subPrimType, true, false); + UniqueFEIRVar selfMoveVar = selfVar->Clone(); + UniqueFEIRStmt stmt = FEIRBuilder::CreateStmtDAssign(std::move(selfMoveVar), std::move(astUOPreIncExpr)); + stmts.emplace_back(std::move(stmt)); + + // return a + UniqueFEIRExpr feirRefExpr = FEIRBuilder::CreateExprDRead(std::move(selfVar)); + return feirRefExpr; } -UniqueFEIRExpr ASTUODerefExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTUOPreDecExpr::Emit2FEExprImpl(std::list &stmts) const { + ASTExpr *childExpr = expr; + CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); + UniqueFEIRExpr childFEIRExpr = childExpr->Emit2FEExpr(stmts); + UniqueFEIRExpr incDecExpr; + PrimType subPrimType = subType->GetPrimType(); + if (subPrimType == PTY_f32) { + incDecExpr = FEIRBuilder::CreateExprConstI32(1); + } else if(subPrimType == PTY_ptr) { + incDecExpr = std::make_unique(static_cast(childExpr)->GetPointeeLen(), + PTY_ptr); + } else { + incDecExpr = std::make_unique((subType->GetKind() == kTypeScalar) ? + 1 : static_cast(subType->GetSize()), + subType->GetPrimType()); + } + // a = a - 1, selfVar attr need update + UniqueFEIRExpr astUOPreIncExpr = FEIRBuilder::CreateExprMathBinary(OP_sub, std::move(childFEIRExpr), + std::move(incDecExpr)); + UniqueFEIRVar selfVar = FEIRBuilder::CreateVarName(refName, subPrimType, true, false); + UniqueFEIRVar selfMoveVar = selfVar->Clone(); + UniqueFEIRStmt stmt = FEIRBuilder::CreateStmtDAssign(std::move(selfMoveVar), std::move(astUOPreIncExpr)); + stmts.emplace_back(std::move(stmt)); + + // return a + UniqueFEIRExpr feirRefExpr = FEIRBuilder::CreateExprDRead(std::move(selfVar)); + return feirRefExpr; } -UniqueFEIRExpr ASTUOPlusExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTUOAddrOfExpr::Emit2FEExprImpl(std::list &stmts) const { + ASTExpr *childExpr = expr; + CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); + UniqueFEIRExpr addrOfExpr; + if (childExpr->GetASTOp() == kASTOpRef) { + ASTDecl *var = static_cast(childExpr)->GetASTDecl(); + PrimType primType = var->GetTypeDesc().front()->GetPrimType(); + // var attr should update + UniqueFEIRVar addrOfVar = FEIRBuilder::CreateVarName(var->GetName(), primType, true, false); + addrOfExpr = FEIRBuilder::CreateExprAddrofVar(std::move(addrOfVar)); + } else { // other potential expr should concern + UniqueFEIRExpr childFEIRExpr; + childFEIRExpr = childExpr->Emit2FEExpr(stmts); + addrOfExpr = FEIRBuilder::CreateExprMathUnary(OP_addrof, std::move(childFEIRExpr)); + } + return addrOfExpr; +} + +UniqueFEIRExpr ASTUODerefExpr::Emit2FEExprImpl(std::list &stmts) const { + ASTExpr *childExpr = expr; + CHECK_FATAL(childExpr != nullptr, "childExpr is nullptr"); + UniqueFEIRExpr childFEIRExpr = childExpr->Emit2FEExpr(stmts); + UniqueFEIRType retType = FEIRBuilder::CreateType(uoType->GetPrimType(), uoType->GetNameStrIdx(), 0); + UniqueFEIRType ptrBaseType = FEIRBuilder::CreateType(subType->GetPrimType(), subType->GetNameStrIdx(), 0); + UniqueFEIRType ptrType = FEIRTypeHelper::CreatePointerType(std::move(ptrBaseType)); + UniqueFEIRExpr derefExpr = FEIRBuilder::CreateExprIRead(std::move(retType), std::move(ptrType), 0, + std::move(childFEIRExpr)); + return derefExpr; } -UniqueFEIRExpr ASTUORealExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTUORealExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } -UniqueFEIRExpr ASTUOImagExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTUOImagExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } -UniqueFEIRExpr ASTUOExtensionExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTUOExtensionExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } -UniqueFEIRExpr ASTUOCoawaitExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTUOCoawaitExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTPredefinedExpr ---------- -UniqueFEIRExpr ASTPredefinedExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTPredefinedExpr::Emit2FEExprImpl(std::list &stmts) const { + return child->Emit2FEExpr(stmts); } void ASTPredefinedExpr::SetASTExpr(ASTExpr *astExpr) { @@ -134,9 +281,8 @@ void ASTPredefinedExpr::SetASTExpr(ASTExpr *astExpr) { } // ---------- ASTOpaqueValueExpr ---------- -UniqueFEIRExpr ASTOpaqueValueExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTOpaqueValueExpr::Emit2FEExprImpl(std::list &stmts) const { + return child->Emit2FEExpr(stmts); } void ASTOpaqueValueExpr::SetASTExpr(ASTExpr *astExpr) { @@ -144,9 +290,13 @@ void ASTOpaqueValueExpr::SetASTExpr(ASTExpr *astExpr) { } // ---------- ASTBinaryConditionalOperator ---------- -UniqueFEIRExpr ASTBinaryConditionalOperator::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTBinaryConditionalOperator::Emit2FEExprImpl(std::list &stmts) const { + UniqueFEIRExpr cFEIRExpr = cExpr->Emit2FEExpr(stmts); + UniqueFEIRExpr cFEIRExpr0 = cFEIRExpr->Clone(); + UniqueFEIRExpr cFEIRExpr1 = cFEIRExpr->Clone(); + UniqueFEIRExpr fFEIRExpr = fExpr->Emit2FEExpr(stmts); + return FEIRBuilder::CreateExprTernary(OP_select, std::move(cFEIRExpr0), + std::move(cFEIRExpr1), std::move(fFEIRExpr)); } void ASTBinaryConditionalOperator::SetRetType(MIRType *returnType) { @@ -160,7 +310,7 @@ void ASTBinaryConditionalOperator::SetFalseExpr(ASTExpr *falseExpr) { } // ---------- ASTNoInitExpr ---------- -UniqueFEIRExpr ASTNoInitExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTNoInitExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } @@ -170,7 +320,7 @@ void ASTNoInitExpr::SetNoInitType(MIRType *type) { } // ---------- ASTCompoundLiteralExpr ---------- -UniqueFEIRExpr ASTCompoundLiteralExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTCompoundLiteralExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } @@ -192,13 +342,13 @@ void ASTOffsetOfExpr::SetFieldName(std::string fName){ fieldName = fName; } -UniqueFEIRExpr ASTOffsetOfExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTOffsetOfExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTInitListExpr ---------- -UniqueFEIRExpr ASTInitListExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTInitListExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } @@ -218,250 +368,255 @@ std::list ASTBinaryOperatorStmt::Emit2FEStmtImpl() const { return stmts; } -UniqueFEIRExpr ASTImplicitValueInitExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTImplicitValueInitExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } -UniqueFEIRExpr ASTStringLiteral::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTStringLiteral::Emit2FEExprImpl(std::list &stmts) const { UniqueFEIRExpr expr = std::make_unique(codeUnits); CHECK_NULL_FATAL(expr); return expr; } -UniqueFEIRExpr ASTArraySubscriptExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTArraySubscriptExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } -UniqueFEIRExpr ASTExprUnaryExprOrTypeTraitExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTExprUnaryExprOrTypeTraitExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } -UniqueFEIRExpr ASTMemberExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTMemberExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } -UniqueFEIRExpr ASTDesignatedInitUpdateExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTDesignatedInitUpdateExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } -UniqueFEIRExpr ASTBOAddExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOAddExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOMulExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOMulExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBODivExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBODivExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBORemExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBORemExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOSubExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOSubExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOShlExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOShlExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOShrExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOShrExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOLTExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOLTExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOGTExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOGTExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOLEExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOLEExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOGEExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOGEExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOEQExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOEQExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBONEExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBONEExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOAndExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOAndExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOXorExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOXorExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOOrExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOOrExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOLAndExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOLAndExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOLOrExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOLOrExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOEqExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOEqExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOAssign::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOAssign::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOComma::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOComma::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOPtrMemD::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOPtrMemD::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } -UniqueFEIRExpr ASTBOPtrMemI::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTBOPtrMemI::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } // ---------- ASTParenExpr ---------- -UniqueFEIRExpr ASTParenExpr::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTParenExpr::Emit2FEExprImpl(std::list &stmts) const { + return child->Emit2FEExpr(stmts); } // ---------- ASTIntegerLiteral ---------- -UniqueFEIRExpr ASTIntegerLiteral::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTIntegerLiteral::Emit2FEExprImpl(std::list &stmts) const { UniqueFEIRExpr constExpr = std::make_unique(val, type); return constExpr; } // ---------- ASTFloatingLiteral ---------- -UniqueFEIRExpr ASTFloatingLiteral::Emit2FEExprImpl() const { - CHECK_FATAL(false, "NIY"); - return nullptr; +UniqueFEIRExpr ASTFloatingLiteral::Emit2FEExprImpl(std::list &stmts) const { + UniqueFEIRExpr expr; + if (isFloat) { + expr = FEIRBuilder::CreateExprConstF32(static_cast(val)); + } else { + expr = FEIRBuilder::CreateExprConstF64(val); + } + CHECK_NULL_FATAL(expr); + return expr; } // ---------- ASTCharacterLiteral ---------- -UniqueFEIRExpr ASTCharacterLiteral::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTCharacterLiteral::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTConditionalOperator ---------- -UniqueFEIRExpr ASTConditionalOperator::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTConditionalOperator::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTConstantExpr ---------- -UniqueFEIRExpr ASTConstantExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTConstantExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTImaginaryLiteral ---------- -UniqueFEIRExpr ASTImaginaryLiteral::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTImaginaryLiteral::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTCompoundAssignOperatorExpr ---------- -UniqueFEIRExpr ASTCompoundAssignOperatorExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTCompoundAssignOperatorExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTVAArgExpr ---------- -UniqueFEIRExpr ASTVAArgExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTVAArgExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTCStyleCastExpr ---------- -UniqueFEIRExpr ASTCStyleCastExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTCStyleCastExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NYI"); return nullptr; } // ---------- ASTArrayInitLoopExpr ---------- -UniqueFEIRExpr ASTArrayInitLoopExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTArrayInitLoopExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTArrayInitIndexExpr ---------- -UniqueFEIRExpr ASTArrayInitIndexExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTArrayInitIndexExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTExprWithCleanups ---------- -UniqueFEIRExpr ASTExprWithCleanups::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTExprWithCleanups::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTMaterializeTemporaryExpr ---------- -UniqueFEIRExpr ASTMaterializeTemporaryExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTMaterializeTemporaryExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTSubstNonTypeTemplateParmExpr ---------- -UniqueFEIRExpr ASTSubstNonTypeTemplateParmExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTSubstNonTypeTemplateParmExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTDependentScopeDeclRefExpr ---------- -UniqueFEIRExpr ASTDependentScopeDeclRefExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTDependentScopeDeclRefExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } // ---------- ASTAtomicExpr ---------- -UniqueFEIRExpr ASTAtomicExpr::Emit2FEExprImpl() const { +UniqueFEIRExpr ASTAtomicExpr::Emit2FEExprImpl(std::list &stmts) const { CHECK_FATAL(false, "NIY"); return nullptr; } diff --git a/src/mplfe/ast_input/src/ast_parser.cpp b/src/mplfe/ast_input/src/ast_parser.cpp index 2d913aadd4..950af04c3b 100644 --- a/src/mplfe/ast_input/src/ast_parser.cpp +++ b/src/mplfe/ast_input/src/ast_parser.cpp @@ -595,6 +595,32 @@ ASTExpr *ASTParser::ProcessExprUnaryOperator(MapleAllocator &allocator, const cl ASTUnaryOperatorExpr *astUOExpr = AllocUnaryOperatorExpr(allocator, uo); CHECK_FATAL(astUOExpr != nullptr, "astUOExpr is nullptr"); const clang::Expr *subExpr = PeelParen(*uo.getSubExpr()); + clang::UnaryOperator::Opcode clangOpCode = uo.getOpcode(); + MIRType *subType = astFile->CvtType(subExpr->getType()); + astUOExpr->SetSubType(subType); + if (clangOpCode == clang::UO_PostInc || clangOpCode == clang::UO_PostDec || + clangOpCode == clang::UO_PreInc || clangOpCode == clang::UO_PreDec) { + const auto *declRefExpr = llvm::dyn_cast(subExpr); + const auto *namedDecl = llvm::dyn_cast(declRefExpr->getDecl()->getCanonicalDecl()); + std::string refName = astFile->GetMangledName(*namedDecl); + astUOExpr->SetRefName(refName); + if (subType->GetPrimType() == PTY_ptr) { + int64 len; + const clang::QualType qualType = subExpr->getType()->getPointeeType(); + if (astFile->CvtType(qualType)->GetPrimType() == PTY_ptr) { + // GetAddr32 or GetAddr64 need check + MIRType *pointeeType = GlobalTables::GetTypeTable().GetAddr64(); + len = static_cast(pointeeType->GetSize()); + } else { + const clang::QualType desugaredType = qualType.getDesugaredType(*(astFile->GetContext())); + len = astFile->GetContext()->getTypeSizeInChars(desugaredType).getQuantity(); + } + astUOExpr->SetPointeeLen(len); + } + } + + MIRType *uoType = astFile->CvtType(uo.getType()); + astUOExpr->SetUOType(uoType); ASTExpr *astExpr = ProcessExpr(allocator, subExpr); if (astExpr == nullptr) { return nullptr; @@ -605,7 +631,7 @@ ASTExpr *ASTParser::ProcessExprUnaryOperator(MapleAllocator &allocator, const cl ASTExpr *ASTParser::ProcessExprNoInitExpr(MapleAllocator &allocator, const clang::NoInitExpr &expr) { ASTNoInitExpr *astNoInitExpr = ASTExprBuilder(allocator); - CHECK_FATAL(astNoInitExpr != nullptr, "astPredefinedExpr is nullptr"); + CHECK_FATAL(astNoInitExpr != nullptr, "astNoInitExpr is nullptr"); clang::QualType qualType = expr.getType(); MIRType *noInitType = astFile->CvtType(qualType); astNoInitExpr->SetNoInitType(noInitType); @@ -987,8 +1013,14 @@ ASTExpr *ASTParser::ProcessExprFloatingLiteral(MapleAllocator &allocator, const if ((&fltSem != &llvm::APFloat::IEEEsingle()) && (&fltSem != &llvm::APFloat::IEEEdouble())) { ASSERT(false, "unsupported floating literal"); } - double val = ((&fltSem == &llvm::APFloat::IEEEdouble()) ? static_cast(apf.convertToDouble()) - : static_cast(apf.convertToFloat())); + double val; + if (&fltSem == &llvm::APFloat::IEEEdouble()) { + val = static_cast(apf.convertToDouble()); + astFloatingLiteral->SetFlag(false); + } else { + val = static_cast(apf.convertToFloat()); + astFloatingLiteral->SetFlag(true); + } astFloatingLiteral->SetVal(val); return astFloatingLiteral; } @@ -1017,7 +1049,7 @@ ASTExpr *ASTParser::ProcessExprImplicitCastExpr(MapleAllocator &allocator, const } ASTExpr *ASTParser::ProcessExprDeclRefExpr(MapleAllocator &allocator, const clang::DeclRefExpr &expr) { - ASTRefExpr *astRefExpr = ASTExprBuilder(allocator); + ASTDeclRefExpr *astRefExpr = ASTExprBuilder(allocator); CHECK_FATAL(astRefExpr != nullptr, "astRefExpr is nullptr"); switch (expr.getStmtClass()) { case clang::Stmt::DeclRefExprClass: { diff --git a/src/mplfe/ast_input/src/ast_stmt.cpp b/src/mplfe/ast_input/src/ast_stmt.cpp index 7e76e8a0cb..d1d3395167 100644 --- a/src/mplfe/ast_input/src/ast_stmt.cpp +++ b/src/mplfe/ast_input/src/ast_stmt.cpp @@ -44,13 +44,13 @@ std::list ASTCompoundStmt::Emit2FEStmtImpl() const { std::list ASTReturnStmt::Emit2FEStmtImpl() const { std::list stmts; auto astExpr = exprs.front(); - UniqueFEIRExpr feExpr = astExpr->Emit2FEExpr(); + UniqueFEIRExpr feExpr = astExpr->Emit2FEExpr(stmts); UniqueFEIRStmt stmt = std::make_unique(std::move(feExpr)); stmts.emplace_back(std::move(stmt)); return stmts; } -void ASTRefExpr::SetASTDecl(ASTDecl *astDecl) { +void ASTDeclRefExpr::SetASTDecl(ASTDecl *astDecl) { var = astDecl; } @@ -92,8 +92,9 @@ std::list ASTContinueStmt::Emit2FEStmtImpl() const { // ---------- ASTUnaryOperatorStmt ---------- std::list ASTUnaryOperatorStmt::Emit2FEStmtImpl() const { - CHECK_FATAL(false, "NYI"); std::list stmts; + auto astExpr = exprs.front(); + astExpr->Emit2FEExpr(stmts); return stmts; } @@ -152,8 +153,8 @@ std::list ASTCallExprStmt::Emit2FEStmtImpl() const { *info, OP_callassigned, nullptr, false); // args std::vector argsExprs = callExpr->GetArgsExpr(); - for (uint32 i = 0; i < argsExprs.size(); ++i) { - UniqueFEIRExpr expr = argsExprs[i]->Emit2FEExpr(); + for (int32 i = argsExprs.size() - 1; i >= 0; --i) { + UniqueFEIRExpr expr = argsExprs[i]->Emit2FEExpr(stmts); callStmt->AddExprArgReverse(std::move(expr)); } // return diff --git a/src/mplfe/bc_input/src/bc_instruction.cpp b/src/mplfe/bc_input/src/bc_instruction.cpp index e11f40d33d..a6d1132eaa 100644 --- a/src/mplfe/bc_input/src/bc_instruction.cpp +++ b/src/mplfe/bc_input/src/bc_instruction.cpp @@ -361,7 +361,7 @@ void BCRegType::PrecisifyTypes(bool isTry) { if (!isTry) { precisified = true; } - if (typesUsedAs == nullptr || typesUsedAs->empty()) { + if (curReg.IsConstZero() || typesUsedAs == nullptr || typesUsedAs->empty()) { return; } // insert defed type into `used` diff --git a/src/mplfe/common/include/feir_builder.h b/src/mplfe/common/include/feir_builder.h index 1f814130fd..6cdc86c786 100644 --- a/src/mplfe/common/include/feir_builder.h +++ b/src/mplfe/common/include/feir_builder.h @@ -40,6 +40,11 @@ class FEIRBuilder { // Expr static UniqueFEIRExpr CreateExprDRead(UniqueFEIRVar srcVar); static UniqueFEIRExpr CreateExprAddrof(const std::vector &array); + static UniqueFEIRExpr CreateExprAddrofVar(UniqueFEIRVar srcVar); + static UniqueFEIRExpr CreateExprIRead(UniqueFEIRType returnType, UniqueFEIRType ptrType, + FieldID id, UniqueFEIRExpr expr); + static UniqueFEIRExpr CreateExprTernary(Opcode op, UniqueFEIRExpr cExpr, + UniqueFEIRExpr tExpr, UniqueFEIRExpr fExpr); static UniqueFEIRExpr CreateExprConstRefNull(); static UniqueFEIRExpr CreateExprConstI8(int8 val); static UniqueFEIRExpr CreateExprConstI16(int16 val); @@ -91,4 +96,4 @@ class FEIRBuilder { static UniqueFEIRStmt CreateStmtComment(const std::string &comment); }; // class FEIRBuilder } // namespace maple -#endif // MPLFE_INCLUDE_COMMON_FEIR_BUILDER_H \ No newline at end of file +#endif // MPLFE_INCLUDE_COMMON_FEIR_BUILDER_H diff --git a/src/mplfe/common/include/feir_node_kind.def b/src/mplfe/common/include/feir_node_kind.def index 667d4f3502..8e8108c765 100644 --- a/src/mplfe/common/include/feir_node_kind.def +++ b/src/mplfe/common/include/feir_node_kind.def @@ -27,6 +27,7 @@ FEIR_NODE_KIND(ExprNestable, "ExprNestable") FEIR_NODE_KIND(ExprNonNestable, "ExprNonNestable") FEIR_NODE_KIND(ExprConst, "ExprConst") FEIR_NODE_KIND(ExprDRead, "ExprDRead") +FEIR_NODE_KIND(ExprIRead, "ExprIRead") FEIR_NODE_KIND(ExprRegRead, "ExprRegRead") FEIR_NODE_KIND(ExprConvert, "ExprConvert") FEIR_NODE_KIND(ExprIntExt, "ExprIntExt") @@ -38,6 +39,7 @@ FEIR_NODE_KIND(ExprTernary, "ExprTernary") FEIR_NODE_KIND(ExprNary, "ExprNary") FEIR_NODE_KIND(ExprArray, "ExprArray") FEIR_NODE_KIND(ExprAddrof, "ExprAddrof") +FEIR_NODE_KIND(ExprAddrofVar, "ExprAddrofVar") FEIR_NODE_KIND(ExprIntrinsicop, "ExprIntrinsicop") FEIR_NODE_KIND(FEIRExprJavaMerge, "FEIRExprJavaMerge") FEIR_NODE_KIND(ExprTypeCvt, "ExprTypeCvt") @@ -56,4 +58,4 @@ FEIR_NODE_KIND(StmtPesudoJavaTry, "StmtPesudoJavaTry") FEIR_NODE_KIND(StmtPesudoEndTry, "StmtPesudoEndTry") FEIR_NODE_KIND(StmtPesudoJavaCatch, "StmtPesudoJavaCatch") FEIR_NODE_KIND(StmtPesudoComment, "StmtPesudoComment") -FEIR_NODE_KIND(StmtPesudoCommentForInst, "StmtPesudoCommentForInst") \ No newline at end of file +FEIR_NODE_KIND(StmtPesudoCommentForInst, "StmtPesudoCommentForInst") diff --git a/src/mplfe/common/include/feir_stmt.h b/src/mplfe/common/include/feir_stmt.h index bda4319400..f2f6803d00 100644 --- a/src/mplfe/common/include/feir_stmt.h +++ b/src/mplfe/common/include/feir_stmt.h @@ -438,6 +438,21 @@ class FEIRExprAddrof : public FEIRExpr { std::vector array; }; +// ---------- FEIRExprAddrofVar ---------- +class FEIRExprAddrofVar : public FEIRExpr { + public: + explicit FEIRExprAddrofVar(std::unique_ptr argVarSrc) + : FEIRExpr(FEIRNodeKind::kExprAddrofVar), varSrc(std::move(argVarSrc)) {} + ~FEIRExprAddrofVar() = default; + + protected: + std::unique_ptr CloneImpl() const override; + BaseNode *GenMIRNodeImpl(MIRBuilder &mirBuilder) const override; + + private: + std::unique_ptr varSrc; +}; + // ---------- FEIRExprUnary ---------- class FEIRExprUnary : public FEIRExpr { public: @@ -533,19 +548,22 @@ class FEIRExprExtractBits : public FEIRExprUnary { }; // FEIRExprExtractBit // ---------- FEIRExprIRead ---------- -class FEIRExprIRead : public FEIRExprUnary { +class FEIRExprIRead : public FEIRExpr { public: - FEIRExprIRead(Opcode op, std::unique_ptr argOpnd); + FEIRExprIRead(UniqueFEIRType returnType, UniqueFEIRType pointeeType, FieldID id, UniqueFEIRExpr expr) + : FEIRExpr(FEIRNodeKind::kExprIRead), retType(std::move(returnType)), ptrType(std::move(pointeeType)), + fieldID(id), subExpr(std::move(expr)) {} ~FEIRExprIRead() = default; protected: std::unique_ptr CloneImpl() const override; - void RegisterDFGNodes2CheckPointImpl(FEIRStmtCheckPoint &checkPoint) override; - bool CalculateDefs4AllUsesImpl(FEIRStmtCheckPoint &checkPoint, FEIRUseDefChain &udChain) override; BaseNode *GenMIRNodeImpl(MIRBuilder &mirBuilder) const override; private: - uint32 offset = 0; + UniqueFEIRType retType; + UniqueFEIRType ptrType; + FieldID fieldID; + UniqueFEIRExpr subExpr; }; // ---------- FEIRExprBinary ---------- diff --git a/src/mplfe/common/src/feir_builder.cpp b/src/mplfe/common/src/feir_builder.cpp index f3f9ff163c..d3f0e32daf 100644 --- a/src/mplfe/common/src/feir_builder.cpp +++ b/src/mplfe/common/src/feir_builder.cpp @@ -91,12 +91,30 @@ UniqueFEIRExpr FEIRBuilder::CreateExprDRead(UniqueFEIRVar srcVar) { return expr; } +UniqueFEIRExpr FEIRBuilder::CreateExprIRead(UniqueFEIRType returnType, UniqueFEIRType ptrType, + FieldID id, UniqueFEIRExpr expr) { + UniqueFEIRExpr feirExpr = std::make_unique(std::move(returnType), std::move(ptrType), + id, std::move(expr)); + return feirExpr; +} + UniqueFEIRExpr FEIRBuilder::CreateExprAddrof(const std::vector &array) { UniqueFEIRExpr expr = std::make_unique(array); CHECK_NULL_FATAL(expr); return expr; } +UniqueFEIRExpr FEIRBuilder::CreateExprAddrofVar(UniqueFEIRVar srcVar) { + UniqueFEIRExpr expr = std::make_unique(std::move(srcVar)); + return expr; +} + +UniqueFEIRExpr FEIRBuilder::CreateExprTernary(Opcode op, UniqueFEIRExpr cExpr, + UniqueFEIRExpr tExpr, UniqueFEIRExpr fExpr) { + UniqueFEIRExpr expr = std::make_unique(op, std::move(cExpr), std::move(tExpr), std::move(fExpr)); + return expr; +} + UniqueFEIRExpr FEIRBuilder::CreateExprConstRefNull() { return std::make_unique(int64{ 0 }, PTY_ref); } diff --git a/src/mplfe/common/src/feir_stmt.cpp b/src/mplfe/common/src/feir_stmt.cpp index d03f633619..a1f255b3cf 100644 --- a/src/mplfe/common/src/feir_stmt.cpp +++ b/src/mplfe/common/src/feir_stmt.cpp @@ -1772,6 +1772,20 @@ std::vector FEIRExprDRead::GetVarUsesImpl() const { return std::vector({ varSrc.get() }); } +// ---------- FEIRExprIRead ---------- +std::unique_ptr FEIRExprIRead::CloneImpl() const { + std::unique_ptr expr = std::make_unique(retType->Clone(), ptrType->Clone(), + fieldID, subExpr->Clone()); + return expr; +} + +BaseNode *FEIRExprIRead::GenMIRNodeImpl(MIRBuilder &mirBuilder) const { + MIRType *returnType = retType->GenerateMIRTypeAuto(kSrcLangC); + MIRType *pointeeType = ptrType->GenerateMIRTypeAuto(kSrcLangC); + BaseNode *subNode = subExpr->GenMIRNode(mirBuilder); + return mirBuilder.CreateExprIread(*returnType, *pointeeType, fieldID, subNode); +} + // ---------- FEIRExprAddrof ---------- std::unique_ptr FEIRExprAddrof::CloneImpl() const { std::unique_ptr expr = std::make_unique(array); @@ -1796,6 +1810,17 @@ BaseNode *FEIRExprAddrof::GenMIRNodeImpl(MIRBuilder &mirBuilder) const { return nodeAddrof; } +// ---------- FEIRExprAddrofVar ---------- +std::unique_ptr FEIRExprAddrofVar::CloneImpl() const { + std::unique_ptr expr = std::make_unique(varSrc->Clone()); + return expr; +} + +BaseNode *FEIRExprAddrofVar::GenMIRNodeImpl(MIRBuilder &mirBuilder) const { + MIRSymbol *varSymbol = varSrc->GenerateGlobalMIRSymbol(mirBuilder); + return mirBuilder.CreateExprAddrof(0, *varSymbol); +} + // ---------- FEIRExprRegRead ---------- FEIRExprRegRead::FEIRExprRegRead(PrimType pty, int32 regNumIn) : FEIRExpr(FEIRNodeKind::kExprRegRead), prmType(pty), regNum(regNumIn) {} @@ -1884,6 +1909,7 @@ void FEIRExprUnary::SetExprTypeByOp() { switch (op) { case OP_neg: case OP_bnot: + case OP_lnot: type->SetPrimType(opnd->GetPrimType()); break; default: diff --git a/src/mplfe/common/src/feir_type.cpp b/src/mplfe/common/src/feir_type.cpp index c26f422902..e481fca7f8 100644 --- a/src/mplfe/common/src/feir_type.cpp +++ b/src/mplfe/common/src/feir_type.cpp @@ -275,6 +275,8 @@ MIRType *FEIRTypeDefault::GenerateMIRTypeForPrim() const { return GlobalTables::GetTypeTable().GetAddr32(); case PTY_ref: return GlobalTables::GetTypeTable().GetRef(); + case PTY_ptr: + return GlobalTables::GetTypeTable().GetPtr(); default: CHECK_FATAL(false, "unsupported prim type"); } diff --git a/src/mplfe/dex_input/src/dex_op.cpp b/src/mplfe/dex_input/src/dex_op.cpp index e6cff02fe4..93cbe9f76d 100644 --- a/src/mplfe/dex_input/src/dex_op.cpp +++ b/src/mplfe/dex_input/src/dex_op.cpp @@ -882,12 +882,14 @@ std::list DexOpIfTest::EmitToFEIRStmtsImpl() { // opnd of if-test should be same PTY type. // Or one opnd must be nullptr, such as const 0. if (vA.GetPrimType() == PTY_ref && vB.GetPrimType() != PTY_ref) { - CHECK_FATAL(vB.regValue->primValue.raw32 == 0, "Cannot compare a ref var with an integer."); + CHECK_FATAL(vB.regValue != nullptr && vB.regValue->primValue.raw32 == 0, + "Cannot compare a ref var with an integer."); vBTmp.regTypeItem = vATmp.regTypeItem; UniqueFEIRStmt retypeStmt = FEIRBuilder::CreateStmtRetype(vBTmp.GenFEIRVarReg(), vB.GenFEIRVarReg()); stmts.emplace_back(std::move(retypeStmt)); } else if (vA.GetPrimType() != PTY_ref && vB.GetPrimType() == PTY_ref) { - CHECK_FATAL(vA.regValue->primValue.raw32 == 0, "Cannot compare a ref var with an integer."); + CHECK_FATAL(vA.regValue != nullptr && vA.regValue->primValue.raw32 == 0, + "Cannot compare a ref var with an integer."); vATmp.regTypeItem = vBTmp.regTypeItem; UniqueFEIRStmt retypeStmt = FEIRBuilder::CreateStmtRetype(vATmp.GenFEIRVarReg(), vA.GenFEIRVarReg()); stmts.emplace_back(std::move(retypeStmt)); -- Gitee