Convert obj2yaml to use yamlio.

llvm-svn: 182169
This commit is contained in:
Rafael Espindola 2013-05-17 22:58:42 +00:00
parent aabd77b198
commit c0de1ee01b
7 changed files with 587 additions and 768 deletions

View File

@ -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

View File

@ -2,6 +2,7 @@ add_llvm_library(LLVMObject
Archive.cpp
Binary.cpp
COFFObjectFile.cpp
COFFYAML.cpp
ELFObjectFile.cpp
Error.cpp
MachOObjectFile.cpp

279
lib/Object/COFFYAML.cpp Normal file
View File

@ -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);
}
}
}

View File

@ -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

View File

@ -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;
namespace {
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;
public:
COFFDumper(const object::COFFObjectFile &Obj);
COFFYAML::Object &getYAMLObj();
};
#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)
};
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)
};
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),
};
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);
}
Out << '\n';
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);
}
}
error_code coff2yaml(raw_ostream &Out, MemoryBuffer *TheObj) {
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;
yamlCOFFHeader(hd, Out);
yamlCOFFSections(obj, hd->NumberOfSections, Out);
yamlCOFFSymbols(obj, hd->NumberOfSymbols, Out);
return ec;
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 *Buff) {
error_code ec;
object::COFFObjectFile Obj(Buff, ec);
check(ec);
COFFDumper Dumper(Obj);
yaml::Output Yout(Out);
Yout << Dumper.getYAMLObj();
return object::object_error::success;
}

View File

@ -1,3 +1,5 @@
set(LLVM_LINK_COMPONENTS object)
add_llvm_utility(yaml2obj
yaml2obj.cpp
)

View File

@ -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();