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