brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.8 KiB · 53ea40a Raw
736 lines · cpp
1//===- COFFYAML.cpp - COFF YAMLIO implementation --------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8//9// This file defines classes for handling the YAML representation of COFF.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/ObjectYAML/COFFYAML.h"14#include "llvm/ADT/StringRef.h"15#include "llvm/Support/YAMLTraits.h"16#include <cstdint>17#include <cstring>18 19#define ECase(X) IO.enumCase(Value, #X, COFF::X);20 21namespace llvm {22 23namespace COFFYAML {24 25Section::Section() { memset(&Header, 0, sizeof(COFF::section)); }26Symbol::Symbol() { memset(&Header, 0, sizeof(COFF::symbol)); }27Object::Object() { memset(&Header, 0, sizeof(COFF::header)); }28 29} // end namespace COFFYAML30 31namespace yaml {32 33void ScalarEnumerationTraits<COFFYAML::COMDATType>::enumeration(34    IO &IO, COFFYAML::COMDATType &Value) {35  IO.enumCase(Value, "0", 0);36  ECase(IMAGE_COMDAT_SELECT_NODUPLICATES);37  ECase(IMAGE_COMDAT_SELECT_ANY);38  ECase(IMAGE_COMDAT_SELECT_SAME_SIZE);39  ECase(IMAGE_COMDAT_SELECT_EXACT_MATCH);40  ECase(IMAGE_COMDAT_SELECT_ASSOCIATIVE);41  ECase(IMAGE_COMDAT_SELECT_LARGEST);42  ECase(IMAGE_COMDAT_SELECT_NEWEST);43}44 45void46ScalarEnumerationTraits<COFFYAML::WeakExternalCharacteristics>::enumeration(47    IO &IO, COFFYAML::WeakExternalCharacteristics &Value) {48  IO.enumCase(Value, "0", 0);49  ECase(IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY);50  ECase(IMAGE_WEAK_EXTERN_SEARCH_LIBRARY);51  ECase(IMAGE_WEAK_EXTERN_SEARCH_ALIAS);52  ECase(IMAGE_WEAK_EXTERN_ANTI_DEPENDENCY);53}54 55void ScalarEnumerationTraits<COFFYAML::AuxSymbolType>::enumeration(56    IO &IO, COFFYAML::AuxSymbolType &Value) {57  ECase(IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF);58}59 60void 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_ARM64EC);69  ECase(IMAGE_FILE_MACHINE_ARM64X);70  ECase(IMAGE_FILE_MACHINE_EBC);71  ECase(IMAGE_FILE_MACHINE_I386);72  ECase(IMAGE_FILE_MACHINE_IA64);73  ECase(IMAGE_FILE_MACHINE_M32R);74  ECase(IMAGE_FILE_MACHINE_MIPS16);75  ECase(IMAGE_FILE_MACHINE_MIPSFPU);76  ECase(IMAGE_FILE_MACHINE_MIPSFPU16);77  ECase(IMAGE_FILE_MACHINE_POWERPC);78  ECase(IMAGE_FILE_MACHINE_POWERPCFP);79  ECase(IMAGE_FILE_MACHINE_R4000);80  ECase(IMAGE_FILE_MACHINE_RISCV32);81  ECase(IMAGE_FILE_MACHINE_RISCV64);82  ECase(IMAGE_FILE_MACHINE_RISCV128);83  ECase(IMAGE_FILE_MACHINE_SH3);84  ECase(IMAGE_FILE_MACHINE_SH3DSP);85  ECase(IMAGE_FILE_MACHINE_SH4);86  ECase(IMAGE_FILE_MACHINE_SH5);87  ECase(IMAGE_FILE_MACHINE_THUMB);88  ECase(IMAGE_FILE_MACHINE_WCEMIPSV2);89}90 91void ScalarEnumerationTraits<COFF::SymbolBaseType>::enumeration(92    IO &IO, COFF::SymbolBaseType &Value) {93  ECase(IMAGE_SYM_TYPE_NULL);94  ECase(IMAGE_SYM_TYPE_VOID);95  ECase(IMAGE_SYM_TYPE_CHAR);96  ECase(IMAGE_SYM_TYPE_SHORT);97  ECase(IMAGE_SYM_TYPE_INT);98  ECase(IMAGE_SYM_TYPE_LONG);99  ECase(IMAGE_SYM_TYPE_FLOAT);100  ECase(IMAGE_SYM_TYPE_DOUBLE);101  ECase(IMAGE_SYM_TYPE_STRUCT);102  ECase(IMAGE_SYM_TYPE_UNION);103  ECase(IMAGE_SYM_TYPE_ENUM);104  ECase(IMAGE_SYM_TYPE_MOE);105  ECase(IMAGE_SYM_TYPE_BYTE);106  ECase(IMAGE_SYM_TYPE_WORD);107  ECase(IMAGE_SYM_TYPE_UINT);108  ECase(IMAGE_SYM_TYPE_DWORD);109}110 111void ScalarEnumerationTraits<COFF::SymbolStorageClass>::enumeration(112    IO &IO, COFF::SymbolStorageClass &Value) {113  ECase(IMAGE_SYM_CLASS_END_OF_FUNCTION);114  ECase(IMAGE_SYM_CLASS_NULL);115  ECase(IMAGE_SYM_CLASS_AUTOMATIC);116  ECase(IMAGE_SYM_CLASS_EXTERNAL);117  ECase(IMAGE_SYM_CLASS_STATIC);118  ECase(IMAGE_SYM_CLASS_REGISTER);119  ECase(IMAGE_SYM_CLASS_EXTERNAL_DEF);120  ECase(IMAGE_SYM_CLASS_LABEL);121  ECase(IMAGE_SYM_CLASS_UNDEFINED_LABEL);122  ECase(IMAGE_SYM_CLASS_MEMBER_OF_STRUCT);123  ECase(IMAGE_SYM_CLASS_ARGUMENT);124  ECase(IMAGE_SYM_CLASS_STRUCT_TAG);125  ECase(IMAGE_SYM_CLASS_MEMBER_OF_UNION);126  ECase(IMAGE_SYM_CLASS_UNION_TAG);127  ECase(IMAGE_SYM_CLASS_TYPE_DEFINITION);128  ECase(IMAGE_SYM_CLASS_UNDEFINED_STATIC);129  ECase(IMAGE_SYM_CLASS_ENUM_TAG);130  ECase(IMAGE_SYM_CLASS_MEMBER_OF_ENUM);131  ECase(IMAGE_SYM_CLASS_REGISTER_PARAM);132  ECase(IMAGE_SYM_CLASS_BIT_FIELD);133  ECase(IMAGE_SYM_CLASS_BLOCK);134  ECase(IMAGE_SYM_CLASS_FUNCTION);135  ECase(IMAGE_SYM_CLASS_END_OF_STRUCT);136  ECase(IMAGE_SYM_CLASS_FILE);137  ECase(IMAGE_SYM_CLASS_SECTION);138  ECase(IMAGE_SYM_CLASS_WEAK_EXTERNAL);139  ECase(IMAGE_SYM_CLASS_CLR_TOKEN);140}141 142void ScalarEnumerationTraits<COFF::SymbolComplexType>::enumeration(143    IO &IO, COFF::SymbolComplexType &Value) {144  ECase(IMAGE_SYM_DTYPE_NULL);145  ECase(IMAGE_SYM_DTYPE_POINTER);146  ECase(IMAGE_SYM_DTYPE_FUNCTION);147  ECase(IMAGE_SYM_DTYPE_ARRAY);148}149 150void ScalarEnumerationTraits<COFF::RelocationTypeI386>::enumeration(151    IO &IO, COFF::RelocationTypeI386 &Value) {152  ECase(IMAGE_REL_I386_ABSOLUTE);153  ECase(IMAGE_REL_I386_DIR16);154  ECase(IMAGE_REL_I386_REL16);155  ECase(IMAGE_REL_I386_DIR32);156  ECase(IMAGE_REL_I386_DIR32NB);157  ECase(IMAGE_REL_I386_SEG12);158  ECase(IMAGE_REL_I386_SECTION);159  ECase(IMAGE_REL_I386_SECREL);160  ECase(IMAGE_REL_I386_TOKEN);161  ECase(IMAGE_REL_I386_SECREL7);162  ECase(IMAGE_REL_I386_REL32);163}164 165void ScalarEnumerationTraits<COFF::RelocationTypeAMD64>::enumeration(166    IO &IO, COFF::RelocationTypeAMD64 &Value) {167  ECase(IMAGE_REL_AMD64_ABSOLUTE);168  ECase(IMAGE_REL_AMD64_ADDR64);169  ECase(IMAGE_REL_AMD64_ADDR32);170  ECase(IMAGE_REL_AMD64_ADDR32NB);171  ECase(IMAGE_REL_AMD64_REL32);172  ECase(IMAGE_REL_AMD64_REL32_1);173  ECase(IMAGE_REL_AMD64_REL32_2);174  ECase(IMAGE_REL_AMD64_REL32_3);175  ECase(IMAGE_REL_AMD64_REL32_4);176  ECase(IMAGE_REL_AMD64_REL32_5);177  ECase(IMAGE_REL_AMD64_SECTION);178  ECase(IMAGE_REL_AMD64_SECREL);179  ECase(IMAGE_REL_AMD64_SECREL7);180  ECase(IMAGE_REL_AMD64_TOKEN);181  ECase(IMAGE_REL_AMD64_SREL32);182  ECase(IMAGE_REL_AMD64_PAIR);183  ECase(IMAGE_REL_AMD64_SSPAN32);184}185 186void ScalarEnumerationTraits<COFF::RelocationTypesMips>::enumeration(187    IO &IO, COFF::RelocationTypesMips &Value) {188  ECase(IMAGE_REL_MIPS_ABSOLUTE);189  ECase(IMAGE_REL_MIPS_REFHALF);190  ECase(IMAGE_REL_MIPS_REFWORD);191  ECase(IMAGE_REL_MIPS_JMPADDR);192  ECase(IMAGE_REL_MIPS_REFHI);193  ECase(IMAGE_REL_MIPS_REFLO);194  ECase(IMAGE_REL_MIPS_GPREL);195  ECase(IMAGE_REL_MIPS_LITERAL);196  ECase(IMAGE_REL_MIPS_SECTION);197  ECase(IMAGE_REL_MIPS_SECREL);198  ECase(IMAGE_REL_MIPS_SECRELLO);199  ECase(IMAGE_REL_MIPS_SECRELHI);200  ECase(IMAGE_REL_MIPS_JMPADDR16);201  ECase(IMAGE_REL_MIPS_REFWORDNB);202  ECase(IMAGE_REL_MIPS_PAIR);203}204 205void ScalarEnumerationTraits<COFF::RelocationTypesARM>::enumeration(206    IO &IO, COFF::RelocationTypesARM &Value) {207  ECase(IMAGE_REL_ARM_ABSOLUTE);208  ECase(IMAGE_REL_ARM_ADDR32);209  ECase(IMAGE_REL_ARM_ADDR32NB);210  ECase(IMAGE_REL_ARM_BRANCH24);211  ECase(IMAGE_REL_ARM_BRANCH11);212  ECase(IMAGE_REL_ARM_TOKEN);213  ECase(IMAGE_REL_ARM_BLX24);214  ECase(IMAGE_REL_ARM_BLX11);215  ECase(IMAGE_REL_ARM_REL32);216  ECase(IMAGE_REL_ARM_SECTION);217  ECase(IMAGE_REL_ARM_SECREL);218  ECase(IMAGE_REL_ARM_MOV32A);219  ECase(IMAGE_REL_ARM_MOV32T);220  ECase(IMAGE_REL_ARM_BRANCH20T);221  ECase(IMAGE_REL_ARM_BRANCH24T);222  ECase(IMAGE_REL_ARM_BLX23T);223  ECase(IMAGE_REL_ARM_PAIR);224}225 226void ScalarEnumerationTraits<COFF::RelocationTypesARM64>::enumeration(227    IO &IO, COFF::RelocationTypesARM64 &Value) {228  ECase(IMAGE_REL_ARM64_ABSOLUTE);229  ECase(IMAGE_REL_ARM64_ADDR32);230  ECase(IMAGE_REL_ARM64_ADDR32NB);231  ECase(IMAGE_REL_ARM64_BRANCH26);232  ECase(IMAGE_REL_ARM64_PAGEBASE_REL21);233  ECase(IMAGE_REL_ARM64_REL21);234  ECase(IMAGE_REL_ARM64_PAGEOFFSET_12A);235  ECase(IMAGE_REL_ARM64_PAGEOFFSET_12L);236  ECase(IMAGE_REL_ARM64_SECREL);237  ECase(IMAGE_REL_ARM64_SECREL_LOW12A);238  ECase(IMAGE_REL_ARM64_SECREL_HIGH12A);239  ECase(IMAGE_REL_ARM64_SECREL_LOW12L);240  ECase(IMAGE_REL_ARM64_TOKEN);241  ECase(IMAGE_REL_ARM64_SECTION);242  ECase(IMAGE_REL_ARM64_ADDR64);243  ECase(IMAGE_REL_ARM64_BRANCH19);244  ECase(IMAGE_REL_ARM64_BRANCH14);245  ECase(IMAGE_REL_ARM64_REL32);246}247 248void ScalarEnumerationTraits<COFF::WindowsSubsystem>::enumeration(249    IO &IO, COFF::WindowsSubsystem &Value) {250  ECase(IMAGE_SUBSYSTEM_UNKNOWN);251  ECase(IMAGE_SUBSYSTEM_NATIVE);252  ECase(IMAGE_SUBSYSTEM_WINDOWS_GUI);253  ECase(IMAGE_SUBSYSTEM_WINDOWS_CUI);254  ECase(IMAGE_SUBSYSTEM_OS2_CUI);255  ECase(IMAGE_SUBSYSTEM_POSIX_CUI);256  ECase(IMAGE_SUBSYSTEM_NATIVE_WINDOWS);257  ECase(IMAGE_SUBSYSTEM_WINDOWS_CE_GUI);258  ECase(IMAGE_SUBSYSTEM_EFI_APPLICATION);259  ECase(IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER);260  ECase(IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER);261  ECase(IMAGE_SUBSYSTEM_EFI_ROM);262  ECase(IMAGE_SUBSYSTEM_XBOX);263  ECase(IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION);264}265#undef ECase266 267#define BCase(X) IO.bitSetCase(Value, #X, COFF::X);268void ScalarBitSetTraits<COFF::Characteristics>::bitset(269    IO &IO, COFF::Characteristics &Value) {270  BCase(IMAGE_FILE_RELOCS_STRIPPED);271  BCase(IMAGE_FILE_EXECUTABLE_IMAGE);272  BCase(IMAGE_FILE_LINE_NUMS_STRIPPED);273  BCase(IMAGE_FILE_LOCAL_SYMS_STRIPPED);274  BCase(IMAGE_FILE_AGGRESSIVE_WS_TRIM);275  BCase(IMAGE_FILE_LARGE_ADDRESS_AWARE);276  BCase(IMAGE_FILE_BYTES_REVERSED_LO);277  BCase(IMAGE_FILE_32BIT_MACHINE);278  BCase(IMAGE_FILE_DEBUG_STRIPPED);279  BCase(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP);280  BCase(IMAGE_FILE_NET_RUN_FROM_SWAP);281  BCase(IMAGE_FILE_SYSTEM);282  BCase(IMAGE_FILE_DLL);283  BCase(IMAGE_FILE_UP_SYSTEM_ONLY);284  BCase(IMAGE_FILE_BYTES_REVERSED_HI);285}286 287void ScalarBitSetTraits<COFF::SectionCharacteristics>::bitset(288    IO &IO, COFF::SectionCharacteristics &Value) {289  BCase(IMAGE_SCN_TYPE_NOLOAD);290  BCase(IMAGE_SCN_TYPE_NO_PAD);291  BCase(IMAGE_SCN_CNT_CODE);292  BCase(IMAGE_SCN_CNT_INITIALIZED_DATA);293  BCase(IMAGE_SCN_CNT_UNINITIALIZED_DATA);294  BCase(IMAGE_SCN_LNK_OTHER);295  BCase(IMAGE_SCN_LNK_INFO);296  BCase(IMAGE_SCN_LNK_REMOVE);297  BCase(IMAGE_SCN_LNK_COMDAT);298  BCase(IMAGE_SCN_GPREL);299  BCase(IMAGE_SCN_MEM_PURGEABLE);300  BCase(IMAGE_SCN_MEM_16BIT);301  BCase(IMAGE_SCN_MEM_LOCKED);302  BCase(IMAGE_SCN_MEM_PRELOAD);303  BCase(IMAGE_SCN_LNK_NRELOC_OVFL);304  BCase(IMAGE_SCN_MEM_DISCARDABLE);305  BCase(IMAGE_SCN_MEM_NOT_CACHED);306  BCase(IMAGE_SCN_MEM_NOT_PAGED);307  BCase(IMAGE_SCN_MEM_SHARED);308  BCase(IMAGE_SCN_MEM_EXECUTE);309  BCase(IMAGE_SCN_MEM_READ);310  BCase(IMAGE_SCN_MEM_WRITE);311}312 313void ScalarBitSetTraits<COFF::DLLCharacteristics>::bitset(314    IO &IO, COFF::DLLCharacteristics &Value) {315  BCase(IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA);316  BCase(IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE);317  BCase(IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY);318  BCase(IMAGE_DLL_CHARACTERISTICS_NX_COMPAT);319  BCase(IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION);320  BCase(IMAGE_DLL_CHARACTERISTICS_NO_SEH);321  BCase(IMAGE_DLL_CHARACTERISTICS_NO_BIND);322  BCase(IMAGE_DLL_CHARACTERISTICS_APPCONTAINER);323  BCase(IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER);324  BCase(IMAGE_DLL_CHARACTERISTICS_GUARD_CF);325  BCase(IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE);326}327#undef BCase328 329namespace {330 331struct NSectionSelectionType {332  NSectionSelectionType(IO &)333      : SelectionType(COFFYAML::COMDATType(0)) {}334  NSectionSelectionType(IO &, uint8_t C)335      : SelectionType(COFFYAML::COMDATType(C)) {}336 337  uint8_t denormalize(IO &) { return SelectionType; }338 339  COFFYAML::COMDATType SelectionType;340};341 342struct NWeakExternalCharacteristics {343  NWeakExternalCharacteristics(IO &)344      : Characteristics(COFFYAML::WeakExternalCharacteristics(0)) {}345  NWeakExternalCharacteristics(IO &, uint32_t C)346      : Characteristics(COFFYAML::WeakExternalCharacteristics(C)) {}347 348  uint32_t denormalize(IO &) { return Characteristics; }349 350  COFFYAML::WeakExternalCharacteristics Characteristics;351};352 353struct NSectionCharacteristics {354  NSectionCharacteristics(IO &)355      : Characteristics(COFF::SectionCharacteristics(0)) {}356  NSectionCharacteristics(IO &, uint32_t C)357      : Characteristics(COFF::SectionCharacteristics(C)) {}358 359  uint32_t denormalize(IO &) { return Characteristics; }360 361  COFF::SectionCharacteristics Characteristics;362};363 364struct NAuxTokenType {365  NAuxTokenType(IO &)366      : AuxType(COFFYAML::AuxSymbolType(0)) {}367  NAuxTokenType(IO &, uint8_t C)368      : AuxType(COFFYAML::AuxSymbolType(C)) {}369 370  uint32_t denormalize(IO &) { return AuxType; }371 372  COFFYAML::AuxSymbolType AuxType;373};374 375struct NStorageClass {376  NStorageClass(IO &) : StorageClass(COFF::SymbolStorageClass(0)) {}377  NStorageClass(IO &, uint8_t S) : StorageClass(COFF::SymbolStorageClass(S)) {}378 379  uint8_t denormalize(IO &) { return StorageClass; }380 381  COFF::SymbolStorageClass StorageClass;382};383 384struct NMachine {385  NMachine(IO &) : Machine(COFF::MachineTypes(0)) {}386  NMachine(IO &, uint16_t M) : Machine(COFF::MachineTypes(M)) {}387 388  uint16_t denormalize(IO &) { return Machine; }389 390  COFF::MachineTypes Machine;391};392 393struct NHeaderCharacteristics {394  NHeaderCharacteristics(IO &) : Characteristics(COFF::Characteristics(0)) {}395  NHeaderCharacteristics(IO &, uint16_t C)396      : Characteristics(COFF::Characteristics(C)) {}397 398  uint16_t denormalize(IO &) { return Characteristics; }399 400  COFF::Characteristics Characteristics;401};402 403template <typename RelocType>404struct NType {405  NType(IO &) : Type(RelocType(0)) {}406  NType(IO &, uint16_t T) : Type(RelocType(T)) {}407 408  uint16_t denormalize(IO &) { return Type; }409 410  RelocType Type;411};412 413struct NWindowsSubsystem {414  NWindowsSubsystem(IO &) : Subsystem(COFF::WindowsSubsystem(0)) {}415  NWindowsSubsystem(IO &, uint16_t C) : Subsystem(COFF::WindowsSubsystem(C)) {}416 417  uint16_t denormalize(IO &) { return Subsystem; }418 419  COFF::WindowsSubsystem Subsystem;420};421 422struct NDLLCharacteristics {423  NDLLCharacteristics(IO &) : Characteristics(COFF::DLLCharacteristics(0)) {}424  NDLLCharacteristics(IO &, uint16_t C)425      : Characteristics(COFF::DLLCharacteristics(C)) {}426 427  uint16_t denormalize(IO &) { return Characteristics; }428 429  COFF::DLLCharacteristics Characteristics;430};431 432} // end anonymous namespace433 434void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO,435                                                  COFFYAML::Relocation &Rel) {436  IO.mapRequired("VirtualAddress", Rel.VirtualAddress);437  IO.mapOptional("SymbolName", Rel.SymbolName, StringRef());438  IO.mapOptional("SymbolTableIndex", Rel.SymbolTableIndex);439 440  COFF::header &H = *static_cast<COFF::header *>(IO.getContext());441  if (H.Machine == COFF::IMAGE_FILE_MACHINE_I386) {442    MappingNormalization<NType<COFF::RelocationTypeI386>, uint16_t> NT(443        IO, Rel.Type);444    IO.mapRequired("Type", NT->Type);445  } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_AMD64) {446    MappingNormalization<NType<COFF::RelocationTypeAMD64>, uint16_t> NT(447        IO, Rel.Type);448    IO.mapRequired("Type", NT->Type);449  } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_R4000) {450    MappingNormalization<NType<COFF::RelocationTypesMips>, uint16_t> NT(451        IO, Rel.Type);452    IO.mapRequired("Type", NT->Type);453  } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT) {454    MappingNormalization<NType<COFF::RelocationTypesARM>, uint16_t> NT(455        IO, Rel.Type);456    IO.mapRequired("Type", NT->Type);457  } else if (COFF::isAnyArm64(H.Machine)) {458    MappingNormalization<NType<COFF::RelocationTypesARM64>, uint16_t> NT(459        IO, Rel.Type);460    IO.mapRequired("Type", NT->Type);461  } else {462    IO.mapRequired("Type", Rel.Type);463  }464}465 466void MappingTraits<COFF::DataDirectory>::mapping(IO &IO,467                                                 COFF::DataDirectory &DD) {468  IO.mapRequired("RelativeVirtualAddress", DD.RelativeVirtualAddress);469  IO.mapRequired("Size", DD.Size);470}471 472void MappingTraits<COFFYAML::PEHeader>::mapping(IO &IO,473                                                COFFYAML::PEHeader &PH) {474  MappingNormalization<NWindowsSubsystem, uint16_t> NWS(IO,475                                                        PH.Header.Subsystem);476  MappingNormalization<NDLLCharacteristics, uint16_t> NDC(477      IO, PH.Header.DLLCharacteristics);478 479  IO.mapOptional("AddressOfEntryPoint", PH.Header.AddressOfEntryPoint);480  IO.mapOptional("ImageBase", PH.Header.ImageBase);481  IO.mapOptional("SectionAlignment", PH.Header.SectionAlignment, 1);482  IO.mapOptional("FileAlignment", PH.Header.FileAlignment, 1);483  IO.mapOptional("MajorOperatingSystemVersion",484                 PH.Header.MajorOperatingSystemVersion);485  IO.mapOptional("MinorOperatingSystemVersion",486                 PH.Header.MinorOperatingSystemVersion);487  IO.mapOptional("MajorImageVersion", PH.Header.MajorImageVersion);488  IO.mapOptional("MinorImageVersion", PH.Header.MinorImageVersion);489  IO.mapOptional("MajorSubsystemVersion", PH.Header.MajorSubsystemVersion);490  IO.mapOptional("MinorSubsystemVersion", PH.Header.MinorSubsystemVersion);491  IO.mapOptional("Subsystem", NWS->Subsystem);492  IO.mapOptional("DLLCharacteristics", NDC->Characteristics);493  IO.mapOptional("SizeOfStackReserve", PH.Header.SizeOfStackReserve);494  IO.mapOptional("SizeOfStackCommit", PH.Header.SizeOfStackCommit);495  IO.mapOptional("SizeOfHeapReserve", PH.Header.SizeOfHeapReserve);496  IO.mapOptional("SizeOfHeapCommit", PH.Header.SizeOfHeapCommit);497 498  IO.mapOptional("NumberOfRvaAndSize", PH.Header.NumberOfRvaAndSize,499                 COFF::NUM_DATA_DIRECTORIES + 1);500  IO.mapOptional("ExportTable", PH.DataDirectories[COFF::EXPORT_TABLE]);501  IO.mapOptional("ImportTable", PH.DataDirectories[COFF::IMPORT_TABLE]);502  IO.mapOptional("ResourceTable", PH.DataDirectories[COFF::RESOURCE_TABLE]);503  IO.mapOptional("ExceptionTable", PH.DataDirectories[COFF::EXCEPTION_TABLE]);504  IO.mapOptional("CertificateTable", PH.DataDirectories[COFF::CERTIFICATE_TABLE]);505  IO.mapOptional("BaseRelocationTable",506                 PH.DataDirectories[COFF::BASE_RELOCATION_TABLE]);507  IO.mapOptional("Debug", PH.DataDirectories[COFF::DEBUG_DIRECTORY]);508  IO.mapOptional("Architecture", PH.DataDirectories[COFF::ARCHITECTURE]);509  IO.mapOptional("GlobalPtr", PH.DataDirectories[COFF::GLOBAL_PTR]);510  IO.mapOptional("TlsTable", PH.DataDirectories[COFF::TLS_TABLE]);511  IO.mapOptional("LoadConfigTable",512                 PH.DataDirectories[COFF::LOAD_CONFIG_TABLE]);513  IO.mapOptional("BoundImport", PH.DataDirectories[COFF::BOUND_IMPORT]);514  IO.mapOptional("IAT", PH.DataDirectories[COFF::IAT]);515  IO.mapOptional("DelayImportDescriptor",516                 PH.DataDirectories[COFF::DELAY_IMPORT_DESCRIPTOR]);517  IO.mapOptional("ClrRuntimeHeader",518                 PH.DataDirectories[COFF::CLR_RUNTIME_HEADER]);519}520 521void MappingTraits<COFF::header>::mapping(IO &IO, COFF::header &H) {522  MappingNormalization<NMachine, uint16_t> NM(IO, H.Machine);523  MappingNormalization<NHeaderCharacteristics, uint16_t> NC(IO,524                                                            H.Characteristics);525 526  IO.mapRequired("Machine", NM->Machine);527  IO.mapOptional("Characteristics", NC->Characteristics);528  IO.setContext(static_cast<void *>(&H));529}530 531void MappingTraits<COFF::AuxiliaryFunctionDefinition>::mapping(532    IO &IO, COFF::AuxiliaryFunctionDefinition &AFD) {533  IO.mapRequired("TagIndex", AFD.TagIndex);534  IO.mapRequired("TotalSize", AFD.TotalSize);535  IO.mapRequired("PointerToLinenumber", AFD.PointerToLinenumber);536  IO.mapRequired("PointerToNextFunction", AFD.PointerToNextFunction);537}538 539void MappingTraits<COFF::AuxiliarybfAndefSymbol>::mapping(540    IO &IO, COFF::AuxiliarybfAndefSymbol &AAS) {541  IO.mapRequired("Linenumber", AAS.Linenumber);542  IO.mapRequired("PointerToNextFunction", AAS.PointerToNextFunction);543}544 545void MappingTraits<COFF::AuxiliaryWeakExternal>::mapping(546    IO &IO, COFF::AuxiliaryWeakExternal &AWE) {547  MappingNormalization<NWeakExternalCharacteristics, uint32_t> NWEC(548      IO, AWE.Characteristics);549  IO.mapRequired("TagIndex", AWE.TagIndex);550  IO.mapRequired("Characteristics", NWEC->Characteristics);551}552 553void MappingTraits<COFF::AuxiliarySectionDefinition>::mapping(554    IO &IO, COFF::AuxiliarySectionDefinition &ASD) {555  MappingNormalization<NSectionSelectionType, uint8_t> NSST(556      IO, ASD.Selection);557 558  IO.mapRequired("Length", ASD.Length);559  IO.mapRequired("NumberOfRelocations", ASD.NumberOfRelocations);560  IO.mapRequired("NumberOfLinenumbers", ASD.NumberOfLinenumbers);561  IO.mapRequired("CheckSum", ASD.CheckSum);562  IO.mapRequired("Number", ASD.Number);563  IO.mapOptional("Selection", NSST->SelectionType, COFFYAML::COMDATType(0));564}565 566void MappingTraits<COFF::AuxiliaryCLRToken>::mapping(567    IO &IO, COFF::AuxiliaryCLRToken &ACT) {568  MappingNormalization<NAuxTokenType, uint8_t> NATT(IO, ACT.AuxType);569  IO.mapRequired("AuxType", NATT->AuxType);570  IO.mapRequired("SymbolTableIndex", ACT.SymbolTableIndex);571}572 573void MappingTraits<object::coff_load_config_code_integrity>::mapping(574    IO &IO, object::coff_load_config_code_integrity &S) {575  IO.mapOptional("Flags", S.Flags);576  IO.mapOptional("Catalog", S.Catalog);577  IO.mapOptional("CatalogOffset", S.CatalogOffset);578}579 580template <typename T, typename M>581void mapLoadConfigMember(IO &IO, T &LoadConfig, const char *Name, M &Member) {582  // Map only members that match a specified size.583  ptrdiff_t dist =584      reinterpret_cast<char *>(&Member) - reinterpret_cast<char *>(&LoadConfig);585  if (dist < (ptrdiff_t)LoadConfig.Size)586    IO.mapOptional(Name, Member);587}588 589template <typename T> void mapLoadConfig(IO &IO, T &LoadConfig) {590  IO.mapOptional("Size", LoadConfig.Size,591                 support::ulittle32_t(sizeof(LoadConfig)));592  // The size must be large enough to fit at least the size member itself.593  if (LoadConfig.Size < sizeof(LoadConfig.Size)) {594    IO.setError("Size must be at least " + Twine(sizeof(LoadConfig.Size)));595    return;596  }597 598#define MCase(X) mapLoadConfigMember(IO, LoadConfig, #X, LoadConfig.X)599  MCase(TimeDateStamp);600  MCase(MajorVersion);601  MCase(MinorVersion);602  MCase(GlobalFlagsClear);603  MCase(GlobalFlagsSet);604  MCase(CriticalSectionDefaultTimeout);605  MCase(DeCommitFreeBlockThreshold);606  MCase(DeCommitTotalFreeThreshold);607  MCase(LockPrefixTable);608  MCase(MaximumAllocationSize);609  MCase(VirtualMemoryThreshold);610  MCase(ProcessAffinityMask);611  MCase(ProcessHeapFlags);612  MCase(CSDVersion);613  MCase(DependentLoadFlags);614  MCase(EditList);615  MCase(SecurityCookie);616  MCase(SEHandlerTable);617  MCase(SEHandlerCount);618  MCase(GuardCFCheckFunction);619  MCase(GuardCFCheckDispatch);620  MCase(GuardCFFunctionTable);621  MCase(GuardCFFunctionCount);622  MCase(GuardFlags);623  MCase(CodeIntegrity);624  MCase(GuardAddressTakenIatEntryTable);625  MCase(GuardAddressTakenIatEntryCount);626  MCase(GuardLongJumpTargetTable);627  MCase(GuardLongJumpTargetCount);628  MCase(DynamicValueRelocTable);629  MCase(CHPEMetadataPointer);630  MCase(GuardRFFailureRoutine);631  MCase(GuardRFFailureRoutineFunctionPointer);632  MCase(DynamicValueRelocTableOffset);633  MCase(DynamicValueRelocTableSection);634  MCase(GuardRFVerifyStackPointerFunctionPointer);635  MCase(HotPatchTableOffset);636  MCase(EnclaveConfigurationPointer);637  MCase(VolatileMetadataPointer);638  MCase(GuardEHContinuationTable);639  MCase(GuardEHContinuationCount);640  MCase(GuardXFGCheckFunctionPointer);641  MCase(GuardXFGDispatchFunctionPointer);642  MCase(GuardXFGTableDispatchFunctionPointer);643  MCase(CastGuardOsDeterminedFailureMode);644#undef MCase645}646 647void MappingTraits<object::coff_load_configuration32>::mapping(648    IO &IO, object::coff_load_configuration32 &S) {649  mapLoadConfig(IO, S);650}651 652void MappingTraits<object::coff_load_configuration64>::mapping(653    IO &IO, object::coff_load_configuration64 &S) {654  mapLoadConfig(IO, S);655}656 657void MappingTraits<COFFYAML::SectionDataEntry>::mapping(658    IO &IO, COFFYAML::SectionDataEntry &E) {659  IO.mapOptional("UInt32", E.UInt32);660  IO.mapOptional("Binary", E.Binary);661 662  COFF::header &H = *static_cast<COFF::header *>(IO.getContext());663  if (COFF::is64Bit(H.Machine))664    IO.mapOptional("LoadConfig", E.LoadConfig64);665  else666    IO.mapOptional("LoadConfig", E.LoadConfig32);667}668 669void MappingTraits<COFFYAML::Symbol>::mapping(IO &IO, COFFYAML::Symbol &S) {670  MappingNormalization<NStorageClass, uint8_t> NS(IO, S.Header.StorageClass);671 672  IO.mapRequired("Name", S.Name);673  IO.mapRequired("Value", S.Header.Value);674  IO.mapRequired("SectionNumber", S.Header.SectionNumber);675  IO.mapRequired("SimpleType", S.SimpleType);676  IO.mapRequired("ComplexType", S.ComplexType);677  IO.mapRequired("StorageClass", NS->StorageClass);678  IO.mapOptional("FunctionDefinition", S.FunctionDefinition);679  IO.mapOptional("bfAndefSymbol", S.bfAndefSymbol);680  IO.mapOptional("WeakExternal", S.WeakExternal);681  IO.mapOptional("File", S.File, StringRef());682  IO.mapOptional("SectionDefinition", S.SectionDefinition);683  IO.mapOptional("CLRToken", S.CLRToken);684}685 686void MappingTraits<COFFYAML::Section>::mapping(IO &IO, COFFYAML::Section &Sec) {687  MappingNormalization<NSectionCharacteristics, uint32_t> NC(688      IO, Sec.Header.Characteristics);689  IO.mapRequired("Name", Sec.Name);690  IO.mapRequired("Characteristics", NC->Characteristics);691  IO.mapOptional("VirtualAddress", Sec.Header.VirtualAddress, 0U);692  IO.mapOptional("VirtualSize", Sec.Header.VirtualSize, 0U);693  IO.mapOptional("Alignment", Sec.Alignment, 0U);694 695  // If this is a .debug$S .debug$T .debug$P, or .debug$H section parse the696  // semantic representation of the symbols/types.  If it is any other kind697  // of section, just deal in raw bytes.698  IO.mapOptional("SectionData", Sec.SectionData);699  if (Sec.Name == ".debug$S")700    IO.mapOptional("Subsections", Sec.DebugS);701  else if (Sec.Name == ".debug$T")702    IO.mapOptional("Types", Sec.DebugT);703  else if (Sec.Name == ".debug$P")704    IO.mapOptional("PrecompTypes", Sec.DebugP);705  else if (Sec.Name == ".debug$H")706    IO.mapOptional("GlobalHashes", Sec.DebugH);707 708  IO.mapOptional("StructuredData", Sec.StructuredData);709 710  if (!Sec.StructuredData.empty() && Sec.SectionData.binary_size()) {711    IO.setError("StructuredData and SectionData can't be used together");712    return;713  }714 715  IO.mapOptional("SizeOfRawData", Sec.Header.SizeOfRawData, 0U);716 717  if (!Sec.StructuredData.empty() && Sec.Header.SizeOfRawData) {718    IO.setError("StructuredData and SizeOfRawData can't be used together");719    return;720  }721 722  IO.mapOptional("Relocations", Sec.Relocations);723}724 725void MappingTraits<COFFYAML::Object>::mapping(IO &IO, COFFYAML::Object &Obj) {726  IO.mapTag("!COFF", true);727  IO.mapOptional("OptionalHeader", Obj.OptionalHeader);728  IO.mapRequired("header", Obj.Header);729  IO.mapRequired("sections", Obj.Sections);730  IO.mapRequired("symbols", Obj.Symbols);731}732 733} // end namespace yaml734 735} // end namespace llvm736