blob: 423845caeb3175070c8ef9729b8b4491c973194a [file] [log] [blame]
Zachary Turner7120a472016-06-06 20:37:05 +00001//===- PdbYAML.h ---------------------------------------------- *- C++ --*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
11#define LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
12
13#include "OutputStyle.h"
14
15#include "llvm/ADT/Optional.h"
Zachary Turner3b147642016-10-08 01:12:01 +000016#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
17#include "llvm/DebugInfo/CodeView/TypeRecord.h"
Zachary Turnera3225b02016-07-29 20:56:36 +000018#include "llvm/DebugInfo/MSF/MSFCommon.h"
Adrian McCarthy6b6b8c42017-01-25 22:38:55 +000019#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
20#include "llvm/DebugInfo/PDB/Native/RawConstants.h"
Zachary Turner8848a7a2016-07-06 18:05:57 +000021#include "llvm/DebugInfo/PDB/PDBTypes.h"
Zachary Turner7120a472016-06-06 20:37:05 +000022#include "llvm/Support/Endian.h"
23#include "llvm/Support/YAMLTraits.h"
24
25#include <vector>
26
27namespace llvm {
28namespace pdb {
Zachary Turner7120a472016-06-06 20:37:05 +000029
30namespace yaml {
Zachary Turnerc6d54da2016-09-09 17:46:17 +000031struct SerializationContext;
32
Zachary Turnera3225b02016-07-29 20:56:36 +000033struct MSFHeaders {
Zachary Turnerfaa554b2016-07-15 22:16:56 +000034 msf::SuperBlock SuperBlock;
Zachary Turnerea4e6072017-03-15 22:18:53 +000035 uint32_t NumDirectoryBlocks = 0;
Zachary Turnerfaa554b2016-07-15 22:16:56 +000036 std::vector<uint32_t> DirectoryBlocks;
Zachary Turnerea4e6072017-03-15 22:18:53 +000037 uint32_t NumStreams = 0;
38 uint32_t FileSize = 0;
Zachary Turner7120a472016-06-06 20:37:05 +000039};
40
Zachary Turner1dc9fd32016-06-14 20:48:36 +000041struct StreamBlockList {
Zachary Turnerfaa554b2016-07-15 22:16:56 +000042 std::vector<uint32_t> Blocks;
Zachary Turner25e8b052016-06-06 20:37:17 +000043};
44
Zachary Turner5e534c72016-07-15 22:17:08 +000045struct NamedStreamMapping {
46 StringRef StreamName;
47 uint32_t StreamNumber;
48};
49
Zachary Turner8848a7a2016-07-06 18:05:57 +000050struct PdbInfoStream {
Zachary Turnerea4e6072017-03-15 22:18:53 +000051 PdbRaw_ImplVer Version = PdbImplVC70;
52 uint32_t Signature = 0;
53 uint32_t Age = 1;
Zachary Turner8848a7a2016-07-06 18:05:57 +000054 PDB_UniqueId Guid;
Zachary Turner05d5e612017-03-16 20:19:11 +000055 std::vector<PdbRaw_FeatureSig> Features;
Zachary Turner5e534c72016-07-15 22:17:08 +000056 std::vector<NamedStreamMapping> NamedStreams;
Zachary Turner8848a7a2016-07-06 18:05:57 +000057};
58
Zachary Turner3b147642016-10-08 01:12:01 +000059struct PdbSymbolRecord {
60 codeview::CVSymbol Record;
61};
62
63struct PdbModiStream {
64 uint32_t Signature;
65 std::vector<PdbSymbolRecord> Symbols;
66};
67
Zachary Turneree3b9c22017-04-25 20:22:02 +000068struct PdbSourceLineEntry {
69 uint32_t Offset;
70 uint32_t LineStart;
71 uint32_t EndDelta;
72 bool IsStatement;
73};
74
75struct PdbSourceColumnEntry {
76 uint16_t StartColumn;
77 uint16_t EndColumn;
78};
79
80struct PdbSourceLineBlock {
81 StringRef FileName;
82 std::vector<PdbSourceLineEntry> Lines;
83 std::vector<PdbSourceColumnEntry> Columns;
84};
85
86struct HexFormattedString {
87 std::vector<uint8_t> Bytes;
88};
89
90struct PdbSourceFileChecksumEntry {
91 StringRef FileName;
92 codeview::FileChecksumKind Kind;
93 HexFormattedString ChecksumBytes;
94};
95
96struct PdbSourceLineInfo {
97 uint32_t RelocOffset;
98 uint32_t RelocSegment;
99 codeview::LineFlags Flags;
100 uint32_t CodeSize;
101
Zachary Turner5b6e4e02017-04-29 01:13:21 +0000102 std::vector<PdbSourceLineBlock> Blocks;
Zachary Turneree3b9c22017-04-25 20:22:02 +0000103};
104
Zachary Turneredef1452017-05-02 16:56:09 +0000105struct PdbInlineeSite {
106 codeview::TypeIndex Inlinee;
107 StringRef FileName;
108 uint32_t SourceLineNum;
109 std::vector<StringRef> ExtraFiles;
110};
111
112struct PdbInlineeInfo {
113 bool HasExtraFiles;
114 std::vector<PdbInlineeSite> Sites;
115};
116
Zachary Turneree3b9c22017-04-25 20:22:02 +0000117struct PdbSourceFileInfo {
Zachary Turneree3b9c22017-04-25 20:22:02 +0000118 std::vector<PdbSourceFileChecksumEntry> FileChecksums;
Zachary Turner5b6e4e02017-04-29 01:13:21 +0000119 std::vector<PdbSourceLineInfo> LineFragments;
Zachary Turneredef1452017-05-02 16:56:09 +0000120 std::vector<PdbInlineeInfo> Inlinees;
Zachary Turneree3b9c22017-04-25 20:22:02 +0000121};
122
Zachary Turnerd218c262016-07-22 15:46:37 +0000123struct PdbDbiModuleInfo {
124 StringRef Obj;
125 StringRef Mod;
126 std::vector<StringRef> SourceFiles;
Zachary Turneree3b9c22017-04-25 20:22:02 +0000127 Optional<PdbSourceFileInfo> FileLineInfo;
Zachary Turner3b147642016-10-08 01:12:01 +0000128 Optional<PdbModiStream> Modi;
Zachary Turnerd218c262016-07-22 15:46:37 +0000129};
130
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000131struct PdbDbiStream {
Zachary Turnerea4e6072017-03-15 22:18:53 +0000132 PdbRaw_DbiVer VerHeader = PdbDbiV70;
133 uint32_t Age = 1;
134 uint16_t BuildNumber = 0;
135 uint32_t PdbDllVersion = 0;
136 uint16_t PdbDllRbld = 0;
137 uint16_t Flags = 1;
138 PDB_Machine MachineType = PDB_Machine::x86;
Zachary Turnerd218c262016-07-22 15:46:37 +0000139
140 std::vector<PdbDbiModuleInfo> ModInfos;
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000141};
142
Zachary Turnerac5763e2016-08-18 16:49:29 +0000143struct PdbTpiRecord {
Zachary Turnerac5763e2016-08-18 16:49:29 +0000144 codeview::CVType Record;
145};
146
Zachary Turnerc67b00c2016-09-14 23:00:16 +0000147struct PdbTpiFieldListRecord {
148 codeview::CVMemberRecord Record;
149};
150
Zachary Turnerac5763e2016-08-18 16:49:29 +0000151struct PdbTpiStream {
Zachary Turnerea4e6072017-03-15 22:18:53 +0000152 PdbRaw_TpiVer Version = PdbTpiV80;
Zachary Turnerac5763e2016-08-18 16:49:29 +0000153 std::vector<PdbTpiRecord> Records;
154};
155
Zachary Turner7120a472016-06-06 20:37:05 +0000156struct PdbObject {
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000157 explicit PdbObject(BumpPtrAllocator &Allocator) : Allocator(Allocator) {}
158
Zachary Turnera3225b02016-07-29 20:56:36 +0000159 Optional<MSFHeaders> Headers;
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000160 Optional<std::vector<uint32_t>> StreamSizes;
Zachary Turner1dc9fd32016-06-14 20:48:36 +0000161 Optional<std::vector<StreamBlockList>> StreamMap;
Zachary Turner8848a7a2016-07-06 18:05:57 +0000162 Optional<PdbInfoStream> PdbStream;
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000163 Optional<PdbDbiStream> DbiStream;
Zachary Turnerac5763e2016-08-18 16:49:29 +0000164 Optional<PdbTpiStream> TpiStream;
Zachary Turnerde9ba152016-09-15 18:22:31 +0000165 Optional<PdbTpiStream> IpiStream;
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000166
Zachary Turner760ad4d2017-01-20 22:42:09 +0000167 Optional<std::vector<StringRef>> StringTable;
168
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000169 BumpPtrAllocator &Allocator;
Zachary Turner7120a472016-06-06 20:37:05 +0000170};
171}
172}
Zachary Turner25e8b052016-06-06 20:37:17 +0000173}
Zachary Turner7120a472016-06-06 20:37:05 +0000174
Zachary Turner25e8b052016-06-06 20:37:17 +0000175namespace llvm {
Zachary Turner7120a472016-06-06 20:37:05 +0000176namespace yaml {
Zachary Turner1dc9fd32016-06-14 20:48:36 +0000177
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000178template <> struct MappingTraits<pdb::yaml::PdbObject> {
179 static void mapping(IO &IO, pdb::yaml::PdbObject &Obj);
180};
181
Zachary Turnera3225b02016-07-29 20:56:36 +0000182template <> struct MappingTraits<pdb::yaml::MSFHeaders> {
183 static void mapping(IO &IO, pdb::yaml::MSFHeaders &Obj);
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000184};
185
Zachary Turnerbac69d32016-07-22 19:56:05 +0000186template <> struct MappingTraits<msf::SuperBlock> {
187 static void mapping(IO &IO, msf::SuperBlock &SB);
Zachary Turner25e8b052016-06-06 20:37:17 +0000188};
189
Zachary Turner1dc9fd32016-06-14 20:48:36 +0000190template <> struct MappingTraits<pdb::yaml::StreamBlockList> {
191 static void mapping(IO &IO, pdb::yaml::StreamBlockList &SB);
Zachary Turner25e8b052016-06-06 20:37:17 +0000192};
193
Zachary Turner8848a7a2016-07-06 18:05:57 +0000194template <> struct MappingTraits<pdb::yaml::PdbInfoStream> {
195 static void mapping(IO &IO, pdb::yaml::PdbInfoStream &Obj);
196};
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000197
Zachary Turner407dec52017-03-13 14:57:45 +0000198template <> struct MappingContextTraits<pdb::yaml::PdbDbiStream, pdb::yaml::SerializationContext> {
199 static void mapping(IO &IO, pdb::yaml::PdbDbiStream &Obj, pdb::yaml::SerializationContext &Context);
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000200};
Zachary Turner5e534c72016-07-15 22:17:08 +0000201
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000202template <>
Zachary Turner407dec52017-03-13 14:57:45 +0000203struct MappingContextTraits<pdb::yaml::PdbTpiStream, pdb::yaml::SerializationContext> {
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000204 static void mapping(IO &IO, pdb::yaml::PdbTpiStream &Obj,
Zachary Turner407dec52017-03-13 14:57:45 +0000205 pdb::yaml::SerializationContext &Context);
Zachary Turnerac5763e2016-08-18 16:49:29 +0000206};
207
Zachary Turner5e534c72016-07-15 22:17:08 +0000208template <> struct MappingTraits<pdb::yaml::NamedStreamMapping> {
209 static void mapping(IO &IO, pdb::yaml::NamedStreamMapping &Obj);
210};
Zachary Turnerd218c262016-07-22 15:46:37 +0000211
Zachary Turner407dec52017-03-13 14:57:45 +0000212template <> struct MappingContextTraits<pdb::yaml::PdbSymbolRecord, pdb::yaml::SerializationContext> {
213 static void mapping(IO &IO, pdb::yaml::PdbSymbolRecord &Obj, pdb::yaml::SerializationContext &Context);
Zachary Turner3b147642016-10-08 01:12:01 +0000214};
215
Zachary Turner407dec52017-03-13 14:57:45 +0000216template <> struct MappingContextTraits<pdb::yaml::PdbModiStream, pdb::yaml::SerializationContext> {
217 static void mapping(IO &IO, pdb::yaml::PdbModiStream &Obj, pdb::yaml::SerializationContext &Context);
Zachary Turner3b147642016-10-08 01:12:01 +0000218};
219
Zachary Turner407dec52017-03-13 14:57:45 +0000220template <> struct MappingContextTraits<pdb::yaml::PdbDbiModuleInfo, pdb::yaml::SerializationContext> {
221 static void mapping(IO &IO, pdb::yaml::PdbDbiModuleInfo &Obj, pdb::yaml::SerializationContext &Context);
Zachary Turnerd218c262016-07-22 15:46:37 +0000222};
Zachary Turner7120a472016-06-06 20:37:05 +0000223
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000224template <>
Zachary Turneree3b9c22017-04-25 20:22:02 +0000225struct MappingContextTraits<pdb::yaml::PdbSourceLineEntry,
226 pdb::yaml::SerializationContext> {
227 static void mapping(IO &IO, pdb::yaml::PdbSourceLineEntry &Obj,
228 pdb::yaml::SerializationContext &Context);
229};
230
231template <>
232struct MappingContextTraits<pdb::yaml::PdbSourceColumnEntry,
233 pdb::yaml::SerializationContext> {
234 static void mapping(IO &IO, pdb::yaml::PdbSourceColumnEntry &Obj,
235 pdb::yaml::SerializationContext &Context);
236};
237
238template <>
239struct MappingContextTraits<pdb::yaml::PdbSourceLineBlock,
240 pdb::yaml::SerializationContext> {
241 static void mapping(IO &IO, pdb::yaml::PdbSourceLineBlock &Obj,
242 pdb::yaml::SerializationContext &Context);
243};
244
245template <>
246struct MappingContextTraits<pdb::yaml::PdbSourceFileChecksumEntry,
247 pdb::yaml::SerializationContext> {
248 static void mapping(IO &IO, pdb::yaml::PdbSourceFileChecksumEntry &Obj,
249 pdb::yaml::SerializationContext &Context);
250};
251
252template <> struct ScalarTraits<pdb::yaml::HexFormattedString> {
253 static void output(const pdb::yaml::HexFormattedString &Value, void *ctx,
254 llvm::raw_ostream &Out);
255 static StringRef input(StringRef Scalar, void *ctxt,
256 pdb::yaml::HexFormattedString &Value);
257 static bool mustQuote(StringRef) { return false; }
258};
259
260template <>
261struct MappingContextTraits<pdb::yaml::PdbSourceLineInfo,
262 pdb::yaml::SerializationContext> {
263 static void mapping(IO &IO, pdb::yaml::PdbSourceLineInfo &Obj,
264 pdb::yaml::SerializationContext &Context);
265};
266
267template <>
268struct MappingContextTraits<pdb::yaml::PdbSourceFileInfo,
269 pdb::yaml::SerializationContext> {
270 static void mapping(IO &IO, pdb::yaml::PdbSourceFileInfo &Obj,
271 pdb::yaml::SerializationContext &Context);
272};
273
274template <>
Zachary Turneredef1452017-05-02 16:56:09 +0000275struct MappingContextTraits<pdb::yaml::PdbInlineeInfo,
276 pdb::yaml::SerializationContext> {
277 static void mapping(IO &IO, pdb::yaml::PdbInlineeInfo &Obj,
278 pdb::yaml::SerializationContext &Context);
279};
280
281template <>
282struct MappingContextTraits<pdb::yaml::PdbInlineeSite,
283 pdb::yaml::SerializationContext> {
284 static void mapping(IO &IO, pdb::yaml::PdbInlineeSite &Obj,
285 pdb::yaml::SerializationContext &Context);
286};
287
288template <>
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000289struct MappingContextTraits<pdb::yaml::PdbTpiRecord,
290 pdb::yaml::SerializationContext> {
291 static void mapping(IO &IO, pdb::yaml::PdbTpiRecord &Obj,
292 pdb::yaml::SerializationContext &Context);
Zachary Turnerac5763e2016-08-18 16:49:29 +0000293};
294}
295}
Zachary Turner7120a472016-06-06 20:37:05 +0000296
297#endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H