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/Object/COFF.h"
22#include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h"
23#include "llvm/ObjectYAML/CodeViewYAMLSymbols.h"
24#include "llvm/ObjectYAML/CodeViewYAMLTypes.h"
25#include "llvm/Support/Endian.h"
26#include "llvm/Support/YAMLTraits.h"
27
28#include <optional>
29#include <vector>
30
31namespace llvm {
32namespace pdb {
33
34namespace yaml {
35
36struct MSFHeaders {
37 msf::SuperBlock SuperBlock;
38 uint32_t NumDirectoryBlocks = 0;
39 std::vector<uint32_t> DirectoryBlocks;
40 uint32_t NumStreams = 0;
41 uint64_t FileSize = 0;
42};
43
44struct CoffSectionHeader {
45 CoffSectionHeader();
46 CoffSectionHeader(const object::coff_section &Section);
47
48 object::coff_section toCoffSection() const;
49
50 StringRef Name;
51 uint32_t VirtualSize = 0;
52 uint32_t VirtualAddress = 0;
53 uint32_t SizeOfRawData = 0;
54 uint32_t PointerToRawData = 0;
55 uint32_t PointerToRelocations = 0;
56 uint32_t PointerToLinenumbers = 0;
57 uint16_t NumberOfRelocations = 0;
58 uint16_t NumberOfLinenumbers = 0;
59 uint32_t Characteristics = 0;
60};
61
62struct StreamBlockList {
63 std::vector<uint32_t> Blocks;
64};
65
66struct NamedStreamMapping {
67 StringRef StreamName;
68 uint32_t StreamNumber;
69};
70
71struct PdbInfoStream {
72 PdbRaw_ImplVer Version = PdbImplVC70;
73 uint32_t Signature = 0;
74 uint32_t Age = 1;
75 codeview::GUID Guid;
76 std::vector<PdbRaw_FeatureSig> Features;
77 std::vector<NamedStreamMapping> NamedStreams;
78};
79
80struct PdbModiStream {
81 uint32_t Signature;
82 std::vector<CodeViewYAML::SymbolRecord> Symbols;
83};
84
85struct PdbDbiModuleInfo {
86 StringRef Obj;
87 StringRef Mod;
88 std::vector<StringRef> SourceFiles;
89 std::vector<CodeViewYAML::YAMLDebugSubsection> Subsections;
90 std::optional<PdbModiStream> Modi;
91};
92
93struct PdbDbiStream {
94 PdbRaw_DbiVer VerHeader = PdbDbiV70;
95 uint32_t Age = 1;
96 uint16_t BuildNumber = 0;
97 uint32_t PdbDllVersion = 0;
98 uint16_t PdbDllRbld = 0;
99 uint16_t Flags = 1;
100 PDB_Machine MachineType = PDB_Machine::x86;
101
102 std::vector<PdbDbiModuleInfo> ModInfos;
103 COFF::header FakeHeader;
104 std::vector<CoffSectionHeader> SectionHeaders;
105};
106
107struct PdbTpiStream {
108 PdbRaw_TpiVer Version = PdbTpiV80;
109 std::vector<CodeViewYAML::LeafRecord> Records;
110};
111
112struct PdbPublicsStream {
113 std::vector<CodeViewYAML::SymbolRecord> PubSyms;
114};
115
116struct PdbObject {
117 explicit PdbObject(BumpPtrAllocator &Allocator) : Allocator(Allocator) {}
118
119 std::optional<MSFHeaders> Headers;
120 std::optional<std::vector<uint32_t>> StreamSizes;
121 std::optional<std::vector<StreamBlockList>> StreamMap;
122 std::optional<PdbInfoStream> PdbStream;
123 std::optional<PdbDbiStream> DbiStream;
124 std::optional<PdbTpiStream> TpiStream;
125 std::optional<PdbTpiStream> IpiStream;
126 std::optional<PdbPublicsStream> PublicsStream;
127
128 std::optional<std::vector<StringRef>> StringTable;
129
130 BumpPtrAllocator &Allocator;
131};
132}
133}
134}
135
136LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::CoffSectionHeader)
137LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbObject)
138LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::MSFHeaders)
139LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(msf::SuperBlock)
140LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::StreamBlockList)
141LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbInfoStream)
142LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbDbiStream)
143LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbTpiStream)
144LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbPublicsStream)
145LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::NamedStreamMapping)
146LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbModiStream)
147LLVM_YAML_DECLARE_MAPPING_TRAITS_PRIVATE(pdb::yaml::PdbDbiModuleInfo)
148
149#endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H
150