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