109467b48Spatrick //===- COFFYAML.cpp - COFF YAMLIO implementation --------------------------===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick //
909467b48Spatrick // This file defines classes for handling the YAML representation of COFF.
1009467b48Spatrick //
1109467b48Spatrick //===----------------------------------------------------------------------===//
1209467b48Spatrick 
1309467b48Spatrick #include "llvm/ObjectYAML/COFFYAML.h"
1409467b48Spatrick #include "llvm/ADT/StringRef.h"
1509467b48Spatrick #include "llvm/Support/YAMLTraits.h"
1609467b48Spatrick #include <cstdint>
1709467b48Spatrick #include <cstring>
1809467b48Spatrick 
1909467b48Spatrick #define ECase(X) IO.enumCase(Value, #X, COFF::X);
2009467b48Spatrick 
2109467b48Spatrick namespace llvm {
2209467b48Spatrick 
2309467b48Spatrick namespace COFFYAML {
2409467b48Spatrick 
Section()2509467b48Spatrick Section::Section() { memset(&Header, 0, sizeof(COFF::section)); }
Symbol()2609467b48Spatrick Symbol::Symbol() { memset(&Header, 0, sizeof(COFF::symbol)); }
Object()2709467b48Spatrick Object::Object() { memset(&Header, 0, sizeof(COFF::header)); }
2809467b48Spatrick 
2909467b48Spatrick } // end namespace COFFYAML
3009467b48Spatrick 
3109467b48Spatrick namespace yaml {
3209467b48Spatrick 
enumeration(IO & IO,COFFYAML::COMDATType & Value)3309467b48Spatrick void ScalarEnumerationTraits<COFFYAML::COMDATType>::enumeration(
3409467b48Spatrick     IO &IO, COFFYAML::COMDATType &Value) {
3509467b48Spatrick   IO.enumCase(Value, "0", 0);
3609467b48Spatrick   ECase(IMAGE_COMDAT_SELECT_NODUPLICATES);
3709467b48Spatrick   ECase(IMAGE_COMDAT_SELECT_ANY);
3809467b48Spatrick   ECase(IMAGE_COMDAT_SELECT_SAME_SIZE);
3909467b48Spatrick   ECase(IMAGE_COMDAT_SELECT_EXACT_MATCH);
4009467b48Spatrick   ECase(IMAGE_COMDAT_SELECT_ASSOCIATIVE);
4109467b48Spatrick   ECase(IMAGE_COMDAT_SELECT_LARGEST);
4209467b48Spatrick   ECase(IMAGE_COMDAT_SELECT_NEWEST);
4309467b48Spatrick }
4409467b48Spatrick 
4509467b48Spatrick void
enumeration(IO & IO,COFFYAML::WeakExternalCharacteristics & Value)4609467b48Spatrick ScalarEnumerationTraits<COFFYAML::WeakExternalCharacteristics>::enumeration(
4709467b48Spatrick     IO &IO, COFFYAML::WeakExternalCharacteristics &Value) {
4809467b48Spatrick   IO.enumCase(Value, "0", 0);
4909467b48Spatrick   ECase(IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY);
5009467b48Spatrick   ECase(IMAGE_WEAK_EXTERN_SEARCH_LIBRARY);
5109467b48Spatrick   ECase(IMAGE_WEAK_EXTERN_SEARCH_ALIAS);
5273471bf0Spatrick   ECase(IMAGE_WEAK_EXTERN_ANTI_DEPENDENCY);
5309467b48Spatrick }
5409467b48Spatrick 
enumeration(IO & IO,COFFYAML::AuxSymbolType & Value)5509467b48Spatrick void ScalarEnumerationTraits<COFFYAML::AuxSymbolType>::enumeration(
5609467b48Spatrick     IO &IO, COFFYAML::AuxSymbolType &Value) {
5709467b48Spatrick   ECase(IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF);
5809467b48Spatrick }
5909467b48Spatrick 
enumeration(IO & IO,COFF::MachineTypes & Value)6009467b48Spatrick void ScalarEnumerationTraits<COFF::MachineTypes>::enumeration(
6109467b48Spatrick     IO &IO, COFF::MachineTypes &Value) {
6209467b48Spatrick   ECase(IMAGE_FILE_MACHINE_UNKNOWN);
6309467b48Spatrick   ECase(IMAGE_FILE_MACHINE_AM33);
6409467b48Spatrick   ECase(IMAGE_FILE_MACHINE_AMD64);
6509467b48Spatrick   ECase(IMAGE_FILE_MACHINE_ARM);
6609467b48Spatrick   ECase(IMAGE_FILE_MACHINE_ARMNT);
6709467b48Spatrick   ECase(IMAGE_FILE_MACHINE_ARM64);
68*d415bd75Srobert   ECase(IMAGE_FILE_MACHINE_ARM64EC);
6909467b48Spatrick   ECase(IMAGE_FILE_MACHINE_EBC);
7009467b48Spatrick   ECase(IMAGE_FILE_MACHINE_I386);
7109467b48Spatrick   ECase(IMAGE_FILE_MACHINE_IA64);
7209467b48Spatrick   ECase(IMAGE_FILE_MACHINE_M32R);
7309467b48Spatrick   ECase(IMAGE_FILE_MACHINE_MIPS16);
7409467b48Spatrick   ECase(IMAGE_FILE_MACHINE_MIPSFPU);
7509467b48Spatrick   ECase(IMAGE_FILE_MACHINE_MIPSFPU16);
7609467b48Spatrick   ECase(IMAGE_FILE_MACHINE_POWERPC);
7709467b48Spatrick   ECase(IMAGE_FILE_MACHINE_POWERPCFP);
7809467b48Spatrick   ECase(IMAGE_FILE_MACHINE_R4000);
79*d415bd75Srobert   ECase(IMAGE_FILE_MACHINE_RISCV32);
80*d415bd75Srobert   ECase(IMAGE_FILE_MACHINE_RISCV64);
81*d415bd75Srobert   ECase(IMAGE_FILE_MACHINE_RISCV128);
8209467b48Spatrick   ECase(IMAGE_FILE_MACHINE_SH3);
8309467b48Spatrick   ECase(IMAGE_FILE_MACHINE_SH3DSP);
8409467b48Spatrick   ECase(IMAGE_FILE_MACHINE_SH4);
8509467b48Spatrick   ECase(IMAGE_FILE_MACHINE_SH5);
8609467b48Spatrick   ECase(IMAGE_FILE_MACHINE_THUMB);
8709467b48Spatrick   ECase(IMAGE_FILE_MACHINE_WCEMIPSV2);
8809467b48Spatrick }
8909467b48Spatrick 
enumeration(IO & IO,COFF::SymbolBaseType & Value)9009467b48Spatrick void ScalarEnumerationTraits<COFF::SymbolBaseType>::enumeration(
9109467b48Spatrick     IO &IO, COFF::SymbolBaseType &Value) {
9209467b48Spatrick   ECase(IMAGE_SYM_TYPE_NULL);
9309467b48Spatrick   ECase(IMAGE_SYM_TYPE_VOID);
9409467b48Spatrick   ECase(IMAGE_SYM_TYPE_CHAR);
9509467b48Spatrick   ECase(IMAGE_SYM_TYPE_SHORT);
9609467b48Spatrick   ECase(IMAGE_SYM_TYPE_INT);
9709467b48Spatrick   ECase(IMAGE_SYM_TYPE_LONG);
9809467b48Spatrick   ECase(IMAGE_SYM_TYPE_FLOAT);
9909467b48Spatrick   ECase(IMAGE_SYM_TYPE_DOUBLE);
10009467b48Spatrick   ECase(IMAGE_SYM_TYPE_STRUCT);
10109467b48Spatrick   ECase(IMAGE_SYM_TYPE_UNION);
10209467b48Spatrick   ECase(IMAGE_SYM_TYPE_ENUM);
10309467b48Spatrick   ECase(IMAGE_SYM_TYPE_MOE);
10409467b48Spatrick   ECase(IMAGE_SYM_TYPE_BYTE);
10509467b48Spatrick   ECase(IMAGE_SYM_TYPE_WORD);
10609467b48Spatrick   ECase(IMAGE_SYM_TYPE_UINT);
10709467b48Spatrick   ECase(IMAGE_SYM_TYPE_DWORD);
10809467b48Spatrick }
10909467b48Spatrick 
enumeration(IO & IO,COFF::SymbolStorageClass & Value)11009467b48Spatrick void ScalarEnumerationTraits<COFF::SymbolStorageClass>::enumeration(
11109467b48Spatrick     IO &IO, COFF::SymbolStorageClass &Value) {
11209467b48Spatrick   ECase(IMAGE_SYM_CLASS_END_OF_FUNCTION);
11309467b48Spatrick   ECase(IMAGE_SYM_CLASS_NULL);
11409467b48Spatrick   ECase(IMAGE_SYM_CLASS_AUTOMATIC);
11509467b48Spatrick   ECase(IMAGE_SYM_CLASS_EXTERNAL);
11609467b48Spatrick   ECase(IMAGE_SYM_CLASS_STATIC);
11709467b48Spatrick   ECase(IMAGE_SYM_CLASS_REGISTER);
11809467b48Spatrick   ECase(IMAGE_SYM_CLASS_EXTERNAL_DEF);
11909467b48Spatrick   ECase(IMAGE_SYM_CLASS_LABEL);
12009467b48Spatrick   ECase(IMAGE_SYM_CLASS_UNDEFINED_LABEL);
12109467b48Spatrick   ECase(IMAGE_SYM_CLASS_MEMBER_OF_STRUCT);
12209467b48Spatrick   ECase(IMAGE_SYM_CLASS_ARGUMENT);
12309467b48Spatrick   ECase(IMAGE_SYM_CLASS_STRUCT_TAG);
12409467b48Spatrick   ECase(IMAGE_SYM_CLASS_MEMBER_OF_UNION);
12509467b48Spatrick   ECase(IMAGE_SYM_CLASS_UNION_TAG);
12609467b48Spatrick   ECase(IMAGE_SYM_CLASS_TYPE_DEFINITION);
12709467b48Spatrick   ECase(IMAGE_SYM_CLASS_UNDEFINED_STATIC);
12809467b48Spatrick   ECase(IMAGE_SYM_CLASS_ENUM_TAG);
12909467b48Spatrick   ECase(IMAGE_SYM_CLASS_MEMBER_OF_ENUM);
13009467b48Spatrick   ECase(IMAGE_SYM_CLASS_REGISTER_PARAM);
13109467b48Spatrick   ECase(IMAGE_SYM_CLASS_BIT_FIELD);
13209467b48Spatrick   ECase(IMAGE_SYM_CLASS_BLOCK);
13309467b48Spatrick   ECase(IMAGE_SYM_CLASS_FUNCTION);
13409467b48Spatrick   ECase(IMAGE_SYM_CLASS_END_OF_STRUCT);
13509467b48Spatrick   ECase(IMAGE_SYM_CLASS_FILE);
13609467b48Spatrick   ECase(IMAGE_SYM_CLASS_SECTION);
13709467b48Spatrick   ECase(IMAGE_SYM_CLASS_WEAK_EXTERNAL);
13809467b48Spatrick   ECase(IMAGE_SYM_CLASS_CLR_TOKEN);
13909467b48Spatrick }
14009467b48Spatrick 
enumeration(IO & IO,COFF::SymbolComplexType & Value)14109467b48Spatrick void ScalarEnumerationTraits<COFF::SymbolComplexType>::enumeration(
14209467b48Spatrick     IO &IO, COFF::SymbolComplexType &Value) {
14309467b48Spatrick   ECase(IMAGE_SYM_DTYPE_NULL);
14409467b48Spatrick   ECase(IMAGE_SYM_DTYPE_POINTER);
14509467b48Spatrick   ECase(IMAGE_SYM_DTYPE_FUNCTION);
14609467b48Spatrick   ECase(IMAGE_SYM_DTYPE_ARRAY);
14709467b48Spatrick }
14809467b48Spatrick 
enumeration(IO & IO,COFF::RelocationTypeI386 & Value)14909467b48Spatrick void ScalarEnumerationTraits<COFF::RelocationTypeI386>::enumeration(
15009467b48Spatrick     IO &IO, COFF::RelocationTypeI386 &Value) {
15109467b48Spatrick   ECase(IMAGE_REL_I386_ABSOLUTE);
15209467b48Spatrick   ECase(IMAGE_REL_I386_DIR16);
15309467b48Spatrick   ECase(IMAGE_REL_I386_REL16);
15409467b48Spatrick   ECase(IMAGE_REL_I386_DIR32);
15509467b48Spatrick   ECase(IMAGE_REL_I386_DIR32NB);
15609467b48Spatrick   ECase(IMAGE_REL_I386_SEG12);
15709467b48Spatrick   ECase(IMAGE_REL_I386_SECTION);
15809467b48Spatrick   ECase(IMAGE_REL_I386_SECREL);
15909467b48Spatrick   ECase(IMAGE_REL_I386_TOKEN);
16009467b48Spatrick   ECase(IMAGE_REL_I386_SECREL7);
16109467b48Spatrick   ECase(IMAGE_REL_I386_REL32);
16209467b48Spatrick }
16309467b48Spatrick 
enumeration(IO & IO,COFF::RelocationTypeAMD64 & Value)16409467b48Spatrick void ScalarEnumerationTraits<COFF::RelocationTypeAMD64>::enumeration(
16509467b48Spatrick     IO &IO, COFF::RelocationTypeAMD64 &Value) {
16609467b48Spatrick   ECase(IMAGE_REL_AMD64_ABSOLUTE);
16709467b48Spatrick   ECase(IMAGE_REL_AMD64_ADDR64);
16809467b48Spatrick   ECase(IMAGE_REL_AMD64_ADDR32);
16909467b48Spatrick   ECase(IMAGE_REL_AMD64_ADDR32NB);
17009467b48Spatrick   ECase(IMAGE_REL_AMD64_REL32);
17109467b48Spatrick   ECase(IMAGE_REL_AMD64_REL32_1);
17209467b48Spatrick   ECase(IMAGE_REL_AMD64_REL32_2);
17309467b48Spatrick   ECase(IMAGE_REL_AMD64_REL32_3);
17409467b48Spatrick   ECase(IMAGE_REL_AMD64_REL32_4);
17509467b48Spatrick   ECase(IMAGE_REL_AMD64_REL32_5);
17609467b48Spatrick   ECase(IMAGE_REL_AMD64_SECTION);
17709467b48Spatrick   ECase(IMAGE_REL_AMD64_SECREL);
17809467b48Spatrick   ECase(IMAGE_REL_AMD64_SECREL7);
17909467b48Spatrick   ECase(IMAGE_REL_AMD64_TOKEN);
18009467b48Spatrick   ECase(IMAGE_REL_AMD64_SREL32);
18109467b48Spatrick   ECase(IMAGE_REL_AMD64_PAIR);
18209467b48Spatrick   ECase(IMAGE_REL_AMD64_SSPAN32);
18309467b48Spatrick }
18409467b48Spatrick 
enumeration(IO & IO,COFF::RelocationTypesARM & Value)18509467b48Spatrick void ScalarEnumerationTraits<COFF::RelocationTypesARM>::enumeration(
18609467b48Spatrick     IO &IO, COFF::RelocationTypesARM &Value) {
18709467b48Spatrick   ECase(IMAGE_REL_ARM_ABSOLUTE);
18809467b48Spatrick   ECase(IMAGE_REL_ARM_ADDR32);
18909467b48Spatrick   ECase(IMAGE_REL_ARM_ADDR32NB);
19009467b48Spatrick   ECase(IMAGE_REL_ARM_BRANCH24);
19109467b48Spatrick   ECase(IMAGE_REL_ARM_BRANCH11);
19209467b48Spatrick   ECase(IMAGE_REL_ARM_TOKEN);
19309467b48Spatrick   ECase(IMAGE_REL_ARM_BLX24);
19409467b48Spatrick   ECase(IMAGE_REL_ARM_BLX11);
19509467b48Spatrick   ECase(IMAGE_REL_ARM_REL32);
19609467b48Spatrick   ECase(IMAGE_REL_ARM_SECTION);
19709467b48Spatrick   ECase(IMAGE_REL_ARM_SECREL);
19809467b48Spatrick   ECase(IMAGE_REL_ARM_MOV32A);
19909467b48Spatrick   ECase(IMAGE_REL_ARM_MOV32T);
20009467b48Spatrick   ECase(IMAGE_REL_ARM_BRANCH20T);
20109467b48Spatrick   ECase(IMAGE_REL_ARM_BRANCH24T);
20209467b48Spatrick   ECase(IMAGE_REL_ARM_BLX23T);
20309467b48Spatrick   ECase(IMAGE_REL_ARM_PAIR);
20409467b48Spatrick }
20509467b48Spatrick 
enumeration(IO & IO,COFF::RelocationTypesARM64 & Value)20609467b48Spatrick void ScalarEnumerationTraits<COFF::RelocationTypesARM64>::enumeration(
20709467b48Spatrick     IO &IO, COFF::RelocationTypesARM64 &Value) {
20809467b48Spatrick   ECase(IMAGE_REL_ARM64_ABSOLUTE);
20909467b48Spatrick   ECase(IMAGE_REL_ARM64_ADDR32);
21009467b48Spatrick   ECase(IMAGE_REL_ARM64_ADDR32NB);
21109467b48Spatrick   ECase(IMAGE_REL_ARM64_BRANCH26);
21209467b48Spatrick   ECase(IMAGE_REL_ARM64_PAGEBASE_REL21);
21309467b48Spatrick   ECase(IMAGE_REL_ARM64_REL21);
21409467b48Spatrick   ECase(IMAGE_REL_ARM64_PAGEOFFSET_12A);
21509467b48Spatrick   ECase(IMAGE_REL_ARM64_PAGEOFFSET_12L);
21609467b48Spatrick   ECase(IMAGE_REL_ARM64_SECREL);
21709467b48Spatrick   ECase(IMAGE_REL_ARM64_SECREL_LOW12A);
21809467b48Spatrick   ECase(IMAGE_REL_ARM64_SECREL_HIGH12A);
21909467b48Spatrick   ECase(IMAGE_REL_ARM64_SECREL_LOW12L);
22009467b48Spatrick   ECase(IMAGE_REL_ARM64_TOKEN);
22109467b48Spatrick   ECase(IMAGE_REL_ARM64_SECTION);
22209467b48Spatrick   ECase(IMAGE_REL_ARM64_ADDR64);
22309467b48Spatrick   ECase(IMAGE_REL_ARM64_BRANCH19);
22409467b48Spatrick   ECase(IMAGE_REL_ARM64_BRANCH14);
22509467b48Spatrick   ECase(IMAGE_REL_ARM64_REL32);
22609467b48Spatrick }
22709467b48Spatrick 
enumeration(IO & IO,COFF::WindowsSubsystem & Value)22809467b48Spatrick void ScalarEnumerationTraits<COFF::WindowsSubsystem>::enumeration(
22909467b48Spatrick     IO &IO, COFF::WindowsSubsystem &Value) {
23009467b48Spatrick   ECase(IMAGE_SUBSYSTEM_UNKNOWN);
23109467b48Spatrick   ECase(IMAGE_SUBSYSTEM_NATIVE);
23209467b48Spatrick   ECase(IMAGE_SUBSYSTEM_WINDOWS_GUI);
23309467b48Spatrick   ECase(IMAGE_SUBSYSTEM_WINDOWS_CUI);
23409467b48Spatrick   ECase(IMAGE_SUBSYSTEM_OS2_CUI);
23509467b48Spatrick   ECase(IMAGE_SUBSYSTEM_POSIX_CUI);
23609467b48Spatrick   ECase(IMAGE_SUBSYSTEM_NATIVE_WINDOWS);
23709467b48Spatrick   ECase(IMAGE_SUBSYSTEM_WINDOWS_CE_GUI);
23809467b48Spatrick   ECase(IMAGE_SUBSYSTEM_EFI_APPLICATION);
23909467b48Spatrick   ECase(IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER);
24009467b48Spatrick   ECase(IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER);
24109467b48Spatrick   ECase(IMAGE_SUBSYSTEM_EFI_ROM);
24209467b48Spatrick   ECase(IMAGE_SUBSYSTEM_XBOX);
24309467b48Spatrick   ECase(IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION);
24409467b48Spatrick }
24509467b48Spatrick #undef ECase
24609467b48Spatrick 
24709467b48Spatrick #define BCase(X) IO.bitSetCase(Value, #X, COFF::X);
bitset(IO & IO,COFF::Characteristics & Value)24809467b48Spatrick void ScalarBitSetTraits<COFF::Characteristics>::bitset(
24909467b48Spatrick     IO &IO, COFF::Characteristics &Value) {
25009467b48Spatrick   BCase(IMAGE_FILE_RELOCS_STRIPPED);
25109467b48Spatrick   BCase(IMAGE_FILE_EXECUTABLE_IMAGE);
25209467b48Spatrick   BCase(IMAGE_FILE_LINE_NUMS_STRIPPED);
25309467b48Spatrick   BCase(IMAGE_FILE_LOCAL_SYMS_STRIPPED);
25409467b48Spatrick   BCase(IMAGE_FILE_AGGRESSIVE_WS_TRIM);
25509467b48Spatrick   BCase(IMAGE_FILE_LARGE_ADDRESS_AWARE);
25609467b48Spatrick   BCase(IMAGE_FILE_BYTES_REVERSED_LO);
25709467b48Spatrick   BCase(IMAGE_FILE_32BIT_MACHINE);
25809467b48Spatrick   BCase(IMAGE_FILE_DEBUG_STRIPPED);
25909467b48Spatrick   BCase(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP);
26009467b48Spatrick   BCase(IMAGE_FILE_NET_RUN_FROM_SWAP);
26109467b48Spatrick   BCase(IMAGE_FILE_SYSTEM);
26209467b48Spatrick   BCase(IMAGE_FILE_DLL);
26309467b48Spatrick   BCase(IMAGE_FILE_UP_SYSTEM_ONLY);
26409467b48Spatrick   BCase(IMAGE_FILE_BYTES_REVERSED_HI);
26509467b48Spatrick }
26609467b48Spatrick 
bitset(IO & IO,COFF::SectionCharacteristics & Value)26709467b48Spatrick void ScalarBitSetTraits<COFF::SectionCharacteristics>::bitset(
26809467b48Spatrick     IO &IO, COFF::SectionCharacteristics &Value) {
26909467b48Spatrick   BCase(IMAGE_SCN_TYPE_NOLOAD);
27009467b48Spatrick   BCase(IMAGE_SCN_TYPE_NO_PAD);
27109467b48Spatrick   BCase(IMAGE_SCN_CNT_CODE);
27209467b48Spatrick   BCase(IMAGE_SCN_CNT_INITIALIZED_DATA);
27309467b48Spatrick   BCase(IMAGE_SCN_CNT_UNINITIALIZED_DATA);
27409467b48Spatrick   BCase(IMAGE_SCN_LNK_OTHER);
27509467b48Spatrick   BCase(IMAGE_SCN_LNK_INFO);
27609467b48Spatrick   BCase(IMAGE_SCN_LNK_REMOVE);
27709467b48Spatrick   BCase(IMAGE_SCN_LNK_COMDAT);
27809467b48Spatrick   BCase(IMAGE_SCN_GPREL);
27909467b48Spatrick   BCase(IMAGE_SCN_MEM_PURGEABLE);
28009467b48Spatrick   BCase(IMAGE_SCN_MEM_16BIT);
28109467b48Spatrick   BCase(IMAGE_SCN_MEM_LOCKED);
28209467b48Spatrick   BCase(IMAGE_SCN_MEM_PRELOAD);
28309467b48Spatrick   BCase(IMAGE_SCN_LNK_NRELOC_OVFL);
28409467b48Spatrick   BCase(IMAGE_SCN_MEM_DISCARDABLE);
28509467b48Spatrick   BCase(IMAGE_SCN_MEM_NOT_CACHED);
28609467b48Spatrick   BCase(IMAGE_SCN_MEM_NOT_PAGED);
28709467b48Spatrick   BCase(IMAGE_SCN_MEM_SHARED);
28809467b48Spatrick   BCase(IMAGE_SCN_MEM_EXECUTE);
28909467b48Spatrick   BCase(IMAGE_SCN_MEM_READ);
29009467b48Spatrick   BCase(IMAGE_SCN_MEM_WRITE);
29109467b48Spatrick }
29209467b48Spatrick 
bitset(IO & IO,COFF::DLLCharacteristics & Value)29309467b48Spatrick void ScalarBitSetTraits<COFF::DLLCharacteristics>::bitset(
29409467b48Spatrick     IO &IO, COFF::DLLCharacteristics &Value) {
29509467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA);
29609467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE);
29709467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY);
29809467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_NX_COMPAT);
29909467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION);
30009467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_NO_SEH);
30109467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_NO_BIND);
30209467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_APPCONTAINER);
30309467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER);
30409467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_GUARD_CF);
30509467b48Spatrick   BCase(IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE);
30609467b48Spatrick }
30709467b48Spatrick #undef BCase
30809467b48Spatrick 
30909467b48Spatrick namespace {
31009467b48Spatrick 
31109467b48Spatrick struct NSectionSelectionType {
NSectionSelectionTypellvm::yaml::__anon3a2b2f270111::NSectionSelectionType31209467b48Spatrick   NSectionSelectionType(IO &)
31309467b48Spatrick       : SelectionType(COFFYAML::COMDATType(0)) {}
NSectionSelectionTypellvm::yaml::__anon3a2b2f270111::NSectionSelectionType31409467b48Spatrick   NSectionSelectionType(IO &, uint8_t C)
31509467b48Spatrick       : SelectionType(COFFYAML::COMDATType(C)) {}
31609467b48Spatrick 
denormalizellvm::yaml::__anon3a2b2f270111::NSectionSelectionType31709467b48Spatrick   uint8_t denormalize(IO &) { return SelectionType; }
31809467b48Spatrick 
31909467b48Spatrick   COFFYAML::COMDATType SelectionType;
32009467b48Spatrick };
32109467b48Spatrick 
32209467b48Spatrick struct NWeakExternalCharacteristics {
NWeakExternalCharacteristicsllvm::yaml::__anon3a2b2f270111::NWeakExternalCharacteristics32309467b48Spatrick   NWeakExternalCharacteristics(IO &)
32409467b48Spatrick       : Characteristics(COFFYAML::WeakExternalCharacteristics(0)) {}
NWeakExternalCharacteristicsllvm::yaml::__anon3a2b2f270111::NWeakExternalCharacteristics32509467b48Spatrick   NWeakExternalCharacteristics(IO &, uint32_t C)
32609467b48Spatrick       : Characteristics(COFFYAML::WeakExternalCharacteristics(C)) {}
32709467b48Spatrick 
denormalizellvm::yaml::__anon3a2b2f270111::NWeakExternalCharacteristics32809467b48Spatrick   uint32_t denormalize(IO &) { return Characteristics; }
32909467b48Spatrick 
33009467b48Spatrick   COFFYAML::WeakExternalCharacteristics Characteristics;
33109467b48Spatrick };
33209467b48Spatrick 
33309467b48Spatrick struct NSectionCharacteristics {
NSectionCharacteristicsllvm::yaml::__anon3a2b2f270111::NSectionCharacteristics33409467b48Spatrick   NSectionCharacteristics(IO &)
33509467b48Spatrick       : Characteristics(COFF::SectionCharacteristics(0)) {}
NSectionCharacteristicsllvm::yaml::__anon3a2b2f270111::NSectionCharacteristics33609467b48Spatrick   NSectionCharacteristics(IO &, uint32_t C)
33709467b48Spatrick       : Characteristics(COFF::SectionCharacteristics(C)) {}
33809467b48Spatrick 
denormalizellvm::yaml::__anon3a2b2f270111::NSectionCharacteristics33909467b48Spatrick   uint32_t denormalize(IO &) { return Characteristics; }
34009467b48Spatrick 
34109467b48Spatrick   COFF::SectionCharacteristics Characteristics;
34209467b48Spatrick };
34309467b48Spatrick 
34409467b48Spatrick struct NAuxTokenType {
NAuxTokenTypellvm::yaml::__anon3a2b2f270111::NAuxTokenType34509467b48Spatrick   NAuxTokenType(IO &)
34609467b48Spatrick       : AuxType(COFFYAML::AuxSymbolType(0)) {}
NAuxTokenTypellvm::yaml::__anon3a2b2f270111::NAuxTokenType34709467b48Spatrick   NAuxTokenType(IO &, uint8_t C)
34809467b48Spatrick       : AuxType(COFFYAML::AuxSymbolType(C)) {}
34909467b48Spatrick 
denormalizellvm::yaml::__anon3a2b2f270111::NAuxTokenType35009467b48Spatrick   uint32_t denormalize(IO &) { return AuxType; }
35109467b48Spatrick 
35209467b48Spatrick   COFFYAML::AuxSymbolType AuxType;
35309467b48Spatrick };
35409467b48Spatrick 
35509467b48Spatrick struct NStorageClass {
NStorageClassllvm::yaml::__anon3a2b2f270111::NStorageClass35609467b48Spatrick   NStorageClass(IO &) : StorageClass(COFF::SymbolStorageClass(0)) {}
NStorageClassllvm::yaml::__anon3a2b2f270111::NStorageClass35709467b48Spatrick   NStorageClass(IO &, uint8_t S) : StorageClass(COFF::SymbolStorageClass(S)) {}
35809467b48Spatrick 
denormalizellvm::yaml::__anon3a2b2f270111::NStorageClass35909467b48Spatrick   uint8_t denormalize(IO &) { return StorageClass; }
36009467b48Spatrick 
36109467b48Spatrick   COFF::SymbolStorageClass StorageClass;
36209467b48Spatrick };
36309467b48Spatrick 
36409467b48Spatrick struct NMachine {
NMachinellvm::yaml::__anon3a2b2f270111::NMachine36509467b48Spatrick   NMachine(IO &) : Machine(COFF::MachineTypes(0)) {}
NMachinellvm::yaml::__anon3a2b2f270111::NMachine36609467b48Spatrick   NMachine(IO &, uint16_t M) : Machine(COFF::MachineTypes(M)) {}
36709467b48Spatrick 
denormalizellvm::yaml::__anon3a2b2f270111::NMachine36809467b48Spatrick   uint16_t denormalize(IO &) { return Machine; }
36909467b48Spatrick 
37009467b48Spatrick   COFF::MachineTypes Machine;
37109467b48Spatrick };
37209467b48Spatrick 
37309467b48Spatrick struct NHeaderCharacteristics {
NHeaderCharacteristicsllvm::yaml::__anon3a2b2f270111::NHeaderCharacteristics37409467b48Spatrick   NHeaderCharacteristics(IO &) : Characteristics(COFF::Characteristics(0)) {}
NHeaderCharacteristicsllvm::yaml::__anon3a2b2f270111::NHeaderCharacteristics37509467b48Spatrick   NHeaderCharacteristics(IO &, uint16_t C)
37609467b48Spatrick       : Characteristics(COFF::Characteristics(C)) {}
37709467b48Spatrick 
denormalizellvm::yaml::__anon3a2b2f270111::NHeaderCharacteristics37809467b48Spatrick   uint16_t denormalize(IO &) { return Characteristics; }
37909467b48Spatrick 
38009467b48Spatrick   COFF::Characteristics Characteristics;
38109467b48Spatrick };
38209467b48Spatrick 
38309467b48Spatrick template <typename RelocType>
38409467b48Spatrick struct NType {
NTypellvm::yaml::__anon3a2b2f270111::NType38509467b48Spatrick   NType(IO &) : Type(RelocType(0)) {}
NTypellvm::yaml::__anon3a2b2f270111::NType38609467b48Spatrick   NType(IO &, uint16_t T) : Type(RelocType(T)) {}
38709467b48Spatrick 
denormalizellvm::yaml::__anon3a2b2f270111::NType38809467b48Spatrick   uint16_t denormalize(IO &) { return Type; }
38909467b48Spatrick 
39009467b48Spatrick   RelocType Type;
39109467b48Spatrick };
39209467b48Spatrick 
39309467b48Spatrick struct NWindowsSubsystem {
NWindowsSubsystemllvm::yaml::__anon3a2b2f270111::NWindowsSubsystem39409467b48Spatrick   NWindowsSubsystem(IO &) : Subsystem(COFF::WindowsSubsystem(0)) {}
NWindowsSubsystemllvm::yaml::__anon3a2b2f270111::NWindowsSubsystem39509467b48Spatrick   NWindowsSubsystem(IO &, uint16_t C) : Subsystem(COFF::WindowsSubsystem(C)) {}
39609467b48Spatrick 
denormalizellvm::yaml::__anon3a2b2f270111::NWindowsSubsystem39709467b48Spatrick   uint16_t denormalize(IO &) { return Subsystem; }
39809467b48Spatrick 
39909467b48Spatrick   COFF::WindowsSubsystem Subsystem;
40009467b48Spatrick };
40109467b48Spatrick 
40209467b48Spatrick struct NDLLCharacteristics {
NDLLCharacteristicsllvm::yaml::__anon3a2b2f270111::NDLLCharacteristics40309467b48Spatrick   NDLLCharacteristics(IO &) : Characteristics(COFF::DLLCharacteristics(0)) {}
NDLLCharacteristicsllvm::yaml::__anon3a2b2f270111::NDLLCharacteristics40409467b48Spatrick   NDLLCharacteristics(IO &, uint16_t C)
40509467b48Spatrick       : Characteristics(COFF::DLLCharacteristics(C)) {}
40609467b48Spatrick 
denormalizellvm::yaml::__anon3a2b2f270111::NDLLCharacteristics40709467b48Spatrick   uint16_t denormalize(IO &) { return Characteristics; }
40809467b48Spatrick 
40909467b48Spatrick   COFF::DLLCharacteristics Characteristics;
41009467b48Spatrick };
41109467b48Spatrick 
41209467b48Spatrick } // end anonymous namespace
41309467b48Spatrick 
mapping(IO & IO,COFFYAML::Relocation & Rel)41409467b48Spatrick void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO,
41509467b48Spatrick                                                   COFFYAML::Relocation &Rel) {
41609467b48Spatrick   IO.mapRequired("VirtualAddress", Rel.VirtualAddress);
41709467b48Spatrick   IO.mapOptional("SymbolName", Rel.SymbolName, StringRef());
41809467b48Spatrick   IO.mapOptional("SymbolTableIndex", Rel.SymbolTableIndex);
41909467b48Spatrick 
42009467b48Spatrick   COFF::header &H = *static_cast<COFF::header *>(IO.getContext());
42109467b48Spatrick   if (H.Machine == COFF::IMAGE_FILE_MACHINE_I386) {
42209467b48Spatrick     MappingNormalization<NType<COFF::RelocationTypeI386>, uint16_t> NT(
42309467b48Spatrick         IO, Rel.Type);
42409467b48Spatrick     IO.mapRequired("Type", NT->Type);
42509467b48Spatrick   } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_AMD64) {
42609467b48Spatrick     MappingNormalization<NType<COFF::RelocationTypeAMD64>, uint16_t> NT(
42709467b48Spatrick         IO, Rel.Type);
42809467b48Spatrick     IO.mapRequired("Type", NT->Type);
42909467b48Spatrick   } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT) {
43009467b48Spatrick     MappingNormalization<NType<COFF::RelocationTypesARM>, uint16_t> NT(
43109467b48Spatrick         IO, Rel.Type);
43209467b48Spatrick     IO.mapRequired("Type", NT->Type);
433*d415bd75Srobert   } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_ARM64 ||
434*d415bd75Srobert              H.Machine == COFF::IMAGE_FILE_MACHINE_ARM64EC) {
43509467b48Spatrick     MappingNormalization<NType<COFF::RelocationTypesARM64>, uint16_t> NT(
43609467b48Spatrick         IO, Rel.Type);
43709467b48Spatrick     IO.mapRequired("Type", NT->Type);
43809467b48Spatrick   } else {
43909467b48Spatrick     IO.mapRequired("Type", Rel.Type);
44009467b48Spatrick   }
44109467b48Spatrick }
44209467b48Spatrick 
mapping(IO & IO,COFF::DataDirectory & DD)44309467b48Spatrick void MappingTraits<COFF::DataDirectory>::mapping(IO &IO,
44409467b48Spatrick                                                  COFF::DataDirectory &DD) {
44509467b48Spatrick   IO.mapRequired("RelativeVirtualAddress", DD.RelativeVirtualAddress);
44609467b48Spatrick   IO.mapRequired("Size", DD.Size);
44709467b48Spatrick }
44809467b48Spatrick 
mapping(IO & IO,COFFYAML::PEHeader & PH)44909467b48Spatrick void MappingTraits<COFFYAML::PEHeader>::mapping(IO &IO,
45009467b48Spatrick                                                 COFFYAML::PEHeader &PH) {
45109467b48Spatrick   MappingNormalization<NWindowsSubsystem, uint16_t> NWS(IO,
45209467b48Spatrick                                                         PH.Header.Subsystem);
45309467b48Spatrick   MappingNormalization<NDLLCharacteristics, uint16_t> NDC(
45409467b48Spatrick       IO, PH.Header.DLLCharacteristics);
45509467b48Spatrick 
456*d415bd75Srobert   IO.mapOptional("AddressOfEntryPoint", PH.Header.AddressOfEntryPoint);
457*d415bd75Srobert   IO.mapOptional("ImageBase", PH.Header.ImageBase);
458*d415bd75Srobert   IO.mapOptional("SectionAlignment", PH.Header.SectionAlignment, 1);
459*d415bd75Srobert   IO.mapOptional("FileAlignment", PH.Header.FileAlignment, 1);
460*d415bd75Srobert   IO.mapOptional("MajorOperatingSystemVersion",
46109467b48Spatrick                  PH.Header.MajorOperatingSystemVersion);
462*d415bd75Srobert   IO.mapOptional("MinorOperatingSystemVersion",
46309467b48Spatrick                  PH.Header.MinorOperatingSystemVersion);
464*d415bd75Srobert   IO.mapOptional("MajorImageVersion", PH.Header.MajorImageVersion);
465*d415bd75Srobert   IO.mapOptional("MinorImageVersion", PH.Header.MinorImageVersion);
466*d415bd75Srobert   IO.mapOptional("MajorSubsystemVersion", PH.Header.MajorSubsystemVersion);
467*d415bd75Srobert   IO.mapOptional("MinorSubsystemVersion", PH.Header.MinorSubsystemVersion);
468*d415bd75Srobert   IO.mapOptional("Subsystem", NWS->Subsystem);
469*d415bd75Srobert   IO.mapOptional("DLLCharacteristics", NDC->Characteristics);
470*d415bd75Srobert   IO.mapOptional("SizeOfStackReserve", PH.Header.SizeOfStackReserve);
471*d415bd75Srobert   IO.mapOptional("SizeOfStackCommit", PH.Header.SizeOfStackCommit);
472*d415bd75Srobert   IO.mapOptional("SizeOfHeapReserve", PH.Header.SizeOfHeapReserve);
473*d415bd75Srobert   IO.mapOptional("SizeOfHeapCommit", PH.Header.SizeOfHeapCommit);
47409467b48Spatrick 
475*d415bd75Srobert   IO.mapOptional("NumberOfRvaAndSize", PH.Header.NumberOfRvaAndSize,
476*d415bd75Srobert                  COFF::NUM_DATA_DIRECTORIES + 1);
47709467b48Spatrick   IO.mapOptional("ExportTable", PH.DataDirectories[COFF::EXPORT_TABLE]);
47809467b48Spatrick   IO.mapOptional("ImportTable", PH.DataDirectories[COFF::IMPORT_TABLE]);
47909467b48Spatrick   IO.mapOptional("ResourceTable", PH.DataDirectories[COFF::RESOURCE_TABLE]);
48009467b48Spatrick   IO.mapOptional("ExceptionTable", PH.DataDirectories[COFF::EXCEPTION_TABLE]);
48109467b48Spatrick   IO.mapOptional("CertificateTable", PH.DataDirectories[COFF::CERTIFICATE_TABLE]);
48209467b48Spatrick   IO.mapOptional("BaseRelocationTable",
48309467b48Spatrick                  PH.DataDirectories[COFF::BASE_RELOCATION_TABLE]);
48409467b48Spatrick   IO.mapOptional("Debug", PH.DataDirectories[COFF::DEBUG_DIRECTORY]);
48509467b48Spatrick   IO.mapOptional("Architecture", PH.DataDirectories[COFF::ARCHITECTURE]);
48609467b48Spatrick   IO.mapOptional("GlobalPtr", PH.DataDirectories[COFF::GLOBAL_PTR]);
48709467b48Spatrick   IO.mapOptional("TlsTable", PH.DataDirectories[COFF::TLS_TABLE]);
48809467b48Spatrick   IO.mapOptional("LoadConfigTable",
48909467b48Spatrick                  PH.DataDirectories[COFF::LOAD_CONFIG_TABLE]);
49009467b48Spatrick   IO.mapOptional("BoundImport", PH.DataDirectories[COFF::BOUND_IMPORT]);
49109467b48Spatrick   IO.mapOptional("IAT", PH.DataDirectories[COFF::IAT]);
49209467b48Spatrick   IO.mapOptional("DelayImportDescriptor",
49309467b48Spatrick                  PH.DataDirectories[COFF::DELAY_IMPORT_DESCRIPTOR]);
49409467b48Spatrick   IO.mapOptional("ClrRuntimeHeader",
49509467b48Spatrick                  PH.DataDirectories[COFF::CLR_RUNTIME_HEADER]);
49609467b48Spatrick }
49709467b48Spatrick 
mapping(IO & IO,COFF::header & H)49809467b48Spatrick void MappingTraits<COFF::header>::mapping(IO &IO, COFF::header &H) {
49909467b48Spatrick   MappingNormalization<NMachine, uint16_t> NM(IO, H.Machine);
50009467b48Spatrick   MappingNormalization<NHeaderCharacteristics, uint16_t> NC(IO,
50109467b48Spatrick                                                             H.Characteristics);
50209467b48Spatrick 
50309467b48Spatrick   IO.mapRequired("Machine", NM->Machine);
50409467b48Spatrick   IO.mapOptional("Characteristics", NC->Characteristics);
50509467b48Spatrick   IO.setContext(static_cast<void *>(&H));
50609467b48Spatrick }
50709467b48Spatrick 
mapping(IO & IO,COFF::AuxiliaryFunctionDefinition & AFD)50809467b48Spatrick void MappingTraits<COFF::AuxiliaryFunctionDefinition>::mapping(
50909467b48Spatrick     IO &IO, COFF::AuxiliaryFunctionDefinition &AFD) {
51009467b48Spatrick   IO.mapRequired("TagIndex", AFD.TagIndex);
51109467b48Spatrick   IO.mapRequired("TotalSize", AFD.TotalSize);
51209467b48Spatrick   IO.mapRequired("PointerToLinenumber", AFD.PointerToLinenumber);
51309467b48Spatrick   IO.mapRequired("PointerToNextFunction", AFD.PointerToNextFunction);
51409467b48Spatrick }
51509467b48Spatrick 
mapping(IO & IO,COFF::AuxiliarybfAndefSymbol & AAS)51609467b48Spatrick void MappingTraits<COFF::AuxiliarybfAndefSymbol>::mapping(
51709467b48Spatrick     IO &IO, COFF::AuxiliarybfAndefSymbol &AAS) {
51809467b48Spatrick   IO.mapRequired("Linenumber", AAS.Linenumber);
51909467b48Spatrick   IO.mapRequired("PointerToNextFunction", AAS.PointerToNextFunction);
52009467b48Spatrick }
52109467b48Spatrick 
mapping(IO & IO,COFF::AuxiliaryWeakExternal & AWE)52209467b48Spatrick void MappingTraits<COFF::AuxiliaryWeakExternal>::mapping(
52309467b48Spatrick     IO &IO, COFF::AuxiliaryWeakExternal &AWE) {
52409467b48Spatrick   MappingNormalization<NWeakExternalCharacteristics, uint32_t> NWEC(
52509467b48Spatrick       IO, AWE.Characteristics);
52609467b48Spatrick   IO.mapRequired("TagIndex", AWE.TagIndex);
52709467b48Spatrick   IO.mapRequired("Characteristics", NWEC->Characteristics);
52809467b48Spatrick }
52909467b48Spatrick 
mapping(IO & IO,COFF::AuxiliarySectionDefinition & ASD)53009467b48Spatrick void MappingTraits<COFF::AuxiliarySectionDefinition>::mapping(
53109467b48Spatrick     IO &IO, COFF::AuxiliarySectionDefinition &ASD) {
53209467b48Spatrick   MappingNormalization<NSectionSelectionType, uint8_t> NSST(
53309467b48Spatrick       IO, ASD.Selection);
53409467b48Spatrick 
53509467b48Spatrick   IO.mapRequired("Length", ASD.Length);
53609467b48Spatrick   IO.mapRequired("NumberOfRelocations", ASD.NumberOfRelocations);
53709467b48Spatrick   IO.mapRequired("NumberOfLinenumbers", ASD.NumberOfLinenumbers);
53809467b48Spatrick   IO.mapRequired("CheckSum", ASD.CheckSum);
53909467b48Spatrick   IO.mapRequired("Number", ASD.Number);
54009467b48Spatrick   IO.mapOptional("Selection", NSST->SelectionType, COFFYAML::COMDATType(0));
54109467b48Spatrick }
54209467b48Spatrick 
mapping(IO & IO,COFF::AuxiliaryCLRToken & ACT)54309467b48Spatrick void MappingTraits<COFF::AuxiliaryCLRToken>::mapping(
54409467b48Spatrick     IO &IO, COFF::AuxiliaryCLRToken &ACT) {
54509467b48Spatrick   MappingNormalization<NAuxTokenType, uint8_t> NATT(IO, ACT.AuxType);
54609467b48Spatrick   IO.mapRequired("AuxType", NATT->AuxType);
54709467b48Spatrick   IO.mapRequired("SymbolTableIndex", ACT.SymbolTableIndex);
54809467b48Spatrick }
54909467b48Spatrick 
mapping(IO & IO,COFFYAML::Symbol & S)55009467b48Spatrick void MappingTraits<COFFYAML::Symbol>::mapping(IO &IO, COFFYAML::Symbol &S) {
55109467b48Spatrick   MappingNormalization<NStorageClass, uint8_t> NS(IO, S.Header.StorageClass);
55209467b48Spatrick 
55309467b48Spatrick   IO.mapRequired("Name", S.Name);
55409467b48Spatrick   IO.mapRequired("Value", S.Header.Value);
55509467b48Spatrick   IO.mapRequired("SectionNumber", S.Header.SectionNumber);
55609467b48Spatrick   IO.mapRequired("SimpleType", S.SimpleType);
55709467b48Spatrick   IO.mapRequired("ComplexType", S.ComplexType);
55809467b48Spatrick   IO.mapRequired("StorageClass", NS->StorageClass);
55909467b48Spatrick   IO.mapOptional("FunctionDefinition", S.FunctionDefinition);
56009467b48Spatrick   IO.mapOptional("bfAndefSymbol", S.bfAndefSymbol);
56109467b48Spatrick   IO.mapOptional("WeakExternal", S.WeakExternal);
56209467b48Spatrick   IO.mapOptional("File", S.File, StringRef());
56309467b48Spatrick   IO.mapOptional("SectionDefinition", S.SectionDefinition);
56409467b48Spatrick   IO.mapOptional("CLRToken", S.CLRToken);
56509467b48Spatrick }
56609467b48Spatrick 
mapping(IO & IO,COFFYAML::Section & Sec)56709467b48Spatrick void MappingTraits<COFFYAML::Section>::mapping(IO &IO, COFFYAML::Section &Sec) {
56809467b48Spatrick   MappingNormalization<NSectionCharacteristics, uint32_t> NC(
56909467b48Spatrick       IO, Sec.Header.Characteristics);
57009467b48Spatrick   IO.mapRequired("Name", Sec.Name);
57109467b48Spatrick   IO.mapRequired("Characteristics", NC->Characteristics);
57209467b48Spatrick   IO.mapOptional("VirtualAddress", Sec.Header.VirtualAddress, 0U);
57309467b48Spatrick   IO.mapOptional("VirtualSize", Sec.Header.VirtualSize, 0U);
57409467b48Spatrick   IO.mapOptional("Alignment", Sec.Alignment, 0U);
57509467b48Spatrick 
57609467b48Spatrick   // If this is a .debug$S .debug$T .debug$P, or .debug$H section parse the
57709467b48Spatrick   // semantic representation of the symbols/types.  If it is any other kind
57809467b48Spatrick   // of section, just deal in raw bytes.
57909467b48Spatrick   IO.mapOptional("SectionData", Sec.SectionData);
58009467b48Spatrick   if (Sec.Name == ".debug$S")
58109467b48Spatrick     IO.mapOptional("Subsections", Sec.DebugS);
58209467b48Spatrick   else if (Sec.Name == ".debug$T")
58309467b48Spatrick     IO.mapOptional("Types", Sec.DebugT);
58409467b48Spatrick   else if (Sec.Name == ".debug$P")
58509467b48Spatrick     IO.mapOptional("PrecompTypes", Sec.DebugP);
58609467b48Spatrick   else if (Sec.Name == ".debug$H")
58709467b48Spatrick     IO.mapOptional("GlobalHashes", Sec.DebugH);
58809467b48Spatrick 
58909467b48Spatrick   // Uninitialized sections, such as .bss, typically have no data, but the size
59009467b48Spatrick   // is carried in SizeOfRawData, even though PointerToRawData is zero.
59109467b48Spatrick   if (Sec.SectionData.binary_size() == 0 &&
59209467b48Spatrick       NC->Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)
59309467b48Spatrick     IO.mapOptional("SizeOfRawData", Sec.Header.SizeOfRawData);
59409467b48Spatrick 
59509467b48Spatrick   IO.mapOptional("Relocations", Sec.Relocations);
59609467b48Spatrick }
59709467b48Spatrick 
mapping(IO & IO,COFFYAML::Object & Obj)59809467b48Spatrick void MappingTraits<COFFYAML::Object>::mapping(IO &IO, COFFYAML::Object &Obj) {
59909467b48Spatrick   IO.mapTag("!COFF", true);
60009467b48Spatrick   IO.mapOptional("OptionalHeader", Obj.OptionalHeader);
60109467b48Spatrick   IO.mapRequired("header", Obj.Header);
60209467b48Spatrick   IO.mapRequired("sections", Obj.Sections);
60309467b48Spatrick   IO.mapRequired("symbols", Obj.Symbols);
60409467b48Spatrick }
60509467b48Spatrick 
60609467b48Spatrick } // end namespace yaml
60709467b48Spatrick 
60809467b48Spatrick } // end namespace llvm
609