LLVM 24.0.0git
COFFYAML.h
Go to the documentation of this file.
1//===- COFFYAML.h - COFF YAMLIO implementation ------------------*- 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// This file declares classes for handling the YAML representation of COFF.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_OBJECTYAML_COFFYAML_H
14#define LLVM_OBJECTYAML_COFFYAML_H
15
16#include "llvm/ADT/StringRef.h"
18#include "llvm/Object/COFF.h"
24#include <cstdint>
25#include <optional>
26#include <vector>
27
28namespace llvm {
29
30namespace yaml {
32}
33
34namespace COFF {
35
37 uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
38 return static_cast<Characteristics>(Ret);
39}
40
43 uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
44 return static_cast<SectionCharacteristics>(Ret);
45}
46
49 uint16_t Ret = static_cast<uint16_t>(a) | static_cast<uint16_t>(b);
50 return static_cast<DLLCharacteristics>(Ret);
51}
52
53} // end namespace COFF
54
55// The structure of the yaml files is not an exact 1:1 match to COFF. In order
56// to use yaml::IO, we use these structures which are closer to the source.
57namespace COFFYAML {
58
60LLVM_YAML_STRONG_TYPEDEF(uint32_t, WeakExternalCharacteristics)
62
63struct Relocation {
66
67 // Normally a Relocation can refer to the symbol via its name.
68 // It can also use a direct symbol table index instead (with no name
69 // specified), allowing disambiguating between multiple symbols with the
70 // same name or crafting intentionally broken files for testing.
72 std::optional<uint32_t> SymbolTableIndex;
73};
74
76 std::optional<uint32_t> UInt32;
78 std::optional<object::coff_load_configuration32> LoadConfig32;
79 std::optional<object::coff_load_configuration64> LoadConfig64;
80
81 LLVM_ABI size_t size() const;
83};
84
85struct Section {
87 unsigned Alignment = 0;
89 std::vector<CodeViewYAML::YAMLDebugSubsection> DebugS;
90 std::vector<CodeViewYAML::LeafRecord> DebugT;
91 std::vector<CodeViewYAML::LeafRecord> DebugP;
92 std::optional<CodeViewYAML::DebugHSection> DebugH;
93 std::vector<SectionDataEntry> StructuredData;
94 std::optional<std::vector<BBAddrMapYAML::BBAddrMapEntry>> BBAddrMapEntries;
95 std::optional<std::vector<BBAddrMapYAML::PGOAnalysisMapEntry>> PGOAnalyses;
96 std::vector<Relocation> Relocations;
98
100};
101
102struct Symbol {
106 std::optional<COFF::AuxiliaryFunctionDefinition> FunctionDefinition;
107 std::optional<COFF::AuxiliarybfAndefSymbol> bfAndefSymbol;
108 std::optional<COFF::AuxiliaryWeakExternal> WeakExternal;
110 std::optional<COFF::AuxiliarySectionDefinition> SectionDefinition;
111 std::optional<COFF::AuxiliaryCLRToken> CLRToken;
113
115};
116
117struct PEHeader {
119 std::optional<COFF::DataDirectory>
121};
122
123struct Object {
124 std::optional<PEHeader> OptionalHeader;
126 std::vector<Section> Sections;
127 std::vector<Symbol> Symbols;
128
130};
131
132} // end namespace COFFYAML
133
134} // end namespace llvm
135
136LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section)
137LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol)
138LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Relocation)
139LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::SectionDataEntry)
140
141namespace llvm {
142namespace yaml {
143
144template <>
145struct ScalarEnumerationTraits<COFFYAML::WeakExternalCharacteristics> {
146 LLVM_ABI static void
147 enumeration(IO &IO, COFFYAML::WeakExternalCharacteristics &Value);
148};
149
150template <>
151struct ScalarEnumerationTraits<COFFYAML::AuxSymbolType> {
152 LLVM_ABI static void enumeration(IO &IO, COFFYAML::AuxSymbolType &Value);
153};
154
155template <>
157 LLVM_ABI static void enumeration(IO &IO, COFFYAML::COMDATType &Value);
158};
159
160template <>
161struct ScalarEnumerationTraits<COFF::MachineTypes> {
163};
164
165template <>
166struct ScalarEnumerationTraits<COFF::SymbolBaseType> {
168};
169
170template <>
171struct ScalarEnumerationTraits<COFF::SymbolStorageClass> {
173};
174
175template <>
176struct ScalarEnumerationTraits<COFF::SymbolComplexType> {
178};
179
180template <>
181struct ScalarEnumerationTraits<COFF::RelocationTypeI386> {
183};
184
185template <>
186struct ScalarEnumerationTraits<COFF::RelocationTypeAMD64> {
188};
189
190template <> struct ScalarEnumerationTraits<COFF::RelocationTypesMips> {
192};
193
194template <>
195struct ScalarEnumerationTraits<COFF::RelocationTypesARM> {
197};
198
199template <>
200struct ScalarEnumerationTraits<COFF::RelocationTypesARM64> {
202};
203
204template <>
205struct ScalarEnumerationTraits<COFF::WindowsSubsystem> {
207};
208
209template <>
210struct ScalarBitSetTraits<COFF::Characteristics> {
212};
213
214template <>
215struct ScalarBitSetTraits<COFF::SectionCharacteristics> {
217};
218
219template <>
220struct ScalarBitSetTraits<COFF::DLLCharacteristics> {
222};
223
224template <>
225struct MappingTraits<COFFYAML::Relocation> {
226 LLVM_ABI static void mapping(IO &IO, COFFYAML::Relocation &Rel);
227};
228
229template <>
230struct MappingTraits<COFFYAML::PEHeader> {
231 LLVM_ABI static void mapping(IO &IO, COFFYAML::PEHeader &PH);
232};
233
234template <>
235struct MappingTraits<COFF::DataDirectory> {
236 LLVM_ABI static void mapping(IO &IO, COFF::DataDirectory &DD);
237};
238
239template <>
240struct MappingTraits<COFF::header> {
241 LLVM_ABI static void mapping(IO &IO, COFF::header &H);
242};
243
244template <> struct MappingTraits<COFF::AuxiliaryFunctionDefinition> {
246};
247
248template <> struct MappingTraits<COFF::AuxiliarybfAndefSymbol> {
250};
251
252template <> struct MappingTraits<COFF::AuxiliaryWeakExternal> {
254};
255
256template <> struct MappingTraits<COFF::AuxiliarySectionDefinition> {
258};
259
260template <> struct MappingTraits<COFF::AuxiliaryCLRToken> {
261 LLVM_ABI static void mapping(IO &IO, COFF::AuxiliaryCLRToken &ACT);
262};
263
264template <> struct MappingTraits<object::coff_load_configuration32> {
266};
267
268template <> struct MappingTraits<object::coff_load_configuration64> {
270};
271
272template <> struct MappingTraits<object::coff_load_config_code_integrity> {
273 LLVM_ABI static void mapping(IO &IO,
275};
276
277template <>
278struct MappingTraits<COFFYAML::Symbol> {
279 LLVM_ABI static void mapping(IO &IO, COFFYAML::Symbol &S);
280};
281
282template <> struct MappingTraits<COFFYAML::SectionDataEntry> {
283 LLVM_ABI static void mapping(IO &IO, COFFYAML::SectionDataEntry &Sec);
284};
285
286template <>
287struct MappingTraits<COFFYAML::Section> {
288 LLVM_ABI static void mapping(IO &IO, COFFYAML::Section &Sec);
289};
290
291template <>
292struct MappingTraits<COFFYAML::Object> {
293 LLVM_ABI static void mapping(IO &IO, COFFYAML::Object &Obj);
294};
295
296} // end namespace yaml
297} // end namespace llvm
298
299#endif // LLVM_OBJECTYAML_COFFYAML_H
This file declares the YAML representation of BB address maps (SHT_LLVM_BB_ADDR_MAP / ....
#define LLVM_ABI
Definition Compiler.h:215
#define H(x, y, z)
Definition MD5.cpp:56
#define LLVM_YAML_IS_SEQUENCE_VECTOR(type)
Utility for declaring that a std::vector of a particular type should be considered a YAML sequence.
#define LLVM_YAML_STRONG_TYPEDEF(_base, _type)
YAML I/O does conversion based on types. But often native data types are just a typedef of built in i...
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
LLVM Value Representation.
Definition Value.h:75
Specialized YAMLIO scalar type for representing a binary blob.
Definition YAML.h:64
DLLCharacteristics
Definition COFF.h:669
Characteristics operator|(Characteristics a, Characteristics b)
Definition COFFYAML.h:36
RelocationTypesMips
Definition COFF.h:421
MachineTypes
Definition COFF.h:93
SectionCharacteristics
Definition COFF.h:298
RelocationTypesARM64
Definition COFF.h:400
RelocationTypeAMD64
Definition COFF.h:360
@ NUM_DATA_DIRECTORIES
Definition COFF.h:647
SymbolStorageClass
Storage class tells where and what the symbol represents.
Definition COFF.h:218
WindowsSubsystem
Definition COFF.h:650
RelocationTypesARM
Definition COFF.h:380
RelocationTypeI386
Definition COFF.h:346
SymbolBaseType
Definition COFF.h:254
@ IMAGE_SYM_TYPE_NULL
No type information or unknown base type.
Definition COFF.h:255
Characteristics
Definition COFF.h:138
SymbolComplexType
Definition COFF.h:273
@ IMAGE_SYM_DTYPE_NULL
No complex type; simple scalar variable.
Definition COFF.h:274
This is an optimization pass for GlobalISel generic memory operations.
std::optional< PEHeader > OptionalHeader
Definition COFFYAML.h:124
std::vector< Section > Sections
Definition COFFYAML.h:126
std::vector< Symbol > Symbols
Definition COFFYAML.h:127
COFF::header Header
Definition COFFYAML.h:125
std::optional< COFF::DataDirectory > DataDirectories[COFF::NUM_DATA_DIRECTORIES]
Definition COFFYAML.h:120
COFF::PE32Header Header
Definition COFFYAML.h:118
std::optional< uint32_t > SymbolTableIndex
Definition COFFYAML.h:72
std::optional< object::coff_load_configuration64 > LoadConfig64
Definition COFFYAML.h:79
std::optional< object::coff_load_configuration32 > LoadConfig32
Definition COFFYAML.h:78
LLVM_ABI void writeAsBinary(yaml::ContiguousBlobAccumulator &CBA) const
std::optional< uint32_t > UInt32
Definition COFFYAML.h:76
LLVM_ABI size_t size() const
std::vector< CodeViewYAML::YAMLDebugSubsection > DebugS
Definition COFFYAML.h:89
std::vector< SectionDataEntry > StructuredData
Definition COFFYAML.h:93
std::optional< std::vector< BBAddrMapYAML::BBAddrMapEntry > > BBAddrMapEntries
Definition COFFYAML.h:94
std::vector< CodeViewYAML::LeafRecord > DebugT
Definition COFFYAML.h:90
yaml::BinaryRef SectionData
Definition COFFYAML.h:88
std::optional< CodeViewYAML::DebugHSection > DebugH
Definition COFFYAML.h:92
std::vector< CodeViewYAML::LeafRecord > DebugP
Definition COFFYAML.h:91
COFF::section Header
Definition COFFYAML.h:86
std::optional< std::vector< BBAddrMapYAML::PGOAnalysisMapEntry > > PGOAnalyses
Definition COFFYAML.h:95
std::vector< Relocation > Relocations
Definition COFFYAML.h:96
std::optional< COFF::AuxiliaryWeakExternal > WeakExternal
Definition COFFYAML.h:108
std::optional< COFF::AuxiliarybfAndefSymbol > bfAndefSymbol
Definition COFFYAML.h:107
COFF::SymbolComplexType ComplexType
Definition COFFYAML.h:105
std::optional< COFF::AuxiliarySectionDefinition > SectionDefinition
Definition COFFYAML.h:110
std::optional< COFF::AuxiliaryFunctionDefinition > FunctionDefinition
Definition COFFYAML.h:106
COFF::symbol Header
Definition COFFYAML.h:103
COFF::SymbolBaseType SimpleType
Definition COFFYAML.h:104
std::optional< COFF::AuxiliaryCLRToken > CLRToken
Definition COFFYAML.h:111
32-bit load config (IMAGE_LOAD_CONFIG_DIRECTORY32)
Definition COFF.h:619
64-bit load config (IMAGE_LOAD_CONFIG_DIRECTORY64)
Definition COFF.h:677
static LLVM_ABI void mapping(IO &IO, COFFYAML::Object &Obj)
Definition COFFYAML.cpp:738
static LLVM_ABI void mapping(IO &IO, COFFYAML::PEHeader &PH)
Definition COFFYAML.cpp:472
static LLVM_ABI void mapping(IO &IO, COFFYAML::Relocation &Rel)
Definition COFFYAML.cpp:434
static LLVM_ABI void mapping(IO &IO, COFFYAML::SectionDataEntry &Sec)
Definition COFFYAML.cpp:657
static LLVM_ABI void mapping(IO &IO, COFFYAML::Section &Sec)
Definition COFFYAML.cpp:686
static LLVM_ABI void mapping(IO &IO, COFFYAML::Symbol &S)
Definition COFFYAML.cpp:669
static LLVM_ABI void mapping(IO &IO, COFF::AuxiliaryCLRToken &ACT)
Definition COFFYAML.cpp:566
static LLVM_ABI void mapping(IO &IO, COFF::AuxiliaryFunctionDefinition &AFD)
Definition COFFYAML.cpp:531
static LLVM_ABI void mapping(IO &IO, COFF::AuxiliarySectionDefinition &ASD)
Definition COFFYAML.cpp:553
static LLVM_ABI void mapping(IO &IO, COFF::AuxiliaryWeakExternal &AWE)
Definition COFFYAML.cpp:545
static LLVM_ABI void mapping(IO &IO, COFF::AuxiliarybfAndefSymbol &AAS)
Definition COFFYAML.cpp:539
static LLVM_ABI void mapping(IO &IO, COFF::DataDirectory &DD)
Definition COFFYAML.cpp:466
static LLVM_ABI void mapping(IO &IO, COFF::header &H)
Definition COFFYAML.cpp:521
static LLVM_ABI void mapping(IO &IO, object::coff_load_config_code_integrity &ACT)
Definition COFFYAML.cpp:573
static LLVM_ABI void mapping(IO &IO, object::coff_load_configuration32 &ACT)
Definition COFFYAML.cpp:647
static LLVM_ABI void mapping(IO &IO, object::coff_load_configuration64 &ACT)
Definition COFFYAML.cpp:652
This class should be specialized by any type that needs to be converted to/from a YAML mapping.
Definition YAMLTraits.h:63
static LLVM_ABI void bitset(IO &IO, COFF::Characteristics &Value)
Definition COFFYAML.cpp:268
static LLVM_ABI void bitset(IO &IO, COFF::DLLCharacteristics &Value)
Definition COFFYAML.cpp:313
static LLVM_ABI void bitset(IO &IO, COFF::SectionCharacteristics &Value)
Definition COFFYAML.cpp:287
This class should be specialized by any integer type that is a union of bit values and the YAML repre...
Definition YAMLTraits.h:124
static LLVM_ABI void enumeration(IO &IO, COFFYAML::AuxSymbolType &Value)
Definition COFFYAML.cpp:55
static LLVM_ABI void enumeration(IO &IO, COFFYAML::COMDATType &Value)
Definition COFFYAML.cpp:33
static LLVM_ABI void enumeration(IO &IO, COFFYAML::WeakExternalCharacteristics &Value)
Definition COFFYAML.cpp:46
static LLVM_ABI void enumeration(IO &IO, COFF::MachineTypes &Value)
Definition COFFYAML.cpp:60
static LLVM_ABI void enumeration(IO &IO, COFF::RelocationTypeAMD64 &Value)
Definition COFFYAML.cpp:165
static LLVM_ABI void enumeration(IO &IO, COFF::RelocationTypeI386 &Value)
Definition COFFYAML.cpp:150
static LLVM_ABI void enumeration(IO &IO, COFF::RelocationTypesARM64 &Value)
Definition COFFYAML.cpp:226
static LLVM_ABI void enumeration(IO &IO, COFF::RelocationTypesARM &Value)
Definition COFFYAML.cpp:205
static LLVM_ABI void enumeration(IO &IO, COFF::RelocationTypesMips &Value)
Definition COFFYAML.cpp:186
static LLVM_ABI void enumeration(IO &IO, COFF::SymbolBaseType &Value)
Definition COFFYAML.cpp:91
static LLVM_ABI void enumeration(IO &IO, COFF::SymbolComplexType &Value)
Definition COFFYAML.cpp:142
static LLVM_ABI void enumeration(IO &IO, COFF::SymbolStorageClass &Value)
Definition COFFYAML.cpp:111
static LLVM_ABI void enumeration(IO &IO, COFF::WindowsSubsystem &Value)
Definition COFFYAML.cpp:248
This class should be specialized by any integral type that converts to/from a YAML scalar where there...
Definition YAMLTraits.h:108