diff options
| -rw-r--r-- | llvm/include/llvm/Object/COFFYaml.h | 136 | ||||
| -rw-r--r-- | llvm/lib/Object/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/Object/COFFYAML.cpp | 279 | ||||
| -rw-r--r-- | llvm/test/Object/obj2yaml.test | 174 | ||||
| -rw-r--r-- | llvm/tools/obj2yaml/coff2yaml.cpp | 388 | ||||
| -rw-r--r-- | llvm/tools/yaml2obj/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | llvm/tools/yaml2obj/yaml2obj.cpp | 361 | 
7 files changed, 580 insertions, 761 deletions
diff --git a/llvm/include/llvm/Object/COFFYaml.h b/llvm/include/llvm/Object/COFFYaml.h new file mode 100644 index 00000000000..08cbab428c0 --- /dev/null +++ b/llvm/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<uint32_t>(a) | static_cast<uint32_t>(b); +  return static_cast<Characteristics>(Ret); +} + +inline SectionCharacteristics operator|(SectionCharacteristics a, +                                        SectionCharacteristics b) { +  uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b); +  return static_cast<SectionCharacteristics>(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<COFF::relocation> 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<Section> Sections; +    std::vector<Symbol> 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<COFF::MachineTypes> { +  static void enumeration(IO &IO, COFF::MachineTypes &Value); +}; + +template <> +struct ScalarEnumerationTraits<COFF::SymbolBaseType> { +  static void enumeration(IO &IO, COFF::SymbolBaseType &Value); +}; + +template <> +struct ScalarEnumerationTraits<COFF::SymbolStorageClass> { +  static void enumeration(IO &IO, COFF::SymbolStorageClass &Value); +}; + +template <> +struct ScalarEnumerationTraits<COFF::SymbolComplexType> { +  static void enumeration(IO &IO, COFF::SymbolComplexType &Value); +}; + +template <> +struct ScalarEnumerationTraits<COFF::RelocationTypeX86> { +  static void enumeration(IO &IO, COFF::RelocationTypeX86 &Value); +}; + +template <> +struct ScalarBitSetTraits<COFF::Characteristics> { +  static void bitset(IO &IO, COFF::Characteristics &Value); +}; + +template <> +struct ScalarBitSetTraits<COFF::SectionCharacteristics> { +  static void bitset(IO &IO, COFF::SectionCharacteristics &Value); +}; + +template <> +struct MappingTraits<COFF::relocation> { +  static void mapping(IO &IO, COFF::relocation &Rel); +}; + +template <> +struct MappingTraits<COFF::header> { +  static void mapping(IO &IO, COFF::header &H); +}; + +template <> +struct MappingTraits<COFFYAML::Symbol> { +  static void mapping(IO &IO, COFFYAML::Symbol &S); +}; + +template <> +struct MappingTraits<COFFYAML::Section> { +  static void mapping(IO &IO, COFFYAML::Section &Sec); +}; + +template <> +struct MappingTraits<COFFYAML::Object> { +  static void mapping(IO &IO, COFFYAML::Object &Obj); +}; + +} // end namespace yaml +} // end namespace llvm + +#endif diff --git a/llvm/lib/Object/CMakeLists.txt b/llvm/lib/Object/CMakeLists.txt index 4ed129f467e..0ca0c324014 100644 --- a/llvm/lib/Object/CMakeLists.txt +++ b/llvm/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/llvm/lib/Object/COFFYAML.cpp b/llvm/lib/Object/COFFYAML.cpp new file mode 100644 index 00000000000..7a154525e2a --- /dev/null +++ b/llvm/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<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_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<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::RelocationTypeX86>::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<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_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<COFF::relocation>::mapping(IO &IO, COFF::relocation &Rel) { +  MappingNormalization<NType, uint16_t> NT(IO, Rel.Type); + +  IO.mapRequired("VirtualAddress", Rel.VirtualAddress); +  IO.mapRequired("SymbolTableIndex", Rel.SymbolTableIndex); +  IO.mapRequired("Type", NT->Type); +} + +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); +} + +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("NumberOfAuxSymbols", S.Header.NumberOfAuxSymbols); +  IO.mapOptional("AuxiliaryData", S.AuxiliaryData); +} + +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("Alignment", Sec.Alignment); +  IO.mapRequired("SectionData", Sec.SectionData); +  IO.mapOptional("Relocations", Sec.Relocations); +} + +void MappingTraits<COFFYAML::Object>::mapping(IO &IO, COFFYAML::Object &Obj) { +  IO.mapRequired("header", Obj.Header); +  IO.mapRequired("sections", Obj.Sections); +  IO.mapRequired("symbols", Obj.Symbols); +} + +} +} diff --git a/llvm/test/Object/obj2yaml.test b/llvm/test/Object/obj2yaml.test index 0d96fd2bfd8..5c145e87d5d 100644 --- a/llvm/test/Object/obj2yaml.test +++ b/llvm/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/llvm/tools/obj2yaml/coff2yaml.cpp b/llvm/tools/obj2yaml/coff2yaml.cpp index 5106a4a44b6..2a70cec09d9 100644 --- a/llvm/tools/obj2yaml/coff2yaml.cpp +++ b/llvm/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 <typename One, typename Two> -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<COFF::MachineTypes, const char *> -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<COFF::SectionCharacteristics, const char *> -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<COFF::SectionCharacteristics, const char *> -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<COFF::SectionCharacteristics, const char *> -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<COFF::SymbolBaseType, const char *> -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<uint8_t> Data); +  std::vector<std::string> Strings; -static const pod_pair<COFF::SymbolComplexType, const char *> -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<COFF::SymbolStorageClass, const char *> -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<COFF::RelocationTypeX86, const char *> -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<COFF::RelocationTypesARM, const char *> -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<enum, const char *>, write all enums that match -template <typename T, std::size_t N> -static raw_ostream &writeBitMask(raw_ostream &Out, -                                 const pod_pair<T, const char *> (&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<enum, const char *>, look up a value -template <typename T, std::size_t N> -const char *nameLookup(const pod_pair<T, const char *> (&Arr)[N], -                       unsigned long Val, const char *NotFound = NULL) { -  T n = static_cast<T>(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<COFFYAML::Section> &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<uint8_t> 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<COFF::relocation> 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<COFFYAML::Symbol> &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<uint8_t> 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<uint8_t> Data) { +  std::string S; +  for (ArrayRef<uint8_t>::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/llvm/tools/yaml2obj/CMakeLists.txt b/llvm/tools/yaml2obj/CMakeLists.txt index f8b11975246..0918ea365e4 100644 --- a/llvm/tools/yaml2obj/CMakeLists.txt +++ b/llvm/tools/yaml2obj/CMakeLists.txt @@ -1,3 +1,5 @@ +set(LLVM_LINK_COMPONENTS object) +  add_llvm_utility(yaml2obj    yaml2obj.cpp    ) diff --git a/llvm/tools/yaml2obj/yaml2obj.cpp b/llvm/tools/yaml2obj/yaml2obj.cpp index 707b6b4d5c1..d9843463cc0 100644 --- a/llvm/tools/yaml2obj/yaml2obj.cpp +++ b/llvm/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 <vector> @@ -37,41 +36,6 @@ using namespace llvm;  static cl::opt<std::string>    Input(cl::Positional, cl::desc("<input>"), 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<COFF::relocation> 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<Section> Sections; -    std::vector<Symbol> 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<uint32_t>(a) | static_cast<uint32_t>(b); -    return static_cast<Characteristics>(Ret); -  } - -  SectionCharacteristics -  operator|(SectionCharacteristics a, SectionCharacteristics b) { -    uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b); -    return static_cast<SectionCharacteristics>(Ret); -  } -} - -namespace yaml { - -#define BCase(X) IO.bitSetCase(Value, #X, COFF::X); - -template <> -struct ScalarBitSetTraits<COFF::SectionCharacteristics> { -  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<COFF::Characteristics> { -  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<COFF::SymbolComplexType> { -  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<COFF::SymbolStorageClass> { -  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<COFF::SymbolBaseType> { -  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<COFF::MachineTypes> { -  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<COFF::RelocationTypeX86> { -  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<COFFYAML::Symbol> { -  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<NStorageClass, uint8_t> 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<COFF::header> { -  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<NMachine, uint16_t> NM(IO, H.Machine); -    MappingNormalization<NCharacteristics, uint16_t> NC(IO, H.Characteristics); - -    IO.mapRequired("Machine", NM->Machine); -    IO.mapOptional("Characteristics", NC->Characteristics); -  } -}; - -template <> -struct MappingTraits<COFF::relocation> { -  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<NType, uint16_t> NT(IO, Rel.Type); - -    IO.mapRequired("Type", NT->Type); -    IO.mapRequired("VirtualAddress", Rel.VirtualAddress); -    IO.mapRequired("SymbolTableIndex", Rel.SymbolTableIndex); -  } -}; - -template <> -struct MappingTraits<COFFYAML::Section> { -  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<NCharacteristics, uint32_t> 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<COFFYAML::Object> { -  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();  | 

