1 //===- PdbYAML.h ---------------------------------------------- *- C++ --*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
11 #define LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
13 #include "OutputStyle.h"
15 #include "llvm/ADT/Optional.h"
16 #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
17 #include "llvm/DebugInfo/CodeView/TypeRecord.h"
18 #include "llvm/DebugInfo/MSF/MSFCommon.h"
19 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
20 #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
21 #include "llvm/DebugInfo/PDB/PDBTypes.h"
22 #include "llvm/Support/Endian.h"
23 #include "llvm/Support/YAMLTraits.h"
31 struct SerializationContext;
34 msf::SuperBlock SuperBlock;
35 uint32_t NumDirectoryBlocks = 0;
36 std::vector<uint32_t> DirectoryBlocks;
37 uint32_t NumStreams = 0;
38 uint32_t FileSize = 0;
41 struct StreamBlockList {
42 std::vector<uint32_t> Blocks;
45 struct NamedStreamMapping {
47 uint32_t StreamNumber;
50 struct PdbInfoStream {
51 PdbRaw_ImplVer Version = PdbImplVC70;
52 uint32_t Signature = 0;
55 std::vector<PdbRaw_FeatureSig> Features;
56 std::vector<NamedStreamMapping> NamedStreams;
59 struct PdbSymbolRecord {
60 codeview::CVSymbol Record;
63 struct PdbModiStream {
65 std::vector<PdbSymbolRecord> Symbols;
68 struct PdbSourceLineEntry {
75 struct PdbSourceColumnEntry {
80 struct PdbSourceLineBlock {
82 std::vector<PdbSourceLineEntry> Lines;
83 std::vector<PdbSourceColumnEntry> Columns;
86 struct HexFormattedString {
87 std::vector<uint8_t> Bytes;
90 struct PdbSourceFileChecksumEntry {
92 codeview::FileChecksumKind Kind;
93 HexFormattedString ChecksumBytes;
96 struct PdbSourceLineInfo {
98 uint32_t RelocSegment;
99 codeview::LineFlags Flags;
102 std::vector<PdbSourceLineBlock> Blocks;
105 struct PdbInlineeSite {
106 codeview::TypeIndex Inlinee;
108 uint32_t SourceLineNum;
109 std::vector<StringRef> ExtraFiles;
112 struct PdbInlineeInfo {
114 std::vector<PdbInlineeSite> Sites;
117 struct PdbSourceFileInfo {
118 std::vector<PdbSourceFileChecksumEntry> FileChecksums;
119 std::vector<PdbSourceLineInfo> LineFragments;
120 std::vector<PdbInlineeInfo> Inlinees;
123 struct PdbDbiModuleInfo {
126 std::vector<StringRef> SourceFiles;
127 Optional<PdbSourceFileInfo> FileLineInfo;
128 Optional<PdbModiStream> Modi;
131 struct PdbDbiStream {
132 PdbRaw_DbiVer VerHeader = PdbDbiV70;
134 uint16_t BuildNumber = 0;
135 uint32_t PdbDllVersion = 0;
136 uint16_t PdbDllRbld = 0;
138 PDB_Machine MachineType = PDB_Machine::x86;
140 std::vector<PdbDbiModuleInfo> ModInfos;
143 struct PdbTpiRecord {
144 codeview::CVType Record;
147 struct PdbTpiFieldListRecord {
148 codeview::CVMemberRecord Record;
151 struct PdbTpiStream {
152 PdbRaw_TpiVer Version = PdbTpiV80;
153 std::vector<PdbTpiRecord> Records;
157 explicit PdbObject(BumpPtrAllocator &Allocator) : Allocator(Allocator) {}
159 Optional<MSFHeaders> Headers;
160 Optional<std::vector<uint32_t>> StreamSizes;
161 Optional<std::vector<StreamBlockList>> StreamMap;
162 Optional<PdbInfoStream> PdbStream;
163 Optional<PdbDbiStream> DbiStream;
164 Optional<PdbTpiStream> TpiStream;
165 Optional<PdbTpiStream> IpiStream;
167 Optional<std::vector<StringRef>> StringTable;
169 BumpPtrAllocator &Allocator;
178 template <> struct MappingTraits<pdb::yaml::PdbObject> {
179 static void mapping(IO &IO, pdb::yaml::PdbObject &Obj);
182 template <> struct MappingTraits<pdb::yaml::MSFHeaders> {
183 static void mapping(IO &IO, pdb::yaml::MSFHeaders &Obj);
186 template <> struct MappingTraits<msf::SuperBlock> {
187 static void mapping(IO &IO, msf::SuperBlock &SB);
190 template <> struct MappingTraits<pdb::yaml::StreamBlockList> {
191 static void mapping(IO &IO, pdb::yaml::StreamBlockList &SB);
194 template <> struct MappingTraits<pdb::yaml::PdbInfoStream> {
195 static void mapping(IO &IO, pdb::yaml::PdbInfoStream &Obj);
198 template <> struct MappingContextTraits<pdb::yaml::PdbDbiStream, pdb::yaml::SerializationContext> {
199 static void mapping(IO &IO, pdb::yaml::PdbDbiStream &Obj, pdb::yaml::SerializationContext &Context);
203 struct MappingContextTraits<pdb::yaml::PdbTpiStream, pdb::yaml::SerializationContext> {
204 static void mapping(IO &IO, pdb::yaml::PdbTpiStream &Obj,
205 pdb::yaml::SerializationContext &Context);
208 template <> struct MappingTraits<pdb::yaml::NamedStreamMapping> {
209 static void mapping(IO &IO, pdb::yaml::NamedStreamMapping &Obj);
212 template <> struct MappingContextTraits<pdb::yaml::PdbSymbolRecord, pdb::yaml::SerializationContext> {
213 static void mapping(IO &IO, pdb::yaml::PdbSymbolRecord &Obj, pdb::yaml::SerializationContext &Context);
216 template <> struct MappingContextTraits<pdb::yaml::PdbModiStream, pdb::yaml::SerializationContext> {
217 static void mapping(IO &IO, pdb::yaml::PdbModiStream &Obj, pdb::yaml::SerializationContext &Context);
220 template <> struct MappingContextTraits<pdb::yaml::PdbDbiModuleInfo, pdb::yaml::SerializationContext> {
221 static void mapping(IO &IO, pdb::yaml::PdbDbiModuleInfo &Obj, pdb::yaml::SerializationContext &Context);
225 struct MappingContextTraits<pdb::yaml::PdbSourceLineEntry,
226 pdb::yaml::SerializationContext> {
227 static void mapping(IO &IO, pdb::yaml::PdbSourceLineEntry &Obj,
228 pdb::yaml::SerializationContext &Context);
232 struct MappingContextTraits<pdb::yaml::PdbSourceColumnEntry,
233 pdb::yaml::SerializationContext> {
234 static void mapping(IO &IO, pdb::yaml::PdbSourceColumnEntry &Obj,
235 pdb::yaml::SerializationContext &Context);
239 struct MappingContextTraits<pdb::yaml::PdbSourceLineBlock,
240 pdb::yaml::SerializationContext> {
241 static void mapping(IO &IO, pdb::yaml::PdbSourceLineBlock &Obj,
242 pdb::yaml::SerializationContext &Context);
246 struct MappingContextTraits<pdb::yaml::PdbSourceFileChecksumEntry,
247 pdb::yaml::SerializationContext> {
248 static void mapping(IO &IO, pdb::yaml::PdbSourceFileChecksumEntry &Obj,
249 pdb::yaml::SerializationContext &Context);
252 template <> 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; }
261 struct MappingContextTraits<pdb::yaml::PdbSourceLineInfo,
262 pdb::yaml::SerializationContext> {
263 static void mapping(IO &IO, pdb::yaml::PdbSourceLineInfo &Obj,
264 pdb::yaml::SerializationContext &Context);
268 struct MappingContextTraits<pdb::yaml::PdbSourceFileInfo,
269 pdb::yaml::SerializationContext> {
270 static void mapping(IO &IO, pdb::yaml::PdbSourceFileInfo &Obj,
271 pdb::yaml::SerializationContext &Context);
275 struct MappingContextTraits<pdb::yaml::PdbInlineeInfo,
276 pdb::yaml::SerializationContext> {
277 static void mapping(IO &IO, pdb::yaml::PdbInlineeInfo &Obj,
278 pdb::yaml::SerializationContext &Context);
282 struct MappingContextTraits<pdb::yaml::PdbInlineeSite,
283 pdb::yaml::SerializationContext> {
284 static void mapping(IO &IO, pdb::yaml::PdbInlineeSite &Obj,
285 pdb::yaml::SerializationContext &Context);
289 struct MappingContextTraits<pdb::yaml::PdbTpiRecord,
290 pdb::yaml::SerializationContext> {
291 static void mapping(IO &IO, pdb::yaml::PdbTpiRecord &Obj,
292 pdb::yaml::SerializationContext &Context);
297 #endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H