diff options
Diffstat (limited to 'gnu/llvm/lib/ObjectYAML')
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/CMakeLists.txt | 15 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/COFFYAML.cpp | 592 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp | 958 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp | 631 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/CodeViewYAMLTypeHashing.cpp | 88 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp | 818 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/DWARFEmitter.cpp | 379 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/DWARFVisitor.cpp | 178 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/DWARFVisitor.h | 97 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/DWARFYAML.cpp | 176 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/ELFYAML.cpp | 997 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/LLVMBuild.txt | 14 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/MachOYAML.cpp | 566 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/ObjectYAML.cpp | 63 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/WasmYAML.cpp | 539 | ||||
| -rw-r--r-- | gnu/llvm/lib/ObjectYAML/YAML.cpp | 62 |
16 files changed, 0 insertions, 6173 deletions
diff --git a/gnu/llvm/lib/ObjectYAML/CMakeLists.txt b/gnu/llvm/lib/ObjectYAML/CMakeLists.txt deleted file mode 100644 index d24f879836f..00000000000 --- a/gnu/llvm/lib/ObjectYAML/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -add_llvm_library(LLVMObjectYAML - CodeViewYAMLDebugSections.cpp - CodeViewYAMLSymbols.cpp - CodeViewYAMLTypeHashing.cpp - CodeViewYAMLTypes.cpp - COFFYAML.cpp - DWARFEmitter.cpp - DWARFVisitor.cpp - DWARFYAML.cpp - ELFYAML.cpp - MachOYAML.cpp - ObjectYAML.cpp - WasmYAML.cpp - YAML.cpp - ) diff --git a/gnu/llvm/lib/ObjectYAML/COFFYAML.cpp b/gnu/llvm/lib/ObjectYAML/COFFYAML.cpp deleted file mode 100644 index fdd94f4054e..00000000000 --- a/gnu/llvm/lib/ObjectYAML/COFFYAML.cpp +++ /dev/null @@ -1,592 +0,0 @@ -//===- COFFYAML.cpp - COFF YAMLIO implementation --------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines classes for handling the YAML representation of COFF. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/COFFYAML.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/Support/YAMLTraits.h" -#include <cstdint> -#include <cstring> - -#define ECase(X) IO.enumCase(Value, #X, COFF::X); - -namespace llvm { - -namespace COFFYAML { - -Section::Section() { memset(&Header, 0, sizeof(COFF::section)); } -Symbol::Symbol() { memset(&Header, 0, sizeof(COFF::symbol)); } -Object::Object() { memset(&Header, 0, sizeof(COFF::header)); } - -} // end namespace COFFYAML - -namespace yaml { - -void ScalarEnumerationTraits<COFFYAML::COMDATType>::enumeration( - IO &IO, COFFYAML::COMDATType &Value) { - IO.enumCase(Value, "0", 0); - ECase(IMAGE_COMDAT_SELECT_NODUPLICATES); - ECase(IMAGE_COMDAT_SELECT_ANY); - ECase(IMAGE_COMDAT_SELECT_SAME_SIZE); - ECase(IMAGE_COMDAT_SELECT_EXACT_MATCH); - ECase(IMAGE_COMDAT_SELECT_ASSOCIATIVE); - ECase(IMAGE_COMDAT_SELECT_LARGEST); - ECase(IMAGE_COMDAT_SELECT_NEWEST); -} - -void -ScalarEnumerationTraits<COFFYAML::WeakExternalCharacteristics>::enumeration( - IO &IO, COFFYAML::WeakExternalCharacteristics &Value) { - IO.enumCase(Value, "0", 0); - ECase(IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY); - ECase(IMAGE_WEAK_EXTERN_SEARCH_LIBRARY); - ECase(IMAGE_WEAK_EXTERN_SEARCH_ALIAS); -} - -void ScalarEnumerationTraits<COFFYAML::AuxSymbolType>::enumeration( - IO &IO, COFFYAML::AuxSymbolType &Value) { - ECase(IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF); -} - -void ScalarEnumerationTraits<COFF::MachineTypes>::enumeration( - IO &IO, COFF::MachineTypes &Value) { - ECase(IMAGE_FILE_MACHINE_UNKNOWN); - ECase(IMAGE_FILE_MACHINE_AM33); - ECase(IMAGE_FILE_MACHINE_AMD64); - ECase(IMAGE_FILE_MACHINE_ARM); - ECase(IMAGE_FILE_MACHINE_ARMNT); - ECase(IMAGE_FILE_MACHINE_ARM64); - ECase(IMAGE_FILE_MACHINE_EBC); - ECase(IMAGE_FILE_MACHINE_I386); - ECase(IMAGE_FILE_MACHINE_IA64); - ECase(IMAGE_FILE_MACHINE_M32R); - ECase(IMAGE_FILE_MACHINE_MIPS16); - ECase(IMAGE_FILE_MACHINE_MIPSFPU); - ECase(IMAGE_FILE_MACHINE_MIPSFPU16); - ECase(IMAGE_FILE_MACHINE_POWERPC); - ECase(IMAGE_FILE_MACHINE_POWERPCFP); - ECase(IMAGE_FILE_MACHINE_R4000); - ECase(IMAGE_FILE_MACHINE_SH3); - ECase(IMAGE_FILE_MACHINE_SH3DSP); - ECase(IMAGE_FILE_MACHINE_SH4); - ECase(IMAGE_FILE_MACHINE_SH5); - ECase(IMAGE_FILE_MACHINE_THUMB); - ECase(IMAGE_FILE_MACHINE_WCEMIPSV2); -} - -void ScalarEnumerationTraits<COFF::SymbolBaseType>::enumeration( - IO &IO, COFF::SymbolBaseType &Value) { - ECase(IMAGE_SYM_TYPE_NULL); - ECase(IMAGE_SYM_TYPE_VOID); - ECase(IMAGE_SYM_TYPE_CHAR); - ECase(IMAGE_SYM_TYPE_SHORT); - ECase(IMAGE_SYM_TYPE_INT); - ECase(IMAGE_SYM_TYPE_LONG); - ECase(IMAGE_SYM_TYPE_FLOAT); - ECase(IMAGE_SYM_TYPE_DOUBLE); - ECase(IMAGE_SYM_TYPE_STRUCT); - ECase(IMAGE_SYM_TYPE_UNION); - ECase(IMAGE_SYM_TYPE_ENUM); - ECase(IMAGE_SYM_TYPE_MOE); - ECase(IMAGE_SYM_TYPE_BYTE); - ECase(IMAGE_SYM_TYPE_WORD); - ECase(IMAGE_SYM_TYPE_UINT); - ECase(IMAGE_SYM_TYPE_DWORD); -} - -void ScalarEnumerationTraits<COFF::SymbolStorageClass>::enumeration( - IO &IO, COFF::SymbolStorageClass &Value) { - ECase(IMAGE_SYM_CLASS_END_OF_FUNCTION); - ECase(IMAGE_SYM_CLASS_NULL); - ECase(IMAGE_SYM_CLASS_AUTOMATIC); - ECase(IMAGE_SYM_CLASS_EXTERNAL); - ECase(IMAGE_SYM_CLASS_STATIC); - ECase(IMAGE_SYM_CLASS_REGISTER); - ECase(IMAGE_SYM_CLASS_EXTERNAL_DEF); - ECase(IMAGE_SYM_CLASS_LABEL); - ECase(IMAGE_SYM_CLASS_UNDEFINED_LABEL); - ECase(IMAGE_SYM_CLASS_MEMBER_OF_STRUCT); - ECase(IMAGE_SYM_CLASS_ARGUMENT); - ECase(IMAGE_SYM_CLASS_STRUCT_TAG); - ECase(IMAGE_SYM_CLASS_MEMBER_OF_UNION); - ECase(IMAGE_SYM_CLASS_UNION_TAG); - ECase(IMAGE_SYM_CLASS_TYPE_DEFINITION); - ECase(IMAGE_SYM_CLASS_UNDEFINED_STATIC); - ECase(IMAGE_SYM_CLASS_ENUM_TAG); - ECase(IMAGE_SYM_CLASS_MEMBER_OF_ENUM); - ECase(IMAGE_SYM_CLASS_REGISTER_PARAM); - ECase(IMAGE_SYM_CLASS_BIT_FIELD); - ECase(IMAGE_SYM_CLASS_BLOCK); - ECase(IMAGE_SYM_CLASS_FUNCTION); - ECase(IMAGE_SYM_CLASS_END_OF_STRUCT); - ECase(IMAGE_SYM_CLASS_FILE); - ECase(IMAGE_SYM_CLASS_SECTION); - ECase(IMAGE_SYM_CLASS_WEAK_EXTERNAL); - ECase(IMAGE_SYM_CLASS_CLR_TOKEN); -} - -void ScalarEnumerationTraits<COFF::SymbolComplexType>::enumeration( - IO &IO, COFF::SymbolComplexType &Value) { - ECase(IMAGE_SYM_DTYPE_NULL); - ECase(IMAGE_SYM_DTYPE_POINTER); - ECase(IMAGE_SYM_DTYPE_FUNCTION); - ECase(IMAGE_SYM_DTYPE_ARRAY); -} - -void ScalarEnumerationTraits<COFF::RelocationTypeI386>::enumeration( - IO &IO, COFF::RelocationTypeI386 &Value) { - ECase(IMAGE_REL_I386_ABSOLUTE); - ECase(IMAGE_REL_I386_DIR16); - ECase(IMAGE_REL_I386_REL16); - ECase(IMAGE_REL_I386_DIR32); - ECase(IMAGE_REL_I386_DIR32NB); - ECase(IMAGE_REL_I386_SEG12); - ECase(IMAGE_REL_I386_SECTION); - ECase(IMAGE_REL_I386_SECREL); - ECase(IMAGE_REL_I386_TOKEN); - ECase(IMAGE_REL_I386_SECREL7); - ECase(IMAGE_REL_I386_REL32); -} - -void ScalarEnumerationTraits<COFF::RelocationTypeAMD64>::enumeration( - IO &IO, COFF::RelocationTypeAMD64 &Value) { - ECase(IMAGE_REL_AMD64_ABSOLUTE); - ECase(IMAGE_REL_AMD64_ADDR64); - ECase(IMAGE_REL_AMD64_ADDR32); - ECase(IMAGE_REL_AMD64_ADDR32NB); - ECase(IMAGE_REL_AMD64_REL32); - ECase(IMAGE_REL_AMD64_REL32_1); - ECase(IMAGE_REL_AMD64_REL32_2); - ECase(IMAGE_REL_AMD64_REL32_3); - ECase(IMAGE_REL_AMD64_REL32_4); - ECase(IMAGE_REL_AMD64_REL32_5); - ECase(IMAGE_REL_AMD64_SECTION); - ECase(IMAGE_REL_AMD64_SECREL); - ECase(IMAGE_REL_AMD64_SECREL7); - ECase(IMAGE_REL_AMD64_TOKEN); - ECase(IMAGE_REL_AMD64_SREL32); - ECase(IMAGE_REL_AMD64_PAIR); - ECase(IMAGE_REL_AMD64_SSPAN32); -} - -void ScalarEnumerationTraits<COFF::RelocationTypesARM>::enumeration( - IO &IO, COFF::RelocationTypesARM &Value) { - ECase(IMAGE_REL_ARM_ABSOLUTE); - ECase(IMAGE_REL_ARM_ADDR32); - ECase(IMAGE_REL_ARM_ADDR32NB); - ECase(IMAGE_REL_ARM_BRANCH24); - ECase(IMAGE_REL_ARM_BRANCH11); - ECase(IMAGE_REL_ARM_TOKEN); - ECase(IMAGE_REL_ARM_BLX24); - ECase(IMAGE_REL_ARM_BLX11); - ECase(IMAGE_REL_ARM_SECTION); - ECase(IMAGE_REL_ARM_SECREL); - ECase(IMAGE_REL_ARM_MOV32A); - ECase(IMAGE_REL_ARM_MOV32T); - ECase(IMAGE_REL_ARM_BRANCH20T); - ECase(IMAGE_REL_ARM_BRANCH24T); - ECase(IMAGE_REL_ARM_BLX23T); -} - -void ScalarEnumerationTraits<COFF::RelocationTypesARM64>::enumeration( - IO &IO, COFF::RelocationTypesARM64 &Value) { - ECase(IMAGE_REL_ARM64_ABSOLUTE); - ECase(IMAGE_REL_ARM64_ADDR32); - ECase(IMAGE_REL_ARM64_ADDR32NB); - ECase(IMAGE_REL_ARM64_BRANCH26); - ECase(IMAGE_REL_ARM64_PAGEBASE_REL21); - ECase(IMAGE_REL_ARM64_REL21); - ECase(IMAGE_REL_ARM64_PAGEOFFSET_12A); - ECase(IMAGE_REL_ARM64_PAGEOFFSET_12L); - ECase(IMAGE_REL_ARM64_SECREL); - ECase(IMAGE_REL_ARM64_SECREL_LOW12A); - ECase(IMAGE_REL_ARM64_SECREL_HIGH12A); - ECase(IMAGE_REL_ARM64_SECREL_LOW12L); - ECase(IMAGE_REL_ARM64_TOKEN); - ECase(IMAGE_REL_ARM64_SECTION); - ECase(IMAGE_REL_ARM64_ADDR64); - ECase(IMAGE_REL_ARM64_BRANCH19); - ECase(IMAGE_REL_ARM64_BRANCH14); -} - -void ScalarEnumerationTraits<COFF::WindowsSubsystem>::enumeration( - IO &IO, COFF::WindowsSubsystem &Value) { - ECase(IMAGE_SUBSYSTEM_UNKNOWN); - ECase(IMAGE_SUBSYSTEM_NATIVE); - ECase(IMAGE_SUBSYSTEM_WINDOWS_GUI); - ECase(IMAGE_SUBSYSTEM_WINDOWS_CUI); - ECase(IMAGE_SUBSYSTEM_OS2_CUI); - ECase(IMAGE_SUBSYSTEM_POSIX_CUI); - ECase(IMAGE_SUBSYSTEM_NATIVE_WINDOWS); - ECase(IMAGE_SUBSYSTEM_WINDOWS_CE_GUI); - ECase(IMAGE_SUBSYSTEM_EFI_APPLICATION); - ECase(IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER); - ECase(IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER); - ECase(IMAGE_SUBSYSTEM_EFI_ROM); - ECase(IMAGE_SUBSYSTEM_XBOX); - ECase(IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION); -} -#undef ECase - -#define BCase(X) IO.bitSetCase(Value, #X, COFF::X); -void ScalarBitSetTraits<COFF::Characteristics>::bitset( - IO &IO, COFF::Characteristics &Value) { - BCase(IMAGE_FILE_RELOCS_STRIPPED); - BCase(IMAGE_FILE_EXECUTABLE_IMAGE); - BCase(IMAGE_FILE_LINE_NUMS_STRIPPED); - BCase(IMAGE_FILE_LOCAL_SYMS_STRIPPED); - BCase(IMAGE_FILE_AGGRESSIVE_WS_TRIM); - BCase(IMAGE_FILE_LARGE_ADDRESS_AWARE); - BCase(IMAGE_FILE_BYTES_REVERSED_LO); - BCase(IMAGE_FILE_32BIT_MACHINE); - BCase(IMAGE_FILE_DEBUG_STRIPPED); - BCase(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP); - BCase(IMAGE_FILE_NET_RUN_FROM_SWAP); - BCase(IMAGE_FILE_SYSTEM); - BCase(IMAGE_FILE_DLL); - BCase(IMAGE_FILE_UP_SYSTEM_ONLY); - BCase(IMAGE_FILE_BYTES_REVERSED_HI); -} - -void ScalarBitSetTraits<COFF::SectionCharacteristics>::bitset( - IO &IO, COFF::SectionCharacteristics &Value) { - BCase(IMAGE_SCN_TYPE_NOLOAD); - BCase(IMAGE_SCN_TYPE_NO_PAD); - BCase(IMAGE_SCN_CNT_CODE); - BCase(IMAGE_SCN_CNT_INITIALIZED_DATA); - BCase(IMAGE_SCN_CNT_UNINITIALIZED_DATA); - BCase(IMAGE_SCN_LNK_OTHER); - BCase(IMAGE_SCN_LNK_INFO); - BCase(IMAGE_SCN_LNK_REMOVE); - BCase(IMAGE_SCN_LNK_COMDAT); - BCase(IMAGE_SCN_GPREL); - BCase(IMAGE_SCN_MEM_PURGEABLE); - BCase(IMAGE_SCN_MEM_16BIT); - BCase(IMAGE_SCN_MEM_LOCKED); - BCase(IMAGE_SCN_MEM_PRELOAD); - BCase(IMAGE_SCN_LNK_NRELOC_OVFL); - BCase(IMAGE_SCN_MEM_DISCARDABLE); - BCase(IMAGE_SCN_MEM_NOT_CACHED); - BCase(IMAGE_SCN_MEM_NOT_PAGED); - BCase(IMAGE_SCN_MEM_SHARED); - BCase(IMAGE_SCN_MEM_EXECUTE); - BCase(IMAGE_SCN_MEM_READ); - BCase(IMAGE_SCN_MEM_WRITE); -} - -void ScalarBitSetTraits<COFF::DLLCharacteristics>::bitset( - IO &IO, COFF::DLLCharacteristics &Value) { - BCase(IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA); - BCase(IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE); - BCase(IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY); - BCase(IMAGE_DLL_CHARACTERISTICS_NX_COMPAT); - BCase(IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION); - BCase(IMAGE_DLL_CHARACTERISTICS_NO_SEH); - BCase(IMAGE_DLL_CHARACTERISTICS_NO_BIND); - BCase(IMAGE_DLL_CHARACTERISTICS_APPCONTAINER); - BCase(IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER); - BCase(IMAGE_DLL_CHARACTERISTICS_GUARD_CF); - BCase(IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE); -} -#undef BCase - -namespace { - -struct NSectionSelectionType { - NSectionSelectionType(IO &) - : SelectionType(COFFYAML::COMDATType(0)) {} - NSectionSelectionType(IO &, uint8_t C) - : SelectionType(COFFYAML::COMDATType(C)) {} - - uint8_t denormalize(IO &) { return SelectionType; } - - COFFYAML::COMDATType SelectionType; -}; - -struct NWeakExternalCharacteristics { - NWeakExternalCharacteristics(IO &) - : Characteristics(COFFYAML::WeakExternalCharacteristics(0)) {} - NWeakExternalCharacteristics(IO &, uint32_t C) - : Characteristics(COFFYAML::WeakExternalCharacteristics(C)) {} - - uint32_t denormalize(IO &) { return Characteristics; } - - COFFYAML::WeakExternalCharacteristics Characteristics; -}; - -struct NSectionCharacteristics { - NSectionCharacteristics(IO &) - : Characteristics(COFF::SectionCharacteristics(0)) {} - NSectionCharacteristics(IO &, uint32_t C) - : Characteristics(COFF::SectionCharacteristics(C)) {} - - uint32_t denormalize(IO &) { return Characteristics; } - - COFF::SectionCharacteristics Characteristics; -}; - -struct NAuxTokenType { - NAuxTokenType(IO &) - : AuxType(COFFYAML::AuxSymbolType(0)) {} - NAuxTokenType(IO &, uint8_t C) - : AuxType(COFFYAML::AuxSymbolType(C)) {} - - uint32_t denormalize(IO &) { return AuxType; } - - COFFYAML::AuxSymbolType AuxType; -}; - -struct NStorageClass { - NStorageClass(IO &) : StorageClass(COFF::SymbolStorageClass(0)) {} - NStorageClass(IO &, uint8_t S) : StorageClass(COFF::SymbolStorageClass(S)) {} - - uint8_t denormalize(IO &) { return StorageClass; } - - COFF::SymbolStorageClass StorageClass; -}; - -struct NMachine { - NMachine(IO &) : Machine(COFF::MachineTypes(0)) {} - NMachine(IO &, uint16_t M) : Machine(COFF::MachineTypes(M)) {} - - uint16_t denormalize(IO &) { return Machine; } - - COFF::MachineTypes Machine; -}; - -struct NHeaderCharacteristics { - NHeaderCharacteristics(IO &) : Characteristics(COFF::Characteristics(0)) {} - NHeaderCharacteristics(IO &, uint16_t C) - : Characteristics(COFF::Characteristics(C)) {} - - uint16_t denormalize(IO &) { return Characteristics; } - - COFF::Characteristics Characteristics; -}; - -template <typename RelocType> -struct NType { - NType(IO &) : Type(RelocType(0)) {} - NType(IO &, uint16_t T) : Type(RelocType(T)) {} - - uint16_t denormalize(IO &) { return Type; } - - RelocType Type; -}; - -struct NWindowsSubsystem { - NWindowsSubsystem(IO &) : Subsystem(COFF::WindowsSubsystem(0)) {} - NWindowsSubsystem(IO &, uint16_t C) : Subsystem(COFF::WindowsSubsystem(C)) {} - - uint16_t denormalize(IO &) { return Subsystem; } - - COFF::WindowsSubsystem Subsystem; -}; - -struct NDLLCharacteristics { - NDLLCharacteristics(IO &) : Characteristics(COFF::DLLCharacteristics(0)) {} - NDLLCharacteristics(IO &, uint16_t C) - : Characteristics(COFF::DLLCharacteristics(C)) {} - - uint16_t denormalize(IO &) { return Characteristics; } - - COFF::DLLCharacteristics Characteristics; -}; - -} // end anonymous namespace - -void MappingTraits<COFFYAML::Relocation>::mapping(IO &IO, - COFFYAML::Relocation &Rel) { - IO.mapRequired("VirtualAddress", Rel.VirtualAddress); - IO.mapOptional("SymbolName", Rel.SymbolName, StringRef()); - IO.mapOptional("SymbolTableIndex", Rel.SymbolTableIndex); - - COFF::header &H = *static_cast<COFF::header *>(IO.getContext()); - if (H.Machine == COFF::IMAGE_FILE_MACHINE_I386) { - MappingNormalization<NType<COFF::RelocationTypeI386>, uint16_t> NT( - IO, Rel.Type); - IO.mapRequired("Type", NT->Type); - } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_AMD64) { - MappingNormalization<NType<COFF::RelocationTypeAMD64>, uint16_t> NT( - IO, Rel.Type); - IO.mapRequired("Type", NT->Type); - } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT) { - MappingNormalization<NType<COFF::RelocationTypesARM>, uint16_t> NT( - IO, Rel.Type); - IO.mapRequired("Type", NT->Type); - } else if (H.Machine == COFF::IMAGE_FILE_MACHINE_ARM64) { - MappingNormalization<NType<COFF::RelocationTypesARM64>, uint16_t> NT( - IO, Rel.Type); - IO.mapRequired("Type", NT->Type); - } else { - IO.mapRequired("Type", Rel.Type); - } -} - -void MappingTraits<COFF::DataDirectory>::mapping(IO &IO, - COFF::DataDirectory &DD) { - IO.mapRequired("RelativeVirtualAddress", DD.RelativeVirtualAddress); - IO.mapRequired("Size", DD.Size); -} - -void MappingTraits<COFFYAML::PEHeader>::mapping(IO &IO, - COFFYAML::PEHeader &PH) { - MappingNormalization<NWindowsSubsystem, uint16_t> NWS(IO, - PH.Header.Subsystem); - MappingNormalization<NDLLCharacteristics, uint16_t> NDC( - IO, PH.Header.DLLCharacteristics); - - IO.mapRequired("AddressOfEntryPoint", PH.Header.AddressOfEntryPoint); - IO.mapRequired("ImageBase", PH.Header.ImageBase); - IO.mapRequired("SectionAlignment", PH.Header.SectionAlignment); - IO.mapRequired("FileAlignment", PH.Header.FileAlignment); - IO.mapRequired("MajorOperatingSystemVersion", - PH.Header.MajorOperatingSystemVersion); - IO.mapRequired("MinorOperatingSystemVersion", - PH.Header.MinorOperatingSystemVersion); - IO.mapRequired("MajorImageVersion", PH.Header.MajorImageVersion); - IO.mapRequired("MinorImageVersion", PH.Header.MinorImageVersion); - IO.mapRequired("MajorSubsystemVersion", PH.Header.MajorSubsystemVersion); - IO.mapRequired("MinorSubsystemVersion", PH.Header.MinorSubsystemVersion); - IO.mapRequired("Subsystem", NWS->Subsystem); - IO.mapRequired("DLLCharacteristics", NDC->Characteristics); - IO.mapRequired("SizeOfStackReserve", PH.Header.SizeOfStackReserve); - IO.mapRequired("SizeOfStackCommit", PH.Header.SizeOfStackCommit); - IO.mapRequired("SizeOfHeapReserve", PH.Header.SizeOfHeapReserve); - IO.mapRequired("SizeOfHeapCommit", PH.Header.SizeOfHeapCommit); - - IO.mapOptional("ExportTable", PH.DataDirectories[COFF::EXPORT_TABLE]); - IO.mapOptional("ImportTable", PH.DataDirectories[COFF::IMPORT_TABLE]); - IO.mapOptional("ResourceTable", PH.DataDirectories[COFF::RESOURCE_TABLE]); - IO.mapOptional("ExceptionTable", PH.DataDirectories[COFF::EXCEPTION_TABLE]); - IO.mapOptional("CertificateTable", PH.DataDirectories[COFF::CERTIFICATE_TABLE]); - IO.mapOptional("BaseRelocationTable", - PH.DataDirectories[COFF::BASE_RELOCATION_TABLE]); - IO.mapOptional("Debug", PH.DataDirectories[COFF::DEBUG_DIRECTORY]); - IO.mapOptional("Architecture", PH.DataDirectories[COFF::ARCHITECTURE]); - IO.mapOptional("GlobalPtr", PH.DataDirectories[COFF::GLOBAL_PTR]); - IO.mapOptional("TlsTable", PH.DataDirectories[COFF::TLS_TABLE]); - IO.mapOptional("LoadConfigTable", - PH.DataDirectories[COFF::LOAD_CONFIG_TABLE]); - IO.mapOptional("BoundImport", PH.DataDirectories[COFF::BOUND_IMPORT]); - IO.mapOptional("IAT", PH.DataDirectories[COFF::IAT]); - IO.mapOptional("DelayImportDescriptor", - PH.DataDirectories[COFF::DELAY_IMPORT_DESCRIPTOR]); - IO.mapOptional("ClrRuntimeHeader", - PH.DataDirectories[COFF::CLR_RUNTIME_HEADER]); -} - -void MappingTraits<COFF::header>::mapping(IO &IO, COFF::header &H) { - MappingNormalization<NMachine, uint16_t> NM(IO, H.Machine); - MappingNormalization<NHeaderCharacteristics, uint16_t> NC(IO, - H.Characteristics); - - IO.mapRequired("Machine", NM->Machine); - IO.mapOptional("Characteristics", NC->Characteristics); - IO.setContext(static_cast<void *>(&H)); -} - -void MappingTraits<COFF::AuxiliaryFunctionDefinition>::mapping( - IO &IO, COFF::AuxiliaryFunctionDefinition &AFD) { - IO.mapRequired("TagIndex", AFD.TagIndex); - IO.mapRequired("TotalSize", AFD.TotalSize); - IO.mapRequired("PointerToLinenumber", AFD.PointerToLinenumber); - IO.mapRequired("PointerToNextFunction", AFD.PointerToNextFunction); -} - -void MappingTraits<COFF::AuxiliarybfAndefSymbol>::mapping( - IO &IO, COFF::AuxiliarybfAndefSymbol &AAS) { - IO.mapRequired("Linenumber", AAS.Linenumber); - IO.mapRequired("PointerToNextFunction", AAS.PointerToNextFunction); -} - -void MappingTraits<COFF::AuxiliaryWeakExternal>::mapping( - IO &IO, COFF::AuxiliaryWeakExternal &AWE) { - MappingNormalization<NWeakExternalCharacteristics, uint32_t> NWEC( - IO, AWE.Characteristics); - IO.mapRequired("TagIndex", AWE.TagIndex); - IO.mapRequired("Characteristics", NWEC->Characteristics); -} - -void MappingTraits<COFF::AuxiliarySectionDefinition>::mapping( - IO &IO, COFF::AuxiliarySectionDefinition &ASD) { - MappingNormalization<NSectionSelectionType, uint8_t> NSST( - IO, ASD.Selection); - - IO.mapRequired("Length", ASD.Length); - IO.mapRequired("NumberOfRelocations", ASD.NumberOfRelocations); - IO.mapRequired("NumberOfLinenumbers", ASD.NumberOfLinenumbers); - IO.mapRequired("CheckSum", ASD.CheckSum); - IO.mapRequired("Number", ASD.Number); - IO.mapOptional("Selection", NSST->SelectionType, COFFYAML::COMDATType(0)); -} - -void MappingTraits<COFF::AuxiliaryCLRToken>::mapping( - IO &IO, COFF::AuxiliaryCLRToken &ACT) { - MappingNormalization<NAuxTokenType, uint8_t> NATT(IO, ACT.AuxType); - IO.mapRequired("AuxType", NATT->AuxType); - IO.mapRequired("SymbolTableIndex", ACT.SymbolTableIndex); -} - -void MappingTraits<COFFYAML::Symbol>::mapping(IO &IO, COFFYAML::Symbol &S) { - MappingNormalization<NStorageClass, uint8_t> NS(IO, S.Header.StorageClass); - - IO.mapRequired("Name", S.Name); - IO.mapRequired("Value", S.Header.Value); - IO.mapRequired("SectionNumber", S.Header.SectionNumber); - IO.mapRequired("SimpleType", S.SimpleType); - IO.mapRequired("ComplexType", S.ComplexType); - IO.mapRequired("StorageClass", NS->StorageClass); - IO.mapOptional("FunctionDefinition", S.FunctionDefinition); - IO.mapOptional("bfAndefSymbol", S.bfAndefSymbol); - IO.mapOptional("WeakExternal", S.WeakExternal); - IO.mapOptional("File", S.File, StringRef()); - IO.mapOptional("SectionDefinition", S.SectionDefinition); - IO.mapOptional("CLRToken", S.CLRToken); -} - -void MappingTraits<COFFYAML::Section>::mapping(IO &IO, COFFYAML::Section &Sec) { - MappingNormalization<NSectionCharacteristics, uint32_t> NC( - IO, Sec.Header.Characteristics); - IO.mapRequired("Name", Sec.Name); - IO.mapRequired("Characteristics", NC->Characteristics); - IO.mapOptional("VirtualAddress", Sec.Header.VirtualAddress, 0U); - IO.mapOptional("VirtualSize", Sec.Header.VirtualSize, 0U); - IO.mapOptional("Alignment", Sec.Alignment, 0U); - - // If this is a .debug$S .debug$T .debug$P, or .debug$H section parse the - // semantic representation of the symbols/types. If it is any other kind - // of section, just deal in raw bytes. - IO.mapOptional("SectionData", Sec.SectionData); - if (Sec.Name == ".debug$S") - IO.mapOptional("Subsections", Sec.DebugS); - else if (Sec.Name == ".debug$T") - IO.mapOptional("Types", Sec.DebugT); - else if (Sec.Name == ".debug$P") - IO.mapOptional("PrecompTypes", Sec.DebugP); - else if (Sec.Name == ".debug$H") - IO.mapOptional("GlobalHashes", Sec.DebugH); - - IO.mapOptional("Relocations", Sec.Relocations); -} - -void MappingTraits<COFFYAML::Object>::mapping(IO &IO, COFFYAML::Object &Obj) { - IO.mapTag("!COFF", true); - IO.mapOptional("OptionalHeader", Obj.OptionalHeader); - IO.mapRequired("header", Obj.Header); - IO.mapRequired("sections", Obj.Sections); - IO.mapRequired("symbols", Obj.Symbols); -} - -} // end namespace yaml - -} // end namespace llvm diff --git a/gnu/llvm/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp b/gnu/llvm/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp deleted file mode 100644 index 4deeae87801..00000000000 --- a/gnu/llvm/lib/ObjectYAML/CodeViewYAMLDebugSections.cpp +++ /dev/null @@ -1,958 +0,0 @@ -//===- CodeViewYAMLDebugSections.cpp - CodeView YAMLIO debug sections -----===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines classes for handling the YAML representation of CodeView -// Debug Info. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h" -#include "llvm/ADT/STLExtras.h" -#include "llvm/ADT/StringExtras.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/BinaryFormat/COFF.h" -#include "llvm/DebugInfo/CodeView/CodeView.h" -#include "llvm/DebugInfo/CodeView/CodeViewError.h" -#include "llvm/DebugInfo/CodeView/DebugChecksumsSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugCrossExSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugCrossImpSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugFrameDataSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugInlineeLinesSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugLinesSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugStringTableSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugSubsection.h" -#include "llvm/DebugInfo/CodeView/DebugSubsectionVisitor.h" -#include "llvm/DebugInfo/CodeView/DebugSymbolRVASubsection.h" -#include "llvm/DebugInfo/CodeView/DebugSymbolsSubsection.h" -#include "llvm/DebugInfo/CodeView/Line.h" -#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h" -#include "llvm/DebugInfo/CodeView/TypeIndex.h" -#include "llvm/ObjectYAML/CodeViewYAMLSymbols.h" -#include "llvm/Support/Allocator.h" -#include "llvm/Support/BinaryStreamReader.h" -#include "llvm/Support/Endian.h" -#include "llvm/Support/Error.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/YAMLTraits.h" -#include "llvm/Support/raw_ostream.h" -#include <algorithm> -#include <cassert> -#include <cstdint> -#include <memory> -#include <string> -#include <tuple> -#include <vector> - -using namespace llvm; -using namespace llvm::codeview; -using namespace llvm::CodeViewYAML; -using namespace llvm::CodeViewYAML::detail; -using namespace llvm::yaml; - -LLVM_YAML_IS_SEQUENCE_VECTOR(SourceFileChecksumEntry) -LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineEntry) -LLVM_YAML_IS_SEQUENCE_VECTOR(SourceColumnEntry) -LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineBlock) -LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineInfo) -LLVM_YAML_IS_SEQUENCE_VECTOR(InlineeSite) -LLVM_YAML_IS_SEQUENCE_VECTOR(InlineeInfo) -LLVM_YAML_IS_SEQUENCE_VECTOR(CrossModuleExport) -LLVM_YAML_IS_SEQUENCE_VECTOR(YAMLCrossModuleImport) -LLVM_YAML_IS_SEQUENCE_VECTOR(YAMLFrameData) - -LLVM_YAML_DECLARE_SCALAR_TRAITS(HexFormattedString, QuotingType::None) -LLVM_YAML_DECLARE_ENUM_TRAITS(DebugSubsectionKind) -LLVM_YAML_DECLARE_ENUM_TRAITS(FileChecksumKind) -LLVM_YAML_DECLARE_BITSET_TRAITS(LineFlags) - -LLVM_YAML_DECLARE_MAPPING_TRAITS(CrossModuleExport) -LLVM_YAML_DECLARE_MAPPING_TRAITS(YAMLFrameData) -LLVM_YAML_DECLARE_MAPPING_TRAITS(YAMLCrossModuleImport) -LLVM_YAML_DECLARE_MAPPING_TRAITS(CrossModuleImportItem) -LLVM_YAML_DECLARE_MAPPING_TRAITS(SourceLineEntry) -LLVM_YAML_DECLARE_MAPPING_TRAITS(SourceColumnEntry) -LLVM_YAML_DECLARE_MAPPING_TRAITS(SourceFileChecksumEntry) -LLVM_YAML_DECLARE_MAPPING_TRAITS(SourceLineBlock) -LLVM_YAML_DECLARE_MAPPING_TRAITS(InlineeSite) - -namespace llvm { -namespace CodeViewYAML { -namespace detail { - -struct YAMLSubsectionBase { - explicit YAMLSubsectionBase(DebugSubsectionKind Kind) : Kind(Kind) {} - virtual ~YAMLSubsectionBase() = default; - - virtual void map(IO &IO) = 0; - virtual std::shared_ptr<DebugSubsection> - toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const = 0; - - DebugSubsectionKind Kind; -}; - -} // end namespace detail -} // end namespace CodeViewYAML -} // end namespace llvm - -namespace { - -struct YAMLChecksumsSubsection : public YAMLSubsectionBase { - YAMLChecksumsSubsection() - : YAMLSubsectionBase(DebugSubsectionKind::FileChecksums) {} - - void map(IO &IO) override; - std::shared_ptr<DebugSubsection> - toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; - static Expected<std::shared_ptr<YAMLChecksumsSubsection>> - fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings, - const DebugChecksumsSubsectionRef &FC); - - std::vector<SourceFileChecksumEntry> Checksums; -}; - -struct YAMLLinesSubsection : public YAMLSubsectionBase { - YAMLLinesSubsection() : YAMLSubsectionBase(DebugSubsectionKind::Lines) {} - - void map(IO &IO) override; - std::shared_ptr<DebugSubsection> - toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; - static Expected<std::shared_ptr<YAMLLinesSubsection>> - fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings, - const DebugChecksumsSubsectionRef &Checksums, - const DebugLinesSubsectionRef &Lines); - - SourceLineInfo Lines; -}; - -struct YAMLInlineeLinesSubsection : public YAMLSubsectionBase { - YAMLInlineeLinesSubsection() - : YAMLSubsectionBase(DebugSubsectionKind::InlineeLines) {} - - void map(IO &IO) override; - std::shared_ptr<DebugSubsection> - toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; - static Expected<std::shared_ptr<YAMLInlineeLinesSubsection>> - fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings, - const DebugChecksumsSubsectionRef &Checksums, - const DebugInlineeLinesSubsectionRef &Lines); - - InlineeInfo InlineeLines; -}; - -struct YAMLCrossModuleExportsSubsection : public YAMLSubsectionBase { - YAMLCrossModuleExportsSubsection() - : YAMLSubsectionBase(DebugSubsectionKind::CrossScopeExports) {} - - void map(IO &IO) override; - std::shared_ptr<DebugSubsection> - toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; - static Expected<std::shared_ptr<YAMLCrossModuleExportsSubsection>> - fromCodeViewSubsection(const DebugCrossModuleExportsSubsectionRef &Exports); - - std::vector<CrossModuleExport> Exports; -}; - -struct YAMLCrossModuleImportsSubsection : public YAMLSubsectionBase { - YAMLCrossModuleImportsSubsection() - : YAMLSubsectionBase(DebugSubsectionKind::CrossScopeImports) {} - - void map(IO &IO) override; - std::shared_ptr<DebugSubsection> - toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; - static Expected<std::shared_ptr<YAMLCrossModuleImportsSubsection>> - fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings, - const DebugCrossModuleImportsSubsectionRef &Imports); - - std::vector<YAMLCrossModuleImport> Imports; -}; - -struct YAMLSymbolsSubsection : public YAMLSubsectionBase { - YAMLSymbolsSubsection() : YAMLSubsectionBase(DebugSubsectionKind::Symbols) {} - - void map(IO &IO) override; - std::shared_ptr<DebugSubsection> - toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; - static Expected<std::shared_ptr<YAMLSymbolsSubsection>> - fromCodeViewSubsection(const DebugSymbolsSubsectionRef &Symbols); - - std::vector<CodeViewYAML::SymbolRecord> Symbols; -}; - -struct YAMLStringTableSubsection : public YAMLSubsectionBase { - YAMLStringTableSubsection() - : YAMLSubsectionBase(DebugSubsectionKind::StringTable) {} - - void map(IO &IO) override; - std::shared_ptr<DebugSubsection> - toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; - static Expected<std::shared_ptr<YAMLStringTableSubsection>> - fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings); - - std::vector<StringRef> Strings; -}; - -struct YAMLFrameDataSubsection : public YAMLSubsectionBase { - YAMLFrameDataSubsection() - : YAMLSubsectionBase(DebugSubsectionKind::FrameData) {} - - void map(IO &IO) override; - std::shared_ptr<DebugSubsection> - toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; - static Expected<std::shared_ptr<YAMLFrameDataSubsection>> - fromCodeViewSubsection(const DebugStringTableSubsectionRef &Strings, - const DebugFrameDataSubsectionRef &Frames); - - std::vector<YAMLFrameData> Frames; -}; - -struct YAMLCoffSymbolRVASubsection : public YAMLSubsectionBase { - YAMLCoffSymbolRVASubsection() - : YAMLSubsectionBase(DebugSubsectionKind::CoffSymbolRVA) {} - - void map(IO &IO) override; - std::shared_ptr<DebugSubsection> - toCodeViewSubsection(BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const override; - static Expected<std::shared_ptr<YAMLCoffSymbolRVASubsection>> - fromCodeViewSubsection(const DebugSymbolRVASubsectionRef &RVAs); - - std::vector<uint32_t> RVAs; -}; - -} // end anonymous namespace - -void ScalarBitSetTraits<LineFlags>::bitset(IO &io, LineFlags &Flags) { - io.bitSetCase(Flags, "HasColumnInfo", LF_HaveColumns); - io.enumFallback<Hex16>(Flags); -} - -void ScalarEnumerationTraits<FileChecksumKind>::enumeration( - IO &io, FileChecksumKind &Kind) { - io.enumCase(Kind, "None", FileChecksumKind::None); - io.enumCase(Kind, "MD5", FileChecksumKind::MD5); - io.enumCase(Kind, "SHA1", FileChecksumKind::SHA1); - io.enumCase(Kind, "SHA256", FileChecksumKind::SHA256); -} - -void ScalarTraits<HexFormattedString>::output(const HexFormattedString &Value, - void *ctx, raw_ostream &Out) { - StringRef Bytes(reinterpret_cast<const char *>(Value.Bytes.data()), - Value.Bytes.size()); - Out << toHex(Bytes); -} - -StringRef ScalarTraits<HexFormattedString>::input(StringRef Scalar, void *ctxt, - HexFormattedString &Value) { - std::string H = fromHex(Scalar); - Value.Bytes.assign(H.begin(), H.end()); - return StringRef(); -} - -void MappingTraits<SourceLineEntry>::mapping(IO &IO, SourceLineEntry &Obj) { - IO.mapRequired("Offset", Obj.Offset); - IO.mapRequired("LineStart", Obj.LineStart); - IO.mapRequired("IsStatement", Obj.IsStatement); - IO.mapRequired("EndDelta", Obj.EndDelta); -} - -void MappingTraits<SourceColumnEntry>::mapping(IO &IO, SourceColumnEntry &Obj) { - IO.mapRequired("StartColumn", Obj.StartColumn); - IO.mapRequired("EndColumn", Obj.EndColumn); -} - -void MappingTraits<SourceLineBlock>::mapping(IO &IO, SourceLineBlock &Obj) { - IO.mapRequired("FileName", Obj.FileName); - IO.mapRequired("Lines", Obj.Lines); - IO.mapRequired("Columns", Obj.Columns); -} - -void MappingTraits<CrossModuleExport>::mapping(IO &IO, CrossModuleExport &Obj) { - IO.mapRequired("LocalId", Obj.Local); - IO.mapRequired("GlobalId", Obj.Global); -} - -void MappingTraits<YAMLCrossModuleImport>::mapping(IO &IO, - YAMLCrossModuleImport &Obj) { - IO.mapRequired("Module", Obj.ModuleName); - IO.mapRequired("Imports", Obj.ImportIds); -} - -void MappingTraits<SourceFileChecksumEntry>::mapping( - IO &IO, SourceFileChecksumEntry &Obj) { - IO.mapRequired("FileName", Obj.FileName); - IO.mapRequired("Kind", Obj.Kind); - IO.mapRequired("Checksum", Obj.ChecksumBytes); -} - -void MappingTraits<InlineeSite>::mapping(IO &IO, InlineeSite &Obj) { - IO.mapRequired("FileName", Obj.FileName); - IO.mapRequired("LineNum", Obj.SourceLineNum); - IO.mapRequired("Inlinee", Obj.Inlinee); - IO.mapOptional("ExtraFiles", Obj.ExtraFiles); -} - -void MappingTraits<YAMLFrameData>::mapping(IO &IO, YAMLFrameData &Obj) { - IO.mapRequired("CodeSize", Obj.CodeSize); - IO.mapRequired("FrameFunc", Obj.FrameFunc); - IO.mapRequired("LocalSize", Obj.LocalSize); - IO.mapOptional("MaxStackSize", Obj.MaxStackSize); - IO.mapOptional("ParamsSize", Obj.ParamsSize); - IO.mapOptional("PrologSize", Obj.PrologSize); - IO.mapOptional("RvaStart", Obj.RvaStart); - IO.mapOptional("SavedRegsSize", Obj.SavedRegsSize); -} - -void YAMLChecksumsSubsection::map(IO &IO) { - IO.mapTag("!FileChecksums", true); - IO.mapRequired("Checksums", Checksums); -} - -void YAMLLinesSubsection::map(IO &IO) { - IO.mapTag("!Lines", true); - IO.mapRequired("CodeSize", Lines.CodeSize); - - IO.mapRequired("Flags", Lines.Flags); - IO.mapRequired("RelocOffset", Lines.RelocOffset); - IO.mapRequired("RelocSegment", Lines.RelocSegment); - IO.mapRequired("Blocks", Lines.Blocks); -} - -void YAMLInlineeLinesSubsection::map(IO &IO) { - IO.mapTag("!InlineeLines", true); - IO.mapRequired("HasExtraFiles", InlineeLines.HasExtraFiles); - IO.mapRequired("Sites", InlineeLines.Sites); -} - -void YAMLCrossModuleExportsSubsection::map(IO &IO) { - IO.mapTag("!CrossModuleExports", true); - IO.mapOptional("Exports", Exports); -} - -void YAMLCrossModuleImportsSubsection::map(IO &IO) { - IO.mapTag("!CrossModuleImports", true); - IO.mapOptional("Imports", Imports); -} - -void YAMLSymbolsSubsection::map(IO &IO) { - IO.mapTag("!Symbols", true); - IO.mapRequired("Records", Symbols); -} - -void YAMLStringTableSubsection::map(IO &IO) { - IO.mapTag("!StringTable", true); - IO.mapRequired("Strings", Strings); -} - -void YAMLFrameDataSubsection::map(IO &IO) { - IO.mapTag("!FrameData", true); - IO.mapRequired("Frames", Frames); -} - -void YAMLCoffSymbolRVASubsection::map(IO &IO) { - IO.mapTag("!COFFSymbolRVAs", true); - IO.mapRequired("RVAs", RVAs); -} - -void MappingTraits<YAMLDebugSubsection>::mapping( - IO &IO, YAMLDebugSubsection &Subsection) { - if (!IO.outputting()) { - if (IO.mapTag("!FileChecksums")) { - auto SS = std::make_shared<YAMLChecksumsSubsection>(); - Subsection.Subsection = SS; - } else if (IO.mapTag("!Lines")) { - Subsection.Subsection = std::make_shared<YAMLLinesSubsection>(); - } else if (IO.mapTag("!InlineeLines")) { - Subsection.Subsection = std::make_shared<YAMLInlineeLinesSubsection>(); - } else if (IO.mapTag("!CrossModuleExports")) { - Subsection.Subsection = - std::make_shared<YAMLCrossModuleExportsSubsection>(); - } else if (IO.mapTag("!CrossModuleImports")) { - Subsection.Subsection = - std::make_shared<YAMLCrossModuleImportsSubsection>(); - } else if (IO.mapTag("!Symbols")) { - Subsection.Subsection = std::make_shared<YAMLSymbolsSubsection>(); - } else if (IO.mapTag("!StringTable")) { - Subsection.Subsection = std::make_shared<YAMLStringTableSubsection>(); - } else if (IO.mapTag("!FrameData")) { - Subsection.Subsection = std::make_shared<YAMLFrameDataSubsection>(); - } else if (IO.mapTag("!COFFSymbolRVAs")) { - Subsection.Subsection = std::make_shared<YAMLCoffSymbolRVASubsection>(); - } else { - llvm_unreachable("Unexpected subsection tag!"); - } - } - Subsection.Subsection->map(IO); -} - -std::shared_ptr<DebugSubsection> YAMLChecksumsSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - assert(SC.hasStrings()); - auto Result = std::make_shared<DebugChecksumsSubsection>(*SC.strings()); - for (const auto &CS : Checksums) { - Result->addChecksum(CS.FileName, CS.Kind, CS.ChecksumBytes.Bytes); - } - return Result; -} - -std::shared_ptr<DebugSubsection> YAMLLinesSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - assert(SC.hasStrings() && SC.hasChecksums()); - auto Result = - std::make_shared<DebugLinesSubsection>(*SC.checksums(), *SC.strings()); - Result->setCodeSize(Lines.CodeSize); - Result->setRelocationAddress(Lines.RelocSegment, Lines.RelocOffset); - Result->setFlags(Lines.Flags); - for (const auto &LC : Lines.Blocks) { - Result->createBlock(LC.FileName); - if (Result->hasColumnInfo()) { - for (const auto &Item : zip(LC.Lines, LC.Columns)) { - auto &L = std::get<0>(Item); - auto &C = std::get<1>(Item); - uint32_t LE = L.LineStart + L.EndDelta; - Result->addLineAndColumnInfo(L.Offset, - LineInfo(L.LineStart, LE, L.IsStatement), - C.StartColumn, C.EndColumn); - } - } else { - for (const auto &L : LC.Lines) { - uint32_t LE = L.LineStart + L.EndDelta; - Result->addLineInfo(L.Offset, LineInfo(L.LineStart, LE, L.IsStatement)); - } - } - } - return Result; -} - -std::shared_ptr<DebugSubsection> -YAMLInlineeLinesSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - assert(SC.hasChecksums()); - auto Result = std::make_shared<DebugInlineeLinesSubsection>( - *SC.checksums(), InlineeLines.HasExtraFiles); - - for (const auto &Site : InlineeLines.Sites) { - Result->addInlineSite(TypeIndex(Site.Inlinee), Site.FileName, - Site.SourceLineNum); - if (!InlineeLines.HasExtraFiles) - continue; - - for (auto EF : Site.ExtraFiles) { - Result->addExtraFile(EF); - } - } - return Result; -} - -std::shared_ptr<DebugSubsection> -YAMLCrossModuleExportsSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - auto Result = std::make_shared<DebugCrossModuleExportsSubsection>(); - for (const auto &M : Exports) - Result->addMapping(M.Local, M.Global); - return Result; -} - -std::shared_ptr<DebugSubsection> -YAMLCrossModuleImportsSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - assert(SC.hasStrings()); - - auto Result = - std::make_shared<DebugCrossModuleImportsSubsection>(*SC.strings()); - for (const auto &M : Imports) { - for (const auto Id : M.ImportIds) - Result->addImport(M.ModuleName, Id); - } - return Result; -} - -std::shared_ptr<DebugSubsection> YAMLSymbolsSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - auto Result = std::make_shared<DebugSymbolsSubsection>(); - for (const auto &Sym : Symbols) - Result->addSymbol( - Sym.toCodeViewSymbol(Allocator, CodeViewContainer::ObjectFile)); - return Result; -} - -std::shared_ptr<DebugSubsection> -YAMLStringTableSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - auto Result = std::make_shared<DebugStringTableSubsection>(); - for (const auto &Str : this->Strings) - Result->insert(Str); - return Result; -} - -std::shared_ptr<DebugSubsection> YAMLFrameDataSubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - assert(SC.hasStrings()); - - auto Result = std::make_shared<DebugFrameDataSubsection>(true); - for (const auto &YF : Frames) { - codeview::FrameData F; - F.CodeSize = YF.CodeSize; - F.Flags = YF.Flags; - F.LocalSize = YF.LocalSize; - F.MaxStackSize = YF.MaxStackSize; - F.ParamsSize = YF.ParamsSize; - F.PrologSize = YF.PrologSize; - F.RvaStart = YF.RvaStart; - F.SavedRegsSize = YF.SavedRegsSize; - F.FrameFunc = SC.strings()->insert(YF.FrameFunc); - Result->addFrameData(F); - } - return Result; -} - -std::shared_ptr<DebugSubsection> -YAMLCoffSymbolRVASubsection::toCodeViewSubsection( - BumpPtrAllocator &Allocator, - const codeview::StringsAndChecksums &SC) const { - auto Result = std::make_shared<DebugSymbolRVASubsection>(); - for (const auto &RVA : RVAs) - Result->addRVA(RVA); - return Result; -} - -static Expected<SourceFileChecksumEntry> -convertOneChecksum(const DebugStringTableSubsectionRef &Strings, - const FileChecksumEntry &CS) { - auto ExpectedString = Strings.getString(CS.FileNameOffset); - if (!ExpectedString) - return ExpectedString.takeError(); - - SourceFileChecksumEntry Result; - Result.ChecksumBytes.Bytes = CS.Checksum; - Result.Kind = CS.Kind; - Result.FileName = *ExpectedString; - return Result; -} - -static Expected<StringRef> -getFileName(const DebugStringTableSubsectionRef &Strings, - const DebugChecksumsSubsectionRef &Checksums, uint32_t FileID) { - auto Iter = Checksums.getArray().at(FileID); - if (Iter == Checksums.getArray().end()) - return make_error<CodeViewError>(cv_error_code::no_records); - uint32_t Offset = Iter->FileNameOffset; - return Strings.getString(Offset); -} - -Expected<std::shared_ptr<YAMLChecksumsSubsection>> -YAMLChecksumsSubsection::fromCodeViewSubsection( - const DebugStringTableSubsectionRef &Strings, - const DebugChecksumsSubsectionRef &FC) { - auto Result = std::make_shared<YAMLChecksumsSubsection>(); - - for (const auto &CS : FC) { - auto ConvertedCS = convertOneChecksum(Strings, CS); - if (!ConvertedCS) - return ConvertedCS.takeError(); - Result->Checksums.push_back(*ConvertedCS); - } - return Result; -} - -Expected<std::shared_ptr<YAMLLinesSubsection>> -YAMLLinesSubsection::fromCodeViewSubsection( - const DebugStringTableSubsectionRef &Strings, - const DebugChecksumsSubsectionRef &Checksums, - const DebugLinesSubsectionRef &Lines) { - auto Result = std::make_shared<YAMLLinesSubsection>(); - Result->Lines.CodeSize = Lines.header()->CodeSize; - Result->Lines.RelocOffset = Lines.header()->RelocOffset; - Result->Lines.RelocSegment = Lines.header()->RelocSegment; - Result->Lines.Flags = static_cast<LineFlags>(uint16_t(Lines.header()->Flags)); - for (const auto &L : Lines) { - SourceLineBlock Block; - auto EF = getFileName(Strings, Checksums, L.NameIndex); - if (!EF) - return EF.takeError(); - Block.FileName = *EF; - if (Lines.hasColumnInfo()) { - for (const auto &C : L.Columns) { - SourceColumnEntry SCE; - SCE.EndColumn = C.EndColumn; - SCE.StartColumn = C.StartColumn; - Block.Columns.push_back(SCE); - } - } - for (const auto &LN : L.LineNumbers) { - SourceLineEntry SLE; - LineInfo LI(LN.Flags); - SLE.Offset = LN.Offset; - SLE.LineStart = LI.getStartLine(); - SLE.EndDelta = LI.getLineDelta(); - SLE.IsStatement = LI.isStatement(); - Block.Lines.push_back(SLE); - } - Result->Lines.Blocks.push_back(Block); - } - return Result; -} - -Expected<std::shared_ptr<YAMLInlineeLinesSubsection>> -YAMLInlineeLinesSubsection::fromCodeViewSubsection( - const DebugStringTableSubsectionRef &Strings, - const DebugChecksumsSubsectionRef &Checksums, - const DebugInlineeLinesSubsectionRef &Lines) { - auto Result = std::make_shared<YAMLInlineeLinesSubsection>(); - - Result->InlineeLines.HasExtraFiles = Lines.hasExtraFiles(); - for (const auto &IL : Lines) { - InlineeSite Site; - auto ExpF = getFileName(Strings, Checksums, IL.Header->FileID); - if (!ExpF) - return ExpF.takeError(); - Site.FileName = *ExpF; - Site.Inlinee = IL.Header->Inlinee.getIndex(); - Site.SourceLineNum = IL.Header->SourceLineNum; - if (Lines.hasExtraFiles()) { - for (const auto EF : IL.ExtraFiles) { - auto ExpF2 = getFileName(Strings, Checksums, EF); - if (!ExpF2) - return ExpF2.takeError(); - Site.ExtraFiles.push_back(*ExpF2); - } - } - Result->InlineeLines.Sites.push_back(Site); - } - return Result; -} - -Expected<std::shared_ptr<YAMLCrossModuleExportsSubsection>> -YAMLCrossModuleExportsSubsection::fromCodeViewSubsection( - const DebugCrossModuleExportsSubsectionRef &Exports) { - auto Result = std::make_shared<YAMLCrossModuleExportsSubsection>(); - Result->Exports.assign(Exports.begin(), Exports.end()); - return Result; -} - -Expected<std::shared_ptr<YAMLCrossModuleImportsSubsection>> -YAMLCrossModuleImportsSubsection::fromCodeViewSubsection( - const DebugStringTableSubsectionRef &Strings, - const DebugCrossModuleImportsSubsectionRef &Imports) { - auto Result = std::make_shared<YAMLCrossModuleImportsSubsection>(); - for (const auto &CMI : Imports) { - YAMLCrossModuleImport YCMI; - auto ExpectedStr = Strings.getString(CMI.Header->ModuleNameOffset); - if (!ExpectedStr) - return ExpectedStr.takeError(); - YCMI.ModuleName = *ExpectedStr; - YCMI.ImportIds.assign(CMI.Imports.begin(), CMI.Imports.end()); - Result->Imports.push_back(YCMI); - } - return Result; -} - -Expected<std::shared_ptr<YAMLSymbolsSubsection>> -YAMLSymbolsSubsection::fromCodeViewSubsection( - const DebugSymbolsSubsectionRef &Symbols) { - auto Result = std::make_shared<YAMLSymbolsSubsection>(); - for (const auto &Sym : Symbols) { - auto S = CodeViewYAML::SymbolRecord::fromCodeViewSymbol(Sym); - if (!S) - return joinErrors(make_error<CodeViewError>( - cv_error_code::corrupt_record, - "Invalid CodeView Symbol Record in SymbolRecord " - "subsection of .debug$S while converting to YAML!"), - S.takeError()); - - Result->Symbols.push_back(*S); - } - return Result; -} - -Expected<std::shared_ptr<YAMLStringTableSubsection>> -YAMLStringTableSubsection::fromCodeViewSubsection( - const DebugStringTableSubsectionRef &Strings) { - auto Result = std::make_shared<YAMLStringTableSubsection>(); - BinaryStreamReader Reader(Strings.getBuffer()); - StringRef S; - // First item is a single null string, skip it. - if (auto EC = Reader.readCString(S)) - return std::move(EC); - assert(S.empty()); - while (Reader.bytesRemaining() > 0) { - if (auto EC = Reader.readCString(S)) - return std::move(EC); - Result->Strings.push_back(S); - } - return Result; -} - -Expected<std::shared_ptr<YAMLFrameDataSubsection>> -YAMLFrameDataSubsection::fromCodeViewSubsection( - const DebugStringTableSubsectionRef &Strings, - const DebugFrameDataSubsectionRef &Frames) { - auto Result = std::make_shared<YAMLFrameDataSubsection>(); - for (const auto &F : Frames) { - YAMLFrameData YF; - YF.CodeSize = F.CodeSize; - YF.Flags = F.Flags; - YF.LocalSize = F.LocalSize; - YF.MaxStackSize = F.MaxStackSize; - YF.ParamsSize = F.ParamsSize; - YF.PrologSize = F.PrologSize; - YF.RvaStart = F.RvaStart; - YF.SavedRegsSize = F.SavedRegsSize; - - auto ES = Strings.getString(F.FrameFunc); - if (!ES) - return joinErrors( - make_error<CodeViewError>( - cv_error_code::no_records, - "Could not find string for string id while mapping FrameData!"), - ES.takeError()); - YF.FrameFunc = *ES; - Result->Frames.push_back(YF); - } - return Result; -} - -Expected<std::shared_ptr<YAMLCoffSymbolRVASubsection>> -YAMLCoffSymbolRVASubsection::fromCodeViewSubsection( - const DebugSymbolRVASubsectionRef &Section) { - auto Result = std::make_shared<YAMLCoffSymbolRVASubsection>(); - for (const auto &RVA : Section) { - Result->RVAs.push_back(RVA); - } - return Result; -} - -Expected<std::vector<std::shared_ptr<DebugSubsection>>> -llvm::CodeViewYAML::toCodeViewSubsectionList( - BumpPtrAllocator &Allocator, ArrayRef<YAMLDebugSubsection> Subsections, - const codeview::StringsAndChecksums &SC) { - std::vector<std::shared_ptr<DebugSubsection>> Result; - if (Subsections.empty()) - return std::move(Result); - - for (const auto &SS : Subsections) { - std::shared_ptr<DebugSubsection> CVS; - CVS = SS.Subsection->toCodeViewSubsection(Allocator, SC); - assert(CVS != nullptr); - Result.push_back(std::move(CVS)); - } - return std::move(Result); -} - -namespace { - -struct SubsectionConversionVisitor : public DebugSubsectionVisitor { - SubsectionConversionVisitor() = default; - - Error visitUnknown(DebugUnknownSubsectionRef &Unknown) override; - Error visitLines(DebugLinesSubsectionRef &Lines, - const StringsAndChecksumsRef &State) override; - Error visitFileChecksums(DebugChecksumsSubsectionRef &Checksums, - const StringsAndChecksumsRef &State) override; - Error visitInlineeLines(DebugInlineeLinesSubsectionRef &Inlinees, - const StringsAndChecksumsRef &State) override; - Error visitCrossModuleExports(DebugCrossModuleExportsSubsectionRef &Checksums, - const StringsAndChecksumsRef &State) override; - Error visitCrossModuleImports(DebugCrossModuleImportsSubsectionRef &Inlinees, - const StringsAndChecksumsRef &State) override; - Error visitStringTable(DebugStringTableSubsectionRef &ST, - const StringsAndChecksumsRef &State) override; - Error visitSymbols(DebugSymbolsSubsectionRef &Symbols, - const StringsAndChecksumsRef &State) override; - Error visitFrameData(DebugFrameDataSubsectionRef &Symbols, - const StringsAndChecksumsRef &State) override; - Error visitCOFFSymbolRVAs(DebugSymbolRVASubsectionRef &Symbols, - const StringsAndChecksumsRef &State) override; - - YAMLDebugSubsection Subsection; -}; - -} // end anonymous namespace - -Error SubsectionConversionVisitor::visitUnknown( - DebugUnknownSubsectionRef &Unknown) { - return make_error<CodeViewError>(cv_error_code::operation_unsupported); -} - -Error SubsectionConversionVisitor::visitLines( - DebugLinesSubsectionRef &Lines, const StringsAndChecksumsRef &State) { - auto Result = YAMLLinesSubsection::fromCodeViewSubsection( - State.strings(), State.checksums(), Lines); - if (!Result) - return Result.takeError(); - Subsection.Subsection = *Result; - return Error::success(); -} - -Error SubsectionConversionVisitor::visitFileChecksums( - DebugChecksumsSubsectionRef &Checksums, - const StringsAndChecksumsRef &State) { - auto Result = YAMLChecksumsSubsection::fromCodeViewSubsection(State.strings(), - Checksums); - if (!Result) - return Result.takeError(); - Subsection.Subsection = *Result; - return Error::success(); -} - -Error SubsectionConversionVisitor::visitInlineeLines( - DebugInlineeLinesSubsectionRef &Inlinees, - const StringsAndChecksumsRef &State) { - auto Result = YAMLInlineeLinesSubsection::fromCodeViewSubsection( - State.strings(), State.checksums(), Inlinees); - if (!Result) - return Result.takeError(); - Subsection.Subsection = *Result; - return Error::success(); -} - -Error SubsectionConversionVisitor::visitCrossModuleExports( - DebugCrossModuleExportsSubsectionRef &Exports, - const StringsAndChecksumsRef &State) { - auto Result = - YAMLCrossModuleExportsSubsection::fromCodeViewSubsection(Exports); - if (!Result) - return Result.takeError(); - Subsection.Subsection = *Result; - return Error::success(); -} - -Error SubsectionConversionVisitor::visitCrossModuleImports( - DebugCrossModuleImportsSubsectionRef &Imports, - const StringsAndChecksumsRef &State) { - auto Result = YAMLCrossModuleImportsSubsection::fromCodeViewSubsection( - State.strings(), Imports); - if (!Result) - return Result.takeError(); - Subsection.Subsection = *Result; - return Error::success(); -} - -Error SubsectionConversionVisitor::visitStringTable( - DebugStringTableSubsectionRef &Strings, - const StringsAndChecksumsRef &State) { - auto Result = YAMLStringTableSubsection::fromCodeViewSubsection(Strings); - if (!Result) - return Result.takeError(); - Subsection.Subsection = *Result; - return Error::success(); -} - -Error SubsectionConversionVisitor::visitSymbols( - DebugSymbolsSubsectionRef &Symbols, const StringsAndChecksumsRef &State) { - auto Result = YAMLSymbolsSubsection::fromCodeViewSubsection(Symbols); - if (!Result) - return Result.takeError(); - Subsection.Subsection = *Result; - return Error::success(); -} - -Error SubsectionConversionVisitor::visitFrameData( - DebugFrameDataSubsectionRef &Frames, const StringsAndChecksumsRef &State) { - auto Result = - YAMLFrameDataSubsection::fromCodeViewSubsection(State.strings(), Frames); - if (!Result) - return Result.takeError(); - Subsection.Subsection = *Result; - return Error::success(); -} - -Error SubsectionConversionVisitor::visitCOFFSymbolRVAs( - DebugSymbolRVASubsectionRef &RVAs, const StringsAndChecksumsRef &State) { - auto Result = YAMLCoffSymbolRVASubsection::fromCodeViewSubsection(RVAs); - if (!Result) - return Result.takeError(); - Subsection.Subsection = *Result; - return Error::success(); -} - -Expected<YAMLDebugSubsection> -YAMLDebugSubsection::fromCodeViewSubection(const StringsAndChecksumsRef &SC, - const DebugSubsectionRecord &SS) { - SubsectionConversionVisitor V; - if (auto EC = visitDebugSubsection(SS, V, SC)) - return std::move(EC); - - return V.Subsection; -} - -std::vector<YAMLDebugSubsection> -llvm::CodeViewYAML::fromDebugS(ArrayRef<uint8_t> Data, - const StringsAndChecksumsRef &SC) { - BinaryStreamReader Reader(Data, support::little); - uint32_t Magic; - - ExitOnError Err("Invalid .debug$S section!"); - Err(Reader.readInteger(Magic)); - assert(Magic == COFF::DEBUG_SECTION_MAGIC && "Invalid .debug$S section!"); - - DebugSubsectionArray Subsections; - Err(Reader.readArray(Subsections, Reader.bytesRemaining())); - - std::vector<YAMLDebugSubsection> Result; - - for (const auto &SS : Subsections) { - auto YamlSS = Err(YAMLDebugSubsection::fromCodeViewSubection(SC, SS)); - Result.push_back(YamlSS); - } - return Result; -} - -void llvm::CodeViewYAML::initializeStringsAndChecksums( - ArrayRef<YAMLDebugSubsection> Sections, codeview::StringsAndChecksums &SC) { - // String Table and Checksums subsections don't use the allocator. - BumpPtrAllocator Allocator; - - // It's possible for checksums and strings to even appear in different debug$S - // sections, so we have to make this a stateful function that can build up - // the strings and checksums field over multiple iterations. - - // File Checksums require the string table, but may become before it, so we - // have to scan for strings first, then scan for checksums again from the - // beginning. - if (!SC.hasStrings()) { - for (const auto &SS : Sections) { - if (SS.Subsection->Kind != DebugSubsectionKind::StringTable) - continue; - - auto Result = SS.Subsection->toCodeViewSubsection(Allocator, SC); - SC.setStrings( - std::static_pointer_cast<DebugStringTableSubsection>(Result)); - break; - } - } - - if (SC.hasStrings() && !SC.hasChecksums()) { - for (const auto &SS : Sections) { - if (SS.Subsection->Kind != DebugSubsectionKind::FileChecksums) - continue; - - auto Result = SS.Subsection->toCodeViewSubsection(Allocator, SC); - SC.setChecksums( - std::static_pointer_cast<DebugChecksumsSubsection>(Result)); - break; - } - } -} diff --git a/gnu/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp b/gnu/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp deleted file mode 100644 index 713e9a710e9..00000000000 --- a/gnu/llvm/lib/ObjectYAML/CodeViewYAMLSymbols.cpp +++ /dev/null @@ -1,631 +0,0 @@ -//===- CodeViewYAMLSymbols.cpp - CodeView YAMLIO Symbol implementation ----===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines classes for handling the YAML representation of CodeView -// Debug Info. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/CodeViewYAMLSymbols.h" -#include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/DebugInfo/CodeView/CodeView.h" -#include "llvm/DebugInfo/CodeView/CodeViewError.h" -#include "llvm/DebugInfo/CodeView/EnumTables.h" -#include "llvm/DebugInfo/CodeView/RecordSerialization.h" -#include "llvm/DebugInfo/CodeView/SymbolDeserializer.h" -#include "llvm/DebugInfo/CodeView/SymbolRecord.h" -#include "llvm/DebugInfo/CodeView/SymbolSerializer.h" -#include "llvm/DebugInfo/CodeView/TypeIndex.h" -#include "llvm/ObjectYAML/YAML.h" -#include "llvm/Support/Allocator.h" -#include "llvm/Support/Error.h" -#include "llvm/Support/YAMLTraits.h" -#include <algorithm> -#include <cstdint> -#include <cstring> -#include <string> -#include <vector> - -using namespace llvm; -using namespace llvm::codeview; -using namespace llvm::CodeViewYAML; -using namespace llvm::CodeViewYAML::detail; -using namespace llvm::yaml; - -LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(TypeIndex) -LLVM_YAML_IS_SEQUENCE_VECTOR(LocalVariableAddrGap) - -// We only need to declare these, the definitions are in CodeViewYAMLTypes.cpp -LLVM_YAML_DECLARE_SCALAR_TRAITS(APSInt, QuotingType::None) -LLVM_YAML_DECLARE_SCALAR_TRAITS(TypeIndex, QuotingType::None) - -LLVM_YAML_DECLARE_ENUM_TRAITS(SymbolKind) -LLVM_YAML_DECLARE_ENUM_TRAITS(FrameCookieKind) - -LLVM_YAML_DECLARE_BITSET_TRAITS(CompileSym2Flags) -LLVM_YAML_DECLARE_BITSET_TRAITS(CompileSym3Flags) -LLVM_YAML_DECLARE_BITSET_TRAITS(ExportFlags) -LLVM_YAML_DECLARE_BITSET_TRAITS(PublicSymFlags) -LLVM_YAML_DECLARE_BITSET_TRAITS(LocalSymFlags) -LLVM_YAML_DECLARE_BITSET_TRAITS(ProcSymFlags) -LLVM_YAML_DECLARE_BITSET_TRAITS(FrameProcedureOptions) -LLVM_YAML_DECLARE_ENUM_TRAITS(CPUType) -LLVM_YAML_DECLARE_ENUM_TRAITS(RegisterId) -LLVM_YAML_DECLARE_ENUM_TRAITS(TrampolineType) -LLVM_YAML_DECLARE_ENUM_TRAITS(ThunkOrdinal) - -LLVM_YAML_STRONG_TYPEDEF(StringRef, TypeName) - -LLVM_YAML_DECLARE_SCALAR_TRAITS(TypeName, QuotingType::Single) - -StringRef ScalarTraits<TypeName>::input(StringRef S, void *V, TypeName &T) { - return ScalarTraits<StringRef>::input(S, V, T.value); -} - -void ScalarTraits<TypeName>::output(const TypeName &T, void *V, - raw_ostream &R) { - ScalarTraits<StringRef>::output(T.value, V, R); -} - -void ScalarEnumerationTraits<SymbolKind>::enumeration(IO &io, - SymbolKind &Value) { - auto SymbolNames = getSymbolTypeNames(); - for (const auto &E : SymbolNames) - io.enumCase(Value, E.Name.str().c_str(), E.Value); -} - -void ScalarBitSetTraits<CompileSym2Flags>::bitset(IO &io, - CompileSym2Flags &Flags) { - auto FlagNames = getCompileSym2FlagNames(); - for (const auto &E : FlagNames) { - io.bitSetCase(Flags, E.Name.str().c_str(), - static_cast<CompileSym2Flags>(E.Value)); - } -} - -void ScalarBitSetTraits<CompileSym3Flags>::bitset(IO &io, - CompileSym3Flags &Flags) { - auto FlagNames = getCompileSym3FlagNames(); - for (const auto &E : FlagNames) { - io.bitSetCase(Flags, E.Name.str().c_str(), - static_cast<CompileSym3Flags>(E.Value)); - } -} - -void ScalarBitSetTraits<ExportFlags>::bitset(IO &io, ExportFlags &Flags) { - auto FlagNames = getExportSymFlagNames(); - for (const auto &E : FlagNames) { - io.bitSetCase(Flags, E.Name.str().c_str(), - static_cast<ExportFlags>(E.Value)); - } -} - -void ScalarBitSetTraits<PublicSymFlags>::bitset(IO &io, PublicSymFlags &Flags) { - auto FlagNames = getPublicSymFlagNames(); - for (const auto &E : FlagNames) { - io.bitSetCase(Flags, E.Name.str().c_str(), - static_cast<PublicSymFlags>(E.Value)); - } -} - -void ScalarBitSetTraits<LocalSymFlags>::bitset(IO &io, LocalSymFlags &Flags) { - auto FlagNames = getLocalFlagNames(); - for (const auto &E : FlagNames) { - io.bitSetCase(Flags, E.Name.str().c_str(), - static_cast<LocalSymFlags>(E.Value)); - } -} - -void ScalarBitSetTraits<ProcSymFlags>::bitset(IO &io, ProcSymFlags &Flags) { - auto FlagNames = getProcSymFlagNames(); - for (const auto &E : FlagNames) { - io.bitSetCase(Flags, E.Name.str().c_str(), - static_cast<ProcSymFlags>(E.Value)); - } -} - -void ScalarBitSetTraits<FrameProcedureOptions>::bitset( - IO &io, FrameProcedureOptions &Flags) { - auto FlagNames = getFrameProcSymFlagNames(); - for (const auto &E : FlagNames) { - io.bitSetCase(Flags, E.Name.str().c_str(), - static_cast<FrameProcedureOptions>(E.Value)); - } -} - -void ScalarEnumerationTraits<CPUType>::enumeration(IO &io, CPUType &Cpu) { - auto CpuNames = getCPUTypeNames(); - for (const auto &E : CpuNames) { - io.enumCase(Cpu, E.Name.str().c_str(), static_cast<CPUType>(E.Value)); - } -} - -void ScalarEnumerationTraits<RegisterId>::enumeration(IO &io, RegisterId &Reg) { - auto RegNames = getRegisterNames(); - for (const auto &E : RegNames) { - io.enumCase(Reg, E.Name.str().c_str(), static_cast<RegisterId>(E.Value)); - } - io.enumFallback<Hex16>(Reg); -} - -void ScalarEnumerationTraits<TrampolineType>::enumeration( - IO &io, TrampolineType &Tramp) { - auto TrampNames = getTrampolineNames(); - for (const auto &E : TrampNames) { - io.enumCase(Tramp, E.Name.str().c_str(), - static_cast<TrampolineType>(E.Value)); - } -} - -void ScalarEnumerationTraits<ThunkOrdinal>::enumeration(IO &io, - ThunkOrdinal &Ord) { - auto ThunkNames = getThunkOrdinalNames(); - for (const auto &E : ThunkNames) { - io.enumCase(Ord, E.Name.str().c_str(), static_cast<ThunkOrdinal>(E.Value)); - } -} - -void ScalarEnumerationTraits<FrameCookieKind>::enumeration( - IO &io, FrameCookieKind &FC) { - auto ThunkNames = getFrameCookieKindNames(); - for (const auto &E : ThunkNames) { - io.enumCase(FC, E.Name.str().c_str(), - static_cast<FrameCookieKind>(E.Value)); - } -} - -namespace llvm { -namespace yaml { -template <> struct MappingTraits<LocalVariableAddrRange> { - static void mapping(IO &io, LocalVariableAddrRange &Range) { - io.mapRequired("OffsetStart", Range.OffsetStart); - io.mapRequired("ISectStart", Range.ISectStart); - io.mapRequired("Range", Range.Range); - } -}; -template <> struct MappingTraits<LocalVariableAddrGap> { - static void mapping(IO &io, LocalVariableAddrGap &Gap) { - io.mapRequired("GapStartOffset", Gap.GapStartOffset); - io.mapRequired("Range", Gap.Range); - } -}; -} // namespace yaml -} // namespace llvm - -namespace llvm { -namespace CodeViewYAML { -namespace detail { - -struct SymbolRecordBase { - codeview::SymbolKind Kind; - - explicit SymbolRecordBase(codeview::SymbolKind K) : Kind(K) {} - virtual ~SymbolRecordBase() = default; - - virtual void map(yaml::IO &io) = 0; - virtual codeview::CVSymbol - toCodeViewSymbol(BumpPtrAllocator &Allocator, - CodeViewContainer Container) const = 0; - virtual Error fromCodeViewSymbol(codeview::CVSymbol Type) = 0; -}; - -template <typename T> struct SymbolRecordImpl : public SymbolRecordBase { - explicit SymbolRecordImpl(codeview::SymbolKind K) - : SymbolRecordBase(K), Symbol(static_cast<SymbolRecordKind>(K)) {} - - void map(yaml::IO &io) override; - - codeview::CVSymbol - toCodeViewSymbol(BumpPtrAllocator &Allocator, - CodeViewContainer Container) const override { - return SymbolSerializer::writeOneSymbol(Symbol, Allocator, Container); - } - - Error fromCodeViewSymbol(codeview::CVSymbol CVS) override { - return SymbolDeserializer::deserializeAs<T>(CVS, Symbol); - } - - mutable T Symbol; -}; - -struct UnknownSymbolRecord : public SymbolRecordBase { - explicit UnknownSymbolRecord(codeview::SymbolKind K) : SymbolRecordBase(K) {} - - void map(yaml::IO &io) override; - - CVSymbol toCodeViewSymbol(BumpPtrAllocator &Allocator, - CodeViewContainer Container) const override { - RecordPrefix Prefix; - uint32_t TotalLen = sizeof(RecordPrefix) + Data.size(); - Prefix.RecordKind = Kind; - Prefix.RecordLen = TotalLen - 2; - uint8_t *Buffer = Allocator.Allocate<uint8_t>(TotalLen); - ::memcpy(Buffer, &Prefix, sizeof(RecordPrefix)); - ::memcpy(Buffer + sizeof(RecordPrefix), Data.data(), Data.size()); - return CVSymbol(Kind, ArrayRef<uint8_t>(Buffer, TotalLen)); - } - - Error fromCodeViewSymbol(CVSymbol CVS) override { - this->Kind = CVS.kind(); - Data = CVS.RecordData.drop_front(sizeof(RecordPrefix)); - return Error::success(); - } - - std::vector<uint8_t> Data; -}; - -template <> void SymbolRecordImpl<ScopeEndSym>::map(IO &IO) {} - -void UnknownSymbolRecord::map(yaml::IO &io) { - yaml::BinaryRef Binary; - if (io.outputting()) - Binary = yaml::BinaryRef(Data); - io.mapRequired("Data", Binary); - if (!io.outputting()) { - std::string Str; - raw_string_ostream OS(Str); - Binary.writeAsBinary(OS); - OS.flush(); - Data.assign(Str.begin(), Str.end()); - } -} - -template <> void SymbolRecordImpl<Thunk32Sym>::map(IO &IO) { - IO.mapRequired("Parent", Symbol.Parent); - IO.mapRequired("End", Symbol.End); - IO.mapRequired("Next", Symbol.Next); - IO.mapRequired("Off", Symbol.Offset); - IO.mapRequired("Seg", Symbol.Segment); - IO.mapRequired("Len", Symbol.Length); - IO.mapRequired("Ordinal", Symbol.Thunk); -} - -template <> void SymbolRecordImpl<TrampolineSym>::map(IO &IO) { - IO.mapRequired("Type", Symbol.Type); - IO.mapRequired("Size", Symbol.Size); - IO.mapRequired("ThunkOff", Symbol.ThunkOffset); - IO.mapRequired("TargetOff", Symbol.TargetOffset); - IO.mapRequired("ThunkSection", Symbol.ThunkSection); - IO.mapRequired("TargetSection", Symbol.TargetSection); -} - -template <> void SymbolRecordImpl<SectionSym>::map(IO &IO) { - IO.mapRequired("SectionNumber", Symbol.SectionNumber); - IO.mapRequired("Alignment", Symbol.Alignment); - IO.mapRequired("Rva", Symbol.Rva); - IO.mapRequired("Length", Symbol.Length); - IO.mapRequired("Characteristics", Symbol.Characteristics); - IO.mapRequired("Name", Symbol.Name); -} - -template <> void SymbolRecordImpl<CoffGroupSym>::map(IO &IO) { - IO.mapRequired("Size", Symbol.Size); - IO.mapRequired("Characteristics", Symbol.Characteristics); - IO.mapRequired("Offset", Symbol.Offset); - IO.mapRequired("Segment", Symbol.Segment); - IO.mapRequired("Name", Symbol.Name); -} - -template <> void SymbolRecordImpl<ExportSym>::map(IO &IO) { - IO.mapRequired("Ordinal", Symbol.Ordinal); - IO.mapRequired("Flags", Symbol.Flags); - IO.mapRequired("Name", Symbol.Name); -} - -template <> void SymbolRecordImpl<ProcSym>::map(IO &IO) { - IO.mapOptional("PtrParent", Symbol.Parent, 0U); - IO.mapOptional("PtrEnd", Symbol.End, 0U); - IO.mapOptional("PtrNext", Symbol.Next, 0U); - IO.mapRequired("CodeSize", Symbol.CodeSize); - IO.mapRequired("DbgStart", Symbol.DbgStart); - IO.mapRequired("DbgEnd", Symbol.DbgEnd); - IO.mapRequired("FunctionType", Symbol.FunctionType); - IO.mapOptional("Offset", Symbol.CodeOffset, 0U); - IO.mapOptional("Segment", Symbol.Segment, uint16_t(0)); - IO.mapRequired("Flags", Symbol.Flags); - IO.mapRequired("DisplayName", Symbol.Name); -} - -template <> void SymbolRecordImpl<RegisterSym>::map(IO &IO) { - IO.mapRequired("Type", Symbol.Index); - IO.mapRequired("Seg", Symbol.Register); - IO.mapRequired("Name", Symbol.Name); -} - -template <> void SymbolRecordImpl<PublicSym32>::map(IO &IO) { - IO.mapRequired("Flags", Symbol.Flags); - IO.mapOptional("Offset", Symbol.Offset, 0U); - IO.mapOptional("Segment", Symbol.Segment, uint16_t(0)); - IO.mapRequired("Name", Symbol.Name); -} - -template <> void SymbolRecordImpl<ProcRefSym>::map(IO &IO) { - IO.mapRequired("SumName", Symbol.SumName); - IO.mapRequired("SymOffset", Symbol.SymOffset); - IO.mapRequired("Mod", Symbol.Module); - IO.mapRequired("Name", Symbol.Name); -} - -template <> void SymbolRecordImpl<EnvBlockSym>::map(IO &IO) { - IO.mapRequired("Entries", Symbol.Fields); -} - -template <> void SymbolRecordImpl<InlineSiteSym>::map(IO &IO) { - IO.mapOptional("PtrParent", Symbol.Parent, 0U); - IO.mapOptional("PtrEnd", Symbol.End, 0U); - IO.mapRequired("Inlinee", Symbol.Inlinee); - // TODO: The binary annotations -} - -template <> void SymbolRecordImpl<LocalSym>::map(IO &IO) { - IO.mapRequired("Type", Symbol.Type); - IO.mapRequired("Flags", Symbol.Flags); - - IO.mapRequired("VarName", Symbol.Name); -} - -template <> void SymbolRecordImpl<DefRangeSym>::map(IO &IO) { - IO.mapRequired("Program", Symbol.Program); - IO.mapRequired("Range", Symbol.Range); - IO.mapRequired("Gaps", Symbol.Gaps); -} - -template <> void SymbolRecordImpl<DefRangeSubfieldSym>::map(IO &IO) { - IO.mapRequired("Program", Symbol.Program); - IO.mapRequired("OffsetInParent", Symbol.OffsetInParent); - IO.mapRequired("Range", Symbol.Range); - IO.mapRequired("Gaps", Symbol.Gaps); -} - -template <> void SymbolRecordImpl<DefRangeRegisterSym>::map(IO &IO) { - IO.mapRequired("Register", Symbol.Hdr.Register); - IO.mapRequired("MayHaveNoName", Symbol.Hdr.MayHaveNoName); - IO.mapRequired("Range", Symbol.Range); - IO.mapRequired("Gaps", Symbol.Gaps); -} - -template <> void SymbolRecordImpl<DefRangeFramePointerRelSym>::map(IO &IO) { - IO.mapRequired("Offset", Symbol.Offset); - IO.mapRequired("Range", Symbol.Range); - IO.mapRequired("Gaps", Symbol.Gaps); -} - -template <> void SymbolRecordImpl<DefRangeSubfieldRegisterSym>::map(IO &IO) { - IO.mapRequired("Register", Symbol.Hdr.Register); - IO.mapRequired("MayHaveNoName", Symbol.Hdr.MayHaveNoName); - IO.mapRequired("OffsetInParent", Symbol.Hdr.OffsetInParent); - IO.mapRequired("Range", Symbol.Range); - IO.mapRequired("Gaps", Symbol.Gaps); -} - -template <> -void SymbolRecordImpl<DefRangeFramePointerRelFullScopeSym>::map(IO &IO) { - IO.mapRequired("Register", Symbol.Offset); -} - -template <> void SymbolRecordImpl<DefRangeRegisterRelSym>::map(IO &IO) { - IO.mapRequired("Register", Symbol.Hdr.Register); - IO.mapRequired("Flags", Symbol.Hdr.Flags); - IO.mapRequired("BasePointerOffset", Symbol.Hdr.BasePointerOffset); - IO.mapRequired("Range", Symbol.Range); - IO.mapRequired("Gaps", Symbol.Gaps); -} - -template <> void SymbolRecordImpl<BlockSym>::map(IO &IO) { - IO.mapOptional("PtrParent", Symbol.Parent, 0U); - IO.mapOptional("PtrEnd", Symbol.End, 0U); - IO.mapRequired("CodeSize", Symbol.CodeSize); - IO.mapOptional("Offset", Symbol.CodeOffset, 0U); - IO.mapOptional("Segment", Symbol.Segment, uint16_t(0)); - IO.mapRequired("BlockName", Symbol.Name); -} - -template <> void SymbolRecordImpl<LabelSym>::map(IO &IO) { - IO.mapOptional("Offset", Symbol.CodeOffset, 0U); - IO.mapOptional("Segment", Symbol.Segment, uint16_t(0)); - IO.mapRequired("Flags", Symbol.Flags); - IO.mapRequired("Flags", Symbol.Flags); - IO.mapRequired("DisplayName", Symbol.Name); -} - -template <> void SymbolRecordImpl<ObjNameSym>::map(IO &IO) { - IO.mapRequired("Signature", Symbol.Signature); - IO.mapRequired("ObjectName", Symbol.Name); -} - -template <> void SymbolRecordImpl<Compile2Sym>::map(IO &IO) { - IO.mapRequired("Flags", Symbol.Flags); - IO.mapRequired("Machine", Symbol.Machine); - IO.mapRequired("FrontendMajor", Symbol.VersionFrontendMajor); - IO.mapRequired("FrontendMinor", Symbol.VersionFrontendMinor); - IO.mapRequired("FrontendBuild", Symbol.VersionFrontendBuild); - IO.mapRequired("BackendMajor", Symbol.VersionBackendMajor); - IO.mapRequired("BackendMinor", Symbol.VersionBackendMinor); - IO.mapRequired("BackendBuild", Symbol.VersionBackendBuild); - IO.mapRequired("Version", Symbol.Version); -} - -template <> void SymbolRecordImpl<Compile3Sym>::map(IO &IO) { - IO.mapRequired("Flags", Symbol.Flags); - IO.mapRequired("Machine", Symbol.Machine); - IO.mapRequired("FrontendMajor", Symbol.VersionFrontendMajor); - IO.mapRequired("FrontendMinor", Symbol.VersionFrontendMinor); - IO.mapRequired("FrontendBuild", Symbol.VersionFrontendBuild); - IO.mapRequired("FrontendQFE", Symbol.VersionFrontendQFE); - IO.mapRequired("BackendMajor", Symbol.VersionBackendMajor); - IO.mapRequired("BackendMinor", Symbol.VersionBackendMinor); - IO.mapRequired("BackendBuild", Symbol.VersionBackendBuild); - IO.mapRequired("BackendQFE", Symbol.VersionBackendQFE); - IO.mapRequired("Version", Symbol.Version); -} - -template <> void SymbolRecordImpl<FrameProcSym>::map(IO &IO) { - IO.mapRequired("TotalFrameBytes", Symbol.TotalFrameBytes); - IO.mapRequired("PaddingFrameBytes", Symbol.PaddingFrameBytes); - IO.mapRequired("OffsetToPadding", Symbol.OffsetToPadding); - IO.mapRequired("BytesOfCalleeSavedRegisters", - Symbol.BytesOfCalleeSavedRegisters); - IO.mapRequired("OffsetOfExceptionHandler", Symbol.OffsetOfExceptionHandler); - IO.mapRequired("SectionIdOfExceptionHandler", - Symbol.SectionIdOfExceptionHandler); - IO.mapRequired("Flags", Symbol.Flags); -} - -template <> void SymbolRecordImpl<CallSiteInfoSym>::map(IO &IO) { - IO.mapOptional("Offset", Symbol.CodeOffset, 0U); - IO.mapOptional("Segment", Symbol.Segment, uint16_t(0)); - IO.mapRequired("Type", Symbol.Type); -} - -template <> void SymbolRecordImpl<FileStaticSym>::map(IO &IO) { - IO.mapRequired("Index", Symbol.Index); - IO.mapRequired("ModFilenameOffset", Symbol.ModFilenameOffset); - IO.mapRequired("Flags", Symbol.Flags); - IO.mapRequired("Name", Symbol.Name); -} - -template <> void SymbolRecordImpl<HeapAllocationSiteSym>::map(IO &IO) { - IO.mapOptional("Offset", Symbol.CodeOffset, 0U); - IO.mapOptional("Segment", Symbol.Segment, uint16_t(0)); - IO.mapRequired("CallInstructionSize", Symbol.CallInstructionSize); - IO.mapRequired("Type", Symbol.Type); -} - -template <> void SymbolRecordImpl<FrameCookieSym>::map(IO &IO) { - IO.mapRequired("Register", Symbol.Register); - IO.mapRequired("CookieKind", Symbol.CookieKind); - IO.mapRequired("Flags", Symbol.Flags); -} - -template <> void SymbolRecordImpl<CallerSym>::map(IO &IO) { - IO.mapRequired("FuncID", Symbol.Indices); -} - -template <> void SymbolRecordImpl<UDTSym>::map(IO &IO) { - IO.mapRequired("Type", Symbol.Type); - IO.mapRequired("UDTName", Symbol.Name); -} - -template <> void SymbolRecordImpl<BuildInfoSym>::map(IO &IO) { - IO.mapRequired("BuildId", Symbol.BuildId); -} - -template <> void SymbolRecordImpl<BPRelativeSym>::map(IO &IO) { - IO.mapRequired("Offset", Symbol.Offset); - IO.mapRequired("Type", Symbol.Type); - IO.mapRequired("VarName", Symbol.Name); -} - -template <> void SymbolRecordImpl<RegRelativeSym>::map(IO &IO) { - IO.mapRequired("Offset", Symbol.Offset); - IO.mapRequired("Type", Symbol.Type); - IO.mapRequired("Register", Symbol.Register); - IO.mapRequired("VarName", Symbol.Name); -} - -template <> void SymbolRecordImpl<ConstantSym>::map(IO &IO) { - IO.mapRequired("Type", Symbol.Type); - IO.mapRequired("Value", Symbol.Value); - IO.mapRequired("Name", Symbol.Name); -} - -template <> void SymbolRecordImpl<DataSym>::map(IO &IO) { - IO.mapRequired("Type", Symbol.Type); - IO.mapOptional("Offset", Symbol.DataOffset, 0U); - IO.mapOptional("Segment", Symbol.Segment, uint16_t(0)); - IO.mapRequired("DisplayName", Symbol.Name); -} - -template <> void SymbolRecordImpl<ThreadLocalDataSym>::map(IO &IO) { - IO.mapRequired("Type", Symbol.Type); - IO.mapOptional("Offset", Symbol.DataOffset, 0U); - IO.mapOptional("Segment", Symbol.Segment, uint16_t(0)); - IO.mapRequired("DisplayName", Symbol.Name); -} - -template <> void SymbolRecordImpl<UsingNamespaceSym>::map(IO &IO) { - IO.mapRequired("Namespace", Symbol.Name); -} - -} // end namespace detail -} // end namespace CodeViewYAML -} // end namespace llvm - -CVSymbol CodeViewYAML::SymbolRecord::toCodeViewSymbol( - BumpPtrAllocator &Allocator, CodeViewContainer Container) const { - return Symbol->toCodeViewSymbol(Allocator, Container); -} - -namespace llvm { -namespace yaml { - -template <> struct MappingTraits<SymbolRecordBase> { - static void mapping(IO &io, SymbolRecordBase &Record) { Record.map(io); } -}; - -} // end namespace yaml -} // end namespace llvm - -template <typename SymbolType> -static inline Expected<CodeViewYAML::SymbolRecord> -fromCodeViewSymbolImpl(CVSymbol Symbol) { - CodeViewYAML::SymbolRecord Result; - - auto Impl = std::make_shared<SymbolType>(Symbol.kind()); - if (auto EC = Impl->fromCodeViewSymbol(Symbol)) - return std::move(EC); - Result.Symbol = Impl; - return Result; -} - -Expected<CodeViewYAML::SymbolRecord> -CodeViewYAML::SymbolRecord::fromCodeViewSymbol(CVSymbol Symbol) { -#define SYMBOL_RECORD(EnumName, EnumVal, ClassName) \ - case EnumName: \ - return fromCodeViewSymbolImpl<SymbolRecordImpl<ClassName>>(Symbol); -#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \ - SYMBOL_RECORD(EnumName, EnumVal, ClassName) - switch (Symbol.kind()) { -#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def" - default: - return fromCodeViewSymbolImpl<UnknownSymbolRecord>(Symbol); - } - return make_error<CodeViewError>(cv_error_code::corrupt_record); -} - -template <typename ConcreteType> -static void mapSymbolRecordImpl(IO &IO, const char *Class, SymbolKind Kind, - CodeViewYAML::SymbolRecord &Obj) { - if (!IO.outputting()) - Obj.Symbol = std::make_shared<ConcreteType>(Kind); - - IO.mapRequired(Class, *Obj.Symbol); -} - -void MappingTraits<CodeViewYAML::SymbolRecord>::mapping( - IO &IO, CodeViewYAML::SymbolRecord &Obj) { - SymbolKind Kind; - if (IO.outputting()) - Kind = Obj.Symbol->Kind; - IO.mapRequired("Kind", Kind); - -#define SYMBOL_RECORD(EnumName, EnumVal, ClassName) \ - case EnumName: \ - mapSymbolRecordImpl<SymbolRecordImpl<ClassName>>(IO, #ClassName, Kind, \ - Obj); \ - break; -#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \ - SYMBOL_RECORD(EnumName, EnumVal, ClassName) - switch (Kind) { -#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def" - default: - mapSymbolRecordImpl<UnknownSymbolRecord>(IO, "UnknownSym", Kind, Obj); - } -} diff --git a/gnu/llvm/lib/ObjectYAML/CodeViewYAMLTypeHashing.cpp b/gnu/llvm/lib/ObjectYAML/CodeViewYAMLTypeHashing.cpp deleted file mode 100644 index ed117059560..00000000000 --- a/gnu/llvm/lib/ObjectYAML/CodeViewYAMLTypeHashing.cpp +++ /dev/null @@ -1,88 +0,0 @@ -//===- CodeViewYAMLTypeHashing.cpp - CodeView YAMLIO type hashing ---------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines classes for handling the YAML representation of CodeView -// Debug Info. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/CodeViewYAMLTypeHashing.h" - -#include "llvm/BinaryFormat/COFF.h" -#include "llvm/Support/BinaryByteStream.h" -#include "llvm/Support/BinaryStreamReader.h" -#include "llvm/Support/BinaryStreamWriter.h" - -using namespace llvm; -using namespace llvm::codeview; -using namespace llvm::CodeViewYAML; -using namespace llvm::yaml; - -namespace llvm { -namespace yaml { - -void MappingTraits<DebugHSection>::mapping(IO &io, DebugHSection &DebugH) { - io.mapRequired("Version", DebugH.Version); - io.mapRequired("HashAlgorithm", DebugH.HashAlgorithm); - io.mapOptional("HashValues", DebugH.Hashes); -} - -void ScalarTraits<GlobalHash>::output(const GlobalHash &GH, void *Ctx, - raw_ostream &OS) { - ScalarTraits<BinaryRef>::output(GH.Hash, Ctx, OS); -} - -StringRef ScalarTraits<GlobalHash>::input(StringRef Scalar, void *Ctx, - GlobalHash &GH) { - return ScalarTraits<BinaryRef>::input(Scalar, Ctx, GH.Hash); -} - -} // end namespace yaml -} // end namespace llvm - -DebugHSection llvm::CodeViewYAML::fromDebugH(ArrayRef<uint8_t> DebugH) { - assert(DebugH.size() >= 8); - assert((DebugH.size() - 8) % 8 == 0); - - BinaryStreamReader Reader(DebugH, llvm::support::little); - DebugHSection DHS; - cantFail(Reader.readInteger(DHS.Magic)); - cantFail(Reader.readInteger(DHS.Version)); - cantFail(Reader.readInteger(DHS.HashAlgorithm)); - - while (Reader.bytesRemaining() != 0) { - ArrayRef<uint8_t> S; - cantFail(Reader.readBytes(S, 8)); - DHS.Hashes.emplace_back(S); - } - assert(Reader.bytesRemaining() == 0); - return DHS; -} - -ArrayRef<uint8_t> llvm::CodeViewYAML::toDebugH(const DebugHSection &DebugH, - BumpPtrAllocator &Alloc) { - uint32_t Size = 8 + 8 * DebugH.Hashes.size(); - uint8_t *Data = Alloc.Allocate<uint8_t>(Size); - MutableArrayRef<uint8_t> Buffer(Data, Size); - BinaryStreamWriter Writer(Buffer, llvm::support::little); - - cantFail(Writer.writeInteger(DebugH.Magic)); - cantFail(Writer.writeInteger(DebugH.Version)); - cantFail(Writer.writeInteger(DebugH.HashAlgorithm)); - SmallString<8> Hash; - for (const auto &H : DebugH.Hashes) { - Hash.clear(); - raw_svector_ostream OS(Hash); - H.Hash.writeAsBinary(OS); - assert((Hash.size() == 8) && "Invalid hash size!"); - cantFail(Writer.writeFixedString(Hash)); - } - assert(Writer.bytesRemaining() == 0); - return Buffer; -} diff --git a/gnu/llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp b/gnu/llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp deleted file mode 100644 index 791b115dc49..00000000000 --- a/gnu/llvm/lib/ObjectYAML/CodeViewYAMLTypes.cpp +++ /dev/null @@ -1,818 +0,0 @@ -//===- CodeViewYAMLTypes.cpp - CodeView YAMLIO types implementation -------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines classes for handling the YAML representation of CodeView -// Debug Info. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/CodeViewYAMLTypes.h" -#include "llvm/ADT/APSInt.h" -#include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/BinaryFormat/COFF.h" -#include "llvm/DebugInfo/CodeView/AppendingTypeTableBuilder.h" -#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h" -#include "llvm/DebugInfo/CodeView/CodeView.h" -#include "llvm/DebugInfo/CodeView/CodeViewError.h" -#include "llvm/DebugInfo/CodeView/ContinuationRecordBuilder.h" -#include "llvm/DebugInfo/CodeView/TypeDeserializer.h" -#include "llvm/DebugInfo/CodeView/TypeIndex.h" -#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h" -#include "llvm/Support/Allocator.h" -#include "llvm/Support/BinaryStreamReader.h" -#include "llvm/Support/BinaryStreamWriter.h" -#include "llvm/Support/Endian.h" -#include "llvm/Support/Error.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/YAMLTraits.h" -#include "llvm/Support/raw_ostream.h" -#include <algorithm> -#include <cassert> -#include <cstdint> -#include <vector> - -using namespace llvm; -using namespace llvm::codeview; -using namespace llvm::CodeViewYAML; -using namespace llvm::CodeViewYAML::detail; -using namespace llvm::yaml; - -LLVM_YAML_IS_SEQUENCE_VECTOR(OneMethodRecord) -LLVM_YAML_IS_SEQUENCE_VECTOR(VFTableSlotKind) -LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(TypeIndex) - -LLVM_YAML_DECLARE_SCALAR_TRAITS(TypeIndex, QuotingType::None) -LLVM_YAML_DECLARE_SCALAR_TRAITS(APSInt, QuotingType::None) - -LLVM_YAML_DECLARE_ENUM_TRAITS(TypeLeafKind) -LLVM_YAML_DECLARE_ENUM_TRAITS(PointerToMemberRepresentation) -LLVM_YAML_DECLARE_ENUM_TRAITS(VFTableSlotKind) -LLVM_YAML_DECLARE_ENUM_TRAITS(CallingConvention) -LLVM_YAML_DECLARE_ENUM_TRAITS(PointerKind) -LLVM_YAML_DECLARE_ENUM_TRAITS(PointerMode) -LLVM_YAML_DECLARE_ENUM_TRAITS(HfaKind) -LLVM_YAML_DECLARE_ENUM_TRAITS(MemberAccess) -LLVM_YAML_DECLARE_ENUM_TRAITS(MethodKind) -LLVM_YAML_DECLARE_ENUM_TRAITS(WindowsRTClassKind) -LLVM_YAML_DECLARE_ENUM_TRAITS(LabelType) - -LLVM_YAML_DECLARE_BITSET_TRAITS(PointerOptions) -LLVM_YAML_DECLARE_BITSET_TRAITS(ModifierOptions) -LLVM_YAML_DECLARE_BITSET_TRAITS(FunctionOptions) -LLVM_YAML_DECLARE_BITSET_TRAITS(ClassOptions) -LLVM_YAML_DECLARE_BITSET_TRAITS(MethodOptions) - -LLVM_YAML_DECLARE_MAPPING_TRAITS(OneMethodRecord) -LLVM_YAML_DECLARE_MAPPING_TRAITS(MemberPointerInfo) - -namespace llvm { -namespace CodeViewYAML { -namespace detail { - -struct LeafRecordBase { - TypeLeafKind Kind; - - explicit LeafRecordBase(TypeLeafKind K) : Kind(K) {} - virtual ~LeafRecordBase() = default; - - virtual void map(yaml::IO &io) = 0; - virtual CVType toCodeViewRecord(AppendingTypeTableBuilder &TS) const = 0; - virtual Error fromCodeViewRecord(CVType Type) = 0; -}; - -template <typename T> struct LeafRecordImpl : public LeafRecordBase { - explicit LeafRecordImpl(TypeLeafKind K) - : LeafRecordBase(K), Record(static_cast<TypeRecordKind>(K)) {} - - void map(yaml::IO &io) override; - - Error fromCodeViewRecord(CVType Type) override { - return TypeDeserializer::deserializeAs<T>(Type, Record); - } - - CVType toCodeViewRecord(AppendingTypeTableBuilder &TS) const override { - TS.writeLeafType(Record); - return CVType(Kind, TS.records().back()); - } - - mutable T Record; -}; - -template <> struct LeafRecordImpl<FieldListRecord> : public LeafRecordBase { - explicit LeafRecordImpl(TypeLeafKind K) : LeafRecordBase(K) {} - - void map(yaml::IO &io) override; - CVType toCodeViewRecord(AppendingTypeTableBuilder &TS) const override; - Error fromCodeViewRecord(CVType Type) override; - - std::vector<MemberRecord> Members; -}; - -struct MemberRecordBase { - TypeLeafKind Kind; - - explicit MemberRecordBase(TypeLeafKind K) : Kind(K) {} - virtual ~MemberRecordBase() = default; - - virtual void map(yaml::IO &io) = 0; - virtual void writeTo(ContinuationRecordBuilder &CRB) = 0; -}; - -template <typename T> struct MemberRecordImpl : public MemberRecordBase { - explicit MemberRecordImpl(TypeLeafKind K) - : MemberRecordBase(K), Record(static_cast<TypeRecordKind>(K)) {} - - void map(yaml::IO &io) override; - - void writeTo(ContinuationRecordBuilder &CRB) override { - CRB.writeMemberType(Record); - } - - mutable T Record; -}; - -} // end namespace detail -} // end namespace CodeViewYAML -} // end namespace llvm - -void ScalarTraits<GUID>::output(const GUID &G, void *, llvm::raw_ostream &OS) { - OS << G; -} - -StringRef ScalarTraits<GUID>::input(StringRef Scalar, void *Ctx, GUID &S) { - if (Scalar.size() != 38) - return "GUID strings are 38 characters long"; - if (Scalar[0] != '{' || Scalar[37] != '}') - return "GUID is not enclosed in {}"; - if (Scalar[9] != '-' || Scalar[14] != '-' || Scalar[19] != '-' || - Scalar[24] != '-') - return "GUID sections are not properly delineated with dashes"; - - uint8_t *OutBuffer = S.Guid; - for (auto Iter = Scalar.begin(); Iter != Scalar.end();) { - if (*Iter == '-' || *Iter == '{' || *Iter == '}') { - ++Iter; - continue; - } - uint8_t Value = (llvm::hexDigitValue(*Iter++) << 4); - Value |= llvm::hexDigitValue(*Iter++); - *OutBuffer++ = Value; - } - - return ""; -} - -void ScalarTraits<TypeIndex>::output(const TypeIndex &S, void *, - raw_ostream &OS) { - OS << S.getIndex(); -} - -StringRef ScalarTraits<TypeIndex>::input(StringRef Scalar, void *Ctx, - TypeIndex &S) { - uint32_t I; - StringRef Result = ScalarTraits<uint32_t>::input(Scalar, Ctx, I); - S.setIndex(I); - return Result; -} - -void ScalarTraits<APSInt>::output(const APSInt &S, void *, raw_ostream &OS) { - S.print(OS, S.isSigned()); -} - -StringRef ScalarTraits<APSInt>::input(StringRef Scalar, void *Ctx, APSInt &S) { - S = APSInt(Scalar); - return ""; -} - -void ScalarEnumerationTraits<TypeLeafKind>::enumeration(IO &io, - TypeLeafKind &Value) { -#define CV_TYPE(name, val) io.enumCase(Value, #name, name); -#include "llvm/DebugInfo/CodeView/CodeViewTypes.def" -#undef CV_TYPE -} - -void ScalarEnumerationTraits<PointerToMemberRepresentation>::enumeration( - IO &IO, PointerToMemberRepresentation &Value) { - IO.enumCase(Value, "Unknown", PointerToMemberRepresentation::Unknown); - IO.enumCase(Value, "SingleInheritanceData", - PointerToMemberRepresentation::SingleInheritanceData); - IO.enumCase(Value, "MultipleInheritanceData", - PointerToMemberRepresentation::MultipleInheritanceData); - IO.enumCase(Value, "VirtualInheritanceData", - PointerToMemberRepresentation::VirtualInheritanceData); - IO.enumCase(Value, "GeneralData", PointerToMemberRepresentation::GeneralData); - IO.enumCase(Value, "SingleInheritanceFunction", - PointerToMemberRepresentation::SingleInheritanceFunction); - IO.enumCase(Value, "MultipleInheritanceFunction", - PointerToMemberRepresentation::MultipleInheritanceFunction); - IO.enumCase(Value, "VirtualInheritanceFunction", - PointerToMemberRepresentation::VirtualInheritanceFunction); - IO.enumCase(Value, "GeneralFunction", - PointerToMemberRepresentation::GeneralFunction); -} - -void ScalarEnumerationTraits<VFTableSlotKind>::enumeration( - IO &IO, VFTableSlotKind &Kind) { - IO.enumCase(Kind, "Near16", VFTableSlotKind::Near16); - IO.enumCase(Kind, "Far16", VFTableSlotKind::Far16); - IO.enumCase(Kind, "This", VFTableSlotKind::This); - IO.enumCase(Kind, "Outer", VFTableSlotKind::Outer); - IO.enumCase(Kind, "Meta", VFTableSlotKind::Meta); - IO.enumCase(Kind, "Near", VFTableSlotKind::Near); - IO.enumCase(Kind, "Far", VFTableSlotKind::Far); -} - -void ScalarEnumerationTraits<CallingConvention>::enumeration( - IO &IO, CallingConvention &Value) { - IO.enumCase(Value, "NearC", CallingConvention::NearC); - IO.enumCase(Value, "FarC", CallingConvention::FarC); - IO.enumCase(Value, "NearPascal", CallingConvention::NearPascal); - IO.enumCase(Value, "FarPascal", CallingConvention::FarPascal); - IO.enumCase(Value, "NearFast", CallingConvention::NearFast); - IO.enumCase(Value, "FarFast", CallingConvention::FarFast); - IO.enumCase(Value, "NearStdCall", CallingConvention::NearStdCall); - IO.enumCase(Value, "FarStdCall", CallingConvention::FarStdCall); - IO.enumCase(Value, "NearSysCall", CallingConvention::NearSysCall); - IO.enumCase(Value, "FarSysCall", CallingConvention::FarSysCall); - IO.enumCase(Value, "ThisCall", CallingConvention::ThisCall); - IO.enumCase(Value, "MipsCall", CallingConvention::MipsCall); - IO.enumCase(Value, "Generic", CallingConvention::Generic); - IO.enumCase(Value, "AlphaCall", CallingConvention::AlphaCall); - IO.enumCase(Value, "PpcCall", CallingConvention::PpcCall); - IO.enumCase(Value, "SHCall", CallingConvention::SHCall); - IO.enumCase(Value, "ArmCall", CallingConvention::ArmCall); - IO.enumCase(Value, "AM33Call", CallingConvention::AM33Call); - IO.enumCase(Value, "TriCall", CallingConvention::TriCall); - IO.enumCase(Value, "SH5Call", CallingConvention::SH5Call); - IO.enumCase(Value, "M32RCall", CallingConvention::M32RCall); - IO.enumCase(Value, "ClrCall", CallingConvention::ClrCall); - IO.enumCase(Value, "Inline", CallingConvention::Inline); - IO.enumCase(Value, "NearVector", CallingConvention::NearVector); -} - -void ScalarEnumerationTraits<PointerKind>::enumeration(IO &IO, - PointerKind &Kind) { - IO.enumCase(Kind, "Near16", PointerKind::Near16); - IO.enumCase(Kind, "Far16", PointerKind::Far16); - IO.enumCase(Kind, "Huge16", PointerKind::Huge16); - IO.enumCase(Kind, "BasedOnSegment", PointerKind::BasedOnSegment); - IO.enumCase(Kind, "BasedOnValue", PointerKind::BasedOnValue); - IO.enumCase(Kind, "BasedOnSegmentValue", PointerKind::BasedOnSegmentValue); - IO.enumCase(Kind, "BasedOnAddress", PointerKind::BasedOnAddress); - IO.enumCase(Kind, "BasedOnSegmentAddress", - PointerKind::BasedOnSegmentAddress); - IO.enumCase(Kind, "BasedOnType", PointerKind::BasedOnType); - IO.enumCase(Kind, "BasedOnSelf", PointerKind::BasedOnSelf); - IO.enumCase(Kind, "Near32", PointerKind::Near32); - IO.enumCase(Kind, "Far32", PointerKind::Far32); - IO.enumCase(Kind, "Near64", PointerKind::Near64); -} - -void ScalarEnumerationTraits<PointerMode>::enumeration(IO &IO, - PointerMode &Mode) { - IO.enumCase(Mode, "Pointer", PointerMode::Pointer); - IO.enumCase(Mode, "LValueReference", PointerMode::LValueReference); - IO.enumCase(Mode, "PointerToDataMember", PointerMode::PointerToDataMember); - IO.enumCase(Mode, "PointerToMemberFunction", - PointerMode::PointerToMemberFunction); - IO.enumCase(Mode, "RValueReference", PointerMode::RValueReference); -} - -void ScalarEnumerationTraits<HfaKind>::enumeration(IO &IO, HfaKind &Value) { - IO.enumCase(Value, "None", HfaKind::None); - IO.enumCase(Value, "Float", HfaKind::Float); - IO.enumCase(Value, "Double", HfaKind::Double); - IO.enumCase(Value, "Other", HfaKind::Other); -} - -void ScalarEnumerationTraits<MemberAccess>::enumeration(IO &IO, - MemberAccess &Access) { - IO.enumCase(Access, "None", MemberAccess::None); - IO.enumCase(Access, "Private", MemberAccess::Private); - IO.enumCase(Access, "Protected", MemberAccess::Protected); - IO.enumCase(Access, "Public", MemberAccess::Public); -} - -void ScalarEnumerationTraits<MethodKind>::enumeration(IO &IO, - MethodKind &Kind) { - IO.enumCase(Kind, "Vanilla", MethodKind::Vanilla); - IO.enumCase(Kind, "Virtual", MethodKind::Virtual); - IO.enumCase(Kind, "Static", MethodKind::Static); - IO.enumCase(Kind, "Friend", MethodKind::Friend); - IO.enumCase(Kind, "IntroducingVirtual", MethodKind::IntroducingVirtual); - IO.enumCase(Kind, "PureVirtual", MethodKind::PureVirtual); - IO.enumCase(Kind, "PureIntroducingVirtual", - MethodKind::PureIntroducingVirtual); -} - -void ScalarEnumerationTraits<WindowsRTClassKind>::enumeration( - IO &IO, WindowsRTClassKind &Value) { - IO.enumCase(Value, "None", WindowsRTClassKind::None); - IO.enumCase(Value, "Ref", WindowsRTClassKind::RefClass); - IO.enumCase(Value, "Value", WindowsRTClassKind::ValueClass); - IO.enumCase(Value, "Interface", WindowsRTClassKind::Interface); -} - -void ScalarEnumerationTraits<LabelType>::enumeration(IO &IO, LabelType &Value) { - IO.enumCase(Value, "Near", LabelType::Near); - IO.enumCase(Value, "Far", LabelType::Far); -} - -void ScalarBitSetTraits<PointerOptions>::bitset(IO &IO, - PointerOptions &Options) { - IO.bitSetCase(Options, "None", PointerOptions::None); - IO.bitSetCase(Options, "Flat32", PointerOptions::Flat32); - IO.bitSetCase(Options, "Volatile", PointerOptions::Volatile); - IO.bitSetCase(Options, "Const", PointerOptions::Const); - IO.bitSetCase(Options, "Unaligned", PointerOptions::Unaligned); - IO.bitSetCase(Options, "Restrict", PointerOptions::Restrict); - IO.bitSetCase(Options, "WinRTSmartPointer", - PointerOptions::WinRTSmartPointer); -} - -void ScalarBitSetTraits<ModifierOptions>::bitset(IO &IO, - ModifierOptions &Options) { - IO.bitSetCase(Options, "None", ModifierOptions::None); - IO.bitSetCase(Options, "Const", ModifierOptions::Const); - IO.bitSetCase(Options, "Volatile", ModifierOptions::Volatile); - IO.bitSetCase(Options, "Unaligned", ModifierOptions::Unaligned); -} - -void ScalarBitSetTraits<FunctionOptions>::bitset(IO &IO, - FunctionOptions &Options) { - IO.bitSetCase(Options, "None", FunctionOptions::None); - IO.bitSetCase(Options, "CxxReturnUdt", FunctionOptions::CxxReturnUdt); - IO.bitSetCase(Options, "Constructor", FunctionOptions::Constructor); - IO.bitSetCase(Options, "ConstructorWithVirtualBases", - FunctionOptions::ConstructorWithVirtualBases); -} - -void ScalarBitSetTraits<ClassOptions>::bitset(IO &IO, ClassOptions &Options) { - IO.bitSetCase(Options, "None", ClassOptions::None); - IO.bitSetCase(Options, "HasConstructorOrDestructor", - ClassOptions::HasConstructorOrDestructor); - IO.bitSetCase(Options, "HasOverloadedOperator", - ClassOptions::HasOverloadedOperator); - IO.bitSetCase(Options, "Nested", ClassOptions::Nested); - IO.bitSetCase(Options, "ContainsNestedClass", - ClassOptions::ContainsNestedClass); - IO.bitSetCase(Options, "HasOverloadedAssignmentOperator", - ClassOptions::HasOverloadedAssignmentOperator); - IO.bitSetCase(Options, "HasConversionOperator", - ClassOptions::HasConversionOperator); - IO.bitSetCase(Options, "ForwardReference", ClassOptions::ForwardReference); - IO.bitSetCase(Options, "Scoped", ClassOptions::Scoped); - IO.bitSetCase(Options, "HasUniqueName", ClassOptions::HasUniqueName); - IO.bitSetCase(Options, "Sealed", ClassOptions::Sealed); - IO.bitSetCase(Options, "Intrinsic", ClassOptions::Intrinsic); -} - -void ScalarBitSetTraits<MethodOptions>::bitset(IO &IO, MethodOptions &Options) { - IO.bitSetCase(Options, "None", MethodOptions::None); - IO.bitSetCase(Options, "Pseudo", MethodOptions::Pseudo); - IO.bitSetCase(Options, "NoInherit", MethodOptions::NoInherit); - IO.bitSetCase(Options, "NoConstruct", MethodOptions::NoConstruct); - IO.bitSetCase(Options, "CompilerGenerated", MethodOptions::CompilerGenerated); - IO.bitSetCase(Options, "Sealed", MethodOptions::Sealed); -} - -void MappingTraits<MemberPointerInfo>::mapping(IO &IO, MemberPointerInfo &MPI) { - IO.mapRequired("ContainingType", MPI.ContainingType); - IO.mapRequired("Representation", MPI.Representation); -} - -namespace llvm { -namespace CodeViewYAML { -namespace detail { - -template <> void LeafRecordImpl<ModifierRecord>::map(IO &IO) { - IO.mapRequired("ModifiedType", Record.ModifiedType); - IO.mapRequired("Modifiers", Record.Modifiers); -} - -template <> void LeafRecordImpl<ProcedureRecord>::map(IO &IO) { - IO.mapRequired("ReturnType", Record.ReturnType); - IO.mapRequired("CallConv", Record.CallConv); - IO.mapRequired("Options", Record.Options); - IO.mapRequired("ParameterCount", Record.ParameterCount); - IO.mapRequired("ArgumentList", Record.ArgumentList); -} - -template <> void LeafRecordImpl<MemberFunctionRecord>::map(IO &IO) { - IO.mapRequired("ReturnType", Record.ReturnType); - IO.mapRequired("ClassType", Record.ClassType); - IO.mapRequired("ThisType", Record.ThisType); - IO.mapRequired("CallConv", Record.CallConv); - IO.mapRequired("Options", Record.Options); - IO.mapRequired("ParameterCount", Record.ParameterCount); - IO.mapRequired("ArgumentList", Record.ArgumentList); - IO.mapRequired("ThisPointerAdjustment", Record.ThisPointerAdjustment); -} - -template <> void LeafRecordImpl<LabelRecord>::map(IO &IO) { - IO.mapRequired("Mode", Record.Mode); -} - -template <> void LeafRecordImpl<MemberFuncIdRecord>::map(IO &IO) { - IO.mapRequired("ClassType", Record.ClassType); - IO.mapRequired("FunctionType", Record.FunctionType); - IO.mapRequired("Name", Record.Name); -} - -template <> void LeafRecordImpl<ArgListRecord>::map(IO &IO) { - IO.mapRequired("ArgIndices", Record.ArgIndices); -} - -template <> void LeafRecordImpl<StringListRecord>::map(IO &IO) { - IO.mapRequired("StringIndices", Record.StringIndices); -} - -template <> void LeafRecordImpl<PointerRecord>::map(IO &IO) { - IO.mapRequired("ReferentType", Record.ReferentType); - IO.mapRequired("Attrs", Record.Attrs); - IO.mapOptional("MemberInfo", Record.MemberInfo); -} - -template <> void LeafRecordImpl<ArrayRecord>::map(IO &IO) { - IO.mapRequired("ElementType", Record.ElementType); - IO.mapRequired("IndexType", Record.IndexType); - IO.mapRequired("Size", Record.Size); - IO.mapRequired("Name", Record.Name); -} - -void LeafRecordImpl<FieldListRecord>::map(IO &IO) { - IO.mapRequired("FieldList", Members); -} - -} // end namespace detail -} // end namespace CodeViewYAML -} // end namespace llvm - -namespace { - -class MemberRecordConversionVisitor : public TypeVisitorCallbacks { -public: - explicit MemberRecordConversionVisitor(std::vector<MemberRecord> &Records) - : Records(Records) {} - -#define TYPE_RECORD(EnumName, EnumVal, Name) -#define MEMBER_RECORD(EnumName, EnumVal, Name) \ - Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \ - return visitKnownMemberImpl(Record); \ - } -#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) -#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) -#include "llvm/DebugInfo/CodeView/CodeViewTypes.def" -private: - template <typename T> Error visitKnownMemberImpl(T &Record) { - TypeLeafKind K = static_cast<TypeLeafKind>(Record.getKind()); - auto Impl = std::make_shared<MemberRecordImpl<T>>(K); - Impl->Record = Record; - Records.push_back(MemberRecord{Impl}); - return Error::success(); - } - - std::vector<MemberRecord> &Records; -}; - -} // end anonymous namespace - -Error LeafRecordImpl<FieldListRecord>::fromCodeViewRecord(CVType Type) { - MemberRecordConversionVisitor V(Members); - return visitMemberRecordStream(Type.content(), V); -} - -CVType LeafRecordImpl<FieldListRecord>::toCodeViewRecord( - AppendingTypeTableBuilder &TS) const { - ContinuationRecordBuilder CRB; - CRB.begin(ContinuationRecordKind::FieldList); - for (const auto &Member : Members) { - Member.Member->writeTo(CRB); - } - TS.insertRecord(CRB); - return CVType(Kind, TS.records().back()); -} - -void MappingTraits<OneMethodRecord>::mapping(IO &io, OneMethodRecord &Record) { - io.mapRequired("Type", Record.Type); - io.mapRequired("Attrs", Record.Attrs.Attrs); - io.mapRequired("VFTableOffset", Record.VFTableOffset); - io.mapRequired("Name", Record.Name); -} - -namespace llvm { -namespace CodeViewYAML { -namespace detail { - -template <> void LeafRecordImpl<ClassRecord>::map(IO &IO) { - IO.mapRequired("MemberCount", Record.MemberCount); - IO.mapRequired("Options", Record.Options); - IO.mapRequired("FieldList", Record.FieldList); - IO.mapRequired("Name", Record.Name); - IO.mapRequired("UniqueName", Record.UniqueName); - IO.mapRequired("DerivationList", Record.DerivationList); - IO.mapRequired("VTableShape", Record.VTableShape); - IO.mapRequired("Size", Record.Size); -} - -template <> void LeafRecordImpl<UnionRecord>::map(IO &IO) { - IO.mapRequired("MemberCount", Record.MemberCount); - IO.mapRequired("Options", Record.Options); - IO.mapRequired("FieldList", Record.FieldList); - IO.mapRequired("Name", Record.Name); - IO.mapRequired("UniqueName", Record.UniqueName); - IO.mapRequired("Size", Record.Size); -} - -template <> void LeafRecordImpl<EnumRecord>::map(IO &IO) { - IO.mapRequired("NumEnumerators", Record.MemberCount); - IO.mapRequired("Options", Record.Options); - IO.mapRequired("FieldList", Record.FieldList); - IO.mapRequired("Name", Record.Name); - IO.mapRequired("UniqueName", Record.UniqueName); - IO.mapRequired("UnderlyingType", Record.UnderlyingType); -} - -template <> void LeafRecordImpl<BitFieldRecord>::map(IO &IO) { - IO.mapRequired("Type", Record.Type); - IO.mapRequired("BitSize", Record.BitSize); - IO.mapRequired("BitOffset", Record.BitOffset); -} - -template <> void LeafRecordImpl<VFTableShapeRecord>::map(IO &IO) { - IO.mapRequired("Slots", Record.Slots); -} - -template <> void LeafRecordImpl<TypeServer2Record>::map(IO &IO) { - IO.mapRequired("Guid", Record.Guid); - IO.mapRequired("Age", Record.Age); - IO.mapRequired("Name", Record.Name); -} - -template <> void LeafRecordImpl<StringIdRecord>::map(IO &IO) { - IO.mapRequired("Id", Record.Id); - IO.mapRequired("String", Record.String); -} - -template <> void LeafRecordImpl<FuncIdRecord>::map(IO &IO) { - IO.mapRequired("ParentScope", Record.ParentScope); - IO.mapRequired("FunctionType", Record.FunctionType); - IO.mapRequired("Name", Record.Name); -} - -template <> void LeafRecordImpl<UdtSourceLineRecord>::map(IO &IO) { - IO.mapRequired("UDT", Record.UDT); - IO.mapRequired("SourceFile", Record.SourceFile); - IO.mapRequired("LineNumber", Record.LineNumber); -} - -template <> void LeafRecordImpl<UdtModSourceLineRecord>::map(IO &IO) { - IO.mapRequired("UDT", Record.UDT); - IO.mapRequired("SourceFile", Record.SourceFile); - IO.mapRequired("LineNumber", Record.LineNumber); - IO.mapRequired("Module", Record.Module); -} - -template <> void LeafRecordImpl<BuildInfoRecord>::map(IO &IO) { - IO.mapRequired("ArgIndices", Record.ArgIndices); -} - -template <> void LeafRecordImpl<VFTableRecord>::map(IO &IO) { - IO.mapRequired("CompleteClass", Record.CompleteClass); - IO.mapRequired("OverriddenVFTable", Record.OverriddenVFTable); - IO.mapRequired("VFPtrOffset", Record.VFPtrOffset); - IO.mapRequired("MethodNames", Record.MethodNames); -} - -template <> void LeafRecordImpl<MethodOverloadListRecord>::map(IO &IO) { - IO.mapRequired("Methods", Record.Methods); -} - -template <> void LeafRecordImpl<PrecompRecord>::map(IO &IO) { - IO.mapRequired("StartTypeIndex", Record.StartTypeIndex); - IO.mapRequired("TypesCount", Record.TypesCount); - IO.mapRequired("Signature", Record.Signature); - IO.mapRequired("PrecompFilePath", Record.PrecompFilePath); -} - -template <> void LeafRecordImpl<EndPrecompRecord>::map(IO &IO) { - IO.mapRequired("Signature", Record.Signature); -} - -template <> void MemberRecordImpl<OneMethodRecord>::map(IO &IO) { - MappingTraits<OneMethodRecord>::mapping(IO, Record); -} - -template <> void MemberRecordImpl<OverloadedMethodRecord>::map(IO &IO) { - IO.mapRequired("NumOverloads", Record.NumOverloads); - IO.mapRequired("MethodList", Record.MethodList); - IO.mapRequired("Name", Record.Name); -} - -template <> void MemberRecordImpl<NestedTypeRecord>::map(IO &IO) { - IO.mapRequired("Type", Record.Type); - IO.mapRequired("Name", Record.Name); -} - -template <> void MemberRecordImpl<DataMemberRecord>::map(IO &IO) { - IO.mapRequired("Attrs", Record.Attrs.Attrs); - IO.mapRequired("Type", Record.Type); - IO.mapRequired("FieldOffset", Record.FieldOffset); - IO.mapRequired("Name", Record.Name); -} - -template <> void MemberRecordImpl<StaticDataMemberRecord>::map(IO &IO) { - IO.mapRequired("Attrs", Record.Attrs.Attrs); - IO.mapRequired("Type", Record.Type); - IO.mapRequired("Name", Record.Name); -} - -template <> void MemberRecordImpl<EnumeratorRecord>::map(IO &IO) { - IO.mapRequired("Attrs", Record.Attrs.Attrs); - IO.mapRequired("Value", Record.Value); - IO.mapRequired("Name", Record.Name); -} - -template <> void MemberRecordImpl<VFPtrRecord>::map(IO &IO) { - IO.mapRequired("Type", Record.Type); -} - -template <> void MemberRecordImpl<BaseClassRecord>::map(IO &IO) { - IO.mapRequired("Attrs", Record.Attrs.Attrs); - IO.mapRequired("Type", Record.Type); - IO.mapRequired("Offset", Record.Offset); -} - -template <> void MemberRecordImpl<VirtualBaseClassRecord>::map(IO &IO) { - IO.mapRequired("Attrs", Record.Attrs.Attrs); - IO.mapRequired("BaseType", Record.BaseType); - IO.mapRequired("VBPtrType", Record.VBPtrType); - IO.mapRequired("VBPtrOffset", Record.VBPtrOffset); - IO.mapRequired("VTableIndex", Record.VTableIndex); -} - -template <> void MemberRecordImpl<ListContinuationRecord>::map(IO &IO) { - IO.mapRequired("ContinuationIndex", Record.ContinuationIndex); -} - -} // end namespace detail -} // end namespace CodeViewYAML -} // end namespace llvm - -template <typename T> -static inline Expected<LeafRecord> fromCodeViewRecordImpl(CVType Type) { - LeafRecord Result; - - auto Impl = std::make_shared<LeafRecordImpl<T>>(Type.kind()); - if (auto EC = Impl->fromCodeViewRecord(Type)) - return std::move(EC); - Result.Leaf = Impl; - return Result; -} - -Expected<LeafRecord> LeafRecord::fromCodeViewRecord(CVType Type) { -#define TYPE_RECORD(EnumName, EnumVal, ClassName) \ - case EnumName: \ - return fromCodeViewRecordImpl<ClassName##Record>(Type); -#define TYPE_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \ - TYPE_RECORD(EnumName, EnumVal, ClassName) -#define MEMBER_RECORD(EnumName, EnumVal, ClassName) -#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) - switch (Type.kind()) { -#include "llvm/DebugInfo/CodeView/CodeViewTypes.def" - default: - llvm_unreachable("Unknown leaf kind!"); - } - return make_error<CodeViewError>(cv_error_code::corrupt_record); -} - -CVType -LeafRecord::toCodeViewRecord(AppendingTypeTableBuilder &Serializer) const { - return Leaf->toCodeViewRecord(Serializer); -} - -namespace llvm { -namespace yaml { - -template <> struct MappingTraits<LeafRecordBase> { - static void mapping(IO &io, LeafRecordBase &Record) { Record.map(io); } -}; - -template <> struct MappingTraits<MemberRecordBase> { - static void mapping(IO &io, MemberRecordBase &Record) { Record.map(io); } -}; - -} // end namespace yaml -} // end namespace llvm - -template <typename ConcreteType> -static void mapLeafRecordImpl(IO &IO, const char *Class, TypeLeafKind Kind, - LeafRecord &Obj) { - if (!IO.outputting()) - Obj.Leaf = std::make_shared<LeafRecordImpl<ConcreteType>>(Kind); - - if (Kind == LF_FIELDLIST) - Obj.Leaf->map(IO); - else - IO.mapRequired(Class, *Obj.Leaf); -} - -void MappingTraits<LeafRecord>::mapping(IO &IO, LeafRecord &Obj) { - TypeLeafKind Kind; - if (IO.outputting()) - Kind = Obj.Leaf->Kind; - IO.mapRequired("Kind", Kind); - -#define TYPE_RECORD(EnumName, EnumVal, ClassName) \ - case EnumName: \ - mapLeafRecordImpl<ClassName##Record>(IO, #ClassName, Kind, Obj); \ - break; -#define TYPE_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \ - TYPE_RECORD(EnumName, EnumVal, ClassName) -#define MEMBER_RECORD(EnumName, EnumVal, ClassName) -#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) - switch (Kind) { -#include "llvm/DebugInfo/CodeView/CodeViewTypes.def" - default: { llvm_unreachable("Unknown leaf kind!"); } - } -} - -template <typename ConcreteType> -static void mapMemberRecordImpl(IO &IO, const char *Class, TypeLeafKind Kind, - MemberRecord &Obj) { - if (!IO.outputting()) - Obj.Member = std::make_shared<MemberRecordImpl<ConcreteType>>(Kind); - - IO.mapRequired(Class, *Obj.Member); -} - -void MappingTraits<MemberRecord>::mapping(IO &IO, MemberRecord &Obj) { - TypeLeafKind Kind; - if (IO.outputting()) - Kind = Obj.Member->Kind; - IO.mapRequired("Kind", Kind); - -#define MEMBER_RECORD(EnumName, EnumVal, ClassName) \ - case EnumName: \ - mapMemberRecordImpl<ClassName##Record>(IO, #ClassName, Kind, Obj); \ - break; -#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \ - MEMBER_RECORD(EnumName, EnumVal, ClassName) -#define TYPE_RECORD(EnumName, EnumVal, ClassName) -#define TYPE_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) - switch (Kind) { -#include "llvm/DebugInfo/CodeView/CodeViewTypes.def" - default: { llvm_unreachable("Unknown member kind!"); } - } -} - -std::vector<LeafRecord> -llvm::CodeViewYAML::fromDebugT(ArrayRef<uint8_t> DebugTorP, - StringRef SectionName) { - ExitOnError Err("Invalid " + std::string(SectionName) + " section!"); - BinaryStreamReader Reader(DebugTorP, support::little); - CVTypeArray Types; - uint32_t Magic; - - Err(Reader.readInteger(Magic)); - assert(Magic == COFF::DEBUG_SECTION_MAGIC && - "Invalid .debug$T or .debug$P section!"); - - std::vector<LeafRecord> Result; - Err(Reader.readArray(Types, Reader.bytesRemaining())); - for (const auto &T : Types) { - auto CVT = Err(LeafRecord::fromCodeViewRecord(T)); - Result.push_back(CVT); - } - return Result; -} - -ArrayRef<uint8_t> llvm::CodeViewYAML::toDebugT(ArrayRef<LeafRecord> Leafs, - BumpPtrAllocator &Alloc, - StringRef SectionName) { - AppendingTypeTableBuilder TS(Alloc); - uint32_t Size = sizeof(uint32_t); - for (const auto &Leaf : Leafs) { - CVType T = Leaf.Leaf->toCodeViewRecord(TS); - Size += T.length(); - assert(T.length() % 4 == 0 && "Improper type record alignment!"); - } - uint8_t *ResultBuffer = Alloc.Allocate<uint8_t>(Size); - MutableArrayRef<uint8_t> Output(ResultBuffer, Size); - BinaryStreamWriter Writer(Output, support::little); - ExitOnError Err("Error writing type record to " + std::string(SectionName) + - " section"); - Err(Writer.writeInteger<uint32_t>(COFF::DEBUG_SECTION_MAGIC)); - for (const auto &R : TS.records()) { - Err(Writer.writeBytes(R)); - } - assert(Writer.bytesRemaining() == 0 && "Didn't write all type record bytes!"); - return Output; -} diff --git a/gnu/llvm/lib/ObjectYAML/DWARFEmitter.cpp b/gnu/llvm/lib/ObjectYAML/DWARFEmitter.cpp deleted file mode 100644 index f23fa123760..00000000000 --- a/gnu/llvm/lib/ObjectYAML/DWARFEmitter.cpp +++ /dev/null @@ -1,379 +0,0 @@ -//===- DWARFEmitter - Convert YAML to DWARF binary data -------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -/// -/// \file -/// The DWARF component of yaml2obj. Provided as library code for tests. -/// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/DWARFEmitter.h" -#include "DWARFVisitor.h" -#include "llvm/ADT/StringMap.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/ObjectYAML/DWARFYAML.h" -#include "llvm/Support/Error.h" -#include "llvm/Support/Host.h" -#include "llvm/Support/LEB128.h" -#include "llvm/Support/MathExtras.h" -#include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/SwapByteOrder.h" -#include "llvm/Support/YAMLTraits.h" -#include "llvm/Support/raw_ostream.h" -#include <algorithm> -#include <cassert> -#include <cstddef> -#include <cstdint> -#include <memory> -#include <string> -#include <vector> - -using namespace llvm; - -template <typename T> -static void writeInteger(T Integer, raw_ostream &OS, bool IsLittleEndian) { - if (IsLittleEndian != sys::IsLittleEndianHost) - sys::swapByteOrder(Integer); - OS.write(reinterpret_cast<char *>(&Integer), sizeof(T)); -} - -static void writeVariableSizedInteger(uint64_t Integer, size_t Size, - raw_ostream &OS, bool IsLittleEndian) { - if (8 == Size) - writeInteger((uint64_t)Integer, OS, IsLittleEndian); - else if (4 == Size) - writeInteger((uint32_t)Integer, OS, IsLittleEndian); - else if (2 == Size) - writeInteger((uint16_t)Integer, OS, IsLittleEndian); - else if (1 == Size) - writeInteger((uint8_t)Integer, OS, IsLittleEndian); - else - assert(false && "Invalid integer write size."); -} - -static void ZeroFillBytes(raw_ostream &OS, size_t Size) { - std::vector<uint8_t> FillData; - FillData.insert(FillData.begin(), Size, 0); - OS.write(reinterpret_cast<char *>(FillData.data()), Size); -} - -static void writeInitialLength(const DWARFYAML::InitialLength &Length, - raw_ostream &OS, bool IsLittleEndian) { - writeInteger((uint32_t)Length.TotalLength, OS, IsLittleEndian); - if (Length.isDWARF64()) - writeInteger((uint64_t)Length.TotalLength64, OS, IsLittleEndian); -} - -void DWARFYAML::EmitDebugStr(raw_ostream &OS, const DWARFYAML::Data &DI) { - for (auto Str : DI.DebugStrings) { - OS.write(Str.data(), Str.size()); - OS.write('\0'); - } -} - -void DWARFYAML::EmitDebugAbbrev(raw_ostream &OS, const DWARFYAML::Data &DI) { - for (auto AbbrevDecl : DI.AbbrevDecls) { - encodeULEB128(AbbrevDecl.Code, OS); - encodeULEB128(AbbrevDecl.Tag, OS); - OS.write(AbbrevDecl.Children); - for (auto Attr : AbbrevDecl.Attributes) { - encodeULEB128(Attr.Attribute, OS); - encodeULEB128(Attr.Form, OS); - if (Attr.Form == dwarf::DW_FORM_implicit_const) - encodeSLEB128(Attr.Value, OS); - } - encodeULEB128(0, OS); - encodeULEB128(0, OS); - } -} - -void DWARFYAML::EmitDebugAranges(raw_ostream &OS, const DWARFYAML::Data &DI) { - for (auto Range : DI.ARanges) { - auto HeaderStart = OS.tell(); - writeInitialLength(Range.Length, OS, DI.IsLittleEndian); - writeInteger((uint16_t)Range.Version, OS, DI.IsLittleEndian); - writeInteger((uint32_t)Range.CuOffset, OS, DI.IsLittleEndian); - writeInteger((uint8_t)Range.AddrSize, OS, DI.IsLittleEndian); - writeInteger((uint8_t)Range.SegSize, OS, DI.IsLittleEndian); - - auto HeaderSize = OS.tell() - HeaderStart; - auto FirstDescriptor = alignTo(HeaderSize, Range.AddrSize * 2); - ZeroFillBytes(OS, FirstDescriptor - HeaderSize); - - for (auto Descriptor : Range.Descriptors) { - writeVariableSizedInteger(Descriptor.Address, Range.AddrSize, OS, - DI.IsLittleEndian); - writeVariableSizedInteger(Descriptor.Length, Range.AddrSize, OS, - DI.IsLittleEndian); - } - ZeroFillBytes(OS, Range.AddrSize * 2); - } -} - -void DWARFYAML::EmitPubSection(raw_ostream &OS, - const DWARFYAML::PubSection &Sect, - bool IsLittleEndian) { - writeInitialLength(Sect.Length, OS, IsLittleEndian); - writeInteger((uint16_t)Sect.Version, OS, IsLittleEndian); - writeInteger((uint32_t)Sect.UnitOffset, OS, IsLittleEndian); - writeInteger((uint32_t)Sect.UnitSize, OS, IsLittleEndian); - for (auto Entry : Sect.Entries) { - writeInteger((uint32_t)Entry.DieOffset, OS, IsLittleEndian); - if (Sect.IsGNUStyle) - writeInteger((uint32_t)Entry.Descriptor, OS, IsLittleEndian); - OS.write(Entry.Name.data(), Entry.Name.size()); - OS.write('\0'); - } -} - -namespace { -/// An extension of the DWARFYAML::ConstVisitor which writes compile -/// units and DIEs to a stream. -class DumpVisitor : public DWARFYAML::ConstVisitor { - raw_ostream &OS; - -protected: - void onStartCompileUnit(const DWARFYAML::Unit &CU) override { - writeInitialLength(CU.Length, OS, DebugInfo.IsLittleEndian); - writeInteger((uint16_t)CU.Version, OS, DebugInfo.IsLittleEndian); - if(CU.Version >= 5) { - writeInteger((uint8_t)CU.Type, OS, DebugInfo.IsLittleEndian); - writeInteger((uint8_t)CU.AddrSize, OS, DebugInfo.IsLittleEndian); - writeInteger((uint32_t)CU.AbbrOffset, OS, DebugInfo.IsLittleEndian); - }else { - writeInteger((uint32_t)CU.AbbrOffset, OS, DebugInfo.IsLittleEndian); - writeInteger((uint8_t)CU.AddrSize, OS, DebugInfo.IsLittleEndian); - } - } - - void onStartDIE(const DWARFYAML::Unit &CU, - const DWARFYAML::Entry &DIE) override { - encodeULEB128(DIE.AbbrCode, OS); - } - - void onValue(const uint8_t U) override { - writeInteger(U, OS, DebugInfo.IsLittleEndian); - } - - void onValue(const uint16_t U) override { - writeInteger(U, OS, DebugInfo.IsLittleEndian); - } - - void onValue(const uint32_t U) override { - writeInteger(U, OS, DebugInfo.IsLittleEndian); - } - - void onValue(const uint64_t U, const bool LEB = false) override { - if (LEB) - encodeULEB128(U, OS); - else - writeInteger(U, OS, DebugInfo.IsLittleEndian); - } - - void onValue(const int64_t S, const bool LEB = false) override { - if (LEB) - encodeSLEB128(S, OS); - else - writeInteger(S, OS, DebugInfo.IsLittleEndian); - } - - void onValue(const StringRef String) override { - OS.write(String.data(), String.size()); - OS.write('\0'); - } - - void onValue(const MemoryBufferRef MBR) override { - OS.write(MBR.getBufferStart(), MBR.getBufferSize()); - } - -public: - DumpVisitor(const DWARFYAML::Data &DI, raw_ostream &Out) - : DWARFYAML::ConstVisitor(DI), OS(Out) {} -}; -} // namespace - -void DWARFYAML::EmitDebugInfo(raw_ostream &OS, const DWARFYAML::Data &DI) { - DumpVisitor Visitor(DI, OS); - Visitor.traverseDebugInfo(); -} - -static void EmitFileEntry(raw_ostream &OS, const DWARFYAML::File &File) { - OS.write(File.Name.data(), File.Name.size()); - OS.write('\0'); - encodeULEB128(File.DirIdx, OS); - encodeULEB128(File.ModTime, OS); - encodeULEB128(File.Length, OS); -} - -void DWARFYAML::EmitDebugLine(raw_ostream &OS, const DWARFYAML::Data &DI) { - for (const auto &LineTable : DI.DebugLines) { - writeInitialLength(LineTable.Length, OS, DI.IsLittleEndian); - uint64_t SizeOfPrologueLength = LineTable.Length.isDWARF64() ? 8 : 4; - writeInteger((uint16_t)LineTable.Version, OS, DI.IsLittleEndian); - writeVariableSizedInteger(LineTable.PrologueLength, SizeOfPrologueLength, - OS, DI.IsLittleEndian); - writeInteger((uint8_t)LineTable.MinInstLength, OS, DI.IsLittleEndian); - if (LineTable.Version >= 4) - writeInteger((uint8_t)LineTable.MaxOpsPerInst, OS, DI.IsLittleEndian); - writeInteger((uint8_t)LineTable.DefaultIsStmt, OS, DI.IsLittleEndian); - writeInteger((uint8_t)LineTable.LineBase, OS, DI.IsLittleEndian); - writeInteger((uint8_t)LineTable.LineRange, OS, DI.IsLittleEndian); - writeInteger((uint8_t)LineTable.OpcodeBase, OS, DI.IsLittleEndian); - - for (auto OpcodeLength : LineTable.StandardOpcodeLengths) - writeInteger((uint8_t)OpcodeLength, OS, DI.IsLittleEndian); - - for (auto IncludeDir : LineTable.IncludeDirs) { - OS.write(IncludeDir.data(), IncludeDir.size()); - OS.write('\0'); - } - OS.write('\0'); - - for (auto File : LineTable.Files) - EmitFileEntry(OS, File); - OS.write('\0'); - - for (auto Op : LineTable.Opcodes) { - writeInteger((uint8_t)Op.Opcode, OS, DI.IsLittleEndian); - if (Op.Opcode == 0) { - encodeULEB128(Op.ExtLen, OS); - writeInteger((uint8_t)Op.SubOpcode, OS, DI.IsLittleEndian); - switch (Op.SubOpcode) { - case dwarf::DW_LNE_set_address: - case dwarf::DW_LNE_set_discriminator: - writeVariableSizedInteger(Op.Data, DI.CompileUnits[0].AddrSize, OS, - DI.IsLittleEndian); - break; - case dwarf::DW_LNE_define_file: - EmitFileEntry(OS, Op.FileEntry); - break; - case dwarf::DW_LNE_end_sequence: - break; - default: - for (auto OpByte : Op.UnknownOpcodeData) - writeInteger((uint8_t)OpByte, OS, DI.IsLittleEndian); - } - } else if (Op.Opcode < LineTable.OpcodeBase) { - switch (Op.Opcode) { - case dwarf::DW_LNS_copy: - case dwarf::DW_LNS_negate_stmt: - case dwarf::DW_LNS_set_basic_block: - case dwarf::DW_LNS_const_add_pc: - case dwarf::DW_LNS_set_prologue_end: - case dwarf::DW_LNS_set_epilogue_begin: - break; - - case dwarf::DW_LNS_advance_pc: - case dwarf::DW_LNS_set_file: - case dwarf::DW_LNS_set_column: - case dwarf::DW_LNS_set_isa: - encodeULEB128(Op.Data, OS); - break; - - case dwarf::DW_LNS_advance_line: - encodeSLEB128(Op.SData, OS); - break; - - case dwarf::DW_LNS_fixed_advance_pc: - writeInteger((uint16_t)Op.Data, OS, DI.IsLittleEndian); - break; - - default: - for (auto OpData : Op.StandardOpcodeData) { - encodeULEB128(OpData, OS); - } - } - } - } - } -} - -using EmitFuncType = void (*)(raw_ostream &, const DWARFYAML::Data &); - -static void -EmitDebugSectionImpl(const DWARFYAML::Data &DI, EmitFuncType EmitFunc, - StringRef Sec, - StringMap<std::unique_ptr<MemoryBuffer>> &OutputBuffers) { - std::string Data; - raw_string_ostream DebugInfoStream(Data); - EmitFunc(DebugInfoStream, DI); - DebugInfoStream.flush(); - if (!Data.empty()) - OutputBuffers[Sec] = MemoryBuffer::getMemBufferCopy(Data); -} - -namespace { -class DIEFixupVisitor : public DWARFYAML::Visitor { - uint64_t Length; - -public: - DIEFixupVisitor(DWARFYAML::Data &DI) : DWARFYAML::Visitor(DI){}; - -private: - virtual void onStartCompileUnit(DWARFYAML::Unit &CU) { Length = 7; } - - virtual void onEndCompileUnit(DWARFYAML::Unit &CU) { - CU.Length.setLength(Length); - } - - virtual void onStartDIE(DWARFYAML::Unit &CU, DWARFYAML::Entry &DIE) { - Length += getULEB128Size(DIE.AbbrCode); - } - - virtual void onValue(const uint8_t U) { Length += 1; } - virtual void onValue(const uint16_t U) { Length += 2; } - virtual void onValue(const uint32_t U) { Length += 4; } - virtual void onValue(const uint64_t U, const bool LEB = false) { - if (LEB) - Length += getULEB128Size(U); - else - Length += 8; - } - virtual void onValue(const int64_t S, const bool LEB = false) { - if (LEB) - Length += getSLEB128Size(S); - else - Length += 8; - } - virtual void onValue(const StringRef String) { Length += String.size() + 1; } - - virtual void onValue(const MemoryBufferRef MBR) { - Length += MBR.getBufferSize(); - } -}; -} // namespace - -Expected<StringMap<std::unique_ptr<MemoryBuffer>>> -DWARFYAML::EmitDebugSections(StringRef YAMLString, bool ApplyFixups, - bool IsLittleEndian) { - yaml::Input YIn(YAMLString); - - DWARFYAML::Data DI; - DI.IsLittleEndian = IsLittleEndian; - YIn >> DI; - if (YIn.error()) - return errorCodeToError(YIn.error()); - - if (ApplyFixups) { - DIEFixupVisitor DIFixer(DI); - DIFixer.traverseDebugInfo(); - } - - StringMap<std::unique_ptr<MemoryBuffer>> DebugSections; - EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugInfo, "debug_info", - DebugSections); - EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugLine, "debug_line", - DebugSections); - EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugStr, "debug_str", - DebugSections); - EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugAbbrev, "debug_abbrev", - DebugSections); - EmitDebugSectionImpl(DI, &DWARFYAML::EmitDebugAranges, "debug_aranges", - DebugSections); - return std::move(DebugSections); -} diff --git a/gnu/llvm/lib/ObjectYAML/DWARFVisitor.cpp b/gnu/llvm/lib/ObjectYAML/DWARFVisitor.cpp deleted file mode 100644 index e6114c85ac0..00000000000 --- a/gnu/llvm/lib/ObjectYAML/DWARFVisitor.cpp +++ /dev/null @@ -1,178 +0,0 @@ -//===--- DWARFVisitor.cpp ---------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -//===----------------------------------------------------------------------===// - -#include "DWARFVisitor.h" -#include "llvm/ObjectYAML/DWARFYAML.h" - -using namespace llvm; - -template <typename T> -void DWARFYAML::VisitorImpl<T>::onVariableSizeValue(uint64_t U, unsigned Size) { - switch (Size) { - case 8: - onValue((uint64_t)U); - break; - case 4: - onValue((uint32_t)U); - break; - case 2: - onValue((uint16_t)U); - break; - case 1: - onValue((uint8_t)U); - break; - default: - llvm_unreachable("Invalid integer write size."); - } -} - -static unsigned getOffsetSize(const DWARFYAML::Unit &Unit) { - return Unit.Length.isDWARF64() ? 8 : 4; -} - -static unsigned getRefSize(const DWARFYAML::Unit &Unit) { - if (Unit.Version == 2) - return Unit.AddrSize; - return getOffsetSize(Unit); -} - -template <typename T> void DWARFYAML::VisitorImpl<T>::traverseDebugInfo() { - for (auto &Unit : DebugInfo.CompileUnits) { - onStartCompileUnit(Unit); - auto FirstAbbrevCode = Unit.Entries[0].AbbrCode; - - for (auto &Entry : Unit.Entries) { - onStartDIE(Unit, Entry); - if (Entry.AbbrCode == 0u) - continue; - auto &Abbrev = DebugInfo.AbbrevDecls[Entry.AbbrCode - FirstAbbrevCode]; - auto FormVal = Entry.Values.begin(); - auto AbbrForm = Abbrev.Attributes.begin(); - for (; - FormVal != Entry.Values.end() && AbbrForm != Abbrev.Attributes.end(); - ++FormVal, ++AbbrForm) { - onForm(*AbbrForm, *FormVal); - dwarf::Form Form = AbbrForm->Form; - bool Indirect; - do { - Indirect = false; - switch (Form) { - case dwarf::DW_FORM_addr: - onVariableSizeValue(FormVal->Value, Unit.AddrSize); - break; - case dwarf::DW_FORM_ref_addr: - onVariableSizeValue(FormVal->Value, getRefSize(Unit)); - break; - case dwarf::DW_FORM_exprloc: - case dwarf::DW_FORM_block: - onValue((uint64_t)FormVal->BlockData.size(), true); - onValue( - MemoryBufferRef(StringRef((const char *)&FormVal->BlockData[0], - FormVal->BlockData.size()), - "")); - break; - case dwarf::DW_FORM_block1: { - auto writeSize = FormVal->BlockData.size(); - onValue((uint8_t)writeSize); - onValue( - MemoryBufferRef(StringRef((const char *)&FormVal->BlockData[0], - FormVal->BlockData.size()), - "")); - break; - } - case dwarf::DW_FORM_block2: { - auto writeSize = FormVal->BlockData.size(); - onValue((uint16_t)writeSize); - onValue( - MemoryBufferRef(StringRef((const char *)&FormVal->BlockData[0], - FormVal->BlockData.size()), - "")); - break; - } - case dwarf::DW_FORM_block4: { - auto writeSize = FormVal->BlockData.size(); - onValue((uint32_t)writeSize); - onValue( - MemoryBufferRef(StringRef((const char *)&FormVal->BlockData[0], - FormVal->BlockData.size()), - "")); - break; - } - case dwarf::DW_FORM_data1: - case dwarf::DW_FORM_ref1: - case dwarf::DW_FORM_flag: - case dwarf::DW_FORM_strx1: - case dwarf::DW_FORM_addrx1: - onValue((uint8_t)FormVal->Value); - break; - case dwarf::DW_FORM_data2: - case dwarf::DW_FORM_ref2: - case dwarf::DW_FORM_strx2: - case dwarf::DW_FORM_addrx2: - onValue((uint16_t)FormVal->Value); - break; - case dwarf::DW_FORM_data4: - case dwarf::DW_FORM_ref4: - case dwarf::DW_FORM_ref_sup4: - case dwarf::DW_FORM_strx4: - case dwarf::DW_FORM_addrx4: - onValue((uint32_t)FormVal->Value); - break; - case dwarf::DW_FORM_data8: - case dwarf::DW_FORM_ref8: - case dwarf::DW_FORM_ref_sup8: - onValue((uint64_t)FormVal->Value); - break; - case dwarf::DW_FORM_sdata: - onValue((int64_t)FormVal->Value, true); - break; - case dwarf::DW_FORM_udata: - case dwarf::DW_FORM_ref_udata: - onValue((uint64_t)FormVal->Value, true); - break; - case dwarf::DW_FORM_string: - onValue(FormVal->CStr); - break; - case dwarf::DW_FORM_indirect: - onValue((uint64_t)FormVal->Value, true); - Indirect = true; - Form = static_cast<dwarf::Form>((uint64_t)FormVal->Value); - ++FormVal; - break; - case dwarf::DW_FORM_strp: - case dwarf::DW_FORM_sec_offset: - case dwarf::DW_FORM_GNU_ref_alt: - case dwarf::DW_FORM_GNU_strp_alt: - case dwarf::DW_FORM_line_strp: - case dwarf::DW_FORM_strp_sup: - onVariableSizeValue(FormVal->Value, getOffsetSize(Unit)); - break; - case dwarf::DW_FORM_ref_sig8: - onValue((uint64_t)FormVal->Value); - break; - case dwarf::DW_FORM_GNU_addr_index: - case dwarf::DW_FORM_GNU_str_index: - onValue((uint64_t)FormVal->Value, true); - break; - default: - break; - } - } while (Indirect); - } - onEndDIE(Unit, Entry); - } - onEndCompileUnit(Unit); - } -} - -// Explicitly instantiate the two template expansions. -template class DWARFYAML::VisitorImpl<DWARFYAML::Data>; -template class DWARFYAML::VisitorImpl<const DWARFYAML::Data>; diff --git a/gnu/llvm/lib/ObjectYAML/DWARFVisitor.h b/gnu/llvm/lib/ObjectYAML/DWARFVisitor.h deleted file mode 100644 index 5489031dc33..00000000000 --- a/gnu/llvm/lib/ObjectYAML/DWARFVisitor.h +++ /dev/null @@ -1,97 +0,0 @@ -//===--- DWARFVisitor.h -----------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_OBJECTYAML_DWARFVISITOR_H -#define LLVM_OBJECTYAML_DWARFVISITOR_H - -#include "llvm/ADT/StringRef.h" -#include "llvm/BinaryFormat/Dwarf.h" -#include "llvm/Support/MemoryBuffer.h" - -namespace llvm { - -namespace DWARFYAML { - -struct Data; -struct Unit; -struct Entry; -struct FormValue; -struct AttributeAbbrev; - -/// A class to visits DWARFYAML Compile Units and DIEs in preorder. -/// -/// Extensions of this class can either maintain const or non-const references -/// to the DWARFYAML::Data object. -template <typename T> class VisitorImpl { -protected: - T &DebugInfo; - - /// Visitor Functions - /// @{ - virtual void onStartCompileUnit(Unit &CU) {} - virtual void onEndCompileUnit(Unit &CU) {} - virtual void onStartDIE(Unit &CU, Entry &DIE) {} - virtual void onEndDIE(Unit &CU, Entry &DIE) {} - virtual void onForm(AttributeAbbrev &AttAbbrev, FormValue &Value) {} - /// @} - - /// Const Visitor Functions - /// @{ - virtual void onStartCompileUnit(const Unit &CU) {} - virtual void onEndCompileUnit(const Unit &CU) {} - virtual void onStartDIE(const Unit &CU, const Entry &DIE) {} - virtual void onEndDIE(const Unit &CU, const Entry &DIE) {} - virtual void onForm(const AttributeAbbrev &AttAbbrev, - const FormValue &Value) {} - /// @} - - /// Value visitors - /// @{ - virtual void onValue(const uint8_t U) {} - virtual void onValue(const uint16_t U) {} - virtual void onValue(const uint32_t U) {} - virtual void onValue(const uint64_t U, const bool LEB = false) {} - virtual void onValue(const int64_t S, const bool LEB = false) {} - virtual void onValue(const StringRef String) {} - virtual void onValue(const MemoryBufferRef MBR) {} - /// @} - -public: - VisitorImpl(T &DI) : DebugInfo(DI) {} - - virtual ~VisitorImpl() {} - - void traverseDebugInfo(); - -private: - void onVariableSizeValue(uint64_t U, unsigned Size); -}; - -// Making the visior instantiations extern and explicit in the cpp file. This -// prevents them from being instantiated in every compile unit that uses the -// visitors. -extern template class VisitorImpl<DWARFYAML::Data>; -extern template class VisitorImpl<const DWARFYAML::Data>; - -class Visitor : public VisitorImpl<Data> { -public: - Visitor(Data &DI) : VisitorImpl<Data>(DI) {} -}; - -class ConstVisitor : public VisitorImpl<const Data> { -public: - ConstVisitor(const Data &DI) : VisitorImpl<const Data>(DI) {} -}; - -} // namespace DWARFYAML -} // namespace llvm - -#endif diff --git a/gnu/llvm/lib/ObjectYAML/DWARFYAML.cpp b/gnu/llvm/lib/ObjectYAML/DWARFYAML.cpp deleted file mode 100644 index d6c09e1a35d..00000000000 --- a/gnu/llvm/lib/ObjectYAML/DWARFYAML.cpp +++ /dev/null @@ -1,176 +0,0 @@ -//===- DWARFYAML.cpp - DWARF YAMLIO implementation ------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines classes for handling the YAML representation of DWARF Debug -// Info. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/DWARFYAML.h" - -namespace llvm { - -bool DWARFYAML::Data::isEmpty() const { - return 0 == DebugStrings.size() + AbbrevDecls.size(); -} - -namespace yaml { - -void MappingTraits<DWARFYAML::Data>::mapping(IO &IO, DWARFYAML::Data &DWARF) { - auto oldContext = IO.getContext(); - IO.setContext(&DWARF); - IO.mapOptional("debug_str", DWARF.DebugStrings); - IO.mapOptional("debug_abbrev", DWARF.AbbrevDecls); - if (!DWARF.ARanges.empty() || !IO.outputting()) - IO.mapOptional("debug_aranges", DWARF.ARanges); - if (!DWARF.PubNames.Entries.empty() || !IO.outputting()) - IO.mapOptional("debug_pubnames", DWARF.PubNames); - if (!DWARF.PubTypes.Entries.empty() || !IO.outputting()) - IO.mapOptional("debug_pubtypes", DWARF.PubTypes); - if (!DWARF.GNUPubNames.Entries.empty() || !IO.outputting()) - IO.mapOptional("debug_gnu_pubnames", DWARF.GNUPubNames); - if (!DWARF.GNUPubTypes.Entries.empty() || !IO.outputting()) - IO.mapOptional("debug_gnu_pubtypes", DWARF.GNUPubTypes); - IO.mapOptional("debug_info", DWARF.CompileUnits); - IO.mapOptional("debug_line", DWARF.DebugLines); - IO.setContext(&oldContext); -} - -void MappingTraits<DWARFYAML::Abbrev>::mapping(IO &IO, - DWARFYAML::Abbrev &Abbrev) { - IO.mapRequired("Code", Abbrev.Code); - IO.mapRequired("Tag", Abbrev.Tag); - IO.mapRequired("Children", Abbrev.Children); - IO.mapRequired("Attributes", Abbrev.Attributes); -} - -void MappingTraits<DWARFYAML::AttributeAbbrev>::mapping( - IO &IO, DWARFYAML::AttributeAbbrev &AttAbbrev) { - IO.mapRequired("Attribute", AttAbbrev.Attribute); - IO.mapRequired("Form", AttAbbrev.Form); - if(AttAbbrev.Form == dwarf::DW_FORM_implicit_const) - IO.mapRequired("Value", AttAbbrev.Value); -} - -void MappingTraits<DWARFYAML::ARangeDescriptor>::mapping( - IO &IO, DWARFYAML::ARangeDescriptor &Descriptor) { - IO.mapRequired("Address", Descriptor.Address); - IO.mapRequired("Length", Descriptor.Length); -} - -void MappingTraits<DWARFYAML::ARange>::mapping(IO &IO, - DWARFYAML::ARange &Range) { - IO.mapRequired("Length", Range.Length); - IO.mapRequired("Version", Range.Version); - IO.mapRequired("CuOffset", Range.CuOffset); - IO.mapRequired("AddrSize", Range.AddrSize); - IO.mapRequired("SegSize", Range.SegSize); - IO.mapRequired("Descriptors", Range.Descriptors); -} - -void MappingTraits<DWARFYAML::PubEntry>::mapping(IO &IO, - DWARFYAML::PubEntry &Entry) { - IO.mapRequired("DieOffset", Entry.DieOffset); - if (reinterpret_cast<DWARFYAML::PubSection *>(IO.getContext())->IsGNUStyle) - IO.mapRequired("Descriptor", Entry.Descriptor); - IO.mapRequired("Name", Entry.Name); -} - -void MappingTraits<DWARFYAML::PubSection>::mapping( - IO &IO, DWARFYAML::PubSection &Section) { - auto OldContext = IO.getContext(); - IO.setContext(&Section); - - IO.mapRequired("Length", Section.Length); - IO.mapRequired("Version", Section.Version); - IO.mapRequired("UnitOffset", Section.UnitOffset); - IO.mapRequired("UnitSize", Section.UnitSize); - IO.mapRequired("Entries", Section.Entries); - - IO.setContext(OldContext); -} - -void MappingTraits<DWARFYAML::Unit>::mapping(IO &IO, DWARFYAML::Unit &Unit) { - IO.mapRequired("Length", Unit.Length); - IO.mapRequired("Version", Unit.Version); - if (Unit.Version >= 5) - IO.mapRequired("UnitType", Unit.Type); - IO.mapRequired("AbbrOffset", Unit.AbbrOffset); - IO.mapRequired("AddrSize", Unit.AddrSize); - IO.mapOptional("Entries", Unit.Entries); -} - -void MappingTraits<DWARFYAML::Entry>::mapping(IO &IO, DWARFYAML::Entry &Entry) { - IO.mapRequired("AbbrCode", Entry.AbbrCode); - IO.mapRequired("Values", Entry.Values); -} - -void MappingTraits<DWARFYAML::FormValue>::mapping( - IO &IO, DWARFYAML::FormValue &FormValue) { - IO.mapOptional("Value", FormValue.Value); - if (!FormValue.CStr.empty() || !IO.outputting()) - IO.mapOptional("CStr", FormValue.CStr); - if (!FormValue.BlockData.empty() || !IO.outputting()) - IO.mapOptional("BlockData", FormValue.BlockData); -} - -void MappingTraits<DWARFYAML::File>::mapping(IO &IO, DWARFYAML::File &File) { - IO.mapRequired("Name", File.Name); - IO.mapRequired("DirIdx", File.DirIdx); - IO.mapRequired("ModTime", File.ModTime); - IO.mapRequired("Length", File.Length); -} - -void MappingTraits<DWARFYAML::LineTableOpcode>::mapping( - IO &IO, DWARFYAML::LineTableOpcode &LineTableOpcode) { - IO.mapRequired("Opcode", LineTableOpcode.Opcode); - if (LineTableOpcode.Opcode == dwarf::DW_LNS_extended_op) { - IO.mapRequired("ExtLen", LineTableOpcode.ExtLen); - IO.mapRequired("SubOpcode", LineTableOpcode.SubOpcode); - } - - if (!LineTableOpcode.UnknownOpcodeData.empty() || !IO.outputting()) - IO.mapOptional("UnknownOpcodeData", LineTableOpcode.UnknownOpcodeData); - if (!LineTableOpcode.UnknownOpcodeData.empty() || !IO.outputting()) - IO.mapOptional("StandardOpcodeData", LineTableOpcode.StandardOpcodeData); - if (!LineTableOpcode.FileEntry.Name.empty() || !IO.outputting()) - IO.mapOptional("FileEntry", LineTableOpcode.FileEntry); - if (LineTableOpcode.Opcode == dwarf::DW_LNS_advance_line || !IO.outputting()) - IO.mapOptional("SData", LineTableOpcode.SData); - IO.mapOptional("Data", LineTableOpcode.Data); -} - -void MappingTraits<DWARFYAML::LineTable>::mapping( - IO &IO, DWARFYAML::LineTable &LineTable) { - IO.mapRequired("Length", LineTable.Length); - IO.mapRequired("Version", LineTable.Version); - IO.mapRequired("PrologueLength", LineTable.PrologueLength); - IO.mapRequired("MinInstLength", LineTable.MinInstLength); - if(LineTable.Version >= 4) - IO.mapRequired("MaxOpsPerInst", LineTable.MaxOpsPerInst); - IO.mapRequired("DefaultIsStmt", LineTable.DefaultIsStmt); - IO.mapRequired("LineBase", LineTable.LineBase); - IO.mapRequired("LineRange", LineTable.LineRange); - IO.mapRequired("OpcodeBase", LineTable.OpcodeBase); - IO.mapRequired("StandardOpcodeLengths", LineTable.StandardOpcodeLengths); - IO.mapRequired("IncludeDirs", LineTable.IncludeDirs); - IO.mapRequired("Files", LineTable.Files); - IO.mapRequired("Opcodes", LineTable.Opcodes); -} - -void MappingTraits<DWARFYAML::InitialLength>::mapping( - IO &IO, DWARFYAML::InitialLength &InitialLength) { - IO.mapRequired("TotalLength", InitialLength.TotalLength); - if (InitialLength.isDWARF64()) - IO.mapRequired("TotalLength64", InitialLength.TotalLength64); -} - -} // end namespace yaml - -} // end namespace llvm diff --git a/gnu/llvm/lib/ObjectYAML/ELFYAML.cpp b/gnu/llvm/lib/ObjectYAML/ELFYAML.cpp deleted file mode 100644 index 215d6bdd091..00000000000 --- a/gnu/llvm/lib/ObjectYAML/ELFYAML.cpp +++ /dev/null @@ -1,997 +0,0 @@ -//===- ELFYAML.cpp - ELF YAMLIO implementation ----------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines classes for handling the YAML representation of ELF. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/ELFYAML.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/BinaryFormat/ELF.h" -#include "llvm/Support/Casting.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/MipsABIFlags.h" -#include "llvm/Support/YAMLTraits.h" -#include <cassert> -#include <cstdint> - -namespace llvm { - -ELFYAML::Section::~Section() = default; - -namespace yaml { - -void ScalarEnumerationTraits<ELFYAML::ELF_ET>::enumeration( - IO &IO, ELFYAML::ELF_ET &Value) { -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - ECase(ET_NONE); - ECase(ET_REL); - ECase(ET_EXEC); - ECase(ET_DYN); - ECase(ET_CORE); -#undef ECase - IO.enumFallback<Hex16>(Value); -} - -void ScalarEnumerationTraits<ELFYAML::ELF_PT>::enumeration( - IO &IO, ELFYAML::ELF_PT &Value) { -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - ECase(PT_NULL); - ECase(PT_LOAD); - ECase(PT_DYNAMIC); - ECase(PT_INTERP); - ECase(PT_NOTE); - ECase(PT_SHLIB); - ECase(PT_PHDR); - ECase(PT_TLS); - ECase(PT_GNU_EH_FRAME); -#undef ECase - IO.enumFallback<Hex32>(Value); -} - -void ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration( - IO &IO, ELFYAML::ELF_EM &Value) { -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - ECase(EM_NONE); - ECase(EM_M32); - ECase(EM_SPARC); - ECase(EM_386); - ECase(EM_68K); - ECase(EM_88K); - ECase(EM_IAMCU); - ECase(EM_860); - ECase(EM_MIPS); - ECase(EM_S370); - ECase(EM_MIPS_RS3_LE); - ECase(EM_PARISC); - ECase(EM_VPP500); - ECase(EM_SPARC32PLUS); - ECase(EM_960); - ECase(EM_PPC); - ECase(EM_PPC64); - ECase(EM_S390); - ECase(EM_SPU); - ECase(EM_V800); - ECase(EM_FR20); - ECase(EM_RH32); - ECase(EM_RCE); - ECase(EM_ARM); - ECase(EM_ALPHA); - ECase(EM_SH); - ECase(EM_SPARCV9); - ECase(EM_TRICORE); - ECase(EM_ARC); - ECase(EM_H8_300); - ECase(EM_H8_300H); - ECase(EM_H8S); - ECase(EM_H8_500); - ECase(EM_IA_64); - ECase(EM_MIPS_X); - ECase(EM_COLDFIRE); - ECase(EM_68HC12); - ECase(EM_MMA); - ECase(EM_PCP); - ECase(EM_NCPU); - ECase(EM_NDR1); - ECase(EM_STARCORE); - ECase(EM_ME16); - ECase(EM_ST100); - ECase(EM_TINYJ); - ECase(EM_X86_64); - ECase(EM_PDSP); - ECase(EM_PDP10); - ECase(EM_PDP11); - ECase(EM_FX66); - ECase(EM_ST9PLUS); - ECase(EM_ST7); - ECase(EM_68HC16); - ECase(EM_68HC11); - ECase(EM_68HC08); - ECase(EM_68HC05); - ECase(EM_SVX); - ECase(EM_ST19); - ECase(EM_VAX); - ECase(EM_CRIS); - ECase(EM_JAVELIN); - ECase(EM_FIREPATH); - ECase(EM_ZSP); - ECase(EM_MMIX); - ECase(EM_HUANY); - ECase(EM_PRISM); - ECase(EM_AVR); - ECase(EM_FR30); - ECase(EM_D10V); - ECase(EM_D30V); - ECase(EM_V850); - ECase(EM_M32R); - ECase(EM_MN10300); - ECase(EM_MN10200); - ECase(EM_PJ); - ECase(EM_OPENRISC); - ECase(EM_ARC_COMPACT); - ECase(EM_XTENSA); - ECase(EM_VIDEOCORE); - ECase(EM_TMM_GPP); - ECase(EM_NS32K); - ECase(EM_TPC); - ECase(EM_SNP1K); - ECase(EM_ST200); - ECase(EM_IP2K); - ECase(EM_MAX); - ECase(EM_CR); - ECase(EM_F2MC16); - ECase(EM_MSP430); - ECase(EM_BLACKFIN); - ECase(EM_SE_C33); - ECase(EM_SEP); - ECase(EM_ARCA); - ECase(EM_UNICORE); - ECase(EM_EXCESS); - ECase(EM_DXP); - ECase(EM_ALTERA_NIOS2); - ECase(EM_CRX); - ECase(EM_XGATE); - ECase(EM_C166); - ECase(EM_M16C); - ECase(EM_DSPIC30F); - ECase(EM_CE); - ECase(EM_M32C); - ECase(EM_TSK3000); - ECase(EM_RS08); - ECase(EM_SHARC); - ECase(EM_ECOG2); - ECase(EM_SCORE7); - ECase(EM_DSP24); - ECase(EM_VIDEOCORE3); - ECase(EM_LATTICEMICO32); - ECase(EM_SE_C17); - ECase(EM_TI_C6000); - ECase(EM_TI_C2000); - ECase(EM_TI_C5500); - ECase(EM_MMDSP_PLUS); - ECase(EM_CYPRESS_M8C); - ECase(EM_R32C); - ECase(EM_TRIMEDIA); - ECase(EM_HEXAGON); - ECase(EM_8051); - ECase(EM_STXP7X); - ECase(EM_NDS32); - ECase(EM_ECOG1); - ECase(EM_ECOG1X); - ECase(EM_MAXQ30); - ECase(EM_XIMO16); - ECase(EM_MANIK); - ECase(EM_CRAYNV2); - ECase(EM_RX); - ECase(EM_METAG); - ECase(EM_MCST_ELBRUS); - ECase(EM_ECOG16); - ECase(EM_CR16); - ECase(EM_ETPU); - ECase(EM_SLE9X); - ECase(EM_L10M); - ECase(EM_K10M); - ECase(EM_AARCH64); - ECase(EM_AVR32); - ECase(EM_STM8); - ECase(EM_TILE64); - ECase(EM_TILEPRO); - ECase(EM_CUDA); - ECase(EM_TILEGX); - ECase(EM_CLOUDSHIELD); - ECase(EM_COREA_1ST); - ECase(EM_COREA_2ND); - ECase(EM_ARC_COMPACT2); - ECase(EM_OPEN8); - ECase(EM_RL78); - ECase(EM_VIDEOCORE5); - ECase(EM_78KOR); - ECase(EM_56800EX); - ECase(EM_AMDGPU); - ECase(EM_RISCV); - ECase(EM_LANAI); - ECase(EM_BPF); -#undef ECase -} - -void ScalarEnumerationTraits<ELFYAML::ELF_ELFCLASS>::enumeration( - IO &IO, ELFYAML::ELF_ELFCLASS &Value) { -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - // Since the semantics of ELFCLASSNONE is "invalid", just don't accept it - // here. - ECase(ELFCLASS32); - ECase(ELFCLASS64); -#undef ECase -} - -void ScalarEnumerationTraits<ELFYAML::ELF_ELFDATA>::enumeration( - IO &IO, ELFYAML::ELF_ELFDATA &Value) { -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - // Since the semantics of ELFDATANONE is "invalid", just don't accept it - // here. - ECase(ELFDATA2LSB); - ECase(ELFDATA2MSB); -#undef ECase -} - -void ScalarEnumerationTraits<ELFYAML::ELF_ELFOSABI>::enumeration( - IO &IO, ELFYAML::ELF_ELFOSABI &Value) { -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - ECase(ELFOSABI_NONE); - ECase(ELFOSABI_HPUX); - ECase(ELFOSABI_NETBSD); - ECase(ELFOSABI_GNU); - ECase(ELFOSABI_HURD); - ECase(ELFOSABI_SOLARIS); - ECase(ELFOSABI_AIX); - ECase(ELFOSABI_IRIX); - ECase(ELFOSABI_FREEBSD); - ECase(ELFOSABI_TRU64); - ECase(ELFOSABI_MODESTO); - ECase(ELFOSABI_OPENBSD); - ECase(ELFOSABI_OPENVMS); - ECase(ELFOSABI_NSK); - ECase(ELFOSABI_AROS); - ECase(ELFOSABI_FENIXOS); - ECase(ELFOSABI_CLOUDABI); - ECase(ELFOSABI_AMDGPU_HSA); - ECase(ELFOSABI_AMDGPU_PAL); - ECase(ELFOSABI_AMDGPU_MESA3D); - ECase(ELFOSABI_ARM); - ECase(ELFOSABI_C6000_ELFABI); - ECase(ELFOSABI_C6000_LINUX); - ECase(ELFOSABI_STANDALONE); -#undef ECase -} - -void ScalarBitSetTraits<ELFYAML::ELF_EF>::bitset(IO &IO, - ELFYAML::ELF_EF &Value) { - const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); - assert(Object && "The IO context is not initialized"); -#define BCase(X) IO.bitSetCase(Value, #X, ELF::X) -#define BCaseMask(X, M) IO.maskedBitSetCase(Value, #X, ELF::X, ELF::M) - switch (Object->Header.Machine) { - case ELF::EM_ARM: - BCase(EF_ARM_SOFT_FLOAT); - BCase(EF_ARM_VFP_FLOAT); - BCaseMask(EF_ARM_EABI_UNKNOWN, EF_ARM_EABIMASK); - BCaseMask(EF_ARM_EABI_VER1, EF_ARM_EABIMASK); - BCaseMask(EF_ARM_EABI_VER2, EF_ARM_EABIMASK); - BCaseMask(EF_ARM_EABI_VER3, EF_ARM_EABIMASK); - BCaseMask(EF_ARM_EABI_VER4, EF_ARM_EABIMASK); - BCaseMask(EF_ARM_EABI_VER5, EF_ARM_EABIMASK); - break; - case ELF::EM_MIPS: - BCase(EF_MIPS_NOREORDER); - BCase(EF_MIPS_PIC); - BCase(EF_MIPS_CPIC); - BCase(EF_MIPS_ABI2); - BCase(EF_MIPS_32BITMODE); - BCase(EF_MIPS_FP64); - BCase(EF_MIPS_NAN2008); - BCase(EF_MIPS_MICROMIPS); - BCase(EF_MIPS_ARCH_ASE_M16); - BCase(EF_MIPS_ARCH_ASE_MDMX); - BCaseMask(EF_MIPS_ABI_O32, EF_MIPS_ABI); - BCaseMask(EF_MIPS_ABI_O64, EF_MIPS_ABI); - BCaseMask(EF_MIPS_ABI_EABI32, EF_MIPS_ABI); - BCaseMask(EF_MIPS_ABI_EABI64, EF_MIPS_ABI); - BCaseMask(EF_MIPS_MACH_3900, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_4010, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_4100, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_4650, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_4120, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_4111, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_SB1, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_OCTEON, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_XLR, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_OCTEON2, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_OCTEON3, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_5400, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_5900, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_5500, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_9000, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_LS2E, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_LS2F, EF_MIPS_MACH); - BCaseMask(EF_MIPS_MACH_LS3A, EF_MIPS_MACH); - BCaseMask(EF_MIPS_ARCH_1, EF_MIPS_ARCH); - BCaseMask(EF_MIPS_ARCH_2, EF_MIPS_ARCH); - BCaseMask(EF_MIPS_ARCH_3, EF_MIPS_ARCH); - BCaseMask(EF_MIPS_ARCH_4, EF_MIPS_ARCH); - BCaseMask(EF_MIPS_ARCH_5, EF_MIPS_ARCH); - BCaseMask(EF_MIPS_ARCH_32, EF_MIPS_ARCH); - BCaseMask(EF_MIPS_ARCH_64, EF_MIPS_ARCH); - BCaseMask(EF_MIPS_ARCH_32R2, EF_MIPS_ARCH); - BCaseMask(EF_MIPS_ARCH_64R2, EF_MIPS_ARCH); - BCaseMask(EF_MIPS_ARCH_32R6, EF_MIPS_ARCH); - BCaseMask(EF_MIPS_ARCH_64R6, EF_MIPS_ARCH); - break; - case ELF::EM_HEXAGON: - BCase(EF_HEXAGON_MACH_V2); - BCase(EF_HEXAGON_MACH_V3); - BCase(EF_HEXAGON_MACH_V4); - BCase(EF_HEXAGON_MACH_V5); - BCase(EF_HEXAGON_MACH_V55); - BCase(EF_HEXAGON_MACH_V60); - BCase(EF_HEXAGON_MACH_V62); - BCase(EF_HEXAGON_MACH_V65); - BCase(EF_HEXAGON_ISA_V2); - BCase(EF_HEXAGON_ISA_V3); - BCase(EF_HEXAGON_ISA_V4); - BCase(EF_HEXAGON_ISA_V5); - BCase(EF_HEXAGON_ISA_V55); - BCase(EF_HEXAGON_ISA_V60); - BCase(EF_HEXAGON_ISA_V62); - BCase(EF_HEXAGON_ISA_V65); - break; - case ELF::EM_AVR: - BCase(EF_AVR_ARCH_AVR1); - BCase(EF_AVR_ARCH_AVR2); - BCase(EF_AVR_ARCH_AVR25); - BCase(EF_AVR_ARCH_AVR3); - BCase(EF_AVR_ARCH_AVR31); - BCase(EF_AVR_ARCH_AVR35); - BCase(EF_AVR_ARCH_AVR4); - BCase(EF_AVR_ARCH_AVR51); - BCase(EF_AVR_ARCH_AVR6); - BCase(EF_AVR_ARCH_AVRTINY); - BCase(EF_AVR_ARCH_XMEGA1); - BCase(EF_AVR_ARCH_XMEGA2); - BCase(EF_AVR_ARCH_XMEGA3); - BCase(EF_AVR_ARCH_XMEGA4); - BCase(EF_AVR_ARCH_XMEGA5); - BCase(EF_AVR_ARCH_XMEGA6); - BCase(EF_AVR_ARCH_XMEGA7); - break; - case ELF::EM_RISCV: - BCase(EF_RISCV_RVC); - BCaseMask(EF_RISCV_FLOAT_ABI_SOFT, EF_RISCV_FLOAT_ABI); - BCaseMask(EF_RISCV_FLOAT_ABI_SINGLE, EF_RISCV_FLOAT_ABI); - BCaseMask(EF_RISCV_FLOAT_ABI_DOUBLE, EF_RISCV_FLOAT_ABI); - BCaseMask(EF_RISCV_FLOAT_ABI_QUAD, EF_RISCV_FLOAT_ABI); - BCase(EF_RISCV_RVE); - break; - case ELF::EM_AMDGPU: - BCaseMask(EF_AMDGPU_MACH_NONE, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_R600, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_R630, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_RS880, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_RV670, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_RV710, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_RV730, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_RV770, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_CEDAR, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_CYPRESS, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_JUNIPER, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_REDWOOD, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_SUMO, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_BARTS, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_CAICOS, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_CAYMAN, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_R600_TURKS, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX600, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX601, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX700, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX701, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX702, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX703, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX704, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX801, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX802, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX803, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX810, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX900, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX902, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX904, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX906, EF_AMDGPU_MACH); - BCaseMask(EF_AMDGPU_MACH_AMDGCN_GFX909, EF_AMDGPU_MACH); - BCase(EF_AMDGPU_XNACK); - BCase(EF_AMDGPU_SRAM_ECC); - break; - case ELF::EM_X86_64: - break; - default: - llvm_unreachable("Unsupported architecture"); - } -#undef BCase -#undef BCaseMask -} - -void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration( - IO &IO, ELFYAML::ELF_SHT &Value) { - const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); - assert(Object && "The IO context is not initialized"); -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - ECase(SHT_NULL); - ECase(SHT_PROGBITS); - ECase(SHT_SYMTAB); - // FIXME: Issue a diagnostic with this information. - ECase(SHT_STRTAB); - ECase(SHT_RELA); - ECase(SHT_HASH); - ECase(SHT_DYNAMIC); - ECase(SHT_NOTE); - ECase(SHT_NOBITS); - ECase(SHT_REL); - ECase(SHT_SHLIB); - ECase(SHT_DYNSYM); - ECase(SHT_INIT_ARRAY); - ECase(SHT_FINI_ARRAY); - ECase(SHT_PREINIT_ARRAY); - ECase(SHT_GROUP); - ECase(SHT_SYMTAB_SHNDX); - ECase(SHT_RELR); - ECase(SHT_LOOS); - ECase(SHT_ANDROID_REL); - ECase(SHT_ANDROID_RELA); - ECase(SHT_ANDROID_RELR); - ECase(SHT_LLVM_ODRTAB); - ECase(SHT_LLVM_LINKER_OPTIONS); - ECase(SHT_LLVM_CALL_GRAPH_PROFILE); - ECase(SHT_LLVM_ADDRSIG); - ECase(SHT_GNU_ATTRIBUTES); - ECase(SHT_GNU_HASH); - ECase(SHT_GNU_verdef); - ECase(SHT_GNU_verneed); - ECase(SHT_GNU_versym); - ECase(SHT_HIOS); - ECase(SHT_LOPROC); - switch (Object->Header.Machine) { - case ELF::EM_ARM: - ECase(SHT_ARM_EXIDX); - ECase(SHT_ARM_PREEMPTMAP); - ECase(SHT_ARM_ATTRIBUTES); - ECase(SHT_ARM_DEBUGOVERLAY); - ECase(SHT_ARM_OVERLAYSECTION); - break; - case ELF::EM_HEXAGON: - ECase(SHT_HEX_ORDERED); - break; - case ELF::EM_X86_64: - ECase(SHT_X86_64_UNWIND); - break; - case ELF::EM_MIPS: - ECase(SHT_MIPS_REGINFO); - ECase(SHT_MIPS_OPTIONS); - ECase(SHT_MIPS_ABIFLAGS); - break; - default: - // Nothing to do. - break; - } -#undef ECase -} - -void ScalarBitSetTraits<ELFYAML::ELF_PF>::bitset(IO &IO, - ELFYAML::ELF_PF &Value) { -#define BCase(X) IO.bitSetCase(Value, #X, ELF::X) - BCase(PF_X); - BCase(PF_W); - BCase(PF_R); -} - -void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO, - ELFYAML::ELF_SHF &Value) { - const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); -#define BCase(X) IO.bitSetCase(Value, #X, ELF::X) - BCase(SHF_WRITE); - BCase(SHF_ALLOC); - BCase(SHF_EXCLUDE); - BCase(SHF_EXECINSTR); - BCase(SHF_MERGE); - BCase(SHF_STRINGS); - BCase(SHF_INFO_LINK); - BCase(SHF_LINK_ORDER); - BCase(SHF_OS_NONCONFORMING); - BCase(SHF_GROUP); - BCase(SHF_TLS); - BCase(SHF_COMPRESSED); - switch (Object->Header.Machine) { - case ELF::EM_ARM: - BCase(SHF_ARM_PURECODE); - break; - case ELF::EM_HEXAGON: - BCase(SHF_HEX_GPREL); - break; - case ELF::EM_MIPS: - BCase(SHF_MIPS_NODUPES); - BCase(SHF_MIPS_NAMES); - BCase(SHF_MIPS_LOCAL); - BCase(SHF_MIPS_NOSTRIP); - BCase(SHF_MIPS_GPREL); - BCase(SHF_MIPS_MERGE); - BCase(SHF_MIPS_ADDR); - BCase(SHF_MIPS_STRING); - break; - case ELF::EM_X86_64: - BCase(SHF_X86_64_LARGE); - break; - default: - // Nothing to do. - break; - } -#undef BCase -} - -void ScalarEnumerationTraits<ELFYAML::ELF_SHN>::enumeration( - IO &IO, ELFYAML::ELF_SHN &Value) { -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - ECase(SHN_UNDEF); - ECase(SHN_LORESERVE); - ECase(SHN_LOPROC); - ECase(SHN_HIPROC); - ECase(SHN_LOOS); - ECase(SHN_HIOS); - ECase(SHN_ABS); - ECase(SHN_COMMON); - ECase(SHN_XINDEX); - ECase(SHN_HIRESERVE); - ECase(SHN_HEXAGON_SCOMMON); - ECase(SHN_HEXAGON_SCOMMON_1); - ECase(SHN_HEXAGON_SCOMMON_2); - ECase(SHN_HEXAGON_SCOMMON_4); - ECase(SHN_HEXAGON_SCOMMON_8); -#undef ECase - IO.enumFallback<Hex32>(Value); -} - -void ScalarEnumerationTraits<ELFYAML::ELF_STT>::enumeration( - IO &IO, ELFYAML::ELF_STT &Value) { -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - ECase(STT_NOTYPE); - ECase(STT_OBJECT); - ECase(STT_FUNC); - ECase(STT_SECTION); - ECase(STT_FILE); - ECase(STT_COMMON); - ECase(STT_TLS); - ECase(STT_GNU_IFUNC); -#undef ECase -} - -void ScalarEnumerationTraits<ELFYAML::ELF_STV>::enumeration( - IO &IO, ELFYAML::ELF_STV &Value) { -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - ECase(STV_DEFAULT); - ECase(STV_INTERNAL); - ECase(STV_HIDDEN); - ECase(STV_PROTECTED); -#undef ECase -} - -void ScalarBitSetTraits<ELFYAML::ELF_STO>::bitset(IO &IO, - ELFYAML::ELF_STO &Value) { - const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); - assert(Object && "The IO context is not initialized"); -#define BCase(X) IO.bitSetCase(Value, #X, ELF::X) - switch (Object->Header.Machine) { - case ELF::EM_MIPS: - BCase(STO_MIPS_OPTIONAL); - BCase(STO_MIPS_PLT); - BCase(STO_MIPS_PIC); - BCase(STO_MIPS_MICROMIPS); - break; - default: - break; // Nothing to do - } -#undef BCase -#undef BCaseMask -} - -void ScalarEnumerationTraits<ELFYAML::ELF_RSS>::enumeration( - IO &IO, ELFYAML::ELF_RSS &Value) { -#define ECase(X) IO.enumCase(Value, #X, ELF::X) - ECase(RSS_UNDEF); - ECase(RSS_GP); - ECase(RSS_GP0); - ECase(RSS_LOC); -#undef ECase -} - -void ScalarEnumerationTraits<ELFYAML::ELF_REL>::enumeration( - IO &IO, ELFYAML::ELF_REL &Value) { - const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); - assert(Object && "The IO context is not initialized"); -#define ELF_RELOC(X, Y) IO.enumCase(Value, #X, ELF::X); - switch (Object->Header.Machine) { - case ELF::EM_X86_64: -#include "llvm/BinaryFormat/ELFRelocs/x86_64.def" - break; - case ELF::EM_MIPS: -#include "llvm/BinaryFormat/ELFRelocs/Mips.def" - break; - case ELF::EM_HEXAGON: -#include "llvm/BinaryFormat/ELFRelocs/Hexagon.def" - break; - case ELF::EM_386: - case ELF::EM_IAMCU: -#include "llvm/BinaryFormat/ELFRelocs/i386.def" - break; - case ELF::EM_AARCH64: -#include "llvm/BinaryFormat/ELFRelocs/AArch64.def" - break; - case ELF::EM_ARM: -#include "llvm/BinaryFormat/ELFRelocs/ARM.def" - break; - case ELF::EM_ARC: -#include "llvm/BinaryFormat/ELFRelocs/ARC.def" - break; - case ELF::EM_RISCV: -#include "llvm/BinaryFormat/ELFRelocs/RISCV.def" - break; - case ELF::EM_LANAI: -#include "llvm/BinaryFormat/ELFRelocs/Lanai.def" - break; - case ELF::EM_AMDGPU: -#include "llvm/BinaryFormat/ELFRelocs/AMDGPU.def" - break; - case ELF::EM_BPF: -#include "llvm/BinaryFormat/ELFRelocs/BPF.def" - break; - default: - llvm_unreachable("Unsupported architecture"); - } -#undef ELF_RELOC - IO.enumFallback<Hex32>(Value); -} - -void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_REG>::enumeration( - IO &IO, ELFYAML::MIPS_AFL_REG &Value) { -#define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X) - ECase(REG_NONE); - ECase(REG_32); - ECase(REG_64); - ECase(REG_128); -#undef ECase -} - -void ScalarEnumerationTraits<ELFYAML::MIPS_ABI_FP>::enumeration( - IO &IO, ELFYAML::MIPS_ABI_FP &Value) { -#define ECase(X) IO.enumCase(Value, #X, Mips::Val_GNU_MIPS_ABI_##X) - ECase(FP_ANY); - ECase(FP_DOUBLE); - ECase(FP_SINGLE); - ECase(FP_SOFT); - ECase(FP_OLD_64); - ECase(FP_XX); - ECase(FP_64); - ECase(FP_64A); -#undef ECase -} - -void ScalarEnumerationTraits<ELFYAML::MIPS_AFL_EXT>::enumeration( - IO &IO, ELFYAML::MIPS_AFL_EXT &Value) { -#define ECase(X) IO.enumCase(Value, #X, Mips::AFL_##X) - ECase(EXT_NONE); - ECase(EXT_XLR); - ECase(EXT_OCTEON2); - ECase(EXT_OCTEONP); - ECase(EXT_LOONGSON_3A); - ECase(EXT_OCTEON); - ECase(EXT_5900); - ECase(EXT_4650); - ECase(EXT_4010); - ECase(EXT_4100); - ECase(EXT_3900); - ECase(EXT_10000); - ECase(EXT_SB1); - ECase(EXT_4111); - ECase(EXT_4120); - ECase(EXT_5400); - ECase(EXT_5500); - ECase(EXT_LOONGSON_2E); - ECase(EXT_LOONGSON_2F); - ECase(EXT_OCTEON3); -#undef ECase -} - -void ScalarEnumerationTraits<ELFYAML::MIPS_ISA>::enumeration( - IO &IO, ELFYAML::MIPS_ISA &Value) { - IO.enumCase(Value, "MIPS1", 1); - IO.enumCase(Value, "MIPS2", 2); - IO.enumCase(Value, "MIPS3", 3); - IO.enumCase(Value, "MIPS4", 4); - IO.enumCase(Value, "MIPS5", 5); - IO.enumCase(Value, "MIPS32", 32); - IO.enumCase(Value, "MIPS64", 64); -} - -void ScalarBitSetTraits<ELFYAML::MIPS_AFL_ASE>::bitset( - IO &IO, ELFYAML::MIPS_AFL_ASE &Value) { -#define BCase(X) IO.bitSetCase(Value, #X, Mips::AFL_ASE_##X) - BCase(DSP); - BCase(DSPR2); - BCase(EVA); - BCase(MCU); - BCase(MDMX); - BCase(MIPS3D); - BCase(MT); - BCase(SMARTMIPS); - BCase(VIRT); - BCase(MSA); - BCase(MIPS16); - BCase(MICROMIPS); - BCase(XPA); -#undef BCase -} - -void ScalarBitSetTraits<ELFYAML::MIPS_AFL_FLAGS1>::bitset( - IO &IO, ELFYAML::MIPS_AFL_FLAGS1 &Value) { -#define BCase(X) IO.bitSetCase(Value, #X, Mips::AFL_FLAGS1_##X) - BCase(ODDSPREG); -#undef BCase -} - -void MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO, - ELFYAML::FileHeader &FileHdr) { - IO.mapRequired("Class", FileHdr.Class); - IO.mapRequired("Data", FileHdr.Data); - IO.mapOptional("OSABI", FileHdr.OSABI, ELFYAML::ELF_ELFOSABI(0)); - IO.mapOptional("ABIVersion", FileHdr.ABIVersion, Hex8(0)); - IO.mapRequired("Type", FileHdr.Type); - IO.mapRequired("Machine", FileHdr.Machine); - IO.mapOptional("Flags", FileHdr.Flags, ELFYAML::ELF_EF(0)); - IO.mapOptional("Entry", FileHdr.Entry, Hex64(0)); -} - -void MappingTraits<ELFYAML::ProgramHeader>::mapping( - IO &IO, ELFYAML::ProgramHeader &Phdr) { - IO.mapRequired("Type", Phdr.Type); - IO.mapOptional("Flags", Phdr.Flags, ELFYAML::ELF_PF(0)); - IO.mapOptional("Sections", Phdr.Sections); - IO.mapOptional("VAddr", Phdr.VAddr, Hex64(0)); - IO.mapOptional("PAddr", Phdr.PAddr, Hex64(0)); - IO.mapOptional("Align", Phdr.Align); -} - -namespace { - -struct NormalizedOther { - NormalizedOther(IO &) - : Visibility(ELFYAML::ELF_STV(0)), Other(ELFYAML::ELF_STO(0)) {} - NormalizedOther(IO &, uint8_t Original) - : Visibility(Original & 0x3), Other(Original & ~0x3) {} - - uint8_t denormalize(IO &) { return Visibility | Other; } - - ELFYAML::ELF_STV Visibility; - ELFYAML::ELF_STO Other; -}; - -} // end anonymous namespace - -void MappingTraits<ELFYAML::Symbol>::mapping(IO &IO, ELFYAML::Symbol &Symbol) { - IO.mapOptional("Name", Symbol.Name, StringRef()); - IO.mapOptional("Type", Symbol.Type, ELFYAML::ELF_STT(0)); - IO.mapOptional("Section", Symbol.Section, StringRef()); - IO.mapOptional("Index", Symbol.Index); - IO.mapOptional("Value", Symbol.Value, Hex64(0)); - IO.mapOptional("Size", Symbol.Size, Hex64(0)); - - MappingNormalization<NormalizedOther, uint8_t> Keys(IO, Symbol.Other); - IO.mapOptional("Visibility", Keys->Visibility, ELFYAML::ELF_STV(0)); - IO.mapOptional("Other", Keys->Other, ELFYAML::ELF_STO(0)); -} - -StringRef MappingTraits<ELFYAML::Symbol>::validate(IO &IO, - ELFYAML::Symbol &Symbol) { - if (Symbol.Index && Symbol.Section.data()) { - return "Index and Section cannot both be specified for Symbol"; - } - if (Symbol.Index && *Symbol.Index == ELFYAML::ELF_SHN(ELF::SHN_XINDEX)) { - return "Large indexes are not supported"; - } - if (Symbol.Index && *Symbol.Index < ELFYAML::ELF_SHN(ELF::SHN_LORESERVE)) { - return "Use a section name to define which section a symbol is defined in"; - } - return StringRef(); -} - -void MappingTraits<ELFYAML::LocalGlobalWeakSymbols>::mapping( - IO &IO, ELFYAML::LocalGlobalWeakSymbols &Symbols) { - IO.mapOptional("Local", Symbols.Local); - IO.mapOptional("Global", Symbols.Global); - IO.mapOptional("Weak", Symbols.Weak); -} - -static void commonSectionMapping(IO &IO, ELFYAML::Section &Section) { - IO.mapOptional("Name", Section.Name, StringRef()); - IO.mapRequired("Type", Section.Type); - IO.mapOptional("Flags", Section.Flags, ELFYAML::ELF_SHF(0)); - IO.mapOptional("Address", Section.Address, Hex64(0)); - IO.mapOptional("Link", Section.Link, StringRef()); - IO.mapOptional("AddressAlign", Section.AddressAlign, Hex64(0)); - IO.mapOptional("EntSize", Section.EntSize); - IO.mapOptional("Info", Section.Info, StringRef()); -} - -static void sectionMapping(IO &IO, ELFYAML::RawContentSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Content", Section.Content); - IO.mapOptional("Size", Section.Size, Hex64(Section.Content.binary_size())); -} - -static void sectionMapping(IO &IO, ELFYAML::NoBitsSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Size", Section.Size, Hex64(0)); -} - -static void sectionMapping(IO &IO, ELFYAML::RelocationSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Relocations", Section.Relocations); -} - -static void groupSectionMapping(IO &IO, ELFYAML::Group &group) { - commonSectionMapping(IO, group); - IO.mapRequired("Members", group.Members); -} - -void MappingTraits<ELFYAML::SectionOrType>::mapping( - IO &IO, ELFYAML::SectionOrType §ionOrType) { - IO.mapRequired("SectionOrType", sectionOrType.sectionNameOrType); -} - -void MappingTraits<ELFYAML::SectionName>::mapping( - IO &IO, ELFYAML::SectionName §ionName) { - IO.mapRequired("Section", sectionName.Section); -} - -static void sectionMapping(IO &IO, ELFYAML::MipsABIFlags &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Version", Section.Version, Hex16(0)); - IO.mapRequired("ISA", Section.ISALevel); - IO.mapOptional("ISARevision", Section.ISARevision, Hex8(0)); - IO.mapOptional("ISAExtension", Section.ISAExtension, - ELFYAML::MIPS_AFL_EXT(Mips::AFL_EXT_NONE)); - IO.mapOptional("ASEs", Section.ASEs, ELFYAML::MIPS_AFL_ASE(0)); - IO.mapOptional("FpABI", Section.FpABI, - ELFYAML::MIPS_ABI_FP(Mips::Val_GNU_MIPS_ABI_FP_ANY)); - IO.mapOptional("GPRSize", Section.GPRSize, - ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE)); - IO.mapOptional("CPR1Size", Section.CPR1Size, - ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE)); - IO.mapOptional("CPR2Size", Section.CPR2Size, - ELFYAML::MIPS_AFL_REG(Mips::AFL_REG_NONE)); - IO.mapOptional("Flags1", Section.Flags1, ELFYAML::MIPS_AFL_FLAGS1(0)); - IO.mapOptional("Flags2", Section.Flags2, Hex32(0)); -} - -void MappingTraits<std::unique_ptr<ELFYAML::Section>>::mapping( - IO &IO, std::unique_ptr<ELFYAML::Section> &Section) { - ELFYAML::ELF_SHT sectionType; - if (IO.outputting()) - sectionType = Section->Type; - else - IO.mapRequired("Type", sectionType); - - switch (sectionType) { - case ELF::SHT_REL: - case ELF::SHT_RELA: - if (!IO.outputting()) - Section.reset(new ELFYAML::RelocationSection()); - sectionMapping(IO, *cast<ELFYAML::RelocationSection>(Section.get())); - break; - case ELF::SHT_GROUP: - if (!IO.outputting()) - Section.reset(new ELFYAML::Group()); - groupSectionMapping(IO, *cast<ELFYAML::Group>(Section.get())); - break; - case ELF::SHT_NOBITS: - if (!IO.outputting()) - Section.reset(new ELFYAML::NoBitsSection()); - sectionMapping(IO, *cast<ELFYAML::NoBitsSection>(Section.get())); - break; - case ELF::SHT_MIPS_ABIFLAGS: - if (!IO.outputting()) - Section.reset(new ELFYAML::MipsABIFlags()); - sectionMapping(IO, *cast<ELFYAML::MipsABIFlags>(Section.get())); - break; - default: - if (!IO.outputting()) - Section.reset(new ELFYAML::RawContentSection()); - sectionMapping(IO, *cast<ELFYAML::RawContentSection>(Section.get())); - } -} - -StringRef MappingTraits<std::unique_ptr<ELFYAML::Section>>::validate( - IO &io, std::unique_ptr<ELFYAML::Section> &Section) { - const auto *RawSection = dyn_cast<ELFYAML::RawContentSection>(Section.get()); - if (!RawSection || RawSection->Size >= RawSection->Content.binary_size()) - return StringRef(); - return "Section size must be greater or equal to the content size"; -} - -namespace { - -struct NormalizedMips64RelType { - NormalizedMips64RelType(IO &) - : Type(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)), - Type2(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)), - Type3(ELFYAML::ELF_REL(ELF::R_MIPS_NONE)), - SpecSym(ELFYAML::ELF_REL(ELF::RSS_UNDEF)) {} - NormalizedMips64RelType(IO &, ELFYAML::ELF_REL Original) - : Type(Original & 0xFF), Type2(Original >> 8 & 0xFF), - Type3(Original >> 16 & 0xFF), SpecSym(Original >> 24 & 0xFF) {} - - ELFYAML::ELF_REL denormalize(IO &) { - ELFYAML::ELF_REL Res = Type | Type2 << 8 | Type3 << 16 | SpecSym << 24; - return Res; - } - - ELFYAML::ELF_REL Type; - ELFYAML::ELF_REL Type2; - ELFYAML::ELF_REL Type3; - ELFYAML::ELF_RSS SpecSym; -}; - -} // end anonymous namespace - -void MappingTraits<ELFYAML::Relocation>::mapping(IO &IO, - ELFYAML::Relocation &Rel) { - const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext()); - assert(Object && "The IO context is not initialized"); - - IO.mapRequired("Offset", Rel.Offset); - IO.mapOptional("Symbol", Rel.Symbol); - - if (Object->Header.Machine == ELFYAML::ELF_EM(ELF::EM_MIPS) && - Object->Header.Class == ELFYAML::ELF_ELFCLASS(ELF::ELFCLASS64)) { - MappingNormalization<NormalizedMips64RelType, ELFYAML::ELF_REL> Key( - IO, Rel.Type); - IO.mapRequired("Type", Key->Type); - IO.mapOptional("Type2", Key->Type2, ELFYAML::ELF_REL(ELF::R_MIPS_NONE)); - IO.mapOptional("Type3", Key->Type3, ELFYAML::ELF_REL(ELF::R_MIPS_NONE)); - IO.mapOptional("SpecSym", Key->SpecSym, ELFYAML::ELF_RSS(ELF::RSS_UNDEF)); - } else - IO.mapRequired("Type", Rel.Type); - - IO.mapOptional("Addend", Rel.Addend, (int64_t)0); -} - -void MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) { - assert(!IO.getContext() && "The IO context is initialized already"); - IO.setContext(&Object); - IO.mapTag("!ELF", true); - IO.mapRequired("FileHeader", Object.Header); - IO.mapOptional("ProgramHeaders", Object.ProgramHeaders); - IO.mapOptional("Sections", Object.Sections); - IO.mapOptional("Symbols", Object.Symbols); - IO.mapOptional("DynamicSymbols", Object.DynamicSymbols); - IO.setContext(nullptr); -} - -LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_AFL_REG) -LLVM_YAML_STRONG_TYPEDEF(uint8_t, MIPS_ABI_FP) -LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_EXT) -LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_ASE) -LLVM_YAML_STRONG_TYPEDEF(uint32_t, MIPS_AFL_FLAGS1) - -} // end namespace yaml - -} // end namespace llvm diff --git a/gnu/llvm/lib/ObjectYAML/LLVMBuild.txt b/gnu/llvm/lib/ObjectYAML/LLVMBuild.txt deleted file mode 100644 index 44657e916a9..00000000000 --- a/gnu/llvm/lib/ObjectYAML/LLVMBuild.txt +++ /dev/null @@ -1,14 +0,0 @@ -;===------------------------------------------------------------*- Conf -*--===; -; -; The LLVM Compiler Infrastructure -; -; This file is distributed under the University of Illinois Open Source -; License. See LICENSE.TXT for details. -; -;===------------------------------------------------------------------------===; - -[component_0] -type = Library -name = ObjectYAML -parent = Libraries -required_libraries = Support DebugInfoCodeView diff --git a/gnu/llvm/lib/ObjectYAML/MachOYAML.cpp b/gnu/llvm/lib/ObjectYAML/MachOYAML.cpp deleted file mode 100644 index e00a4ea9307..00000000000 --- a/gnu/llvm/lib/ObjectYAML/MachOYAML.cpp +++ /dev/null @@ -1,566 +0,0 @@ -//===- MachOYAML.cpp - MachO YAMLIO implementation ------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines classes for handling the YAML representation of MachO. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/MachOYAML.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/BinaryFormat/MachO.h" -#include "llvm/Support/Format.h" -#include "llvm/Support/Host.h" -#include "llvm/Support/YAMLTraits.h" -#include "llvm/Support/raw_ostream.h" -#include <cinttypes> -#include <cstdint> -#include <cstring> - -namespace llvm { - -MachOYAML::LoadCommand::~LoadCommand() = default; - -bool MachOYAML::LinkEditData::isEmpty() const { - return 0 == - RebaseOpcodes.size() + BindOpcodes.size() + WeakBindOpcodes.size() + - LazyBindOpcodes.size() + ExportTrie.Children.size() + - NameList.size() + StringTable.size(); -} - -namespace yaml { - -void ScalarTraits<char_16>::output(const char_16 &Val, void *, - raw_ostream &Out) { - auto Len = strnlen(&Val[0], 16); - Out << StringRef(&Val[0], Len); -} - -StringRef ScalarTraits<char_16>::input(StringRef Scalar, void *, char_16 &Val) { - size_t CopySize = 16 >= Scalar.size() ? 16 : Scalar.size(); - memcpy((void *)Val, Scalar.data(), CopySize); - - if (Scalar.size() < 16) { - memset((void *)&Val[Scalar.size()], 0, 16 - Scalar.size()); - } - - return StringRef(); -} - -QuotingType ScalarTraits<char_16>::mustQuote(StringRef S) { - return needsQuotes(S); -} - -void ScalarTraits<uuid_t>::output(const uuid_t &Val, void *, raw_ostream &Out) { - Out.write_uuid(Val); -} - -StringRef ScalarTraits<uuid_t>::input(StringRef Scalar, void *, uuid_t &Val) { - size_t OutIdx = 0; - for (size_t Idx = 0; Idx < Scalar.size(); ++Idx) { - if (Scalar[Idx] == '-' || OutIdx >= 16) - continue; - unsigned long long TempInt; - if (getAsUnsignedInteger(Scalar.slice(Idx, Idx + 2), 16, TempInt)) - return "invalid number"; - if (TempInt > 0xFF) - return "out of range number"; - Val[OutIdx] = static_cast<uint8_t>(TempInt); - ++Idx; // increment idx an extra time because we're consuming 2 chars - ++OutIdx; - } - return StringRef(); -} - -QuotingType ScalarTraits<uuid_t>::mustQuote(StringRef S) { - return needsQuotes(S); -} - -void MappingTraits<MachOYAML::FileHeader>::mapping( - IO &IO, MachOYAML::FileHeader &FileHdr) { - IO.mapRequired("magic", FileHdr.magic); - IO.mapRequired("cputype", FileHdr.cputype); - IO.mapRequired("cpusubtype", FileHdr.cpusubtype); - IO.mapRequired("filetype", FileHdr.filetype); - IO.mapRequired("ncmds", FileHdr.ncmds); - IO.mapRequired("sizeofcmds", FileHdr.sizeofcmds); - IO.mapRequired("flags", FileHdr.flags); - if (FileHdr.magic == MachO::MH_MAGIC_64 || - FileHdr.magic == MachO::MH_CIGAM_64) - IO.mapRequired("reserved", FileHdr.reserved); -} - -void MappingTraits<MachOYAML::Object>::mapping(IO &IO, - MachOYAML::Object &Object) { - // If the context isn't already set, tag the document as !mach-o. - // For Fat files there will be a different tag so they can be differentiated. - if (!IO.getContext()) { - IO.setContext(&Object); - } - IO.mapTag("!mach-o", true); - IO.mapOptional("IsLittleEndian", Object.IsLittleEndian, - sys::IsLittleEndianHost); - Object.DWARF.IsLittleEndian = Object.IsLittleEndian; - - IO.mapRequired("FileHeader", Object.Header); - IO.mapOptional("LoadCommands", Object.LoadCommands); - if(!Object.LinkEdit.isEmpty() || !IO.outputting()) - IO.mapOptional("LinkEditData", Object.LinkEdit); - - if(!Object.DWARF.isEmpty() || !IO.outputting()) - IO.mapOptional("DWARF", Object.DWARF); - - if (IO.getContext() == &Object) - IO.setContext(nullptr); -} - -void MappingTraits<MachOYAML::FatHeader>::mapping( - IO &IO, MachOYAML::FatHeader &FatHeader) { - IO.mapRequired("magic", FatHeader.magic); - IO.mapRequired("nfat_arch", FatHeader.nfat_arch); -} - -void MappingTraits<MachOYAML::FatArch>::mapping(IO &IO, - MachOYAML::FatArch &FatArch) { - IO.mapRequired("cputype", FatArch.cputype); - IO.mapRequired("cpusubtype", FatArch.cpusubtype); - IO.mapRequired("offset", FatArch.offset); - IO.mapRequired("size", FatArch.size); - IO.mapRequired("align", FatArch.align); - IO.mapOptional("reserved", FatArch.reserved, - static_cast<llvm::yaml::Hex32>(0)); -} - -void MappingTraits<MachOYAML::UniversalBinary>::mapping( - IO &IO, MachOYAML::UniversalBinary &UniversalBinary) { - if (!IO.getContext()) { - IO.setContext(&UniversalBinary); - IO.mapTag("!fat-mach-o", true); - } - IO.mapRequired("FatHeader", UniversalBinary.Header); - IO.mapRequired("FatArchs", UniversalBinary.FatArchs); - IO.mapRequired("Slices", UniversalBinary.Slices); - - if (IO.getContext() == &UniversalBinary) - IO.setContext(nullptr); -} - -void MappingTraits<MachOYAML::LinkEditData>::mapping( - IO &IO, MachOYAML::LinkEditData &LinkEditData) { - IO.mapOptional("RebaseOpcodes", LinkEditData.RebaseOpcodes); - IO.mapOptional("BindOpcodes", LinkEditData.BindOpcodes); - IO.mapOptional("WeakBindOpcodes", LinkEditData.WeakBindOpcodes); - IO.mapOptional("LazyBindOpcodes", LinkEditData.LazyBindOpcodes); - if (!LinkEditData.ExportTrie.Children.empty() || !IO.outputting()) - IO.mapOptional("ExportTrie", LinkEditData.ExportTrie); - IO.mapOptional("NameList", LinkEditData.NameList); - IO.mapOptional("StringTable", LinkEditData.StringTable); -} - -void MappingTraits<MachOYAML::RebaseOpcode>::mapping( - IO &IO, MachOYAML::RebaseOpcode &RebaseOpcode) { - IO.mapRequired("Opcode", RebaseOpcode.Opcode); - IO.mapRequired("Imm", RebaseOpcode.Imm); - IO.mapOptional("ExtraData", RebaseOpcode.ExtraData); -} - -void MappingTraits<MachOYAML::BindOpcode>::mapping( - IO &IO, MachOYAML::BindOpcode &BindOpcode) { - IO.mapRequired("Opcode", BindOpcode.Opcode); - IO.mapRequired("Imm", BindOpcode.Imm); - IO.mapOptional("ULEBExtraData", BindOpcode.ULEBExtraData); - IO.mapOptional("SLEBExtraData", BindOpcode.SLEBExtraData); - IO.mapOptional("Symbol", BindOpcode.Symbol); -} - -void MappingTraits<MachOYAML::ExportEntry>::mapping( - IO &IO, MachOYAML::ExportEntry &ExportEntry) { - IO.mapRequired("TerminalSize", ExportEntry.TerminalSize); - IO.mapOptional("NodeOffset", ExportEntry.NodeOffset); - IO.mapOptional("Name", ExportEntry.Name); - IO.mapOptional("Flags", ExportEntry.Flags); - IO.mapOptional("Address", ExportEntry.Address); - IO.mapOptional("Other", ExportEntry.Other); - IO.mapOptional("ImportName", ExportEntry.ImportName); - IO.mapOptional("Children", ExportEntry.Children); -} - -void MappingTraits<MachOYAML::NListEntry>::mapping( - IO &IO, MachOYAML::NListEntry &NListEntry) { - IO.mapRequired("n_strx", NListEntry.n_strx); - IO.mapRequired("n_type", NListEntry.n_type); - IO.mapRequired("n_sect", NListEntry.n_sect); - IO.mapRequired("n_desc", NListEntry.n_desc); - IO.mapRequired("n_value", NListEntry.n_value); -} - -template <typename StructType> -void mapLoadCommandData(IO &IO, MachOYAML::LoadCommand &LoadCommand) {} - -template <> -void mapLoadCommandData<MachO::segment_command>( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - IO.mapOptional("Sections", LoadCommand.Sections); -} - -template <> -void mapLoadCommandData<MachO::segment_command_64>( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - IO.mapOptional("Sections", LoadCommand.Sections); -} - -template <> -void mapLoadCommandData<MachO::dylib_command>( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - IO.mapOptional("PayloadString", LoadCommand.PayloadString); -} - -template <> -void mapLoadCommandData<MachO::rpath_command>( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - IO.mapOptional("PayloadString", LoadCommand.PayloadString); -} - -template <> -void mapLoadCommandData<MachO::dylinker_command>( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - IO.mapOptional("PayloadString", LoadCommand.PayloadString); -} - -template <> -void mapLoadCommandData<MachO::build_version_command>( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - IO.mapOptional("Tools", LoadCommand.Tools); -} - -void MappingTraits<MachOYAML::LoadCommand>::mapping( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - MachO::LoadCommandType TempCmd = static_cast<MachO::LoadCommandType>( - LoadCommand.Data.load_command_data.cmd); - IO.mapRequired("cmd", TempCmd); - LoadCommand.Data.load_command_data.cmd = TempCmd; - IO.mapRequired("cmdsize", LoadCommand.Data.load_command_data.cmdsize); - -#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \ - case MachO::LCName: \ - MappingTraits<MachO::LCStruct>::mapping(IO, \ - LoadCommand.Data.LCStruct##_data); \ - mapLoadCommandData<MachO::LCStruct>(IO, LoadCommand); \ - break; - - switch (LoadCommand.Data.load_command_data.cmd) { -#include "llvm/BinaryFormat/MachO.def" - } - IO.mapOptional("PayloadBytes", LoadCommand.PayloadBytes); - IO.mapOptional("ZeroPadBytes", LoadCommand.ZeroPadBytes, (uint64_t)0ull); -} - -void MappingTraits<MachO::dyld_info_command>::mapping( - IO &IO, MachO::dyld_info_command &LoadCommand) { - IO.mapRequired("rebase_off", LoadCommand.rebase_off); - IO.mapRequired("rebase_size", LoadCommand.rebase_size); - IO.mapRequired("bind_off", LoadCommand.bind_off); - IO.mapRequired("bind_size", LoadCommand.bind_size); - IO.mapRequired("weak_bind_off", LoadCommand.weak_bind_off); - IO.mapRequired("weak_bind_size", LoadCommand.weak_bind_size); - IO.mapRequired("lazy_bind_off", LoadCommand.lazy_bind_off); - IO.mapRequired("lazy_bind_size", LoadCommand.lazy_bind_size); - IO.mapRequired("export_off", LoadCommand.export_off); - IO.mapRequired("export_size", LoadCommand.export_size); -} - -void MappingTraits<MachOYAML::Section>::mapping(IO &IO, - MachOYAML::Section &Section) { - IO.mapRequired("sectname", Section.sectname); - IO.mapRequired("segname", Section.segname); - IO.mapRequired("addr", Section.addr); - IO.mapRequired("size", Section.size); - IO.mapRequired("offset", Section.offset); - IO.mapRequired("align", Section.align); - IO.mapRequired("reloff", Section.reloff); - IO.mapRequired("nreloc", Section.nreloc); - IO.mapRequired("flags", Section.flags); - IO.mapRequired("reserved1", Section.reserved1); - IO.mapRequired("reserved2", Section.reserved2); - IO.mapOptional("reserved3", Section.reserved3); -} - -void MappingTraits<MachO::build_tool_version>::mapping( - IO &IO, MachO::build_tool_version &tool) { - IO.mapRequired("tool", tool.tool); - IO.mapRequired("version", tool.version); -} - -void MappingTraits<MachO::dylib>::mapping(IO &IO, MachO::dylib &DylibStruct) { - IO.mapRequired("name", DylibStruct.name); - IO.mapRequired("timestamp", DylibStruct.timestamp); - IO.mapRequired("current_version", DylibStruct.current_version); - IO.mapRequired("compatibility_version", DylibStruct.compatibility_version); -} - -void MappingTraits<MachO::dylib_command>::mapping( - IO &IO, MachO::dylib_command &LoadCommand) { - IO.mapRequired("dylib", LoadCommand.dylib); -} - -void MappingTraits<MachO::dylinker_command>::mapping( - IO &IO, MachO::dylinker_command &LoadCommand) { - IO.mapRequired("name", LoadCommand.name); -} - -void MappingTraits<MachO::dysymtab_command>::mapping( - IO &IO, MachO::dysymtab_command &LoadCommand) { - IO.mapRequired("ilocalsym", LoadCommand.ilocalsym); - IO.mapRequired("nlocalsym", LoadCommand.nlocalsym); - IO.mapRequired("iextdefsym", LoadCommand.iextdefsym); - IO.mapRequired("nextdefsym", LoadCommand.nextdefsym); - IO.mapRequired("iundefsym", LoadCommand.iundefsym); - IO.mapRequired("nundefsym", LoadCommand.nundefsym); - IO.mapRequired("tocoff", LoadCommand.tocoff); - IO.mapRequired("ntoc", LoadCommand.ntoc); - IO.mapRequired("modtaboff", LoadCommand.modtaboff); - IO.mapRequired("nmodtab", LoadCommand.nmodtab); - IO.mapRequired("extrefsymoff", LoadCommand.extrefsymoff); - IO.mapRequired("nextrefsyms", LoadCommand.nextrefsyms); - IO.mapRequired("indirectsymoff", LoadCommand.indirectsymoff); - IO.mapRequired("nindirectsyms", LoadCommand.nindirectsyms); - IO.mapRequired("extreloff", LoadCommand.extreloff); - IO.mapRequired("nextrel", LoadCommand.nextrel); - IO.mapRequired("locreloff", LoadCommand.locreloff); - IO.mapRequired("nlocrel", LoadCommand.nlocrel); -} - -void MappingTraits<MachO::encryption_info_command>::mapping( - IO &IO, MachO::encryption_info_command &LoadCommand) { - IO.mapRequired("cryptoff", LoadCommand.cryptoff); - IO.mapRequired("cryptsize", LoadCommand.cryptsize); - IO.mapRequired("cryptid", LoadCommand.cryptid); -} - -void MappingTraits<MachO::encryption_info_command_64>::mapping( - IO &IO, MachO::encryption_info_command_64 &LoadCommand) { - IO.mapRequired("cryptoff", LoadCommand.cryptoff); - IO.mapRequired("cryptsize", LoadCommand.cryptsize); - IO.mapRequired("cryptid", LoadCommand.cryptid); - IO.mapRequired("pad", LoadCommand.pad); -} - -void MappingTraits<MachO::entry_point_command>::mapping( - IO &IO, MachO::entry_point_command &LoadCommand) { - IO.mapRequired("entryoff", LoadCommand.entryoff); - IO.mapRequired("stacksize", LoadCommand.stacksize); -} - -void MappingTraits<MachO::fvmfile_command>::mapping( - IO &IO, MachO::fvmfile_command &LoadCommand) { - IO.mapRequired("name", LoadCommand.name); - IO.mapRequired("header_addr", LoadCommand.header_addr); -} - -void MappingTraits<MachO::fvmlib>::mapping(IO &IO, MachO::fvmlib &FVMLib) { - IO.mapRequired("name", FVMLib.name); - IO.mapRequired("minor_version", FVMLib.minor_version); - IO.mapRequired("header_addr", FVMLib.header_addr); -} - -void MappingTraits<MachO::fvmlib_command>::mapping( - IO &IO, MachO::fvmlib_command &LoadCommand) { - IO.mapRequired("fvmlib", LoadCommand.fvmlib); -} - -void MappingTraits<MachO::ident_command>::mapping( - IO &IO, MachO::ident_command &LoadCommand) {} - -void MappingTraits<MachO::linkedit_data_command>::mapping( - IO &IO, MachO::linkedit_data_command &LoadCommand) { - IO.mapRequired("dataoff", LoadCommand.dataoff); - IO.mapRequired("datasize", LoadCommand.datasize); -} - -void MappingTraits<MachO::linker_option_command>::mapping( - IO &IO, MachO::linker_option_command &LoadCommand) { - IO.mapRequired("count", LoadCommand.count); -} - -void MappingTraits<MachO::prebind_cksum_command>::mapping( - IO &IO, MachO::prebind_cksum_command &LoadCommand) { - IO.mapRequired("cksum", LoadCommand.cksum); -} - -void MappingTraits<MachO::load_command>::mapping( - IO &IO, MachO::load_command &LoadCommand) {} - -void MappingTraits<MachO::prebound_dylib_command>::mapping( - IO &IO, MachO::prebound_dylib_command &LoadCommand) { - IO.mapRequired("name", LoadCommand.name); - IO.mapRequired("nmodules", LoadCommand.nmodules); - IO.mapRequired("linked_modules", LoadCommand.linked_modules); -} - -void MappingTraits<MachO::routines_command>::mapping( - IO &IO, MachO::routines_command &LoadCommand) { - IO.mapRequired("init_address", LoadCommand.init_address); - IO.mapRequired("init_module", LoadCommand.init_module); - IO.mapRequired("reserved1", LoadCommand.reserved1); - IO.mapRequired("reserved2", LoadCommand.reserved2); - IO.mapRequired("reserved3", LoadCommand.reserved3); - IO.mapRequired("reserved4", LoadCommand.reserved4); - IO.mapRequired("reserved5", LoadCommand.reserved5); - IO.mapRequired("reserved6", LoadCommand.reserved6); -} - -void MappingTraits<MachO::routines_command_64>::mapping( - IO &IO, MachO::routines_command_64 &LoadCommand) { - IO.mapRequired("init_address", LoadCommand.init_address); - IO.mapRequired("init_module", LoadCommand.init_module); - IO.mapRequired("reserved1", LoadCommand.reserved1); - IO.mapRequired("reserved2", LoadCommand.reserved2); - IO.mapRequired("reserved3", LoadCommand.reserved3); - IO.mapRequired("reserved4", LoadCommand.reserved4); - IO.mapRequired("reserved5", LoadCommand.reserved5); - IO.mapRequired("reserved6", LoadCommand.reserved6); -} - -void MappingTraits<MachO::rpath_command>::mapping( - IO &IO, MachO::rpath_command &LoadCommand) { - IO.mapRequired("path", LoadCommand.path); -} - -void MappingTraits<MachO::section>::mapping(IO &IO, MachO::section &Section) { - IO.mapRequired("sectname", Section.sectname); - IO.mapRequired("segname", Section.segname); - IO.mapRequired("addr", Section.addr); - IO.mapRequired("size", Section.size); - IO.mapRequired("offset", Section.offset); - IO.mapRequired("align", Section.align); - IO.mapRequired("reloff", Section.reloff); - IO.mapRequired("nreloc", Section.nreloc); - IO.mapRequired("flags", Section.flags); - IO.mapRequired("reserved1", Section.reserved1); - IO.mapRequired("reserved2", Section.reserved2); -} - -void MappingTraits<MachO::section_64>::mapping(IO &IO, - MachO::section_64 &Section) { - IO.mapRequired("sectname", Section.sectname); - IO.mapRequired("segname", Section.segname); - IO.mapRequired("addr", Section.addr); - IO.mapRequired("size", Section.size); - IO.mapRequired("offset", Section.offset); - IO.mapRequired("align", Section.align); - IO.mapRequired("reloff", Section.reloff); - IO.mapRequired("nreloc", Section.nreloc); - IO.mapRequired("flags", Section.flags); - IO.mapRequired("reserved1", Section.reserved1); - IO.mapRequired("reserved2", Section.reserved2); - IO.mapRequired("reserved3", Section.reserved3); -} - -void MappingTraits<MachO::segment_command>::mapping( - IO &IO, MachO::segment_command &LoadCommand) { - IO.mapRequired("segname", LoadCommand.segname); - IO.mapRequired("vmaddr", LoadCommand.vmaddr); - IO.mapRequired("vmsize", LoadCommand.vmsize); - IO.mapRequired("fileoff", LoadCommand.fileoff); - IO.mapRequired("filesize", LoadCommand.filesize); - IO.mapRequired("maxprot", LoadCommand.maxprot); - IO.mapRequired("initprot", LoadCommand.initprot); - IO.mapRequired("nsects", LoadCommand.nsects); - IO.mapRequired("flags", LoadCommand.flags); -} - -void MappingTraits<MachO::segment_command_64>::mapping( - IO &IO, MachO::segment_command_64 &LoadCommand) { - IO.mapRequired("segname", LoadCommand.segname); - IO.mapRequired("vmaddr", LoadCommand.vmaddr); - IO.mapRequired("vmsize", LoadCommand.vmsize); - IO.mapRequired("fileoff", LoadCommand.fileoff); - IO.mapRequired("filesize", LoadCommand.filesize); - IO.mapRequired("maxprot", LoadCommand.maxprot); - IO.mapRequired("initprot", LoadCommand.initprot); - IO.mapRequired("nsects", LoadCommand.nsects); - IO.mapRequired("flags", LoadCommand.flags); -} - -void MappingTraits<MachO::source_version_command>::mapping( - IO &IO, MachO::source_version_command &LoadCommand) { - IO.mapRequired("version", LoadCommand.version); -} - -void MappingTraits<MachO::sub_client_command>::mapping( - IO &IO, MachO::sub_client_command &LoadCommand) { - IO.mapRequired("client", LoadCommand.client); -} - -void MappingTraits<MachO::sub_framework_command>::mapping( - IO &IO, MachO::sub_framework_command &LoadCommand) { - IO.mapRequired("umbrella", LoadCommand.umbrella); -} - -void MappingTraits<MachO::sub_library_command>::mapping( - IO &IO, MachO::sub_library_command &LoadCommand) { - IO.mapRequired("sub_library", LoadCommand.sub_library); -} - -void MappingTraits<MachO::sub_umbrella_command>::mapping( - IO &IO, MachO::sub_umbrella_command &LoadCommand) { - IO.mapRequired("sub_umbrella", LoadCommand.sub_umbrella); -} - -void MappingTraits<MachO::symseg_command>::mapping( - IO &IO, MachO::symseg_command &LoadCommand) { - IO.mapRequired("offset", LoadCommand.offset); - IO.mapRequired("size", LoadCommand.size); -} - -void MappingTraits<MachO::symtab_command>::mapping( - IO &IO, MachO::symtab_command &LoadCommand) { - IO.mapRequired("symoff", LoadCommand.symoff); - IO.mapRequired("nsyms", LoadCommand.nsyms); - IO.mapRequired("stroff", LoadCommand.stroff); - IO.mapRequired("strsize", LoadCommand.strsize); -} - -void MappingTraits<MachO::thread_command>::mapping( - IO &IO, MachO::thread_command &LoadCommand) {} - -void MappingTraits<MachO::twolevel_hints_command>::mapping( - IO &IO, MachO::twolevel_hints_command &LoadCommand) { - IO.mapRequired("offset", LoadCommand.offset); - IO.mapRequired("nhints", LoadCommand.nhints); -} - -void MappingTraits<MachO::uuid_command>::mapping( - IO &IO, MachO::uuid_command &LoadCommand) { - IO.mapRequired("uuid", LoadCommand.uuid); -} - -void MappingTraits<MachO::version_min_command>::mapping( - IO &IO, MachO::version_min_command &LoadCommand) { - IO.mapRequired("version", LoadCommand.version); - IO.mapRequired("sdk", LoadCommand.sdk); -} - -void MappingTraits<MachO::note_command>::mapping( - IO &IO, MachO::note_command &LoadCommand) { - IO.mapRequired("data_owner", LoadCommand.data_owner); - IO.mapRequired("offset", LoadCommand.offset); - IO.mapRequired("size", LoadCommand.size); -} - -void MappingTraits<MachO::build_version_command>::mapping( - IO &IO, MachO::build_version_command &LoadCommand) { - IO.mapRequired("platform", LoadCommand.platform); - IO.mapRequired("minos", LoadCommand.minos); - IO.mapRequired("sdk", LoadCommand.sdk); - IO.mapRequired("ntools", LoadCommand.ntools); -} - -} // end namespace yaml - -} // end namespace llvm diff --git a/gnu/llvm/lib/ObjectYAML/ObjectYAML.cpp b/gnu/llvm/lib/ObjectYAML/ObjectYAML.cpp deleted file mode 100644 index 850c1a5a06c..00000000000 --- a/gnu/llvm/lib/ObjectYAML/ObjectYAML.cpp +++ /dev/null @@ -1,63 +0,0 @@ -//===- ObjectYAML.cpp - YAML utilities for object files -------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines a wrapper class for handling tagged YAML input -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/ObjectYAML.h" -#include "llvm/ADT/Twine.h" -#include "llvm/Support/YAMLParser.h" -#include "llvm/Support/YAMLTraits.h" -#include <string> - -using namespace llvm; -using namespace yaml; - -void MappingTraits<YamlObjectFile>::mapping(IO &IO, - YamlObjectFile &ObjectFile) { - if (IO.outputting()) { - if (ObjectFile.Elf) - MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf); - if (ObjectFile.Coff) - MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff); - if (ObjectFile.MachO) - MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO); - if (ObjectFile.FatMachO) - MappingTraits<MachOYAML::UniversalBinary>::mapping(IO, - *ObjectFile.FatMachO); - } else { - if (IO.mapTag("!ELF")) { - ObjectFile.Elf.reset(new ELFYAML::Object()); - MappingTraits<ELFYAML::Object>::mapping(IO, *ObjectFile.Elf); - } else if (IO.mapTag("!COFF")) { - ObjectFile.Coff.reset(new COFFYAML::Object()); - MappingTraits<COFFYAML::Object>::mapping(IO, *ObjectFile.Coff); - } else if (IO.mapTag("!mach-o")) { - ObjectFile.MachO.reset(new MachOYAML::Object()); - MappingTraits<MachOYAML::Object>::mapping(IO, *ObjectFile.MachO); - } else if (IO.mapTag("!fat-mach-o")) { - ObjectFile.FatMachO.reset(new MachOYAML::UniversalBinary()); - MappingTraits<MachOYAML::UniversalBinary>::mapping(IO, - *ObjectFile.FatMachO); - } else if (IO.mapTag("!WASM")) { - ObjectFile.Wasm.reset(new WasmYAML::Object()); - MappingTraits<WasmYAML::Object>::mapping(IO, *ObjectFile.Wasm); - } else { - Input &In = (Input &)IO; - std::string Tag = In.getCurrentNode()->getRawTag(); - if (Tag.empty()) - IO.setError("YAML Object File missing document type tag!"); - else - IO.setError( - Twine("YAML Object File unsupported document type tag '") + - Twine(Tag) + Twine("'!")); - } - } -} diff --git a/gnu/llvm/lib/ObjectYAML/WasmYAML.cpp b/gnu/llvm/lib/ObjectYAML/WasmYAML.cpp deleted file mode 100644 index 47bf853e0d3..00000000000 --- a/gnu/llvm/lib/ObjectYAML/WasmYAML.cpp +++ /dev/null @@ -1,539 +0,0 @@ -//===- WasmYAML.cpp - Wasm YAMLIO implementation --------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines classes for handling the YAML representation of wasm. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/WasmYAML.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/Support/Casting.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/YAMLTraits.h" - -namespace llvm { - -namespace WasmYAML { - -// Declared here rather than in the header to comply with: -// http://llvm.org/docs/CodingStandards.html#provide-a-virtual-method-anchor-for-classes-in-headers -Section::~Section() = default; - -} // end namespace WasmYAML - -namespace yaml { - -void MappingTraits<WasmYAML::FileHeader>::mapping( - IO &IO, WasmYAML::FileHeader &FileHdr) { - IO.mapRequired("Version", FileHdr.Version); -} - -void MappingTraits<WasmYAML::Object>::mapping(IO &IO, - WasmYAML::Object &Object) { - IO.setContext(&Object); - IO.mapTag("!WASM", true); - IO.mapRequired("FileHeader", Object.Header); - IO.mapOptional("Sections", Object.Sections); - IO.setContext(nullptr); -} - -static void commonSectionMapping(IO &IO, WasmYAML::Section &Section) { - IO.mapRequired("Type", Section.Type); - IO.mapOptional("Relocations", Section.Relocations); -} - -static void sectionMapping(IO &IO, WasmYAML::DylinkSection &Section) { - commonSectionMapping(IO, Section); - IO.mapRequired("Name", Section.Name); - IO.mapRequired("MemorySize", Section.MemorySize); - IO.mapRequired("MemoryAlignment", Section.MemoryAlignment); - IO.mapRequired("TableSize", Section.TableSize); - IO.mapRequired("TableAlignment", Section.TableAlignment); - IO.mapRequired("Needed", Section.Needed); -} - -static void sectionMapping(IO &IO, WasmYAML::NameSection &Section) { - commonSectionMapping(IO, Section); - IO.mapRequired("Name", Section.Name); - IO.mapOptional("FunctionNames", Section.FunctionNames); -} - -static void sectionMapping(IO &IO, WasmYAML::LinkingSection &Section) { - commonSectionMapping(IO, Section); - IO.mapRequired("Name", Section.Name); - IO.mapRequired("Version", Section.Version); - IO.mapOptional("SymbolTable", Section.SymbolTable); - IO.mapOptional("SegmentInfo", Section.SegmentInfos); - IO.mapOptional("InitFunctions", Section.InitFunctions); - IO.mapOptional("Comdats", Section.Comdats); -} - -static void sectionMapping(IO &IO, WasmYAML::CustomSection &Section) { - commonSectionMapping(IO, Section); - IO.mapRequired("Name", Section.Name); - IO.mapRequired("Payload", Section.Payload); -} - -static void sectionMapping(IO &IO, WasmYAML::TypeSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Signatures", Section.Signatures); -} - -static void sectionMapping(IO &IO, WasmYAML::ImportSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Imports", Section.Imports); -} - -static void sectionMapping(IO &IO, WasmYAML::FunctionSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("FunctionTypes", Section.FunctionTypes); -} - -static void sectionMapping(IO &IO, WasmYAML::TableSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Tables", Section.Tables); -} - -static void sectionMapping(IO &IO, WasmYAML::MemorySection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Memories", Section.Memories); -} - -static void sectionMapping(IO &IO, WasmYAML::GlobalSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Globals", Section.Globals); -} - -static void sectionMapping(IO &IO, WasmYAML::EventSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Events", Section.Events); -} - -static void sectionMapping(IO &IO, WasmYAML::ExportSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Exports", Section.Exports); -} - -static void sectionMapping(IO &IO, WasmYAML::StartSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("StartFunction", Section.StartFunction); -} - -static void sectionMapping(IO &IO, WasmYAML::ElemSection &Section) { - commonSectionMapping(IO, Section); - IO.mapOptional("Segments", Section.Segments); -} - -static void sectionMapping(IO &IO, WasmYAML::CodeSection &Section) { - commonSectionMapping(IO, Section); - IO.mapRequired("Functions", Section.Functions); -} - -static void sectionMapping(IO &IO, WasmYAML::DataSection &Section) { - commonSectionMapping(IO, Section); - IO.mapRequired("Segments", Section.Segments); -} - -void MappingTraits<std::unique_ptr<WasmYAML::Section>>::mapping( - IO &IO, std::unique_ptr<WasmYAML::Section> &Section) { - WasmYAML::SectionType SectionType; - if (IO.outputting()) - SectionType = Section->Type; - else - IO.mapRequired("Type", SectionType); - - switch (SectionType) { - case wasm::WASM_SEC_CUSTOM: { - StringRef SectionName; - if (IO.outputting()) { - auto CustomSection = cast<WasmYAML::CustomSection>(Section.get()); - SectionName = CustomSection->Name; - } else { - IO.mapRequired("Name", SectionName); - } - if (SectionName == "dylink") { - if (!IO.outputting()) - Section.reset(new WasmYAML::DylinkSection()); - sectionMapping(IO, *cast<WasmYAML::DylinkSection>(Section.get())); - } else if (SectionName == "linking") { - if (!IO.outputting()) - Section.reset(new WasmYAML::LinkingSection()); - sectionMapping(IO, *cast<WasmYAML::LinkingSection>(Section.get())); - } else if (SectionName == "name") { - if (!IO.outputting()) - Section.reset(new WasmYAML::NameSection()); - sectionMapping(IO, *cast<WasmYAML::NameSection>(Section.get())); - } else { - if (!IO.outputting()) - Section.reset(new WasmYAML::CustomSection(SectionName)); - sectionMapping(IO, *cast<WasmYAML::CustomSection>(Section.get())); - } - break; - } - case wasm::WASM_SEC_TYPE: - if (!IO.outputting()) - Section.reset(new WasmYAML::TypeSection()); - sectionMapping(IO, *cast<WasmYAML::TypeSection>(Section.get())); - break; - case wasm::WASM_SEC_IMPORT: - if (!IO.outputting()) - Section.reset(new WasmYAML::ImportSection()); - sectionMapping(IO, *cast<WasmYAML::ImportSection>(Section.get())); - break; - case wasm::WASM_SEC_FUNCTION: - if (!IO.outputting()) - Section.reset(new WasmYAML::FunctionSection()); - sectionMapping(IO, *cast<WasmYAML::FunctionSection>(Section.get())); - break; - case wasm::WASM_SEC_TABLE: - if (!IO.outputting()) - Section.reset(new WasmYAML::TableSection()); - sectionMapping(IO, *cast<WasmYAML::TableSection>(Section.get())); - break; - case wasm::WASM_SEC_MEMORY: - if (!IO.outputting()) - Section.reset(new WasmYAML::MemorySection()); - sectionMapping(IO, *cast<WasmYAML::MemorySection>(Section.get())); - break; - case wasm::WASM_SEC_GLOBAL: - if (!IO.outputting()) - Section.reset(new WasmYAML::GlobalSection()); - sectionMapping(IO, *cast<WasmYAML::GlobalSection>(Section.get())); - break; - case wasm::WASM_SEC_EVENT: - if (!IO.outputting()) - Section.reset(new WasmYAML::EventSection()); - sectionMapping(IO, *cast<WasmYAML::EventSection>(Section.get())); - break; - case wasm::WASM_SEC_EXPORT: - if (!IO.outputting()) - Section.reset(new WasmYAML::ExportSection()); - sectionMapping(IO, *cast<WasmYAML::ExportSection>(Section.get())); - break; - case wasm::WASM_SEC_START: - if (!IO.outputting()) - Section.reset(new WasmYAML::StartSection()); - sectionMapping(IO, *cast<WasmYAML::StartSection>(Section.get())); - break; - case wasm::WASM_SEC_ELEM: - if (!IO.outputting()) - Section.reset(new WasmYAML::ElemSection()); - sectionMapping(IO, *cast<WasmYAML::ElemSection>(Section.get())); - break; - case wasm::WASM_SEC_CODE: - if (!IO.outputting()) - Section.reset(new WasmYAML::CodeSection()); - sectionMapping(IO, *cast<WasmYAML::CodeSection>(Section.get())); - break; - case wasm::WASM_SEC_DATA: - if (!IO.outputting()) - Section.reset(new WasmYAML::DataSection()); - sectionMapping(IO, *cast<WasmYAML::DataSection>(Section.get())); - break; - default: - llvm_unreachable("Unknown section type"); - } -} - -void ScalarEnumerationTraits<WasmYAML::SectionType>::enumeration( - IO &IO, WasmYAML::SectionType &Type) { -#define ECase(X) IO.enumCase(Type, #X, wasm::WASM_SEC_##X); - ECase(CUSTOM); - ECase(TYPE); - ECase(IMPORT); - ECase(FUNCTION); - ECase(TABLE); - ECase(MEMORY); - ECase(GLOBAL); - ECase(EVENT); - ECase(EXPORT); - ECase(START); - ECase(ELEM); - ECase(CODE); - ECase(DATA); -#undef ECase -} - -void MappingTraits<WasmYAML::Signature>::mapping( - IO &IO, WasmYAML::Signature &Signature) { - IO.mapRequired("Index", Signature.Index); - IO.mapRequired("ReturnType", Signature.ReturnType); - IO.mapRequired("ParamTypes", Signature.ParamTypes); -} - -void MappingTraits<WasmYAML::Table>::mapping(IO &IO, WasmYAML::Table &Table) { - IO.mapRequired("ElemType", Table.ElemType); - IO.mapRequired("Limits", Table.TableLimits); -} - -void MappingTraits<WasmYAML::Function>::mapping(IO &IO, - WasmYAML::Function &Function) { - IO.mapRequired("Index", Function.Index); - IO.mapRequired("Locals", Function.Locals); - IO.mapRequired("Body", Function.Body); -} - -void MappingTraits<WasmYAML::Relocation>::mapping( - IO &IO, WasmYAML::Relocation &Relocation) { - IO.mapRequired("Type", Relocation.Type); - IO.mapRequired("Index", Relocation.Index); - IO.mapRequired("Offset", Relocation.Offset); - IO.mapOptional("Addend", Relocation.Addend, 0); -} - -void MappingTraits<WasmYAML::NameEntry>::mapping( - IO &IO, WasmYAML::NameEntry &NameEntry) { - IO.mapRequired("Index", NameEntry.Index); - IO.mapRequired("Name", NameEntry.Name); -} - -void MappingTraits<WasmYAML::SegmentInfo>::mapping( - IO &IO, WasmYAML::SegmentInfo &SegmentInfo) { - IO.mapRequired("Index", SegmentInfo.Index); - IO.mapRequired("Name", SegmentInfo.Name); - IO.mapRequired("Alignment", SegmentInfo.Alignment); - IO.mapRequired("Flags", SegmentInfo.Flags); -} - -void MappingTraits<WasmYAML::LocalDecl>::mapping( - IO &IO, WasmYAML::LocalDecl &LocalDecl) { - IO.mapRequired("Type", LocalDecl.Type); - IO.mapRequired("Count", LocalDecl.Count); -} - -void MappingTraits<WasmYAML::Limits>::mapping(IO &IO, - WasmYAML::Limits &Limits) { - if (!IO.outputting() || Limits.Flags) - IO.mapOptional("Flags", Limits.Flags); - IO.mapRequired("Initial", Limits.Initial); - if (!IO.outputting() || Limits.Flags & wasm::WASM_LIMITS_FLAG_HAS_MAX) - IO.mapOptional("Maximum", Limits.Maximum); -} - -void MappingTraits<WasmYAML::ElemSegment>::mapping( - IO &IO, WasmYAML::ElemSegment &Segment) { - IO.mapRequired("Offset", Segment.Offset); - IO.mapRequired("Functions", Segment.Functions); -} - -void MappingTraits<WasmYAML::Import>::mapping(IO &IO, - WasmYAML::Import &Import) { - IO.mapRequired("Module", Import.Module); - IO.mapRequired("Field", Import.Field); - IO.mapRequired("Kind", Import.Kind); - if (Import.Kind == wasm::WASM_EXTERNAL_FUNCTION) { - IO.mapRequired("SigIndex", Import.SigIndex); - } else if (Import.Kind == wasm::WASM_EXTERNAL_GLOBAL) { - IO.mapRequired("GlobalType", Import.GlobalImport.Type); - IO.mapRequired("GlobalMutable", Import.GlobalImport.Mutable); - } else if (Import.Kind == wasm::WASM_EXTERNAL_EVENT) { - IO.mapRequired("EventAttribute", Import.EventImport.Attribute); - IO.mapRequired("EventSigIndex", Import.EventImport.SigIndex); - } else if (Import.Kind == wasm::WASM_EXTERNAL_TABLE) { - IO.mapRequired("Table", Import.TableImport); - } else if (Import.Kind == wasm::WASM_EXTERNAL_MEMORY) { - IO.mapRequired("Memory", Import.Memory); - } else { - llvm_unreachable("unhandled import type"); - } -} - -void MappingTraits<WasmYAML::Export>::mapping(IO &IO, - WasmYAML::Export &Export) { - IO.mapRequired("Name", Export.Name); - IO.mapRequired("Kind", Export.Kind); - IO.mapRequired("Index", Export.Index); -} - -void MappingTraits<WasmYAML::Global>::mapping(IO &IO, - WasmYAML::Global &Global) { - IO.mapRequired("Index", Global.Index); - IO.mapRequired("Type", Global.Type); - IO.mapRequired("Mutable", Global.Mutable); - IO.mapRequired("InitExpr", Global.InitExpr); -} - -void MappingTraits<wasm::WasmInitExpr>::mapping(IO &IO, - wasm::WasmInitExpr &Expr) { - WasmYAML::Opcode Op = Expr.Opcode; - IO.mapRequired("Opcode", Op); - Expr.Opcode = Op; - switch (Expr.Opcode) { - case wasm::WASM_OPCODE_I32_CONST: - IO.mapRequired("Value", Expr.Value.Int32); - break; - case wasm::WASM_OPCODE_I64_CONST: - IO.mapRequired("Value", Expr.Value.Int64); - break; - case wasm::WASM_OPCODE_F32_CONST: - IO.mapRequired("Value", Expr.Value.Float32); - break; - case wasm::WASM_OPCODE_F64_CONST: - IO.mapRequired("Value", Expr.Value.Float64); - break; - case wasm::WASM_OPCODE_GLOBAL_GET: - IO.mapRequired("Index", Expr.Value.Global); - break; - } -} - -void MappingTraits<WasmYAML::DataSegment>::mapping( - IO &IO, WasmYAML::DataSegment &Segment) { - IO.mapOptional("SectionOffset", Segment.SectionOffset); - IO.mapRequired("MemoryIndex", Segment.MemoryIndex); - IO.mapRequired("Offset", Segment.Offset); - IO.mapRequired("Content", Segment.Content); -} - -void MappingTraits<WasmYAML::InitFunction>::mapping( - IO &IO, WasmYAML::InitFunction &Init) { - IO.mapRequired("Priority", Init.Priority); - IO.mapRequired("Symbol", Init.Symbol); -} - -void ScalarEnumerationTraits<WasmYAML::ComdatKind>::enumeration( - IO &IO, WasmYAML::ComdatKind &Kind) { -#define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_COMDAT_##X); - ECase(FUNCTION); - ECase(DATA); -#undef ECase -} - -void MappingTraits<WasmYAML::ComdatEntry>::mapping( - IO &IO, WasmYAML::ComdatEntry &ComdatEntry) { - IO.mapRequired("Kind", ComdatEntry.Kind); - IO.mapRequired("Index", ComdatEntry.Index); -} - -void MappingTraits<WasmYAML::Comdat>::mapping(IO &IO, - WasmYAML::Comdat &Comdat) { - IO.mapRequired("Name", Comdat.Name); - IO.mapRequired("Entries", Comdat.Entries); -} - -void MappingTraits<WasmYAML::SymbolInfo>::mapping(IO &IO, - WasmYAML::SymbolInfo &Info) { - IO.mapRequired("Index", Info.Index); - IO.mapRequired("Kind", Info.Kind); - IO.mapRequired("Name", Info.Name); - IO.mapRequired("Flags", Info.Flags); - if (Info.Kind == wasm::WASM_SYMBOL_TYPE_FUNCTION) { - IO.mapRequired("Function", Info.ElementIndex); - } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_GLOBAL) { - IO.mapRequired("Global", Info.ElementIndex); - } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_EVENT) { - IO.mapRequired("Event", Info.ElementIndex); - } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_DATA) { - if ((Info.Flags & wasm::WASM_SYMBOL_UNDEFINED) == 0) { - IO.mapRequired("Segment", Info.DataRef.Segment); - IO.mapOptional("Offset", Info.DataRef.Offset, 0u); - IO.mapRequired("Size", Info.DataRef.Size); - } - } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_SECTION) { - IO.mapRequired("Section", Info.ElementIndex); - } else { - llvm_unreachable("unsupported symbol kind"); - } -} - -void MappingTraits<WasmYAML::Event>::mapping(IO &IO, WasmYAML::Event &Event) { - IO.mapRequired("Index", Event.Index); - IO.mapRequired("Attribute", Event.Attribute); - IO.mapRequired("SigIndex", Event.SigIndex); -} - -void ScalarBitSetTraits<WasmYAML::LimitFlags>::bitset( - IO &IO, WasmYAML::LimitFlags &Value) { -#define BCase(X) IO.bitSetCase(Value, #X, wasm::WASM_LIMITS_FLAG_##X) - BCase(HAS_MAX); - BCase(IS_SHARED); -#undef BCase -} - -void ScalarBitSetTraits<WasmYAML::SegmentFlags>::bitset( - IO &IO, WasmYAML::SegmentFlags &Value) {} - -void ScalarBitSetTraits<WasmYAML::SymbolFlags>::bitset( - IO &IO, WasmYAML::SymbolFlags &Value) { -#define BCaseMask(M, X) \ - IO.maskedBitSetCase(Value, #X, wasm::WASM_SYMBOL_##X, wasm::WASM_SYMBOL_##M) - // BCaseMask(BINDING_MASK, BINDING_GLOBAL); - BCaseMask(BINDING_MASK, BINDING_WEAK); - BCaseMask(BINDING_MASK, BINDING_LOCAL); - // BCaseMask(VISIBILITY_MASK, VISIBILITY_DEFAULT); - BCaseMask(VISIBILITY_MASK, VISIBILITY_HIDDEN); - BCaseMask(UNDEFINED, UNDEFINED); -#undef BCaseMask -} - -void ScalarEnumerationTraits<WasmYAML::SymbolKind>::enumeration( - IO &IO, WasmYAML::SymbolKind &Kind) { -#define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_SYMBOL_TYPE_##X); - ECase(FUNCTION); - ECase(DATA); - ECase(GLOBAL); - ECase(SECTION); - ECase(EVENT); -#undef ECase -} - -void ScalarEnumerationTraits<WasmYAML::ValueType>::enumeration( - IO &IO, WasmYAML::ValueType &Type) { -#define ECase(X) IO.enumCase(Type, #X, wasm::WASM_TYPE_##X); - ECase(I32); - ECase(I64); - ECase(F32); - ECase(F64); - ECase(V128); - ECase(FUNCREF); - ECase(FUNC); - ECase(NORESULT); -#undef ECase -} - -void ScalarEnumerationTraits<WasmYAML::ExportKind>::enumeration( - IO &IO, WasmYAML::ExportKind &Kind) { -#define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_EXTERNAL_##X); - ECase(FUNCTION); - ECase(TABLE); - ECase(MEMORY); - ECase(GLOBAL); - ECase(EVENT); -#undef ECase -} - -void ScalarEnumerationTraits<WasmYAML::Opcode>::enumeration( - IO &IO, WasmYAML::Opcode &Code) { -#define ECase(X) IO.enumCase(Code, #X, wasm::WASM_OPCODE_##X); - ECase(END); - ECase(I32_CONST); - ECase(I64_CONST); - ECase(F64_CONST); - ECase(F32_CONST); - ECase(GLOBAL_GET); -#undef ECase -} - -void ScalarEnumerationTraits<WasmYAML::TableType>::enumeration( - IO &IO, WasmYAML::TableType &Type) { -#define ECase(X) IO.enumCase(Type, #X, wasm::WASM_TYPE_##X); - ECase(FUNCREF); -#undef ECase -} - -void ScalarEnumerationTraits<WasmYAML::RelocType>::enumeration( - IO &IO, WasmYAML::RelocType &Type) { -#define WASM_RELOC(name, value) IO.enumCase(Type, #name, wasm::name); -#include "llvm/BinaryFormat/WasmRelocs.def" -#undef WASM_RELOC -} - -} // end namespace yaml - -} // end namespace llvm diff --git a/gnu/llvm/lib/ObjectYAML/YAML.cpp b/gnu/llvm/lib/ObjectYAML/YAML.cpp deleted file mode 100644 index 67b5764eada..00000000000 --- a/gnu/llvm/lib/ObjectYAML/YAML.cpp +++ /dev/null @@ -1,62 +0,0 @@ -//===- YAML.cpp - YAMLIO utilities for object files -----------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines utility classes for handling the YAML representation of -// object files. -// -//===----------------------------------------------------------------------===// - -#include "llvm/ObjectYAML/YAML.h" -#include "llvm/ADT/StringExtras.h" -#include "llvm/Support/raw_ostream.h" -#include <cctype> -#include <cstdint> - -using namespace llvm; - -void yaml::ScalarTraits<yaml::BinaryRef>::output( - const yaml::BinaryRef &Val, void *, raw_ostream &Out) { - Val.writeAsHex(Out); -} - -StringRef yaml::ScalarTraits<yaml::BinaryRef>::input(StringRef Scalar, void *, - yaml::BinaryRef &Val) { - if (Scalar.size() % 2 != 0) - return "BinaryRef hex string must contain an even number of nybbles."; - // TODO: Can we improve YAMLIO to permit a more accurate diagnostic here? - // (e.g. a caret pointing to the offending character). - for (unsigned I = 0, N = Scalar.size(); I != N; ++I) - if (!isxdigit(Scalar[I])) - return "BinaryRef hex string must contain only hex digits."; - Val = yaml::BinaryRef(Scalar); - return {}; -} - -void yaml::BinaryRef::writeAsBinary(raw_ostream &OS) const { - if (!DataIsHexString) { - OS.write((const char *)Data.data(), Data.size()); - return; - } - for (unsigned I = 0, N = Data.size(); I != N; I += 2) { - uint8_t Byte; - StringRef((const char *)&Data[I], 2).getAsInteger(16, Byte); - OS.write(Byte); - } -} - -void yaml::BinaryRef::writeAsHex(raw_ostream &OS) const { - if (binary_size() == 0) - return; - if (DataIsHexString) { - OS.write((const char *)Data.data(), Data.size()); - return; - } - for (uint8_t Byte : Data) - OS << hexdigit(Byte >> 4) << hexdigit(Byte & 0xf); -} |
