• 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_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