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