From 05f882d3d75623900d4a936353aa4b8b65178a4f Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Sat, 14 Aug 2021 19:52:58 -0700 Subject: [PATCH] added primtype for dassignoff; add support of iassignoff in binary IR --- src/mapleall/maple_ir/src/bin_func_export.cpp | 7 +++++++ src/mapleall/maple_ir/src/bin_func_import.cpp | 14 ++++++++++++++ src/mapleall/maple_ir/src/mir_nodes.cpp | 1 + src/mapleall/maple_ir/src/mir_parser.cpp | 6 ++++++ 4 files changed, 28 insertions(+) diff --git a/src/mapleall/maple_ir/src/bin_func_export.cpp b/src/mapleall/maple_ir/src/bin_func_export.cpp index 9877d13251..dddc4ef299 100644 --- a/src/mapleall/maple_ir/src/bin_func_export.cpp +++ b/src/mapleall/maple_ir/src/bin_func_export.cpp @@ -389,6 +389,7 @@ void BinaryMplExport::OutputBlockNode(BlockNode *block) { stIdx = dass->GetStIdx(); } else { DassignoffNode *dassoff = static_cast(s); + WriteNum(dassoff->GetPrimType()); WriteNum(dassoff->offset); stIdx = dassoff->stIdx; } @@ -414,6 +415,12 @@ void BinaryMplExport::OutputBlockNode(BlockNode *block) { WriteNum(iass->GetFieldID()); break; } + case OP_iassignoff: { + IassignoffNode *iassoff = static_cast(s); + WriteNum(iassoff->GetPrimType()); + WriteNum(iassoff->GetOffset()); + break; + } case OP_call: case OP_virtualcall: case OP_virtualicall: diff --git a/src/mapleall/maple_ir/src/bin_func_import.cpp b/src/mapleall/maple_ir/src/bin_func_import.cpp index 40cdfb8ac2..22abc102f4 100644 --- a/src/mapleall/maple_ir/src/bin_func_import.cpp +++ b/src/mapleall/maple_ir/src/bin_func_import.cpp @@ -477,6 +477,10 @@ BlockNode *BinaryMplImport::ImportBlockNode(MIRFunction *func) { switch (op) { case OP_dassign: case OP_dassignoff: { + PrimType primType = PTY_void; + if (op == OP_dassignoff) { + primType = (PrimType)ReadNum(); + } int32 num = ReadNum(); StIdx stIdx; stIdx.SetScope(ReadNum()); @@ -498,6 +502,7 @@ BlockNode *BinaryMplImport::ImportBlockNode(MIRFunction *func) { stmt = s; } else { DassignoffNode *s = func->GetCodeMemPool()->New(); + s->SetPrimType(primType); s->stIdx = stIdx; s->offset = num; s->SetOpnd(ImportExpression(func), 0); @@ -522,6 +527,15 @@ BlockNode *BinaryMplImport::ImportBlockNode(MIRFunction *func) { stmt = s; break; } + case OP_iassignoff: { + IassignoffNode *s = func->GetCodeMemPool()->New(); + s->SetPrimType((PrimType)ReadNum()); + s->SetOffset(ReadNum()); + s->SetOpnd(ImportExpression(func), 0); + s->SetOpnd(ImportExpression(func), 1); + stmt = s; + break; + } case OP_call: case OP_virtualcall: case OP_virtualicall: diff --git a/src/mapleall/maple_ir/src/mir_nodes.cpp b/src/mapleall/maple_ir/src/mir_nodes.cpp index 3f9e19cbe0..95b26ab882 100644 --- a/src/mapleall/maple_ir/src/mir_nodes.cpp +++ b/src/mapleall/maple_ir/src/mir_nodes.cpp @@ -678,6 +678,7 @@ void DassignNode::Dump(int32 indent) const { void DassignoffNode::Dump(int32 indent) const { StmtNode::DumpBase(indent); + LogInfo::MapleLogger() << " " << GetPrimTypeName(GetPrimType()); const MIRSymbol *st = theMIRModule->CurFunction()->GetLocalOrGlobalSymbol(stIdx); LogInfo::MapleLogger() << (st->IsLocal() ? " %" : " $"); LogInfo::MapleLogger() << st->GetName() << " " << offset; diff --git a/src/mapleall/maple_ir/src/mir_parser.cpp b/src/mapleall/maple_ir/src/mir_parser.cpp index 76ee9f8999..58061ec48d 100644 --- a/src/mapleall/maple_ir/src/mir_parser.cpp +++ b/src/mapleall/maple_ir/src/mir_parser.cpp @@ -67,6 +67,11 @@ bool MIRParser::ParseStmtDassignoff(StmtNodePtr &stmt) { Error("expect dassignoff but get "); return false; } + if (!IsPrimitiveType(lexer.NextToken())) { + Error("expect primitive type but get "); + return false; + } + PrimType primType = GetPrimitiveType(lexer.GetTokenKind()); // parse %i lexer.NextToken(); StIdx stidx; @@ -82,6 +87,7 @@ bool MIRParser::ParseStmtDassignoff(StmtNodePtr &stmt) { sym->SetHasPotentialAssignment(); } DassignoffNode *assignStmt = mod.CurFuncCodeMemPool()->New(); + assignStmt->SetPrimType(primType); assignStmt->stIdx = stidx; TokenKind nextToken = lexer.NextToken(); // parse offset -- Gitee