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