LLVM 18.0.0git
XCOFFYAML.h
Go to the documentation of this file.
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
17#include <optional>
18#include <vector>
19
20namespace llvm {
21namespace XCOFFYAML {
22
23struct FileHeader {
24 llvm::yaml::Hex16 Magic;
26 int32_t TimeStamp;
27 llvm::yaml::Hex64 SymbolTableOffset;
30 llvm::yaml::Hex16 Flags;
31};
32
34 std::optional<llvm::yaml::Hex16> Magic;
35 std::optional<llvm::yaml::Hex16> Version;
36 std::optional<llvm::yaml::Hex64> TextStartAddr;
37 std::optional<llvm::yaml::Hex64> DataStartAddr;
38 std::optional<llvm::yaml::Hex64> TOCAnchorAddr;
39 std::optional<uint16_t> SecNumOfEntryPoint;
40 std::optional<uint16_t> SecNumOfText;
41 std::optional<uint16_t> SecNumOfData;
42 std::optional<uint16_t> SecNumOfTOC;
43 std::optional<uint16_t> SecNumOfLoader;
44 std::optional<uint16_t> SecNumOfBSS;
45 std::optional<llvm::yaml::Hex16> MaxAlignOfText;
46 std::optional<llvm::yaml::Hex16> MaxAlignOfData;
47 std::optional<llvm::yaml::Hex16> ModuleType;
48 std::optional<llvm::yaml::Hex8> CpuFlag;
49 std::optional<llvm::yaml::Hex8> CpuType;
50 std::optional<llvm::yaml::Hex8> TextPageSize;
51 std::optional<llvm::yaml::Hex8> DataPageSize;
52 std::optional<llvm::yaml::Hex8> StackPageSize;
53 std::optional<llvm::yaml::Hex8> FlagAndTDataAlignment;
54 std::optional<llvm::yaml::Hex64> TextSize;
55 std::optional<llvm::yaml::Hex64> InitDataSize;
56 std::optional<llvm::yaml::Hex64> BssDataSize;
57 std::optional<llvm::yaml::Hex64> EntryPointAddr;
58 std::optional<llvm::yaml::Hex64> MaxStackSize;
59 std::optional<llvm::yaml::Hex64> MaxDataSize;
60 std::optional<uint16_t> SecNumOfTData;
61 std::optional<uint16_t> SecNumOfTBSS;
62 std::optional<llvm::yaml::Hex16> Flag;
63};
64
65struct Relocation {
66 llvm::yaml::Hex64 VirtualAddress;
67 llvm::yaml::Hex64 SymbolIndex;
68 llvm::yaml::Hex8 Info;
69 llvm::yaml::Hex8 Type;
70};
71
72struct Section {
74 llvm::yaml::Hex64 Address;
75 llvm::yaml::Hex64 Size;
76 llvm::yaml::Hex64 FileOffsetToData;
77 llvm::yaml::Hex64 FileOffsetToRelocations;
78 llvm::yaml::Hex64 FileOffsetToLineNumbers; // Line number pointer. Not supported yet.
79 llvm::yaml::Hex16 NumberOfRelocations;
80 llvm::yaml::Hex16 NumberOfLineNumbers; // Line number counts. Not supported yet.
83 std::vector<Relocation> Relocations;
84};
85
86enum AuxSymbolType : uint8_t {
88 AUX_FCN = 254,
89 AUX_SYM = 253,
90 AUX_FILE = 252,
91 AUX_CSECT = 251,
92 AUX_SECT = 250,
93 AUX_STAT = 249
94};
95
98
100 virtual ~AuxSymbolEnt();
101};
102
104 std::optional<StringRef> FileNameOrString;
105 std::optional<XCOFF::CFileStringType> FileStringType;
106
108 static bool classof(const AuxSymbolEnt *S) {
109 return S->Type == AuxSymbolType::AUX_FILE;
110 }
111};
112
114 // Only for XCOFF32.
115 std::optional<uint32_t> SectionOrLength;
116 std::optional<uint32_t> StabInfoIndex;
117 std::optional<uint16_t> StabSectNum;
118 // Only for XCOFF64.
119 std::optional<uint32_t> SectionOrLengthLo;
120 std::optional<uint32_t> SectionOrLengthHi;
121 // Common fields for both XCOFF32 and XCOFF64.
122 std::optional<uint32_t> ParameterHashIndex;
123 std::optional<uint16_t> TypeChkSectNum;
124 std::optional<uint8_t> SymbolAlignmentAndType;
125 std::optional<XCOFF::StorageMappingClass> StorageMappingClass;
126
128 static bool classof(const AuxSymbolEnt *S) {
129 return S->Type == AuxSymbolType::AUX_CSECT;
130 }
131};
132
134 std::optional<uint32_t> OffsetToExceptionTbl; // Only for XCOFF32.
135 std::optional<uint64_t> PtrToLineNum;
136 std::optional<uint32_t> SizeOfFunction;
137 std::optional<int32_t> SymIdxOfNextBeyond;
138
140 static bool classof(const AuxSymbolEnt *S) {
141 return S->Type == AuxSymbolType::AUX_FCN;
142 }
143};
144
146 std::optional<uint64_t> OffsetToExceptionTbl;
147 std::optional<uint32_t> SizeOfFunction;
148 std::optional<int32_t> SymIdxOfNextBeyond;
149
151 static bool classof(const AuxSymbolEnt *S) {
152 return S->Type == AuxSymbolType::AUX_EXCEPT;
153 }
154}; // Only for XCOFF64.
155
157 // Only for XCOFF32.
158 std::optional<uint16_t> LineNumHi;
159 std::optional<uint16_t> LineNumLo;
160 // Only for XCOFF64.
161 std::optional<uint32_t> LineNum;
162
164 static bool classof(const AuxSymbolEnt *S) {
165 return S->Type == AuxSymbolType::AUX_SYM;
166 }
167};
168
170 std::optional<uint32_t> LengthOfSectionPortion;
171 std::optional<uint32_t> NumberOfRelocEnt;
172
174 static bool classof(const AuxSymbolEnt *S) {
175 return S->Type == AuxSymbolType::AUX_SECT;
176 }
177};
178
180 std::optional<uint32_t> SectionLength;
181 std::optional<uint16_t> NumberOfRelocEnt;
182 std::optional<uint16_t> NumberOfLineNum;
183
185 static bool classof(const AuxSymbolEnt *S) {
186 return S->Type == AuxSymbolType::AUX_STAT;
187 }
188}; // Only for XCOFF32.
189
190struct Symbol {
192 llvm::yaml::Hex64 Value; // Symbol value; storage class-dependent.
193 std::optional<StringRef> SectionName;
194 std::optional<uint16_t> SectionIndex;
195 llvm::yaml::Hex16 Type;
197 std::optional<uint8_t> NumberOfAuxEntries;
198 std::vector<std::unique_ptr<AuxSymbolEnt>> AuxEntries;
199};
200
202 std::optional<uint32_t> ContentSize; // The total size of the string table.
203 std::optional<uint32_t> Length; // The value of the length field for the first
204 // 4 bytes of the table.
205 std::optional<std::vector<StringRef>> Strings;
206 std::optional<yaml::BinaryRef> RawContent;
207};
208
209struct Object {
211 std::optional<AuxiliaryHeader> AuxHeader;
212 std::vector<Section> Sections;
213 std::vector<Symbol> Symbols;
215 Object();
216};
217} // namespace XCOFFYAML
218} // namespace llvm
219
220LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Symbol)
221LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Relocation)
222LLVM_YAML_IS_SEQUENCE_VECTOR(XCOFFYAML::Section)
223LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<llvm::XCOFFYAML::AuxSymbolEnt>)
224
225namespace llvm {
226namespace yaml {
227
228template <> struct ScalarBitSetTraits<XCOFF::SectionTypeFlags> {
229 static void bitset(IO &IO, XCOFF::SectionTypeFlags &Value);
230};
231
232template <> struct ScalarEnumerationTraits<XCOFF::StorageClass> {
233 static void enumeration(IO &IO, XCOFF::StorageClass &Value);
234};
235
236template <> struct ScalarEnumerationTraits<XCOFF::StorageMappingClass> {
237 static void enumeration(IO &IO, XCOFF::StorageMappingClass &Value);
238};
239
240template <> struct ScalarEnumerationTraits<XCOFF::CFileStringType> {
241 static void enumeration(IO &IO, XCOFF::CFileStringType &Type);
242};
243
244template <> struct ScalarEnumerationTraits<XCOFFYAML::AuxSymbolType> {
245 static void enumeration(IO &IO, XCOFFYAML::AuxSymbolType &Type);
246};
247
248template <> struct MappingTraits<XCOFFYAML::FileHeader> {
249 static void mapping(IO &IO, XCOFFYAML::FileHeader &H);
250};
251
252template <> struct MappingTraits<XCOFFYAML::AuxiliaryHeader> {
253 static void mapping(IO &IO, XCOFFYAML::AuxiliaryHeader &AuxHdr);
254};
255
256template <> struct MappingTraits<std::unique_ptr<XCOFFYAML::AuxSymbolEnt>> {
257 static void mapping(IO &IO, std::unique_ptr<XCOFFYAML::AuxSymbolEnt> &AuxSym);
258};
259
260template <> struct MappingTraits<XCOFFYAML::Symbol> {
261 static void mapping(IO &IO, XCOFFYAML::Symbol &S);
262};
263
264template <> struct MappingTraits<XCOFFYAML::Relocation> {
265 static void mapping(IO &IO, XCOFFYAML::Relocation &R);
266};
267
268template <> struct MappingTraits<XCOFFYAML::Section> {
269 static void mapping(IO &IO, XCOFFYAML::Section &Sec);
270};
271
272template <> struct MappingTraits<XCOFFYAML::StringTable> {
273 static void mapping(IO &IO, XCOFFYAML::StringTable &Str);
274};
275
276template <> struct MappingTraits<XCOFFYAML::Object> {
277 static void mapping(IO &IO, XCOFFYAML::Object &Obj);
278};
279
280} // namespace yaml
281} // namespace llvm
282
283#endif // LLVM_OBJECTYAML_XCOFFYAML_H
#define H(x, y, z)
Definition: MD5.cpp:57
#define LLVM_YAML_IS_SEQUENCE_VECTOR(type)
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
LLVM Value Representation.
Definition: Value.h:74
Specialized YAMLIO scalar type for representing a binary blob.
Definition: YAML.h:63
CFileStringType
Definition: XCOFF.h:322
StorageClass
Definition: XCOFF.h:169
StorageMappingClass
Storage Mapping Class definitions.
Definition: XCOFF.h:102
SectionTypeFlags
Definition: XCOFF.h:133
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
AuxSymbolEnt(AuxSymbolType T)
Definition: XCOFFYAML.h:99
std::optional< llvm::yaml::Hex16 > ModuleType
Definition: XCOFFYAML.h:47
std::optional< llvm::yaml::Hex64 > BssDataSize
Definition: XCOFFYAML.h:56
std::optional< llvm::yaml::Hex8 > StackPageSize
Definition: XCOFFYAML.h:52
std::optional< llvm::yaml::Hex64 > TextSize
Definition: XCOFFYAML.h:54
std::optional< uint16_t > SecNumOfTOC
Definition: XCOFFYAML.h:42
std::optional< llvm::yaml::Hex8 > TextPageSize
Definition: XCOFFYAML.h:50
std::optional< uint16_t > SecNumOfEntryPoint
Definition: XCOFFYAML.h:39
std::optional< llvm::yaml::Hex64 > TextStartAddr
Definition: XCOFFYAML.h:36
std::optional< llvm::yaml::Hex64 > MaxDataSize
Definition: XCOFFYAML.h:59
std::optional< uint16_t > SecNumOfTData
Definition: XCOFFYAML.h:60
std::optional< llvm::yaml::Hex8 > CpuType
Definition: XCOFFYAML.h:49
std::optional< llvm::yaml::Hex16 > MaxAlignOfData
Definition: XCOFFYAML.h:46
std::optional< uint16_t > SecNumOfTBSS
Definition: XCOFFYAML.h:61
std::optional< llvm::yaml::Hex16 > MaxAlignOfText
Definition: XCOFFYAML.h:45
std::optional< uint16_t > SecNumOfLoader
Definition: XCOFFYAML.h:43
std::optional< llvm::yaml::Hex64 > TOCAnchorAddr
Definition: XCOFFYAML.h:38
std::optional< llvm::yaml::Hex16 > Flag
Definition: XCOFFYAML.h:62
std::optional< llvm::yaml::Hex8 > DataPageSize
Definition: XCOFFYAML.h:51
std::optional< uint16_t > SecNumOfText
Definition: XCOFFYAML.h:40
std::optional< llvm::yaml::Hex16 > Magic
Definition: XCOFFYAML.h:34
std::optional< uint16_t > SecNumOfData
Definition: XCOFFYAML.h:41
std::optional< llvm::yaml::Hex64 > InitDataSize
Definition: XCOFFYAML.h:55
std::optional< llvm::yaml::Hex64 > MaxStackSize
Definition: XCOFFYAML.h:58
std::optional< llvm::yaml::Hex16 > Version
Definition: XCOFFYAML.h:35
std::optional< llvm::yaml::Hex64 > EntryPointAddr
Definition: XCOFFYAML.h:57
std::optional< llvm::yaml::Hex8 > CpuFlag
Definition: XCOFFYAML.h:48
std::optional< llvm::yaml::Hex8 > FlagAndTDataAlignment
Definition: XCOFFYAML.h:53
std::optional< uint16_t > SecNumOfBSS
Definition: XCOFFYAML.h:44
std::optional< llvm::yaml::Hex64 > DataStartAddr
Definition: XCOFFYAML.h:37
std::optional< uint32_t > LineNum
Definition: XCOFFYAML.h:161
std::optional< uint16_t > LineNumHi
Definition: XCOFFYAML.h:158
static bool classof(const AuxSymbolEnt *S)
Definition: XCOFFYAML.h:164
std::optional< uint16_t > LineNumLo
Definition: XCOFFYAML.h:159
std::optional< uint16_t > TypeChkSectNum
Definition: XCOFFYAML.h:123
std::optional< uint32_t > ParameterHashIndex
Definition: XCOFFYAML.h:122
std::optional< uint32_t > SectionOrLength
Definition: XCOFFYAML.h:115
std::optional< uint32_t > SectionOrLengthHi
Definition: XCOFFYAML.h:120
std::optional< uint8_t > SymbolAlignmentAndType
Definition: XCOFFYAML.h:124
std::optional< uint32_t > SectionOrLengthLo
Definition: XCOFFYAML.h:119
static bool classof(const AuxSymbolEnt *S)
Definition: XCOFFYAML.h:128
std::optional< uint16_t > StabSectNum
Definition: XCOFFYAML.h:117
std::optional< XCOFF::StorageMappingClass > StorageMappingClass
Definition: XCOFFYAML.h:125
std::optional< uint32_t > StabInfoIndex
Definition: XCOFFYAML.h:116
std::optional< int32_t > SymIdxOfNextBeyond
Definition: XCOFFYAML.h:148
std::optional< uint32_t > SizeOfFunction
Definition: XCOFFYAML.h:147
static bool classof(const AuxSymbolEnt *S)
Definition: XCOFFYAML.h:151
std::optional< uint64_t > OffsetToExceptionTbl
Definition: XCOFFYAML.h:146
std::optional< XCOFF::CFileStringType > FileStringType
Definition: XCOFFYAML.h:105
static bool classof(const AuxSymbolEnt *S)
Definition: XCOFFYAML.h:108
std::optional< StringRef > FileNameOrString
Definition: XCOFFYAML.h:104
llvm::yaml::Hex16 Magic
Definition: XCOFFYAML.h:24
llvm::yaml::Hex16 Flags
Definition: XCOFFYAML.h:30
llvm::yaml::Hex64 SymbolTableOffset
Definition: XCOFFYAML.h:27
static bool classof(const AuxSymbolEnt *S)
Definition: XCOFFYAML.h:140
std::optional< int32_t > SymIdxOfNextBeyond
Definition: XCOFFYAML.h:137
std::optional< uint32_t > OffsetToExceptionTbl
Definition: XCOFFYAML.h:134
std::optional< uint64_t > PtrToLineNum
Definition: XCOFFYAML.h:135
std::optional< uint32_t > SizeOfFunction
Definition: XCOFFYAML.h:136
std::vector< Section > Sections
Definition: XCOFFYAML.h:212
std::optional< AuxiliaryHeader > AuxHeader
Definition: XCOFFYAML.h:211
std::vector< Symbol > Symbols
Definition: XCOFFYAML.h:213
llvm::yaml::Hex8 Type
Definition: XCOFFYAML.h:69
llvm::yaml::Hex64 SymbolIndex
Definition: XCOFFYAML.h:67
llvm::yaml::Hex8 Info
Definition: XCOFFYAML.h:68
llvm::yaml::Hex64 VirtualAddress
Definition: XCOFFYAML.h:66
static bool classof(const AuxSymbolEnt *S)
Definition: XCOFFYAML.h:174
std::optional< uint32_t > NumberOfRelocEnt
Definition: XCOFFYAML.h:171
std::optional< uint32_t > LengthOfSectionPortion
Definition: XCOFFYAML.h:170
static bool classof(const AuxSymbolEnt *S)
Definition: XCOFFYAML.h:185
std::optional< uint16_t > NumberOfRelocEnt
Definition: XCOFFYAML.h:181
std::optional< uint16_t > NumberOfLineNum
Definition: XCOFFYAML.h:182
std::optional< uint32_t > SectionLength
Definition: XCOFFYAML.h:180
llvm::yaml::Hex64 FileOffsetToRelocations
Definition: XCOFFYAML.h:77
llvm::yaml::Hex64 Address
Definition: XCOFFYAML.h:74
llvm::yaml::Hex64 Size
Definition: XCOFFYAML.h:75
llvm::yaml::Hex64 FileOffsetToData
Definition: XCOFFYAML.h:76
yaml::BinaryRef SectionData
Definition: XCOFFYAML.h:82
std::vector< Relocation > Relocations
Definition: XCOFFYAML.h:83
llvm::yaml::Hex16 NumberOfLineNumbers
Definition: XCOFFYAML.h:80
llvm::yaml::Hex16 NumberOfRelocations
Definition: XCOFFYAML.h:79
llvm::yaml::Hex64 FileOffsetToLineNumbers
Definition: XCOFFYAML.h:78
std::optional< yaml::BinaryRef > RawContent
Definition: XCOFFYAML.h:206
std::optional< std::vector< StringRef > > Strings
Definition: XCOFFYAML.h:205
std::optional< uint32_t > Length
Definition: XCOFFYAML.h:203
std::optional< uint32_t > ContentSize
Definition: XCOFFYAML.h:202
std::vector< std::unique_ptr< AuxSymbolEnt > > AuxEntries
Definition: XCOFFYAML.h:198
std::optional< uint16_t > SectionIndex
Definition: XCOFFYAML.h:194
std::optional< uint8_t > NumberOfAuxEntries
Definition: XCOFFYAML.h:197
llvm::yaml::Hex64 Value
Definition: XCOFFYAML.h:192
llvm::yaml::Hex16 Type
Definition: XCOFFYAML.h:195
XCOFF::StorageClass StorageClass
Definition: XCOFFYAML.h:196
std::optional< StringRef > SectionName
Definition: XCOFFYAML.h:193