1 //===- COFFYAML.cpp - COFF YAMLIO implementation --------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines classes for handling the YAML representation of COFF.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/ObjectYAML/COFFYAML.h"
15 #include "llvm/ADT/StringRef.h"
16 #include "llvm/Support/YAMLTraits.h"
20 #define ECase(X) IO.enumCase(Value, #X, COFF::X);
26 Section::Section() { memset(&Header
, 0, sizeof(COFF::section
)); }
27 Symbol::Symbol() { memset(&Header
, 0, sizeof(COFF::symbol
)); }
28 Object::Object() { memset(&Header
, 0, sizeof(COFF::header
)); }
30 } // end namespace COFFYAML
34 void ScalarEnumerationTraits
<COFFYAML::COMDATType
>::enumeration(
35 IO
&IO
, COFFYAML::COMDATType
&Value
) {
36 IO
.enumCase(Value
, "0", 0);
37 ECase(IMAGE_COMDAT_SELECT_NODUPLICATES
);
38 ECase(IMAGE_COMDAT_SELECT_ANY
);
39 ECase(IMAGE_COMDAT_SELECT_SAME_SIZE
);
40 ECase(IMAGE_COMDAT_SELECT_EXACT_MATCH
);
41 ECase(IMAGE_COMDAT_SELECT_ASSOCIATIVE
);
42 ECase(IMAGE_COMDAT_SELECT_LARGEST
);
43 ECase(IMAGE_COMDAT_SELECT_NEWEST
);
47 ScalarEnumerationTraits
<COFFYAML::WeakExternalCharacteristics
>::enumeration(
48 IO
&IO
, COFFYAML::WeakExternalCharacteristics
&Value
) {
49 IO
.enumCase(Value
, "0", 0);
50 ECase(IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY
);
51 ECase(IMAGE_WEAK_EXTERN_SEARCH_LIBRARY
);
52 ECase(IMAGE_WEAK_EXTERN_SEARCH_ALIAS
);
55 void ScalarEnumerationTraits
<COFFYAML::AuxSymbolType
>::enumeration(
56 IO
&IO
, COFFYAML::AuxSymbolType
&Value
) {
57 ECase(IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF
);
60 void ScalarEnumerationTraits
<COFF::MachineTypes
>::enumeration(
61 IO
&IO
, COFF::MachineTypes
&Value
) {
62 ECase(IMAGE_FILE_MACHINE_UNKNOWN
);
63 ECase(IMAGE_FILE_MACHINE_AM33
);
64 ECase(IMAGE_FILE_MACHINE_AMD64
);
65 ECase(IMAGE_FILE_MACHINE_ARM
);
66 ECase(IMAGE_FILE_MACHINE_ARMNT
);
67 ECase(IMAGE_FILE_MACHINE_ARM64
);
68 ECase(IMAGE_FILE_MACHINE_EBC
);
69 ECase(IMAGE_FILE_MACHINE_I386
);
70 ECase(IMAGE_FILE_MACHINE_IA64
);
71 ECase(IMAGE_FILE_MACHINE_M32R
);
72 ECase(IMAGE_FILE_MACHINE_MIPS16
);
73 ECase(IMAGE_FILE_MACHINE_MIPSFPU
);
74 ECase(IMAGE_FILE_MACHINE_MIPSFPU16
);
75 ECase(IMAGE_FILE_MACHINE_POWERPC
);
76 ECase(IMAGE_FILE_MACHINE_POWERPCFP
);
77 ECase(IMAGE_FILE_MACHINE_R4000
);
78 ECase(IMAGE_FILE_MACHINE_SH3
);
79 ECase(IMAGE_FILE_MACHINE_SH3DSP
);
80 ECase(IMAGE_FILE_MACHINE_SH4
);
81 ECase(IMAGE_FILE_MACHINE_SH5
);
82 ECase(IMAGE_FILE_MACHINE_THUMB
);
83 ECase(IMAGE_FILE_MACHINE_WCEMIPSV2
);
86 void ScalarEnumerationTraits
<COFF::SymbolBaseType
>::enumeration(
87 IO
&IO
, COFF::SymbolBaseType
&Value
) {
88 ECase(IMAGE_SYM_TYPE_NULL
);
89 ECase(IMAGE_SYM_TYPE_VOID
);
90 ECase(IMAGE_SYM_TYPE_CHAR
);
91 ECase(IMAGE_SYM_TYPE_SHORT
);
92 ECase(IMAGE_SYM_TYPE_INT
);
93 ECase(IMAGE_SYM_TYPE_LONG
);
94 ECase(IMAGE_SYM_TYPE_FLOAT
);
95 ECase(IMAGE_SYM_TYPE_DOUBLE
);
96 ECase(IMAGE_SYM_TYPE_STRUCT
);
97 ECase(IMAGE_SYM_TYPE_UNION
);
98 ECase(IMAGE_SYM_TYPE_ENUM
);
99 ECase(IMAGE_SYM_TYPE_MOE
);
100 ECase(IMAGE_SYM_TYPE_BYTE
);
101 ECase(IMAGE_SYM_TYPE_WORD
);
102 ECase(IMAGE_SYM_TYPE_UINT
);
103 ECase(IMAGE_SYM_TYPE_DWORD
);
106 void ScalarEnumerationTraits
<COFF::SymbolStorageClass
>::enumeration(
107 IO
&IO
, COFF::SymbolStorageClass
&Value
) {
108 ECase(IMAGE_SYM_CLASS_END_OF_FUNCTION
);
109 ECase(IMAGE_SYM_CLASS_NULL
);
110 ECase(IMAGE_SYM_CLASS_AUTOMATIC
);
111 ECase(IMAGE_SYM_CLASS_EXTERNAL
);
112 ECase(IMAGE_SYM_CLASS_STATIC
);
113 ECase(IMAGE_SYM_CLASS_REGISTER
);
114 ECase(IMAGE_SYM_CLASS_EXTERNAL_DEF
);
115 ECase(IMAGE_SYM_CLASS_LABEL
);
116 ECase(IMAGE_SYM_CLASS_UNDEFINED_LABEL
);
117 ECase(IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
);
118 ECase(IMAGE_SYM_CLASS_ARGUMENT
);
119 ECase(IMAGE_SYM_CLASS_STRUCT_TAG
);
120 ECase(IMAGE_SYM_CLASS_MEMBER_OF_UNION
);
121 ECase(IMAGE_SYM_CLASS_UNION_TAG
);
122 ECase(IMAGE_SYM_CLASS_TYPE_DEFINITION
);
123 ECase(IMAGE_SYM_CLASS_UNDEFINED_STATIC
);
124 ECase(IMAGE_SYM_CLASS_ENUM_TAG
);
125 ECase(IMAGE_SYM_CLASS_MEMBER_OF_ENUM
);
126 ECase(IMAGE_SYM_CLASS_REGISTER_PARAM
);
127 ECase(IMAGE_SYM_CLASS_BIT_FIELD
);
128 ECase(IMAGE_SYM_CLASS_BLOCK
);
129 ECase(IMAGE_SYM_CLASS_FUNCTION
);
130 ECase(IMAGE_SYM_CLASS_END_OF_STRUCT
);
131 ECase(IMAGE_SYM_CLASS_FILE
);
132 ECase(IMAGE_SYM_CLASS_SECTION
);
133 ECase(IMAGE_SYM_CLASS_WEAK_EXTERNAL
);
134 ECase(IMAGE_SYM_CLASS_CLR_TOKEN
);
137 void ScalarEnumerationTraits
<COFF::SymbolComplexType
>::enumeration(
138 IO
&IO
, COFF::SymbolComplexType
&Value
) {
139 ECase(IMAGE_SYM_DTYPE_NULL
);
140 ECase(IMAGE_SYM_DTYPE_POINTER
);
141 ECase(IMAGE_SYM_DTYPE_FUNCTION
);
142 ECase(IMAGE_SYM_DTYPE_ARRAY
);
145 void ScalarEnumerationTraits
<COFF::RelocationTypeI386
>::enumeration(
146 IO
&IO
, COFF::RelocationTypeI386
&Value
) {
147 ECase(IMAGE_REL_I386_ABSOLUTE
);
148 ECase(IMAGE_REL_I386_DIR16
);
149 ECase(IMAGE_REL_I386_REL16
);
150 ECase(IMAGE_REL_I386_DIR32
);
151 ECase(IMAGE_REL_I386_DIR32NB
);
152 ECase(IMAGE_REL_I386_SEG12
);
153 ECase(IMAGE_REL_I386_SECTION
);
154 ECase(IMAGE_REL_I386_SECREL
);
155 ECase(IMAGE_REL_I386_TOKEN
);
156 ECase(IMAGE_REL_I386_SECREL7
);
157 ECase(IMAGE_REL_I386_REL32
);
160 void ScalarEnumerationTraits
<COFF::RelocationTypeAMD64
>::enumeration(
161 IO
&IO
, COFF::RelocationTypeAMD64
&Value
) {
162 ECase(IMAGE_REL_AMD64_ABSOLUTE
);
163 ECase(IMAGE_REL_AMD64_ADDR64
);
164 ECase(IMAGE_REL_AMD64_ADDR32
);
165 ECase(IMAGE_REL_AMD64_ADDR32NB
);
166 ECase(IMAGE_REL_AMD64_REL32
);
167 ECase(IMAGE_REL_AMD64_REL32_1
);
168 ECase(IMAGE_REL_AMD64_REL32_2
);
169 ECase(IMAGE_REL_AMD64_REL32_3
);
170 ECase(IMAGE_REL_AMD64_REL32_4
);
171 ECase(IMAGE_REL_AMD64_REL32_5
);
172 ECase(IMAGE_REL_AMD64_SECTION
);
173 ECase(IMAGE_REL_AMD64_SECREL
);
174 ECase(IMAGE_REL_AMD64_SECREL7
);
175 ECase(IMAGE_REL_AMD64_TOKEN
);
176 ECase(IMAGE_REL_AMD64_SREL32
);
177 ECase(IMAGE_REL_AMD64_PAIR
);
178 ECase(IMAGE_REL_AMD64_SSPAN32
);
181 void ScalarEnumerationTraits
<COFF::WindowsSubsystem
>::enumeration(
182 IO
&IO
, COFF::WindowsSubsystem
&Value
) {
183 ECase(IMAGE_SUBSYSTEM_UNKNOWN
);
184 ECase(IMAGE_SUBSYSTEM_NATIVE
);
185 ECase(IMAGE_SUBSYSTEM_WINDOWS_GUI
);
186 ECase(IMAGE_SUBSYSTEM_WINDOWS_CUI
);
187 ECase(IMAGE_SUBSYSTEM_OS2_CUI
);
188 ECase(IMAGE_SUBSYSTEM_POSIX_CUI
);
189 ECase(IMAGE_SUBSYSTEM_NATIVE_WINDOWS
);
190 ECase(IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
);
191 ECase(IMAGE_SUBSYSTEM_EFI_APPLICATION
);
192 ECase(IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
);
193 ECase(IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
);
194 ECase(IMAGE_SUBSYSTEM_EFI_ROM
);
195 ECase(IMAGE_SUBSYSTEM_XBOX
);
196 ECase(IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
);
200 #define BCase(X) IO.bitSetCase(Value, #X, COFF::X);
201 void ScalarBitSetTraits
<COFF::Characteristics
>::bitset(
202 IO
&IO
, COFF::Characteristics
&Value
) {
203 BCase(IMAGE_FILE_RELOCS_STRIPPED
);
204 BCase(IMAGE_FILE_EXECUTABLE_IMAGE
);
205 BCase(IMAGE_FILE_LINE_NUMS_STRIPPED
);
206 BCase(IMAGE_FILE_LOCAL_SYMS_STRIPPED
);
207 BCase(IMAGE_FILE_AGGRESSIVE_WS_TRIM
);
208 BCase(IMAGE_FILE_LARGE_ADDRESS_AWARE
);
209 BCase(IMAGE_FILE_BYTES_REVERSED_LO
);
210 BCase(IMAGE_FILE_32BIT_MACHINE
);
211 BCase(IMAGE_FILE_DEBUG_STRIPPED
);
212 BCase(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
);
213 BCase(IMAGE_FILE_NET_RUN_FROM_SWAP
);
214 BCase(IMAGE_FILE_SYSTEM
);
215 BCase(IMAGE_FILE_DLL
);
216 BCase(IMAGE_FILE_UP_SYSTEM_ONLY
);
217 BCase(IMAGE_FILE_BYTES_REVERSED_HI
);
220 void ScalarBitSetTraits
<COFF::SectionCharacteristics
>::bitset(
221 IO
&IO
, COFF::SectionCharacteristics
&Value
) {
222 BCase(IMAGE_SCN_TYPE_NOLOAD
);
223 BCase(IMAGE_SCN_TYPE_NO_PAD
);
224 BCase(IMAGE_SCN_CNT_CODE
);
225 BCase(IMAGE_SCN_CNT_INITIALIZED_DATA
);
226 BCase(IMAGE_SCN_CNT_UNINITIALIZED_DATA
);
227 BCase(IMAGE_SCN_LNK_OTHER
);
228 BCase(IMAGE_SCN_LNK_INFO
);
229 BCase(IMAGE_SCN_LNK_REMOVE
);
230 BCase(IMAGE_SCN_LNK_COMDAT
);
231 BCase(IMAGE_SCN_GPREL
);
232 BCase(IMAGE_SCN_MEM_PURGEABLE
);
233 BCase(IMAGE_SCN_MEM_16BIT
);
234 BCase(IMAGE_SCN_MEM_LOCKED
);
235 BCase(IMAGE_SCN_MEM_PRELOAD
);
236 BCase(IMAGE_SCN_LNK_NRELOC_OVFL
);
237 BCase(IMAGE_SCN_MEM_DISCARDABLE
);
238 BCase(IMAGE_SCN_MEM_NOT_CACHED
);
239 BCase(IMAGE_SCN_MEM_NOT_PAGED
);
240 BCase(IMAGE_SCN_MEM_SHARED
);
241 BCase(IMAGE_SCN_MEM_EXECUTE
);
242 BCase(IMAGE_SCN_MEM_READ
);
243 BCase(IMAGE_SCN_MEM_WRITE
);
246 void ScalarBitSetTraits
<COFF::DLLCharacteristics
>::bitset(
247 IO
&IO
, COFF::DLLCharacteristics
&Value
) {
248 BCase(IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA
);
249 BCase(IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE
);
250 BCase(IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY
);
251 BCase(IMAGE_DLL_CHARACTERISTICS_NX_COMPAT
);
252 BCase(IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION
);
253 BCase(IMAGE_DLL_CHARACTERISTICS_NO_SEH
);
254 BCase(IMAGE_DLL_CHARACTERISTICS_NO_BIND
);
255 BCase(IMAGE_DLL_CHARACTERISTICS_APPCONTAINER
);
256 BCase(IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER
);
257 BCase(IMAGE_DLL_CHARACTERISTICS_GUARD_CF
);
258 BCase(IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE
);
264 struct NSectionSelectionType
{
265 NSectionSelectionType(IO
&)
266 : SelectionType(COFFYAML::COMDATType(0)) {}
267 NSectionSelectionType(IO
&, uint8_t C
)
268 : SelectionType(COFFYAML::COMDATType(C
)) {}
270 uint8_t denormalize(IO
&) { return SelectionType
; }
272 COFFYAML::COMDATType SelectionType
;
275 struct NWeakExternalCharacteristics
{
276 NWeakExternalCharacteristics(IO
&)
277 : Characteristics(COFFYAML::WeakExternalCharacteristics(0)) {}
278 NWeakExternalCharacteristics(IO
&, uint32_t C
)
279 : Characteristics(COFFYAML::WeakExternalCharacteristics(C
)) {}
281 uint32_t denormalize(IO
&) { return Characteristics
; }
283 COFFYAML::WeakExternalCharacteristics Characteristics
;
286 struct NSectionCharacteristics
{
287 NSectionCharacteristics(IO
&)
288 : Characteristics(COFF::SectionCharacteristics(0)) {}
289 NSectionCharacteristics(IO
&, uint32_t C
)
290 : Characteristics(COFF::SectionCharacteristics(C
)) {}
292 uint32_t denormalize(IO
&) { return Characteristics
; }
294 COFF::SectionCharacteristics Characteristics
;
297 struct NAuxTokenType
{
299 : AuxType(COFFYAML::AuxSymbolType(0)) {}
300 NAuxTokenType(IO
&, uint8_t C
)
301 : AuxType(COFFYAML::AuxSymbolType(C
)) {}
303 uint32_t denormalize(IO
&) { return AuxType
; }
305 COFFYAML::AuxSymbolType AuxType
;
308 struct NStorageClass
{
309 NStorageClass(IO
&) : StorageClass(COFF::SymbolStorageClass(0)) {}
310 NStorageClass(IO
&, uint8_t S
) : StorageClass(COFF::SymbolStorageClass(S
)) {}
312 uint8_t denormalize(IO
&) { return StorageClass
; }
314 COFF::SymbolStorageClass StorageClass
;
318 NMachine(IO
&) : Machine(COFF::MachineTypes(0)) {}
319 NMachine(IO
&, uint16_t M
) : Machine(COFF::MachineTypes(M
)) {}
321 uint16_t denormalize(IO
&) { return Machine
; }
323 COFF::MachineTypes Machine
;
326 struct NHeaderCharacteristics
{
327 NHeaderCharacteristics(IO
&) : Characteristics(COFF::Characteristics(0)) {}
328 NHeaderCharacteristics(IO
&, uint16_t C
)
329 : Characteristics(COFF::Characteristics(C
)) {}
331 uint16_t denormalize(IO
&) { return Characteristics
; }
333 COFF::Characteristics Characteristics
;
336 template <typename RelocType
>
338 NType(IO
&) : Type(RelocType(0)) {}
339 NType(IO
&, uint16_t T
) : Type(RelocType(T
)) {}
341 uint16_t denormalize(IO
&) { return Type
; }
346 struct NWindowsSubsystem
{
347 NWindowsSubsystem(IO
&) : Subsystem(COFF::WindowsSubsystem(0)) {}
348 NWindowsSubsystem(IO
&, uint16_t C
) : Subsystem(COFF::WindowsSubsystem(C
)) {}
350 uint16_t denormalize(IO
&) { return Subsystem
; }
352 COFF::WindowsSubsystem Subsystem
;
355 struct NDLLCharacteristics
{
356 NDLLCharacteristics(IO
&) : Characteristics(COFF::DLLCharacteristics(0)) {}
357 NDLLCharacteristics(IO
&, uint16_t C
)
358 : Characteristics(COFF::DLLCharacteristics(C
)) {}
360 uint16_t denormalize(IO
&) { return Characteristics
; }
362 COFF::DLLCharacteristics Characteristics
;
365 } // end anonymous namespace
367 void MappingTraits
<COFFYAML::Relocation
>::mapping(IO
&IO
,
368 COFFYAML::Relocation
&Rel
) {
369 IO
.mapRequired("VirtualAddress", Rel
.VirtualAddress
);
370 IO
.mapRequired("SymbolName", Rel
.SymbolName
);
372 COFF::header
&H
= *static_cast<COFF::header
*>(IO
.getContext());
373 if (H
.Machine
== COFF::IMAGE_FILE_MACHINE_I386
) {
374 MappingNormalization
<NType
<COFF::RelocationTypeI386
>, uint16_t> NT(
376 IO
.mapRequired("Type", NT
->Type
);
377 } else if (H
.Machine
== COFF::IMAGE_FILE_MACHINE_AMD64
) {
378 MappingNormalization
<NType
<COFF::RelocationTypeAMD64
>, uint16_t> NT(
380 IO
.mapRequired("Type", NT
->Type
);
382 IO
.mapRequired("Type", Rel
.Type
);
386 void MappingTraits
<COFF::DataDirectory
>::mapping(IO
&IO
,
387 COFF::DataDirectory
&DD
) {
388 IO
.mapRequired("RelativeVirtualAddress", DD
.RelativeVirtualAddress
);
389 IO
.mapRequired("Size", DD
.Size
);
392 void MappingTraits
<COFFYAML::PEHeader
>::mapping(IO
&IO
,
393 COFFYAML::PEHeader
&PH
) {
394 MappingNormalization
<NWindowsSubsystem
, uint16_t> NWS(IO
,
395 PH
.Header
.Subsystem
);
396 MappingNormalization
<NDLLCharacteristics
, uint16_t> NDC(
397 IO
, PH
.Header
.DLLCharacteristics
);
399 IO
.mapRequired("AddressOfEntryPoint", PH
.Header
.AddressOfEntryPoint
);
400 IO
.mapRequired("ImageBase", PH
.Header
.ImageBase
);
401 IO
.mapRequired("SectionAlignment", PH
.Header
.SectionAlignment
);
402 IO
.mapRequired("FileAlignment", PH
.Header
.FileAlignment
);
403 IO
.mapRequired("MajorOperatingSystemVersion",
404 PH
.Header
.MajorOperatingSystemVersion
);
405 IO
.mapRequired("MinorOperatingSystemVersion",
406 PH
.Header
.MinorOperatingSystemVersion
);
407 IO
.mapRequired("MajorImageVersion", PH
.Header
.MajorImageVersion
);
408 IO
.mapRequired("MinorImageVersion", PH
.Header
.MinorImageVersion
);
409 IO
.mapRequired("MajorSubsystemVersion", PH
.Header
.MajorSubsystemVersion
);
410 IO
.mapRequired("MinorSubsystemVersion", PH
.Header
.MinorSubsystemVersion
);
411 IO
.mapRequired("Subsystem", NWS
->Subsystem
);
412 IO
.mapRequired("DLLCharacteristics", NDC
->Characteristics
);
413 IO
.mapRequired("SizeOfStackReserve", PH
.Header
.SizeOfStackReserve
);
414 IO
.mapRequired("SizeOfStackCommit", PH
.Header
.SizeOfStackCommit
);
415 IO
.mapRequired("SizeOfHeapReserve", PH
.Header
.SizeOfHeapReserve
);
416 IO
.mapRequired("SizeOfHeapCommit", PH
.Header
.SizeOfHeapCommit
);
418 IO
.mapOptional("ExportTable", PH
.DataDirectories
[COFF::EXPORT_TABLE
]);
419 IO
.mapOptional("ImportTable", PH
.DataDirectories
[COFF::IMPORT_TABLE
]);
420 IO
.mapOptional("ResourceTable", PH
.DataDirectories
[COFF::RESOURCE_TABLE
]);
421 IO
.mapOptional("ExceptionTable", PH
.DataDirectories
[COFF::EXCEPTION_TABLE
]);
422 IO
.mapOptional("CertificateTable", PH
.DataDirectories
[COFF::CERTIFICATE_TABLE
]);
423 IO
.mapOptional("BaseRelocationTable",
424 PH
.DataDirectories
[COFF::BASE_RELOCATION_TABLE
]);
425 IO
.mapOptional("Debug", PH
.DataDirectories
[COFF::DEBUG_DIRECTORY
]);
426 IO
.mapOptional("Architecture", PH
.DataDirectories
[COFF::ARCHITECTURE
]);
427 IO
.mapOptional("GlobalPtr", PH
.DataDirectories
[COFF::GLOBAL_PTR
]);
428 IO
.mapOptional("TlsTable", PH
.DataDirectories
[COFF::TLS_TABLE
]);
429 IO
.mapOptional("LoadConfigTable",
430 PH
.DataDirectories
[COFF::LOAD_CONFIG_TABLE
]);
431 IO
.mapOptional("BoundImport", PH
.DataDirectories
[COFF::BOUND_IMPORT
]);
432 IO
.mapOptional("IAT", PH
.DataDirectories
[COFF::IAT
]);
433 IO
.mapOptional("DelayImportDescriptor",
434 PH
.DataDirectories
[COFF::DELAY_IMPORT_DESCRIPTOR
]);
435 IO
.mapOptional("ClrRuntimeHeader",
436 PH
.DataDirectories
[COFF::CLR_RUNTIME_HEADER
]);
439 void MappingTraits
<COFF::header
>::mapping(IO
&IO
, COFF::header
&H
) {
440 MappingNormalization
<NMachine
, uint16_t> NM(IO
, H
.Machine
);
441 MappingNormalization
<NHeaderCharacteristics
, uint16_t> NC(IO
,
444 IO
.mapRequired("Machine", NM
->Machine
);
445 IO
.mapOptional("Characteristics", NC
->Characteristics
);
446 IO
.setContext(static_cast<void *>(&H
));
449 void MappingTraits
<COFF::AuxiliaryFunctionDefinition
>::mapping(
450 IO
&IO
, COFF::AuxiliaryFunctionDefinition
&AFD
) {
451 IO
.mapRequired("TagIndex", AFD
.TagIndex
);
452 IO
.mapRequired("TotalSize", AFD
.TotalSize
);
453 IO
.mapRequired("PointerToLinenumber", AFD
.PointerToLinenumber
);
454 IO
.mapRequired("PointerToNextFunction", AFD
.PointerToNextFunction
);
457 void MappingTraits
<COFF::AuxiliarybfAndefSymbol
>::mapping(
458 IO
&IO
, COFF::AuxiliarybfAndefSymbol
&AAS
) {
459 IO
.mapRequired("Linenumber", AAS
.Linenumber
);
460 IO
.mapRequired("PointerToNextFunction", AAS
.PointerToNextFunction
);
463 void MappingTraits
<COFF::AuxiliaryWeakExternal
>::mapping(
464 IO
&IO
, COFF::AuxiliaryWeakExternal
&AWE
) {
465 MappingNormalization
<NWeakExternalCharacteristics
, uint32_t> NWEC(
466 IO
, AWE
.Characteristics
);
467 IO
.mapRequired("TagIndex", AWE
.TagIndex
);
468 IO
.mapRequired("Characteristics", NWEC
->Characteristics
);
471 void MappingTraits
<COFF::AuxiliarySectionDefinition
>::mapping(
472 IO
&IO
, COFF::AuxiliarySectionDefinition
&ASD
) {
473 MappingNormalization
<NSectionSelectionType
, uint8_t> NSST(
476 IO
.mapRequired("Length", ASD
.Length
);
477 IO
.mapRequired("NumberOfRelocations", ASD
.NumberOfRelocations
);
478 IO
.mapRequired("NumberOfLinenumbers", ASD
.NumberOfLinenumbers
);
479 IO
.mapRequired("CheckSum", ASD
.CheckSum
);
480 IO
.mapRequired("Number", ASD
.Number
);
481 IO
.mapOptional("Selection", NSST
->SelectionType
, COFFYAML::COMDATType(0));
484 void MappingTraits
<COFF::AuxiliaryCLRToken
>::mapping(
485 IO
&IO
, COFF::AuxiliaryCLRToken
&ACT
) {
486 MappingNormalization
<NAuxTokenType
, uint8_t> NATT(IO
, ACT
.AuxType
);
487 IO
.mapRequired("AuxType", NATT
->AuxType
);
488 IO
.mapRequired("SymbolTableIndex", ACT
.SymbolTableIndex
);
491 void MappingTraits
<COFFYAML::Symbol
>::mapping(IO
&IO
, COFFYAML::Symbol
&S
) {
492 MappingNormalization
<NStorageClass
, uint8_t> NS(IO
, S
.Header
.StorageClass
);
494 IO
.mapRequired("Name", S
.Name
);
495 IO
.mapRequired("Value", S
.Header
.Value
);
496 IO
.mapRequired("SectionNumber", S
.Header
.SectionNumber
);
497 IO
.mapRequired("SimpleType", S
.SimpleType
);
498 IO
.mapRequired("ComplexType", S
.ComplexType
);
499 IO
.mapRequired("StorageClass", NS
->StorageClass
);
500 IO
.mapOptional("FunctionDefinition", S
.FunctionDefinition
);
501 IO
.mapOptional("bfAndefSymbol", S
.bfAndefSymbol
);
502 IO
.mapOptional("WeakExternal", S
.WeakExternal
);
503 IO
.mapOptional("File", S
.File
, StringRef());
504 IO
.mapOptional("SectionDefinition", S
.SectionDefinition
);
505 IO
.mapOptional("CLRToken", S
.CLRToken
);
508 void MappingTraits
<COFFYAML::Section
>::mapping(IO
&IO
, COFFYAML::Section
&Sec
) {
509 MappingNormalization
<NSectionCharacteristics
, uint32_t> NC(
510 IO
, Sec
.Header
.Characteristics
);
511 IO
.mapRequired("Name", Sec
.Name
);
512 IO
.mapRequired("Characteristics", NC
->Characteristics
);
513 IO
.mapOptional("VirtualAddress", Sec
.Header
.VirtualAddress
, 0U);
514 IO
.mapOptional("VirtualSize", Sec
.Header
.VirtualSize
, 0U);
515 IO
.mapOptional("Alignment", Sec
.Alignment
, 0U);
517 // If this is a .debug$S or .debug$T section parse the semantic representation
518 // of the symbols/types. If it is any other kind of section, just deal in raw
520 IO
.mapOptional("SectionData", Sec
.SectionData
);
521 if (Sec
.Name
== ".debug$S")
522 IO
.mapOptional("Subsections", Sec
.DebugS
);
523 else if (Sec
.Name
== ".debug$T")
524 IO
.mapOptional("Types", Sec
.DebugT
);
526 IO
.mapOptional("Relocations", Sec
.Relocations
);
529 void MappingTraits
<COFFYAML::Object
>::mapping(IO
&IO
, COFFYAML::Object
&Obj
) {
530 IO
.mapTag("!COFF", true);
531 IO
.mapOptional("OptionalHeader", Obj
.OptionalHeader
);
532 IO
.mapRequired("header", Obj
.Header
);
533 IO
.mapRequired("sections", Obj
.Sections
);
534 IO
.mapRequired("symbols", Obj
.Symbols
);
537 } // end namespace yaml
539 } // end namespace llvm