xref: /freebsd/contrib/llvm-project/llvm/tools/llvm-pdbutil/PdbYaml.h (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric //===- PdbYAML.h ---------------------------------------------- *- C++ --*-===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric #ifndef LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
10*0b57cec5SDimitry Andric #define LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
11*0b57cec5SDimitry Andric 
12*0b57cec5SDimitry Andric #include "OutputStyle.h"
13*0b57cec5SDimitry Andric 
14*0b57cec5SDimitry Andric #include "llvm/ADT/Optional.h"
15*0b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
16*0b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/TypeRecord.h"
17*0b57cec5SDimitry Andric #include "llvm/DebugInfo/MSF/MSFCommon.h"
18*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
19*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/RawConstants.h"
20*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/PDBTypes.h"
21*0b57cec5SDimitry Andric #include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h"
22*0b57cec5SDimitry Andric #include "llvm/ObjectYAML/CodeViewYAMLSymbols.h"
23*0b57cec5SDimitry Andric #include "llvm/ObjectYAML/CodeViewYAMLTypes.h"
24*0b57cec5SDimitry Andric #include "llvm/Support/Endian.h"
25*0b57cec5SDimitry Andric #include "llvm/Support/YAMLTraits.h"
26*0b57cec5SDimitry Andric 
27*0b57cec5SDimitry Andric #include <vector>
28*0b57cec5SDimitry Andric 
29*0b57cec5SDimitry Andric namespace llvm {
30*0b57cec5SDimitry Andric namespace codeview {
31*0b57cec5SDimitry Andric class DebugStringTableSubsection;
32*0b57cec5SDimitry Andric }
33*0b57cec5SDimitry Andric namespace pdb {
34*0b57cec5SDimitry Andric 
35*0b57cec5SDimitry Andric namespace yaml {
36*0b57cec5SDimitry Andric struct SerializationContext;
37*0b57cec5SDimitry Andric 
38*0b57cec5SDimitry Andric struct MSFHeaders {
39*0b57cec5SDimitry Andric   msf::SuperBlock SuperBlock;
40*0b57cec5SDimitry Andric   uint32_t NumDirectoryBlocks = 0;
41*0b57cec5SDimitry Andric   std::vector<uint32_t> DirectoryBlocks;
42*0b57cec5SDimitry Andric   uint32_t NumStreams = 0;
43*0b57cec5SDimitry Andric   uint32_t FileSize = 0;
44*0b57cec5SDimitry Andric };
45*0b57cec5SDimitry Andric 
46*0b57cec5SDimitry Andric struct StreamBlockList {
47*0b57cec5SDimitry Andric   std::vector<uint32_t> Blocks;
48*0b57cec5SDimitry Andric };
49*0b57cec5SDimitry Andric 
50*0b57cec5SDimitry Andric struct NamedStreamMapping {
51*0b57cec5SDimitry Andric   StringRef StreamName;
52*0b57cec5SDimitry Andric   uint32_t StreamNumber;
53*0b57cec5SDimitry Andric };
54*0b57cec5SDimitry Andric 
55*0b57cec5SDimitry Andric struct PdbInfoStream {
56*0b57cec5SDimitry Andric   PdbRaw_ImplVer Version = PdbImplVC70;
57*0b57cec5SDimitry Andric   uint32_t Signature = 0;
58*0b57cec5SDimitry Andric   uint32_t Age = 1;
59*0b57cec5SDimitry Andric   codeview::GUID Guid;
60*0b57cec5SDimitry Andric   std::vector<PdbRaw_FeatureSig> Features;
61*0b57cec5SDimitry Andric   std::vector<NamedStreamMapping> NamedStreams;
62*0b57cec5SDimitry Andric };
63*0b57cec5SDimitry Andric 
64*0b57cec5SDimitry Andric struct PdbModiStream {
65*0b57cec5SDimitry Andric   uint32_t Signature;
66*0b57cec5SDimitry Andric   std::vector<CodeViewYAML::SymbolRecord> Symbols;
67*0b57cec5SDimitry Andric };
68*0b57cec5SDimitry Andric 
69*0b57cec5SDimitry Andric struct PdbDbiModuleInfo {
70*0b57cec5SDimitry Andric   StringRef Obj;
71*0b57cec5SDimitry Andric   StringRef Mod;
72*0b57cec5SDimitry Andric   std::vector<StringRef> SourceFiles;
73*0b57cec5SDimitry Andric   std::vector<CodeViewYAML::YAMLDebugSubsection> Subsections;
74*0b57cec5SDimitry Andric   Optional<PdbModiStream> Modi;
75*0b57cec5SDimitry Andric };
76*0b57cec5SDimitry Andric 
77*0b57cec5SDimitry Andric struct PdbDbiStream {
78*0b57cec5SDimitry Andric   PdbRaw_DbiVer VerHeader = PdbDbiV70;
79*0b57cec5SDimitry Andric   uint32_t Age = 1;
80*0b57cec5SDimitry Andric   uint16_t BuildNumber = 0;
81*0b57cec5SDimitry Andric   uint32_t PdbDllVersion = 0;
82*0b57cec5SDimitry Andric   uint16_t PdbDllRbld = 0;
83*0b57cec5SDimitry Andric   uint16_t Flags = 1;
84*0b57cec5SDimitry Andric   PDB_Machine MachineType = PDB_Machine::x86;
85*0b57cec5SDimitry Andric 
86*0b57cec5SDimitry Andric   std::vector<PdbDbiModuleInfo> ModInfos;
87*0b57cec5SDimitry Andric };
88*0b57cec5SDimitry Andric 
89*0b57cec5SDimitry Andric struct PdbTpiStream {
90*0b57cec5SDimitry Andric   PdbRaw_TpiVer Version = PdbTpiV80;
91*0b57cec5SDimitry Andric   std::vector<CodeViewYAML::LeafRecord> Records;
92*0b57cec5SDimitry Andric };
93*0b57cec5SDimitry Andric 
94*0b57cec5SDimitry Andric struct PdbPublicsStream {
95*0b57cec5SDimitry Andric   std::vector<CodeViewYAML::SymbolRecord> PubSyms;
96*0b57cec5SDimitry Andric };
97*0b57cec5SDimitry Andric 
98*0b57cec5SDimitry Andric struct PdbObject {
99*0b57cec5SDimitry Andric   explicit PdbObject(BumpPtrAllocator &Allocator) : Allocator(Allocator) {}
100*0b57cec5SDimitry Andric 
101*0b57cec5SDimitry Andric   Optional<MSFHeaders> Headers;
102*0b57cec5SDimitry Andric   Optional<std::vector<uint32_t>> StreamSizes;
103*0b57cec5SDimitry Andric   Optional<std::vector<StreamBlockList>> StreamMap;
104*0b57cec5SDimitry Andric   Optional<PdbInfoStream> PdbStream;
105*0b57cec5SDimitry Andric   Optional<PdbDbiStream> DbiStream;
106*0b57cec5SDimitry Andric   Optional<PdbTpiStream> TpiStream;
107*0b57cec5SDimitry Andric   Optional<PdbTpiStream> IpiStream;
108*0b57cec5SDimitry Andric   Optional<PdbPublicsStream> PublicsStream;
109*0b57cec5SDimitry Andric 
110*0b57cec5SDimitry Andric   Optional<std::vector<StringRef>> StringTable;
111*0b57cec5SDimitry Andric 
112*0b57cec5SDimitry Andric   BumpPtrAllocator &Allocator;
113*0b57cec5SDimitry Andric };
114*0b57cec5SDimitry Andric }
115*0b57cec5SDimitry Andric }
116*0b57cec5SDimitry Andric }
117*0b57cec5SDimitry Andric 
118*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbObject)
119*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::MSFHeaders)
120*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(msf::SuperBlock)
121*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::StreamBlockList)
122*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbInfoStream)
123*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbDbiStream)
124*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbTpiStream)
125*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbPublicsStream)
126*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::NamedStreamMapping)
127*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbModiStream)
128*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbDbiModuleInfo)
129*0b57cec5SDimitry Andric 
130*0b57cec5SDimitry Andric #endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
131