blob: 398186f16d723a36b68eb78e5762835f32d78b6b [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"
Zachary Turner8848a7a2016-07-06 18:05:57 +000019#include "llvm/DebugInfo/PDB/PDBTypes.h"
Zachary Turner1dc9fd32016-06-14 20:48:36 +000020#include "llvm/DebugInfo/PDB/Raw/PDBFile.h"
Zachary Turner8848a7a2016-07-06 18:05:57 +000021#include "llvm/DebugInfo/PDB/Raw/RawConstants.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 Turner7120a472016-06-06 20:37:05 +000035 uint32_t NumDirectoryBlocks;
Zachary Turnerfaa554b2016-07-15 22:16:56 +000036 std::vector<uint32_t> DirectoryBlocks;
Zachary Turner7120a472016-06-06 20:37:05 +000037 uint32_t NumStreams;
Zachary Turner1dc9fd32016-06-14 20:48:36 +000038 uint32_t FileSize;
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 Turnerdbeaea72016-07-11 21:45:26 +000051 PdbRaw_ImplVer Version;
Zachary Turner8848a7a2016-07-06 18:05:57 +000052 uint32_t Signature;
53 uint32_t Age;
54 PDB_UniqueId Guid;
Zachary Turner5e534c72016-07-15 22:17:08 +000055 std::vector<NamedStreamMapping> NamedStreams;
Zachary Turner8848a7a2016-07-06 18:05:57 +000056};
57
Zachary Turner3b147642016-10-08 01:12:01 +000058struct PdbSymbolRecord {
59 codeview::CVSymbol Record;
60};
61
62struct PdbModiStream {
63 uint32_t Signature;
64 std::vector<PdbSymbolRecord> Symbols;
65};
66
Zachary Turnerd218c262016-07-22 15:46:37 +000067struct PdbDbiModuleInfo {
68 StringRef Obj;
69 StringRef Mod;
70 std::vector<StringRef> SourceFiles;
Zachary Turner3b147642016-10-08 01:12:01 +000071 Optional<PdbModiStream> Modi;
Zachary Turnerd218c262016-07-22 15:46:37 +000072};
73
Zachary Turnerdbeaea72016-07-11 21:45:26 +000074struct PdbDbiStream {
75 PdbRaw_DbiVer VerHeader;
76 uint32_t Age;
77 uint16_t BuildNumber;
78 uint32_t PdbDllVersion;
79 uint16_t PdbDllRbld;
80 uint16_t Flags;
81 PDB_Machine MachineType;
Zachary Turnerd218c262016-07-22 15:46:37 +000082
83 std::vector<PdbDbiModuleInfo> ModInfos;
Zachary Turnerdbeaea72016-07-11 21:45:26 +000084};
85
Zachary Turnerac5763e2016-08-18 16:49:29 +000086struct PdbTpiRecord {
Zachary Turnerac5763e2016-08-18 16:49:29 +000087 codeview::CVType Record;
88};
89
Zachary Turnerc67b00c2016-09-14 23:00:16 +000090struct PdbTpiFieldListRecord {
91 codeview::CVMemberRecord Record;
92};
93
Zachary Turnerac5763e2016-08-18 16:49:29 +000094struct PdbTpiStream {
95 PdbRaw_TpiVer Version;
96 std::vector<PdbTpiRecord> Records;
97};
98
Zachary Turner7120a472016-06-06 20:37:05 +000099struct PdbObject {
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000100 explicit PdbObject(BumpPtrAllocator &Allocator) : Allocator(Allocator) {}
101
Zachary Turnera3225b02016-07-29 20:56:36 +0000102 Optional<MSFHeaders> Headers;
Zachary Turnerfaa554b2016-07-15 22:16:56 +0000103 Optional<std::vector<uint32_t>> StreamSizes;
Zachary Turner1dc9fd32016-06-14 20:48:36 +0000104 Optional<std::vector<StreamBlockList>> StreamMap;
Zachary Turner8848a7a2016-07-06 18:05:57 +0000105 Optional<PdbInfoStream> PdbStream;
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000106 Optional<PdbDbiStream> DbiStream;
Zachary Turnerac5763e2016-08-18 16:49:29 +0000107 Optional<PdbTpiStream> TpiStream;
Zachary Turnerde9ba152016-09-15 18:22:31 +0000108 Optional<PdbTpiStream> IpiStream;
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000109
110 BumpPtrAllocator &Allocator;
Zachary Turner7120a472016-06-06 20:37:05 +0000111};
112}
113}
Zachary Turner25e8b052016-06-06 20:37:17 +0000114}
Zachary Turner7120a472016-06-06 20:37:05 +0000115
Zachary Turner25e8b052016-06-06 20:37:17 +0000116namespace llvm {
Zachary Turner7120a472016-06-06 20:37:05 +0000117namespace yaml {
Zachary Turner1dc9fd32016-06-14 20:48:36 +0000118
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000119template <> struct MappingTraits<pdb::yaml::PdbObject> {
120 static void mapping(IO &IO, pdb::yaml::PdbObject &Obj);
121};
122
Zachary Turnera3225b02016-07-29 20:56:36 +0000123template <> struct MappingTraits<pdb::yaml::MSFHeaders> {
124 static void mapping(IO &IO, pdb::yaml::MSFHeaders &Obj);
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000125};
126
Zachary Turnerbac69d32016-07-22 19:56:05 +0000127template <> struct MappingTraits<msf::SuperBlock> {
128 static void mapping(IO &IO, msf::SuperBlock &SB);
Zachary Turner25e8b052016-06-06 20:37:17 +0000129};
130
Zachary Turner1dc9fd32016-06-14 20:48:36 +0000131template <> struct MappingTraits<pdb::yaml::StreamBlockList> {
132 static void mapping(IO &IO, pdb::yaml::StreamBlockList &SB);
Zachary Turner25e8b052016-06-06 20:37:17 +0000133};
134
Zachary Turner8848a7a2016-07-06 18:05:57 +0000135template <> struct MappingTraits<pdb::yaml::PdbInfoStream> {
136 static void mapping(IO &IO, pdb::yaml::PdbInfoStream &Obj);
137};
Zachary Turnerdbeaea72016-07-11 21:45:26 +0000138
139template <> struct MappingTraits<pdb::yaml::PdbDbiStream> {
140 static void mapping(IO &IO, pdb::yaml::PdbDbiStream &Obj);
141};
Zachary Turner5e534c72016-07-15 22:17:08 +0000142
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000143template <>
144struct MappingContextTraits<pdb::yaml::PdbTpiStream, llvm::BumpPtrAllocator> {
145 static void mapping(IO &IO, pdb::yaml::PdbTpiStream &Obj,
146 llvm::BumpPtrAllocator &Allocator);
Zachary Turnerac5763e2016-08-18 16:49:29 +0000147};
148
Zachary Turner5e534c72016-07-15 22:17:08 +0000149template <> struct MappingTraits<pdb::yaml::NamedStreamMapping> {
150 static void mapping(IO &IO, pdb::yaml::NamedStreamMapping &Obj);
151};
Zachary Turnerd218c262016-07-22 15:46:37 +0000152
Zachary Turner3b147642016-10-08 01:12:01 +0000153template <> struct MappingTraits<pdb::yaml::PdbSymbolRecord> {
154 static void mapping(IO &IO, pdb::yaml::PdbSymbolRecord &Obj);
155};
156
157template <> struct MappingTraits<pdb::yaml::PdbModiStream> {
158 static void mapping(IO &IO, pdb::yaml::PdbModiStream &Obj);
159};
160
Zachary Turnerd218c262016-07-22 15:46:37 +0000161template <> struct MappingTraits<pdb::yaml::PdbDbiModuleInfo> {
162 static void mapping(IO &IO, pdb::yaml::PdbDbiModuleInfo &Obj);
163};
Zachary Turner7120a472016-06-06 20:37:05 +0000164
Zachary Turnerc6d54da2016-09-09 17:46:17 +0000165template <>
166struct MappingContextTraits<pdb::yaml::PdbTpiRecord,
167 pdb::yaml::SerializationContext> {
168 static void mapping(IO &IO, pdb::yaml::PdbTpiRecord &Obj,
169 pdb::yaml::SerializationContext &Context);
Zachary Turnerac5763e2016-08-18 16:49:29 +0000170};
171}
172}
Zachary Turner7120a472016-06-06 20:37:05 +0000173
174#endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H