xref: /freebsd/contrib/llvm-project/llvm/include/llvm/ObjectYAML/WasmYAML.h (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric //===- WasmYAML.h - Wasm YAMLIO implementation ------------------*- C++ -*-===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric ///
9*0b57cec5SDimitry Andric /// \file
10*0b57cec5SDimitry Andric /// This file declares classes for handling the YAML representation
11*0b57cec5SDimitry Andric /// of wasm binaries.
12*0b57cec5SDimitry Andric ///
13*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
14*0b57cec5SDimitry Andric 
15*0b57cec5SDimitry Andric #ifndef LLVM_OBJECTYAML_WASMYAML_H
16*0b57cec5SDimitry Andric #define LLVM_OBJECTYAML_WASMYAML_H
17*0b57cec5SDimitry Andric 
18*0b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
19*0b57cec5SDimitry Andric #include "llvm/BinaryFormat/Wasm.h"
20*0b57cec5SDimitry Andric #include "llvm/ObjectYAML/YAML.h"
21*0b57cec5SDimitry Andric #include "llvm/Support/Casting.h"
22*0b57cec5SDimitry Andric #include <cstdint>
23*0b57cec5SDimitry Andric #include <memory>
24*0b57cec5SDimitry Andric #include <vector>
25*0b57cec5SDimitry Andric 
26*0b57cec5SDimitry Andric namespace llvm {
27*0b57cec5SDimitry Andric namespace WasmYAML {
28*0b57cec5SDimitry Andric 
29*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, SectionType)
30*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, ValueType)
31*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, TableType)
32*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, SignatureForm)
33*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, ExportKind)
34*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, Opcode)
35*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, RelocType)
36*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolFlags)
37*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolKind)
38*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, SegmentFlags)
39*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, LimitFlags)
40*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, ComdatKind)
41*0b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, FeaturePolicyPrefix)
42*0b57cec5SDimitry Andric 
43*0b57cec5SDimitry Andric struct FileHeader {
44*0b57cec5SDimitry Andric   yaml::Hex32 Version;
45*0b57cec5SDimitry Andric };
46*0b57cec5SDimitry Andric 
47*0b57cec5SDimitry Andric struct Limits {
48*0b57cec5SDimitry Andric   LimitFlags Flags;
49*0b57cec5SDimitry Andric   yaml::Hex32 Initial;
50*0b57cec5SDimitry Andric   yaml::Hex32 Maximum;
51*0b57cec5SDimitry Andric };
52*0b57cec5SDimitry Andric 
53*0b57cec5SDimitry Andric struct Table {
54*0b57cec5SDimitry Andric   TableType ElemType;
55*0b57cec5SDimitry Andric   Limits TableLimits;
56*0b57cec5SDimitry Andric };
57*0b57cec5SDimitry Andric 
58*0b57cec5SDimitry Andric struct Export {
59*0b57cec5SDimitry Andric   StringRef Name;
60*0b57cec5SDimitry Andric   ExportKind Kind;
61*0b57cec5SDimitry Andric   uint32_t Index;
62*0b57cec5SDimitry Andric };
63*0b57cec5SDimitry Andric 
64*0b57cec5SDimitry Andric struct ElemSegment {
65*0b57cec5SDimitry Andric   uint32_t TableIndex;
66*0b57cec5SDimitry Andric   wasm::WasmInitExpr Offset;
67*0b57cec5SDimitry Andric   std::vector<uint32_t> Functions;
68*0b57cec5SDimitry Andric };
69*0b57cec5SDimitry Andric 
70*0b57cec5SDimitry Andric struct Global {
71*0b57cec5SDimitry Andric   uint32_t Index;
72*0b57cec5SDimitry Andric   ValueType Type;
73*0b57cec5SDimitry Andric   bool Mutable;
74*0b57cec5SDimitry Andric   wasm::WasmInitExpr InitExpr;
75*0b57cec5SDimitry Andric };
76*0b57cec5SDimitry Andric 
77*0b57cec5SDimitry Andric struct Event {
78*0b57cec5SDimitry Andric   uint32_t Index;
79*0b57cec5SDimitry Andric   uint32_t Attribute;
80*0b57cec5SDimitry Andric   uint32_t SigIndex;
81*0b57cec5SDimitry Andric };
82*0b57cec5SDimitry Andric 
83*0b57cec5SDimitry Andric struct Import {
84*0b57cec5SDimitry Andric   StringRef Module;
85*0b57cec5SDimitry Andric   StringRef Field;
86*0b57cec5SDimitry Andric   ExportKind Kind;
87*0b57cec5SDimitry Andric   union {
88*0b57cec5SDimitry Andric     uint32_t SigIndex;
89*0b57cec5SDimitry Andric     Global GlobalImport;
90*0b57cec5SDimitry Andric     Table TableImport;
91*0b57cec5SDimitry Andric     Limits Memory;
92*0b57cec5SDimitry Andric     Event EventImport;
93*0b57cec5SDimitry Andric   };
94*0b57cec5SDimitry Andric };
95*0b57cec5SDimitry Andric 
96*0b57cec5SDimitry Andric struct LocalDecl {
97*0b57cec5SDimitry Andric   ValueType Type;
98*0b57cec5SDimitry Andric   uint32_t Count;
99*0b57cec5SDimitry Andric };
100*0b57cec5SDimitry Andric 
101*0b57cec5SDimitry Andric struct Function {
102*0b57cec5SDimitry Andric   uint32_t Index;
103*0b57cec5SDimitry Andric   std::vector<LocalDecl> Locals;
104*0b57cec5SDimitry Andric   yaml::BinaryRef Body;
105*0b57cec5SDimitry Andric };
106*0b57cec5SDimitry Andric 
107*0b57cec5SDimitry Andric struct Relocation {
108*0b57cec5SDimitry Andric   RelocType Type;
109*0b57cec5SDimitry Andric   uint32_t Index;
110*0b57cec5SDimitry Andric   yaml::Hex32 Offset;
111*0b57cec5SDimitry Andric   int32_t Addend;
112*0b57cec5SDimitry Andric };
113*0b57cec5SDimitry Andric 
114*0b57cec5SDimitry Andric struct DataSegment {
115*0b57cec5SDimitry Andric   uint32_t SectionOffset;
116*0b57cec5SDimitry Andric   uint32_t InitFlags;
117*0b57cec5SDimitry Andric   uint32_t MemoryIndex;
118*0b57cec5SDimitry Andric   wasm::WasmInitExpr Offset;
119*0b57cec5SDimitry Andric   yaml::BinaryRef Content;
120*0b57cec5SDimitry Andric };
121*0b57cec5SDimitry Andric 
122*0b57cec5SDimitry Andric struct NameEntry {
123*0b57cec5SDimitry Andric   uint32_t Index;
124*0b57cec5SDimitry Andric   StringRef Name;
125*0b57cec5SDimitry Andric };
126*0b57cec5SDimitry Andric 
127*0b57cec5SDimitry Andric struct ProducerEntry {
128*0b57cec5SDimitry Andric   std::string Name;
129*0b57cec5SDimitry Andric   std::string Version;
130*0b57cec5SDimitry Andric };
131*0b57cec5SDimitry Andric 
132*0b57cec5SDimitry Andric struct FeatureEntry {
133*0b57cec5SDimitry Andric   FeaturePolicyPrefix Prefix;
134*0b57cec5SDimitry Andric   std::string Name;
135*0b57cec5SDimitry Andric };
136*0b57cec5SDimitry Andric 
137*0b57cec5SDimitry Andric struct SegmentInfo {
138*0b57cec5SDimitry Andric   uint32_t Index;
139*0b57cec5SDimitry Andric   StringRef Name;
140*0b57cec5SDimitry Andric   uint32_t Alignment;
141*0b57cec5SDimitry Andric   SegmentFlags Flags;
142*0b57cec5SDimitry Andric };
143*0b57cec5SDimitry Andric 
144*0b57cec5SDimitry Andric struct Signature {
145*0b57cec5SDimitry Andric   uint32_t Index;
146*0b57cec5SDimitry Andric   SignatureForm Form = wasm::WASM_TYPE_FUNC;
147*0b57cec5SDimitry Andric   std::vector<ValueType> ParamTypes;
148*0b57cec5SDimitry Andric   ValueType ReturnType;
149*0b57cec5SDimitry Andric };
150*0b57cec5SDimitry Andric 
151*0b57cec5SDimitry Andric struct SymbolInfo {
152*0b57cec5SDimitry Andric   uint32_t Index;
153*0b57cec5SDimitry Andric   StringRef Name;
154*0b57cec5SDimitry Andric   SymbolKind Kind;
155*0b57cec5SDimitry Andric   SymbolFlags Flags;
156*0b57cec5SDimitry Andric   union {
157*0b57cec5SDimitry Andric     uint32_t ElementIndex;
158*0b57cec5SDimitry Andric     wasm::WasmDataReference DataRef;
159*0b57cec5SDimitry Andric   };
160*0b57cec5SDimitry Andric };
161*0b57cec5SDimitry Andric 
162*0b57cec5SDimitry Andric struct InitFunction {
163*0b57cec5SDimitry Andric   uint32_t Priority;
164*0b57cec5SDimitry Andric   uint32_t Symbol;
165*0b57cec5SDimitry Andric };
166*0b57cec5SDimitry Andric 
167*0b57cec5SDimitry Andric struct ComdatEntry {
168*0b57cec5SDimitry Andric   ComdatKind Kind;
169*0b57cec5SDimitry Andric   uint32_t Index;
170*0b57cec5SDimitry Andric };
171*0b57cec5SDimitry Andric 
172*0b57cec5SDimitry Andric struct Comdat {
173*0b57cec5SDimitry Andric   StringRef Name;
174*0b57cec5SDimitry Andric   std::vector<ComdatEntry> Entries;
175*0b57cec5SDimitry Andric };
176*0b57cec5SDimitry Andric 
177*0b57cec5SDimitry Andric struct Section {
178*0b57cec5SDimitry Andric   explicit Section(SectionType SecType) : Type(SecType) {}
179*0b57cec5SDimitry Andric   virtual ~Section();
180*0b57cec5SDimitry Andric 
181*0b57cec5SDimitry Andric   SectionType Type;
182*0b57cec5SDimitry Andric   std::vector<Relocation> Relocations;
183*0b57cec5SDimitry Andric };
184*0b57cec5SDimitry Andric 
185*0b57cec5SDimitry Andric struct CustomSection : Section {
186*0b57cec5SDimitry Andric   explicit CustomSection(StringRef Name)
187*0b57cec5SDimitry Andric       : Section(wasm::WASM_SEC_CUSTOM), Name(Name) {}
188*0b57cec5SDimitry Andric 
189*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
190*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_CUSTOM;
191*0b57cec5SDimitry Andric   }
192*0b57cec5SDimitry Andric 
193*0b57cec5SDimitry Andric   StringRef Name;
194*0b57cec5SDimitry Andric   yaml::BinaryRef Payload;
195*0b57cec5SDimitry Andric };
196*0b57cec5SDimitry Andric 
197*0b57cec5SDimitry Andric struct DylinkSection : CustomSection {
198*0b57cec5SDimitry Andric   DylinkSection() : CustomSection("dylink") {}
199*0b57cec5SDimitry Andric 
200*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
201*0b57cec5SDimitry Andric     auto C = dyn_cast<CustomSection>(S);
202*0b57cec5SDimitry Andric     return C && C->Name == "dylink";
203*0b57cec5SDimitry Andric   }
204*0b57cec5SDimitry Andric 
205*0b57cec5SDimitry Andric   uint32_t MemorySize;
206*0b57cec5SDimitry Andric   uint32_t MemoryAlignment;
207*0b57cec5SDimitry Andric   uint32_t TableSize;
208*0b57cec5SDimitry Andric   uint32_t TableAlignment;
209*0b57cec5SDimitry Andric   std::vector<StringRef> Needed;
210*0b57cec5SDimitry Andric };
211*0b57cec5SDimitry Andric 
212*0b57cec5SDimitry Andric struct NameSection : CustomSection {
213*0b57cec5SDimitry Andric   NameSection() : CustomSection("name") {}
214*0b57cec5SDimitry Andric 
215*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
216*0b57cec5SDimitry Andric     auto C = dyn_cast<CustomSection>(S);
217*0b57cec5SDimitry Andric     return C && C->Name == "name";
218*0b57cec5SDimitry Andric   }
219*0b57cec5SDimitry Andric 
220*0b57cec5SDimitry Andric   std::vector<NameEntry> FunctionNames;
221*0b57cec5SDimitry Andric };
222*0b57cec5SDimitry Andric 
223*0b57cec5SDimitry Andric struct LinkingSection : CustomSection {
224*0b57cec5SDimitry Andric   LinkingSection() : CustomSection("linking") {}
225*0b57cec5SDimitry Andric 
226*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
227*0b57cec5SDimitry Andric     auto C = dyn_cast<CustomSection>(S);
228*0b57cec5SDimitry Andric     return C && C->Name == "linking";
229*0b57cec5SDimitry Andric   }
230*0b57cec5SDimitry Andric 
231*0b57cec5SDimitry Andric   uint32_t Version;
232*0b57cec5SDimitry Andric   std::vector<SymbolInfo> SymbolTable;
233*0b57cec5SDimitry Andric   std::vector<SegmentInfo> SegmentInfos;
234*0b57cec5SDimitry Andric   std::vector<InitFunction> InitFunctions;
235*0b57cec5SDimitry Andric   std::vector<Comdat> Comdats;
236*0b57cec5SDimitry Andric };
237*0b57cec5SDimitry Andric 
238*0b57cec5SDimitry Andric struct ProducersSection : CustomSection {
239*0b57cec5SDimitry Andric   ProducersSection() : CustomSection("producers") {}
240*0b57cec5SDimitry Andric 
241*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
242*0b57cec5SDimitry Andric     auto C = dyn_cast<CustomSection>(S);
243*0b57cec5SDimitry Andric     return C && C->Name == "producers";
244*0b57cec5SDimitry Andric   }
245*0b57cec5SDimitry Andric 
246*0b57cec5SDimitry Andric   std::vector<ProducerEntry> Languages;
247*0b57cec5SDimitry Andric   std::vector<ProducerEntry> Tools;
248*0b57cec5SDimitry Andric   std::vector<ProducerEntry> SDKs;
249*0b57cec5SDimitry Andric };
250*0b57cec5SDimitry Andric 
251*0b57cec5SDimitry Andric struct TargetFeaturesSection : CustomSection {
252*0b57cec5SDimitry Andric   TargetFeaturesSection() : CustomSection("target_features") {}
253*0b57cec5SDimitry Andric 
254*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
255*0b57cec5SDimitry Andric     auto C = dyn_cast<CustomSection>(S);
256*0b57cec5SDimitry Andric     return C && C->Name == "target_features";
257*0b57cec5SDimitry Andric   }
258*0b57cec5SDimitry Andric 
259*0b57cec5SDimitry Andric   std::vector<FeatureEntry> Features;
260*0b57cec5SDimitry Andric };
261*0b57cec5SDimitry Andric 
262*0b57cec5SDimitry Andric struct TypeSection : Section {
263*0b57cec5SDimitry Andric   TypeSection() : Section(wasm::WASM_SEC_TYPE) {}
264*0b57cec5SDimitry Andric 
265*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
266*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_TYPE;
267*0b57cec5SDimitry Andric   }
268*0b57cec5SDimitry Andric 
269*0b57cec5SDimitry Andric   std::vector<Signature> Signatures;
270*0b57cec5SDimitry Andric };
271*0b57cec5SDimitry Andric 
272*0b57cec5SDimitry Andric struct ImportSection : Section {
273*0b57cec5SDimitry Andric   ImportSection() : Section(wasm::WASM_SEC_IMPORT) {}
274*0b57cec5SDimitry Andric 
275*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
276*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_IMPORT;
277*0b57cec5SDimitry Andric   }
278*0b57cec5SDimitry Andric 
279*0b57cec5SDimitry Andric   std::vector<Import> Imports;
280*0b57cec5SDimitry Andric };
281*0b57cec5SDimitry Andric 
282*0b57cec5SDimitry Andric struct FunctionSection : Section {
283*0b57cec5SDimitry Andric   FunctionSection() : Section(wasm::WASM_SEC_FUNCTION) {}
284*0b57cec5SDimitry Andric 
285*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
286*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_FUNCTION;
287*0b57cec5SDimitry Andric   }
288*0b57cec5SDimitry Andric 
289*0b57cec5SDimitry Andric   std::vector<uint32_t> FunctionTypes;
290*0b57cec5SDimitry Andric };
291*0b57cec5SDimitry Andric 
292*0b57cec5SDimitry Andric struct TableSection : Section {
293*0b57cec5SDimitry Andric   TableSection() : Section(wasm::WASM_SEC_TABLE) {}
294*0b57cec5SDimitry Andric 
295*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
296*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_TABLE;
297*0b57cec5SDimitry Andric   }
298*0b57cec5SDimitry Andric 
299*0b57cec5SDimitry Andric   std::vector<Table> Tables;
300*0b57cec5SDimitry Andric };
301*0b57cec5SDimitry Andric 
302*0b57cec5SDimitry Andric struct MemorySection : Section {
303*0b57cec5SDimitry Andric   MemorySection() : Section(wasm::WASM_SEC_MEMORY) {}
304*0b57cec5SDimitry Andric 
305*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
306*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_MEMORY;
307*0b57cec5SDimitry Andric   }
308*0b57cec5SDimitry Andric 
309*0b57cec5SDimitry Andric   std::vector<Limits> Memories;
310*0b57cec5SDimitry Andric };
311*0b57cec5SDimitry Andric 
312*0b57cec5SDimitry Andric struct GlobalSection : Section {
313*0b57cec5SDimitry Andric   GlobalSection() : Section(wasm::WASM_SEC_GLOBAL) {}
314*0b57cec5SDimitry Andric 
315*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
316*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_GLOBAL;
317*0b57cec5SDimitry Andric   }
318*0b57cec5SDimitry Andric 
319*0b57cec5SDimitry Andric   std::vector<Global> Globals;
320*0b57cec5SDimitry Andric };
321*0b57cec5SDimitry Andric 
322*0b57cec5SDimitry Andric struct EventSection : Section {
323*0b57cec5SDimitry Andric   EventSection() : Section(wasm::WASM_SEC_EVENT) {}
324*0b57cec5SDimitry Andric 
325*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
326*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_EVENT;
327*0b57cec5SDimitry Andric   }
328*0b57cec5SDimitry Andric 
329*0b57cec5SDimitry Andric   std::vector<Event> Events;
330*0b57cec5SDimitry Andric };
331*0b57cec5SDimitry Andric 
332*0b57cec5SDimitry Andric struct ExportSection : Section {
333*0b57cec5SDimitry Andric   ExportSection() : Section(wasm::WASM_SEC_EXPORT) {}
334*0b57cec5SDimitry Andric 
335*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
336*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_EXPORT;
337*0b57cec5SDimitry Andric   }
338*0b57cec5SDimitry Andric 
339*0b57cec5SDimitry Andric   std::vector<Export> Exports;
340*0b57cec5SDimitry Andric };
341*0b57cec5SDimitry Andric 
342*0b57cec5SDimitry Andric struct StartSection : Section {
343*0b57cec5SDimitry Andric   StartSection() : Section(wasm::WASM_SEC_START) {}
344*0b57cec5SDimitry Andric 
345*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
346*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_START;
347*0b57cec5SDimitry Andric   }
348*0b57cec5SDimitry Andric 
349*0b57cec5SDimitry Andric   uint32_t StartFunction;
350*0b57cec5SDimitry Andric };
351*0b57cec5SDimitry Andric 
352*0b57cec5SDimitry Andric struct ElemSection : Section {
353*0b57cec5SDimitry Andric   ElemSection() : Section(wasm::WASM_SEC_ELEM) {}
354*0b57cec5SDimitry Andric 
355*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
356*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_ELEM;
357*0b57cec5SDimitry Andric   }
358*0b57cec5SDimitry Andric 
359*0b57cec5SDimitry Andric   std::vector<ElemSegment> Segments;
360*0b57cec5SDimitry Andric };
361*0b57cec5SDimitry Andric 
362*0b57cec5SDimitry Andric struct CodeSection : Section {
363*0b57cec5SDimitry Andric   CodeSection() : Section(wasm::WASM_SEC_CODE) {}
364*0b57cec5SDimitry Andric 
365*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
366*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_CODE;
367*0b57cec5SDimitry Andric   }
368*0b57cec5SDimitry Andric 
369*0b57cec5SDimitry Andric   std::vector<Function> Functions;
370*0b57cec5SDimitry Andric };
371*0b57cec5SDimitry Andric 
372*0b57cec5SDimitry Andric struct DataSection : Section {
373*0b57cec5SDimitry Andric   DataSection() : Section(wasm::WASM_SEC_DATA) {}
374*0b57cec5SDimitry Andric 
375*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
376*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_DATA;
377*0b57cec5SDimitry Andric   }
378*0b57cec5SDimitry Andric 
379*0b57cec5SDimitry Andric   std::vector<DataSegment> Segments;
380*0b57cec5SDimitry Andric };
381*0b57cec5SDimitry Andric 
382*0b57cec5SDimitry Andric struct DataCountSection : Section {
383*0b57cec5SDimitry Andric   DataCountSection() : Section(wasm::WASM_SEC_DATACOUNT) {}
384*0b57cec5SDimitry Andric 
385*0b57cec5SDimitry Andric   static bool classof(const Section *S) {
386*0b57cec5SDimitry Andric     return S->Type == wasm::WASM_SEC_DATACOUNT;
387*0b57cec5SDimitry Andric   }
388*0b57cec5SDimitry Andric 
389*0b57cec5SDimitry Andric   uint32_t Count;
390*0b57cec5SDimitry Andric };
391*0b57cec5SDimitry Andric 
392*0b57cec5SDimitry Andric struct Object {
393*0b57cec5SDimitry Andric   FileHeader Header;
394*0b57cec5SDimitry Andric   std::vector<std::unique_ptr<Section>> Sections;
395*0b57cec5SDimitry Andric };
396*0b57cec5SDimitry Andric 
397*0b57cec5SDimitry Andric } // end namespace WasmYAML
398*0b57cec5SDimitry Andric } // end namespace llvm
399*0b57cec5SDimitry Andric 
400*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<llvm::WasmYAML::Section>)
401*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Signature)
402*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ValueType)
403*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Table)
404*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Import)
405*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Export)
406*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ElemSegment)
407*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Limits)
408*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::DataSegment)
409*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Global)
410*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Function)
411*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::LocalDecl)
412*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Relocation)
413*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::NameEntry)
414*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ProducerEntry)
415*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::FeatureEntry)
416*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SegmentInfo)
417*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SymbolInfo)
418*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::InitFunction)
419*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ComdatEntry)
420*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Comdat)
421*0b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Event)
422*0b57cec5SDimitry Andric 
423*0b57cec5SDimitry Andric namespace llvm {
424*0b57cec5SDimitry Andric namespace yaml {
425*0b57cec5SDimitry Andric 
426*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::FileHeader> {
427*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::FileHeader &FileHdr);
428*0b57cec5SDimitry Andric };
429*0b57cec5SDimitry Andric 
430*0b57cec5SDimitry Andric template <> struct MappingTraits<std::unique_ptr<WasmYAML::Section>> {
431*0b57cec5SDimitry Andric   static void mapping(IO &IO, std::unique_ptr<WasmYAML::Section> &Section);
432*0b57cec5SDimitry Andric };
433*0b57cec5SDimitry Andric 
434*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Object> {
435*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Object &Object);
436*0b57cec5SDimitry Andric };
437*0b57cec5SDimitry Andric 
438*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Import> {
439*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Import &Import);
440*0b57cec5SDimitry Andric };
441*0b57cec5SDimitry Andric 
442*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Export> {
443*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Export &Export);
444*0b57cec5SDimitry Andric };
445*0b57cec5SDimitry Andric 
446*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Global> {
447*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Global &Global);
448*0b57cec5SDimitry Andric };
449*0b57cec5SDimitry Andric 
450*0b57cec5SDimitry Andric template <> struct ScalarBitSetTraits<WasmYAML::LimitFlags> {
451*0b57cec5SDimitry Andric   static void bitset(IO &IO, WasmYAML::LimitFlags &Value);
452*0b57cec5SDimitry Andric };
453*0b57cec5SDimitry Andric 
454*0b57cec5SDimitry Andric template <> struct ScalarBitSetTraits<WasmYAML::SymbolFlags> {
455*0b57cec5SDimitry Andric   static void bitset(IO &IO, WasmYAML::SymbolFlags &Value);
456*0b57cec5SDimitry Andric };
457*0b57cec5SDimitry Andric 
458*0b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::SymbolKind> {
459*0b57cec5SDimitry Andric   static void enumeration(IO &IO, WasmYAML::SymbolKind &Kind);
460*0b57cec5SDimitry Andric };
461*0b57cec5SDimitry Andric 
462*0b57cec5SDimitry Andric template <> struct ScalarBitSetTraits<WasmYAML::SegmentFlags> {
463*0b57cec5SDimitry Andric   static void bitset(IO &IO, WasmYAML::SegmentFlags &Value);
464*0b57cec5SDimitry Andric };
465*0b57cec5SDimitry Andric 
466*0b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::SectionType> {
467*0b57cec5SDimitry Andric   static void enumeration(IO &IO, WasmYAML::SectionType &Type);
468*0b57cec5SDimitry Andric };
469*0b57cec5SDimitry Andric 
470*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Signature> {
471*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Signature &Signature);
472*0b57cec5SDimitry Andric };
473*0b57cec5SDimitry Andric 
474*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Table> {
475*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Table &Table);
476*0b57cec5SDimitry Andric };
477*0b57cec5SDimitry Andric 
478*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Limits> {
479*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Limits &Limits);
480*0b57cec5SDimitry Andric };
481*0b57cec5SDimitry Andric 
482*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Function> {
483*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Function &Function);
484*0b57cec5SDimitry Andric };
485*0b57cec5SDimitry Andric 
486*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Relocation> {
487*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Relocation &Relocation);
488*0b57cec5SDimitry Andric };
489*0b57cec5SDimitry Andric 
490*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::NameEntry> {
491*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::NameEntry &NameEntry);
492*0b57cec5SDimitry Andric };
493*0b57cec5SDimitry Andric 
494*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::ProducerEntry> {
495*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::ProducerEntry &ProducerEntry);
496*0b57cec5SDimitry Andric };
497*0b57cec5SDimitry Andric 
498*0b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::FeaturePolicyPrefix> {
499*0b57cec5SDimitry Andric   static void enumeration(IO &IO, WasmYAML::FeaturePolicyPrefix &Prefix);
500*0b57cec5SDimitry Andric };
501*0b57cec5SDimitry Andric 
502*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::FeatureEntry> {
503*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::FeatureEntry &FeatureEntry);
504*0b57cec5SDimitry Andric };
505*0b57cec5SDimitry Andric 
506*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::SegmentInfo> {
507*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::SegmentInfo &SegmentInfo);
508*0b57cec5SDimitry Andric };
509*0b57cec5SDimitry Andric 
510*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::LocalDecl> {
511*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::LocalDecl &LocalDecl);
512*0b57cec5SDimitry Andric };
513*0b57cec5SDimitry Andric 
514*0b57cec5SDimitry Andric template <> struct MappingTraits<wasm::WasmInitExpr> {
515*0b57cec5SDimitry Andric   static void mapping(IO &IO, wasm::WasmInitExpr &Expr);
516*0b57cec5SDimitry Andric };
517*0b57cec5SDimitry Andric 
518*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::DataSegment> {
519*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::DataSegment &Segment);
520*0b57cec5SDimitry Andric };
521*0b57cec5SDimitry Andric 
522*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::ElemSegment> {
523*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::ElemSegment &Segment);
524*0b57cec5SDimitry Andric };
525*0b57cec5SDimitry Andric 
526*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::SymbolInfo> {
527*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::SymbolInfo &Info);
528*0b57cec5SDimitry Andric };
529*0b57cec5SDimitry Andric 
530*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::InitFunction> {
531*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::InitFunction &Init);
532*0b57cec5SDimitry Andric };
533*0b57cec5SDimitry Andric 
534*0b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::ComdatKind> {
535*0b57cec5SDimitry Andric   static void enumeration(IO &IO, WasmYAML::ComdatKind &Kind);
536*0b57cec5SDimitry Andric };
537*0b57cec5SDimitry Andric 
538*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::ComdatEntry> {
539*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::ComdatEntry &ComdatEntry);
540*0b57cec5SDimitry Andric };
541*0b57cec5SDimitry Andric 
542*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Comdat> {
543*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Comdat &Comdat);
544*0b57cec5SDimitry Andric };
545*0b57cec5SDimitry Andric 
546*0b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::ValueType> {
547*0b57cec5SDimitry Andric   static void enumeration(IO &IO, WasmYAML::ValueType &Type);
548*0b57cec5SDimitry Andric };
549*0b57cec5SDimitry Andric 
550*0b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::ExportKind> {
551*0b57cec5SDimitry Andric   static void enumeration(IO &IO, WasmYAML::ExportKind &Kind);
552*0b57cec5SDimitry Andric };
553*0b57cec5SDimitry Andric 
554*0b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::TableType> {
555*0b57cec5SDimitry Andric   static void enumeration(IO &IO, WasmYAML::TableType &Type);
556*0b57cec5SDimitry Andric };
557*0b57cec5SDimitry Andric 
558*0b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::Opcode> {
559*0b57cec5SDimitry Andric   static void enumeration(IO &IO, WasmYAML::Opcode &Opcode);
560*0b57cec5SDimitry Andric };
561*0b57cec5SDimitry Andric 
562*0b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::RelocType> {
563*0b57cec5SDimitry Andric   static void enumeration(IO &IO, WasmYAML::RelocType &Kind);
564*0b57cec5SDimitry Andric };
565*0b57cec5SDimitry Andric 
566*0b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Event> {
567*0b57cec5SDimitry Andric   static void mapping(IO &IO, WasmYAML::Event &Event);
568*0b57cec5SDimitry Andric };
569*0b57cec5SDimitry Andric 
570*0b57cec5SDimitry Andric } // end namespace yaml
571*0b57cec5SDimitry Andric } // end namespace llvm
572*0b57cec5SDimitry Andric 
573*0b57cec5SDimitry Andric #endif // LLVM_OBJECTYAML_WASMYAML_H
574