From 5c0749ceb0b072b41c6b8f920112503acb7a02f3 Mon Sep 17 00:00:00 2001 From: binaryfz Date: Thu, 13 May 2021 19:41:57 +0800 Subject: [PATCH] [mplfec]:fix struct/union unamed field bugs --- src/mplfe/ast_input/src/ast_parser.cpp | 10 ++++++---- src/mplfe/ast_input/src/ast_struct2fe_helper.cpp | 3 +++ src/mplfe/common/include/feir_stmt.h | 5 +++++ src/mplfe/common/src/feir_stmt.cpp | 15 ++++++++++++--- 4 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/mplfe/ast_input/src/ast_parser.cpp b/src/mplfe/ast_input/src/ast_parser.cpp index 6b9a0dcfe4..d782eb4531 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 dc22e8d751..318cd9efd1 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 7636abc159..6e25f9a236 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 e1f53f66dc..e04fbe9473 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; -- Gitee