LLVM: lib/DebugInfo/PDB/Native/NativeInlineSiteSymbol.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

10

23

24using namespace llvm;

27

32 ParentAddr(ParentAddr) {}

33

35

42

43static std::optional

47 continue;

48

53 continue;

54 }

55

57 if (Line.Header->Inlinee == Id)

59 }

60 return std::nullopt;

61}

62

64 auto Tpi = Session.getPDBFile().getPDBTpiStream();

65 if (!Tpi) {

67 return "";

68 }

69 auto Ipi = Session.getPDBFile().getPDBIpiStream();

70 if (!Ipi) {

72 return "";

73 }

74

79 if (InlineeType.kind() == LF_MFUNC_ID) {

82 MFRecord));

84 QualifiedName.append(std::string(Types.getTypeName(ClassTy)));

86 } else if (InlineeType.kind() == LF_FUNC_ID) {

94 }

95 }

96

99}

100

101void NativeInlineSiteSymbol::getLineOffset(uint32_t OffsetInFunc,

103 uint32_t &FileOffset) const {

104 LineOffset = 0;

105 FileOffset = 0;

107 std::optional<uint32_t> CodeOffsetBase;

108 std::optional<uint32_t> CodeOffsetEnd;

109 std::optional<int32_t> CurLineOffset;

110 std::optional<int32_t> NextLineOffset;

111 std::optional<uint32_t> NextFileOffset;

112 auto UpdateCodeOffset = [&](uint32_t Delta) {

113 if (!CodeOffsetBase)

115 else if (!CodeOffsetEnd)

116 CodeOffsetEnd = *CodeOffsetBase + Delta;

117 };

118 auto UpdateLineOffset = [&](int32_t Delta) {

119 LineOffset += Delta;

120 if (!CodeOffsetBase || !CurLineOffset)

121 CurLineOffset = LineOffset;

122 else

123 NextLineOffset = LineOffset;

124 };

126 if (!CodeOffsetBase)

128 else

129 NextFileOffset = Offset;

130 };

131 auto ValidateAndReset = [&]() {

132

133 if (CodeOffsetBase && CodeOffsetEnd && CurLineOffset) {

134 if (CodeOffsetBase <= OffsetInFunc && OffsetInFunc < CodeOffsetEnd) {

135 LineOffset = *CurLineOffset;

136 return true;

137 }

138

139 if (NextFileOffset)

140 FileOffset = *NextFileOffset;

141 if (NextLineOffset) {

142 CurLineOffset = NextLineOffset;

143 NextLineOffset = std::nullopt;

144 }

145 CodeOffsetBase = CodeOffsetEnd;

146 CodeOffsetEnd = NextFileOffset = std::nullopt;

147 }

148 return false;

149 };

150 for (const auto &Annot : Sym.annotations()) {

151 switch (Annot.OpCode) {

152 case BinaryAnnotationsOpCode::CodeOffset:

153 case BinaryAnnotationsOpCode::ChangeCodeOffset:

154 case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:

156 UpdateCodeOffset(Annot.U1);

157 break;

158 case BinaryAnnotationsOpCode::ChangeCodeLength:

159 UpdateCodeOffset(Annot.U1);

160 break;

161 case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset:

163 UpdateCodeOffset(Annot.U2);

164 UpdateCodeOffset(Annot.U1);

165 break;

166 case BinaryAnnotationsOpCode::ChangeLineOffset:

167 UpdateLineOffset(Annot.S1);

168 break;

169 case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset:

171 UpdateCodeOffset(Annot.U1);

172 UpdateLineOffset(Annot.S1);

173 break;

174 case BinaryAnnotationsOpCode::ChangeFile:

175 UpdateFileOffset(Annot.U1);

176 break;

177 default:

178 break;

179 }

180

181 if (ValidateAndReset())

182 return;

183 }

184}

185

186std::unique_ptr

190 if (Session.moduleIndexForVA(VA, Modi))

191 return nullptr;

192

194 if (!ModS) {

196 return nullptr;

197 }

198

200 ModS->findChecksumsSubsection();

201 if (!Checksums) {

203 return nullptr;

204 }

205

206

209 getLineOffset(VA - ParentAddr, SrcLineOffset, SrcFileOffset);

210

211

212 std::optional Inlinee =

214

216 return nullptr;

217

218 uint32_t SrcLine = Inlinee->Header->SourceLineNum + SrcLineOffset;

219 uint32_t SrcCol = 0;

220 uint32_t FileChecksumOffset =

221 (SrcFileOffset == 0) ? Inlinee->Header->FileID : SrcFileOffset;

222

223 auto ChecksumIter = Checksums->getArray().at(FileChecksumOffset);

225 Session.getSymbolCache().getOrCreateSourceFile(*ChecksumIter);

226

228 Session.addressForVA(VA, LineSect, LineOff);

230 SrcFileId, Modi);

231 auto SrcFile = Session.getSymbolCache().getSourceFileById(SrcFileId);

232 std::vector Lines{LineNum};

233

234 return std::make_unique(std::move(Lines));

235}

static std::optional< InlineeSourceLine > findInlineeByTypeIndex(TypeIndex Id, ModuleDebugStreamRef &ModS)

Definition NativeInlineSiteSymbol.cpp:44

Provides read only access to a subclass of BinaryStream.

Tagged union holding either a T or a Error.

Error takeError()

Take ownership of the stored error.

reference get()

Returns a reference to the stored T value.

TypeIndex getParentScope() const

Provides amortized O(1) random access to a CodeView type stream.

CVType getType(TypeIndex Index) override

StringRef getTypeName(TypeIndex Index) override

TypeIndex getClassType() const

static Error deserializeAs(CVType &CVT, T &Record)

codeview::DebugSubsectionArray getSubsectionsArray() const

std::unique_ptr< IPDBEnumLineNumbers > findInlineeLinesByVA(uint64_t VA, uint32_t Length) const override

Definition NativeInlineSiteSymbol.cpp:187

NativeInlineSiteSymbol(NativeSession &Session, SymIndexId Id, const codeview::InlineSiteSym &Sym, uint64_t ParentAddr)

Definition NativeInlineSiteSymbol.cpp:28

std::string getName() const override

Definition NativeInlineSiteSymbol.cpp:63

void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, PdbSymbolIdField RecurseIdFields) const override

Definition NativeInlineSiteSymbol.cpp:36

~NativeInlineSiteSymbol() override

NativeRawSymbol(NativeSession &PDBSession, PDB_SymType Tag, SymIndexId SymbolId)

void dump(raw_ostream &OS, int Indent, PdbSymbolIdField ShowIdFields, PdbSymbolIdField RecurseIdFields) const override

This class implements an extremely fast bulk output stream that can only output to a stream.

CVRecord< TypeLeafKind > CVType

void dumpSymbolField(raw_ostream &OS, StringRef Name, T Value, int Indent)

PDB_SymType

These values correspond to the SymTagEnum enumeration, and are documented here: https://msdn....

This is an optimization pass for GlobalISel generic memory operations.

void cantFail(Error Err, const char *Msg=nullptr)

Report a fatal error if Err is a failure value.

void consumeError(Error Err)

Consume a Error without doing anything.