28 NativeInlineSiteSymbol::NativeInlineSiteSymbol(
32 ParentAddr(ParentAddr) {}
46 if (
SS.kind() != DebugSubsectionKind::InlineeLines)
57 if (
Line.Header->Inlinee ==
Id)
79 if (InlineeType.
kind() == LF_MFUNC_ID) {
81 cantFail(TypeDeserializer::deserializeAs<MemberFuncIdRecord>(InlineeType,
86 }
else if (InlineeType.
kind() == LF_FUNC_ID) {
89 TypeDeserializer::deserializeAs<FuncIdRecord>(InlineeType, FRecord));
101 void NativeInlineSiteSymbol::getLineOffset(
uint32_t OffsetInFunc,
112 auto UpdateCodeOffset = [&](
uint32_t Delta) {
115 else if (!CodeOffsetEnd)
116 CodeOffsetEnd = *CodeOffsetBase + Delta;
118 auto UpdateLineOffset = [&](int32_t Delta) {
120 if (!CodeOffsetBase || !CurLineOffset)
121 CurLineOffset = LineOffset;
123 NextLineOffset = LineOffset;
125 auto UpdateFileOffset = [&](
uint32_t Offset) {
129 NextFileOffset = Offset;
131 auto ValidateAndReset = [&]() {
133 if (CodeOffsetBase && CodeOffsetEnd && CurLineOffset) {
134 if (CodeOffsetBase <= OffsetInFunc && OffsetInFunc < CodeOffsetEnd) {
135 LineOffset = *CurLineOffset;
140 FileOffset = *NextFileOffset;
141 if (NextLineOffset) {
142 CurLineOffset = NextLineOffset;
143 NextLineOffset =
None;
145 CodeOffsetBase = CodeOffsetEnd;
146 CodeOffsetEnd = NextFileOffset =
None;
151 switch (Annot.OpCode) {
152 case BinaryAnnotationsOpCode::CodeOffset:
153 case BinaryAnnotationsOpCode::ChangeCodeOffset:
154 case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:
156 UpdateCodeOffset(Annot.U1);
158 case BinaryAnnotationsOpCode::ChangeCodeLength:
159 UpdateCodeOffset(Annot.U1);
161 case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset:
163 UpdateCodeOffset(Annot.U2);
164 UpdateCodeOffset(Annot.U1);
166 case BinaryAnnotationsOpCode::ChangeLineOffset:
167 UpdateLineOffset(Annot.S1);
169 case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset:
171 UpdateCodeOffset(Annot.U1);
172 UpdateLineOffset(Annot.S1);
174 case BinaryAnnotationsOpCode::ChangeFile:
175 UpdateFileOffset(Annot.U1);
181 if (ValidateAndReset())
186 std::unique_ptr<IPDBEnumLineNumbers>
200 ModS->findChecksumsSubsection();
209 getLineOffset(VA - ParentAddr, SrcLineOffset, SrcFileOffset);
221 (SrcFileOffset == 0) ?
Inlinee->Header->FileID : SrcFileOffset;
223 auto ChecksumIter = Checksums->getArray().at(FileChecksumOffset);
232 std::vector<NativeLineNumber>
Lines{LineNum};