LLVM 23.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"
23#include <cstdint>
24#include <optional>
25#include <vector>
26
27namespace llvm {
28
29namespace COFF {
30
32 uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
33 return static_cast<Characteristics>(Ret);
34}
35
38 uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
39 return static_cast<SectionCharacteristics>(Ret);
40}
41
44 uint16_t Ret = static_cast<uint16_t>(a) | static_cast<uint16_t>(b);
45 return static_cast<DLLCharacteristics>(Ret);
46}
47
48} // end namespace COFF
49
50// The structure of the yaml files is not an exact 1:1 match to COFF. In order
51// to use yaml::IO, we use these structures which are closer to the source.
52namespace COFFYAML {
53
55LLVM_YAML_STRONG_TYPEDEF(uint32_t, WeakExternalCharacteristics)
57
58struct Relocation {
61
62 // Normally a Relocation can refer to the symbol via its name.
63 // It can also use a direct symbol table index instead (with no name
64 // specified), allowing disambiguating between multiple symbols with the
65 // same name or crafting intentionally broken files for testing.
67 std::optional<uint32_t> SymbolTableIndex;
68};
69
71 std::optional<uint32_t> UInt32;
73 std::optional<object::coff_load_configuration32> LoadConfig32;
74 std::optional<object::coff_load_configuration64> LoadConfig64;
75
76 LLVM_ABI size_t size() const;
77 LLVM_ABI void writeAsBinary(raw_ostream &OS) const;
78};
79
80struct Section {
82 unsigned Alignment = 0;
84 std::vector<CodeViewYAML::YAMLDebugSubsection> DebugS;
85 std::vector<CodeViewYAML::LeafRecord> DebugT;
86 std::vector<CodeViewYAML::LeafRecord> DebugP;
87 std::optional<CodeViewYAML::DebugHSection> DebugH;
88 std::vector<SectionDataEntry> StructuredData;
89 std::vector<Relocation> Relocations;
91
93};
94
95struct Symbol {
99 std::optional<COFF::AuxiliaryFunctionDefinition> FunctionDefinition;
100 std::optional<COFF::AuxiliarybfAndefSymbol> bfAndefSymbol;
101 std::optional<COFF::AuxiliaryWeakExternal> WeakExternal;
103 std::optional<COFF::AuxiliarySectionDefinition> SectionDefinition;
104 std::optional<COFF::AuxiliaryCLRToken> CLRToken;
106
108};
109
110struct PEHeader {
112 std::optional<COFF::DataDirectory>
114};
115
116struct Object {
117 std::optional<PEHeader> OptionalHeader;
119 std::vector<Section> Sections;
120 std::vector<Symbol> Symbols;
121
123};
124
125} // end namespace COFFYAML
126
127} // end namespace llvm
128
129LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section)
130LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol)
131LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Relocation)
132LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::SectionDataEntry)
133
134namespace llvm {
135namespace yaml {
136
137template <>
138struct ScalarEnumerationTraits<COFFYAML::WeakExternalCharacteristics> {
139 LLVM_ABI static void
140 enumeration(IO &IO, COFFYAML::WeakExternalCharacteristics &Value);
141};
142
143template <>
144struct ScalarEnumerationTraits<COFFYAML::AuxSymbolType> {
145 LLVM_ABI static void enumeration(IO &IO, COFFYAML::AuxSymbolType &Value);
146};
147
148template <>
150 LLVM_ABI static void enumeration(IO &IO, COFFYAML::COMDATType &Value);
151};
152
153template <>
154struct ScalarEnumerationTraits<COFF::MachineTypes> {
156};
157
158template <>
159struct ScalarEnumerationTraits<COFF::SymbolBaseType> {
161};
162
163template <>
164struct ScalarEnumerationTraits<COFF::SymbolStorageClass> {
166};
167
168template <>
169struct ScalarEnumerationTraits<COFF::SymbolComplexType> {
171};
172
173template <>
174struct ScalarEnumerationTraits<COFF::RelocationTypeI386> {
176};
177
178template <>
179struct ScalarEnumerationTraits<COFF::RelocationTypeAMD64> {
181};
182
183template <> struct ScalarEnumerationTraits<COFF::RelocationTypesMips> {
185};
186
187template <>
188struct ScalarEnumerationTraits<COFF::RelocationTypesARM> {
190};
191
192template <>
193struct ScalarEnumerationTraits<COFF::RelocationTypesARM64> {
195};
196
197template <>
198struct ScalarEnumerationTraits<COFF::WindowsSubsystem> {
200};
201
202template <>
203struct ScalarBitSetTraits<COFF::Characteristics> {
205};
206
207template <>
208struct ScalarBitSetTraits<COFF::SectionCharacteristics> {
210};
211
212template <>
213struct ScalarBitSetTraits<COFF::DLLCharacteristics> {
215};
216
217template <>
218struct MappingTraits<COFFYAML::Relocation> {
219 LLVM_ABI static void mapping(IO &IO, COFFYAML::Relocation &Rel);
220};
221
222template <>
223struct MappingTraits<COFFYAML::PEHeader> {
224 LLVM_ABI static void mapping(IO &IO, COFFYAML::PEHeader &PH);
225};
226
227template <>
228struct MappingTraits<COFF::DataDirectory> {
229 LLVM_ABI static void mapping(IO &IO, COFF::DataDirectory &DD);
230};
231
232template <>
233struct MappingTraits<COFF::header> {
234 LLVM_ABI static void mapping(IO &IO, COFF::header &H);
235};
236
237template <> struct MappingTraits<COFF::AuxiliaryFunctionDefinition> {
239};
240
241template <> struct MappingTraits<COFF::AuxiliarybfAndefSymbol> {
243};
244
245template <> struct MappingTraits<COFF::AuxiliaryWeakExternal> {
247};
248
249template <> struct MappingTraits<COFF::AuxiliarySectionDefinition> {
251};
252
253template <> struct MappingTraits<COFF::AuxiliaryCLRToken> {
254 LLVM_ABI static void mapping(IO &IO, COFF::AuxiliaryCLRToken &ACT);
255};
256
257template <> struct MappingTraits<object::coff_load_configuration32> {
259};
260
261template <> struct MappingTraits<object::coff_load_configuration64> {
263};
264
265template <> struct MappingTraits<object::coff_load_config_code_integrity> {
266 LLVM_ABI static void mapping(IO &IO,
268};
269
270template <>
271struct MappingTraits<COFFYAML::Symbol> {
272 LLVM_ABI static void mapping(IO &IO, COFFYAML::Symbol &S);
273};
274
275template <> struct MappingTraits<COFFYAML::SectionDataEntry> {
276 LLVM_ABI static void mapping(IO &IO, COFFYAML::SectionDataEntry &Sec);
277};
278
279template <>
280struct MappingTraits<COFFYAML::Section> {
281 LLVM_ABI static void mapping(IO &IO, COFFYAML::Section &Sec);
282};
283
284template <>
285struct MappingTraits<COFFYAML::Object> {
286 LLVM_ABI static void mapping(IO &IO, COFFYAML::Object &Obj);
287};
288
289} // end namespace yaml
290} // end namespace llvm
291
292#endif // LLVM_OBJECTYAML_COFFYAML_H
#define LLVM_ABI
Definition Compiler.h:213
#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
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
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:31
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:117
std::vector< Section > Sections
Definition COFFYAML.h:119
std::vector< Symbol > Symbols
Definition COFFYAML.h:120
COFF::header Header
Definition COFFYAML.h:118
std::optional< COFF::DataDirectory > DataDirectories[COFF::NUM_DATA_DIRECTORIES]
Definition COFFYAML.h:113
COFF::PE32Header Header
Definition COFFYAML.h:111
std::optional< uint32_t > SymbolTableIndex
Definition COFFYAML.h:67
std::optional< object::coff_load_configuration64 > LoadConfig64
Definition COFFYAML.h:74
std::optional< object::coff_load_configuration32 > LoadConfig32
Definition COFFYAML.h:73
LLVM_ABI void writeAsBinary(raw_ostream &OS) const
std::optional< uint32_t > UInt32
Definition COFFYAML.h:71
LLVM_ABI size_t size() const
std::vector< CodeViewYAML::YAMLDebugSubsection > DebugS
Definition COFFYAML.h:84
std::vector< SectionDataEntry > StructuredData
Definition COFFYAML.h:88
std::vector< CodeViewYAML::LeafRecord > DebugT
Definition COFFYAML.h:85
yaml::BinaryRef SectionData
Definition COFFYAML.h:83
std::optional< CodeViewYAML::DebugHSection > DebugH
Definition COFFYAML.h:87
std::vector< CodeViewYAML::LeafRecord > DebugP
Definition COFFYAML.h:86
COFF::section Header
Definition COFFYAML.h:81
std::vector< Relocation > Relocations
Definition COFFYAML.h:89
std::optional< COFF::AuxiliaryWeakExternal > WeakExternal
Definition COFFYAML.h:101
std::optional< COFF::AuxiliarybfAndefSymbol > bfAndefSymbol
Definition COFFYAML.h:100
COFF::SymbolComplexType ComplexType
Definition COFFYAML.h:98
std::optional< COFF::AuxiliarySectionDefinition > SectionDefinition
Definition COFFYAML.h:103
std::optional< COFF::AuxiliaryFunctionDefinition > FunctionDefinition
Definition COFFYAML.h:99
COFF::symbol Header
Definition COFFYAML.h:96
COFF::SymbolBaseType SimpleType
Definition COFFYAML.h:97
std::optional< COFF::AuxiliaryCLRToken > CLRToken
Definition COFFYAML.h:104
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:725
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