• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "mir_nodes.h"
17 
18 
19 #include "mir_function.h"
20 
21 namespace maple {
22 MIRModule *theMIRModule = nullptr;
23 std::atomic<uint32> StmtNode::stmtIDNext(1);  // 0 is reserved
24 uint32 StmtNode::lastPrintedLineNum = 0;
25 uint16 StmtNode::lastPrintedColumnNum = 0;
26 const int32 CondGotoNode::probAll = 10000;
27 
GetIntrinsicName(MIRIntrinsicID intrn)28 const char *GetIntrinsicName(MIRIntrinsicID intrn)
29 {
30     switch (intrn) {
31         default:
32 #define DEF_MIR_INTRINSIC(STR, NAME, INTRN_CLASS, RETURN_TYPE, ...) \
33     case INTRN_##STR:                                               \
34         return #STR;
35 #include "intrinsics.def"
36 #undef DEF_MIR_INTRINSIC
37     }
38 }
39 
GetType() const40 MIRType *IreadNode::GetType() const
41 {
42     MIRPtrType *ptrtype = static_cast<MIRPtrType *>(GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx));
43     CHECK_FATAL(fieldID == 0, "fieldID must be 0");
44     return ptrtype->GetPointedType();
45 }
46 
AddStatement(StmtNode * stmt)47 void BlockNode::AddStatement(StmtNode *stmt)
48 {
49     DEBUG_ASSERT(stmt != nullptr, "null ptr check");
50     stmtNodeList.push_back(stmt);
51 }
52 
AppendStatementsFromBlock(BlockNode & blk)53 void BlockNode::AppendStatementsFromBlock(BlockNode &blk)
54 {
55     if (blk.GetStmtNodes().empty()) {
56         return;
57     }
58     stmtNodeList.splice(stmtNodeList.end(), blk.GetStmtNodes());
59 }
60 
61 /// Insert stmt as the first
InsertFirst(StmtNode * stmt)62 void BlockNode::InsertFirst(StmtNode *stmt)
63 {
64     DEBUG_ASSERT(stmt != nullptr, "stmt is null");
65     stmtNodeList.push_front(stmt);
66 }
67 
68 /// Insert stmt as the last
InsertLast(StmtNode * stmt)69 void BlockNode::InsertLast(StmtNode *stmt)
70 {
71     DEBUG_ASSERT(stmt != nullptr, "stmt is null");
72     stmtNodeList.push_back(stmt);
73 }
74 
75 // remove sstmtNode1 from block
RemoveStmt(const StmtNode * stmtNode1)76 void BlockNode::RemoveStmt(const StmtNode *stmtNode1)
77 {
78     DEBUG_ASSERT(stmtNode1 != nullptr, "delete a null stmtment");
79     (void)stmtNodeList.erase(stmtNode1);
80 }
81 
82 /// Insert stmtNode2 before stmtNode1 in current block.
InsertBefore(const StmtNode * stmtNode1,StmtNode * stmtNode2)83 void BlockNode::InsertBefore(const StmtNode *stmtNode1, StmtNode *stmtNode2)
84 {
85     stmtNodeList.insert(stmtNode1, stmtNode2);
86 }
87 
88 /// Insert stmtNode2 after stmtNode1 in current block.
InsertAfter(const StmtNode * stmtNode1,StmtNode * stmtNode2)89 void BlockNode::InsertAfter(const StmtNode *stmtNode1, StmtNode *stmtNode2)
90 {
91     stmtNodeList.insertAfter(stmtNode1, stmtNode2);
92 }
93 
94 #ifdef ARK_LITECG_DEBUG
DumpBase(int32 indent) const95 void BaseNode::DumpBase(int32 indent) const
96 {
97     PrintIndentation(indent);
98     LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name << " " << GetPrimTypeName(GetPrimType());
99 }
100 
DumpOpnd(const MIRModule &,int32 indent) const101 void UnaryNode::DumpOpnd(const MIRModule &, int32 indent) const
102 {
103     DumpOpnd(indent);
104 }
105 
DumpOpnd(int32 indent) const106 void UnaryNode::DumpOpnd(int32 indent) const
107 {
108     LogInfo::MapleLogger() << " (";
109     if (uOpnd != nullptr) {
110         uOpnd->Dump(indent);
111     }
112     LogInfo::MapleLogger() << ")";
113 }
114 
Dump(int32 indent) const115 void UnaryNode::Dump(int32 indent) const
116 {
117     BaseNode::DumpBase(0);
118     DumpOpnd(*theMIRModule, indent);
119 }
120 
Dump(int32 indent) const121 void TypeCvtNode::Dump(int32 indent) const
122 {
123     LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name << " ";
124     LogInfo::MapleLogger() << GetPrimTypeName(GetPrimType()) << " " << GetPrimTypeName(FromType());
125     DumpOpnd(*theMIRModule, indent);
126 }
127 
Dump(int32 indent) const128 void RetypeNode::Dump(int32 indent) const
129 {
130     LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name << " ";
131     LogInfo::MapleLogger() << GetPrimTypeName(GetPrimType()) << " ";
132     MIRType *ty = GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx);
133     if (ty->GetKind() == kTypeScalar) {
134         LogInfo::MapleLogger() << "<";
135         ty->Dump(indent + 1);
136         LogInfo::MapleLogger() << ">";
137     } else {
138         ty->Dump(indent + 1);
139     }
140     DumpOpnd(*theMIRModule, indent);
141 }
142 
Dump(int32 indent) const143 void ExtractbitsNode::Dump(int32 indent) const
144 {
145     LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name << " " << GetPrimTypeName(GetPrimType());
146     if (GetOpCode() == OP_extractbits) {
147         LogInfo::MapleLogger() << " " << static_cast<int32>(bitsOffset) << " " << static_cast<int32>(bitsSize);
148     } else {
149         LogInfo::MapleLogger() << " " << static_cast<int32>(bitsSize);
150     }
151     DumpOpnd(*theMIRModule, indent);
152 }
153 
Dump(int32 indent) const154 void IreadNode::Dump(int32 indent) const
155 {
156     BaseNode::DumpBase(0);
157     LogInfo::MapleLogger() << " ";
158     GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx)->Dump(0);
159     LogInfo::MapleLogger() << " " << fieldID;
160     DumpOpnd(*theMIRModule, indent);
161 }
162 
Dump(int32 indent) const163 void BinaryNode::Dump(int32 indent) const
164 {
165     BaseNode::DumpBase(0);
166     BinaryOpnds::Dump(indent);
167 }
168 
Dump(int32 indent) const169 void BinaryOpnds::Dump(int32 indent) const
170 {
171     LogInfo::MapleLogger() << " (";
172     if (bOpnd[0]->IsLeaf() && bOpnd[1]->IsLeaf()) {
173         bOpnd[0]->Dump(0);
174         LogInfo::MapleLogger() << ", ";
175         bOpnd[1]->Dump(0);
176     } else {
177         LogInfo::MapleLogger() << '\n';
178         PrintIndentation(indent + 1);
179         bOpnd[0]->Dump(indent + 1);
180         LogInfo::MapleLogger() << ",\n";
181         PrintIndentation(indent + 1);
182         bOpnd[1]->Dump(indent + 1);
183     }
184     LogInfo::MapleLogger() << ")";
185 }
186 
Dump(int32 indent) const187 void CompareNode::Dump(int32 indent) const
188 {
189     LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name << " " << GetPrimTypeName(GetPrimType());
190     LogInfo::MapleLogger() << " " << GetPrimTypeName(opndType);
191     BinaryOpnds::Dump(indent);
192 }
193 
Dump(int32 indent) const194 void NaryOpnds::Dump(int32 indent) const
195 {
196     LogInfo::MapleLogger() << " (";
197     if (GetNopndSize() == 0) {
198         LogInfo::MapleLogger() << ")";
199         return;
200     }
201     if (GetNopndSize() == 1) {
202         GetNopndAt(0)->Dump(indent);
203     } else {
204         bool allisLeaf = true;
205         for (size_t i = 0; i < GetNopndSize(); ++i)
206             if (!GetNopndAt(i)->IsLeaf()) {
207                 allisLeaf = false;
208                 break;
209             }
210         if (allisLeaf) {
211             GetNopndAt(0)->Dump(0);
212             for (size_t i = 1; i < GetNopndSize(); ++i) {
213                 LogInfo::MapleLogger() << ", ";
214                 GetNopndAt(i)->Dump(0);
215             }
216         } else {
217             LogInfo::MapleLogger() << '\n';
218             PrintIndentation(indent + 1);
219             GetNopndAt(0)->Dump(indent + 1);
220             for (size_t i = 1; i < GetNopndSize(); ++i) {
221                 LogInfo::MapleLogger() << ",\n";
222                 PrintIndentation(indent + 1);
223                 GetNopndAt(i)->Dump(indent + 1);
224             }
225         }
226     }
227     LogInfo::MapleLogger() << ")";
228 }
229 
Dump(int32 indent) const230 void DeoptBundleInfo::Dump(int32 indent) const
231 {
232     size_t deoptBundleSize = deoptBundleInfo.size();
233     if (deoptBundleSize == 0) {
234         return;
235     }
236     LogInfo::MapleLogger() << " deopt: (";
237     bool isFirstItem = true;
238     for (const auto &elem : deoptBundleInfo) {
239         if (!isFirstItem) {
240             LogInfo::MapleLogger() << ", ";
241         } else {
242             isFirstItem = false;
243         }
244         LogInfo::MapleLogger() << elem.first << ": ";
245         auto valueKind = elem.second.GetMapleValueKind();
246         if (valueKind == MapleValue::kPregKind) {
247             LogInfo::MapleLogger() << "%" << elem.second.GetPregIdx() << " ";
248         } else if (valueKind == MapleValue::kConstKind) {
249             if (elem.second.GetConstValue().GetKind() != kConstInt) {
250                 CHECK_FATAL(false, "not supported currently");
251             }
252             LogInfo::MapleLogger() << static_cast<const MIRIntConst &>(elem.second.GetConstValue()).GetValue() << " ";
253         }
254     }
255     LogInfo::MapleLogger() << ")";
256 }
257 
Dump(int32 indent) const258 void NaryNode::Dump(int32 indent) const
259 {
260     BaseNode::DumpBase(0);
261     NaryOpnds::Dump(indent);
262 }
263 #endif
264 
265 #ifdef ARK_LITECG_DEBUG
Dump(int32 indent) const266 void IntrinsicopNode::Dump(int32 indent) const
267 {
268     LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name << " " << GetPrimTypeName(GetPrimType());
269     LogInfo::MapleLogger() << " " << GetIntrinsicName(GetIntrinsic());
270     NaryOpnds::Dump(indent);
271 }
272 
Dump(int32) const273 void ConstvalNode::Dump(int32) const
274 {
275     if (GetConstVal()->GetType().GetKind() != kTypePointer) {
276         BaseNode::DumpBase(0);
277         LogInfo::MapleLogger() << " ";
278     }
279     GetConstVal()->Dump();
280 }
281 
Dump(int32) const282 void AddrofNode::Dump(int32) const
283 {
284     LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name << " " << GetPrimTypeName(GetPrimType());
285     DEBUG_ASSERT(theMIRModule->CurFunction() != nullptr, "theMIRModule->CurFunction() should not be nullptr");
286     const MIRSymbol *st = theMIRModule->CurFunction()->GetLocalOrGlobalSymbol(GetStIdx());
287     LogInfo::MapleLogger() << (GetStIdx().Islocal() ? " %" : " $");
288     DEBUG_ASSERT(st != nullptr, "null ptr check");
289     LogInfo::MapleLogger() << st->GetName();
290     if (fieldID != 0) {
291         LogInfo::MapleLogger() << " " << fieldID;
292     }
293 }
294 
Dump(int32) const295 void DreadoffNode::Dump(int32) const
296 {
297     LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name << " " << GetPrimTypeName(GetPrimType());
298     const MIRSymbol *st = theMIRModule->CurFunction()->GetLocalOrGlobalSymbol(stIdx);
299     LogInfo::MapleLogger() << (stIdx.Islocal() ? " %" : " $");
300     DEBUG_ASSERT(st != nullptr, "null ptr check");
301     LogInfo::MapleLogger() << st->GetName();
302     LogInfo::MapleLogger() << " " << offset;
303 }
304 
Dump(int32) const305 void RegreadNode::Dump(int32) const
306 {
307     LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name << " " << GetPrimTypeName(GetPrimType());
308     if (regIdx >= 0) {
309         LogInfo::MapleLogger() << " %"
310                                << theMIRModule->CurFunction()->GetPregTab()->PregFromPregIdx(regIdx)->GetPregNo();
311         return;
312     }
313     LogInfo::MapleLogger() << " %%";
314     switch (regIdx) {
315         case -kSregSp:
316             LogInfo::MapleLogger() << "SP";
317             break;
318         case -kSregFp:
319             LogInfo::MapleLogger() << "FP";
320             break;
321         default:
322             int32 retValIdx = (-regIdx) - kSregRetval0;
323             LogInfo::MapleLogger() << "retval" << retValIdx;
324             break;
325     }
326 }
327 
DumpBase(int32 indent) const328 void StmtNode::DumpBase(int32 indent) const
329 {
330     srcPosition.DumpLoc(lastPrintedLineNum, lastPrintedColumnNum);
331     // dump stmtFreqs
332     DEBUG_ASSERT(theMIRModule->CurFunction() != nullptr, "theMIRModule->CurFunction() should not be nullptr");
333     PrintIndentation(indent);
334     LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name;
335 }
336 
Dump(int32 indent) const337 void StmtNode::Dump(int32 indent) const
338 {
339     StmtNode::DumpBase(indent);
340     LogInfo::MapleLogger() << '\n';
341 }
342 
Dump(int32 indent) const343 void DassignNode::Dump(int32 indent) const
344 {
345     StmtNode::DumpBase(indent);
346     const MIRSymbol *st = theMIRModule->CurFunction()->GetLocalOrGlobalSymbol(stIdx);
347     DEBUG_ASSERT(st != nullptr, "null ptr check");
348     LogInfo::MapleLogger() << (st->IsLocal() ? " %" : " $");
349     LogInfo::MapleLogger() << st->GetName() << " " << fieldID;
350     LogInfo::MapleLogger() << " (";
351     if (GetRHS() != nullptr) {
352         GetRHS()->Dump(indent + 1);
353     } else {
354         LogInfo::MapleLogger() << "/*empty-rhs*/";
355     }
356     LogInfo::MapleLogger() << ")\n";
357 }
358 
Dump(int32 indent) const359 void RegassignNode::Dump(int32 indent) const
360 {
361     StmtNode::DumpBase(indent);
362     LogInfo::MapleLogger() << " " << GetPrimTypeName(GetPrimType());
363     if (regIdx >= 0) {
364         LogInfo::MapleLogger() << " %"
365                                << theMIRModule->CurFunction()->GetPregTab()->PregFromPregIdx(regIdx)->GetPregNo();
366     } else {
367         LogInfo::MapleLogger() << " %%";
368         switch (regIdx) {
369             case -kSregSp:
370                 LogInfo::MapleLogger() << "SP";
371                 break;
372             case -kSregFp:
373                 LogInfo::MapleLogger() << "FP";
374                 break;
375             case -kSregRetval0:
376                 LogInfo::MapleLogger() << "retval0";
377                 break;
378             // no default
379             default:
380                 break;
381         }
382     }
383     LogInfo::MapleLogger() << " (";
384     UnaryStmtNode::Opnd(0)->Dump(indent + 1);
385     LogInfo::MapleLogger() << ")\n";
386 }
387 
Dump(int32 indent) const388 void IassignNode::Dump(int32 indent) const
389 {
390     StmtNode::DumpBase(indent);
391     LogInfo::MapleLogger() << " ";
392     GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx)->Dump(0);
393     LogInfo::MapleLogger() << " " << fieldID;
394     LogInfo::MapleLogger() << " (";
395     if (addrExpr->IsLeaf() && rhs->IsLeaf()) {
396         addrExpr->Dump(0);
397         LogInfo::MapleLogger() << ", ";
398         rhs->Dump(0);
399     } else {
400         LogInfo::MapleLogger() << '\n';
401         PrintIndentation(indent + 1);
402         addrExpr->Dump(indent + 1);
403         LogInfo::MapleLogger() << ", \n";
404         PrintIndentation(indent + 1);
405         rhs->Dump(indent + 1);
406     }
407     LogInfo::MapleLogger() << ")\n";
408 }
409 
Dump(int32 indent) const410 void GotoNode::Dump(int32 indent) const
411 {
412     StmtNode::DumpBase(indent);
413     if (offset == 0) {
414         LogInfo::MapleLogger() << '\n';
415     } else {
416         LogInfo::MapleLogger() << " @" << theMIRModule->CurFunction()->GetLabelName(static_cast<LabelIdx>(offset))
417                                << '\n';
418     }
419 }
420 
Dump(int32 indent) const421 void CondGotoNode::Dump(int32 indent) const
422 {
423     StmtNode::DumpBase(indent);
424     LogInfo::MapleLogger() << " @" << theMIRModule->CurFunction()->GetLabelName(static_cast<LabelIdx>(offset));
425     LogInfo::MapleLogger() << " (";
426     Opnd(0)->Dump(indent);
427     LogInfo::MapleLogger() << ")\n";
428 }
429 
Dump(int32 indent) const430 void SwitchNode::Dump(int32 indent) const
431 {
432     StmtNode::DumpBase(indent);
433     LogInfo::MapleLogger() << " (";
434     switchOpnd->Dump(indent);
435     if (defaultLabel == 0) {
436         LogInfo::MapleLogger() << ") 0 {";
437     } else {
438         LogInfo::MapleLogger() << ") @" << theMIRModule->CurFunction()->GetLabelName(defaultLabel) << " {";
439     }
440     for (auto it = switchTable.begin(); it != switchTable.end(); it++) {
441         LogInfo::MapleLogger() << '\n';
442         PrintIndentation(indent + 1);
443         LogInfo::MapleLogger() << std::hex << "0x" << it->first << std::dec;
444         LogInfo::MapleLogger() << ": goto @" << theMIRModule->CurFunction()->GetLabelName(it->second);
445     }
446     LogInfo::MapleLogger() << " }\n";
447 }
448 
Dump(int32 indent) const449 void RangeGotoNode::Dump(int32 indent) const
450 {
451     StmtNode::DumpBase(indent);
452     LogInfo::MapleLogger() << " (";
453     Opnd(0)->Dump(indent);
454     LogInfo::MapleLogger() << ") " << tagOffset << " {";
455     for (auto it = rangegotoTable.begin(); it != rangegotoTable.end(); it++) {
456         LogInfo::MapleLogger() << '\n';
457         PrintIndentation(indent + 1);
458         LogInfo::MapleLogger() << std::hex << "0x" << it->first << std::dec;
459         LogInfo::MapleLogger() << ": goto @" << theMIRModule->CurFunction()->GetLabelName(it->second);
460     }
461     LogInfo::MapleLogger() << " }\n";
462 }
463 
DumpOpnd(const MIRModule &,int32 indent) const464 void UnaryStmtNode::DumpOpnd(const MIRModule &, int32 indent) const
465 {
466     DumpOpnd(indent);
467 }
468 
DumpOpnd(int32 indent) const469 void UnaryStmtNode::DumpOpnd(int32 indent) const
470 {
471     LogInfo::MapleLogger() << " (";
472     if (uOpnd != nullptr) {
473         uOpnd->Dump(indent);
474     }
475     LogInfo::MapleLogger() << ")\n";
476 }
477 
Dump(int32 indent) const478 void UnaryStmtNode::Dump(int32 indent) const
479 {
480     StmtNode::DumpBase(indent);
481     DumpOpnd(indent);
482 }
483 
Dump(int32 indent) const484 void IfStmtNode::Dump(int32 indent) const
485 {
486     StmtNode::DumpBase(indent);
487     LogInfo::MapleLogger() << " (";
488     Opnd()->Dump(indent);
489     LogInfo::MapleLogger() << ")";
490     thenPart->Dump(indent);
491     if (elsePart) {
492         PrintIndentation(indent);
493         LogInfo::MapleLogger() << "else {\n";
494         for (auto &stmt : elsePart->GetStmtNodes()) {
495             stmt.Dump(indent + 1);
496         }
497         PrintIndentation(indent);
498         LogInfo::MapleLogger() << "}\n";
499     }
500 }
501 
Dump(int32 indent) const502 void BinaryStmtNode::Dump(int32 indent) const
503 {
504     StmtNode::DumpBase(indent);
505     BinaryOpnds::Dump(indent);
506     LogInfo::MapleLogger() << '\n';
507 }
508 
Dump(int32 indent) const509 void NaryStmtNode::Dump(int32 indent) const
510 {
511     StmtNode::DumpBase(indent);
512     NaryOpnds::Dump(indent);
513     LogInfo::MapleLogger() << '\n';
514 }
515 
DumpCallReturns(const MIRModule & mod,CallReturnVector nrets,int32 indent)516 void DumpCallReturns(const MIRModule &mod, CallReturnVector nrets, int32 indent)
517 {
518     const MIRFunction *mirFunc = mod.CurFunction();
519     if (nrets.empty()) {
520         LogInfo::MapleLogger() << " {}\n";
521         return;
522     } else if (nrets.size() == 1) {
523         StIdx stIdx = nrets.begin()->first;
524         RegFieldPair regFieldPair = nrets.begin()->second;
525         if (!regFieldPair.IsReg()) {
526             const MIRSymbol *st = mirFunc->GetLocalOrGlobalSymbol(stIdx);
527             DEBUG_ASSERT(st != nullptr, "st is null");
528             FieldID fieldID = regFieldPair.GetFieldID();
529             LogInfo::MapleLogger() << " { dassign ";
530             LogInfo::MapleLogger() << (stIdx.Islocal() ? "%" : "$");
531             LogInfo::MapleLogger() << st->GetName() << " " << fieldID << " }\n";
532             return;
533         } else {
534             PregIdx regIdx = regFieldPair.GetPregIdx();
535             const MIRPreg *mirPreg = mirFunc->GetPregItem(static_cast<PregIdx>(regIdx));
536             DEBUG_ASSERT(mirPreg != nullptr, "mirPreg is null");
537             LogInfo::MapleLogger() << " { regassign";
538             LogInfo::MapleLogger() << " " << GetPrimTypeName(mirPreg->GetPrimType());
539             LogInfo::MapleLogger() << " %" << mirPreg->GetPregNo() << "}\n";
540             return;
541         }
542     }
543     LogInfo::MapleLogger() << " {\n";
544     constexpr int32 spaceNum = 2;
545     for (auto it = nrets.begin(); it != nrets.end(); it++) {
546         PrintIndentation(indent + spaceNum);
547         StIdx stIdx = (it)->first;
548         RegFieldPair regFieldPair = it->second;
549         if (!regFieldPair.IsReg()) {
550             FieldID fieldID = regFieldPair.GetFieldID();
551             LogInfo::MapleLogger() << "dassign";
552             const MIRSymbol *st = mirFunc->GetLocalOrGlobalSymbol(stIdx);
553             DEBUG_ASSERT(st != nullptr, "st is null");
554             LogInfo::MapleLogger() << (stIdx.Islocal() ? " %" : " $");
555             LogInfo::MapleLogger() << st->GetName() << " " << fieldID << '\n';
556         } else {
557             PregIdx regIdx = regFieldPair.GetPregIdx();
558             const MIRPreg *mirPreg = mirFunc->GetPregItem(static_cast<PregIdx>(regIdx));
559             DEBUG_ASSERT(mirPreg != nullptr, "mirPreg is null");
560             LogInfo::MapleLogger() << "regassign"
561                                    << " " << GetPrimTypeName(mirPreg->GetPrimType());
562             LogInfo::MapleLogger() << " %" << mirPreg->GetPregNo() << '\n';
563         }
564     }
565     PrintIndentation(indent + 1);
566     LogInfo::MapleLogger() << "}\n";
567 }
568 
Dump(int32 indent,bool newline) const569 void CallNode::Dump(int32 indent, bool newline) const
570 {
571     StmtNode::DumpBase(indent);
572     if (tyIdx != 0u) {
573         LogInfo::MapleLogger() << " ";
574         GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx)->Dump(indent + 1);
575     }
576     CHECK(puIdx < GlobalTables::GetFunctionTable().GetFuncTable().size(), "index out of range in CallNode::Dump");
577     MIRFunction *func = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(puIdx);
578     DumpCallConvInfo();
579     LogInfo::MapleLogger() << " &" << func->GetName();
580     NaryOpnds::Dump(indent);
581     DeoptBundleInfo::Dump(indent);
582     if (kOpcodeInfo.IsCallAssigned(GetOpCode())) {
583         DumpCallReturns(*theMIRModule, this->GetReturnVec(), indent);
584     } else if (newline) {
585         LogInfo::MapleLogger() << '\n';
586     }
587 }
588 #endif
589 
GetCallReturnType()590 MIRType *IcallNode::GetCallReturnType()
591 {
592     if (op == OP_icall || op == OP_icallassigned) {
593         return GlobalTables::GetTypeTable().GetTypeFromTyIdx(retTyIdx);
594     }
595     // icallproto or icallprotoassigned
596     MIRFuncType *funcType = static_cast<MIRFuncType *>(GlobalTables::GetTypeTable().GetTypeFromTyIdx(retTyIdx));
597     return GlobalTables::GetTypeTable().GetTypeFromTyIdx(funcType->GetRetTyIdx());
598 }
599 
600 #ifdef ARK_LITECG_DEBUG
Dump(int32 indent,bool newline) const601 void IcallNode::Dump(int32 indent, bool newline) const
602 {
603     StmtNode::DumpBase(indent);
604     DumpCallConvInfo();
605     if (op == OP_icallproto || op == OP_icallprotoassigned) {
606         LogInfo::MapleLogger() << " ";
607         GlobalTables::GetTypeTable().GetTypeFromTyIdx(retTyIdx)->Dump(indent + 1);
608     }
609     NaryOpnds::Dump(indent);
610     DeoptBundleInfo::Dump(indent);
611     if (kOpcodeInfo.IsCallAssigned(GetOpCode())) {
612         DumpCallReturns(*theMIRModule, this->returnValues, indent);
613     } else if (newline) {
614         LogInfo::MapleLogger() << '\n';
615     }
616 }
617 
Dump(int32 indent,bool newline) const618 void IntrinsiccallNode::Dump(int32 indent, bool newline) const
619 {
620     StmtNode::DumpBase(indent);
621     if (tyIdx != 0u) {
622         LogInfo::MapleLogger() << " ";
623         GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx)->Dump(indent + 1);
624     }
625     if (GetOpCode() == OP_intrinsiccall || GetOpCode() == OP_intrinsiccallassigned ||
626         GetOpCode() == OP_intrinsiccallwithtype) {
627         LogInfo::MapleLogger() << " " << GetIntrinsicName(intrinsic);
628     } else {
629         LogInfo::MapleLogger() << " " << intrinsic;
630     }
631     NaryOpnds::Dump(indent);
632     if (kOpcodeInfo.IsCallAssigned(GetOpCode())) {
633         DumpCallReturns(*theMIRModule, this->GetReturnVec(), indent);
634     } else if (newline) {
635         LogInfo::MapleLogger() << '\n';
636     }
637 }
638 
Dump(int32 indent,const MIRSymbolTable * theSymTab,MIRPregTable * thePregTab,bool withInfo,bool isFuncbody,MIRFlavor flavor) const639 void BlockNode::Dump(int32 indent, const MIRSymbolTable *theSymTab, MIRPregTable *thePregTab, bool withInfo,
640                      bool isFuncbody, MIRFlavor flavor) const
641 {
642     if (!withInfo) {
643         LogInfo::MapleLogger() << " {\n";
644     }
645     // output puid for debugging purpose
646     DEBUG_ASSERT(theMIRModule->CurFunction() != nullptr, "theMIRModule->CurFunction() should not be nullptr");
647     if (isFuncbody) {
648         theMIRModule->CurFunction()->DumpFuncBody(indent);
649         if (theSymTab != nullptr || thePregTab != nullptr) {
650             // print the locally declared type names
651             if (theMIRModule->CurFunction()->HaveTypeNameTab()) {
652                 constexpr int32 spaceNum = 2;
653                 for (auto it : theMIRModule->CurFunction()->GetGStrIdxToTyIdxMap()) {
654                     const std::string &name = GlobalTables::GetStrTable().GetStringFromStrIdx(it.first);
655                     MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(it.second);
656                     PrintIndentation(indent + 1);
657                     LogInfo::MapleLogger() << "type %" << name << " ";
658                     if (type->GetKind() != kTypeByName) {
659                         type->Dump(indent + spaceNum, true);
660                     } else {
661                         type->Dump(indent + spaceNum);
662                     }
663                     LogInfo::MapleLogger() << '\n';
664                 }
665             }
666             // print the locally declared variables
667             DEBUG_ASSERT(theSymTab != nullptr, "theSymTab should not be nullptr");
668             theSymTab->Dump(true, indent + 1, false, flavor); /* first:isLocal, third:printDeleted */
669             if (thePregTab != nullptr) {
670                 thePregTab->DumpPregsWithTypes(indent + 1);
671             }
672         }
673         LogInfo::MapleLogger() << '\n';
674     }
675     srcPosition.DumpLoc(lastPrintedLineNum, lastPrintedColumnNum);
676     for (auto &stmt : GetStmtNodes()) {
677         stmt.Dump(indent + 1);
678     }
679     PrintIndentation(indent);
680     LogInfo::MapleLogger() << "}\n";
681 }
682 
Dump(int32) const683 void LabelNode::Dump(int32) const
684 {
685     DEBUG_ASSERT(theMIRModule->CurFunction() != nullptr, "theMIRModule->CurFunction() should not be nullptr");
686     if (theMIRModule->CurFunction()->WithLocInfo()) {
687         srcPosition.DumpLoc(lastPrintedLineNum, lastPrintedColumnNum);
688     }
689     LogInfo::MapleLogger() << "@" << theMIRModule->CurFunction()->GetLabelName(labelIdx) << "\n";
690 }
691 
Dump(int32 indent) const692 void CommentNode::Dump(int32 indent) const
693 {
694     srcPosition.DumpLoc(lastPrintedLineNum, lastPrintedColumnNum);
695     PrintIndentation(indent);
696     LogInfo::MapleLogger() << "#" << comment << '\n';
697 }
698 
EmitStr(const MapleString & mplStr)699 void EmitStr(const MapleString &mplStr)
700 {
701     const char *str = mplStr.c_str();
702     size_t len = mplStr.length();
703     LogInfo::MapleLogger() << "\"";
704 
705     // don't expand special character; convert all \s to \\s in string
706     for (size_t i = 0; i < len; ++i) {
707         /* Referred to GNU AS: 3.6.1.1 Strings */
708         constexpr int kBufSize = 5;
709         constexpr int kFirstChar = 0;
710         constexpr int kSecondChar = 1;
711         constexpr int kThirdChar = 2;
712         constexpr int kLastChar = 4;
713         char buf[kBufSize];
714         if (isprint(*str)) {
715             buf[kFirstChar] = *str;
716             buf[kSecondChar] = 0;
717             if (*str == '\\' || *str == '\"') {
718                 buf[kFirstChar] = '\\';
719                 buf[kSecondChar] = *str;
720                 buf[kThirdChar] = 0;
721             }
722             LogInfo::MapleLogger() << buf;
723         } else if (*str == '\b') {
724             LogInfo::MapleLogger() << "\\b";
725         } else if (*str == '\n') {
726             LogInfo::MapleLogger() << "\\n";
727         } else if (*str == '\r') {
728             LogInfo::MapleLogger() << "\\r";
729         } else if (*str == '\t') {
730             LogInfo::MapleLogger() << "\\t";
731         } else if (*str == '\0') {
732             buf[kFirstChar] = '\\';
733             buf[kSecondChar] = '0';
734             buf[kThirdChar] = 0;
735             LogInfo::MapleLogger() << buf;
736         } else {
737             /* all others, print as number */
738             int ret = snprintf_s(buf, sizeof(buf), kBufSize - 1, "\\%03o", static_cast<unsigned char>(*str) & 0xFF);
739             if (ret < 0) {
740                 FATAL(kLncFatal, "snprintf_s failed");
741             }
742             buf[kLastChar] = '\0';
743             LogInfo::MapleLogger() << buf;
744         }
745         str++;
746     }
747 
748     LogInfo::MapleLogger() << "\"\n";
749 }
750 
GetFuncName() const751 std::string SafetyCheckStmtNode::GetFuncName() const
752 {
753     return GlobalTables::GetStrTable().GetStringFromStrIdx(funcNameIdx);
754 }
755 #endif
756 }  // namespace maple
757