1 //===----- XCOFFYAML.h - XCOFF YAMLIO implementation ------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file declares classes for handling the YAML representation of XCOFF. 10 // 11 //===----------------------------------------------------------------------===// 12 #ifndef LLVM_OBJECTYAML_XCOFFYAML_H 13 #define LLVM_OBJECTYAML_XCOFFYAML_H 14 15 #include "llvm/BinaryFormat/XCOFF.h" 16 #include "llvm/ObjectYAML/YAML.h" 17 #include <vector> 18 19 namespace llvm { 20 namespace XCOFFYAML { 21 22 struct FileHeader { 23 llvm::yaml::Hex16 Magic; 24 uint16_t NumberOfSections; 25 int32_t TimeStamp; 26 llvm::yaml::Hex64 SymbolTableOffset; 27 uint32_t NumberOfSymTableEntries; 28 uint16_t AuxHeaderSize; 29 llvm::yaml::Hex16 Flags; 30 }; 31 32 struct Relocation { 33 llvm::yaml::Hex64 VirtualAddress; 34 llvm::yaml::Hex64 SymbolIndex; 35 llvm::yaml::Hex8 Info; 36 llvm::yaml::Hex8 Type; 37 }; 38 39 struct Section { 40 StringRef SectionName; 41 llvm::yaml::Hex64 Address; 42 llvm::yaml::Hex64 Size; 43 llvm::yaml::Hex64 FileOffsetToData; 44 llvm::yaml::Hex64 FileOffsetToRelocations; 45 llvm::yaml::Hex64 FileOffsetToLineNumbers; // Line number pointer. Not supported yet. 46 llvm::yaml::Hex16 NumberOfRelocations; 47 llvm::yaml::Hex16 NumberOfLineNumbers; // Line number counts. Not supported yet. 48 uint32_t Flags; 49 yaml::BinaryRef SectionData; 50 std::vector<Relocation> Relocations; 51 }; 52 53 struct Symbol { 54 StringRef SymbolName; 55 llvm::yaml::Hex64 Value; // Symbol value; storage class-dependent. 56 StringRef SectionName; 57 llvm::yaml::Hex16 Type; 58 XCOFF::StorageClass StorageClass; 59 uint8_t NumberOfAuxEntries; 60 }; 61 62 struct Object { 63 FileHeader Header; 64 std::vector<Section> Sections; 65 std::vector<Symbol> Symbols; 66 Object(); 67 }; 68 } // namespace XCOFFYAML 69 } // namespace llvm 70 71 LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Symbol) 72 LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Relocation) 73 LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Section) 74 75 namespace llvm { 76 namespace yaml { 77 78 template <> struct ScalarBitSetTraits<XCOFF::SectionTypeFlags> { 79 static void bitset(IO &IO, XCOFF::SectionTypeFlags &Value); 80 }; 81 82 template <> struct ScalarEnumerationTraits<XCOFF::StorageClass> { 83 static void enumeration(IO &IO, XCOFF::StorageClass &Value); 84 }; 85 86 template <> struct MappingTraits<XCOFFYAML::FileHeader> { 87 static void mapping(IO &IO, XCOFFYAML::FileHeader &H); 88 }; 89 90 91 template <> struct MappingTraits<XCOFFYAML::Symbol> { 92 static void mapping(IO &IO, XCOFFYAML::Symbol &S); 93 }; 94 95 template <> struct MappingTraits<XCOFFYAML::Relocation> { 96 static void mapping(IO &IO, XCOFFYAML::Relocation &R); 97 }; 98 99 template <> struct MappingTraits<XCOFFYAML::Section> { 100 static void mapping(IO &IO, XCOFFYAML::Section &Sec); 101 }; 102 103 template <> struct MappingTraits<XCOFFYAML::Object> { 104 static void mapping(IO &IO, XCOFFYAML::Object &Obj); 105 }; 106 107 } // namespace yaml 108 } // namespace llvm 109 110 #endif // LLVM_OBJECTYAML_XCOFFYAML_H 111