• 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 #ifndef MAPLE_IR_INCLUDE_SRC_POSITION_H
17 #define MAPLE_IR_INCLUDE_SRC_POSITION_H
18 #include "mpl_logging.h"
19 
20 namespace maple {
21 // to store source position information
22 class SrcPosition {
23 public:
SrcPosition()24     SrcPosition() : lineNum(0), mplLineNum(0)
25     {
26         u.word0 = 0;
27     }
28 
29     virtual ~SrcPosition() = default;
30 
RawData()31     uint32 RawData() const
32     {
33         return u.word0;
34     }
35 
FileNum()36     uint32 FileNum() const
37     {
38         return u.fileColumn.fileNum;
39     }
40 
Column()41     uint32 Column() const
42     {
43         return u.fileColumn.column;
44     }
45 
LineNum()46     uint32 LineNum() const
47     {
48         return lineNum;
49     }
50 
MplLineNum()51     uint32 MplLineNum() const
52     {
53         return mplLineNum;
54     }
55 
SetFileNum(uint16 n)56     void SetFileNum(uint16 n)
57     {
58         u.fileColumn.fileNum = n;
59     }
60 
SetColumn(uint16 n)61     void SetColumn(uint16 n)
62     {
63         u.fileColumn.column = n;
64     }
65 
SetLineNum(uint32 n)66     void SetLineNum(uint32 n)
67     {
68         lineNum = n;
69     }
70 
SetRawData(uint32 n)71     void SetRawData(uint32 n)
72     {
73         u.word0 = n;
74     }
75 
SetMplLineNum(uint32 n)76     void SetMplLineNum(uint32 n)
77     {
78         mplLineNum = n;
79     }
80 
CondSetLineNum(uint32 n)81     void CondSetLineNum(uint32 n)
82     {
83         lineNum = lineNum ? lineNum : n;
84     }
85 
CondSetFileNum(uint16 n)86     void CondSetFileNum(uint16 n)
87     {
88         uint16 i = u.fileColumn.fileNum;
89         u.fileColumn.fileNum = i ? i : n;
90     }
91 
92     // as you read: this->IsBfOrEq(pos)
IsBfOrEq(SrcPosition pos)93     bool IsBfOrEq(SrcPosition pos) const
94     {
95         return (pos.FileNum() == FileNum() &&
96                 ((LineNum() < pos.LineNum()) || ((LineNum() == pos.LineNum()) && (Column() <= pos.Column()))));
97     }
98 
IsSrcPostionEq(SrcPosition pos)99     bool IsSrcPostionEq(SrcPosition pos) const
100     {
101         return FileNum() == pos.FileNum() && LineNum() == pos.LineNum() && Column() == pos.Column();
102     }
103 
DumpLoc(uint32 & lastLineNum,uint16 & lastColumnNum)104     void DumpLoc(uint32 &lastLineNum, uint16 &lastColumnNum) const
105     {
106         if (FileNum() != 0 && LineNum() != 0) {
107             if (Column() != 0 && (LineNum() != lastLineNum || Column() != lastColumnNum)) {
108                 DumpLocWithCol();
109                 lastLineNum = LineNum();
110                 lastColumnNum = Column();
111             } else if (LineNum() != lastLineNum) {
112                 DumpLocWithLine();
113                 lastLineNum = LineNum();
114             }
115         }
116     }
117 
DumpLocWithLine()118     void DumpLocWithLine() const
119     {
120         LogInfo::MapleLogger() << "LOC " << FileNum() << " " << LineNum() << '\n';
121     }
122 
DumpLocWithCol()123     void DumpLocWithCol() const
124     {
125         LogInfo::MapleLogger() << "LOC " << FileNum() << " " << LineNum() << " " << Column() << '\n';
126     }
127 
DumpLocWithColToString()128     std::string DumpLocWithColToString() const
129     {
130         std::stringstream ss;
131         ss << "LOC " << FileNum() << " " << LineNum() << " " << Column();
132         return ss.str();
133     }
134 
135 private:
136     union {
137         struct {
138             uint16 fileNum;
139             uint16 column : 12;
140             uint16 stmtBegin : 1;
141             uint16 bbBegin : 1;
142             uint16 unused : 2;
143         } fileColumn;
144         uint32 word0;
145     } u;
146     uint32 lineNum;
147     uint32 mplLineNum;  // line number of mpl file
148 };
149 }  // namespace maple
150 #endif  // MAPLE_IR_INCLUDE_SRC_POSITION_H
151