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