COFFYAML.h revision 263508
1//===- COFFYAML.h - COFF YAMLIO implementation ------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file declares classes for handling the YAML representation of COFF. 11// 12//===----------------------------------------------------------------------===// 13 14#ifndef LLVM_OBJECT_COFFYAML_H 15#define LLVM_OBJECT_COFFYAML_H 16 17#include "llvm/Object/YAML.h" 18#include "llvm/Support/COFF.h" 19 20namespace llvm { 21 22namespace COFF { 23inline Characteristics operator|(Characteristics a, Characteristics b) { 24 uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b); 25 return static_cast<Characteristics>(Ret); 26} 27 28inline SectionCharacteristics operator|(SectionCharacteristics a, 29 SectionCharacteristics b) { 30 uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b); 31 return static_cast<SectionCharacteristics>(Ret); 32} 33} 34 35// The structure of the yaml files is not an exact 1:1 match to COFF. In order 36// to use yaml::IO, we use these structures which are closer to the source. 37namespace COFFYAML { 38 struct Relocation { 39 uint32_t VirtualAddress; 40 uint16_t Type; 41 StringRef SymbolName; 42 }; 43 44 struct Section { 45 COFF::section Header; 46 unsigned Alignment; 47 object::yaml::BinaryRef SectionData; 48 std::vector<Relocation> Relocations; 49 StringRef Name; 50 Section(); 51 }; 52 53 struct Symbol { 54 COFF::symbol Header; 55 COFF::SymbolBaseType SimpleType; 56 COFF::SymbolComplexType ComplexType; 57 object::yaml::BinaryRef AuxiliaryData; 58 StringRef Name; 59 Symbol(); 60 }; 61 62 struct Object { 63 COFF::header Header; 64 std::vector<Section> Sections; 65 std::vector<Symbol> Symbols; 66 Object(); 67 }; 68} 69} 70 71LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section) 72LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol) 73LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Relocation) 74 75namespace llvm { 76namespace yaml { 77 78template <> 79struct ScalarEnumerationTraits<COFF::MachineTypes> { 80 static void enumeration(IO &IO, COFF::MachineTypes &Value); 81}; 82 83template <> 84struct ScalarEnumerationTraits<COFF::SymbolBaseType> { 85 static void enumeration(IO &IO, COFF::SymbolBaseType &Value); 86}; 87 88template <> 89struct ScalarEnumerationTraits<COFF::SymbolStorageClass> { 90 static void enumeration(IO &IO, COFF::SymbolStorageClass &Value); 91}; 92 93template <> 94struct ScalarEnumerationTraits<COFF::SymbolComplexType> { 95 static void enumeration(IO &IO, COFF::SymbolComplexType &Value); 96}; 97 98template <> 99struct ScalarEnumerationTraits<COFF::RelocationTypeX86> { 100 static void enumeration(IO &IO, COFF::RelocationTypeX86 &Value); 101}; 102 103template <> 104struct ScalarBitSetTraits<COFF::Characteristics> { 105 static void bitset(IO &IO, COFF::Characteristics &Value); 106}; 107 108template <> 109struct ScalarBitSetTraits<COFF::SectionCharacteristics> { 110 static void bitset(IO &IO, COFF::SectionCharacteristics &Value); 111}; 112 113template <> 114struct MappingTraits<COFFYAML::Relocation> { 115 static void mapping(IO &IO, COFFYAML::Relocation &Rel); 116}; 117 118template <> 119struct MappingTraits<COFF::header> { 120 static void mapping(IO &IO, COFF::header &H); 121}; 122 123template <> 124struct MappingTraits<COFFYAML::Symbol> { 125 static void mapping(IO &IO, COFFYAML::Symbol &S); 126}; 127 128template <> 129struct MappingTraits<COFFYAML::Section> { 130 static void mapping(IO &IO, COFFYAML::Section &Sec); 131}; 132 133template <> 134struct MappingTraits<COFFYAML::Object> { 135 static void mapping(IO &IO, COFFYAML::Object &Obj); 136}; 137 138} // end namespace yaml 139} // end namespace llvm 140 141#endif 142