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