<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Rafael, Object/obj2yaml.test is failing now on some of our buildbots.  It passes on OS X if you build with libstdc++ but fails if you use libc++.  The output shows the SectionData with a bunch of binary characters when using libc++.<div><br></div><div>I've temporarily disabled the test in svn r182212.  Let me know if you need help reproducing the issue.<br><div><br><div><div>On May 17, 2013, at 3:58 PM, Rafael Espindola <<a href="mailto:rafael.espindola@gmail.com">rafael.espindola@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;">Author: rafael<br>Date: Fri May 17 17:58:42 2013<br>New Revision: 182169<br><br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project?rev=182169&view=rev">http://llvm.org/viewvc/llvm-project?rev=182169&view=rev</a><br>Log:<br>Convert obj2yaml to use yamlio.<br><br>Added:<br>   llvm/trunk/include/llvm/Object/COFFYaml.h<br>   llvm/trunk/lib/Object/COFFYAML.cpp<br>Modified:<br>   llvm/trunk/lib/Object/CMakeLists.txt<br>   llvm/trunk/test/Object/obj2yaml.test<br>   llvm/trunk/tools/obj2yaml/coff2yaml.cpp<br>   llvm/trunk/tools/yaml2obj/CMakeLists.txt<br>   llvm/trunk/tools/yaml2obj/yaml2obj.cpp<br><br>Added: llvm/trunk/include/llvm/Object/COFFYaml.h<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFFYaml.h?rev=182169&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFFYaml.h?rev=182169&view=auto</a><br>==============================================================================<br>--- llvm/trunk/include/llvm/Object/COFFYaml.h (added)<br>+++ llvm/trunk/include/llvm/Object/COFFYaml.h Fri May 17 17:58:42 2013<br>@@ -0,0 +1,136 @@<br>+//===- COFFYAML.h - COFF YAMLIO implementation ------------------*- C++ -*-===//<br>+//<br>+//                     The LLVM Compiler Infrastructure<br>+//<br>+// This file is distributed under the University of Illinois Open Source<br>+// License. See LICENSE.TXT for details.<br>+//<br>+//===----------------------------------------------------------------------===//<br>+//<br>+// This file declares classes for handling the YAML representation of COFF.<br>+//<br>+//===----------------------------------------------------------------------===//<br>+<br>+#ifndef LLVM_OBJECT_COFFYAML_H<br>+#define LLVM_OBJECT_COFFYAML_H<br>+<br>+<br>+#include "llvm/Support/COFF.h"<br>+#include "llvm/Support/YAMLTraits.h"<br>+<br>+namespace llvm {<br>+<br>+namespace COFF {<br>+inline Characteristics operator|(Characteristics a, Characteristics b) {<br>+  uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);<br>+  return static_cast<Characteristics>(Ret);<br>+}<br>+<br>+inline SectionCharacteristics operator|(SectionCharacteristics a,<br>+                                        SectionCharacteristics b) {<br>+  uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);<br>+  return static_cast<SectionCharacteristics>(Ret);<br>+}<br>+}<br>+<br>+// The structure of the yaml files is not an exact 1:1 match to COFF. In order<br>+// to use yaml::IO, we use these structures which are closer to the source.<br>+namespace COFFYAML {<br>+  struct Section {<br>+    COFF::section Header;<br>+    unsigned Alignment;<br>+    StringRef SectionData;<br>+    std::vector<COFF::relocation> Relocations;<br>+    StringRef Name;<br>+    Section();<br>+  };<br>+<br>+  struct Symbol {<br>+    COFF::symbol Header;<br>+    COFF::SymbolBaseType SimpleType;<br>+    COFF::SymbolComplexType ComplexType;<br>+    StringRef AuxiliaryData;<br>+    StringRef Name;<br>+    Symbol();<br>+  };<br>+<br>+  struct Object {<br>+    COFF::header Header;<br>+    std::vector<Section> Sections;<br>+    std::vector<Symbol> Symbols;<br>+    Object();<br>+  };<br>+}<br>+}<br>+<br>+LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section)<br>+LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol)<br>+LLVM_YAML_IS_SEQUENCE_VECTOR(COFF::relocation)<br>+<br>+namespace llvm {<br>+namespace yaml {<br>+<br>+template <><br>+struct ScalarEnumerationTraits<COFF::MachineTypes> {<br>+  static void enumeration(IO &IO, COFF::MachineTypes &Value);<br>+};<br>+<br>+template <><br>+struct ScalarEnumerationTraits<COFF::SymbolBaseType> {<br>+  static void enumeration(IO &IO, COFF::SymbolBaseType &Value);<br>+};<br>+<br>+template <><br>+struct ScalarEnumerationTraits<COFF::SymbolStorageClass> {<br>+  static void enumeration(IO &IO, COFF::SymbolStorageClass &Value);<br>+};<br>+<br>+template <><br>+struct ScalarEnumerationTraits<COFF::SymbolComplexType> {<br>+  static void enumeration(IO &IO, COFF::SymbolComplexType &Value);<br>+};<br>+<br>+template <><br>+struct ScalarEnumerationTraits<COFF::RelocationTypeX86> {<br>+  static void enumeration(IO &IO, COFF::RelocationTypeX86 &Value);<br>+};<br>+<br>+template <><br>+struct ScalarBitSetTraits<COFF::Characteristics> {<br>+  static void bitset(IO &IO, COFF::Characteristics &Value);<br>+};<br>+<br>+template <><br>+struct ScalarBitSetTraits<COFF::SectionCharacteristics> {<br>+  static void bitset(IO &IO, COFF::SectionCharacteristics &Value);<br>+};<br>+<br>+template <><br>+struct MappingTraits<COFF::relocation> {<br>+  static void mapping(IO &IO, COFF::relocation &Rel);<br>+};<br>+<br>+template <><br>+struct MappingTraits<COFF::header> {<br>+  static void mapping(IO &IO, COFF::header &H);<br>+};<br>+<br>+template <><br>+struct MappingTraits<COFFYAML::Symbol> {<br>+  static void mapping(IO &IO, COFFYAML::Symbol &S);<br>+};<br>+<br>+template <><br>+struct MappingTraits<COFFYAML::Section> {<br>+  static void mapping(IO &IO, COFFYAML::Section &Sec);<br>+};<br>+<br>+template <><br>+struct MappingTraits<COFFYAML::Object> {<br>+  static void mapping(IO &IO, COFFYAML::Object &Obj);<br>+};<br>+<br>+} // end namespace yaml<br>+} // end namespace llvm<br>+<br>+#endif<br><br>Modified: llvm/trunk/lib/Object/CMakeLists.txt<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/CMakeLists.txt?rev=182169&r1=182168&r2=182169&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/CMakeLists.txt?rev=182169&r1=182168&r2=182169&view=diff</a><br>==============================================================================<br>--- llvm/trunk/lib/Object/CMakeLists.txt (original)<br>+++ llvm/trunk/lib/Object/CMakeLists.txt Fri May 17 17:58:42 2013<br>@@ -2,6 +2,7 @@ add_llvm_library(LLVMObject<br>  Archive.cpp<br>  Binary.cpp<br>  COFFObjectFile.cpp<br>+  COFFYAML.cpp<br>  ELFObjectFile.cpp<br>  Error.cpp<br>  MachOObjectFile.cpp<br><br>Added: llvm/trunk/lib/Object/COFFYAML.cpp<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFYAML.cpp?rev=182169&view=auto">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFYAML.cpp?rev=182169&view=auto</a><br>==============================================================================<br>--- llvm/trunk/lib/Object/COFFYAML.cpp (added)<br>+++ llvm/trunk/lib/Object/COFFYAML.cpp Fri May 17 17:58:42 2013<br>@@ -0,0 +1,279 @@<br>+//===- COFFYAML.cpp - COFF YAMLIO implementation --------------------------===//<br>+//<br>+//                     The LLVM Compiler Infrastructure<br>+//<br>+// This file is distributed under the University of Illinois Open Source<br>+// License. See LICENSE.TXT for details.<br>+//<br>+//===----------------------------------------------------------------------===//<br>+//<br>+// This file defines classes for handling the YAML representation of COFF.<br>+//<br>+//===----------------------------------------------------------------------===//<br>+<br>+#include "llvm/Object/COFFYaml.h"<br>+<br>+#define ECase(X) IO.enumCase(Value, #X, COFF::X);<br>+namespace llvm {<br>+<br>+namespace COFFYAML {<br>+Section::Section() { memset(&Header, 0, sizeof(COFF::section)); }<br>+Symbol::Symbol() { memset(&Header, 0, sizeof(COFF::symbol)); }<br>+Object::Object() { memset(&Header, 0, sizeof(COFF::header)); }<br>+}<br>+<br>+namespace yaml {<br>+void ScalarEnumerationTraits<COFF::MachineTypes>::enumeration(<br>+    IO &IO, COFF::MachineTypes &Value) {<br>+  ECase(IMAGE_FILE_MACHINE_UNKNOWN);<br>+  ECase(IMAGE_FILE_MACHINE_AM33);<br>+  ECase(IMAGE_FILE_MACHINE_AMD64);<br>+  ECase(IMAGE_FILE_MACHINE_ARM);<br>+  ECase(IMAGE_FILE_MACHINE_ARMV7);<br>+  ECase(IMAGE_FILE_MACHINE_EBC);<br>+  ECase(IMAGE_FILE_MACHINE_I386);<br>+  ECase(IMAGE_FILE_MACHINE_IA64);<br>+  ECase(IMAGE_FILE_MACHINE_M32R);<br>+  ECase(IMAGE_FILE_MACHINE_MIPS16);<br>+  ECase(IMAGE_FILE_MACHINE_MIPSFPU);<br>+  ECase(IMAGE_FILE_MACHINE_MIPSFPU16);<br>+  ECase(IMAGE_FILE_MACHINE_POWERPC);<br>+  ECase(IMAGE_FILE_MACHINE_POWERPCFP);<br>+  ECase(IMAGE_FILE_MACHINE_R4000);<br>+  ECase(IMAGE_FILE_MACHINE_SH3);<br>+  ECase(IMAGE_FILE_MACHINE_SH3DSP);<br>+  ECase(IMAGE_FILE_MACHINE_SH4);<br>+  ECase(IMAGE_FILE_MACHINE_SH5);<br>+  ECase(IMAGE_FILE_MACHINE_THUMB);<br>+  ECase(IMAGE_FILE_MACHINE_WCEMIPSV2);<br>+}<br>+<br>+void ScalarEnumerationTraits<COFF::SymbolBaseType>::enumeration(<br>+    IO &IO, COFF::SymbolBaseType &Value) {<br>+  ECase(IMAGE_SYM_TYPE_NULL);<br>+  ECase(IMAGE_SYM_TYPE_VOID);<br>+  ECase(IMAGE_SYM_TYPE_CHAR);<br>+  ECase(IMAGE_SYM_TYPE_SHORT);<br>+  ECase(IMAGE_SYM_TYPE_INT);<br>+  ECase(IMAGE_SYM_TYPE_LONG);<br>+  ECase(IMAGE_SYM_TYPE_FLOAT);<br>+  ECase(IMAGE_SYM_TYPE_DOUBLE);<br>+  ECase(IMAGE_SYM_TYPE_STRUCT);<br>+  ECase(IMAGE_SYM_TYPE_UNION);<br>+  ECase(IMAGE_SYM_TYPE_ENUM);<br>+  ECase(IMAGE_SYM_TYPE_MOE);<br>+  ECase(IMAGE_SYM_TYPE_BYTE);<br>+  ECase(IMAGE_SYM_TYPE_WORD);<br>+  ECase(IMAGE_SYM_TYPE_UINT);<br>+  ECase(IMAGE_SYM_TYPE_DWORD);<br>+}<br>+<br>+void ScalarEnumerationTraits<COFF::SymbolStorageClass>::enumeration(<br>+    IO &IO, COFF::SymbolStorageClass &Value) {<br>+  ECase(IMAGE_SYM_CLASS_END_OF_FUNCTION);<br>+  ECase(IMAGE_SYM_CLASS_NULL);<br>+  ECase(IMAGE_SYM_CLASS_AUTOMATIC);<br>+  ECase(IMAGE_SYM_CLASS_EXTERNAL);<br>+  ECase(IMAGE_SYM_CLASS_STATIC);<br>+  ECase(IMAGE_SYM_CLASS_REGISTER);<br>+  ECase(IMAGE_SYM_CLASS_EXTERNAL_DEF);<br>+  ECase(IMAGE_SYM_CLASS_LABEL);<br>+  ECase(IMAGE_SYM_CLASS_UNDEFINED_LABEL);<br>+  ECase(IMAGE_SYM_CLASS_MEMBER_OF_STRUCT);<br>+  ECase(IMAGE_SYM_CLASS_ARGUMENT);<br>+  ECase(IMAGE_SYM_CLASS_STRUCT_TAG);<br>+  ECase(IMAGE_SYM_CLASS_MEMBER_OF_UNION);<br>+  ECase(IMAGE_SYM_CLASS_UNION_TAG);<br>+  ECase(IMAGE_SYM_CLASS_TYPE_DEFINITION);<br>+  ECase(IMAGE_SYM_CLASS_UNDEFINED_STATIC);<br>+  ECase(IMAGE_SYM_CLASS_ENUM_TAG);<br>+  ECase(IMAGE_SYM_CLASS_MEMBER_OF_ENUM);<br>+  ECase(IMAGE_SYM_CLASS_REGISTER_PARAM);<br>+  ECase(IMAGE_SYM_CLASS_BIT_FIELD);<br>+  ECase(IMAGE_SYM_CLASS_BLOCK);<br>+  ECase(IMAGE_SYM_CLASS_FUNCTION);<br>+  ECase(IMAGE_SYM_CLASS_END_OF_STRUCT);<br>+  ECase(IMAGE_SYM_CLASS_FILE);<br>+  ECase(IMAGE_SYM_CLASS_SECTION);<br>+  ECase(IMAGE_SYM_CLASS_WEAK_EXTERNAL);<br>+  ECase(IMAGE_SYM_CLASS_CLR_TOKEN);<br>+}<br>+<br>+void ScalarEnumerationTraits<COFF::SymbolComplexType>::enumeration(<br>+    IO &IO, COFF::SymbolComplexType &Value) {<br>+  ECase(IMAGE_SYM_DTYPE_NULL);<br>+  ECase(IMAGE_SYM_DTYPE_POINTER);<br>+  ECase(IMAGE_SYM_DTYPE_FUNCTION);<br>+  ECase(IMAGE_SYM_DTYPE_ARRAY);<br>+}<br>+<br>+void ScalarEnumerationTraits<COFF::RelocationTypeX86>::enumeration(<br>+    IO &IO, COFF::RelocationTypeX86 &Value) {<br>+  ECase(IMAGE_REL_I386_ABSOLUTE);<br>+  ECase(IMAGE_REL_I386_DIR16);<br>+  ECase(IMAGE_REL_I386_REL16);<br>+  ECase(IMAGE_REL_I386_DIR32);<br>+  ECase(IMAGE_REL_I386_DIR32NB);<br>+  ECase(IMAGE_REL_I386_SEG12);<br>+  ECase(IMAGE_REL_I386_SECTION);<br>+  ECase(IMAGE_REL_I386_SECREL);<br>+  ECase(IMAGE_REL_I386_TOKEN);<br>+  ECase(IMAGE_REL_I386_SECREL7);<br>+  ECase(IMAGE_REL_I386_REL32);<br>+  ECase(IMAGE_REL_AMD64_ABSOLUTE);<br>+  ECase(IMAGE_REL_AMD64_ADDR64);<br>+  ECase(IMAGE_REL_AMD64_ADDR32);<br>+  ECase(IMAGE_REL_AMD64_ADDR32NB);<br>+  ECase(IMAGE_REL_AMD64_REL32);<br>+  ECase(IMAGE_REL_AMD64_REL32_1);<br>+  ECase(IMAGE_REL_AMD64_REL32_2);<br>+  ECase(IMAGE_REL_AMD64_REL32_3);<br>+  ECase(IMAGE_REL_AMD64_REL32_4);<br>+  ECase(IMAGE_REL_AMD64_REL32_5);<br>+  ECase(IMAGE_REL_AMD64_SECTION);<br>+  ECase(IMAGE_REL_AMD64_SECREL);<br>+  ECase(IMAGE_REL_AMD64_SECREL7);<br>+  ECase(IMAGE_REL_AMD64_TOKEN);<br>+  ECase(IMAGE_REL_AMD64_SREL32);<br>+  ECase(IMAGE_REL_AMD64_PAIR);<br>+  ECase(IMAGE_REL_AMD64_SSPAN32);<br>+}<br>+#undef ECase<br>+<br>+#define BCase(X) IO.bitSetCase(Value, #X, COFF::X);<br>+void ScalarBitSetTraits<COFF::Characteristics>::bitset(<br>+    IO &IO, COFF::Characteristics &Value) {<br>+  BCase(IMAGE_FILE_RELOCS_STRIPPED);<br>+  BCase(IMAGE_FILE_EXECUTABLE_IMAGE);<br>+  BCase(IMAGE_FILE_LINE_NUMS_STRIPPED);<br>+  BCase(IMAGE_FILE_LOCAL_SYMS_STRIPPED);<br>+  BCase(IMAGE_FILE_AGGRESSIVE_WS_TRIM);<br>+  BCase(IMAGE_FILE_LARGE_ADDRESS_AWARE);<br>+  BCase(IMAGE_FILE_BYTES_REVERSED_LO);<br>+  BCase(IMAGE_FILE_32BIT_MACHINE);<br>+  BCase(IMAGE_FILE_DEBUG_STRIPPED);<br>+  BCase(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP);<br>+  BCase(IMAGE_FILE_NET_RUN_FROM_SWAP);<br>+  BCase(IMAGE_FILE_SYSTEM);<br>+  BCase(IMAGE_FILE_DLL);<br>+  BCase(IMAGE_FILE_UP_SYSTEM_ONLY);<br>+  BCase(IMAGE_FILE_BYTES_REVERSED_HI);<br>+}<br>+<br>+void ScalarBitSetTraits<COFF::SectionCharacteristics>::bitset(<br>+    IO &IO, COFF::SectionCharacteristics &Value) {<br>+  BCase(IMAGE_SCN_TYPE_NO_PAD);<br>+  BCase(IMAGE_SCN_CNT_CODE);<br>+  BCase(IMAGE_SCN_CNT_INITIALIZED_DATA);<br>+  BCase(IMAGE_SCN_CNT_UNINITIALIZED_DATA);<br>+  BCase(IMAGE_SCN_LNK_OTHER);<br>+  BCase(IMAGE_SCN_LNK_INFO);<br>+  BCase(IMAGE_SCN_LNK_REMOVE);<br>+  BCase(IMAGE_SCN_LNK_COMDAT);<br>+  BCase(IMAGE_SCN_GPREL);<br>+  BCase(IMAGE_SCN_MEM_PURGEABLE);<br>+  BCase(IMAGE_SCN_MEM_16BIT);<br>+  BCase(IMAGE_SCN_MEM_LOCKED);<br>+  BCase(IMAGE_SCN_MEM_PRELOAD);<br>+  BCase(IMAGE_SCN_LNK_NRELOC_OVFL);<br>+  BCase(IMAGE_SCN_MEM_DISCARDABLE);<br>+  BCase(IMAGE_SCN_MEM_NOT_CACHED);<br>+  BCase(IMAGE_SCN_MEM_NOT_PAGED);<br>+  BCase(IMAGE_SCN_MEM_SHARED);<br>+  BCase(IMAGE_SCN_MEM_EXECUTE);<br>+  BCase(IMAGE_SCN_MEM_READ);<br>+  BCase(IMAGE_SCN_MEM_WRITE);<br>+}<br>+#undef BCase<br>+<br>+namespace {<br>+struct NSectionCharacteristics {<br>+  NSectionCharacteristics(IO &)<br>+      : Characteristics(COFF::SectionCharacteristics(0)) {}<br>+  NSectionCharacteristics(IO &, uint32_t C)<br>+      : Characteristics(COFF::SectionCharacteristics(C)) {}<br>+  uint32_t denormalize(IO &) { return Characteristics; }<br>+  COFF::SectionCharacteristics Characteristics;<br>+};<br>+<br>+struct NStorageClass {<br>+  NStorageClass(IO &) : StorageClass(COFF::SymbolStorageClass(0)) {}<br>+  NStorageClass(IO &, uint8_t S) : StorageClass(COFF::SymbolStorageClass(S)) {}<br>+  uint8_t denormalize(IO &) { return StorageClass; }<br>+<br>+  COFF::SymbolStorageClass StorageClass;<br>+};<br>+<br>+struct NMachine {<br>+  NMachine(IO &) : Machine(COFF::MachineTypes(0)) {}<br>+  NMachine(IO &, uint16_t M) : Machine(COFF::MachineTypes(M)) {}<br>+  uint16_t denormalize(IO &) { return Machine; }<br>+  COFF::MachineTypes Machine;<br>+};<br>+<br>+struct NHeaderCharacteristics {<br>+  NHeaderCharacteristics(IO &) : Characteristics(COFF::Characteristics(0)) {}<br>+  NHeaderCharacteristics(IO &, uint16_t C)<br>+      : Characteristics(COFF::Characteristics(C)) {}<br>+  uint16_t denormalize(IO &) { return Characteristics; }<br>+<br>+  COFF::Characteristics Characteristics;<br>+};<br>+<br>+struct NType {<br>+  NType(IO &) : Type(COFF::RelocationTypeX86(0)) {}<br>+  NType(IO &, uint16_t T) : Type(COFF::RelocationTypeX86(T)) {}<br>+  uint16_t denormalize(IO &) { return Type; }<br>+  COFF::RelocationTypeX86 Type;<br>+};<br>+<br>+}<br>+<br>+void MappingTraits<COFF::relocation>::mapping(IO &IO, COFF::relocation &Rel) {<br>+  MappingNormalization<NType, uint16_t> NT(IO, Rel.Type);<br>+<br>+  IO.mapRequired("VirtualAddress", Rel.VirtualAddress);<br>+  IO.mapRequired("SymbolTableIndex", Rel.SymbolTableIndex);<br>+  IO.mapRequired("Type", NT->Type);<br>+}<br>+<br>+void MappingTraits<COFF::header>::mapping(IO &IO, COFF::header &H) {<br>+  MappingNormalization<NMachine, uint16_t> NM(IO, H.Machine);<br>+  MappingNormalization<NHeaderCharacteristics, uint16_t> NC(IO,<br>+                                                            H.Characteristics);<br>+<br>+  IO.mapRequired("Machine", NM->Machine);<br>+  IO.mapOptional("Characteristics", NC->Characteristics);<br>+}<br>+<br>+void MappingTraits<COFFYAML::Symbol>::mapping(IO &IO, COFFYAML::Symbol &S) {<br>+  MappingNormalization<NStorageClass, uint8_t> NS(IO, S.Header.StorageClass);<br>+<br>+  IO.mapRequired("Name", S.Name);<br>+  IO.mapRequired("Value", S.Header.Value);<br>+  IO.mapRequired("SectionNumber", S.Header.SectionNumber);<br>+  IO.mapRequired("SimpleType", S.SimpleType);<br>+  IO.mapRequired("ComplexType", S.ComplexType);<br>+  IO.mapRequired("StorageClass", NS->StorageClass);<br>+  IO.mapOptional("NumberOfAuxSymbols", S.Header.NumberOfAuxSymbols);<br>+  IO.mapOptional("AuxiliaryData", S.AuxiliaryData);<br>+}<br>+<br>+void MappingTraits<COFFYAML::Section>::mapping(IO &IO, COFFYAML::Section &Sec) {<br>+  MappingNormalization<NSectionCharacteristics, uint32_t> NC(<br>+      IO, Sec.Header.Characteristics);<br>+  IO.mapRequired("Name", Sec.Name);<br>+  IO.mapRequired("Characteristics", NC->Characteristics);<br>+  IO.mapOptional("Alignment", Sec.Alignment);<br>+  IO.mapRequired("SectionData", Sec.SectionData);<br>+  IO.mapOptional("Relocations", Sec.Relocations);<br>+}<br>+<br>+void MappingTraits<COFFYAML::Object>::mapping(IO &IO, COFFYAML::Object &Obj) {<br>+  IO.mapRequired("header", Obj.Header);<br>+  IO.mapRequired("sections", Obj.Sections);<br>+  IO.mapRequired("symbols", Obj.Symbols);<br>+}<br>+<br>+}<br>+}<br><br>Modified: llvm/trunk/test/Object/obj2yaml.test<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/obj2yaml.test?rev=182169&r1=182168&r2=182169&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/obj2yaml.test?rev=182169&r1=182168&r2=182169&view=diff</a><br>==============================================================================<br>--- llvm/trunk/test/Object/obj2yaml.test (original)<br>+++ llvm/trunk/test/Object/obj2yaml.test Fri May 17 17:58:42 2013<br>@@ -2,169 +2,151 @@ RUN: obj2yaml %p/Inputs/trivial-object-t<br>RUN: obj2yaml %p/Inputs/trivial-object-test.coff-x86-64 | FileCheck %s --check-prefix COFF-X86-64<br><br><br>-COFF-I386: header: !Header<br>-COFF-I386-NEXT:  Machine: IMAGE_FILE_MACHINE_I386 # (0x14c)<br>+COFF-I386: header:<br>+COFF-I386-NEXT:  Machine: IMAGE_FILE_MACHINE_I386<br><br>COFF-I386: sections:<br>-COFF-I386-NEXT:   - !Section<br>-COFF-I386-NEXT:    Name: .text<br>-COFF-I386-NEXT:    Characteristics: [IMAGE_SCN_CNT_CODE, IMAGE_SCN_ALIGN_16BYTES, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ, ] # 0x60500020<br>-COFF-I386-NEXT:    SectionData:  !hex "83EC0CC744240800000000C7042400000000E800000000E8000000008B44240883C40CC3" # |....D$.......$...............D$.....|<br>+COFF-I386-NEXT:  - Name: .text<br>+COFF-I386-NEXT:    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]<br>+COFF-I386-NEXT:    Alignment: 16<br>+COFF-I386-NEXT:    SectionData:  83EC0CC744240800000000C7042400000000E800000000E8000000008B44240883C40CC3<br><br>COFF-I386:    Relocations:<br>-COFF-I386-NEXT:      - !Relocation<br>-COFF-I386-NEXT:        VirtualAddress: 0xe<br>+COFF-I386-NEXT:      - VirtualAddress: 14<br>COFF-I386-NEXT:        SymbolTableIndex: 5<br>COFF-I386-NEXT:        Type: IMAGE_REL_I386_DIR32<br><br>-COFF-I386:      - !Relocation<br>-COFF-I386-NEXT:        VirtualAddress: 0x13<br>+COFF-I386:           - VirtualAddress: 19<br>COFF-I386-NEXT:        SymbolTableIndex: 6<br>COFF-I386-NEXT:        Type: IMAGE_REL_I386_REL32<br><br>-COFF-I386:      - !Relocation<br>-COFF-I386-NEXT:        VirtualAddress: 0x18<br>+COFF-I386:           - VirtualAddress: 24<br>COFF-I386-NEXT:        SymbolTableIndex: 7<br>COFF-I386-NEXT:        Type: IMAGE_REL_I386_REL32<br><br>-COFF-I386:  - !Section<br>-COFF-I386-NEXT:    Name: .data<br>-COFF-I386-NEXT:    Characteristics: [IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_ALIGN_1BYTES, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE, ] # 0xc0100040<br>-COFF-I386-NEXT:    SectionData:  !hex "48656C6C6F20576F726C642100" # |Hello World!.|<br>+COFF-I386:       - Name: .data<br>+COFF-I386-NEXT:    Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]<br>+COFF-I386-NEXT:    Alignment: 1<br>+COFF-I386-NEXT:    SectionData: 48656C6C6F20576F726C642100<br><br>COFF-I386: symbols:<br>-COFF-I386-NEXT:  - !Symbol<br>-COFF-I386-NEXT:    Name: .text<br>+COFF-I386-NEXT:  - Name: .text<br>COFF-I386-NEXT:    Value: 0<br>COFF-I386-NEXT:    SectionNumber: 1<br>-COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_STATIC # (3)<br>+COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_STATIC<br>COFF-I386-NEXT:    NumberOfAuxSymbols: 1<br>-COFF-I386-NEXT:    AuxillaryData:  !hex "240000000300000000000000010000000000" # |$.................|<br>+COFF-I386-NEXT:    AuxiliaryData: 240000000300000000000000010000000000<br><br>-COFF-I386:  - !Symbol<br>-COFF-I386-NEXT:    Name: .data<br>+COFF-I386:       - Name: .data<br>COFF-I386-NEXT:    Value: 0<br>COFF-I386-NEXT:    SectionNumber: 2<br>-COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_STATIC # (3)<br>+COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_STATIC<br>COFF-I386-NEXT:    NumberOfAuxSymbols: 1<br>-COFF-I386-NEXT:    AuxillaryData:  !hex "0D0000000000000000000000020000000000" # |..................|<br>+COFF-I386-NEXT:    AuxiliaryData: 0D0000000000000000000000020000000000<br><br>-COFF-I386:  - !Symbol<br>-COFF-I386-NEXT:    Name: _main<br>+COFF-I386:       - Name: _main<br>COFF-I386-NEXT:    Value: 0<br>COFF-I386-NEXT:    SectionNumber: 1<br>-COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_FUNCTION # (2)<br>-COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2)<br>+COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_FUNCTION<br>+COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_EXTERNAL<br><br>-COFF-I386:  - !Symbol<br>-COFF-I386-NEXT:    Name: L_.str<br>+COFF-I386:       - Name: L_.str<br>COFF-I386-NEXT:    Value: 0<br>COFF-I386-NEXT:    SectionNumber: 2<br>-COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_STATIC # (3)<br>+COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_STATIC<br><br>-COFF-I386:  - !Symbol<br>-COFF-I386-NEXT:    Name: _puts<br>+COFF-I386:       - Name: _puts<br>COFF-I386-NEXT:    Value: 0<br>COFF-I386-NEXT:    SectionNumber: 0<br>-COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2)<br>+COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_EXTERNAL<br><br>-COFF-I386:  - !Symbol<br>-COFF-I386-NEXT:    Name: _SomeOtherFunction<br>+COFF-I386:       - Name: _SomeOtherFunction<br>COFF-I386-NEXT:    Value: 0<br>COFF-I386-NEXT:    SectionNumber: 0<br>-COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2)<br>+COFF-I386-NEXT:    SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-I386-NEXT:    ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-I386-NEXT:    StorageClass: IMAGE_SYM_CLASS_EXTERNAL<br><br><br>-COFF-X86-64: header: !Header<br>-COFF-X86-64-NEXT:  Machine: IMAGE_FILE_MACHINE_AMD64 # (0x8664)<br>+COFF-X86-64: header:<br>+COFF-X86-64-NEXT:  Machine: IMAGE_FILE_MACHINE_AMD64<br><br>COFF-X86-64: sections:<br>-COFF-X86-64-NEXT:   - !Section<br>-COFF-X86-64-NEXT:     Name: .text<br>-COFF-X86-64-NEXT:     Characteristics: [IMAGE_SCN_CNT_CODE, IMAGE_SCN_ALIGN_16BYTES, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ, ] # 0x60500020<br>-COFF-X86-64-NEXT:     SectionData:  !hex "4883EC28C744242400000000488D0D00000000E800000000E8000000008B4424244883C428C3" # |H..(.D$$....H.................D$$H..(.|<br>+COFF-X86-64-NEXT:   - Name: .text<br>+COFF-X86-64-NEXT:     Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]<br>+COFF-X86-64-NEXT:     Alignment: 16<br>+COFF-X86-64-NEXT:     SectionData: 4883EC28C744242400000000488D0D00000000E800000000E8000000008B4424244883C428C3<br><br>COFF-X86-64:     Relocations:<br>-COFF-X86-64-NEXT:       - !Relocation<br>-COFF-X86-64-NEXT:         VirtualAddress: 0xf<br>+COFF-X86-64-NEXT:       - VirtualAddress: 15<br>COFF-X86-64-NEXT:         SymbolTableIndex: 5<br>COFF-X86-64-NEXT:         Type: IMAGE_REL_AMD64_REL32<br><br>-COFF-X86-64:       - !Relocation<br>-COFF-X86-64-NEXT:         VirtualAddress: 0x14<br>+COFF-X86-64:            - VirtualAddress: 20<br>COFF-X86-64-NEXT:         SymbolTableIndex: 6<br>COFF-X86-64-NEXT:         Type: IMAGE_REL_AMD64_REL32<br><br>-COFF-X86-64:       - !Relocation<br>-COFF-X86-64-NEXT:         VirtualAddress: 0x19<br>+COFF-X86-64:            - VirtualAddress: 25<br>COFF-X86-64-NEXT:         SymbolTableIndex: 7<br>COFF-X86-64-NEXT:         Type: IMAGE_REL_AMD64_REL32<br><br>-COFF-X86-64:   - !Section<br>-COFF-X86-64-NEXT:     Name: .data<br>-COFF-X86-64-NEXT:     Characteristics: [IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_ALIGN_1BYTES, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE, ] # 0xc0100040<br>-COFF-X86-64-NEXT:     SectionData:  !hex "48656C6C6F20576F726C642100" # |Hello World!.|<br>+COFF-X86-64:        - Name: .data<br>+COFF-X86-64-NEXT:     Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]<br>+COFF-X86-64-NEXT:     Alignment: 1<br>+COFF-X86-64-NEXT:     SectionData: 48656C6C6F20576F726C642100<br><br>COFF-X86-64: symbols:<br>-COFF-X86-64-NEXT:   - !Symbol<br>-COFF-X86-64-NEXT:     Name: .text<br>+COFF-X86-64-NEXT:   - Name: .text<br>COFF-X86-64-NEXT:     Value: 0<br>COFF-X86-64-NEXT:     SectionNumber: 1<br>-COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_STATIC # (3)<br>+COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_STATIC<br>COFF-X86-64-NEXT:     NumberOfAuxSymbols: 1<br>-COFF-X86-64-NEXT:     AuxillaryData:  !hex "260000000300000000000000010000000000" # |&.................|<br>+COFF-X86-64-NEXT:     AuxiliaryData: 260000000300000000000000010000000000<br><br>-COFF-X86-64:   - !Symbol<br>-COFF-X86-64-NEXT:     Name: .data<br>+COFF-X86-64:        - Name: .data<br>COFF-X86-64-NEXT:     Value: 0<br>COFF-X86-64-NEXT:     SectionNumber: 2<br>-COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_STATIC # (3)<br>+COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_STATIC<br>COFF-X86-64-NEXT:     NumberOfAuxSymbols: 1<br>-COFF-X86-64-NEXT:     AuxillaryData:  !hex "0D0000000000000000000000020000000000" # |..................|<br>+COFF-X86-64-NEXT:     AuxiliaryData: 0D0000000000000000000000020000000000<br><br>-COFF-X86-64:   - !Symbol<br>-COFF-X86-64-NEXT:     Name: main<br>+COFF-X86-64:        - Name: main<br>COFF-X86-64-NEXT:     Value: 0<br>COFF-X86-64-NEXT:     SectionNumber: 1<br>-COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2)<br>+COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_EXTERNAL<br><br>-COFF-X86-64:   - !Symbol<br>-COFF-X86-64-NEXT:     Name: L.str<br>+COFF-X86-64:        - Name: L.str<br>COFF-X86-64-NEXT:     Value: 0<br>COFF-X86-64-NEXT:     SectionNumber: 2<br>-COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_STATIC # (3)<br>+COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_STATIC<br><br>-COFF-X86-64:   - !Symbol<br>-COFF-X86-64-NEXT:     Name: puts<br>+COFF-X86-64:        - Name: puts<br>COFF-X86-64-NEXT:     Value: 0<br>COFF-X86-64-NEXT:     SectionNumber: 0<br>-COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2)<br>+COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_EXTERNAL<br><br>-COFF-X86-64:   - !Symbol<br>-COFF-X86-64-NEXT:     Name: SomeOtherFunction<br>+COFF-X86-64:        - Name: SomeOtherFunction<br>COFF-X86-64-NEXT:     Value: 0<br>COFF-X86-64-NEXT:     SectionNumber: 0<br>-COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL # (0)<br>-COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_EXTERNAL # (2)<br>+COFF-X86-64-NEXT:     SimpleType: IMAGE_SYM_TYPE_NULL<br>+COFF-X86-64-NEXT:     ComplexType: IMAGE_SYM_DTYPE_NULL<br>+COFF-X86-64-NEXT:     StorageClass: IMAGE_SYM_CLASS_EXTERNAL<br><br>Modified: llvm/trunk/tools/obj2yaml/coff2yaml.cpp<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/coff2yaml.cpp?rev=182169&r1=182168&r2=182169&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/obj2yaml/coff2yaml.cpp?rev=182169&r1=182168&r2=182169&view=diff</a><br>==============================================================================<br>--- llvm/trunk/tools/obj2yaml/coff2yaml.cpp (original)<br>+++ llvm/trunk/tools/obj2yaml/coff2yaml.cpp Fri May 17 17:58:42 2013<br>@@ -9,346 +9,124 @@<br><br>#include "obj2yaml.h"<br>#include "llvm/Object/COFF.h"<br>+#include "llvm/Object/COFFYaml.h"<br>+#include "llvm/Support/ErrorHandling.h"<br>+#include "llvm/Support/YAMLTraits.h"<br><br>using namespace llvm;<br><br>-template <typename One, typename Two><br>-struct pod_pair { // I'd much rather use std::pair, but it's not a POD<br>-  One first;<br>-  Two second;<br>-};<br>-<br>-#define STRING_PAIR(x)  {COFF::x, #x}<br>-static const pod_pair<COFF::MachineTypes, const char *><br>-MachineTypePairs [] = {<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_UNKNOWN),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_AM33),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_AMD64),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_ARM),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_ARMV7),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_EBC),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_I386),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_IA64),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_M32R),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_MIPS16),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_MIPSFPU),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_MIPSFPU16),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_POWERPC),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_POWERPCFP),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_R4000),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_SH3),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_SH3DSP),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_SH4),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_SH5),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_THUMB),<br>-  STRING_PAIR(IMAGE_FILE_MACHINE_WCEMIPSV2)<br>-};<br>-<br>-static const pod_pair<COFF::SectionCharacteristics, const char *><br>-SectionCharacteristicsPairs1 [] = {<br>-  STRING_PAIR(IMAGE_SCN_TYPE_NO_PAD),<br>-  STRING_PAIR(IMAGE_SCN_CNT_CODE),<br>-  STRING_PAIR(IMAGE_SCN_CNT_INITIALIZED_DATA),<br>-  STRING_PAIR(IMAGE_SCN_CNT_UNINITIALIZED_DATA),<br>-  STRING_PAIR(IMAGE_SCN_LNK_OTHER),<br>-  STRING_PAIR(IMAGE_SCN_LNK_INFO),<br>-  STRING_PAIR(IMAGE_SCN_LNK_REMOVE),<br>-  STRING_PAIR(IMAGE_SCN_LNK_COMDAT),<br>-  STRING_PAIR(IMAGE_SCN_GPREL),<br>-  STRING_PAIR(IMAGE_SCN_MEM_PURGEABLE),<br>-  STRING_PAIR(IMAGE_SCN_MEM_16BIT),<br>-  STRING_PAIR(IMAGE_SCN_MEM_LOCKED),<br>-  STRING_PAIR(IMAGE_SCN_MEM_PRELOAD)<br>-};<br>-<br>-static const pod_pair<COFF::SectionCharacteristics, const char *><br>-SectionCharacteristicsPairsAlignment [] = {<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_1BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_2BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_4BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_8BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_16BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_32BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_64BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_128BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_256BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_512BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_1024BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_2048BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_4096BYTES),<br>-  STRING_PAIR(IMAGE_SCN_ALIGN_8192BYTES)<br>-};<br>-<br>-static const pod_pair<COFF::SectionCharacteristics, const char *><br>-SectionCharacteristicsPairs2 [] = {<br>-  STRING_PAIR(IMAGE_SCN_LNK_NRELOC_OVFL),<br>-  STRING_PAIR(IMAGE_SCN_MEM_DISCARDABLE),<br>-  STRING_PAIR(IMAGE_SCN_MEM_NOT_CACHED),<br>-  STRING_PAIR(IMAGE_SCN_MEM_NOT_PAGED),<br>-  STRING_PAIR(IMAGE_SCN_MEM_SHARED),<br>-  STRING_PAIR(IMAGE_SCN_MEM_EXECUTE),<br>-  STRING_PAIR(IMAGE_SCN_MEM_READ),<br>-  STRING_PAIR(IMAGE_SCN_MEM_WRITE)<br>-};<br>-<br>-static const pod_pair<COFF::SymbolBaseType, const char *><br>-SymbolBaseTypePairs [] = {<br>-  STRING_PAIR(IMAGE_SYM_TYPE_NULL),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_VOID),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_CHAR),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_SHORT),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_INT),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_LONG),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_FLOAT),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_DOUBLE),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_STRUCT),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_UNION),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_ENUM),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_MOE),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_BYTE),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_WORD),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_UINT),<br>-  STRING_PAIR(IMAGE_SYM_TYPE_DWORD)<br>-};<br>-<br>-static const pod_pair<COFF::SymbolComplexType, const char *><br>-SymbolComplexTypePairs [] = {<br>-  STRING_PAIR(IMAGE_SYM_DTYPE_NULL),<br>-  STRING_PAIR(IMAGE_SYM_DTYPE_POINTER),<br>-  STRING_PAIR(IMAGE_SYM_DTYPE_FUNCTION),<br>-  STRING_PAIR(IMAGE_SYM_DTYPE_ARRAY),<br>-};<br>-<br>-static const pod_pair<COFF::SymbolStorageClass, const char *><br>-SymbolStorageClassPairs [] = {<br>-  STRING_PAIR(IMAGE_SYM_CLASS_END_OF_FUNCTION),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_NULL),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_AUTOMATIC),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_EXTERNAL),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_STATIC),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_REGISTER),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_EXTERNAL_DEF),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_LABEL),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_UNDEFINED_LABEL),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_MEMBER_OF_STRUCT),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_ARGUMENT),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_STRUCT_TAG),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_MEMBER_OF_UNION),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_UNION_TAG),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_TYPE_DEFINITION),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_UNDEFINED_STATIC),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_ENUM_TAG),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_MEMBER_OF_ENUM),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_REGISTER_PARAM),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_BIT_FIELD),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_BLOCK),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_FUNCTION),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_END_OF_STRUCT),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_FILE),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_SECTION),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_WEAK_EXTERNAL),<br>-  STRING_PAIR(IMAGE_SYM_CLASS_CLR_TOKEN),<br>-};<br>+namespace {<br><br>-static const pod_pair<COFF::RelocationTypeX86, const char *><br>-RelocationTypeX86Pairs [] = {<br>-  STRING_PAIR(IMAGE_REL_I386_ABSOLUTE),<br>-  STRING_PAIR(IMAGE_REL_I386_DIR16),<br>-  STRING_PAIR(IMAGE_REL_I386_REL16),<br>-  STRING_PAIR(IMAGE_REL_I386_DIR32),<br>-  STRING_PAIR(IMAGE_REL_I386_DIR32NB),<br>-  STRING_PAIR(IMAGE_REL_I386_SEG12),<br>-  STRING_PAIR(IMAGE_REL_I386_SECTION),<br>-  STRING_PAIR(IMAGE_REL_I386_SECREL),<br>-  STRING_PAIR(IMAGE_REL_I386_TOKEN),<br>-  STRING_PAIR(IMAGE_REL_I386_SECREL7),<br>-  STRING_PAIR(IMAGE_REL_I386_REL32),<br>-  STRING_PAIR(IMAGE_REL_AMD64_ABSOLUTE),<br>-  STRING_PAIR(IMAGE_REL_AMD64_ADDR64),<br>-  STRING_PAIR(IMAGE_REL_AMD64_ADDR32),<br>-  STRING_PAIR(IMAGE_REL_AMD64_ADDR32NB),<br>-  STRING_PAIR(IMAGE_REL_AMD64_REL32),<br>-  STRING_PAIR(IMAGE_REL_AMD64_REL32_1),<br>-  STRING_PAIR(IMAGE_REL_AMD64_REL32_2),<br>-  STRING_PAIR(IMAGE_REL_AMD64_REL32_3),<br>-  STRING_PAIR(IMAGE_REL_AMD64_REL32_4),<br>-  STRING_PAIR(IMAGE_REL_AMD64_REL32_5),<br>-  STRING_PAIR(IMAGE_REL_AMD64_SECTION),<br>-  STRING_PAIR(IMAGE_REL_AMD64_SECREL),<br>-  STRING_PAIR(IMAGE_REL_AMD64_SECREL7),<br>-  STRING_PAIR(IMAGE_REL_AMD64_TOKEN),<br>-  STRING_PAIR(IMAGE_REL_AMD64_SREL32),<br>-  STRING_PAIR(IMAGE_REL_AMD64_PAIR),<br>-  STRING_PAIR(IMAGE_REL_AMD64_SSPAN32)<br>-};<br>+class COFFDumper {<br>+  const object::COFFObjectFile &Obj;<br>+  COFFYAML::Object YAMLObj;<br>+  void dumpHeader(const object::coff_file_header *Header);<br>+  void dumpSections(unsigned numSections);<br>+  void dumpSymbols(unsigned numSymbols);<br>+  StringRef getHexString(ArrayRef<uint8_t> Data);<br>+  std::vector<std::string> Strings;<br><br>-static const pod_pair<COFF::RelocationTypesARM, const char *><br>-RelocationTypesARMPairs [] = {<br>-  STRING_PAIR(IMAGE_REL_ARM_ABSOLUTE),<br>-  STRING_PAIR(IMAGE_REL_ARM_ADDR32),<br>-  STRING_PAIR(IMAGE_REL_ARM_ADDR32NB),<br>-  STRING_PAIR(IMAGE_REL_ARM_BRANCH24),<br>-  STRING_PAIR(IMAGE_REL_ARM_BRANCH11),<br>-  STRING_PAIR(IMAGE_REL_ARM_TOKEN),<br>-  STRING_PAIR(IMAGE_REL_ARM_BLX24),<br>-  STRING_PAIR(IMAGE_REL_ARM_BLX11),<br>-  STRING_PAIR(IMAGE_REL_ARM_SECTION),<br>-  STRING_PAIR(IMAGE_REL_ARM_SECREL),<br>-  STRING_PAIR(IMAGE_REL_ARM_MOV32A),<br>-  STRING_PAIR(IMAGE_REL_ARM_MOV32T),<br>-  STRING_PAIR(IMAGE_REL_ARM_BRANCH20T),<br>-  STRING_PAIR(IMAGE_REL_ARM_BRANCH24T),<br>-  STRING_PAIR(IMAGE_REL_ARM_BLX23T)<br>+public:<br>+  COFFDumper(const object::COFFObjectFile &Obj);<br>+  COFFYAML::Object &getYAMLObj();<br>};<br>-#undef STRING_PAIR<br><br>-static raw_ostream &writeName(raw_ostream &Out,<br>-                              const char *Name, std::size_t NameSize) {<br>-  for (std::size_t i = 0; i < NameSize; ++i) {<br>-    if (!Name[i]) break;<br>-    Out << Name[i];<br>-  }<br>-  return Out;<br>}<br><br>-// Given an array of pod_pair<enum, const char *>, write all enums that match<br>-template <typename T, std::size_t N><br>-static raw_ostream &writeBitMask(raw_ostream &Out,<br>-                                 const pod_pair<T, const char *> (&Arr)[N],<br>-                                 unsigned long Val) {<br>-  for (std::size_t i = 0; i < N; ++i)<br>-    if (Val & Arr[i].first)<br>-      Out << Arr[i].second << ", ";<br>-  return Out;<br>+static void check(error_code ec) {<br>+  if (ec)<br>+    report_fatal_error(ec.message());<br>}<br><br>-// Given an array of pod_pair<enum, const char *>, look up a value<br>-template <typename T, std::size_t N><br>-const char *nameLookup(const pod_pair<T, const char *> (&Arr)[N],<br>-                       unsigned long Val, const char *NotFound = NULL) {<br>-  T n = static_cast<T>(Val);<br>-  for (std::size_t i = 0; i < N; ++i)<br>-    if (n == Arr[i].first)<br>-      return Arr[i].second;<br>-  return NotFound;<br>+COFFDumper::COFFDumper(const object::COFFObjectFile &Obj) : Obj(Obj) {<br>+  const object::coff_file_header *Header;<br>+  check(Obj.getHeader(Header));<br>+  dumpHeader(Header);<br>+  dumpSections(Header->NumberOfSections);<br>+  dumpSymbols(Header->NumberOfSymbols);<br>}<br><br>-static void yamlCOFFHeader(const object::coff_file_header *Header,<br>-                           raw_ostream &Out) {<br>-  Out << "header: !Header\n";<br>-  Out << "  Machine: ";<br>-  Out << nameLookup(MachineTypePairs, Header->Machine, "# Unknown_MachineTypes")<br>-      << " # (";<br>-  objyaml::writeHexNumber(Out, Header->Machine) << ")\n\n";<br>+void COFFDumper::dumpHeader(const object::coff_file_header *Header) {<br>+  YAMLObj.Header.Machine = Header->Machine;<br>+  YAMLObj.Header.Characteristics = Header->Characteristics;<br>}<br><br>-<br>-static void yamlCOFFSections(object::COFFObjectFile &Obj,<br>-                             std::size_t NumSections, raw_ostream &Out) {<br>+void COFFDumper::dumpSections(unsigned NumSections) {<br>+  std::vector<COFFYAML::Section> &Sections = YAMLObj.Sections;<br>  error_code ec;<br>-  Out << "sections:\n";<br>  for (object::section_iterator iter = Obj.begin_sections();<br>       iter != Obj.end_sections(); iter.increment(ec)) {<br>-    const object::coff_section *sect = Obj.getCOFFSection(iter);<br>-<br>-    Out << "  - !Section\n";<br>-    Out << "    Name: ";<br>-    writeName(Out, sect->Name, sizeof(sect->Name)) << '\n';<br>-<br>-    Out << "    Characteristics: [";<br>-    writeBitMask(Out, SectionCharacteristicsPairs1, sect->Characteristics);<br>-    Out << nameLookup(SectionCharacteristicsPairsAlignment,<br>-        sect->Characteristics & 0x00F00000, "# Unrecognized_IMAGE_SCN_ALIGN")<br>-        << ", ";<br>-    writeBitMask(Out, SectionCharacteristicsPairs2, sect->Characteristics);<br>-    Out << "] # ";<br>-    objyaml::writeHexNumber(Out, sect->Characteristics) << '\n';<br>+    check(ec);<br>+    const object::coff_section *Sect = Obj.getCOFFSection(iter);<br>+    COFFYAML::Section Sec;<br>+    Sec.Name = Sect->Name; // FIXME: check the null termination!<br>+    uint32_t Characteristics = Sect->Characteristics;<br>+    Sec.Header.Characteristics = Characteristics;<br>+    Sec.Alignment = 1 << (((Characteristics >> 20) & 0xf) - 1);<br><br>    ArrayRef<uint8_t> sectionData;<br>-    Obj.getSectionContents(sect, sectionData);<br>-    Out << "    SectionData: ";<br>-    objyaml::writeHexStream(Out, sectionData) << '\n';<br>-    if (iter->begin_relocations() != iter->end_relocations())<br>-      Out << "    Relocations:\n";<br>+    Obj.getSectionContents(Sect, sectionData);<br>+    Sec.SectionData = getHexString(sectionData);<br>+<br>+    std::vector<COFF::relocation> Relocations;<br>    for (object::relocation_iterator rIter = iter->begin_relocations();<br>                       rIter != iter->end_relocations(); rIter.increment(ec)) {<br>      const object::coff_relocation *reloc = Obj.getCOFFRelocation(rIter);<br>-<br>-        Out << "      - !Relocation\n";<br>-        Out << "        VirtualAddress: " ;<br>-        objyaml::writeHexNumber(Out, reloc->VirtualAddress) << '\n';<br>-        Out << "        SymbolTableIndex: " << reloc->SymbolTableIndex << '\n';<br>-        Out << "        Type: "<br>-            << nameLookup(RelocationTypeX86Pairs, reloc->Type) << '\n';<br>-    // TODO: Use the correct reloc type for the machine.<br>-        Out << '\n';<br>-      }<br>-<br>+      COFF::relocation Rel;<br>+      Rel.VirtualAddress = reloc->VirtualAddress;<br>+      Rel.SymbolTableIndex = reloc->SymbolTableIndex;<br>+      Rel.Type = reloc->Type;<br>+      Relocations.push_back(Rel);<br>+    }<br>+    Sec.Relocations = Relocations;<br>+    Sections.push_back(Sec);<br>  }<br>}<br><br>-static void yamlCOFFSymbols(object::COFFObjectFile &Obj, std::size_t NumSymbols,<br>-                            raw_ostream &Out) {<br>+void COFFDumper::dumpSymbols(unsigned NumSymbols) {<br>  error_code ec;<br>-  Out << "symbols:\n";<br>+  std::vector<COFFYAML::Symbol> &Symbols = YAMLObj.Symbols;<br>  for (object::symbol_iterator iter = Obj.begin_symbols();<br>       iter != Obj.end_symbols(); iter.increment(ec)) {<br>- // Gather all the info that we need<br>-    StringRef str;<br>-    const object::coff_symbol *symbol = Obj.getCOFFSymbol(iter);<br>-    Obj.getSymbolName(symbol, str);<br>-    std::size_t  simpleType  = symbol->getBaseType();<br>-    std::size_t complexType  = symbol->getComplexType();<br>-    std::size_t storageClass = symbol->StorageClass;<br>-<br>-    Out << "  - !Symbol\n";<br>-    Out << "    Name: " << str << '\n';<br>-<br>-    Out << "    Value: "         << symbol->Value << '\n';<br>-    Out << "    SectionNumber: " << symbol->SectionNumber << '\n';<br>-<br>-    Out << "    SimpleType: "<br>-        << nameLookup(SymbolBaseTypePairs, simpleType,<br>-            "# Unknown_SymbolBaseType")<br>-        << " # (" << simpleType << ")\n";<br>-<br>-    Out << "    ComplexType: "<br>-        << nameLookup(SymbolComplexTypePairs, complexType,<br>-                "# Unknown_SymbolComplexType")<br>-        << " # (" << complexType << ")\n";<br>-<br>-    Out << "    StorageClass: "<br>-        << nameLookup(SymbolStorageClassPairs, storageClass,<br>-              "# Unknown_StorageClass")<br>-        << " # (" << (int) storageClass << ")\n";<br>-<br>-    if (symbol->NumberOfAuxSymbols > 0) {<br>-      ArrayRef<uint8_t> aux = Obj.getSymbolAuxData(symbol);<br>-      Out << "    NumberOfAuxSymbols: "<br>-          << (int) symbol->NumberOfAuxSymbols << '\n';<br>-      Out << "    AuxillaryData: ";<br>-      objyaml::writeHexStream(Out, aux);<br>-    }<br>+    check(ec);<br>+    const object::coff_symbol *Symbol = Obj.getCOFFSymbol(iter);<br>+    COFFYAML::Symbol Sym;<br>+    Obj.getSymbolName(Symbol, Sym.Name);<br>+    Sym.SimpleType = COFF::SymbolBaseType(Symbol->getBaseType());<br>+    Sym.ComplexType = COFF::SymbolComplexType(Symbol->getComplexType());<br>+    Sym.Header.StorageClass = Symbol->StorageClass;<br>+    Sym.Header.Value = Symbol->Value;<br>+    Sym.Header.SectionNumber = Symbol->SectionNumber;<br>+    Sym.Header.NumberOfAuxSymbols = Symbol->NumberOfAuxSymbols;<br>+    Sym.AuxiliaryData = getHexString(Obj.getSymbolAuxData(Symbol));<br>+    Symbols.push_back(Sym);<br>+  }<br>+}<br><br>-    Out << '\n';<br>+StringRef COFFDumper::getHexString(ArrayRef<uint8_t> Data) {<br>+  std::string S;<br>+  for (ArrayRef<uint8_t>::iterator I = Data.begin(), E = Data.end(); I != E;<br>+       ++I) {<br>+    uint8_t Byte = *I;<br>+    S.push_back(hexdigit(Byte >> 4));<br>+    S.push_back(hexdigit(Byte & 0xf));<br>  }<br>+  Strings.push_back(S);<br>+  return Strings.back();<br>}<br><br>+COFFYAML::Object &COFFDumper::getYAMLObj() {<br>+  return YAMLObj;<br>+}<br><br>-error_code coff2yaml(raw_ostream &Out, MemoryBuffer *TheObj) {<br>+error_code coff2yaml(raw_ostream &Out, MemoryBuffer *Buff) {<br>  error_code ec;<br>-  object::COFFObjectFile obj(TheObj, ec);<br>-  if (ec)<br>-    return ec;<br>-<br>-  const object::coff_file_header *hd;<br>-  ec = obj.getHeader(hd);<br>-  if (ec)<br>-    return ec;<br>+  object::COFFObjectFile Obj(Buff, ec);<br>+  check(ec);<br>+  COFFDumper Dumper(Obj);<br><br>-  yamlCOFFHeader(hd, Out);<br>-  yamlCOFFSections(obj, hd->NumberOfSections, Out);<br>-  yamlCOFFSymbols(obj, hd->NumberOfSymbols, Out);<br>+  yaml::Output Yout(Out);<br>+  Yout << Dumper.getYAMLObj();<br><br>-  return ec;<br>+  return object::object_error::success;<br>}<br><br>Modified: llvm/trunk/tools/yaml2obj/CMakeLists.txt<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/CMakeLists.txt?rev=182169&r1=182168&r2=182169&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/CMakeLists.txt?rev=182169&r1=182168&r2=182169&view=diff</a><br>==============================================================================<br>--- llvm/trunk/tools/yaml2obj/CMakeLists.txt (original)<br>+++ llvm/trunk/tools/yaml2obj/CMakeLists.txt Fri May 17 17:58:42 2013<br>@@ -1,3 +1,5 @@<br>+set(LLVM_LINK_COMPONENTS object)<br>+<br>add_llvm_utility(yaml2obj<br>  yaml2obj.cpp<br>  )<br><br>Modified: llvm/trunk/tools/yaml2obj/yaml2obj.cpp<br>URL:<span class="Apple-converted-space"> </span><a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2obj.cpp?rev=182169&r1=182168&r2=182169&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2obj.cpp?rev=182169&r1=182168&r2=182169&view=diff</a><br>==============================================================================<br>--- llvm/trunk/tools/yaml2obj/yaml2obj.cpp (original)<br>+++ llvm/trunk/tools/yaml2obj/yaml2obj.cpp Fri May 17 17:58:42 2013<br>@@ -18,7 +18,7 @@<br>#include "llvm/ADT/StringExtras.h"<br>#include "llvm/ADT/StringMap.h"<br>#include "llvm/ADT/StringSwitch.h"<br>-#include "llvm/Support/COFF.h"<br>+#include "llvm/Object/COFFYaml.h"<br>#include "llvm/Support/Casting.h"<br>#include "llvm/Support/CommandLine.h"<br>#include "llvm/Support/Endian.h"<br>@@ -27,7 +27,6 @@<br>#include "llvm/Support/PrettyStackTrace.h"<br>#include "llvm/Support/Signals.h"<br>#include "llvm/Support/SourceMgr.h"<br>-#include "llvm/Support/YAMLTraits.h"<br>#include "llvm/Support/raw_ostream.h"<br>#include "llvm/Support/system_error.h"<br>#include <vector><br>@@ -37,41 +36,6 @@ using namespace llvm;<br>static cl::opt<std::string><br>  Input(cl::Positional, cl::desc("<input>"), cl::init("-"));<br><br>-// The structure of the yaml files is not an exact 1:1 match to COFF. In order<br>-// to use yaml::IO, we use these structures which are closer to the source.<br>-namespace COFFYAML {<br>-  struct Section {<br>-    COFF::section Header;<br>-    unsigned Alignment;<br>-    StringRef SectionData;<br>-    std::vector<COFF::relocation> Relocations;<br>-    StringRef Name;<br>-    Section() {<br>-      memset(&Header, 0, sizeof(COFF::section));<br>-    }<br>-  };<br>-<br>-  struct Symbol {<br>-    COFF::symbol Header;<br>-    COFF::SymbolBaseType SimpleType;<br>-    COFF::SymbolComplexType ComplexType;<br>-    StringRef AuxiliaryData;<br>-    StringRef Name;<br>-    Symbol() {<br>-      memset(&Header, 0, sizeof(COFF::symbol));<br>-    }<br>-  };<br>-<br>-  struct Object {<br>-    COFF::header Header;<br>-    std::vector<Section> Sections;<br>-    std::vector<Symbol> Symbols;<br>-    Object() {<br>-      memset(&Header, 0, sizeof(COFF::header));<br>-    }<br>-  };<br>-}<br>-<br>/// This parses a yaml stream that represents a COFF object file.<br>/// See docs/yaml2obj for the yaml scheema.<br>struct COFFParser {<br>@@ -322,329 +286,6 @@ bool writeCOFF(COFFParser &CP, raw_ostre<br>  return true;<br>}<br><br>-LLVM_YAML_IS_SEQUENCE_VECTOR(COFF::relocation)<br>-LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section)<br>-LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol)<br>-<br>-namespace llvm {<br>-<br>-namespace COFF {<br>-  Characteristics operator|(Characteristics a, Characteristics b) {<br>-    uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);<br>-    return static_cast<Characteristics>(Ret);<br>-  }<br>-<br>-  SectionCharacteristics<br>-  operator|(SectionCharacteristics a, SectionCharacteristics b) {<br>-    uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);<br>-    return static_cast<SectionCharacteristics>(Ret);<br>-  }<br>-}<br>-<br>-namespace yaml {<br>-<br>-#define BCase(X) IO.bitSetCase(Value, #X, COFF::X);<br>-<br>-template <><br>-struct ScalarBitSetTraits<COFF::SectionCharacteristics> {<br>-  static void bitset(IO &IO, COFF::SectionCharacteristics &Value) {<br>-    BCase(IMAGE_SCN_TYPE_NO_PAD);<br>-    BCase(IMAGE_SCN_CNT_CODE);<br>-    BCase(IMAGE_SCN_CNT_INITIALIZED_DATA);<br>-    BCase(IMAGE_SCN_CNT_UNINITIALIZED_DATA);<br>-    BCase(IMAGE_SCN_LNK_OTHER);<br>-    BCase(IMAGE_SCN_LNK_INFO);<br>-    BCase(IMAGE_SCN_LNK_REMOVE);<br>-    BCase(IMAGE_SCN_LNK_COMDAT);<br>-    BCase(IMAGE_SCN_GPREL);<br>-    BCase(IMAGE_SCN_MEM_PURGEABLE);<br>-    BCase(IMAGE_SCN_MEM_16BIT);<br>-    BCase(IMAGE_SCN_MEM_LOCKED);<br>-    BCase(IMAGE_SCN_MEM_PRELOAD);<br>-    BCase(IMAGE_SCN_LNK_NRELOC_OVFL);<br>-    BCase(IMAGE_SCN_MEM_DISCARDABLE);<br>-    BCase(IMAGE_SCN_MEM_NOT_CACHED);<br>-    BCase(IMAGE_SCN_MEM_NOT_PAGED);<br>-    BCase(IMAGE_SCN_MEM_SHARED);<br>-    BCase(IMAGE_SCN_MEM_EXECUTE);<br>-    BCase(IMAGE_SCN_MEM_READ);<br>-    BCase(IMAGE_SCN_MEM_WRITE);<br>-  }<br>-};<br>-<br>-template <><br>-struct ScalarBitSetTraits<COFF::Characteristics> {<br>-  static void bitset(IO &IO, COFF::Characteristics &Value) {<br>-    BCase(IMAGE_FILE_RELOCS_STRIPPED);<br>-    BCase(IMAGE_FILE_EXECUTABLE_IMAGE);<br>-    BCase(IMAGE_FILE_LINE_NUMS_STRIPPED);<br>-    BCase(IMAGE_FILE_LOCAL_SYMS_STRIPPED);<br>-    BCase(IMAGE_FILE_AGGRESSIVE_WS_TRIM);<br>-    BCase(IMAGE_FILE_LARGE_ADDRESS_AWARE);<br>-    BCase(IMAGE_FILE_BYTES_REVERSED_LO);<br>-    BCase(IMAGE_FILE_32BIT_MACHINE);<br>-    BCase(IMAGE_FILE_DEBUG_STRIPPED);<br>-    BCase(IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP);<br>-    BCase(IMAGE_FILE_NET_RUN_FROM_SWAP);<br>-    BCase(IMAGE_FILE_SYSTEM);<br>-    BCase(IMAGE_FILE_DLL);<br>-    BCase(IMAGE_FILE_UP_SYSTEM_ONLY);<br>-    BCase(IMAGE_FILE_BYTES_REVERSED_HI);<br>-  }<br>-};<br>-#undef BCase<br>-<br>-#define ECase(X) IO.enumCase(Value, #X, COFF::X);<br>-<br>-template <><br>-struct ScalarEnumerationTraits<COFF::SymbolComplexType> {<br>-  static void enumeration(IO &IO, COFF::SymbolComplexType &Value) {<br>-    ECase(IMAGE_SYM_DTYPE_NULL);<br>-    ECase(IMAGE_SYM_DTYPE_POINTER);<br>-    ECase(IMAGE_SYM_DTYPE_FUNCTION);<br>-    ECase(IMAGE_SYM_DTYPE_ARRAY);<br>-  }<br>-};<br>-<br>-template <><br>-struct ScalarEnumerationTraits<COFF::SymbolStorageClass> {<br>-  static void enumeration(IO &IO, COFF::SymbolStorageClass &Value) {<br>-    ECase(IMAGE_SYM_CLASS_END_OF_FUNCTION);<br>-    ECase(IMAGE_SYM_CLASS_NULL);<br>-    ECase(IMAGE_SYM_CLASS_AUTOMATIC);<br>-    ECase(IMAGE_SYM_CLASS_EXTERNAL);<br>-    ECase(IMAGE_SYM_CLASS_STATIC);<br>-    ECase(IMAGE_SYM_CLASS_REGISTER);<br>-    ECase(IMAGE_SYM_CLASS_EXTERNAL_DEF);<br>-    ECase(IMAGE_SYM_CLASS_LABEL);<br>-    ECase(IMAGE_SYM_CLASS_UNDEFINED_LABEL);<br>-    ECase(IMAGE_SYM_CLASS_MEMBER_OF_STRUCT);<br>-    ECase(IMAGE_SYM_CLASS_ARGUMENT);<br>-    ECase(IMAGE_SYM_CLASS_STRUCT_TAG);<br>-    ECase(IMAGE_SYM_CLASS_MEMBER_OF_UNION);<br>-    ECase(IMAGE_SYM_CLASS_UNION_TAG);<br>-    ECase(IMAGE_SYM_CLASS_TYPE_DEFINITION);<br>-    ECase(IMAGE_SYM_CLASS_UNDEFINED_STATIC);<br>-    ECase(IMAGE_SYM_CLASS_ENUM_TAG);<br>-    ECase(IMAGE_SYM_CLASS_MEMBER_OF_ENUM);<br>-    ECase(IMAGE_SYM_CLASS_REGISTER_PARAM);<br>-    ECase(IMAGE_SYM_CLASS_BIT_FIELD);<br>-    ECase(IMAGE_SYM_CLASS_BLOCK);<br>-    ECase(IMAGE_SYM_CLASS_FUNCTION);<br>-    ECase(IMAGE_SYM_CLASS_END_OF_STRUCT);<br>-    ECase(IMAGE_SYM_CLASS_FILE);<br>-    ECase(IMAGE_SYM_CLASS_SECTION);<br>-    ECase(IMAGE_SYM_CLASS_WEAK_EXTERNAL);<br>-    ECase(IMAGE_SYM_CLASS_CLR_TOKEN);<br>-  }<br>-};<br>-<br>-template <><br>-struct ScalarEnumerationTraits<COFF::SymbolBaseType> {<br>-  static void enumeration(IO &IO, COFF::SymbolBaseType &Value) {<br>-    ECase(IMAGE_SYM_TYPE_NULL);<br>-    ECase(IMAGE_SYM_TYPE_VOID);<br>-    ECase(IMAGE_SYM_TYPE_CHAR);<br>-    ECase(IMAGE_SYM_TYPE_SHORT);<br>-    ECase(IMAGE_SYM_TYPE_INT);<br>-    ECase(IMAGE_SYM_TYPE_LONG);<br>-    ECase(IMAGE_SYM_TYPE_FLOAT);<br>-    ECase(IMAGE_SYM_TYPE_DOUBLE);<br>-    ECase(IMAGE_SYM_TYPE_STRUCT);<br>-    ECase(IMAGE_SYM_TYPE_UNION);<br>-    ECase(IMAGE_SYM_TYPE_ENUM);<br>-    ECase(IMAGE_SYM_TYPE_MOE);<br>-    ECase(IMAGE_SYM_TYPE_BYTE);<br>-    ECase(IMAGE_SYM_TYPE_WORD);<br>-    ECase(IMAGE_SYM_TYPE_UINT);<br>-    ECase(IMAGE_SYM_TYPE_DWORD);<br>-  }<br>-};<br>-<br>-template <><br>-struct ScalarEnumerationTraits<COFF::MachineTypes> {<br>-  static void enumeration(IO &IO, COFF::MachineTypes &Value) {<br>-    ECase(IMAGE_FILE_MACHINE_UNKNOWN);<br>-    ECase(IMAGE_FILE_MACHINE_AM33);<br>-    ECase(IMAGE_FILE_MACHINE_AMD64);<br>-    ECase(IMAGE_FILE_MACHINE_ARM);<br>-    ECase(IMAGE_FILE_MACHINE_ARMV7);<br>-    ECase(IMAGE_FILE_MACHINE_EBC);<br>-    ECase(IMAGE_FILE_MACHINE_I386);<br>-    ECase(IMAGE_FILE_MACHINE_IA64);<br>-    ECase(IMAGE_FILE_MACHINE_M32R);<br>-    ECase(IMAGE_FILE_MACHINE_MIPS16);<br>-    ECase(IMAGE_FILE_MACHINE_MIPSFPU);<br>-    ECase(IMAGE_FILE_MACHINE_MIPSFPU16);<br>-    ECase(IMAGE_FILE_MACHINE_POWERPC);<br>-    ECase(IMAGE_FILE_MACHINE_POWERPCFP);<br>-    ECase(IMAGE_FILE_MACHINE_R4000);<br>-    ECase(IMAGE_FILE_MACHINE_SH3);<br>-    ECase(IMAGE_FILE_MACHINE_SH3DSP);<br>-    ECase(IMAGE_FILE_MACHINE_SH4);<br>-    ECase(IMAGE_FILE_MACHINE_SH5);<br>-    ECase(IMAGE_FILE_MACHINE_THUMB);<br>-    ECase(IMAGE_FILE_MACHINE_WCEMIPSV2);<br>-  }<br>-};<br>-<br>-template <><br>-struct ScalarEnumerationTraits<COFF::RelocationTypeX86> {<br>-  static void enumeration(IO &IO, COFF::RelocationTypeX86 &Value) {<br>-    ECase(IMAGE_REL_I386_ABSOLUTE);<br>-    ECase(IMAGE_REL_I386_DIR16);<br>-    ECase(IMAGE_REL_I386_REL16);<br>-    ECase(IMAGE_REL_I386_DIR32);<br>-    ECase(IMAGE_REL_I386_DIR32NB);<br>-    ECase(IMAGE_REL_I386_SEG12);<br>-    ECase(IMAGE_REL_I386_SECTION);<br>-    ECase(IMAGE_REL_I386_SECREL);<br>-    ECase(IMAGE_REL_I386_TOKEN);<br>-    ECase(IMAGE_REL_I386_SECREL7);<br>-    ECase(IMAGE_REL_I386_REL32);<br>-    ECase(IMAGE_REL_AMD64_ABSOLUTE);<br>-    ECase(IMAGE_REL_AMD64_ADDR64);<br>-    ECase(IMAGE_REL_AMD64_ADDR32);<br>-    ECase(IMAGE_REL_AMD64_ADDR32NB);<br>-    ECase(IMAGE_REL_AMD64_REL32);<br>-    ECase(IMAGE_REL_AMD64_REL32_1);<br>-    ECase(IMAGE_REL_AMD64_REL32_2);<br>-    ECase(IMAGE_REL_AMD64_REL32_3);<br>-    ECase(IMAGE_REL_AMD64_REL32_4);<br>-    ECase(IMAGE_REL_AMD64_REL32_5);<br>-    ECase(IMAGE_REL_AMD64_SECTION);<br>-    ECase(IMAGE_REL_AMD64_SECREL);<br>-    ECase(IMAGE_REL_AMD64_SECREL7);<br>-    ECase(IMAGE_REL_AMD64_TOKEN);<br>-    ECase(IMAGE_REL_AMD64_SREL32);<br>-    ECase(IMAGE_REL_AMD64_PAIR);<br>-    ECase(IMAGE_REL_AMD64_SSPAN32);<br>-  }<br>-};<br>-<br>-#undef ECase<br>-<br>-template <><br>-struct MappingTraits<COFFYAML::Symbol> {<br>-  struct NStorageClass {<br>-    NStorageClass(IO&) : StorageClass(COFF::SymbolStorageClass(0)) {<br>-    }<br>-    NStorageClass(IO&, uint8_t S) : StorageClass(COFF::SymbolStorageClass(S)) {<br>-    }<br>-    uint8_t denormalize(IO &) {<br>-      return StorageClass;<br>-    }<br>-<br>-    COFF::SymbolStorageClass StorageClass;<br>-  };<br>-<br>-  static void mapping(IO &IO, COFFYAML::Symbol &S) {<br>-    MappingNormalization<NStorageClass, uint8_t> NS(IO, S.Header.StorageClass);<br>-<br>-    IO.mapRequired("SimpleType", S.SimpleType);<br>-    IO.mapOptional("NumberOfAuxSymbols", S.Header.NumberOfAuxSymbols);<br>-    IO.mapRequired("Name", S.Name);<br>-    IO.mapRequired("StorageClass", NS->StorageClass);<br>-    IO.mapOptional("AuxiliaryData", S.AuxiliaryData);<br>-    IO.mapRequired("ComplexType", S.ComplexType);<br>-    IO.mapRequired("Value", S.Header.Value);<br>-    IO.mapRequired("SectionNumber", S.Header.SectionNumber);<br>-  }<br>-};<br>-<br>-template <><br>-struct MappingTraits<COFF::header> {<br>-  struct NMachine {<br>-    NMachine(IO&) : Machine(COFF::MachineTypes(0)) {<br>-    }<br>-    NMachine(IO&, uint16_t M) : Machine(COFF::MachineTypes(M)) {<br>-    }<br>-    uint16_t denormalize(IO &) {<br>-      return Machine;<br>-    }<br>-    COFF::MachineTypes Machine;<br>-  };<br>-<br>-  struct NCharacteristics {<br>-    NCharacteristics(IO&) : Characteristics(COFF::Characteristics(0)) {<br>-    }<br>-    NCharacteristics(IO&, uint16_t C) :<br>-      Characteristics(COFF::Characteristics(C)) {<br>-    }<br>-    uint16_t denormalize(IO &) {<br>-      return Characteristics;<br>-    }<br>-<br>-    COFF::Characteristics Characteristics;<br>-  };<br>-<br>-  static void mapping(IO &IO, COFF::header &H) {<br>-    MappingNormalization<NMachine, uint16_t> NM(IO, H.Machine);<br>-    MappingNormalization<NCharacteristics, uint16_t> NC(IO, H.Characteristics);<br>-<br>-    IO.mapRequired("Machine", NM->Machine);<br>-    IO.mapOptional("Characteristics", NC->Characteristics);<br>-  }<br>-};<br>-<br>-template <><br>-struct MappingTraits<COFF::relocation> {<br>-  struct NType {<br>-    NType(IO &) : Type(COFF::RelocationTypeX86(0)) {<br>-    }<br>-    NType(IO &, uint16_t T) : Type(COFF::RelocationTypeX86(T)) {<br>-    }<br>-    uint16_t denormalize(IO &) {<br>-      return Type;<br>-    }<br>-    COFF::RelocationTypeX86 Type;<br>-  };<br>-<br>-  static void mapping(IO &IO, COFF::relocation &Rel) {<br>-    MappingNormalization<NType, uint16_t> NT(IO, Rel.Type);<br>-<br>-    IO.mapRequired("Type", NT->Type);<br>-    IO.mapRequired("VirtualAddress", Rel.VirtualAddress);<br>-    IO.mapRequired("SymbolTableIndex", Rel.SymbolTableIndex);<br>-  }<br>-};<br>-<br>-template <><br>-struct MappingTraits<COFFYAML::Section> {<br>-  struct NCharacteristics {<br>-    NCharacteristics(IO &) : Characteristics(COFF::SectionCharacteristics(0)) {<br>-    }<br>-    NCharacteristics(IO &, uint32_t C) :<br>-      Characteristics(COFF::SectionCharacteristics(C)) {<br>-    }<br>-    uint32_t denormalize(IO &) {<br>-      return Characteristics;<br>-    }<br>-    COFF::SectionCharacteristics Characteristics;<br>-  };<br>-<br>-  static void mapping(IO &IO, COFFYAML::Section &Sec) {<br>-    MappingNormalization<NCharacteristics, uint32_t> NC(IO,<br>-                                                    Sec.Header.Characteristics);<br>-    IO.mapOptional("Relocations", Sec.Relocations);<br>-    IO.mapRequired("SectionData", Sec.SectionData);<br>-    IO.mapRequired("Characteristics", NC->Characteristics);<br>-    IO.mapRequired("Name", Sec.Name);<br>-    IO.mapOptional("Alignment", Sec.Alignment);<br>-  }<br>-};<br>-<br>-template <><br>-struct MappingTraits<COFFYAML::Object> {<br>-  static void mapping(IO &IO, COFFYAML::Object &Obj) {<br>-    IO.mapRequired("sections", Obj.Sections);<br>-    IO.mapRequired("header", Obj.Header);<br>-    IO.mapRequired("symbols", Obj.Symbols);<br>-  }<br>-};<br>-} // end namespace yaml<br>-} // end namespace llvm<br>-<br>int main(int argc, char **argv) {<br>  cl::ParseCommandLineOptions(argc, argv);<br>  sys::PrintStackTraceOnErrorSignal();<br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a></div></blockquote></div><br></div></div></body></html>