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_parser.h"
17 #include "mir_function.h"
18 #include "opcode_info.h"
19
20 namespace maple {
21
ParseSwitchCase(int64 & constVal,LabelIdx & lblIdx)22 bool MIRParser::ParseSwitchCase(int64 &constVal, LabelIdx &lblIdx)
23 {
24 // syntax <intconst0>: goto <label0>
25 if (lexer.GetTokenKind() != TK_intconst) {
26 Error("expect intconst in switch but get ");
27 return false;
28 }
29 constVal = lexer.GetTheIntVal();
30 if (lexer.NextToken() != TK_colon) {
31 Error("expect : in switch but get ");
32 return false;
33 }
34 if (lexer.NextToken() != TK_goto) {
35 Error("expect goto in switch case but get ");
36 return false;
37 }
38 if (lexer.NextToken() != TK_label) {
39 Error("expect label in switch but get ");
40 return false;
41 }
42 lblIdx = mod.CurFunction()->GetOrCreateLableIdxFromName(lexer.GetName());
43 lexer.NextToken();
44 return true;
45 }
46
47 // used only when parsing mmpl
EnterUndeclaredFunction(bool isMcount)48 PUIdx MIRParser::EnterUndeclaredFunction(bool isMcount)
49 {
50 std::string funcName;
51 if (isMcount) {
52 funcName = "_mcount";
53 } else {
54 funcName = lexer.GetName();
55 }
56 GStrIdx strIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(funcName);
57 MIRSymbol *funcSt = GlobalTables::GetGsymTable().CreateSymbol(kScopeGlobal);
58 funcSt->SetNameStrIdx(strIdx);
59 (void)GlobalTables::GetGsymTable().AddToStringSymbolMap(*funcSt);
60 funcSt->SetStorageClass(kScText);
61 funcSt->SetSKind(kStFunc);
62 auto *fn = mod.GetMemPool()->New<MIRFunction>(&mod, funcSt->GetStIdx());
63 fn->SetPuidx(GlobalTables::GetFunctionTable().GetFuncTable().size());
64 GlobalTables::GetFunctionTable().GetFuncTable().push_back(fn);
65 funcSt->SetFunction(fn);
66 auto *funcType = mod.GetMemPool()->New<MIRFuncType>();
67 fn->SetMIRFuncType(funcType);
68 if (isMcount) {
69 MIRType *retType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx(PTY_void));
70 fn->SetReturnTyIdx(retType->GetTypeIndex());
71 }
72 return fn->GetPuidx();
73 }
74
ParseStmtCallMcount(StmtNodePtr & stmt)75 bool MIRParser::ParseStmtCallMcount(StmtNodePtr &stmt)
76 {
77 // syntax: call <PU-name> (<opnd0>, ..., <opndn>)
78 Opcode o = OP_call;
79 PUIdx pIdx = EnterUndeclaredFunction(true);
80 auto *callStmt = mod.CurFuncCodeMemPool()->New<CallNode>(mod, o);
81 callStmt->SetPUIdx(pIdx);
82 MapleVector<BaseNode *> opndsvec(mod.CurFuncCodeMemPoolAllocator()->Adapter());
83 callStmt->SetNOpnd(opndsvec);
84 callStmt->SetNumOpnds(opndsvec.size());
85 stmt = callStmt;
86 return true;
87 }
88
ParseCallReturns(CallReturnVector & retsvec)89 bool MIRParser::ParseCallReturns(CallReturnVector &retsvec)
90 {
91 // {
92 // dassign <var-name0> <field-id0>
93 // dassign <var-name1> <field-id1>
94 // . . .
95 // dassign <var-namen> <field-idn> }
96 // OR
97 // {
98 // regassign <type> <reg1>
99 // regassign <type> <reg2>
100 // regassign <type> <reg3>
101 // }
102 if (lexer.NextToken() != TK_lbrace) {
103 Error("expect { parsing call return values. ");
104 return false;
105 }
106 TokenKind tk = lexer.NextToken();
107 CallReturnPair retpair;
108 while (tk != TK_rbrace) {
109 if (lexer.GetTokenKind() != TK_dassign && lexer.GetTokenKind() != TK_regassign) {
110 Error("expect dassign/regassign but get ");
111 return false;
112 }
113 retsvec.push_back(retpair);
114 tk = lexer.GetTokenKind();
115 }
116 return true;
117 }
118
ParseAssertInfo(std::string & funcName)119 bool MIRParser::ParseAssertInfo(std::string &funcName)
120 {
121 if (lexer.NextToken() != TK_langle) {
122 Error("expect < parsing safey assert check ");
123 return false;
124 }
125 if (lexer.NextToken() != TK_fname) {
126 Error("expect &funcname parsing parsing safey assert check ");
127 return false;
128 }
129 funcName = lexer.GetName();
130 if (lexer.NextToken() != TK_rangle) {
131 Error("expect > parsing safey assert check ");
132 return false;
133 }
134 return true;
135 }
136
ParseBinaryStmt(StmtNodePtr & stmt,Opcode op)137 bool MIRParser::ParseBinaryStmt(StmtNodePtr &stmt, Opcode op)
138 {
139 auto *assStmt = mod.CurFuncCodeMemPool()->New<BinaryStmtNode>(op);
140 lexer.NextToken();
141 BaseNode *opnd0 = nullptr;
142 BaseNode *opnd1 = nullptr;
143 if (!ParseExprTwoOperand(opnd0, opnd1)) {
144 return false;
145 }
146 assStmt->SetBOpnd(opnd0, 0);
147 assStmt->SetBOpnd(opnd1, 1);
148 stmt = assStmt;
149 lexer.NextToken();
150 return true;
151 }
152
ParseCallAssertInfo(std::string & funcName,int * paramIndex,std::string & stmtFuncName)153 bool MIRParser::ParseCallAssertInfo(std::string &funcName, int *paramIndex, std::string &stmtFuncName)
154 {
155 if (lexer.NextToken() != TK_langle) {
156 Error("expect < parsing safey call check ");
157 return false;
158 }
159 if (lexer.NextToken() != TK_fname) {
160 Error("expect &funcname parsing parsing safey call check ");
161 return false;
162 }
163 funcName = lexer.GetName();
164 if (lexer.NextToken() != TK_coma) {
165 Error("expect , parsing parsing safey call check ");
166 return false;
167 }
168 if (lexer.NextToken() != TK_intconst) {
169 Error("expect intconst parsing parsing safey call check ");
170 return false;
171 }
172 *paramIndex = static_cast<int>(lexer.GetTheIntVal());
173 if (lexer.NextToken() != TK_coma) {
174 Error("expect , parsing parsing safey call check ");
175 return false;
176 }
177 if (lexer.NextToken() != TK_fname) {
178 Error("expect &stmtfuncname parsing parsing safey call check ");
179 return false;
180 }
181 stmtFuncName = lexer.GetName();
182 if (lexer.NextToken() != TK_rangle) {
183 Error("expect > parsing parsing safey call check ");
184 return false;
185 }
186 return true;
187 }
188
ParseNaryExpr(NaryStmtNode & stmtNode)189 bool MIRParser::ParseNaryExpr(NaryStmtNode &stmtNode)
190 {
191 if (lexer.NextToken() != TK_lparen) {
192 Error("expect ( parsing NaryExpr ");
193 return false;
194 }
195 (void)lexer.NextToken(); // skip TK_lparen
196 while (lexer.GetTokenKind() != TK_rparen) {
197 BaseNode *expr = nullptr;
198 stmtNode.GetNopnd().push_back(expr);
199 if (lexer.GetTokenKind() != TK_coma && lexer.GetTokenKind() != TK_rparen) {
200 Error("expect , or ) parsing NaryStmt");
201 return false;
202 }
203 if (lexer.GetTokenKind() == TK_coma) {
204 lexer.NextToken();
205 }
206 }
207 return true;
208 }
209
ParseLoc()210 bool MIRParser::ParseLoc()
211 {
212 if (lexer.NextToken() != TK_intconst) {
213 Error("expect intconst in LOC but get ");
214 return false;
215 }
216 lastFileNum = lexer.GetTheIntVal();
217 if (lexer.NextToken() != TK_intconst) {
218 Error("expect intconst in LOC but get ");
219 return false;
220 }
221 lastLineNum = lexer.GetTheIntVal();
222 if (firstLineNum == 0) {
223 firstLineNum = lastLineNum;
224 }
225 if (lexer.NextToken() == TK_intconst) { // optional column number
226 lastColumnNum = static_cast<uint16>(lexer.GetTheIntVal());
227 lexer.NextToken();
228 }
229 return true;
230 }
231
ParseStmtBlockForSeenComment(BlockNodePtr blk,uint32 mplNum)232 void MIRParser::ParseStmtBlockForSeenComment(BlockNodePtr blk, uint32 mplNum)
233 {
234 if (Options::noComment) {
235 lexer.seenComments.clear();
236 return;
237 }
238 // collect accumulated comments into comment statement nodes
239 if (!lexer.seenComments.empty()) {
240 for (size_t i = 0; i < lexer.seenComments.size(); ++i) {
241 auto *cmnt = mod.CurFuncCodeMemPool()->New<CommentNode>(mod);
242 cmnt->SetComment(lexer.seenComments[i]);
243 SetSrcPos(cmnt->GetSrcPos(), mplNum);
244 blk->AddStatement(cmnt);
245 }
246 lexer.seenComments.clear();
247 }
248 }
249
ParseStmtBlockForVar(TokenKind stmtTK)250 bool MIRParser::ParseStmtBlockForVar(TokenKind stmtTK)
251 {
252 MIRFunction *fn = paramCurrFuncForParseStmtBlock;
253 MIRSymbol *st = fn->GetSymTab()->CreateSymbol(kScopeLocal);
254 st->SetStorageClass(kScAuto);
255 st->SetSKind(kStVar);
256 SetSrcPos(st->GetSrcPosition(), lexer.GetLineNum());
257 if (stmtTK == TK_tempvar) {
258 st->SetIsTmp(true);
259 }
260 if (!fn->GetSymTab()->AddToStringSymbolMap(*st)) {
261 Error("duplicate declare symbol parse function ");
262 return false;
263 }
264 if (!ParseDeclareVarInitValue(*st)) {
265 return false;
266 }
267 return true;
268 }
269
ParseStmtBlockForVar()270 bool MIRParser::ParseStmtBlockForVar()
271 {
272 return ParseStmtBlockForVar(TK_var);
273 }
274
ParseStmtBlockForTempVar()275 bool MIRParser::ParseStmtBlockForTempVar()
276 {
277 return ParseStmtBlockForVar(TK_tempvar);
278 }
279
ParseStmtBlockForReg()280 bool MIRParser::ParseStmtBlockForReg()
281 {
282 lexer.NextToken();
283 if (lexer.GetTokenKind() != TK_preg) {
284 Error("expect %%preg after reg");
285 return false;
286 }
287 PregIdx pregIdx;
288 if (!ParsePseudoReg(PTY_ref, pregIdx)) {
289 return false;
290 }
291 MIRPreg *preg = mod.CurFunction()->GetPregTab()->PregFromPregIdx(pregIdx);
292 TyIdx tyidx(0);
293 if (!ParseType(tyidx)) {
294 Error("ParseDeclareVar failed when parsing the type");
295 return false;
296 }
297 DEBUG_ASSERT(tyidx > 0u, "parse declare var failed ");
298 MIRType *mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyidx);
299 preg->SetMIRType(mirType);
300 if (lexer.GetTokenKind() == TK_intconst) {
301 int64 theIntVal = static_cast<int64>(lexer.GetTheIntVal());
302 if (theIntVal != 0 && theIntVal != 1) {
303 Error("parseDeclareReg failed");
304 return false;
305 }
306 preg->SetNeedRC(theIntVal == 0 ? false : true);
307 } else {
308 Error("parseDeclareReg failed");
309 return false;
310 }
311 lexer.NextToken();
312 return true;
313 }
314
ParseStmtBlockForType()315 bool MIRParser::ParseStmtBlockForType()
316 {
317 paramParseLocalType = true;
318 return true;
319 }
320
ParseStmtBlockForFrameSize()321 bool MIRParser::ParseStmtBlockForFrameSize()
322 {
323 MIRFunction *fn = paramCurrFuncForParseStmtBlock;
324 lexer.NextToken();
325 if (lexer.GetTokenKind() != TK_intconst) {
326 Error("expect integer after frameSize but get ");
327 return false;
328 }
329 fn->SetFrameSize(lexer.GetTheIntVal());
330 lexer.NextToken();
331 return true;
332 }
333
ParseStmtBlockForUpformalSize()334 bool MIRParser::ParseStmtBlockForUpformalSize()
335 {
336 MIRFunction *fn = paramCurrFuncForParseStmtBlock;
337 lexer.NextToken();
338 if (lexer.GetTokenKind() != TK_intconst) {
339 Error("expect integer after upFormalSize but get ");
340 return false;
341 }
342 fn->SetUpFormalSize(lexer.GetTheIntVal());
343 lexer.NextToken();
344 return true;
345 }
346
ParseStmtBlockForModuleID()347 bool MIRParser::ParseStmtBlockForModuleID()
348 {
349 MIRFunction *fn = paramCurrFuncForParseStmtBlock;
350 lexer.NextToken();
351 if (lexer.GetTokenKind() != TK_intconst) {
352 Error("expect integer after moduleid but get ");
353 return false;
354 }
355 fn->SetModuleID(lexer.GetTheIntVal());
356 lexer.NextToken();
357 return true;
358 }
359
ParseStmtBlockForFuncSize()360 bool MIRParser::ParseStmtBlockForFuncSize()
361 {
362 MIRFunction *fn = paramCurrFuncForParseStmtBlock;
363 lexer.NextToken();
364 if (lexer.GetTokenKind() != TK_intconst) {
365 Error("expect integer after funcSize but get ");
366 return false;
367 }
368 fn->SetFuncSize(lexer.GetTheIntVal());
369 lexer.NextToken();
370 return true;
371 }
372
ParseStmtBlockForFuncID()373 bool MIRParser::ParseStmtBlockForFuncID()
374 {
375 // funcid is for debugging purpose
376 MIRFunction *fn = paramCurrFuncForParseStmtBlock;
377 lexer.NextToken();
378 if (lexer.GetTokenKind() != TK_intconst) {
379 Error("expect integer after funcid but get ");
380 return false;
381 }
382 fn->SetPuidxOrigin(lexer.GetTheIntVal());
383 lexer.NextToken();
384 return true;
385 }
386
ParseStmtBlockForFormalWordsTypeTagged()387 bool MIRParser::ParseStmtBlockForFormalWordsTypeTagged()
388 {
389 MIRFunction *fn = paramCurrFuncForParseStmtBlock;
390 uint8 *addr = ParseWordsInfo(fn->GetUpFormalSize());
391 if (addr == nullptr) {
392 Error("parser error for formalwordstypetagged");
393 return false;
394 }
395 fn->SetFormalWordsTypeTagged(addr);
396 return true;
397 }
398
ParseStmtBlockForLocalWordsTypeTagged()399 bool MIRParser::ParseStmtBlockForLocalWordsTypeTagged()
400 {
401 MIRFunction *fn = paramCurrFuncForParseStmtBlock;
402 uint8 *addr = ParseWordsInfo(fn->GetFrameSize());
403 if (addr == nullptr) {
404 Error("parser error for localWordsTypeTagged");
405 return false;
406 }
407 fn->SetLocalWordsTypeTagged(addr);
408 return true;
409 }
410
ParseStmtBlockForFormalWordsRefCounted()411 bool MIRParser::ParseStmtBlockForFormalWordsRefCounted()
412 {
413 MIRFunction *fn = paramCurrFuncForParseStmtBlock;
414 uint8 *addr = ParseWordsInfo(fn->GetUpFormalSize());
415 if (addr == nullptr) {
416 Error("parser error for formalwordsrefcounted");
417 return false;
418 }
419 fn->SetFormalWordsRefCounted(addr);
420 return true;
421 }
422
ParseStmtBlockForLocalWordsRefCounted()423 bool MIRParser::ParseStmtBlockForLocalWordsRefCounted()
424 {
425 MIRFunction *fn = paramCurrFuncForParseStmtBlock;
426 uint8 *addr = ParseWordsInfo(fn->GetFrameSize());
427 if (addr == nullptr) {
428 Error("parser error for localwordsrefcounted");
429 return false;
430 }
431 fn->SetLocalWordsRefCounted(addr);
432 return true;
433 }
434
ParseStmtBlockForFuncInfo()435 bool MIRParser::ParseStmtBlockForFuncInfo()
436 {
437 lexer.NextToken();
438 if (!ParseFuncInfo()) {
439 return false;
440 }
441 return true;
442 }
443
ParseExprOneOperand(BaseNodePtr & expr)444 bool MIRParser::ParseExprOneOperand(BaseNodePtr &expr)
445 {
446 if (lexer.GetTokenKind() != TK_lparen) {
447 Error("expect ( parsing operand parsing unary ");
448 return false;
449 }
450 lexer.NextToken();
451 if (lexer.GetTokenKind() != TK_rparen) {
452 Error("expect ) parsing operand parsing unary ");
453 return false;
454 }
455 return true;
456 }
457
ParseExprTwoOperand(BaseNodePtr & opnd0,BaseNodePtr & opnd1)458 bool MIRParser::ParseExprTwoOperand(BaseNodePtr &opnd0, BaseNodePtr &opnd1)
459 {
460 if (lexer.GetTokenKind() != TK_lparen) {
461 Error("expect ( parsing operand parsing unary ");
462 return false;
463 }
464 lexer.NextToken();
465 if (lexer.GetTokenKind() != TK_coma) {
466 Error("expect , between two operands but get ");
467 return false;
468 }
469 lexer.NextToken();
470 if (lexer.GetTokenKind() != TK_rparen) {
471 Error("expect ) parsing operand parsing unary ");
472 return false;
473 }
474 return true;
475 }
476
ParseExprNaryOperand(MapleVector<BaseNode * > & opndVec)477 bool MIRParser::ParseExprNaryOperand(MapleVector<BaseNode *> &opndVec)
478 {
479 if (lexer.GetTokenKind() != TK_lparen) {
480 Error("expect ( parsing operand parsing nary operands ");
481 return false;
482 }
483 TokenKind tk = lexer.NextToken();
484 while (tk != TK_rparen) {
485 BaseNode *opnd = nullptr;
486 opndVec.push_back(opnd);
487 tk = lexer.GetTokenKind();
488 if (tk == TK_coma) {
489 tk = lexer.NextToken();
490 }
491 }
492 return true;
493 }
494
ParseDeclaredSt(StIdx & stidx)495 bool MIRParser::ParseDeclaredSt(StIdx &stidx)
496 {
497 TokenKind varTk = lexer.GetTokenKind();
498 stidx.SetFullIdx(0);
499 GStrIdx stridx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(lexer.GetName());
500 if (varTk == TK_gname) {
501 stidx = GlobalTables::GetGsymTable().GetStIdxFromStrIdx(stridx);
502 if (stidx.FullIdx() == 0) {
503 MIRSymbol *st = GlobalTables::GetGsymTable().CreateSymbol(kScopeGlobal);
504 st->SetNameStrIdx(stridx);
505 st->SetSKind(kStVar);
506 (void)GlobalTables::GetGsymTable().AddToStringSymbolMap(*st);
507 stidx = GlobalTables::GetGsymTable().GetStIdxFromStrIdx(stridx);
508 return true;
509 }
510 } else if (varTk == TK_lname) {
511 stidx = mod.CurFunction()->GetSymTab()->GetStIdxFromStrIdx(stridx);
512 if (stidx.FullIdx() == 0) {
513 Error("local symbol not declared ");
514 return false;
515 }
516 } else {
517 Error("expect global/local name but get ");
518 return false;
519 }
520 return true;
521 }
522
CreateFuncMIRSymbol(PUIdx & puidx,GStrIdx strIdx)523 void MIRParser::CreateFuncMIRSymbol(PUIdx &puidx, GStrIdx strIdx)
524 {
525 MIRSymbol *funcSt = GlobalTables::GetGsymTable().CreateSymbol(kScopeGlobal);
526 funcSt->SetNameStrIdx(strIdx);
527 (void)GlobalTables::GetGsymTable().AddToStringSymbolMap(*funcSt);
528 funcSt->SetStorageClass(kScText);
529 funcSt->SetSKind(kStFunc);
530 funcSt->SetNeedForwDecl();
531 auto *fn = mod.GetMemPool()->New<MIRFunction>(&mod, funcSt->GetStIdx());
532 puidx = static_cast<PUIdx>(GlobalTables::GetFunctionTable().GetFuncTable().size());
533 fn->SetPuidx(puidx);
534 GlobalTables::GetFunctionTable().GetFuncTable().push_back(fn);
535 funcSt->SetFunction(fn);
536 if (options & kParseInlineFuncBody) {
537 funcSt->SetIsTmpUnused(true);
538 }
539 }
540
ParseDeclaredFunc(PUIdx & puidx)541 bool MIRParser::ParseDeclaredFunc(PUIdx &puidx)
542 {
543 GStrIdx stridx = GlobalTables::GetStrTable().GetStrIdxFromName(lexer.GetName());
544 if (stridx == 0u) {
545 stridx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(lexer.GetName());
546 }
547 StIdx stidx = GlobalTables::GetGsymTable().GetStIdxFromStrIdx(stridx);
548 if (stidx.FullIdx() == 0) {
549 CreateFuncMIRSymbol(puidx, stridx);
550 return true;
551 }
552 MIRSymbol *st = GlobalTables::GetGsymTable().GetSymbolFromStidx(stidx.Idx());
553 DEBUG_ASSERT(st != nullptr, "null ptr check");
554 if (st->GetSKind() != kStFunc) {
555 Error("function name not declared as function");
556 return false;
557 }
558 MIRFunction *func = st->GetFunction();
559 puidx = func->GetPuidx();
560 st->SetAppearsInCode(true);
561 return true;
562 }
563
ParseExprIreadIaddrof(IreadNode & expr)564 bool MIRParser::ParseExprIreadIaddrof(IreadNode &expr)
565 {
566 // syntax : iread/iaddrof <prim-type> <type> <field-id> (<addr-expr>)
567 if (!IsPrimitiveType(lexer.NextToken())) {
568 Error("expect primitive type but get ");
569 return false;
570 }
571 TyIdx tyidx(0);
572 if (!ParsePrimType(tyidx)) {
573 return false;
574 }
575 expr.SetPrimType(GlobalTables::GetTypeTable().GetPrimTypeFromTyIdx(tyidx));
576 tyidx = TyIdx(0);
577 expr.SetTyIdx(tyidx);
578 if (lexer.GetTokenKind() == TK_intconst) {
579 expr.SetFieldID(lexer.theIntVal);
580 lexer.NextToken();
581 }
582 BaseNode *opnd0 = nullptr;
583 if (!ParseExprOneOperand(opnd0)) {
584 return false;
585 }
586 expr.SetOpnd(opnd0, 0);
587 lexer.NextToken();
588 return true;
589 }
590
ParseIntrinsicId(IntrinsicopNode & intrnOpNode)591 bool MIRParser::ParseIntrinsicId(IntrinsicopNode &intrnOpNode)
592 {
593 MIRIntrinsicID intrinId = GetIntrinsicID(lexer.GetTokenKind());
594 if (intrinId <= INTRN_UNDEFINED || intrinId >= INTRN_LAST) {
595 Error("wrong intrinsic id ");
596 return false;
597 }
598 intrnOpNode.SetIntrinsic(intrinId);
599 return true;
600 }
601
ParseScalarValue(MIRConstPtr & stype,MIRType & type)602 bool MIRParser::ParseScalarValue(MIRConstPtr &stype, MIRType &type)
603 {
604 PrimType ptp = type.GetPrimType();
605 if (IsPrimitiveInteger(ptp) || IsPrimitiveDynType(ptp) || ptp == PTY_gen) {
606 if (lexer.GetTokenKind() != TK_intconst) {
607 Error("constant value incompatible with integer type at ");
608 return false;
609 }
610 stype = GlobalTables::GetIntConstTable().GetOrCreateIntConst(lexer.GetTheIntVal(), type);
611 } else if (ptp == PTY_f32) {
612 if (lexer.GetTokenKind() != TK_floatconst) {
613 Error("constant value incompatible with single-precision float type at ");
614 return false;
615 }
616 MIRFloatConst *fConst = GlobalTables::GetFpConstTable().GetOrCreateFloatConst(lexer.GetTheFloatVal());
617 stype = fConst;
618 } else if (ptp == PTY_f64) {
619 if (lexer.GetTokenKind() != TK_doubleconst && lexer.GetTokenKind() != TK_intconst) {
620 Error("constant value incompatible with double-precision float type at ");
621 return false;
622 }
623 MIRDoubleConst *dconst = GlobalTables::GetFpConstTable().GetOrCreateDoubleConst(lexer.GetTheDoubleVal());
624 stype = dconst;
625 } else {
626 return false;
627 }
628 return true;
629 }
630
SetSrcPos(SrcPosition & srcPosition,uint32 mplNum)631 void MIRParser::SetSrcPos(SrcPosition &srcPosition, uint32 mplNum)
632 {
633 srcPosition.SetFileNum(lastFileNum);
634 srcPosition.SetLineNum(lastLineNum);
635 srcPosition.SetColumn(lastColumnNum);
636 srcPosition.SetMplLineNum(mplNum);
637 }
638 } // namespace maple
639