1 //===- PdbYAML.cpp -------------------------------------------- *- C++ --*-===//
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
7 //===----------------------------------------------------------------------===//
11 #include "llvm/ADT/StringExtras.h"
12 #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
13 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
14 #include "llvm/DebugInfo/PDB/Native/RawTypes.h"
15 #include "llvm/DebugInfo/PDB/Native/TpiHashing.h"
16 #include "llvm/DebugInfo/PDB/PDBTypes.h"
17 #include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h"
18 #include "llvm/ObjectYAML/CodeViewYAMLTypes.h"
21 using namespace llvm::pdb
;
22 using namespace llvm::pdb::yaml
;
23 using namespace llvm::yaml
;
25 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::NamedStreamMapping
)
26 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbDbiModuleInfo
)
27 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::StreamBlockList
)
28 LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(llvm::pdb::PdbRaw_FeatureSig
)
33 template <> struct ScalarEnumerationTraits
<llvm::pdb::PDB_Machine
> {
34 static void enumeration(IO
&io
, llvm::pdb::PDB_Machine
&Value
) {
35 io
.enumCase(Value
, "Invalid", PDB_Machine::Invalid
);
36 io
.enumCase(Value
, "Am33", PDB_Machine::Am33
);
37 io
.enumCase(Value
, "Amd64", PDB_Machine::Amd64
);
38 io
.enumCase(Value
, "Arm", PDB_Machine::Arm
);
39 io
.enumCase(Value
, "ArmNT", PDB_Machine::ArmNT
);
40 io
.enumCase(Value
, "Ebc", PDB_Machine::Ebc
);
41 io
.enumCase(Value
, "x86", PDB_Machine::x86
);
42 io
.enumCase(Value
, "Ia64", PDB_Machine::Ia64
);
43 io
.enumCase(Value
, "M32R", PDB_Machine::M32R
);
44 io
.enumCase(Value
, "Mips16", PDB_Machine::Mips16
);
45 io
.enumCase(Value
, "MipsFpu", PDB_Machine::MipsFpu
);
46 io
.enumCase(Value
, "MipsFpu16", PDB_Machine::MipsFpu16
);
47 io
.enumCase(Value
, "PowerPCFP", PDB_Machine::PowerPCFP
);
48 io
.enumCase(Value
, "R4000", PDB_Machine::R4000
);
49 io
.enumCase(Value
, "SH3", PDB_Machine::SH3
);
50 io
.enumCase(Value
, "SH3DSP", PDB_Machine::SH3DSP
);
51 io
.enumCase(Value
, "Thumb", PDB_Machine::Thumb
);
52 io
.enumCase(Value
, "WceMipsV2", PDB_Machine::WceMipsV2
);
56 template <> struct ScalarEnumerationTraits
<llvm::pdb::PdbRaw_DbiVer
> {
57 static void enumeration(IO
&io
, llvm::pdb::PdbRaw_DbiVer
&Value
) {
58 io
.enumCase(Value
, "V41", llvm::pdb::PdbRaw_DbiVer::PdbDbiVC41
);
59 io
.enumCase(Value
, "V50", llvm::pdb::PdbRaw_DbiVer::PdbDbiV50
);
60 io
.enumCase(Value
, "V60", llvm::pdb::PdbRaw_DbiVer::PdbDbiV60
);
61 io
.enumCase(Value
, "V70", llvm::pdb::PdbRaw_DbiVer::PdbDbiV70
);
62 io
.enumCase(Value
, "V110", llvm::pdb::PdbRaw_DbiVer::PdbDbiV110
);
66 template <> struct ScalarEnumerationTraits
<llvm::pdb::PdbRaw_ImplVer
> {
67 static void enumeration(IO
&io
, llvm::pdb::PdbRaw_ImplVer
&Value
) {
68 io
.enumCase(Value
, "VC2", llvm::pdb::PdbRaw_ImplVer::PdbImplVC2
);
69 io
.enumCase(Value
, "VC4", llvm::pdb::PdbRaw_ImplVer::PdbImplVC4
);
70 io
.enumCase(Value
, "VC41", llvm::pdb::PdbRaw_ImplVer::PdbImplVC41
);
71 io
.enumCase(Value
, "VC50", llvm::pdb::PdbRaw_ImplVer::PdbImplVC50
);
72 io
.enumCase(Value
, "VC98", llvm::pdb::PdbRaw_ImplVer::PdbImplVC98
);
73 io
.enumCase(Value
, "VC70Dep", llvm::pdb::PdbRaw_ImplVer::PdbImplVC70Dep
);
74 io
.enumCase(Value
, "VC70", llvm::pdb::PdbRaw_ImplVer::PdbImplVC70
);
75 io
.enumCase(Value
, "VC80", llvm::pdb::PdbRaw_ImplVer::PdbImplVC80
);
76 io
.enumCase(Value
, "VC110", llvm::pdb::PdbRaw_ImplVer::PdbImplVC110
);
77 io
.enumCase(Value
, "VC140", llvm::pdb::PdbRaw_ImplVer::PdbImplVC140
);
81 template <> struct ScalarEnumerationTraits
<llvm::pdb::PdbRaw_TpiVer
> {
82 static void enumeration(IO
&io
, llvm::pdb::PdbRaw_TpiVer
&Value
) {
83 io
.enumCase(Value
, "VC40", llvm::pdb::PdbRaw_TpiVer::PdbTpiV40
);
84 io
.enumCase(Value
, "VC41", llvm::pdb::PdbRaw_TpiVer::PdbTpiV41
);
85 io
.enumCase(Value
, "VC50", llvm::pdb::PdbRaw_TpiVer::PdbTpiV50
);
86 io
.enumCase(Value
, "VC70", llvm::pdb::PdbRaw_TpiVer::PdbTpiV70
);
87 io
.enumCase(Value
, "VC80", llvm::pdb::PdbRaw_TpiVer::PdbTpiV80
);
91 template <> struct ScalarEnumerationTraits
<llvm::pdb::PdbRaw_FeatureSig
> {
92 static void enumeration(IO
&io
, PdbRaw_FeatureSig
&Features
) {
93 io
.enumCase(Features
, "MinimalDebugInfo",
94 PdbRaw_FeatureSig::MinimalDebugInfo
);
95 io
.enumCase(Features
, "NoTypeMerge", PdbRaw_FeatureSig::NoTypeMerge
);
96 io
.enumCase(Features
, "VC110", PdbRaw_FeatureSig::VC110
);
97 io
.enumCase(Features
, "VC140", PdbRaw_FeatureSig::VC140
);
103 void MappingTraits
<PdbObject
>::mapping(IO
&IO
, PdbObject
&Obj
) {
104 IO
.mapOptional("MSF", Obj
.Headers
);
105 IO
.mapOptional("StreamSizes", Obj
.StreamSizes
);
106 IO
.mapOptional("StreamMap", Obj
.StreamMap
);
107 IO
.mapOptional("StringTable", Obj
.StringTable
);
108 IO
.mapOptional("PdbStream", Obj
.PdbStream
);
109 IO
.mapOptional("DbiStream", Obj
.DbiStream
);
110 IO
.mapOptional("TpiStream", Obj
.TpiStream
);
111 IO
.mapOptional("IpiStream", Obj
.IpiStream
);
112 IO
.mapOptional("PublicsStream", Obj
.PublicsStream
);
115 void MappingTraits
<MSFHeaders
>::mapping(IO
&IO
, MSFHeaders
&Obj
) {
116 IO
.mapOptional("SuperBlock", Obj
.SuperBlock
);
117 IO
.mapOptional("NumDirectoryBlocks", Obj
.NumDirectoryBlocks
);
118 IO
.mapOptional("DirectoryBlocks", Obj
.DirectoryBlocks
);
119 IO
.mapOptional("NumStreams", Obj
.NumStreams
);
120 IO
.mapOptional("FileSize", Obj
.FileSize
);
123 void MappingTraits
<msf::SuperBlock
>::mapping(IO
&IO
, msf::SuperBlock
&SB
) {
124 if (!IO
.outputting()) {
125 ::memcpy(SB
.MagicBytes
, msf::Magic
, sizeof(msf::Magic
));
128 using u32
= support::ulittle32_t
;
129 IO
.mapOptional("BlockSize", SB
.BlockSize
, u32(4096U));
130 IO
.mapOptional("FreeBlockMap", SB
.FreeBlockMapBlock
, u32(0U));
131 IO
.mapOptional("NumBlocks", SB
.NumBlocks
, u32(0U));
132 IO
.mapOptional("NumDirectoryBytes", SB
.NumDirectoryBytes
, u32(0U));
133 IO
.mapOptional("Unknown1", SB
.Unknown1
, u32(0U));
134 IO
.mapOptional("BlockMapAddr", SB
.BlockMapAddr
, u32(0U));
137 void MappingTraits
<StreamBlockList
>::mapping(IO
&IO
, StreamBlockList
&SB
) {
138 IO
.mapRequired("Stream", SB
.Blocks
);
141 void MappingTraits
<PdbInfoStream
>::mapping(IO
&IO
, PdbInfoStream
&Obj
) {
142 IO
.mapOptional("Age", Obj
.Age
, 1U);
143 IO
.mapOptional("Guid", Obj
.Guid
);
144 IO
.mapOptional("Signature", Obj
.Signature
, 0U);
145 IO
.mapOptional("Features", Obj
.Features
);
146 IO
.mapOptional("Version", Obj
.Version
, PdbImplVC70
);
149 void MappingTraits
<PdbDbiStream
>::mapping(IO
&IO
, PdbDbiStream
&Obj
) {
150 IO
.mapOptional("VerHeader", Obj
.VerHeader
, PdbDbiV70
);
151 IO
.mapOptional("Age", Obj
.Age
, 1U);
152 IO
.mapOptional("BuildNumber", Obj
.BuildNumber
, uint16_t(0U));
153 IO
.mapOptional("PdbDllVersion", Obj
.PdbDllVersion
, 0U);
154 IO
.mapOptional("PdbDllRbld", Obj
.PdbDllRbld
, uint16_t(0U));
155 IO
.mapOptional("Flags", Obj
.Flags
, uint16_t(1U));
156 IO
.mapOptional("MachineType", Obj
.MachineType
, PDB_Machine::x86
);
157 IO
.mapOptional("Modules", Obj
.ModInfos
);
160 void MappingTraits
<PdbTpiStream
>::mapping(IO
&IO
,
161 pdb::yaml::PdbTpiStream
&Obj
) {
162 IO
.mapOptional("Version", Obj
.Version
, PdbTpiV80
);
163 IO
.mapRequired("Records", Obj
.Records
);
166 void MappingTraits
<PdbPublicsStream
>::mapping(
167 IO
&IO
, pdb::yaml::PdbPublicsStream
&Obj
) {
168 IO
.mapRequired("Records", Obj
.PubSyms
);
171 void MappingTraits
<NamedStreamMapping
>::mapping(IO
&IO
,
172 NamedStreamMapping
&Obj
) {
173 IO
.mapRequired("Name", Obj
.StreamName
);
174 IO
.mapRequired("StreamNum", Obj
.StreamNumber
);
177 void MappingTraits
<PdbModiStream
>::mapping(IO
&IO
, PdbModiStream
&Obj
) {
178 IO
.mapOptional("Signature", Obj
.Signature
, 4U);
179 IO
.mapRequired("Records", Obj
.Symbols
);
182 void MappingTraits
<PdbDbiModuleInfo
>::mapping(IO
&IO
, PdbDbiModuleInfo
&Obj
) {
183 IO
.mapRequired("Module", Obj
.Mod
);
184 IO
.mapOptional("ObjFile", Obj
.Obj
, Obj
.Mod
);
185 IO
.mapOptional("SourceFiles", Obj
.SourceFiles
);
186 IO
.mapOptional("Subsections", Obj
.Subsections
);
187 IO
.mapOptional("Modi", Obj
.Modi
);