COFFYAML.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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. #ifndef LLVM_OBJECT_COFFYAML_H
  14. #define LLVM_OBJECT_COFFYAML_H
  15. #include "llvm/ADT/Optional.h"
  16. #include "llvm/MC/YAML.h"
  17. #include "llvm/Support/COFF.h"
  18. namespace llvm {
  19. namespace COFF {
  20. inline Characteristics operator|(Characteristics a, Characteristics b) {
  21. uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
  22. return static_cast<Characteristics>(Ret);
  23. }
  24. inline SectionCharacteristics operator|(SectionCharacteristics a,
  25. SectionCharacteristics b) {
  26. uint32_t Ret = static_cast<uint32_t>(a) | static_cast<uint32_t>(b);
  27. return static_cast<SectionCharacteristics>(Ret);
  28. }
  29. inline DLLCharacteristics operator|(DLLCharacteristics a,
  30. DLLCharacteristics b) {
  31. uint16_t Ret = static_cast<uint16_t>(a) | static_cast<uint16_t>(b);
  32. return static_cast<DLLCharacteristics>(Ret);
  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. LLVM_YAML_STRONG_TYPEDEF(uint8_t, COMDATType)
  39. LLVM_YAML_STRONG_TYPEDEF(uint32_t, WeakExternalCharacteristics)
  40. LLVM_YAML_STRONG_TYPEDEF(uint8_t, AuxSymbolType)
  41. struct Relocation {
  42. uint32_t VirtualAddress;
  43. uint16_t Type;
  44. StringRef SymbolName;
  45. };
  46. struct Section {
  47. COFF::section Header;
  48. unsigned Alignment;
  49. yaml::BinaryRef SectionData;
  50. std::vector<Relocation> Relocations;
  51. StringRef Name;
  52. Section();
  53. };
  54. struct Symbol {
  55. COFF::symbol Header;
  56. COFF::SymbolBaseType SimpleType;
  57. COFF::SymbolComplexType ComplexType;
  58. Optional<COFF::AuxiliaryFunctionDefinition> FunctionDefinition;
  59. Optional<COFF::AuxiliarybfAndefSymbol> bfAndefSymbol;
  60. Optional<COFF::AuxiliaryWeakExternal> WeakExternal;
  61. StringRef File;
  62. Optional<COFF::AuxiliarySectionDefinition> SectionDefinition;
  63. Optional<COFF::AuxiliaryCLRToken> CLRToken;
  64. StringRef Name;
  65. Symbol();
  66. };
  67. struct PEHeader {
  68. COFF::PE32Header Header;
  69. Optional<COFF::DataDirectory> DataDirectories[COFF::NUM_DATA_DIRECTORIES];
  70. };
  71. struct Object {
  72. Optional<PEHeader> OptionalHeader;
  73. COFF::header Header;
  74. std::vector<Section> Sections;
  75. std::vector<Symbol> Symbols;
  76. Object();
  77. };
  78. }
  79. }
  80. LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Section)
  81. LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Symbol)
  82. LLVM_YAML_IS_SEQUENCE_VECTOR(COFFYAML::Relocation)
  83. namespace llvm {
  84. namespace yaml {
  85. template <>
  86. struct ScalarEnumerationTraits<COFFYAML::WeakExternalCharacteristics> {
  87. static void enumeration(IO &IO, COFFYAML::WeakExternalCharacteristics &Value);
  88. };
  89. template <>
  90. struct ScalarEnumerationTraits<COFFYAML::AuxSymbolType> {
  91. static void enumeration(IO &IO, COFFYAML::AuxSymbolType &Value);
  92. };
  93. template <>
  94. struct ScalarEnumerationTraits<COFFYAML::COMDATType> {
  95. static void enumeration(IO &IO, COFFYAML::COMDATType &Value);
  96. };
  97. template <>
  98. struct ScalarEnumerationTraits<COFF::MachineTypes> {
  99. static void enumeration(IO &IO, COFF::MachineTypes &Value);
  100. };
  101. template <>
  102. struct ScalarEnumerationTraits<COFF::SymbolBaseType> {
  103. static void enumeration(IO &IO, COFF::SymbolBaseType &Value);
  104. };
  105. template <>
  106. struct ScalarEnumerationTraits<COFF::SymbolStorageClass> {
  107. static void enumeration(IO &IO, COFF::SymbolStorageClass &Value);
  108. };
  109. template <>
  110. struct ScalarEnumerationTraits<COFF::SymbolComplexType> {
  111. static void enumeration(IO &IO, COFF::SymbolComplexType &Value);
  112. };
  113. template <>
  114. struct ScalarEnumerationTraits<COFF::RelocationTypeI386> {
  115. static void enumeration(IO &IO, COFF::RelocationTypeI386 &Value);
  116. };
  117. template <>
  118. struct ScalarEnumerationTraits<COFF::RelocationTypeAMD64> {
  119. static void enumeration(IO &IO, COFF::RelocationTypeAMD64 &Value);
  120. };
  121. template <>
  122. struct ScalarEnumerationTraits<COFF::WindowsSubsystem> {
  123. static void enumeration(IO &IO, COFF::WindowsSubsystem &Value);
  124. };
  125. template <>
  126. struct ScalarBitSetTraits<COFF::Characteristics> {
  127. static void bitset(IO &IO, COFF::Characteristics &Value);
  128. };
  129. template <>
  130. struct ScalarBitSetTraits<COFF::SectionCharacteristics> {
  131. static void bitset(IO &IO, COFF::SectionCharacteristics &Value);
  132. };
  133. template <>
  134. struct ScalarBitSetTraits<COFF::DLLCharacteristics> {
  135. static void bitset(IO &IO, COFF::DLLCharacteristics &Value);
  136. };
  137. template <>
  138. struct MappingTraits<COFFYAML::Relocation> {
  139. static void mapping(IO &IO, COFFYAML::Relocation &Rel);
  140. };
  141. template <>
  142. struct MappingTraits<COFFYAML::PEHeader> {
  143. static void mapping(IO &IO, COFFYAML::PEHeader &PH);
  144. };
  145. template <>
  146. struct MappingTraits<COFF::DataDirectory> {
  147. static void mapping(IO &IO, COFF::DataDirectory &DD);
  148. };
  149. template <>
  150. struct MappingTraits<COFF::header> {
  151. static void mapping(IO &IO, COFF::header &H);
  152. };
  153. template <> struct MappingTraits<COFF::AuxiliaryFunctionDefinition> {
  154. static void mapping(IO &IO, COFF::AuxiliaryFunctionDefinition &AFD);
  155. };
  156. template <> struct MappingTraits<COFF::AuxiliarybfAndefSymbol> {
  157. static void mapping(IO &IO, COFF::AuxiliarybfAndefSymbol &AAS);
  158. };
  159. template <> struct MappingTraits<COFF::AuxiliaryWeakExternal> {
  160. static void mapping(IO &IO, COFF::AuxiliaryWeakExternal &AWE);
  161. };
  162. template <> struct MappingTraits<COFF::AuxiliarySectionDefinition> {
  163. static void mapping(IO &IO, COFF::AuxiliarySectionDefinition &ASD);
  164. };
  165. template <> struct MappingTraits<COFF::AuxiliaryCLRToken> {
  166. static void mapping(IO &IO, COFF::AuxiliaryCLRToken &ACT);
  167. };
  168. template <>
  169. struct MappingTraits<COFFYAML::Symbol> {
  170. static void mapping(IO &IO, COFFYAML::Symbol &S);
  171. };
  172. template <>
  173. struct MappingTraits<COFFYAML::Section> {
  174. static void mapping(IO &IO, COFFYAML::Section &Sec);
  175. };
  176. template <>
  177. struct MappingTraits<COFFYAML::Object> {
  178. static void mapping(IO &IO, COFFYAML::Object &Obj);
  179. };
  180. } // end namespace yaml
  181. } // end namespace llvm
  182. #endif