From 0ee8d98c74b013eac7cb80c4d3caa683334107f8 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Mon, 7 Feb 2022 13:36:58 -0500 Subject: [PATCH 1/6] add struct/class/interface types at earlier stage --- src/MapleFE/astopt/src/ast_info.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/MapleFE/astopt/src/ast_info.cpp b/src/MapleFE/astopt/src/ast_info.cpp index 484be4784d..81c9dfd12a 100644 --- a/src/MapleFE/astopt/src/ast_info.cpp +++ b/src/MapleFE/astopt/src/ast_info.cpp @@ -488,6 +488,7 @@ TreeNode *AST_INFO::GetAnonymousStruct(TreeNode *node) { } ModuleNode *module = mHandler->GetASTModule(); + gTypeTable.AddType(newnode); module->GetScope()->AddType(newnode); module->AddTreeFront(newnode); return newnode; @@ -743,6 +744,7 @@ StructNode *ClassStructVisitor::VisitStructNode(StructNode *node) { } (void) AstVisitor::VisitStructNode(node); if (mInfo->GetPass() == 0) { + gTypeTable.AddType(node); IdentifierNode *id = node->GetStructId(); if (id && node->GetStrIdx() == 0) { node->SetStrIdx(id->GetStrIdx()); @@ -777,6 +779,7 @@ ClassNode *ClassStructVisitor::VisitClassNode(ClassNode *node) { mInfo->SetTypeId(node, TY_Class); (void) AstVisitor::VisitClassNode(node); if (mInfo->GetPass() == 0) { + gTypeTable.AddType(node); mInfo->SetStrIdx2Struct(node->GetStrIdx(), node); for (unsigned i = 0; i < node->GetFieldsNum(); ++i) { if (TreeNode *t = node->GetField(i)) { @@ -807,6 +810,7 @@ InterfaceNode *ClassStructVisitor::VisitInterfaceNode(InterfaceNode *node) { mInfo->SetTypeId(node, TY_Class); (void) AstVisitor::VisitInterfaceNode(node); if (mInfo->GetPass() == 0) { + gTypeTable.AddType(node); mInfo->SetStrIdx2Struct(node->GetStrIdx(), node); for (unsigned i = 0; i < node->GetFieldsNum(); ++i) { if (TreeNode *t = node->GetField(i)) { -- Gitee From 4010373735c9724387975e3034274b5131daf623 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Mon, 7 Feb 2022 14:21:09 -0500 Subject: [PATCH 2/6] use ArrayTypeNode for type of array decl --- src/MapleFE/astopt/src/ast_adj.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/MapleFE/astopt/src/ast_adj.cpp b/src/MapleFE/astopt/src/ast_adj.cpp index 01078cd867..d049ce188d 100644 --- a/src/MapleFE/astopt/src/ast_adj.cpp +++ b/src/MapleFE/astopt/src/ast_adj.cpp @@ -176,6 +176,18 @@ UserTypeNode *AdjustASTVisitor::VisitUserTypeNode(UserTypeNode *node) { if (id) { node->SetStrIdx(id->GetStrIdx()); } + + // use array type node + DimensionNode *dim = node->GetDims(); + TreeNode *p = node->GetParent(); + if (dim && p->IsIdentifier()) { + ArrayTypeNode *arr = mHandler->NewTreeNode(); + arr->SetDims(dim); + arr->SetElemType(node); + node->SetDims(NULL); + IdentifierNode *inode = static_cast(p); + inode->SetType(arr); + } return node; } -- Gitee From 5a406d049d35d53099aff79d71431ca658e5c217 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Mon, 7 Feb 2022 16:08:56 -0500 Subject: [PATCH 3/6] enum fields default to int --- src/MapleFE/astopt/src/ast_ti.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/MapleFE/astopt/src/ast_ti.cpp b/src/MapleFE/astopt/src/ast_ti.cpp index 28c7af296b..54226d7cad 100644 --- a/src/MapleFE/astopt/src/ast_ti.cpp +++ b/src/MapleFE/astopt/src/ast_ti.cpp @@ -1591,6 +1591,10 @@ StructNode *TypeInferVisitor::VisitStructNode(StructNode *node) { tid = MergeTypeId(tid, t->GetTypeId()); tidx = MergeTypeIdx(tidx, t->GetTypeIdx()); } + if (tid == TY_None) { + tid = TY_Int; + tidx = (unsigned)TY_Int; + } for (unsigned i = 0; i < node->GetFieldsNum(); ++i) { TreeNode *t = node->GetField(i); SetTypeId(t, tid); -- Gitee From cf38375284f5d741cf40081507e51edf7d1b2952 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Tue, 8 Feb 2022 16:54:36 -0500 Subject: [PATCH 4/6] support query array element typeidx --- src/MapleFE/astopt/include/ast_handler.h | 15 +++++ src/MapleFE/astopt/include/ast_ti.h | 3 +- src/MapleFE/astopt/src/ast_adj.cpp | 1 + src/MapleFE/astopt/src/ast_handler.cpp | 3 +- src/MapleFE/astopt/src/ast_ti.cpp | 71 ++++++++++++++++++------ 5 files changed, 73 insertions(+), 20 deletions(-) diff --git a/src/MapleFE/astopt/include/ast_handler.h b/src/MapleFE/astopt/include/ast_handler.h index d9e629b6bf..fea8de93f6 100644 --- a/src/MapleFE/astopt/include/ast_handler.h +++ b/src/MapleFE/astopt/include/ast_handler.h @@ -129,6 +129,8 @@ class Module_Handler { std::unordered_map mNodeId2Decl; // array's element type: decl node id to typeid std::unordered_map mArrayDeclId2EleTypeIdMap; + // array's element typeidx: decl node id to typeidx + std::unordered_map mArrayDeclId2EleTypeIdxMap; // array literal's dim: decl node id to dim std::unordered_map mArrayDeclId2DimMap; // fields' nodeid set @@ -249,6 +251,19 @@ class Module_Handler { mArrayDeclId2EleTypeIdMap[nid] = tid; } + // array's element typeidx + unsigned GetArrayElemTypeIdx(unsigned nid) { + unsigned tidx = 0; + if (mArrayDeclId2EleTypeIdxMap.find(nid) != mArrayDeclId2EleTypeIdxMap.end()) { + tidx = mArrayDeclId2EleTypeIdxMap[nid]; + } + return tidx; + } + + void SetArrayElemTypeIdx(unsigned nid, unsigned tidx) { + mArrayDeclId2EleTypeIdxMap[nid] = tidx; + } + DimensionNode *GetArrayDim(unsigned nid) { DimensionNode *dim = NULL; if (mArrayDeclId2DimMap.find(nid) != mArrayDeclId2DimMap.end()) { diff --git a/src/MapleFE/astopt/include/ast_ti.h b/src/MapleFE/astopt/include/ast_ti.h index cbe5faa95b..a569b4d7a4 100644 --- a/src/MapleFE/astopt/include/ast_ti.h +++ b/src/MapleFE/astopt/include/ast_ti.h @@ -146,10 +146,11 @@ class TypeInferVisitor : public TypeInferBaseVisitor { void UpdateFuncRetTypeId(FunctionNode *node, TypeId tid, unsigned tidx); void UpdateTypeUseNode(TreeNode *target, TreeNode *input); void UpdateArgArrayDecls(unsigned nid, TypeId tid); - void UpdateArrayElemTypeIdMap(TreeNode *node, TypeId tid); + void UpdateArrayElemTypeMap(TreeNode *node, TypeId tid, unsigned tidx); void UpdateArrayDimMap(TreeNode *node, DimensionNode *dim); bool UpdateVarTypeWithInit(TreeNode *var, TreeNode *init); TypeId GetArrayElemTypeId(TreeNode *node); + unsigned GetArrayElemTypeIdx(TreeNode *node); TypeId MergeTypeId(TypeId tia, TypeId tib); unsigned MergeTypeIdx(unsigned tia, unsigned tib); diff --git a/src/MapleFE/astopt/src/ast_adj.cpp b/src/MapleFE/astopt/src/ast_adj.cpp index d049ce188d..f5948760a4 100644 --- a/src/MapleFE/astopt/src/ast_adj.cpp +++ b/src/MapleFE/astopt/src/ast_adj.cpp @@ -187,6 +187,7 @@ UserTypeNode *AdjustASTVisitor::VisitUserTypeNode(UserTypeNode *node) { node->SetDims(NULL); IdentifierNode *inode = static_cast(p); inode->SetType(arr); + mHandler->SetArrayElemTypeId(inode->GetNodeId(), id->GetTypeId()); } return node; } diff --git a/src/MapleFE/astopt/src/ast_handler.cpp b/src/MapleFE/astopt/src/ast_handler.cpp index d6cf4cdc94..6d6bd0b0ce 100644 --- a/src/MapleFE/astopt/src/ast_handler.cpp +++ b/src/MapleFE/astopt/src/ast_handler.cpp @@ -201,8 +201,7 @@ TreeNode *Module_Handler::FindDecl(IdentifierNode *node, bool deep) { } if (decl) { - unsigned did = decl->GetNodeId(); - mNodeId2Decl[did] = decl; + AddNodeId2DeclMap(node->GetNodeId(), decl); } if (deep && decl && GetASTXXport()->IsImportedDeclId(mHidx, decl->GetNodeId())) { diff --git a/src/MapleFE/astopt/src/ast_ti.cpp b/src/MapleFE/astopt/src/ast_ti.cpp index 54226d7cad..ea69ba50eb 100644 --- a/src/MapleFE/astopt/src/ast_ti.cpp +++ b/src/MapleFE/astopt/src/ast_ti.cpp @@ -459,9 +459,11 @@ void TypeInferVisitor::UpdateTypeUseNode(TreeNode *target, TreeNode *input) { if (input->IsIdentifier()) { TreeNode *decl = mHandler->FindDecl(static_cast(input)); TypeId old_elemTypeId = GetArrayElemTypeId(target); + unsigned old_elemTypeIdx = GetArrayElemTypeIdx(target); TypeId inid = GetArrayElemTypeId(decl); - if (old_elemTypeId != inid) { - UpdateArrayElemTypeIdMap(target, inid); + unsigned inidx = GetArrayElemTypeIdx(decl); + if (old_elemTypeId != inid || old_elemTypeIdx != inidx) { + UpdateArrayElemTypeMap(target, inid, inidx); } TypeId new_elemTypeId = GetArrayElemTypeId(target); TreeNode *type = static_cast(target)->GetType(); @@ -483,9 +485,11 @@ void TypeInferVisitor::UpdateTypeUseNode(TreeNode *target, TreeNode *input) { // function's return type with return statement else if (input->IsArrayLiteral()) { TypeId old_elemTypeId = GetArrayElemTypeId(target); + unsigned old_elemTypeIdx = GetArrayElemTypeIdx(target); TypeId inid = GetArrayElemTypeId(input); - if (old_elemTypeId != inid) { - UpdateArrayElemTypeIdMap(target, inid); + unsigned inidx = GetArrayElemTypeIdx(input); + if (old_elemTypeId != inid || old_elemTypeIdx != inidx) { + UpdateArrayElemTypeMap(target, inid, inidx); } TypeId new_elemTypeId = GetArrayElemTypeId(target); if (target->IsPrimArrayType()) { @@ -553,15 +557,25 @@ TypeId TypeInferVisitor::GetArrayElemTypeId(TreeNode *node) { return mHandler->GetArrayElemTypeId(nid); } -void TypeInferVisitor::UpdateArrayElemTypeIdMap(TreeNode *node, TypeId tid) { +unsigned TypeInferVisitor::GetArrayElemTypeIdx(TreeNode *node) { + unsigned nid = node->GetNodeId(); + return mHandler->GetArrayElemTypeIdx(nid); +} + +void TypeInferVisitor::UpdateArrayElemTypeMap(TreeNode *node, TypeId tid, unsigned tidx) { if (!node || tid == TY_None || !IsArray(node)) { return; } unsigned nodeid = node->GetNodeId(); TypeId currtid = mHandler->GetArrayElemTypeId(nodeid); tid = MergeTypeId(tid, currtid); - if (currtid != tid) { + + unsigned currtidx = mHandler->GetArrayElemTypeIdx(nodeid); + tidx = MergeTypeIdx(tidx, currtidx); + + if (currtid != tid || currtidx != tidx) { mHandler->SetArrayElemTypeId(node->GetNodeId(), tid); + mHandler->SetArrayElemTypeIdx(node->GetNodeId(), tidx); SetUpdated(); // update array's PrimType node with a new node @@ -620,6 +634,7 @@ bool TypeInferVisitor::UpdateVarTypeWithInit(TreeNode *var, TreeNode *init) { } } else if (init->IsArrayLiteral()) { TypeId tid = GetArrayElemTypeId(init); + unsigned tidx = GetArrayElemTypeIdx(init); if (IsPrimTypeId(tid)) { PrimTypeNode *pt = mHandler->NewTreeNode(); pt->SetPrimType(tid); @@ -633,14 +648,12 @@ bool TypeInferVisitor::UpdateVarTypeWithInit(TreeNode *var, TreeNode *init) { pat->SetParent(idnode); idnode->SetType(pat); SetUpdated(); - } else { - TreeNode *t = gTypeTable.GetTypeFromTypeIdx(init->GetTypeIdx()); - if (!t) { - t = gTypeTable.GetTypeFromTypeId(tid); - } + } else if (tidx != 0) { + TreeNode *t = gTypeTable.GetTypeFromTypeIdx(tidx); + UserTypeNode *utype = mHandler->GetINFO()->CreateUserTypeNode(t->GetStrIdx(), var->GetScope()); ArrayTypeNode *pat = mHandler->NewTreeNode(); - pat->SetElemType(t); + pat->SetElemType(utype); DimensionNode *dims = mHandler->GetArrayDim(init->GetNodeId()); pat->SetDims(dims); @@ -770,7 +783,7 @@ ArrayElementNode *TypeInferVisitor::VisitArrayElementNode(ArrayElementNode *node // default UpdateTypeId(array, TY_Array); UpdateTypeId(decl, array); - UpdateArrayElemTypeIdMap(decl, node->GetTypeId()); + UpdateArrayElemTypeMap(decl, node->GetTypeId(), node->GetTypeIdx()); UpdateTypeId(node, mHandler->GetArrayElemTypeId(decl->GetNodeId())); } } else { @@ -812,11 +825,14 @@ ArrayLiteralNode *TypeInferVisitor::VisitArrayLiteralNode(ArrayLiteralNode *node al = static_cast(node); unsigned size = al->GetLiteralsNum(); TypeId tid = TY_None; + unsigned tidx = 0; bool allElemArray = true; for (unsigned i = 0; i < size; i++) { TreeNode *n = al->GetLiteral(i); TypeId id = n->GetTypeId(); + unsigned idx = n->GetTypeIdx(); tid = MergeTypeId(tid, id); + tidx = MergeTypeIdx(tidx, idx); if (tid != TY_Array) { allElemArray = false; } @@ -830,6 +846,7 @@ ArrayLiteralNode *TypeInferVisitor::VisitArrayLiteralNode(ArrayLiteralNode *node unsigned elemdim = DEFAULTVALUE; // recalculate element typeid tid = TY_None; + unsigned tidx = 0; for (unsigned i = 0; i < size; i++) { TreeNode *n = al->GetLiteral(i); if (n->IsArrayLiteral()) { @@ -839,13 +856,17 @@ ArrayLiteralNode *TypeInferVisitor::VisitArrayLiteralNode(ArrayLiteralNode *node if (elemdim == DEFAULTVALUE) { elemdim = currdim; tid = mHandler->GetArrayElemTypeId(n->GetNodeId()); + tidx = mHandler->GetArrayElemTypeIdx(n->GetNodeId()); } else if (currdim < elemdim) { elemdim = currdim; tid = TY_Merge; + tidx = 0; } else if (currdim > elemdim) { tid = TY_Merge; + tidx = 0; } else { tid = MergeTypeId(tid, mHandler->GetArrayElemTypeId(n->GetNodeId())); + tidx = MergeTypeIdx(tidx, mHandler->GetArrayElemTypeIdx(n->GetNodeId())); } } } @@ -857,7 +878,7 @@ ArrayLiteralNode *TypeInferVisitor::VisitArrayLiteralNode(ArrayLiteralNode *node } } - UpdateArrayElemTypeIdMap(node, tid); + UpdateArrayElemTypeMap(node, tid, tidx); UpdateArrayDimMap(node, dim); } @@ -1215,12 +1236,14 @@ DeclNode *TypeInferVisitor::VisitDeclNode(DeclNode *node) { TypeId merged = node->GetTypeId(); unsigned mergedtidx = node->GetTypeIdx(); TypeId elemTypeId = TY_None; + unsigned elemTypeIdx = 0; bool isArray = false; if (init) { merged = MergeTypeId(merged, init->GetTypeId()); mergedtidx = MergeTypeIdx(mergedtidx, init->GetTypeIdx()); // collect array element typeid if any elemTypeId = GetArrayElemTypeId(init); + elemTypeIdx = GetArrayElemTypeIdx(init); isArray = (elemTypeId != TY_None); } if (var) { @@ -1259,7 +1282,7 @@ DeclNode *TypeInferVisitor::VisitDeclNode(DeclNode *node) { } SetTypeIdx(node, var->GetTypeIdx()); if (isArray || IsArray(node)) { - UpdateArrayElemTypeIdMap(node, elemTypeId); + UpdateArrayElemTypeMap(node, elemTypeId, elemTypeIdx); } return node; } @@ -1568,9 +1591,20 @@ IsNode *TypeInferVisitor::VisitIsNode(IsNode *node) { NewNode *TypeInferVisitor::VisitNewNode(NewNode *node) { (void) AstVisitor::VisitNewNode(node); - if (node->GetId()) { + TreeNode *id = node->GetId(); + if (id) { UpdateTypeId(node, TY_Class); - SetTypeIdx(node, node->GetId()->GetTypeIdx()); + if (id->GetTypeIdx() == 0) { + if (id->IsIdentifier()) { + IdentifierNode *idn = static_cast(id); + TreeNode *decl = mHandler->FindDecl(idn); + if (decl && decl->GetTypeIdx() != 0) { + SetTypeIdx(node, decl->GetTypeIdx()); + } + } + } else { + SetTypeIdx(node, id->GetTypeIdx()); + } } return node; } @@ -1795,6 +1829,9 @@ UserTypeNode *TypeInferVisitor::VisitUserTypeNode(UserTypeNode *node) { } UserTypeNode *ShareUTVisitor::VisitUserTypeNode(UserTypeNode *node) { + // skip it + return node; + (void) AstVisitor::VisitUserTypeNode(node); // skip for array -- Gitee From c070dde9bfa912c0b6916b0e596cd6d46baa686b Mon Sep 17 00:00:00 2001 From: Wen HU Date: Wed, 9 Feb 2022 11:32:06 -0500 Subject: [PATCH 5/6] update merge typeidx --- src/MapleFE/astopt/src/ast_ti.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/MapleFE/astopt/src/ast_ti.cpp b/src/MapleFE/astopt/src/ast_ti.cpp index ea69ba50eb..336983e20c 100644 --- a/src/MapleFE/astopt/src/ast_ti.cpp +++ b/src/MapleFE/astopt/src/ast_ti.cpp @@ -305,7 +305,17 @@ unsigned TypeInferVisitor::MergeTypeIdx(unsigned tia, unsigned tib) { return tib; } - unsigned result = tia; + unsigned result = 0; + + TreeNode *ta = gTypeTable.GetTypeFromTypeIdx(tia); + TreeNode *tb = gTypeTable.GetTypeFromTypeIdx(tib); + if (ta->IsPrimType() && tb->IsPrimType()) { + TypeId tid = MergeTypeId(ta->GetTypeId(), tb->GetTypeId()); + result = (unsigned)tid; + } else { + TreeNode *type = gTypeTable.GetTypeFromTypeId(TY_Merge); + result = type->GetTypeIdx(); + } if (mFlags & FLG_trace_3) { std::cout << " Type idx Merge: " -- Gitee From b009239924b9829c482cb690ffd0efb008ee0af1 Mon Sep 17 00:00:00 2001 From: Wen HU Date: Thu, 10 Feb 2022 14:50:51 -0500 Subject: [PATCH 6/6] using existing field --- src/MapleFE/astopt/src/ast_ti.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/MapleFE/astopt/src/ast_ti.cpp b/src/MapleFE/astopt/src/ast_ti.cpp index 336983e20c..cc2d1c69d6 100644 --- a/src/MapleFE/astopt/src/ast_ti.cpp +++ b/src/MapleFE/astopt/src/ast_ti.cpp @@ -626,7 +626,7 @@ bool TypeInferVisitor::UpdateVarTypeWithInit(TreeNode *var, TreeNode *init) { if (n->GetId()) { TreeNode *id = n->GetId(); if (id->IsIdentifier() && id->IsTypeIdClass()) { - UserTypeNode *utype = mHandler->GetINFO()->CreateUserTypeNode(id->GetStrIdx(), var->GetScope()); + UserTypeNode *utype = mInfo->CreateUserTypeNode(id->GetStrIdx(), var->GetScope()); utype->SetParent(idnode); idnode->SetType(utype); SetUpdated(); @@ -660,7 +660,7 @@ bool TypeInferVisitor::UpdateVarTypeWithInit(TreeNode *var, TreeNode *init) { SetUpdated(); } else if (tidx != 0) { TreeNode *t = gTypeTable.GetTypeFromTypeIdx(tidx); - UserTypeNode *utype = mHandler->GetINFO()->CreateUserTypeNode(t->GetStrIdx(), var->GetScope()); + UserTypeNode *utype = mInfo->CreateUserTypeNode(t->GetStrIdx(), var->GetScope()); ArrayTypeNode *pat = mHandler->NewTreeNode(); pat->SetElemType(utype); -- Gitee