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