diff --git a/src/mplfe/ast_input/src/ast_parser.cpp b/src/mplfe/ast_input/src/ast_parser.cpp index 6b9a0dcfe4d7ef8ba6fb1ed4f0e867efd769d71a..d782eb4531ce474ef641b4c18bf120b5046e5bae 100644 --- a/src/mplfe/ast_input/src/ast_parser.cpp +++ b/src/mplfe/ast_input/src/ast_parser.cpp @@ -1197,12 +1197,12 @@ ASTExpr *ASTParser::ProcessExprImplicitCastExpr(MapleAllocator &allocator, const case clang::CK_FunctionToPointerDecay: case clang::CK_LValueToRValue: case clang::CK_BitCast: - case clang::CK_NullToPointer: - case clang::CK_IntegralToPointer: break; case clang::CK_BuiltinFnToFnPtr: astImplicitCastExpr->SetBuilinFunc(true); break; + case clang::CK_NullToPointer: + case clang::CK_IntegralToPointer: case clang::CK_FloatingToIntegral: case clang::CK_IntegralToFloating: case clang::CK_FloatingCast: @@ -1282,7 +1282,7 @@ ASTExpr *ASTParser::ProcessExprBinaryOperator(MapleAllocator &allocator, const c astBinOpExpr->SetRetType(astFile->CvtType(qualType)); ASTExpr *astRExpr = ProcessExpr(allocator, bo.getRHS()); ASTExpr *astLExpr = ProcessExpr(allocator, bo.getLHS()); - if (bo.getType()->isPointerType()) { + if (bo.getType()->isPointerType() && bo.isAdditiveOp()) { auto ptrSizeExpr = ASTDeclsBuilder::ASTExprBuilder(allocator); ptrSizeExpr->SetType(PTY_ptr); ptrSizeExpr->SetVal(GetSizeFromQualType(bo.getType()->getPointeeType())); @@ -1632,8 +1632,10 @@ ASTDecl *ASTParser::ProcessDeclFieldDecl(MapleAllocator &allocator, const clang: clang::QualType qualType = decl.getType(); std::string fieldName = astFile->GetMangledName(decl); if (fieldName.empty()) { - return nullptr; + uint32 id = decl.getLocation().getRawEncoding(); + fieldName = astFile->GetOrCreateMappedUnnamedName(id); } + CHECK_FATAL(!fieldName.empty(), "fieldName is empty"); MIRType *fieldType = astFile->CvtType(qualType); if (fieldType == nullptr) { return nullptr; diff --git a/src/mplfe/ast_input/src/ast_struct2fe_helper.cpp b/src/mplfe/ast_input/src/ast_struct2fe_helper.cpp index dc22e8d7519ca56bfe0784777d4e9aa575adf55e..318cd9efd1c7e93f3cc03f5206fc7bd1944b2361 100644 --- a/src/mplfe/ast_input/src/ast_struct2fe_helper.cpp +++ b/src/mplfe/ast_input/src/ast_struct2fe_helper.cpp @@ -155,6 +155,9 @@ bool ASTGlobalVar2FEHelper::ProcessDeclImpl(MapleAllocator &allocator) { FEIRExprConst *constExpr = static_cast(expr.get()); switch (primType) { case PTY_i8: + case PTY_u8: + case PTY_i16: + case PTY_u16: case PTY_i32: case PTY_u32: case PTY_i64: diff --git a/src/mplfe/common/include/feir_stmt.h b/src/mplfe/common/include/feir_stmt.h index 7636abc159838085b53acf80cde5b6f899e24597..6e25f9a2361e6fc166ab60faa24d606f393b10ad 100644 --- a/src/mplfe/common/include/feir_stmt.h +++ b/src/mplfe/common/include/feir_stmt.h @@ -494,6 +494,10 @@ class FEIRExprAddrofVar : public FEIRExpr { fieldType = type; } + void SetFieldID(FieldID id) { + fieldID = id; + } + protected: std::unique_ptr CloneImpl() const override; BaseNode *GenMIRNodeImpl(MIRBuilder &mirBuilder) const override; @@ -992,6 +996,7 @@ class FEIRExprCStyleCast : public FEIRExpr { protected: std::unique_ptr CloneImpl() const override; BaseNode *GenMIRNodeImpl(MIRBuilder &mirBuilder) const override; + PrimType GetPrimTypeImpl() const override; private: MIRType *srcType = nullptr; diff --git a/src/mplfe/common/src/feir_stmt.cpp b/src/mplfe/common/src/feir_stmt.cpp index e1f53f66dc3ec83214e1fa0602f70b403381b873..e04fbe9473f3ad16700e01ab37a62c81ae7d2d34 100644 --- a/src/mplfe/common/src/feir_stmt.cpp +++ b/src/mplfe/common/src/feir_stmt.cpp @@ -2145,8 +2145,9 @@ PrimType FEIRExprDRead::GetPrimTypeImpl() const { // ---------- FEIRExprIRead ---------- std::unique_ptr FEIRExprIRead::CloneImpl() const { - std::unique_ptr expr = std::make_unique(retType->Clone(), ptrType->Clone(), - fieldID, subExpr->Clone()); + std::unique_ptr expr = std::make_unique(retType->Clone(), ptrType->Clone(), + fieldID, subExpr->Clone()); + expr->SetFieldName(fieldName); return expr; } @@ -2204,7 +2205,10 @@ BaseNode *FEIRExprAddrof::GenMIRNodeImpl(MIRBuilder &mirBuilder) const { // ---------- FEIRExprAddrofVar ---------- std::unique_ptr FEIRExprAddrofVar::CloneImpl() const { - std::unique_ptr expr = std::make_unique(varSrc->Clone()); + std::unique_ptr expr = std::make_unique(varSrc->Clone()); + expr->SetFieldID(fieldID); + expr->SetFieldName(fieldName); + expr->SetFieldType(fieldType); return expr; } @@ -3275,6 +3279,11 @@ std::unique_ptr FEIRExprCStyleCast::CloneImpl() const { return expr; } +PrimType FEIRExprCStyleCast::GetPrimTypeImpl() const { + CHECK_NULL_FATAL(destType); + return destType->GetPrimType(); +} + BaseNode *FEIRExprCStyleCast::GenMIRNodeImpl(MIRBuilder &mirBuilder) const { BaseNode *sub = subExpr.get()->GenMIRNode(mirBuilder); BaseNode *cvt = nullptr;