Home | History | Annotate | Download | only in Object
      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 
     20 namespace llvm {
     21 
     22 namespace COFF {
     23 inline 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 
     28 inline 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.
     37 namespace 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 
     71 LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section)
     72 LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol)
     73 LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Relocation)
     74 
     75 namespace llvm {
     76 namespace yaml {
     77 
     78 template <>
     79 struct ScalarEnumerationTraits<COFF::MachineTypes> {
     80   static void enumeration(IO &IO, COFF::MachineTypes &Value);
     81 };
     82 
     83 template <>
     84 struct ScalarEnumerationTraits<COFF::SymbolBaseType> {
     85   static void enumeration(IO &IO, COFF::SymbolBaseType &Value);
     86 };
     87 
     88 template <>
     89 struct ScalarEnumerationTraits<COFF::SymbolStorageClass> {
     90   static void enumeration(IO &IO, COFF::SymbolStorageClass &Value);
     91 };
     92 
     93 template <>
     94 struct ScalarEnumerationTraits<COFF::SymbolComplexType> {
     95   static void enumeration(IO &IO, COFF::SymbolComplexType &Value);
     96 };
     97 
     98 template <>
     99 struct ScalarEnumerationTraits<COFF::RelocationTypeX86> {
    100   static void enumeration(IO &IO, COFF::RelocationTypeX86 &Value);
    101 };
    102 
    103 template <>
    104 struct ScalarBitSetTraits<COFF::Characteristics> {
    105   static void bitset(IO &IO, COFF::Characteristics &Value);
    106 };
    107 
    108 template <>
    109 struct ScalarBitSetTraits<COFF::SectionCharacteristics> {
    110   static void bitset(IO &IO, COFF::SectionCharacteristics &Value);
    111 };
    112 
    113 template <>
    114 struct MappingTraits<COFFYAML::Relocation> {
    115   static void mapping(IO &IO, COFFYAML::Relocation &Rel);
    116 };
    117 
    118 template <>
    119 struct MappingTraits<COFF::header> {
    120   static void mapping(IO &IO, COFF::header &H);
    121 };
    122 
    123 template <>
    124 struct MappingTraits<COFFYAML::Symbol> {
    125   static void mapping(IO &IO, COFFYAML::Symbol &S);
    126 };
    127 
    128 template <>
    129 struct MappingTraits<COFFYAML::Section> {
    130   static void mapping(IO &IO, COFFYAML::Section &Sec);
    131 };
    132 
    133 template <>
    134 struct 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