1d3d84fddSDerek Schuff //===- WasmYAML.cpp - Wasm YAMLIO implementation --------------------------===//
2d3d84fddSDerek Schuff //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d3d84fddSDerek Schuff //
7d3d84fddSDerek Schuff //===----------------------------------------------------------------------===//
8d3d84fddSDerek Schuff //
9d3d84fddSDerek Schuff // This file defines classes for handling the YAML representation of wasm.
10d3d84fddSDerek Schuff //
11d3d84fddSDerek Schuff //===----------------------------------------------------------------------===//
12d3d84fddSDerek Schuff 
13d3d84fddSDerek Schuff #include "llvm/ObjectYAML/WasmYAML.h"
1428082ab0SEugene Zelenko #include "llvm/ADT/StringRef.h"
15d3d84fddSDerek Schuff #include "llvm/Support/Casting.h"
1628082ab0SEugene Zelenko #include "llvm/Support/ErrorHandling.h"
1728082ab0SEugene Zelenko #include "llvm/Support/YAMLTraits.h"
18d3d84fddSDerek Schuff 
19d3d84fddSDerek Schuff namespace llvm {
20c5b472f4SDerek Schuff 
21c5b472f4SDerek Schuff namespace WasmYAML {
22c5b472f4SDerek Schuff 
23c5b472f4SDerek Schuff // Declared here rather than in the header to comply with:
24c5b472f4SDerek Schuff // http://llvm.org/docs/CodingStandards.html#provide-a-virtual-method-anchor-for-classes-in-headers
2528082ab0SEugene Zelenko Section::~Section() = default;
26c5b472f4SDerek Schuff 
27c5b472f4SDerek Schuff } // end namespace WasmYAML
28c5b472f4SDerek Schuff 
29d3d84fddSDerek Schuff namespace yaml {
30d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::FileHeader & FileHdr)31d3d84fddSDerek Schuff void MappingTraits<WasmYAML::FileHeader>::mapping(
32d3d84fddSDerek Schuff     IO &IO, WasmYAML::FileHeader &FileHdr) {
33d3d84fddSDerek Schuff   IO.mapRequired("Version", FileHdr.Version);
34d3d84fddSDerek Schuff }
35d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::Object & Object)36d3d84fddSDerek Schuff void MappingTraits<WasmYAML::Object>::mapping(IO &IO,
37d3d84fddSDerek Schuff                                               WasmYAML::Object &Object) {
38d3d84fddSDerek Schuff   IO.setContext(&Object);
39d3d84fddSDerek Schuff   IO.mapTag("!WASM", true);
40d3d84fddSDerek Schuff   IO.mapRequired("FileHeader", Object.Header);
41d3d84fddSDerek Schuff   IO.mapOptional("Sections", Object.Sections);
42d3d84fddSDerek Schuff   IO.setContext(nullptr);
43d3d84fddSDerek Schuff }
44d3d84fddSDerek Schuff 
commonSectionMapping(IO & IO,WasmYAML::Section & Section)45d3d84fddSDerek Schuff static void commonSectionMapping(IO &IO, WasmYAML::Section &Section) {
46d3d84fddSDerek Schuff   IO.mapRequired("Type", Section.Type);
47d3d84fddSDerek Schuff   IO.mapOptional("Relocations", Section.Relocations);
48d3d84fddSDerek Schuff }
49d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::DylinkSection & Section)50e4afbc68SSam Clegg static void sectionMapping(IO &IO, WasmYAML::DylinkSection &Section) {
51e4afbc68SSam Clegg   commonSectionMapping(IO, Section);
52e4afbc68SSam Clegg   IO.mapRequired("Name", Section.Name);
53e4afbc68SSam Clegg   IO.mapRequired("MemorySize", Section.MemorySize);
54e4afbc68SSam Clegg   IO.mapRequired("MemoryAlignment", Section.MemoryAlignment);
55e4afbc68SSam Clegg   IO.mapRequired("TableSize", Section.TableSize);
56e4afbc68SSam Clegg   IO.mapRequired("TableAlignment", Section.TableAlignment);
5703801256SSam Clegg   IO.mapRequired("Needed", Section.Needed);
58659a0839SSam Clegg   IO.mapOptional("ImportInfo", Section.ImportInfo);
596ee55f9aSSam Clegg   IO.mapOptional("ExportInfo", Section.ExportInfo);
60e4afbc68SSam Clegg }
61e4afbc68SSam Clegg 
sectionMapping(IO & IO,WasmYAML::NameSection & Section)62b7787fd0SSam Clegg static void sectionMapping(IO &IO, WasmYAML::NameSection &Section) {
63b7787fd0SSam Clegg   commonSectionMapping(IO, Section);
64b7787fd0SSam Clegg   IO.mapRequired("Name", Section.Name);
65b7787fd0SSam Clegg   IO.mapOptional("FunctionNames", Section.FunctionNames);
661827005cSSam Clegg   IO.mapOptional("GlobalNames", Section.GlobalNames);
679a72d3e3SSam Clegg   IO.mapOptional("DataSegmentNames", Section.DataSegmentNames);
68b7787fd0SSam Clegg }
69b7787fd0SSam Clegg 
sectionMapping(IO & IO,WasmYAML::LinkingSection & Section)70b7787fd0SSam Clegg static void sectionMapping(IO &IO, WasmYAML::LinkingSection &Section) {
71b7787fd0SSam Clegg   commonSectionMapping(IO, Section);
72b7787fd0SSam Clegg   IO.mapRequired("Name", Section.Name);
736bb5a41fSSam Clegg   IO.mapRequired("Version", Section.Version);
746c899ba6SSam Clegg   IO.mapOptional("SymbolTable", Section.SymbolTable);
7563ebb813SSam Clegg   IO.mapOptional("SegmentInfo", Section.SegmentInfos);
764273998cSSam Clegg   IO.mapOptional("InitFunctions", Section.InitFunctions);
77ea7caceeSSam Clegg   IO.mapOptional("Comdats", Section.Comdats);
78b7787fd0SSam Clegg }
79b7787fd0SSam Clegg 
sectionMapping(IO & IO,WasmYAML::ProducersSection & Section)80cbda16ebSThomas Lively static void sectionMapping(IO &IO, WasmYAML::ProducersSection &Section) {
81cbda16ebSThomas Lively   commonSectionMapping(IO, Section);
82cbda16ebSThomas Lively   IO.mapRequired("Name", Section.Name);
83cbda16ebSThomas Lively   IO.mapOptional("Languages", Section.Languages);
84cbda16ebSThomas Lively   IO.mapOptional("Tools", Section.Tools);
85cbda16ebSThomas Lively   IO.mapOptional("SDKs", Section.SDKs);
86cbda16ebSThomas Lively }
87cbda16ebSThomas Lively 
sectionMapping(IO & IO,WasmYAML::TargetFeaturesSection & Section)88f6f4f843SThomas Lively static void sectionMapping(IO &IO, WasmYAML::TargetFeaturesSection &Section) {
89f6f4f843SThomas Lively   commonSectionMapping(IO, Section);
90f6f4f843SThomas Lively   IO.mapRequired("Name", Section.Name);
91f6f4f843SThomas Lively   IO.mapRequired("Features", Section.Features);
92f6f4f843SThomas Lively }
93f6f4f843SThomas Lively 
sectionMapping(IO & IO,WasmYAML::CustomSection & Section)94d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::CustomSection &Section) {
95d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
96d3d84fddSDerek Schuff   IO.mapRequired("Name", Section.Name);
97d3d84fddSDerek Schuff   IO.mapRequired("Payload", Section.Payload);
98d3d84fddSDerek Schuff }
99d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::TypeSection & Section)100d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::TypeSection &Section) {
101d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
102d3d84fddSDerek Schuff   IO.mapOptional("Signatures", Section.Signatures);
103d3d84fddSDerek Schuff }
104d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::ImportSection & Section)105d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::ImportSection &Section) {
106d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
107d3d84fddSDerek Schuff   IO.mapOptional("Imports", Section.Imports);
108d3d84fddSDerek Schuff }
109d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::FunctionSection & Section)110d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::FunctionSection &Section) {
111d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
112d3d84fddSDerek Schuff   IO.mapOptional("FunctionTypes", Section.FunctionTypes);
113d3d84fddSDerek Schuff }
114d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::TableSection & Section)115d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::TableSection &Section) {
116d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
117d3d84fddSDerek Schuff   IO.mapOptional("Tables", Section.Tables);
118d3d84fddSDerek Schuff }
119d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::MemorySection & Section)120d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::MemorySection &Section) {
121d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
122d3d84fddSDerek Schuff   IO.mapOptional("Memories", Section.Memories);
123d3d84fddSDerek Schuff }
124d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::TagSection & Section)1251d891d44SHeejin Ahn static void sectionMapping(IO &IO, WasmYAML::TagSection &Section) {
126da419bdbSHeejin Ahn   commonSectionMapping(IO, Section);
1273ec1760dSHeejin Ahn   IO.mapOptional("TagTypes", Section.TagTypes);
128da419bdbSHeejin Ahn }
129da419bdbSHeejin Ahn 
sectionMapping(IO & IO,WasmYAML::GlobalSection & Section)130f93426c5SHeejin Ahn static void sectionMapping(IO &IO, WasmYAML::GlobalSection &Section) {
131f93426c5SHeejin Ahn   commonSectionMapping(IO, Section);
132f93426c5SHeejin Ahn   IO.mapOptional("Globals", Section.Globals);
133f93426c5SHeejin Ahn }
134f93426c5SHeejin Ahn 
sectionMapping(IO & IO,WasmYAML::ExportSection & Section)135d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::ExportSection &Section) {
136d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
137d3d84fddSDerek Schuff   IO.mapOptional("Exports", Section.Exports);
138d3d84fddSDerek Schuff }
139d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::StartSection & Section)140d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::StartSection &Section) {
141d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
142d3d84fddSDerek Schuff   IO.mapOptional("StartFunction", Section.StartFunction);
143d3d84fddSDerek Schuff }
144d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::ElemSection & Section)145d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::ElemSection &Section) {
146d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
147d3d84fddSDerek Schuff   IO.mapOptional("Segments", Section.Segments);
148d3d84fddSDerek Schuff }
149d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::CodeSection & Section)150d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::CodeSection &Section) {
151d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
152d3d84fddSDerek Schuff   IO.mapRequired("Functions", Section.Functions);
153d3d84fddSDerek Schuff }
154d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::DataSection & Section)155d3d84fddSDerek Schuff static void sectionMapping(IO &IO, WasmYAML::DataSection &Section) {
156d3d84fddSDerek Schuff   commonSectionMapping(IO, Section);
157d3d84fddSDerek Schuff   IO.mapRequired("Segments", Section.Segments);
158d3d84fddSDerek Schuff }
159d3d84fddSDerek Schuff 
sectionMapping(IO & IO,WasmYAML::DataCountSection & Section)160fef8de66SThomas Lively static void sectionMapping(IO &IO, WasmYAML::DataCountSection &Section) {
161fef8de66SThomas Lively   commonSectionMapping(IO, Section);
162fef8de66SThomas Lively   IO.mapRequired("Count", Section.Count);
163fef8de66SThomas Lively }
164fef8de66SThomas Lively 
mapping(IO & IO,std::unique_ptr<WasmYAML::Section> & Section)165d3d84fddSDerek Schuff void MappingTraits<std::unique_ptr<WasmYAML::Section>>::mapping(
166d3d84fddSDerek Schuff     IO &IO, std::unique_ptr<WasmYAML::Section> &Section) {
167d3d84fddSDerek Schuff   WasmYAML::SectionType SectionType;
168d3d84fddSDerek Schuff   if (IO.outputting())
169d3d84fddSDerek Schuff     SectionType = Section->Type;
170d3d84fddSDerek Schuff   else
171d3d84fddSDerek Schuff     IO.mapRequired("Type", SectionType);
172d3d84fddSDerek Schuff 
173d3d84fddSDerek Schuff   switch (SectionType) {
174b7787fd0SSam Clegg   case wasm::WASM_SEC_CUSTOM: {
175b7787fd0SSam Clegg     StringRef SectionName;
176b7787fd0SSam Clegg     if (IO.outputting()) {
177b7787fd0SSam Clegg       auto CustomSection = cast<WasmYAML::CustomSection>(Section.get());
178b7787fd0SSam Clegg       SectionName = CustomSection->Name;
179b7787fd0SSam Clegg     } else {
180b7787fd0SSam Clegg       IO.mapRequired("Name", SectionName);
181b7787fd0SSam Clegg     }
182b78c85a4SSam Clegg     if (SectionName == "dylink" || SectionName == "dylink.0") {
183e4afbc68SSam Clegg       if (!IO.outputting())
184e4afbc68SSam Clegg         Section.reset(new WasmYAML::DylinkSection());
185e4afbc68SSam Clegg       sectionMapping(IO, *cast<WasmYAML::DylinkSection>(Section.get()));
186e4afbc68SSam Clegg     } else if (SectionName == "linking") {
187d3d84fddSDerek Schuff       if (!IO.outputting())
188b7787fd0SSam Clegg         Section.reset(new WasmYAML::LinkingSection());
189b7787fd0SSam Clegg       sectionMapping(IO, *cast<WasmYAML::LinkingSection>(Section.get()));
190b7787fd0SSam Clegg     } else if (SectionName == "name") {
191b7787fd0SSam Clegg       if (!IO.outputting())
192b7787fd0SSam Clegg         Section.reset(new WasmYAML::NameSection());
193b7787fd0SSam Clegg       sectionMapping(IO, *cast<WasmYAML::NameSection>(Section.get()));
194cbda16ebSThomas Lively     } else if (SectionName == "producers") {
195cbda16ebSThomas Lively       if (!IO.outputting())
196cbda16ebSThomas Lively         Section.reset(new WasmYAML::ProducersSection());
197cbda16ebSThomas Lively       sectionMapping(IO, *cast<WasmYAML::ProducersSection>(Section.get()));
198f6f4f843SThomas Lively     } else if (SectionName == "target_features") {
199f6f4f843SThomas Lively       if (!IO.outputting())
200f6f4f843SThomas Lively         Section.reset(new WasmYAML::TargetFeaturesSection());
201f6f4f843SThomas Lively       sectionMapping(IO, *cast<WasmYAML::TargetFeaturesSection>(Section.get()));
202b7787fd0SSam Clegg     } else {
203b7787fd0SSam Clegg       if (!IO.outputting())
204b7787fd0SSam Clegg         Section.reset(new WasmYAML::CustomSection(SectionName));
205d3d84fddSDerek Schuff       sectionMapping(IO, *cast<WasmYAML::CustomSection>(Section.get()));
206b7787fd0SSam Clegg     }
207d3d84fddSDerek Schuff     break;
208b7787fd0SSam Clegg   }
209d3d84fddSDerek Schuff   case wasm::WASM_SEC_TYPE:
210d3d84fddSDerek Schuff     if (!IO.outputting())
211d3d84fddSDerek Schuff       Section.reset(new WasmYAML::TypeSection());
212d3d84fddSDerek Schuff     sectionMapping(IO, *cast<WasmYAML::TypeSection>(Section.get()));
213d3d84fddSDerek Schuff     break;
214d3d84fddSDerek Schuff   case wasm::WASM_SEC_IMPORT:
215d3d84fddSDerek Schuff     if (!IO.outputting())
216d3d84fddSDerek Schuff       Section.reset(new WasmYAML::ImportSection());
217d3d84fddSDerek Schuff     sectionMapping(IO, *cast<WasmYAML::ImportSection>(Section.get()));
218d3d84fddSDerek Schuff     break;
219d3d84fddSDerek Schuff   case wasm::WASM_SEC_FUNCTION:
220d3d84fddSDerek Schuff     if (!IO.outputting())
221d3d84fddSDerek Schuff       Section.reset(new WasmYAML::FunctionSection());
222d3d84fddSDerek Schuff     sectionMapping(IO, *cast<WasmYAML::FunctionSection>(Section.get()));
223d3d84fddSDerek Schuff     break;
224d3d84fddSDerek Schuff   case wasm::WASM_SEC_TABLE:
225d3d84fddSDerek Schuff     if (!IO.outputting())
226d3d84fddSDerek Schuff       Section.reset(new WasmYAML::TableSection());
227d3d84fddSDerek Schuff     sectionMapping(IO, *cast<WasmYAML::TableSection>(Section.get()));
228d3d84fddSDerek Schuff     break;
229d3d84fddSDerek Schuff   case wasm::WASM_SEC_MEMORY:
230d3d84fddSDerek Schuff     if (!IO.outputting())
231d3d84fddSDerek Schuff       Section.reset(new WasmYAML::MemorySection());
232d3d84fddSDerek Schuff     sectionMapping(IO, *cast<WasmYAML::MemorySection>(Section.get()));
233d3d84fddSDerek Schuff     break;
2341d891d44SHeejin Ahn   case wasm::WASM_SEC_TAG:
235da419bdbSHeejin Ahn     if (!IO.outputting())
2361d891d44SHeejin Ahn       Section.reset(new WasmYAML::TagSection());
2371d891d44SHeejin Ahn     sectionMapping(IO, *cast<WasmYAML::TagSection>(Section.get()));
238da419bdbSHeejin Ahn     break;
239f93426c5SHeejin Ahn   case wasm::WASM_SEC_GLOBAL:
240f93426c5SHeejin Ahn     if (!IO.outputting())
241f93426c5SHeejin Ahn       Section.reset(new WasmYAML::GlobalSection());
242f93426c5SHeejin Ahn     sectionMapping(IO, *cast<WasmYAML::GlobalSection>(Section.get()));
243f93426c5SHeejin Ahn     break;
244d3d84fddSDerek Schuff   case wasm::WASM_SEC_EXPORT:
245d3d84fddSDerek Schuff     if (!IO.outputting())
246d3d84fddSDerek Schuff       Section.reset(new WasmYAML::ExportSection());
247d3d84fddSDerek Schuff     sectionMapping(IO, *cast<WasmYAML::ExportSection>(Section.get()));
248d3d84fddSDerek Schuff     break;
249d3d84fddSDerek Schuff   case wasm::WASM_SEC_START:
250d3d84fddSDerek Schuff     if (!IO.outputting())
251d3d84fddSDerek Schuff       Section.reset(new WasmYAML::StartSection());
252d3d84fddSDerek Schuff     sectionMapping(IO, *cast<WasmYAML::StartSection>(Section.get()));
253d3d84fddSDerek Schuff     break;
254d3d84fddSDerek Schuff   case wasm::WASM_SEC_ELEM:
255d3d84fddSDerek Schuff     if (!IO.outputting())
256d3d84fddSDerek Schuff       Section.reset(new WasmYAML::ElemSection());
257d3d84fddSDerek Schuff     sectionMapping(IO, *cast<WasmYAML::ElemSection>(Section.get()));
258d3d84fddSDerek Schuff     break;
259d3d84fddSDerek Schuff   case wasm::WASM_SEC_CODE:
260d3d84fddSDerek Schuff     if (!IO.outputting())
261d3d84fddSDerek Schuff       Section.reset(new WasmYAML::CodeSection());
262d3d84fddSDerek Schuff     sectionMapping(IO, *cast<WasmYAML::CodeSection>(Section.get()));
263d3d84fddSDerek Schuff     break;
264d3d84fddSDerek Schuff   case wasm::WASM_SEC_DATA:
265d3d84fddSDerek Schuff     if (!IO.outputting())
266d3d84fddSDerek Schuff       Section.reset(new WasmYAML::DataSection());
267d3d84fddSDerek Schuff     sectionMapping(IO, *cast<WasmYAML::DataSection>(Section.get()));
268d3d84fddSDerek Schuff     break;
269fef8de66SThomas Lively   case wasm::WASM_SEC_DATACOUNT:
270fef8de66SThomas Lively     if (!IO.outputting())
271fef8de66SThomas Lively       Section.reset(new WasmYAML::DataCountSection());
272fef8de66SThomas Lively     sectionMapping(IO, *cast<WasmYAML::DataCountSection>(Section.get()));
273fef8de66SThomas Lively     break;
274d3d84fddSDerek Schuff   default:
275d3d84fddSDerek Schuff     llvm_unreachable("Unknown section type");
276d3d84fddSDerek Schuff   }
277d3d84fddSDerek Schuff }
278d3d84fddSDerek Schuff 
enumeration(IO & IO,WasmYAML::SectionType & Type)279d3d84fddSDerek Schuff void ScalarEnumerationTraits<WasmYAML::SectionType>::enumeration(
280d3d84fddSDerek Schuff     IO &IO, WasmYAML::SectionType &Type) {
281d3d84fddSDerek Schuff #define ECase(X) IO.enumCase(Type, #X, wasm::WASM_SEC_##X);
282d3d84fddSDerek Schuff   ECase(CUSTOM);
283d3d84fddSDerek Schuff   ECase(TYPE);
284d3d84fddSDerek Schuff   ECase(IMPORT);
285d3d84fddSDerek Schuff   ECase(FUNCTION);
286d3d84fddSDerek Schuff   ECase(TABLE);
287d3d84fddSDerek Schuff   ECase(MEMORY);
288d3d84fddSDerek Schuff   ECase(GLOBAL);
2891d891d44SHeejin Ahn   ECase(TAG);
290d3d84fddSDerek Schuff   ECase(EXPORT);
291d3d84fddSDerek Schuff   ECase(START);
292d3d84fddSDerek Schuff   ECase(ELEM);
293d3d84fddSDerek Schuff   ECase(CODE);
294d3d84fddSDerek Schuff   ECase(DATA);
295fef8de66SThomas Lively   ECase(DATACOUNT);
296d3d84fddSDerek Schuff #undef ECase
297d3d84fddSDerek Schuff }
298d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::Signature & Signature)299d3d84fddSDerek Schuff void MappingTraits<WasmYAML::Signature>::mapping(
300d3d84fddSDerek Schuff     IO &IO, WasmYAML::Signature &Signature) {
301e53af7f6SSam Clegg   IO.mapRequired("Index", Signature.Index);
302d3d84fddSDerek Schuff   IO.mapRequired("ParamTypes", Signature.ParamTypes);
303393d0f79SThomas Lively   IO.mapRequired("ReturnTypes", Signature.ReturnTypes);
304d3d84fddSDerek Schuff }
305d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::Table & Table)306d3d84fddSDerek Schuff void MappingTraits<WasmYAML::Table>::mapping(IO &IO, WasmYAML::Table &Table) {
307388fb67bSPaulo Matos   IO.mapRequired("Index", Table.Index);
308d3d84fddSDerek Schuff   IO.mapRequired("ElemType", Table.ElemType);
309d3d84fddSDerek Schuff   IO.mapRequired("Limits", Table.TableLimits);
310d3d84fddSDerek Schuff }
311d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::Function & Function)312d3d84fddSDerek Schuff void MappingTraits<WasmYAML::Function>::mapping(IO &IO,
313d3d84fddSDerek Schuff                                                 WasmYAML::Function &Function) {
314e53af7f6SSam Clegg   IO.mapRequired("Index", Function.Index);
315d3d84fddSDerek Schuff   IO.mapRequired("Locals", Function.Locals);
316d3d84fddSDerek Schuff   IO.mapRequired("Body", Function.Body);
317d3d84fddSDerek Schuff }
318d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::Relocation & Relocation)319d3d84fddSDerek Schuff void MappingTraits<WasmYAML::Relocation>::mapping(
320d3d84fddSDerek Schuff     IO &IO, WasmYAML::Relocation &Relocation) {
321d3d84fddSDerek Schuff   IO.mapRequired("Type", Relocation.Type);
322d3d84fddSDerek Schuff   IO.mapRequired("Index", Relocation.Index);
323d3d84fddSDerek Schuff   IO.mapRequired("Offset", Relocation.Offset);
324cc182aaaSSam Clegg   IO.mapOptional("Addend", Relocation.Addend, 0);
325d3d84fddSDerek Schuff }
326d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::NameEntry & NameEntry)32703cdd124SSam Clegg void MappingTraits<WasmYAML::NameEntry>::mapping(
32803cdd124SSam Clegg     IO &IO, WasmYAML::NameEntry &NameEntry) {
32903cdd124SSam Clegg   IO.mapRequired("Index", NameEntry.Index);
33003cdd124SSam Clegg   IO.mapRequired("Name", NameEntry.Name);
33103cdd124SSam Clegg }
33203cdd124SSam Clegg 
mapping(IO & IO,WasmYAML::ProducerEntry & ProducerEntry)333cbda16ebSThomas Lively void MappingTraits<WasmYAML::ProducerEntry>::mapping(
334cbda16ebSThomas Lively     IO &IO, WasmYAML::ProducerEntry &ProducerEntry) {
335cbda16ebSThomas Lively   IO.mapRequired("Name", ProducerEntry.Name);
336cbda16ebSThomas Lively   IO.mapRequired("Version", ProducerEntry.Version);
337cbda16ebSThomas Lively }
338cbda16ebSThomas Lively 
enumeration(IO & IO,WasmYAML::FeaturePolicyPrefix & Kind)339f6f4f843SThomas Lively void ScalarEnumerationTraits<WasmYAML::FeaturePolicyPrefix>::enumeration(
340f6f4f843SThomas Lively     IO &IO, WasmYAML::FeaturePolicyPrefix &Kind) {
341f6f4f843SThomas Lively #define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_FEATURE_PREFIX_##X);
342f6f4f843SThomas Lively   ECase(USED);
343f6f4f843SThomas Lively   ECase(REQUIRED);
344f6f4f843SThomas Lively   ECase(DISALLOWED);
345f6f4f843SThomas Lively #undef ECase
346f6f4f843SThomas Lively }
347f6f4f843SThomas Lively 
mapping(IO & IO,WasmYAML::FeatureEntry & FeatureEntry)348f6f4f843SThomas Lively void MappingTraits<WasmYAML::FeatureEntry>::mapping(
349f6f4f843SThomas Lively     IO &IO, WasmYAML::FeatureEntry &FeatureEntry) {
350f6f4f843SThomas Lively   IO.mapRequired("Prefix", FeatureEntry.Prefix);
351f6f4f843SThomas Lively   IO.mapRequired("Name", FeatureEntry.Name);
352f6f4f843SThomas Lively }
353f6f4f843SThomas Lively 
mapping(IO & IO,WasmYAML::SegmentInfo & SegmentInfo)35463ebb813SSam Clegg void MappingTraits<WasmYAML::SegmentInfo>::mapping(
35563ebb813SSam Clegg     IO &IO, WasmYAML::SegmentInfo &SegmentInfo) {
35663ebb813SSam Clegg   IO.mapRequired("Index", SegmentInfo.Index);
35763ebb813SSam Clegg   IO.mapRequired("Name", SegmentInfo.Name);
35863ebb813SSam Clegg   IO.mapRequired("Alignment", SegmentInfo.Alignment);
35963ebb813SSam Clegg   IO.mapRequired("Flags", SegmentInfo.Flags);
36063ebb813SSam Clegg }
36163ebb813SSam Clegg 
mapping(IO & IO,WasmYAML::LocalDecl & LocalDecl)362d3d84fddSDerek Schuff void MappingTraits<WasmYAML::LocalDecl>::mapping(
363d3d84fddSDerek Schuff     IO &IO, WasmYAML::LocalDecl &LocalDecl) {
364d3d84fddSDerek Schuff   IO.mapRequired("Type", LocalDecl.Type);
365d3d84fddSDerek Schuff   IO.mapRequired("Count", LocalDecl.Count);
366d3d84fddSDerek Schuff }
367d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::Limits & Limits)368d3d84fddSDerek Schuff void MappingTraits<WasmYAML::Limits>::mapping(IO &IO,
369d3d84fddSDerek Schuff                                               WasmYAML::Limits &Limits) {
3709504ab32SSam Clegg   IO.mapOptional("Flags", Limits.Flags, 0);
3719ac5620cSAndy Wingo   IO.mapRequired("Minimum", Limits.Minimum);
372d3d84fddSDerek Schuff   if (!IO.outputting() || Limits.Flags & wasm::WASM_LIMITS_FLAG_HAS_MAX)
373d3d84fddSDerek Schuff     IO.mapOptional("Maximum", Limits.Maximum);
374d3d84fddSDerek Schuff }
375d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::ElemSegment & Segment)376d3d84fddSDerek Schuff void MappingTraits<WasmYAML::ElemSegment>::mapping(
377d3d84fddSDerek Schuff     IO &IO, WasmYAML::ElemSegment &Segment) {
3789504ab32SSam Clegg   IO.mapOptional("Flags", Segment.Flags, 0);
379a5a3659dSAndy Wingo   if (!IO.outputting() ||
380a5a3659dSAndy Wingo       Segment.Flags & wasm::WASM_ELEM_SEGMENT_HAS_TABLE_NUMBER)
381a5a3659dSAndy Wingo     IO.mapOptional("TableNumber", Segment.TableNumber);
382a5a3659dSAndy Wingo   if (!IO.outputting() ||
383a5a3659dSAndy Wingo       Segment.Flags & wasm::WASM_ELEM_SEGMENT_MASK_HAS_ELEM_KIND)
384a5a3659dSAndy Wingo     IO.mapOptional("ElemKind", Segment.ElemKind);
385d3d84fddSDerek Schuff   IO.mapRequired("Offset", Segment.Offset);
386d3d84fddSDerek Schuff   IO.mapRequired("Functions", Segment.Functions);
387d3d84fddSDerek Schuff }
388d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::Import & Import)389d3d84fddSDerek Schuff void MappingTraits<WasmYAML::Import>::mapping(IO &IO,
390d3d84fddSDerek Schuff                                               WasmYAML::Import &Import) {
391d3d84fddSDerek Schuff   IO.mapRequired("Module", Import.Module);
392d3d84fddSDerek Schuff   IO.mapRequired("Field", Import.Field);
393d3d84fddSDerek Schuff   IO.mapRequired("Kind", Import.Kind);
3943ec1760dSHeejin Ahn   if (Import.Kind == wasm::WASM_EXTERNAL_FUNCTION ||
3953ec1760dSHeejin Ahn       Import.Kind == wasm::WASM_EXTERNAL_TAG) {
396d3d84fddSDerek Schuff     IO.mapRequired("SigIndex", Import.SigIndex);
397d3d84fddSDerek Schuff   } else if (Import.Kind == wasm::WASM_EXTERNAL_GLOBAL) {
39841db519bSSam Clegg     IO.mapRequired("GlobalType", Import.GlobalImport.Type);
39941db519bSSam Clegg     IO.mapRequired("GlobalMutable", Import.GlobalImport.Mutable);
4002ffff5afSSam Clegg   } else if (Import.Kind == wasm::WASM_EXTERNAL_TABLE) {
40141db519bSSam Clegg     IO.mapRequired("Table", Import.TableImport);
4022ffff5afSSam Clegg   } else if (Import.Kind == wasm::WASM_EXTERNAL_MEMORY) {
4032ffff5afSSam Clegg     IO.mapRequired("Memory", Import.Memory);
404d3d84fddSDerek Schuff   } else {
405d3d84fddSDerek Schuff     llvm_unreachable("unhandled import type");
406d3d84fddSDerek Schuff   }
407d3d84fddSDerek Schuff }
408d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::Export & Export)409d3d84fddSDerek Schuff void MappingTraits<WasmYAML::Export>::mapping(IO &IO,
410d3d84fddSDerek Schuff                                               WasmYAML::Export &Export) {
411d3d84fddSDerek Schuff   IO.mapRequired("Name", Export.Name);
412d3d84fddSDerek Schuff   IO.mapRequired("Kind", Export.Kind);
413d3d84fddSDerek Schuff   IO.mapRequired("Index", Export.Index);
414d3d84fddSDerek Schuff }
415d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::Global & Global)416d3d84fddSDerek Schuff void MappingTraits<WasmYAML::Global>::mapping(IO &IO,
417d3d84fddSDerek Schuff                                               WasmYAML::Global &Global) {
418e53af7f6SSam Clegg   IO.mapRequired("Index", Global.Index);
419d3d84fddSDerek Schuff   IO.mapRequired("Type", Global.Type);
420d3d84fddSDerek Schuff   IO.mapRequired("Mutable", Global.Mutable);
421*20f7f733SSam Clegg   IO.mapRequired("InitExpr", Global.Init);
422d3d84fddSDerek Schuff }
423d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::InitExpr & Expr)4249504ab32SSam Clegg void MappingTraits<WasmYAML::InitExpr>::mapping(IO &IO,
4259504ab32SSam Clegg                                                 WasmYAML::InitExpr &Expr) {
4269504ab32SSam Clegg   IO.mapOptional("Extended", Expr.Extended, false);
4279504ab32SSam Clegg   if (Expr.Extended) {
4289504ab32SSam Clegg     IO.mapRequired("Body", Expr.Body);
4299504ab32SSam Clegg   } else {
4309504ab32SSam Clegg     WasmYAML::Opcode Op = Expr.Inst.Opcode;
431d3d84fddSDerek Schuff     IO.mapRequired("Opcode", Op);
4329504ab32SSam Clegg     Expr.Inst.Opcode = Op;
4339504ab32SSam Clegg     switch (Expr.Inst.Opcode) {
434d3d84fddSDerek Schuff     case wasm::WASM_OPCODE_I32_CONST:
4359504ab32SSam Clegg       IO.mapRequired("Value", Expr.Inst.Value.Int32);
436d3d84fddSDerek Schuff       break;
437d3d84fddSDerek Schuff     case wasm::WASM_OPCODE_I64_CONST:
4389504ab32SSam Clegg       IO.mapRequired("Value", Expr.Inst.Value.Int64);
439d3d84fddSDerek Schuff       break;
440d3d84fddSDerek Schuff     case wasm::WASM_OPCODE_F32_CONST:
4419504ab32SSam Clegg       IO.mapRequired("Value", Expr.Inst.Value.Float32);
442d3d84fddSDerek Schuff       break;
443d3d84fddSDerek Schuff     case wasm::WASM_OPCODE_F64_CONST:
4449504ab32SSam Clegg       IO.mapRequired("Value", Expr.Inst.Value.Float64);
445d3d84fddSDerek Schuff       break;
4466a87ddacSThomas Lively     case wasm::WASM_OPCODE_GLOBAL_GET:
4479504ab32SSam Clegg       IO.mapRequired("Index", Expr.Inst.Value.Global);
4487fb391feSSam Clegg       break;
44979aad89dSSam Clegg     case wasm::WASM_OPCODE_REF_NULL: {
45079aad89dSSam Clegg       WasmYAML::ValueType Ty = wasm::WASM_TYPE_EXTERNREF;
45179aad89dSSam Clegg       IO.mapRequired("Type", Ty);
45279aad89dSSam Clegg       break;
45379aad89dSSam Clegg     }
454d3d84fddSDerek Schuff     }
455d3d84fddSDerek Schuff   }
4569504ab32SSam Clegg }
457d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::DataSegment & Segment)458d3d84fddSDerek Schuff void MappingTraits<WasmYAML::DataSegment>::mapping(
459d3d84fddSDerek Schuff     IO &IO, WasmYAML::DataSegment &Segment) {
4609c07f94aSSam Clegg   IO.mapOptional("SectionOffset", Segment.SectionOffset);
4612e150409SThomas Lively   IO.mapRequired("InitFlags", Segment.InitFlags);
462831a143eSAndy Wingo   if (Segment.InitFlags & wasm::WASM_DATA_SEGMENT_HAS_MEMINDEX) {
4639c07f94aSSam Clegg     IO.mapRequired("MemoryIndex", Segment.MemoryIndex);
4642e150409SThomas Lively   } else {
4652e150409SThomas Lively     Segment.MemoryIndex = 0;
4662e150409SThomas Lively   }
467831a143eSAndy Wingo   if ((Segment.InitFlags & wasm::WASM_DATA_SEGMENT_IS_PASSIVE) == 0) {
468d3d84fddSDerek Schuff     IO.mapRequired("Offset", Segment.Offset);
4692e150409SThomas Lively   } else {
4709504ab32SSam Clegg     Segment.Offset.Inst.Opcode = wasm::WASM_OPCODE_I32_CONST;
4719504ab32SSam Clegg     Segment.Offset.Inst.Value.Int32 = 0;
4722e150409SThomas Lively   }
473d3d84fddSDerek Schuff   IO.mapRequired("Content", Segment.Content);
474d3d84fddSDerek Schuff }
475d3d84fddSDerek Schuff 
mapping(IO & IO,WasmYAML::InitFunction & Init)4764273998cSSam Clegg void MappingTraits<WasmYAML::InitFunction>::mapping(
4774273998cSSam Clegg     IO &IO, WasmYAML::InitFunction &Init) {
4784273998cSSam Clegg   IO.mapRequired("Priority", Init.Priority);
4796c899ba6SSam Clegg   IO.mapRequired("Symbol", Init.Symbol);
4804273998cSSam Clegg }
4814273998cSSam Clegg 
enumeration(IO & IO,WasmYAML::ComdatKind & Kind)482ea7caceeSSam Clegg void ScalarEnumerationTraits<WasmYAML::ComdatKind>::enumeration(
483ea7caceeSSam Clegg     IO &IO, WasmYAML::ComdatKind &Kind) {
484ea7caceeSSam Clegg #define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_COMDAT_##X);
485ea7caceeSSam Clegg   ECase(FUNCTION);
486ea7caceeSSam Clegg   ECase(DATA);
4870a391060SDerek Schuff   ECase(SECTION);
488ea7caceeSSam Clegg #undef ECase
489ea7caceeSSam Clegg }
490ea7caceeSSam Clegg 
mapping(IO & IO,WasmYAML::ComdatEntry & ComdatEntry)491ea7caceeSSam Clegg void MappingTraits<WasmYAML::ComdatEntry>::mapping(
492ea7caceeSSam Clegg     IO &IO, WasmYAML::ComdatEntry &ComdatEntry) {
493ea7caceeSSam Clegg   IO.mapRequired("Kind", ComdatEntry.Kind);
494ea7caceeSSam Clegg   IO.mapRequired("Index", ComdatEntry.Index);
495ea7caceeSSam Clegg }
496ea7caceeSSam Clegg 
mapping(IO & IO,WasmYAML::Comdat & Comdat)497f208f631SHeejin Ahn void MappingTraits<WasmYAML::Comdat>::mapping(IO &IO,
498f208f631SHeejin Ahn                                               WasmYAML::Comdat &Comdat) {
499ea7caceeSSam Clegg   IO.mapRequired("Name", Comdat.Name);
500ea7caceeSSam Clegg   IO.mapRequired("Entries", Comdat.Entries);
501ea7caceeSSam Clegg }
502ea7caceeSSam Clegg 
mapping(IO & IO,WasmYAML::SymbolInfo & Info)503b7787fd0SSam Clegg void MappingTraits<WasmYAML::SymbolInfo>::mapping(IO &IO,
504b7787fd0SSam Clegg                                                   WasmYAML::SymbolInfo &Info) {
5056c899ba6SSam Clegg   IO.mapRequired("Index", Info.Index);
5066c899ba6SSam Clegg   IO.mapRequired("Kind", Info.Kind);
5075f8c2edeSSam Clegg   if (Info.Kind != wasm::WASM_SYMBOL_TYPE_SECTION)
508b7787fd0SSam Clegg     IO.mapRequired("Name", Info.Name);
509b7787fd0SSam Clegg   IO.mapRequired("Flags", Info.Flags);
5106c899ba6SSam Clegg   if (Info.Kind == wasm::WASM_SYMBOL_TYPE_FUNCTION) {
5116c899ba6SSam Clegg     IO.mapRequired("Function", Info.ElementIndex);
5126c899ba6SSam Clegg   } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_GLOBAL) {
5136c899ba6SSam Clegg     IO.mapRequired("Global", Info.ElementIndex);
514388fb67bSPaulo Matos   } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_TABLE) {
515388fb67bSPaulo Matos     IO.mapRequired("Table", Info.ElementIndex);
5161d891d44SHeejin Ahn   } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_TAG) {
5171d891d44SHeejin Ahn     IO.mapRequired("Tag", Info.ElementIndex);
5186c899ba6SSam Clegg   } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_DATA) {
5196c899ba6SSam Clegg     if ((Info.Flags & wasm::WASM_SYMBOL_UNDEFINED) == 0) {
5206c899ba6SSam Clegg       IO.mapRequired("Segment", Info.DataRef.Segment);
5216c899ba6SSam Clegg       IO.mapOptional("Offset", Info.DataRef.Offset, 0u);
5226c899ba6SSam Clegg       IO.mapRequired("Size", Info.DataRef.Size);
5236c899ba6SSam Clegg     }
5246a31a0d6SSam Clegg   } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_SECTION) {
5256a31a0d6SSam Clegg     IO.mapRequired("Section", Info.ElementIndex);
5266c899ba6SSam Clegg   } else {
5276c899ba6SSam Clegg     llvm_unreachable("unsupported symbol kind");
5286c899ba6SSam Clegg   }
529b7787fd0SSam Clegg }
530b7787fd0SSam Clegg 
mapping(IO & IO,WasmYAML::DylinkImportInfo & Info)531659a0839SSam Clegg void MappingTraits<WasmYAML::DylinkImportInfo>::mapping(
532659a0839SSam Clegg     IO &IO, WasmYAML::DylinkImportInfo &Info) {
533659a0839SSam Clegg   IO.mapRequired("Module", Info.Module);
534659a0839SSam Clegg   IO.mapRequired("Field", Info.Field);
535659a0839SSam Clegg   IO.mapRequired("Flags", Info.Flags);
536659a0839SSam Clegg }
537659a0839SSam Clegg 
mapping(IO & IO,WasmYAML::DylinkExportInfo & Info)538659a0839SSam Clegg void MappingTraits<WasmYAML::DylinkExportInfo>::mapping(
539659a0839SSam Clegg     IO &IO, WasmYAML::DylinkExportInfo &Info) {
540659a0839SSam Clegg   IO.mapRequired("Name", Info.Name);
541659a0839SSam Clegg   IO.mapRequired("Flags", Info.Flags);
542ef8c9135SSam Clegg }
543ef8c9135SSam Clegg 
bitset(IO & IO,WasmYAML::LimitFlags & Value)5440fc5599fSSam Clegg void ScalarBitSetTraits<WasmYAML::LimitFlags>::bitset(
5450fc5599fSSam Clegg     IO &IO, WasmYAML::LimitFlags &Value) {
5460fc5599fSSam Clegg #define BCase(X) IO.bitSetCase(Value, #X, wasm::WASM_LIMITS_FLAG_##X)
5470fc5599fSSam Clegg   BCase(HAS_MAX);
54868818062SDerek Schuff   BCase(IS_SHARED);
5494d135b04SWouter van Oortmerssen   BCase(IS_64);
5500fc5599fSSam Clegg #undef BCase
5510fc5599fSSam Clegg }
5520fc5599fSSam Clegg 
bitset(IO & IO,WasmYAML::SegmentFlags & Value)5530fc5599fSSam Clegg void ScalarBitSetTraits<WasmYAML::SegmentFlags>::bitset(
5543b8d2be5SSam Clegg     IO &IO, WasmYAML::SegmentFlags &Value) {
5553b8d2be5SSam Clegg #define BCase(X) IO.bitSetCase(Value, #X, wasm::WASM_SEG_FLAG_##X)
5563b8d2be5SSam Clegg   BCase(STRINGS);
5573041b16fSSam Clegg   BCase(TLS);
5583b8d2be5SSam Clegg #undef BCase
5593b8d2be5SSam Clegg }
5600fc5599fSSam Clegg 
bitset(IO & IO,WasmYAML::SymbolFlags & Value)5610fc5599fSSam Clegg void ScalarBitSetTraits<WasmYAML::SymbolFlags>::bitset(
5620fc5599fSSam Clegg     IO &IO, WasmYAML::SymbolFlags &Value) {
563f208f631SHeejin Ahn #define BCaseMask(M, X)                                                        \
564f208f631SHeejin Ahn   IO.maskedBitSetCase(Value, #X, wasm::WASM_SYMBOL_##X, wasm::WASM_SYMBOL_##M)
5650fc5599fSSam Clegg   // BCaseMask(BINDING_MASK, BINDING_GLOBAL);
5660fc5599fSSam Clegg   BCaseMask(BINDING_MASK, BINDING_WEAK);
5670fc5599fSSam Clegg   BCaseMask(BINDING_MASK, BINDING_LOCAL);
5680fc5599fSSam Clegg   // BCaseMask(VISIBILITY_MASK, VISIBILITY_DEFAULT);
5690fc5599fSSam Clegg   BCaseMask(VISIBILITY_MASK, VISIBILITY_HIDDEN);
5706c899ba6SSam Clegg   BCaseMask(UNDEFINED, UNDEFINED);
571d6ef8da3SSam Clegg   BCaseMask(EXPORTED, EXPORTED);
5723b5b9d0eSDan Gohman   BCaseMask(EXPLICIT_NAME, EXPLICIT_NAME);
573da84b688SDan Gohman   BCaseMask(NO_STRIP, NO_STRIP);
57444177e5fSSam Clegg   BCaseMask(TLS, TLS);
5750fc5599fSSam Clegg #undef BCaseMask
5760fc5599fSSam Clegg }
5770fc5599fSSam Clegg 
enumeration(IO & IO,WasmYAML::SymbolKind & Kind)5786c899ba6SSam Clegg void ScalarEnumerationTraits<WasmYAML::SymbolKind>::enumeration(
5796c899ba6SSam Clegg     IO &IO, WasmYAML::SymbolKind &Kind) {
5806c899ba6SSam Clegg #define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_SYMBOL_TYPE_##X);
5816c899ba6SSam Clegg   ECase(FUNCTION);
5826c899ba6SSam Clegg   ECase(DATA);
5836c899ba6SSam Clegg   ECase(GLOBAL);
584388fb67bSPaulo Matos   ECase(TABLE);
5856a31a0d6SSam Clegg   ECase(SECTION);
5861d891d44SHeejin Ahn   ECase(TAG);
5876c899ba6SSam Clegg #undef ECase
5886c899ba6SSam Clegg }
5896c899ba6SSam Clegg 
enumeration(IO & IO,WasmYAML::ValueType & Type)590d3d84fddSDerek Schuff void ScalarEnumerationTraits<WasmYAML::ValueType>::enumeration(
591d3d84fddSDerek Schuff     IO &IO, WasmYAML::ValueType &Type) {
592d3d84fddSDerek Schuff #define ECase(X) IO.enumCase(Type, #X, wasm::WASM_TYPE_##X);
593d3d84fddSDerek Schuff   ECase(I32);
594d3d84fddSDerek Schuff   ECase(I64);
595d3d84fddSDerek Schuff   ECase(F32);
596d3d84fddSDerek Schuff   ECase(F64);
5976f21a136SThomas Lively   ECase(V128);
5986a87ddacSThomas Lively   ECase(FUNCREF);
59979aad89dSSam Clegg   ECase(EXTERNREF);
600d3d84fddSDerek Schuff   ECase(FUNC);
601d3d84fddSDerek Schuff #undef ECase
602d3d84fddSDerek Schuff }
603d3d84fddSDerek Schuff 
enumeration(IO & IO,WasmYAML::ExportKind & Kind)604d3d84fddSDerek Schuff void ScalarEnumerationTraits<WasmYAML::ExportKind>::enumeration(
605d3d84fddSDerek Schuff     IO &IO, WasmYAML::ExportKind &Kind) {
606d3d84fddSDerek Schuff #define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_EXTERNAL_##X);
607d3d84fddSDerek Schuff   ECase(FUNCTION);
608d3d84fddSDerek Schuff   ECase(TABLE);
609d3d84fddSDerek Schuff   ECase(MEMORY);
610d3d84fddSDerek Schuff   ECase(GLOBAL);
6111d891d44SHeejin Ahn   ECase(TAG);
612d3d84fddSDerek Schuff #undef ECase
613d3d84fddSDerek Schuff }
614d3d84fddSDerek Schuff 
enumeration(IO & IO,WasmYAML::Opcode & Code)615d3d84fddSDerek Schuff void ScalarEnumerationTraits<WasmYAML::Opcode>::enumeration(
616d3d84fddSDerek Schuff     IO &IO, WasmYAML::Opcode &Code) {
617d3d84fddSDerek Schuff #define ECase(X) IO.enumCase(Code, #X, wasm::WASM_OPCODE_##X);
618d3d84fddSDerek Schuff   ECase(END);
619d3d84fddSDerek Schuff   ECase(I32_CONST);
620d3d84fddSDerek Schuff   ECase(I64_CONST);
621d3d84fddSDerek Schuff   ECase(F64_CONST);
622d3d84fddSDerek Schuff   ECase(F32_CONST);
6236a87ddacSThomas Lively   ECase(GLOBAL_GET);
62479aad89dSSam Clegg   ECase(REF_NULL);
625d3d84fddSDerek Schuff #undef ECase
626d3d84fddSDerek Schuff }
627d3d84fddSDerek Schuff 
enumeration(IO & IO,WasmYAML::TableType & Type)628d3d84fddSDerek Schuff void ScalarEnumerationTraits<WasmYAML::TableType>::enumeration(
629d3d84fddSDerek Schuff     IO &IO, WasmYAML::TableType &Type) {
630d3d84fddSDerek Schuff #define ECase(X) IO.enumCase(Type, #X, wasm::WASM_TYPE_##X);
6316a87ddacSThomas Lively   ECase(FUNCREF);
632388fb67bSPaulo Matos   ECase(EXTERNREF);
633d3d84fddSDerek Schuff #undef ECase
634d3d84fddSDerek Schuff }
635d3d84fddSDerek Schuff 
enumeration(IO & IO,WasmYAML::RelocType & Type)636d3d84fddSDerek Schuff void ScalarEnumerationTraits<WasmYAML::RelocType>::enumeration(
637d3d84fddSDerek Schuff     IO &IO, WasmYAML::RelocType &Type) {
638d3d84fddSDerek Schuff #define WASM_RELOC(name, value) IO.enumCase(Type, #name, wasm::name);
639c5d8bc83SSam Clegg #include "llvm/BinaryFormat/WasmRelocs.def"
640d3d84fddSDerek Schuff #undef WASM_RELOC
641fb7c3663SFangrui Song   IO.enumFallback<Hex32>(Type);
642d3d84fddSDerek Schuff }
643d3d84fddSDerek Schuff 
644d3d84fddSDerek Schuff } // end namespace yaml
64528082ab0SEugene Zelenko 
646d3d84fddSDerek Schuff } // end namespace llvm
647