Home | History | Annotate | Download | only in ObjectYAML
      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_OBJECTYAML_COFFYAML_H
     15 #define LLVM_OBJECTYAML_COFFYAML_H
     16 
     17 #include "llvm/ADT/Optional.h"
     18 #include "llvm/ObjectYAML/YAML.h"
     19 #include "llvm/Support/COFF.h"
     20 
     21 namespace llvm {
     22 
     23 namespace COFF {
     24 inline Characteristics operator|(Characteristics a, Characteristics b) {
     25   uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
     26   return static_cast<Characteristics>(Ret);
     27 }
     28 
     29 inline SectionCharacteristics operator|(SectionCharacteristics a,
     30                                         SectionCharacteristics b) {
     31   uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
     32   return static_cast<SectionCharacteristics>(Ret);
     33 }
     34 
     35 inline DLLCharacteristics operator|(DLLCharacteristics a,
     36                                     DLLCharacteristics b) {
     37   uint16_t Ret = static_cast<uint16_t>(a) | static_cast<uint16_t>(b);
     38   return static_cast<DLLCharacteristics>(Ret);
     39 }
     40 }
     41 
     42 // The structure of the yaml files is not an exact 1:1 match to COFF. In order
     43 // to use yaml::IO, we use these structures which are closer to the source.
     44 namespace COFFYAML {
     45   LLVM_YAML_STRONG_TYPEDEF(uint8_t, COMDATType)
     46   LLVM_YAML_STRONG_TYPEDEF(uint32_t, WeakExternalCharacteristics)
     47   LLVM_YAML_STRONG_TYPEDEF(uint8_t, AuxSymbolType)
     48 
     49   struct Relocation {
     50     uint32_t VirtualAddress;
     51     uint16_t Type;
     52     StringRef SymbolName;
     53   };
     54 
     55   struct Section {
     56     COFF::section Header;
     57     unsigned Alignment = 0;
     58     yaml::BinaryRef SectionData;
     59     std::vector<Relocation> Relocations;
     60     StringRef Name;
     61     Section();
     62   };
     63 
     64   struct Symbol {
     65     COFF::symbol Header;
     66     COFF::SymbolBaseType SimpleType = COFF::IMAGE_SYM_TYPE_NULL;
     67     COFF::SymbolComplexType ComplexType = COFF::IMAGE_SYM_DTYPE_NULL;
     68     Optional<COFF::AuxiliaryFunctionDefinition> FunctionDefinition;
     69     Optional<COFF::AuxiliarybfAndefSymbol> bfAndefSymbol;
     70     Optional<COFF::AuxiliaryWeakExternal> WeakExternal;
     71     StringRef File;
     72     Optional<COFF::AuxiliarySectionDefinition> SectionDefinition;
     73     Optional<COFF::AuxiliaryCLRToken> CLRToken;
     74     StringRef Name;
     75     Symbol();
     76   };
     77 
     78   struct PEHeader {
     79     COFF::PE32Header Header;
     80     Optional<COFF::DataDirectory> DataDirectories[COFF::NUM_DATA_DIRECTORIES];
     81   };
     82 
     83   struct Object {
     84     Optional<PEHeader> OptionalHeader;
     85     COFF::header Header;
     86     std::vector<Section> Sections;
     87     std::vector<Symbol> Symbols;
     88     Object();
     89   };
     90 }
     91 }
     92 
     93 LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section)
     94 LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol)
     95 LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Relocation)
     96 
     97 namespace llvm {
     98 namespace yaml {
     99 
    100 template <>
    101 struct ScalarEnumerationTraits<COFFYAML::WeakExternalCharacteristics> {
    102   static void enumeration(IO &IO, COFFYAML::WeakExternalCharacteristics &Value);
    103 };
    104 
    105 template <>
    106 struct ScalarEnumerationTraits<COFFYAML::AuxSymbolType> {
    107   static void enumeration(IO &IO, COFFYAML::AuxSymbolType &Value);
    108 };
    109 
    110 template <>
    111 struct ScalarEnumerationTraits<COFFYAML::COMDATType> {
    112   static void enumeration(IO &IO, COFFYAML::COMDATType &Value);
    113 };
    114 
    115 template <>
    116 struct ScalarEnumerationTraits<COFF::MachineTypes> {
    117   static void enumeration(IO &IO, COFF::MachineTypes &Value);
    118 };
    119 
    120 template <>
    121 struct ScalarEnumerationTraits<COFF::SymbolBaseType> {
    122   static void enumeration(IO &IO, COFF::SymbolBaseType &Value);
    123 };
    124 
    125 template <>
    126 struct ScalarEnumerationTraits<COFF::SymbolStorageClass> {
    127   static void enumeration(IO &IO, COFF::SymbolStorageClass &Value);
    128 };
    129 
    130 template <>
    131 struct ScalarEnumerationTraits<COFF::SymbolComplexType> {
    132   static void enumeration(IO &IO, COFF::SymbolComplexType &Value);
    133 };
    134 
    135 template <>
    136 struct ScalarEnumerationTraits<COFF::RelocationTypeI386> {
    137   static void enumeration(IO &IO, COFF::RelocationTypeI386 &Value);
    138 };
    139 
    140 template <>
    141 struct ScalarEnumerationTraits<COFF::RelocationTypeAMD64> {
    142   static void enumeration(IO &IO, COFF::RelocationTypeAMD64 &Value);
    143 };
    144 
    145 template <>
    146 struct ScalarEnumerationTraits<COFF::WindowsSubsystem> {
    147   static void enumeration(IO &IO, COFF::WindowsSubsystem &Value);
    148 };
    149 
    150 template <>
    151 struct ScalarBitSetTraits<COFF::Characteristics> {
    152   static void bitset(IO &IO, COFF::Characteristics &Value);
    153 };
    154 
    155 template <>
    156 struct ScalarBitSetTraits<COFF::SectionCharacteristics> {
    157   static void bitset(IO &IO, COFF::SectionCharacteristics &Value);
    158 };
    159 
    160 template <>
    161 struct ScalarBitSetTraits<COFF::DLLCharacteristics> {
    162   static void bitset(IO &IO, COFF::DLLCharacteristics &Value);
    163 };
    164 
    165 template <>
    166 struct MappingTraits<COFFYAML::Relocation> {
    167   static void mapping(IO &IO, COFFYAML::Relocation &Rel);
    168 };
    169 
    170 template <>
    171 struct MappingTraits<COFFYAML::PEHeader> {
    172   static void mapping(IO &IO, COFFYAML::PEHeader &PH);
    173 };
    174 
    175 template <>
    176 struct MappingTraits<COFF::DataDirectory> {
    177   static void mapping(IO &IO, COFF::DataDirectory &DD);
    178 };
    179 
    180 template <>
    181 struct MappingTraits<COFF::header> {
    182   static void mapping(IO &IO, COFF::header &H);
    183 };
    184 
    185 template <> struct MappingTraits<COFF::AuxiliaryFunctionDefinition> {
    186   static void mapping(IO &IO, COFF::AuxiliaryFunctionDefinition &AFD);
    187 };
    188 
    189 template <> struct MappingTraits<COFF::AuxiliarybfAndefSymbol> {
    190   static void mapping(IO &IO, COFF::AuxiliarybfAndefSymbol &AAS);
    191 };
    192 
    193 template <> struct MappingTraits<COFF::AuxiliaryWeakExternal> {
    194   static void mapping(IO &IO, COFF::AuxiliaryWeakExternal &AWE);
    195 };
    196 
    197 template <> struct MappingTraits<COFF::AuxiliarySectionDefinition> {
    198   static void mapping(IO &IO, COFF::AuxiliarySectionDefinition &ASD);
    199 };
    200 
    201 template <> struct MappingTraits<COFF::AuxiliaryCLRToken> {
    202   static void mapping(IO &IO, COFF::AuxiliaryCLRToken &ACT);
    203 };
    204 
    205 template <>
    206 struct MappingTraits<COFFYAML::Symbol> {
    207   static void mapping(IO &IO, COFFYAML::Symbol &S);
    208 };
    209 
    210 template <>
    211 struct MappingTraits<COFFYAML::Section> {
    212   static void mapping(IO &IO, COFFYAML::Section &Sec);
    213 };
    214 
    215 template <>
    216 struct MappingTraits<COFFYAML::Object> {
    217   static void mapping(IO &IO, COFFYAML::Object &Obj);
    218 };
    219 
    220 } // end namespace yaml
    221 } // end namespace llvm
    222 
    223 #endif
    224