WasmYAML.cpp revision 360784
131606Syokota//===- WasmYAML.cpp - Wasm YAMLIO implementation --------------------------===// 231606Syokota// 331606Syokota// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 431606Syokota// See https://llvm.org/LICENSE.txt for license information. 531606Syokota// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 631606Syokota// 731606Syokota//===----------------------------------------------------------------------===// 831606Syokota// 931606Syokota// This file defines classes for handling the YAML representation of wasm. 1031606Syokota// 1131606Syokota//===----------------------------------------------------------------------===// 1231606Syokota 1331606Syokota#include "llvm/ObjectYAML/WasmYAML.h" 1431606Syokota#include "llvm/ADT/StringRef.h" 1531606Syokota#include "llvm/Support/Casting.h" 1631606Syokota#include "llvm/Support/ErrorHandling.h" 1731606Syokota#include "llvm/Support/YAMLTraits.h" 1831606Syokota 1931606Syokotanamespace llvm { 2031606Syokota 2131606Syokotanamespace WasmYAML { 2231606Syokota 2331606Syokota// Declared here rather than in the header to comply with: 2431606Syokota// http://llvm.org/docs/CodingStandards.html#provide-a-virtual-method-anchor-for-classes-in-headers 2531606SyokotaSection::~Section() = default; 2631606Syokota 2750476Speter} // end namespace WasmYAML 2831606Syokota 2931606Syokotanamespace yaml { 3053200Sphantom 3179538Sruvoid MappingTraits<WasmYAML::FileHeader>::mapping( 3231606Syokota IO &IO, WasmYAML::FileHeader &FileHdr) { 3331606Syokota IO.mapRequired("Version", FileHdr.Version); 3431606Syokota} 3531606Syokota 3684306Sruvoid MappingTraits<WasmYAML::Object>::mapping(IO &IO, 3731606Syokota WasmYAML::Object &Object) { 3831606Syokota IO.setContext(&Object); 3931606Syokota IO.mapTag("!WASM", true); 4054142Syokota IO.mapRequired("FileHeader", Object.Header); 4154142Syokota IO.mapOptional("Sections", Object.Sections); 4231606Syokota IO.setContext(nullptr); 4331606Syokota} 4431606Syokota 4554142Syokotastatic void commonSectionMapping(IO &IO, WasmYAML::Section &Section) { 4631606Syokota IO.mapRequired("Type", Section.Type); 4731606Syokota IO.mapOptional("Relocations", Section.Relocations); 4879727Sschweikh} 4931606Syokota 5031606Syokotastatic void sectionMapping(IO &IO, WasmYAML::DylinkSection &Section) { 5131606Syokota commonSectionMapping(IO, Section); 5231606Syokota IO.mapRequired("Name", Section.Name); 5331606Syokota IO.mapRequired("MemorySize", Section.MemorySize); 5431606Syokota IO.mapRequired("MemoryAlignment", Section.MemoryAlignment); 5531606Syokota IO.mapRequired("TableSize", Section.TableSize); 5631606Syokota IO.mapRequired("TableAlignment", Section.TableAlignment); 5731606Syokota IO.mapRequired("Needed", Section.Needed); 5831606Syokota} 5979727Sschweikh 6031606Syokotastatic void sectionMapping(IO &IO, WasmYAML::NameSection &Section) { 6131606Syokota commonSectionMapping(IO, Section); 6231606Syokota IO.mapRequired("Name", Section.Name); 6331606Syokota IO.mapOptional("FunctionNames", Section.FunctionNames); 6431606Syokota} 6531606Syokota 6631606Syokotastatic void sectionMapping(IO &IO, WasmYAML::LinkingSection &Section) { 6731606Syokota commonSectionMapping(IO, Section); 6831606Syokota IO.mapRequired("Name", Section.Name); 6979727Sschweikh IO.mapRequired("Version", Section.Version); 7031606Syokota IO.mapOptional("SymbolTable", Section.SymbolTable); 7131606Syokota IO.mapOptional("SegmentInfo", Section.SegmentInfos); 7231606Syokota IO.mapOptional("InitFunctions", Section.InitFunctions); 7379727Sschweikh IO.mapOptional("Comdats", Section.Comdats); 7479727Sschweikh} 7531606Syokota 7631606Syokotastatic void sectionMapping(IO &IO, WasmYAML::ProducersSection &Section) { 7731606Syokota commonSectionMapping(IO, Section); 7879727Sschweikh IO.mapRequired("Name", Section.Name); 7931606Syokota IO.mapOptional("Languages", Section.Languages); 8031606Syokota IO.mapOptional("Tools", Section.Tools); 8131606Syokota IO.mapOptional("SDKs", Section.SDKs); 8231606Syokota} 8331606Syokota 8431606Syokotastatic void sectionMapping(IO &IO, WasmYAML::TargetFeaturesSection &Section) { 8531606Syokota commonSectionMapping(IO, Section); 8631606Syokota IO.mapRequired("Name", Section.Name); 8757676Ssheldonh IO.mapRequired("Features", Section.Features); 8857676Ssheldonh} 8931606Syokota 9031606Syokotastatic void sectionMapping(IO &IO, WasmYAML::CustomSection &Section) { 9131606Syokota commonSectionMapping(IO, Section); 9231606Syokota IO.mapRequired("Name", Section.Name); 9331606Syokota IO.mapRequired("Payload", Section.Payload); 9479727Sschweikh} 9531606Syokota 9631606Syokotastatic void sectionMapping(IO &IO, WasmYAML::TypeSection &Section) { 9779727Sschweikh commonSectionMapping(IO, Section); 9831606Syokota IO.mapOptional("Signatures", Section.Signatures); 9931606Syokota} 10079727Sschweikh 101131530Srustatic void sectionMapping(IO &IO, WasmYAML::ImportSection &Section) { 102131530Sru commonSectionMapping(IO, Section); 10331606Syokota IO.mapOptional("Imports", Section.Imports); 10431606Syokota} 10579727Sschweikh 106131530Srustatic void sectionMapping(IO &IO, WasmYAML::FunctionSection &Section) { 107131530Sru commonSectionMapping(IO, Section); 10831606Syokota IO.mapOptional("FunctionTypes", Section.FunctionTypes); 10931606Syokota} 11057676Ssheldonh 11179727Sschweikhstatic void sectionMapping(IO &IO, WasmYAML::TableSection &Section) { 11250103Schris commonSectionMapping(IO, Section); 11331606Syokota IO.mapOptional("Tables", Section.Tables); 11457676Ssheldonh} 11579727Sschweikh 11650103Schrisstatic void sectionMapping(IO &IO, WasmYAML::MemorySection &Section) { 11731606Syokota commonSectionMapping(IO, Section); 11831606Syokota IO.mapOptional("Memories", Section.Memories); 11957676Ssheldonh} 12057676Ssheldonh 12131606Syokotastatic void sectionMapping(IO &IO, WasmYAML::GlobalSection &Section) { 12257676Ssheldonh commonSectionMapping(IO, Section); 12357676Ssheldonh IO.mapOptional("Globals", Section.Globals); 12431606Syokota} 12531606Syokota 12631606Syokotastatic void sectionMapping(IO &IO, WasmYAML::EventSection &Section) { 12731606Syokota commonSectionMapping(IO, Section); 12857676Ssheldonh IO.mapOptional("Events", Section.Events); 12979727Sschweikh} 13031606Syokota 13131606Syokotastatic void sectionMapping(IO &IO, WasmYAML::ExportSection &Section) { 13279727Sschweikh commonSectionMapping(IO, Section); 13379727Sschweikh IO.mapOptional("Exports", Section.Exports); 13431606Syokota} 13531606Syokota 13631606Syokotastatic void sectionMapping(IO &IO, WasmYAML::StartSection &Section) { 13731606Syokota commonSectionMapping(IO, Section); 13831606Syokota IO.mapOptional("StartFunction", Section.StartFunction); 13931606Syokota} 14031606Syokota 14157676Ssheldonhstatic void sectionMapping(IO &IO, WasmYAML::ElemSection &Section) { 14257676Ssheldonh commonSectionMapping(IO, Section); 14357676Ssheldonh IO.mapOptional("Segments", Section.Segments); 14479727Sschweikh} 14531606Syokota 14631606Syokotastatic void sectionMapping(IO &IO, WasmYAML::CodeSection &Section) { 14731606Syokota commonSectionMapping(IO, Section); 14831606Syokota IO.mapRequired("Functions", Section.Functions); 14931606Syokota} 15031606Syokota 15131606Syokotastatic void sectionMapping(IO &IO, WasmYAML::DataSection &Section) { 15231606Syokota commonSectionMapping(IO, Section); 15331606Syokota IO.mapRequired("Segments", Section.Segments); 15479727Sschweikh} 15531606Syokota 15631606Syokotastatic void sectionMapping(IO &IO, WasmYAML::DataCountSection &Section) { 15731606Syokota commonSectionMapping(IO, Section); 15831606Syokota IO.mapRequired("Count", Section.Count); 15931606Syokota} 16031606Syokota 16131606Syokotavoid MappingTraits<std::unique_ptr<WasmYAML::Section>>::mapping( 16231606Syokota IO &IO, std::unique_ptr<WasmYAML::Section> &Section) { 16331606Syokota WasmYAML::SectionType SectionType; 16431606Syokota if (IO.outputting()) 16531606Syokota SectionType = Section->Type; 16631606Syokota else 16731606Syokota IO.mapRequired("Type", SectionType); 16831606Syokota 16931606Syokota switch (SectionType) { 17031606Syokota case wasm::WASM_SEC_CUSTOM: { 17131606Syokota StringRef SectionName; 17257676Ssheldonh if (IO.outputting()) { 17357676Ssheldonh auto CustomSection = cast<WasmYAML::CustomSection>(Section.get()); 17431606Syokota SectionName = CustomSection->Name; 17531606Syokota } else { 17631606Syokota IO.mapRequired("Name", SectionName); 17731606Syokota } 17831606Syokota if (SectionName == "dylink") { 17931606Syokota if (!IO.outputting()) 18031606Syokota Section.reset(new WasmYAML::DylinkSection()); 18131606Syokota sectionMapping(IO, *cast<WasmYAML::DylinkSection>(Section.get())); 18231606Syokota } else if (SectionName == "linking") { 18331606Syokota if (!IO.outputting()) 18454142Syokota Section.reset(new WasmYAML::LinkingSection()); 18531606Syokota sectionMapping(IO, *cast<WasmYAML::LinkingSection>(Section.get())); 18631606Syokota } else if (SectionName == "name") { 18731606Syokota if (!IO.outputting()) 18831606Syokota Section.reset(new WasmYAML::NameSection()); 18931606Syokota sectionMapping(IO, *cast<WasmYAML::NameSection>(Section.get())); 19031606Syokota } else if (SectionName == "producers") { 19131606Syokota if (!IO.outputting()) 19231606Syokota Section.reset(new WasmYAML::ProducersSection()); 19331606Syokota sectionMapping(IO, *cast<WasmYAML::ProducersSection>(Section.get())); 19431606Syokota } else if (SectionName == "target_features") { 19531606Syokota if (!IO.outputting()) 19631606Syokota Section.reset(new WasmYAML::TargetFeaturesSection()); 19731606Syokota sectionMapping(IO, *cast<WasmYAML::TargetFeaturesSection>(Section.get())); 19831606Syokota } else { 19931606Syokota if (!IO.outputting()) 20031606Syokota Section.reset(new WasmYAML::CustomSection(SectionName)); 20179727Sschweikh sectionMapping(IO, *cast<WasmYAML::CustomSection>(Section.get())); 20231606Syokota } 20379727Sschweikh break; 20431606Syokota } 20531606Syokota case wasm::WASM_SEC_TYPE: 20631606Syokota if (!IO.outputting()) 20731606Syokota Section.reset(new WasmYAML::TypeSection()); 20831606Syokota sectionMapping(IO, *cast<WasmYAML::TypeSection>(Section.get())); 20957676Ssheldonh break; 21057676Ssheldonh case wasm::WASM_SEC_IMPORT: 21179727Sschweikh if (!IO.outputting()) 21231606Syokota Section.reset(new WasmYAML::ImportSection()); 21331606Syokota sectionMapping(IO, *cast<WasmYAML::ImportSection>(Section.get())); 21431606Syokota break; 21531606Syokota case wasm::WASM_SEC_FUNCTION: 21631606Syokota if (!IO.outputting()) 21731606Syokota Section.reset(new WasmYAML::FunctionSection()); 21831606Syokota sectionMapping(IO, *cast<WasmYAML::FunctionSection>(Section.get())); 21931606Syokota break; 22031606Syokota case wasm::WASM_SEC_TABLE: 22131606Syokota if (!IO.outputting()) 22231606Syokota Section.reset(new WasmYAML::TableSection()); 22331606Syokota sectionMapping(IO, *cast<WasmYAML::TableSection>(Section.get())); 22431606Syokota break; 22531606Syokota case wasm::WASM_SEC_MEMORY: 22631606Syokota if (!IO.outputting()) 22731606Syokota Section.reset(new WasmYAML::MemorySection()); 22831606Syokota sectionMapping(IO, *cast<WasmYAML::MemorySection>(Section.get())); 22931606Syokota break; 23079727Sschweikh case wasm::WASM_SEC_GLOBAL: 23131606Syokota if (!IO.outputting()) 23279727Sschweikh Section.reset(new WasmYAML::GlobalSection()); 23331606Syokota sectionMapping(IO, *cast<WasmYAML::GlobalSection>(Section.get())); 23431606Syokota break; 23531606Syokota case wasm::WASM_SEC_EVENT: 23631606Syokota if (!IO.outputting()) 23731606Syokota Section.reset(new WasmYAML::EventSection()); 23879727Sschweikh sectionMapping(IO, *cast<WasmYAML::EventSection>(Section.get())); 239131530Sru break; 240131530Sru case wasm::WASM_SEC_EXPORT: 24131606Syokota if (!IO.outputting()) 24231606Syokota Section.reset(new WasmYAML::ExportSection()); 24331606Syokota sectionMapping(IO, *cast<WasmYAML::ExportSection>(Section.get())); 24431606Syokota break; 24579727Sschweikh case wasm::WASM_SEC_START: 24631606Syokota if (!IO.outputting()) 24731606Syokota Section.reset(new WasmYAML::StartSection()); 24831606Syokota sectionMapping(IO, *cast<WasmYAML::StartSection>(Section.get())); 24931606Syokota break; 25031606Syokota case wasm::WASM_SEC_ELEM: 25131606Syokota if (!IO.outputting()) 25231606Syokota Section.reset(new WasmYAML::ElemSection()); 25331606Syokota sectionMapping(IO, *cast<WasmYAML::ElemSection>(Section.get())); 25431606Syokota break; 25531606Syokota case wasm::WASM_SEC_CODE: 25631606Syokota if (!IO.outputting()) 25731606Syokota Section.reset(new WasmYAML::CodeSection()); 25831606Syokota sectionMapping(IO, *cast<WasmYAML::CodeSection>(Section.get())); 25931606Syokota break; 26031606Syokota case wasm::WASM_SEC_DATA: 26131606Syokota if (!IO.outputting()) 26231606Syokota Section.reset(new WasmYAML::DataSection()); 26331606Syokota sectionMapping(IO, *cast<WasmYAML::DataSection>(Section.get())); 26431606Syokota break; 26531606Syokota case wasm::WASM_SEC_DATACOUNT: 26631606Syokota if (!IO.outputting()) 26757676Ssheldonh Section.reset(new WasmYAML::DataCountSection()); 26857676Ssheldonh sectionMapping(IO, *cast<WasmYAML::DataCountSection>(Section.get())); 26931606Syokota break; 27031606Syokota default: 27131606Syokota llvm_unreachable("Unknown section type"); 27231606Syokota } 27331606Syokota} 27431606Syokota 27531606Syokotavoid ScalarEnumerationTraits<WasmYAML::SectionType>::enumeration( 27631606Syokota IO &IO, WasmYAML::SectionType &Type) { 27731606Syokota#define ECase(X) IO.enumCase(Type, #X, wasm::WASM_SEC_##X); 27831606Syokota ECase(CUSTOM); 27931606Syokota ECase(TYPE); 28031606Syokota ECase(IMPORT); 28179727Sschweikh ECase(FUNCTION); 28279727Sschweikh ECase(TABLE); 28331606Syokota ECase(MEMORY); 28457676Ssheldonh ECase(GLOBAL); 28557676Ssheldonh ECase(EVENT); 28631606Syokota ECase(EXPORT); 28731606Syokota ECase(START); 28831606Syokota ECase(ELEM); 28931606Syokota ECase(CODE); 29079727Sschweikh ECase(DATA); 29131606Syokota ECase(DATACOUNT); 29231606Syokota#undef ECase 29331606Syokota} 29431606Syokota 29531606Syokotavoid MappingTraits<WasmYAML::Signature>::mapping( 29631606Syokota IO &IO, WasmYAML::Signature &Signature) { 29779727Sschweikh IO.mapRequired("Index", Signature.Index); 29831606Syokota IO.mapRequired("ParamTypes", Signature.ParamTypes); 29979727Sschweikh IO.mapRequired("ReturnTypes", Signature.ReturnTypes); 30031606Syokota} 30131606Syokota 30231606Syokotavoid MappingTraits<WasmYAML::Table>::mapping(IO &IO, WasmYAML::Table &Table) { 30331606Syokota IO.mapRequired("ElemType", Table.ElemType); 30431606Syokota IO.mapRequired("Limits", Table.TableLimits); 30531606Syokota} 30631606Syokota 30731606Syokotavoid MappingTraits<WasmYAML::Function>::mapping(IO &IO, 30879727Sschweikh WasmYAML::Function &Function) { 30979727Sschweikh IO.mapRequired("Index", Function.Index); 31031606Syokota IO.mapRequired("Locals", Function.Locals); 31131606Syokota IO.mapRequired("Body", Function.Body); 31231606Syokota} 31379727Sschweikh 31431606Syokotavoid MappingTraits<WasmYAML::Relocation>::mapping( 31531606Syokota IO &IO, WasmYAML::Relocation &Relocation) { 31631606Syokota IO.mapRequired("Type", Relocation.Type); 31731606Syokota IO.mapRequired("Index", Relocation.Index); 31831606Syokota IO.mapRequired("Offset", Relocation.Offset); 31931606Syokota IO.mapOptional("Addend", Relocation.Addend, 0); 32031606Syokota} 32131606Syokota 32231606Syokotavoid MappingTraits<WasmYAML::NameEntry>::mapping( 32331606Syokota IO &IO, WasmYAML::NameEntry &NameEntry) { 32431606Syokota IO.mapRequired("Index", NameEntry.Index); 32531606Syokota IO.mapRequired("Name", NameEntry.Name); 32631606Syokota} 32731606Syokota 32831606Syokotavoid MappingTraits<WasmYAML::ProducerEntry>::mapping( 32931606Syokota IO &IO, WasmYAML::ProducerEntry &ProducerEntry) { 33031606Syokota IO.mapRequired("Name", ProducerEntry.Name); 33131606Syokota IO.mapRequired("Version", ProducerEntry.Version); 33231606Syokota} 33331606Syokota 33431606Syokotavoid ScalarEnumerationTraits<WasmYAML::FeaturePolicyPrefix>::enumeration( 33531606Syokota IO &IO, WasmYAML::FeaturePolicyPrefix &Kind) { 33653054Syokota#define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_FEATURE_PREFIX_##X); 33779727Sschweikh ECase(USED); 33831606Syokota ECase(REQUIRED); 33931606Syokota ECase(DISALLOWED); 34031606Syokota#undef ECase 34131606Syokota} 34231606Syokota 34331606Syokotavoid MappingTraits<WasmYAML::FeatureEntry>::mapping( 34431606Syokota IO &IO, WasmYAML::FeatureEntry &FeatureEntry) { 34531606Syokota IO.mapRequired("Prefix", FeatureEntry.Prefix); 34631606Syokota IO.mapRequired("Name", FeatureEntry.Name); 34731606Syokota} 34831606Syokota 34931606Syokotavoid MappingTraits<WasmYAML::SegmentInfo>::mapping( 35031606Syokota IO &IO, WasmYAML::SegmentInfo &SegmentInfo) { 35131606Syokota IO.mapRequired("Index", SegmentInfo.Index); 35231606Syokota IO.mapRequired("Name", SegmentInfo.Name); 35331606Syokota IO.mapRequired("Alignment", SegmentInfo.Alignment); 35431606Syokota IO.mapRequired("Flags", SegmentInfo.Flags); 35531606Syokota} 35631606Syokota 35779727Sschweikhvoid MappingTraits<WasmYAML::LocalDecl>::mapping( 35831606Syokota IO &IO, WasmYAML::LocalDecl &LocalDecl) { 35979727Sschweikh IO.mapRequired("Type", LocalDecl.Type); 36031606Syokota IO.mapRequired("Count", LocalDecl.Count); 36131606Syokota} 36231606Syokota 36379727Sschweikhvoid MappingTraits<WasmYAML::Limits>::mapping(IO &IO, 36453054Syokota WasmYAML::Limits &Limits) { 36531606Syokota if (!IO.outputting() || Limits.Flags) 36631606Syokota IO.mapOptional("Flags", Limits.Flags); 36779727Sschweikh IO.mapRequired("Initial", Limits.Initial); 36831606Syokota if (!IO.outputting() || Limits.Flags & wasm::WASM_LIMITS_FLAG_HAS_MAX) 36931606Syokota IO.mapOptional("Maximum", Limits.Maximum); 37031606Syokota} 37131606Syokota 37231606Syokotavoid MappingTraits<WasmYAML::ElemSegment>::mapping( 37331606Syokota IO &IO, WasmYAML::ElemSegment &Segment) { 37479727Sschweikh IO.mapRequired("Offset", Segment.Offset); 37553054Syokota IO.mapRequired("Functions", Segment.Functions); 37657676Ssheldonh} 37757676Ssheldonh 37831606Syokotavoid MappingTraits<WasmYAML::Import>::mapping(IO &IO, 37931606Syokota WasmYAML::Import &Import) { 38031606Syokota IO.mapRequired("Module", Import.Module); 38131606Syokota IO.mapRequired("Field", Import.Field); 382244040Seadler IO.mapRequired("Kind", Import.Kind); 38331606Syokota if (Import.Kind == wasm::WASM_EXTERNAL_FUNCTION) { 38431606Syokota IO.mapRequired("SigIndex", Import.SigIndex); 38531606Syokota } else if (Import.Kind == wasm::WASM_EXTERNAL_GLOBAL) { 38631606Syokota IO.mapRequired("GlobalType", Import.GlobalImport.Type); 38731606Syokota IO.mapRequired("GlobalMutable", Import.GlobalImport.Mutable); 38831606Syokota } else if (Import.Kind == wasm::WASM_EXTERNAL_EVENT) { 38931606Syokota IO.mapRequired("EventAttribute", Import.EventImport.Attribute); 39054142Syokota IO.mapRequired("EventSigIndex", Import.EventImport.SigIndex); 39154142Syokota } else if (Import.Kind == wasm::WASM_EXTERNAL_TABLE) { 39231606Syokota IO.mapRequired("Table", Import.TableImport); 39331606Syokota } else if (Import.Kind == wasm::WASM_EXTERNAL_MEMORY) { 39431606Syokota IO.mapRequired("Memory", Import.Memory); 39531606Syokota } else { 39631606Syokota llvm_unreachable("unhandled import type"); 39731606Syokota } 39854142Syokota} 39931606Syokota 40031606Syokotavoid MappingTraits<WasmYAML::Export>::mapping(IO &IO, 40134504Scharnier WasmYAML::Export &Export) { 40231606Syokota IO.mapRequired("Name", Export.Name); 403267938Sbapt IO.mapRequired("Kind", Export.Kind); 404 IO.mapRequired("Index", Export.Index); 405} 406 407void MappingTraits<WasmYAML::Global>::mapping(IO &IO, 408 WasmYAML::Global &Global) { 409 IO.mapRequired("Index", Global.Index); 410 IO.mapRequired("Type", Global.Type); 411 IO.mapRequired("Mutable", Global.Mutable); 412 IO.mapRequired("InitExpr", Global.InitExpr); 413} 414 415void MappingTraits<wasm::WasmInitExpr>::mapping(IO &IO, 416 wasm::WasmInitExpr &Expr) { 417 WasmYAML::Opcode Op = Expr.Opcode; 418 IO.mapRequired("Opcode", Op); 419 Expr.Opcode = Op; 420 switch (Expr.Opcode) { 421 case wasm::WASM_OPCODE_I32_CONST: 422 IO.mapRequired("Value", Expr.Value.Int32); 423 break; 424 case wasm::WASM_OPCODE_I64_CONST: 425 IO.mapRequired("Value", Expr.Value.Int64); 426 break; 427 case wasm::WASM_OPCODE_F32_CONST: 428 IO.mapRequired("Value", Expr.Value.Float32); 429 break; 430 case wasm::WASM_OPCODE_F64_CONST: 431 IO.mapRequired("Value", Expr.Value.Float64); 432 break; 433 case wasm::WASM_OPCODE_GLOBAL_GET: 434 IO.mapRequired("Index", Expr.Value.Global); 435 break; 436 } 437} 438 439void MappingTraits<WasmYAML::DataSegment>::mapping( 440 IO &IO, WasmYAML::DataSegment &Segment) { 441 IO.mapOptional("SectionOffset", Segment.SectionOffset); 442 IO.mapRequired("InitFlags", Segment.InitFlags); 443 if (Segment.InitFlags & wasm::WASM_SEGMENT_HAS_MEMINDEX) { 444 IO.mapRequired("MemoryIndex", Segment.MemoryIndex); 445 } else { 446 Segment.MemoryIndex = 0; 447 } 448 if ((Segment.InitFlags & wasm::WASM_SEGMENT_IS_PASSIVE) == 0) { 449 IO.mapRequired("Offset", Segment.Offset); 450 } else { 451 Segment.Offset.Opcode = wasm::WASM_OPCODE_I32_CONST; 452 Segment.Offset.Value.Int32 = 0; 453 } 454 IO.mapRequired("Content", Segment.Content); 455} 456 457void MappingTraits<WasmYAML::InitFunction>::mapping( 458 IO &IO, WasmYAML::InitFunction &Init) { 459 IO.mapRequired("Priority", Init.Priority); 460 IO.mapRequired("Symbol", Init.Symbol); 461} 462 463void ScalarEnumerationTraits<WasmYAML::ComdatKind>::enumeration( 464 IO &IO, WasmYAML::ComdatKind &Kind) { 465#define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_COMDAT_##X); 466 ECase(FUNCTION); 467 ECase(DATA); 468#undef ECase 469} 470 471void MappingTraits<WasmYAML::ComdatEntry>::mapping( 472 IO &IO, WasmYAML::ComdatEntry &ComdatEntry) { 473 IO.mapRequired("Kind", ComdatEntry.Kind); 474 IO.mapRequired("Index", ComdatEntry.Index); 475} 476 477void MappingTraits<WasmYAML::Comdat>::mapping(IO &IO, 478 WasmYAML::Comdat &Comdat) { 479 IO.mapRequired("Name", Comdat.Name); 480 IO.mapRequired("Entries", Comdat.Entries); 481} 482 483void MappingTraits<WasmYAML::SymbolInfo>::mapping(IO &IO, 484 WasmYAML::SymbolInfo &Info) { 485 IO.mapRequired("Index", Info.Index); 486 IO.mapRequired("Kind", Info.Kind); 487 if (Info.Kind != wasm::WASM_SYMBOL_TYPE_SECTION) 488 IO.mapRequired("Name", Info.Name); 489 IO.mapRequired("Flags", Info.Flags); 490 if (Info.Kind == wasm::WASM_SYMBOL_TYPE_FUNCTION) { 491 IO.mapRequired("Function", Info.ElementIndex); 492 } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_GLOBAL) { 493 IO.mapRequired("Global", Info.ElementIndex); 494 } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_EVENT) { 495 IO.mapRequired("Event", Info.ElementIndex); 496 } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_DATA) { 497 if ((Info.Flags & wasm::WASM_SYMBOL_UNDEFINED) == 0) { 498 IO.mapRequired("Segment", Info.DataRef.Segment); 499 IO.mapOptional("Offset", Info.DataRef.Offset, 0u); 500 IO.mapRequired("Size", Info.DataRef.Size); 501 } 502 } else if (Info.Kind == wasm::WASM_SYMBOL_TYPE_SECTION) { 503 IO.mapRequired("Section", Info.ElementIndex); 504 } else { 505 llvm_unreachable("unsupported symbol kind"); 506 } 507} 508 509void MappingTraits<WasmYAML::Event>::mapping(IO &IO, WasmYAML::Event &Event) { 510 IO.mapRequired("Index", Event.Index); 511 IO.mapRequired("Attribute", Event.Attribute); 512 IO.mapRequired("SigIndex", Event.SigIndex); 513} 514 515void ScalarBitSetTraits<WasmYAML::LimitFlags>::bitset( 516 IO &IO, WasmYAML::LimitFlags &Value) { 517#define BCase(X) IO.bitSetCase(Value, #X, wasm::WASM_LIMITS_FLAG_##X) 518 BCase(HAS_MAX); 519 BCase(IS_SHARED); 520#undef BCase 521} 522 523void ScalarBitSetTraits<WasmYAML::SegmentFlags>::bitset( 524 IO &IO, WasmYAML::SegmentFlags &Value) {} 525 526void ScalarBitSetTraits<WasmYAML::SymbolFlags>::bitset( 527 IO &IO, WasmYAML::SymbolFlags &Value) { 528#define BCaseMask(M, X) \ 529 IO.maskedBitSetCase(Value, #X, wasm::WASM_SYMBOL_##X, wasm::WASM_SYMBOL_##M) 530 // BCaseMask(BINDING_MASK, BINDING_GLOBAL); 531 BCaseMask(BINDING_MASK, BINDING_WEAK); 532 BCaseMask(BINDING_MASK, BINDING_LOCAL); 533 // BCaseMask(VISIBILITY_MASK, VISIBILITY_DEFAULT); 534 BCaseMask(VISIBILITY_MASK, VISIBILITY_HIDDEN); 535 BCaseMask(UNDEFINED, UNDEFINED); 536 BCaseMask(EXPORTED, EXPORTED); 537 BCaseMask(EXPLICIT_NAME, EXPLICIT_NAME); 538 BCaseMask(NO_STRIP, NO_STRIP); 539#undef BCaseMask 540} 541 542void ScalarEnumerationTraits<WasmYAML::SymbolKind>::enumeration( 543 IO &IO, WasmYAML::SymbolKind &Kind) { 544#define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_SYMBOL_TYPE_##X); 545 ECase(FUNCTION); 546 ECase(DATA); 547 ECase(GLOBAL); 548 ECase(SECTION); 549 ECase(EVENT); 550#undef ECase 551} 552 553void ScalarEnumerationTraits<WasmYAML::ValueType>::enumeration( 554 IO &IO, WasmYAML::ValueType &Type) { 555#define ECase(X) IO.enumCase(Type, #X, wasm::WASM_TYPE_##X); 556 ECase(I32); 557 ECase(I64); 558 ECase(F32); 559 ECase(F64); 560 ECase(V128); 561 ECase(FUNCREF); 562 ECase(FUNC); 563#undef ECase 564} 565 566void ScalarEnumerationTraits<WasmYAML::ExportKind>::enumeration( 567 IO &IO, WasmYAML::ExportKind &Kind) { 568#define ECase(X) IO.enumCase(Kind, #X, wasm::WASM_EXTERNAL_##X); 569 ECase(FUNCTION); 570 ECase(TABLE); 571 ECase(MEMORY); 572 ECase(GLOBAL); 573 ECase(EVENT); 574#undef ECase 575} 576 577void ScalarEnumerationTraits<WasmYAML::Opcode>::enumeration( 578 IO &IO, WasmYAML::Opcode &Code) { 579#define ECase(X) IO.enumCase(Code, #X, wasm::WASM_OPCODE_##X); 580 ECase(END); 581 ECase(I32_CONST); 582 ECase(I64_CONST); 583 ECase(F64_CONST); 584 ECase(F32_CONST); 585 ECase(GLOBAL_GET); 586#undef ECase 587} 588 589void ScalarEnumerationTraits<WasmYAML::TableType>::enumeration( 590 IO &IO, WasmYAML::TableType &Type) { 591#define ECase(X) IO.enumCase(Type, #X, wasm::WASM_TYPE_##X); 592 ECase(FUNCREF); 593#undef ECase 594} 595 596void ScalarEnumerationTraits<WasmYAML::RelocType>::enumeration( 597 IO &IO, WasmYAML::RelocType &Type) { 598#define WASM_RELOC(name, value) IO.enumCase(Type, #name, wasm::name); 599#include "llvm/BinaryFormat/WasmRelocs.def" 600#undef WASM_RELOC 601} 602 603} // end namespace yaml 604 605} // end namespace llvm 606