mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-12 05:56:28 +00:00
Convert obj2yaml to use yamlio.
llvm-svn: 182169
This commit is contained in:
parent
aabd77b198
commit
c0de1ee01b
136
include/llvm/Object/COFFYaml.h
Normal file
136
include/llvm/Object/COFFYaml.h
Normal 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
|
@ -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
279
lib/Object/COFFYAML.cpp
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
set(LLVM_LINK_COMPONENTS object)
|
||||
|
||||
add_llvm_utility(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();
|
||||
|
Loading…
Reference in New Issue
Block a user