From 2bbe3781471936fa0c37ad738fa86b72997c6831 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 17 May 2013 22:58:42 +0000 Subject: [PATCH] Convert obj2yaml to use yamlio. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182169 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/COFFYaml.h | 136 ++++++++++++ lib/Object/CMakeLists.txt | 1 + lib/Object/COFFYAML.cpp | 279 ++++++++++++++++++++++++ test/Object/obj2yaml.test | 174 +++++++-------- tools/obj2yaml/coff2yaml.cpp | 388 +++++++-------------------------- tools/yaml2obj/CMakeLists.txt | 2 + tools/yaml2obj/yaml2obj.cpp | 361 +----------------------------- 7 files changed, 580 insertions(+), 761 deletions(-) create mode 100644 include/llvm/Object/COFFYaml.h create mode 100644 lib/Object/COFFYAML.cpp diff --git a/include/llvm/Object/COFFYaml.h b/include/llvm/Object/COFFYaml.h new file mode 100644 index 00000000000..08cbab428c0 --- /dev/null +++ b/include/llvm/Object/COFFYaml.h @@ -0,0 +1,136 @@ +//===- COFFYAML.h - COFF YAMLIO implementation ------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file declares classes for handling the YAML representation of COFF. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_OBJECT_COFFYAML_H +#define LLVM_OBJECT_COFFYAML_H + + +#include "llvm/Support/COFF.h" +#include "llvm/Support/YAMLTraits.h" + +namespace llvm { + +namespace COFF { +inline Characteristics operator|(Characteristics a, Characteristics b) { + uint32_t Ret = static_cast(a) | static_cast(b); + return static_cast(Ret); +} + +inline SectionCharacteristics operator|(SectionCharacteristics a, + SectionCharacteristics b) { + uint32_t Ret = static_cast(a) | static_cast(b); + return static_cast(Ret); +} +} + +// The structure of the yaml files is not an exact 1:1 match to COFF. In order +// to use yaml::IO, we use these structures which are closer to the source. +namespace COFFYAML { + struct Section { + COFF::section Header; + unsigned Alignment; + StringRef SectionData; + std::vector Relocations; + StringRef Name; + Section(); + }; + + struct Symbol { + COFF::symbol Header; + COFF::SymbolBaseType SimpleType; + COFF::SymbolComplexType ComplexType; + StringRef AuxiliaryData; + StringRef Name; + Symbol(); + }; + + struct Object { + COFF::header Header; + std::vector
Sections; + std::vector Symbols; + Object(); + }; +} +} + +LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section) +LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol) +LLVM_YAML_IS_SEQUENCE_VECTOR(COFF::relocation) + +namespace llvm { +namespace yaml { + +template <> +struct ScalarEnumerationTraits { + static void enumeration(IO &IO, COFF::MachineTypes &Value); +}; + +template <> +struct ScalarEnumerationTraits { + static void enumeration(IO &IO, COFF::SymbolBaseType &Value); +}; + +template <> +struct ScalarEnumerationTraits { + static void enumeration(IO &IO, COFF::SymbolStorageClass &Value); +}; + +template <> +struct ScalarEnumerationTraits { + static void enumeration(IO &IO, COFF::SymbolComplexType &Value); +}; + +template <> +struct ScalarEnumerationTraits { + static void enumeration(IO &IO, COFF::RelocationTypeX86 &Value); +}; + +template <> +struct ScalarBitSetTraits { + static void bitset(IO &IO, COFF::Characteristics &Value); +}; + +template <> +struct ScalarBitSetTraits { + static void bitset(IO &IO, COFF::SectionCharacteristics &Value); +}; + +template <> +struct MappingTraits { + static void mapping(IO &IO, COFF::relocation &Rel); +}; + +template <> +struct MappingTraits { + static void mapping(IO &IO, COFF::header &H); +}; + +template <> +struct MappingTraits { + static void mapping(IO &IO, COFFYAML::Symbol &S); +}; + +template <> +struct MappingTraits { + static void mapping(IO &IO, COFFYAML::Section &Sec); +}; + +template <> +struct MappingTraits { + static void mapping(IO &IO, COFFYAML::Object &Obj); +}; + +} // end namespace yaml +} // end namespace llvm + +#endif diff --git a/lib/Object/CMakeLists.txt b/lib/Object/CMakeLists.txt index 4ed129f467e..0ca0c324014 100644 --- a/lib/Object/CMakeLists.txt +++ b/lib/Object/CMakeLists.txt @@ -2,6 +2,7 @@ add_llvm_library(LLVMObject Archive.cpp Binary.cpp COFFObjectFile.cpp + COFFYAML.cpp ELFObjectFile.cpp Error.cpp MachOObjectFile.cpp diff --git a/lib/Object/COFFYAML.cpp b/lib/Object/COFFYAML.cpp new file mode 100644 index 00000000000..7a154525e2a --- /dev/null +++ b/lib/Object/COFFYAML.cpp @@ -0,0 +1,279 @@ +//===- 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/Object/COFFYaml.h" + +#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)); } +} + +namespace yaml { +void ScalarEnumerationTraits::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_ARMV7); + 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::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::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::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::enumeration( + IO &IO, COFF::RelocationTypeX86 &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); + 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); +} +#undef ECase + +#define BCase(X) IO.bitSetCase(Value, #X, COFF::X); +void ScalarBitSetTraits::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::bitset( + IO &IO, COFF::SectionCharacteristics &Value) { + 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); +} +#undef BCase + +namespace { +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 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; +}; + +struct NType { + NType(IO &) : Type(COFF::RelocationTypeX86(0)) {} + NType(IO &, uint16_t T) : Type(COFF::RelocationTypeX86(T)) {} + uint16_t denormalize(IO &) { return Type; } + COFF::RelocationTypeX86 Type; +}; + +} + +void MappingTraits::mapping(IO &IO, COFF::relocation &Rel) { + MappingNormalization NT(IO, Rel.Type); + + IO.mapRequired("VirtualAddress", Rel.VirtualAddress); + IO.mapRequired("SymbolTableIndex", Rel.SymbolTableIndex); + IO.mapRequired("Type", NT->Type); +} + +void MappingTraits::mapping(IO &IO, COFF::header &H) { + MappingNormalization NM(IO, H.Machine); + MappingNormalization NC(IO, + H.Characteristics); + + IO.mapRequired("Machine", NM->Machine); + IO.mapOptional("Characteristics", NC->Characteristics); +} + +void MappingTraits::mapping(IO &IO, COFFYAML::Symbol &S) { + MappingNormalization 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("NumberOfAuxSymbols", S.Header.NumberOfAuxSymbols); + IO.mapOptional("AuxiliaryData", S.AuxiliaryData); +} + +void MappingTraits::mapping(IO &IO, COFFYAML::Section &Sec) { + MappingNormalization NC( + IO, Sec.Header.Characteristics); + IO.mapRequired("Name", Sec.Name); + IO.mapRequired("Characteristics", NC->Characteristics); + IO.mapOptional("Alignment", Sec.Alignment); + IO.mapRequired("SectionData", Sec.SectionData); + IO.mapOptional("Relocations", Sec.Relocations); +} + +void MappingTraits::mapping(IO &IO, COFFYAML::Object &Obj) { + IO.mapRequired("header", Obj.Header); + IO.mapRequired("sections", Obj.Sections); + IO.mapRequired("symbols", Obj.Symbols); +} + +} +} diff --git a/test/Object/obj2yaml.test b/test/Object/obj2yaml.test index 0d96fd2bfd8..5c145e87d5d 100644 --- a/test/Object/obj2yaml.test +++ b/test/Object/obj2yaml.test @@ -2,169 +2,151 @@ RUN: obj2yaml %p/Inputs/trivial-object-test.coff-i386 | FileCheck %s --check-pre RUN: obj2yaml %p/Inputs/trivial-object-test.coff-x86-64 | FileCheck %s --check-prefix COFF-X86-64 -COFF-I386: header: !Header -COFF-I386-NEXT: Machine: IMAGE_FILE_MACHINE_I386 # (0x14c) +COFF-I386: header: +COFF-I386-NEXT: Machine: IMAGE_FILE_MACHINE_I386 COFF-I386: sections: -COFF-I386-NEXT: - !Section -COFF-I386-NEXT: Name: .text -COFF-I386-NEXT: Characteristics: [IMAGE_SCN_CNT_CODE, IMAGE_SCN_ALIGN_16BYTES, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ, ] # 0x60500020 -COFF-I386-NEXT: SectionData: !hex "83EC0CC744240800000000C7042400000000E800000000E8000000008B44240883C40CC3" # |....D$.......$...............D$.....| +COFF-I386-NEXT: - Name: .text +COFF-I386-NEXT: Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] +COFF-I386-NEXT: Alignment: 16 +COFF-I386-NEXT: SectionData: 83EC0CC744240800000000C7042400000000E800000000E8000000008B44240883C40CC3 COFF-I386: Relocations: -COFF-I386-NEXT: - !Relocation -COFF-I386-NEXT: VirtualAddress: 0xe +COFF-I386-NEXT: - VirtualAddress: 14 COFF-I386-NEXT: SymbolTableIndex: 5 COFF-I386-NEXT: Type: IMAGE_REL_I386_DIR32 -COFF-I386: - !Relocation -COFF-I386-NEXT: VirtualAddress: 0x13 +COFF-I386: - VirtualAddress: 19 COFF-I386-NEXT: SymbolTableIndex: 6 COFF-I386-NEXT: Type: IMAGE_REL_I386_REL32 -COFF-I386: - !Relocation -COFF-I386-NEXT: VirtualAddress: 0x18 +COFF-I386: - VirtualAddress: 24 COFF-I386-NEXT: SymbolTableIndex: 7 COFF-I386-NEXT: Type: IMAGE_REL_I386_REL32 -COFF-I386: - !Section -COFF-I386-NEXT: Name: .data -COFF-I386-NEXT: Characteristics: [IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_ALIGN_1BYTES, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE, ] # 0xc0100040 -COFF-I386-NEXT: SectionData: !hex "48656C6C6F20576F726C642100" # |Hello World!.| +COFF-I386: - Name: .data +COFF-I386-NEXT: Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] +COFF-I386-NEXT: Alignment: 1 +COFF-I386-NEXT: SectionData: 48656C6C6F20576F726C642100 COFF-I386: symbols: -COFF-I386-NEXT: - !Symbol -COFF-I386-NEXT: Name: .text +COFF-I386-NEXT: - Name: .text COFF-I386-NEXT: Value: 0 COFF-I386-NEXT: SectionNumber: 1 -COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC COFF-I386-NEXT: NumberOfAuxSymbols: 1 -COFF-I386-NEXT: AuxillaryData: !hex "240000000300000000000000010000000000" # |$.................| +COFF-I386-NEXT: AuxiliaryData: 240000000300000000000000010000000000 -COFF-I386: - !Symbol -COFF-I386-NEXT: Name: .data +COFF-I386: - Name: .data COFF-I386-NEXT: Value: 0 COFF-I386-NEXT: SectionNumber: 2 -COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC COFF-I386-NEXT: NumberOfAuxSymbols: 1 -COFF-I386-NEXT: AuxillaryData: !hex "0D0000000000000000000000020000000000" # |..................| +COFF-I386-NEXT: AuxiliaryData: 0D0000000000000000000000020000000000 -COFF-I386: - !Symbol -COFF-I386-NEXT: Name: _main +COFF-I386: - Name: _main COFF-I386-NEXT: Value: 0 COFF-I386-NEXT: SectionNumber: 1 -COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_FUNCTION # (2) -COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_FUNCTION +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL -COFF-I386: - !Symbol -COFF-I386-NEXT: Name: L_.str +COFF-I386: - Name: L_.str COFF-I386-NEXT: Value: 0 COFF-I386-NEXT: SectionNumber: 2 -COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC -COFF-I386: - !Symbol -COFF-I386-NEXT: Name: _puts +COFF-I386: - Name: _puts COFF-I386-NEXT: Value: 0 COFF-I386-NEXT: SectionNumber: 0 -COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL -COFF-I386: - !Symbol -COFF-I386-NEXT: Name: _SomeOtherFunction +COFF-I386: - Name: _SomeOtherFunction COFF-I386-NEXT: Value: 0 COFF-I386-NEXT: SectionNumber: 0 -COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) +COFF-I386-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-I386-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-I386-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL -COFF-X86-64: header: !Header -COFF-X86-64-NEXT: Machine: IMAGE_FILE_MACHINE_AMD64 # (0x8664) +COFF-X86-64: header: +COFF-X86-64-NEXT: Machine: IMAGE_FILE_MACHINE_AMD64 COFF-X86-64: sections: -COFF-X86-64-NEXT: - !Section -COFF-X86-64-NEXT: Name: .text -COFF-X86-64-NEXT: Characteristics: [IMAGE_SCN_CNT_CODE, IMAGE_SCN_ALIGN_16BYTES, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ, ] # 0x60500020 -COFF-X86-64-NEXT: SectionData: !hex "4883EC28C744242400000000488D0D00000000E800000000E8000000008B4424244883C428C3" # |H..(.D$$....H.................D$$H..(.| +COFF-X86-64-NEXT: - Name: .text +COFF-X86-64-NEXT: Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ] +COFF-X86-64-NEXT: Alignment: 16 +COFF-X86-64-NEXT: SectionData: 4883EC28C744242400000000488D0D00000000E800000000E8000000008B4424244883C428C3 COFF-X86-64: Relocations: -COFF-X86-64-NEXT: - !Relocation -COFF-X86-64-NEXT: VirtualAddress: 0xf +COFF-X86-64-NEXT: - VirtualAddress: 15 COFF-X86-64-NEXT: SymbolTableIndex: 5 COFF-X86-64-NEXT: Type: IMAGE_REL_AMD64_REL32 -COFF-X86-64: - !Relocation -COFF-X86-64-NEXT: VirtualAddress: 0x14 +COFF-X86-64: - VirtualAddress: 20 COFF-X86-64-NEXT: SymbolTableIndex: 6 COFF-X86-64-NEXT: Type: IMAGE_REL_AMD64_REL32 -COFF-X86-64: - !Relocation -COFF-X86-64-NEXT: VirtualAddress: 0x19 +COFF-X86-64: - VirtualAddress: 25 COFF-X86-64-NEXT: SymbolTableIndex: 7 COFF-X86-64-NEXT: Type: IMAGE_REL_AMD64_REL32 -COFF-X86-64: - !Section -COFF-X86-64-NEXT: Name: .data -COFF-X86-64-NEXT: Characteristics: [IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_ALIGN_1BYTES, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE, ] # 0xc0100040 -COFF-X86-64-NEXT: SectionData: !hex "48656C6C6F20576F726C642100" # |Hello World!.| +COFF-X86-64: - Name: .data +COFF-X86-64-NEXT: Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ] +COFF-X86-64-NEXT: Alignment: 1 +COFF-X86-64-NEXT: SectionData: 48656C6C6F20576F726C642100 COFF-X86-64: symbols: -COFF-X86-64-NEXT: - !Symbol -COFF-X86-64-NEXT: Name: .text +COFF-X86-64-NEXT: - Name: .text COFF-X86-64-NEXT: Value: 0 COFF-X86-64-NEXT: SectionNumber: 1 -COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC COFF-X86-64-NEXT: NumberOfAuxSymbols: 1 -COFF-X86-64-NEXT: AuxillaryData: !hex "260000000300000000000000010000000000" # |&.................| +COFF-X86-64-NEXT: AuxiliaryData: 260000000300000000000000010000000000 -COFF-X86-64: - !Symbol -COFF-X86-64-NEXT: Name: .data +COFF-X86-64: - Name: .data COFF-X86-64-NEXT: Value: 0 COFF-X86-64-NEXT: SectionNumber: 2 -COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC COFF-X86-64-NEXT: NumberOfAuxSymbols: 1 -COFF-X86-64-NEXT: AuxillaryData: !hex "0D0000000000000000000000020000000000" # |..................| +COFF-X86-64-NEXT: AuxiliaryData: 0D0000000000000000000000020000000000 -COFF-X86-64: - !Symbol -COFF-X86-64-NEXT: Name: main +COFF-X86-64: - Name: main COFF-X86-64-NEXT: Value: 0 COFF-X86-64-NEXT: SectionNumber: 1 -COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL -COFF-X86-64: - !Symbol -COFF-X86-64-NEXT: Name: L.str +COFF-X86-64: - Name: L.str COFF-X86-64-NEXT: Value: 0 COFF-X86-64-NEXT: SectionNumber: 2 -COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC # (3) +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_STATIC -COFF-X86-64: - !Symbol -COFF-X86-64-NEXT: Name: puts +COFF-X86-64: - Name: puts COFF-X86-64-NEXT: Value: 0 COFF-X86-64-NEXT: SectionNumber: 0 -COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL -COFF-X86-64: - !Symbol -COFF-X86-64-NEXT: Name: SomeOtherFunction +COFF-X86-64: - Name: SomeOtherFunction COFF-X86-64-NEXT: Value: 0 COFF-X86-64-NEXT: SectionNumber: 0 -COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL # (0) -COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL # (0) -COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2) +COFF-X86-64-NEXT: SimpleType: IMAGE_SYM_TYPE_NULL +COFF-X86-64-NEXT: ComplexType: IMAGE_SYM_DTYPE_NULL +COFF-X86-64-NEXT: StorageClass: IMAGE_SYM_CLASS_EXTERNAL diff --git a/tools/obj2yaml/coff2yaml.cpp b/tools/obj2yaml/coff2yaml.cpp index 5106a4a44b6..2a70cec09d9 100644 --- a/tools/obj2yaml/coff2yaml.cpp +++ b/tools/obj2yaml/coff2yaml.cpp @@ -9,346 +9,124 @@ #include "obj2yaml.h" #include "llvm/Object/COFF.h" +#include "llvm/Object/COFFYaml.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/YAMLTraits.h" using namespace llvm; -template -struct pod_pair { // I'd much rather use std::pair, but it's not a POD - One first; - Two second; -}; - -#define STRING_PAIR(x) {COFF::x, #x} -static const pod_pair -MachineTypePairs [] = { - STRING_PAIR(IMAGE_FILE_MACHINE_UNKNOWN), - STRING_PAIR(IMAGE_FILE_MACHINE_AM33), - STRING_PAIR(IMAGE_FILE_MACHINE_AMD64), - STRING_PAIR(IMAGE_FILE_MACHINE_ARM), - STRING_PAIR(IMAGE_FILE_MACHINE_ARMV7), - STRING_PAIR(IMAGE_FILE_MACHINE_EBC), - STRING_PAIR(IMAGE_FILE_MACHINE_I386), - STRING_PAIR(IMAGE_FILE_MACHINE_IA64), - STRING_PAIR(IMAGE_FILE_MACHINE_M32R), - STRING_PAIR(IMAGE_FILE_MACHINE_MIPS16), - STRING_PAIR(IMAGE_FILE_MACHINE_MIPSFPU), - STRING_PAIR(IMAGE_FILE_MACHINE_MIPSFPU16), - STRING_PAIR(IMAGE_FILE_MACHINE_POWERPC), - STRING_PAIR(IMAGE_FILE_MACHINE_POWERPCFP), - STRING_PAIR(IMAGE_FILE_MACHINE_R4000), - STRING_PAIR(IMAGE_FILE_MACHINE_SH3), - STRING_PAIR(IMAGE_FILE_MACHINE_SH3DSP), - STRING_PAIR(IMAGE_FILE_MACHINE_SH4), - STRING_PAIR(IMAGE_FILE_MACHINE_SH5), - STRING_PAIR(IMAGE_FILE_MACHINE_THUMB), - STRING_PAIR(IMAGE_FILE_MACHINE_WCEMIPSV2) -}; - -static const pod_pair -SectionCharacteristicsPairs1 [] = { - STRING_PAIR(IMAGE_SCN_TYPE_NO_PAD), - STRING_PAIR(IMAGE_SCN_CNT_CODE), - STRING_PAIR(IMAGE_SCN_CNT_INITIALIZED_DATA), - STRING_PAIR(IMAGE_SCN_CNT_UNINITIALIZED_DATA), - STRING_PAIR(IMAGE_SCN_LNK_OTHER), - STRING_PAIR(IMAGE_SCN_LNK_INFO), - STRING_PAIR(IMAGE_SCN_LNK_REMOVE), - STRING_PAIR(IMAGE_SCN_LNK_COMDAT), - STRING_PAIR(IMAGE_SCN_GPREL), - STRING_PAIR(IMAGE_SCN_MEM_PURGEABLE), - STRING_PAIR(IMAGE_SCN_MEM_16BIT), - STRING_PAIR(IMAGE_SCN_MEM_LOCKED), - STRING_PAIR(IMAGE_SCN_MEM_PRELOAD) -}; +namespace { -static const pod_pair -SectionCharacteristicsPairsAlignment [] = { - STRING_PAIR(IMAGE_SCN_ALIGN_1BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_2BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_4BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_8BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_16BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_32BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_64BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_128BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_256BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_512BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_1024BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_2048BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_4096BYTES), - STRING_PAIR(IMAGE_SCN_ALIGN_8192BYTES) -}; - -static const pod_pair -SectionCharacteristicsPairs2 [] = { - STRING_PAIR(IMAGE_SCN_LNK_NRELOC_OVFL), - STRING_PAIR(IMAGE_SCN_MEM_DISCARDABLE), - STRING_PAIR(IMAGE_SCN_MEM_NOT_CACHED), - STRING_PAIR(IMAGE_SCN_MEM_NOT_PAGED), - STRING_PAIR(IMAGE_SCN_MEM_SHARED), - STRING_PAIR(IMAGE_SCN_MEM_EXECUTE), - STRING_PAIR(IMAGE_SCN_MEM_READ), - STRING_PAIR(IMAGE_SCN_MEM_WRITE) -}; - -static const pod_pair -SymbolBaseTypePairs [] = { - STRING_PAIR(IMAGE_SYM_TYPE_NULL), - STRING_PAIR(IMAGE_SYM_TYPE_VOID), - STRING_PAIR(IMAGE_SYM_TYPE_CHAR), - STRING_PAIR(IMAGE_SYM_TYPE_SHORT), - STRING_PAIR(IMAGE_SYM_TYPE_INT), - STRING_PAIR(IMAGE_SYM_TYPE_LONG), - STRING_PAIR(IMAGE_SYM_TYPE_FLOAT), - STRING_PAIR(IMAGE_SYM_TYPE_DOUBLE), - STRING_PAIR(IMAGE_SYM_TYPE_STRUCT), - STRING_PAIR(IMAGE_SYM_TYPE_UNION), - STRING_PAIR(IMAGE_SYM_TYPE_ENUM), - STRING_PAIR(IMAGE_SYM_TYPE_MOE), - STRING_PAIR(IMAGE_SYM_TYPE_BYTE), - STRING_PAIR(IMAGE_SYM_TYPE_WORD), - STRING_PAIR(IMAGE_SYM_TYPE_UINT), - STRING_PAIR(IMAGE_SYM_TYPE_DWORD) -}; +class COFFDumper { + const object::COFFObjectFile &Obj; + COFFYAML::Object YAMLObj; + void dumpHeader(const object::coff_file_header *Header); + void dumpSections(unsigned numSections); + void dumpSymbols(unsigned numSymbols); + StringRef getHexString(ArrayRef Data); + std::vector Strings; -static const pod_pair -SymbolComplexTypePairs [] = { - STRING_PAIR(IMAGE_SYM_DTYPE_NULL), - STRING_PAIR(IMAGE_SYM_DTYPE_POINTER), - STRING_PAIR(IMAGE_SYM_DTYPE_FUNCTION), - STRING_PAIR(IMAGE_SYM_DTYPE_ARRAY), +public: + COFFDumper(const object::COFFObjectFile &Obj); + COFFYAML::Object &getYAMLObj(); }; -static const pod_pair -SymbolStorageClassPairs [] = { - STRING_PAIR(IMAGE_SYM_CLASS_END_OF_FUNCTION), - STRING_PAIR(IMAGE_SYM_CLASS_NULL), - STRING_PAIR(IMAGE_SYM_CLASS_AUTOMATIC), - STRING_PAIR(IMAGE_SYM_CLASS_EXTERNAL), - STRING_PAIR(IMAGE_SYM_CLASS_STATIC), - STRING_PAIR(IMAGE_SYM_CLASS_REGISTER), - STRING_PAIR(IMAGE_SYM_CLASS_EXTERNAL_DEF), - STRING_PAIR(IMAGE_SYM_CLASS_LABEL), - STRING_PAIR(IMAGE_SYM_CLASS_UNDEFINED_LABEL), - STRING_PAIR(IMAGE_SYM_CLASS_MEMBER_OF_STRUCT), - STRING_PAIR(IMAGE_SYM_CLASS_ARGUMENT), - STRING_PAIR(IMAGE_SYM_CLASS_STRUCT_TAG), - STRING_PAIR(IMAGE_SYM_CLASS_MEMBER_OF_UNION), - STRING_PAIR(IMAGE_SYM_CLASS_UNION_TAG), - STRING_PAIR(IMAGE_SYM_CLASS_TYPE_DEFINITION), - STRING_PAIR(IMAGE_SYM_CLASS_UNDEFINED_STATIC), - STRING_PAIR(IMAGE_SYM_CLASS_ENUM_TAG), - STRING_PAIR(IMAGE_SYM_CLASS_MEMBER_OF_ENUM), - STRING_PAIR(IMAGE_SYM_CLASS_REGISTER_PARAM), - STRING_PAIR(IMAGE_SYM_CLASS_BIT_FIELD), - STRING_PAIR(IMAGE_SYM_CLASS_BLOCK), - STRING_PAIR(IMAGE_SYM_CLASS_FUNCTION), - STRING_PAIR(IMAGE_SYM_CLASS_END_OF_STRUCT), - STRING_PAIR(IMAGE_SYM_CLASS_FILE), - STRING_PAIR(IMAGE_SYM_CLASS_SECTION), - STRING_PAIR(IMAGE_SYM_CLASS_WEAK_EXTERNAL), - STRING_PAIR(IMAGE_SYM_CLASS_CLR_TOKEN), -}; - -static const pod_pair -RelocationTypeX86Pairs [] = { - STRING_PAIR(IMAGE_REL_I386_ABSOLUTE), - STRING_PAIR(IMAGE_REL_I386_DIR16), - STRING_PAIR(IMAGE_REL_I386_REL16), - STRING_PAIR(IMAGE_REL_I386_DIR32), - STRING_PAIR(IMAGE_REL_I386_DIR32NB), - STRING_PAIR(IMAGE_REL_I386_SEG12), - STRING_PAIR(IMAGE_REL_I386_SECTION), - STRING_PAIR(IMAGE_REL_I386_SECREL), - STRING_PAIR(IMAGE_REL_I386_TOKEN), - STRING_PAIR(IMAGE_REL_I386_SECREL7), - STRING_PAIR(IMAGE_REL_I386_REL32), - STRING_PAIR(IMAGE_REL_AMD64_ABSOLUTE), - STRING_PAIR(IMAGE_REL_AMD64_ADDR64), - STRING_PAIR(IMAGE_REL_AMD64_ADDR32), - STRING_PAIR(IMAGE_REL_AMD64_ADDR32NB), - STRING_PAIR(IMAGE_REL_AMD64_REL32), - STRING_PAIR(IMAGE_REL_AMD64_REL32_1), - STRING_PAIR(IMAGE_REL_AMD64_REL32_2), - STRING_PAIR(IMAGE_REL_AMD64_REL32_3), - STRING_PAIR(IMAGE_REL_AMD64_REL32_4), - STRING_PAIR(IMAGE_REL_AMD64_REL32_5), - STRING_PAIR(IMAGE_REL_AMD64_SECTION), - STRING_PAIR(IMAGE_REL_AMD64_SECREL), - STRING_PAIR(IMAGE_REL_AMD64_SECREL7), - STRING_PAIR(IMAGE_REL_AMD64_TOKEN), - STRING_PAIR(IMAGE_REL_AMD64_SREL32), - STRING_PAIR(IMAGE_REL_AMD64_PAIR), - STRING_PAIR(IMAGE_REL_AMD64_SSPAN32) -}; - -static const pod_pair -RelocationTypesARMPairs [] = { - STRING_PAIR(IMAGE_REL_ARM_ABSOLUTE), - STRING_PAIR(IMAGE_REL_ARM_ADDR32), - STRING_PAIR(IMAGE_REL_ARM_ADDR32NB), - STRING_PAIR(IMAGE_REL_ARM_BRANCH24), - STRING_PAIR(IMAGE_REL_ARM_BRANCH11), - STRING_PAIR(IMAGE_REL_ARM_TOKEN), - STRING_PAIR(IMAGE_REL_ARM_BLX24), - STRING_PAIR(IMAGE_REL_ARM_BLX11), - STRING_PAIR(IMAGE_REL_ARM_SECTION), - STRING_PAIR(IMAGE_REL_ARM_SECREL), - STRING_PAIR(IMAGE_REL_ARM_MOV32A), - STRING_PAIR(IMAGE_REL_ARM_MOV32T), - STRING_PAIR(IMAGE_REL_ARM_BRANCH20T), - STRING_PAIR(IMAGE_REL_ARM_BRANCH24T), - STRING_PAIR(IMAGE_REL_ARM_BLX23T) -}; -#undef STRING_PAIR - -static raw_ostream &writeName(raw_ostream &Out, - const char *Name, std::size_t NameSize) { - for (std::size_t i = 0; i < NameSize; ++i) { - if (!Name[i]) break; - Out << Name[i]; - } - return Out; } -// Given an array of pod_pair, write all enums that match -template -static raw_ostream &writeBitMask(raw_ostream &Out, - const pod_pair (&Arr)[N], - unsigned long Val) { - for (std::size_t i = 0; i < N; ++i) - if (Val & Arr[i].first) - Out << Arr[i].second << ", "; - return Out; +static void check(error_code ec) { + if (ec) + report_fatal_error(ec.message()); } -// Given an array of pod_pair, look up a value -template -const char *nameLookup(const pod_pair (&Arr)[N], - unsigned long Val, const char *NotFound = NULL) { - T n = static_cast(Val); - for (std::size_t i = 0; i < N; ++i) - if (n == Arr[i].first) - return Arr[i].second; - return NotFound; +COFFDumper::COFFDumper(const object::COFFObjectFile &Obj) : Obj(Obj) { + const object::coff_file_header *Header; + check(Obj.getHeader(Header)); + dumpHeader(Header); + dumpSections(Header->NumberOfSections); + dumpSymbols(Header->NumberOfSymbols); } -static void yamlCOFFHeader(const object::coff_file_header *Header, - raw_ostream &Out) { - Out << "header: !Header\n"; - Out << " Machine: "; - Out << nameLookup(MachineTypePairs, Header->Machine, "# Unknown_MachineTypes") - << " # ("; - objyaml::writeHexNumber(Out, Header->Machine) << ")\n\n"; +void COFFDumper::dumpHeader(const object::coff_file_header *Header) { + YAMLObj.Header.Machine = Header->Machine; + YAMLObj.Header.Characteristics = Header->Characteristics; } - -static void yamlCOFFSections(object::COFFObjectFile &Obj, - std::size_t NumSections, raw_ostream &Out) { +void COFFDumper::dumpSections(unsigned NumSections) { + std::vector &Sections = YAMLObj.Sections; error_code ec; - Out << "sections:\n"; for (object::section_iterator iter = Obj.begin_sections(); iter != Obj.end_sections(); iter.increment(ec)) { - const object::coff_section *sect = Obj.getCOFFSection(iter); - - Out << " - !Section\n"; - Out << " Name: "; - writeName(Out, sect->Name, sizeof(sect->Name)) << '\n'; - - Out << " Characteristics: ["; - writeBitMask(Out, SectionCharacteristicsPairs1, sect->Characteristics); - Out << nameLookup(SectionCharacteristicsPairsAlignment, - sect->Characteristics & 0x00F00000, "# Unrecognized_IMAGE_SCN_ALIGN") - << ", "; - writeBitMask(Out, SectionCharacteristicsPairs2, sect->Characteristics); - Out << "] # "; - objyaml::writeHexNumber(Out, sect->Characteristics) << '\n'; + check(ec); + const object::coff_section *Sect = Obj.getCOFFSection(iter); + COFFYAML::Section Sec; + Sec.Name = Sect->Name; // FIXME: check the null termination! + uint32_t Characteristics = Sect->Characteristics; + Sec.Header.Characteristics = Characteristics; + Sec.Alignment = 1 << (((Characteristics >> 20) & 0xf) - 1); ArrayRef sectionData; - Obj.getSectionContents(sect, sectionData); - Out << " SectionData: "; - objyaml::writeHexStream(Out, sectionData) << '\n'; - if (iter->begin_relocations() != iter->end_relocations()) - Out << " Relocations:\n"; + Obj.getSectionContents(Sect, sectionData); + Sec.SectionData = getHexString(sectionData); + + std::vector Relocations; for (object::relocation_iterator rIter = iter->begin_relocations(); rIter != iter->end_relocations(); rIter.increment(ec)) { const object::coff_relocation *reloc = Obj.getCOFFRelocation(rIter); - - Out << " - !Relocation\n"; - Out << " VirtualAddress: " ; - objyaml::writeHexNumber(Out, reloc->VirtualAddress) << '\n'; - Out << " SymbolTableIndex: " << reloc->SymbolTableIndex << '\n'; - Out << " Type: " - << nameLookup(RelocationTypeX86Pairs, reloc->Type) << '\n'; - // TODO: Use the correct reloc type for the machine. - Out << '\n'; - } - + COFF::relocation Rel; + Rel.VirtualAddress = reloc->VirtualAddress; + Rel.SymbolTableIndex = reloc->SymbolTableIndex; + Rel.Type = reloc->Type; + Relocations.push_back(Rel); + } + Sec.Relocations = Relocations; + Sections.push_back(Sec); } } -static void yamlCOFFSymbols(object::COFFObjectFile &Obj, std::size_t NumSymbols, - raw_ostream &Out) { +void COFFDumper::dumpSymbols(unsigned NumSymbols) { error_code ec; - Out << "symbols:\n"; + std::vector &Symbols = YAMLObj.Symbols; for (object::symbol_iterator iter = Obj.begin_symbols(); iter != Obj.end_symbols(); iter.increment(ec)) { - // Gather all the info that we need - StringRef str; - const object::coff_symbol *symbol = Obj.getCOFFSymbol(iter); - Obj.getSymbolName(symbol, str); - std::size_t simpleType = symbol->getBaseType(); - std::size_t complexType = symbol->getComplexType(); - std::size_t storageClass = symbol->StorageClass; - - Out << " - !Symbol\n"; - Out << " Name: " << str << '\n'; - - Out << " Value: " << symbol->Value << '\n'; - Out << " SectionNumber: " << symbol->SectionNumber << '\n'; - - Out << " SimpleType: " - << nameLookup(SymbolBaseTypePairs, simpleType, - "# Unknown_SymbolBaseType") - << " # (" << simpleType << ")\n"; - - Out << " ComplexType: " - << nameLookup(SymbolComplexTypePairs, complexType, - "# Unknown_SymbolComplexType") - << " # (" << complexType << ")\n"; - - Out << " StorageClass: " - << nameLookup(SymbolStorageClassPairs, storageClass, - "# Unknown_StorageClass") - << " # (" << (int) storageClass << ")\n"; - - if (symbol->NumberOfAuxSymbols > 0) { - ArrayRef aux = Obj.getSymbolAuxData(symbol); - Out << " NumberOfAuxSymbols: " - << (int) symbol->NumberOfAuxSymbols << '\n'; - Out << " AuxillaryData: "; - objyaml::writeHexStream(Out, aux); - } + check(ec); + const object::coff_symbol *Symbol = Obj.getCOFFSymbol(iter); + COFFYAML::Symbol Sym; + Obj.getSymbolName(Symbol, Sym.Name); + Sym.SimpleType = COFF::SymbolBaseType(Symbol->getBaseType()); + Sym.ComplexType = COFF::SymbolComplexType(Symbol->getComplexType()); + Sym.Header.StorageClass = Symbol->StorageClass; + Sym.Header.Value = Symbol->Value; + Sym.Header.SectionNumber = Symbol->SectionNumber; + Sym.Header.NumberOfAuxSymbols = Symbol->NumberOfAuxSymbols; + Sym.AuxiliaryData = getHexString(Obj.getSymbolAuxData(Symbol)); + Symbols.push_back(Sym); + } +} - Out << '\n'; +StringRef COFFDumper::getHexString(ArrayRef Data) { + std::string S; + for (ArrayRef::iterator I = Data.begin(), E = Data.end(); I != E; + ++I) { + uint8_t Byte = *I; + S.push_back(hexdigit(Byte >> 4)); + S.push_back(hexdigit(Byte & 0xf)); } + Strings.push_back(S); + return Strings.back(); } +COFFYAML::Object &COFFDumper::getYAMLObj() { + return YAMLObj; +} -error_code coff2yaml(raw_ostream &Out, MemoryBuffer *TheObj) { +error_code coff2yaml(raw_ostream &Out, MemoryBuffer *Buff) { error_code ec; - object::COFFObjectFile obj(TheObj, ec); - if (ec) - return ec; - - const object::coff_file_header *hd; - ec = obj.getHeader(hd); - if (ec) - return ec; + object::COFFObjectFile Obj(Buff, ec); + check(ec); + COFFDumper Dumper(Obj); - yamlCOFFHeader(hd, Out); - yamlCOFFSections(obj, hd->NumberOfSections, Out); - yamlCOFFSymbols(obj, hd->NumberOfSymbols, Out); + yaml::Output Yout(Out); + Yout << Dumper.getYAMLObj(); - return ec; + return object::object_error::success; } diff --git a/tools/yaml2obj/CMakeLists.txt b/tools/yaml2obj/CMakeLists.txt index f8b11975246..0918ea365e4 100644 --- a/tools/yaml2obj/CMakeLists.txt +++ b/tools/yaml2obj/CMakeLists.txt @@ -1,3 +1,5 @@ +set(LLVM_LINK_COMPONENTS object) + add_llvm_utility(yaml2obj yaml2obj.cpp ) diff --git a/tools/yaml2obj/yaml2obj.cpp b/tools/yaml2obj/yaml2obj.cpp index 707b6b4d5c1..d9843463cc0 100644 --- a/tools/yaml2obj/yaml2obj.cpp +++ b/tools/yaml2obj/yaml2obj.cpp @@ -18,7 +18,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringSwitch.h" -#include "llvm/Support/COFF.h" +#include "llvm/Object/COFFYaml.h" #include "llvm/Support/Casting.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Endian.h" @@ -27,7 +27,6 @@ #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Signals.h" #include "llvm/Support/SourceMgr.h" -#include "llvm/Support/YAMLTraits.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/system_error.h" #include @@ -37,41 +36,6 @@ using namespace llvm; static cl::opt Input(cl::Positional, cl::desc(""), cl::init("-")); -// The structure of the yaml files is not an exact 1:1 match to COFF. In order -// to use yaml::IO, we use these structures which are closer to the source. -namespace COFFYAML { - struct Section { - COFF::section Header; - unsigned Alignment; - StringRef SectionData; - std::vector Relocations; - StringRef Name; - Section() { - memset(&Header, 0, sizeof(COFF::section)); - } - }; - - struct Symbol { - COFF::symbol Header; - COFF::SymbolBaseType SimpleType; - COFF::SymbolComplexType ComplexType; - StringRef AuxiliaryData; - StringRef Name; - Symbol() { - memset(&Header, 0, sizeof(COFF::symbol)); - } - }; - - struct Object { - COFF::header Header; - std::vector
Sections; - std::vector Symbols; - Object() { - memset(&Header, 0, sizeof(COFF::header)); - } - }; -} - /// This parses a yaml stream that represents a COFF object file. /// See docs/yaml2obj for the yaml scheema. struct COFFParser { @@ -322,329 +286,6 @@ bool writeCOFF(COFFParser &CP, raw_ostream &OS) { return true; } -LLVM_YAML_IS_SEQUENCE_VECTOR(COFF::relocation) -LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section) -LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol) - -namespace llvm { - -namespace COFF { - Characteristics operator|(Characteristics a, Characteristics b) { - uint32_t Ret = static_cast(a) | static_cast(b); - return static_cast(Ret); - } - - SectionCharacteristics - operator|(SectionCharacteristics a, SectionCharacteristics b) { - uint32_t Ret = static_cast(a) | static_cast(b); - return static_cast(Ret); - } -} - -namespace yaml { - -#define BCase(X) IO.bitSetCase(Value, #X, COFF::X); - -template <> -struct ScalarBitSetTraits { - static void bitset(IO &IO, COFF::SectionCharacteristics &Value) { - 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); - } -}; - -template <> -struct ScalarBitSetTraits { - static void 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); - } -}; -#undef BCase - -#define ECase(X) IO.enumCase(Value, #X, COFF::X); - -template <> -struct ScalarEnumerationTraits { - static void 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); - } -}; - -template <> -struct ScalarEnumerationTraits { - static void 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); - } -}; - -template <> -struct ScalarEnumerationTraits { - static void 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); - } -}; - -template <> -struct ScalarEnumerationTraits { - static void 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_ARMV7); - 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); - } -}; - -template <> -struct ScalarEnumerationTraits { - static void enumeration(IO &IO, COFF::RelocationTypeX86 &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); - 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); - } -}; - -#undef ECase - -template <> -struct MappingTraits { - 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; - }; - - static void mapping(IO &IO, COFFYAML::Symbol &S) { - MappingNormalization NS(IO, S.Header.StorageClass); - - IO.mapRequired("SimpleType", S.SimpleType); - IO.mapOptional("NumberOfAuxSymbols", S.Header.NumberOfAuxSymbols); - IO.mapRequired("Name", S.Name); - IO.mapRequired("StorageClass", NS->StorageClass); - IO.mapOptional("AuxiliaryData", S.AuxiliaryData); - IO.mapRequired("ComplexType", S.ComplexType); - IO.mapRequired("Value", S.Header.Value); - IO.mapRequired("SectionNumber", S.Header.SectionNumber); - } -}; - -template <> -struct MappingTraits { - 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 NCharacteristics { - NCharacteristics(IO&) : Characteristics(COFF::Characteristics(0)) { - } - NCharacteristics(IO&, uint16_t C) : - Characteristics(COFF::Characteristics(C)) { - } - uint16_t denormalize(IO &) { - return Characteristics; - } - - COFF::Characteristics Characteristics; - }; - - static void mapping(IO &IO, COFF::header &H) { - MappingNormalization NM(IO, H.Machine); - MappingNormalization NC(IO, H.Characteristics); - - IO.mapRequired("Machine", NM->Machine); - IO.mapOptional("Characteristics", NC->Characteristics); - } -}; - -template <> -struct MappingTraits { - struct NType { - NType(IO &) : Type(COFF::RelocationTypeX86(0)) { - } - NType(IO &, uint16_t T) : Type(COFF::RelocationTypeX86(T)) { - } - uint16_t denormalize(IO &) { - return Type; - } - COFF::RelocationTypeX86 Type; - }; - - static void mapping(IO &IO, COFF::relocation &Rel) { - MappingNormalization NT(IO, Rel.Type); - - IO.mapRequired("Type", NT->Type); - IO.mapRequired("VirtualAddress", Rel.VirtualAddress); - IO.mapRequired("SymbolTableIndex", Rel.SymbolTableIndex); - } -}; - -template <> -struct MappingTraits { - struct NCharacteristics { - NCharacteristics(IO &) : Characteristics(COFF::SectionCharacteristics(0)) { - } - NCharacteristics(IO &, uint32_t C) : - Characteristics(COFF::SectionCharacteristics(C)) { - } - uint32_t denormalize(IO &) { - return Characteristics; - } - COFF::SectionCharacteristics Characteristics; - }; - - static void mapping(IO &IO, COFFYAML::Section &Sec) { - MappingNormalization NC(IO, - Sec.Header.Characteristics); - IO.mapOptional("Relocations", Sec.Relocations); - IO.mapRequired("SectionData", Sec.SectionData); - IO.mapRequired("Characteristics", NC->Characteristics); - IO.mapRequired("Name", Sec.Name); - IO.mapOptional("Alignment", Sec.Alignment); - } -}; - -template <> -struct MappingTraits { - static void mapping(IO &IO, COFFYAML::Object &Obj) { - IO.mapRequired("sections", Obj.Sections); - IO.mapRequired("header", Obj.Header); - IO.mapRequired("symbols", Obj.Symbols); - } -}; -} // end namespace yaml -} // end namespace llvm - int main(int argc, char **argv) { cl::ParseCommandLineOptions(argc, argv); sys::PrintStackTraceOnErrorSignal(); -- 2.34.1