10b57cec5SDimitry Andric //===- WasmYAML.h - Wasm YAMLIO implementation ------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric /// 90b57cec5SDimitry Andric /// \file 100b57cec5SDimitry Andric /// This file declares classes for handling the YAML representation 110b57cec5SDimitry Andric /// of wasm binaries. 120b57cec5SDimitry Andric /// 130b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric #ifndef LLVM_OBJECTYAML_WASMYAML_H 160b57cec5SDimitry Andric #define LLVM_OBJECTYAML_WASMYAML_H 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 190b57cec5SDimitry Andric #include "llvm/BinaryFormat/Wasm.h" 200b57cec5SDimitry Andric #include "llvm/ObjectYAML/YAML.h" 210b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 220b57cec5SDimitry Andric #include <cstdint> 230b57cec5SDimitry Andric #include <memory> 240b57cec5SDimitry Andric #include <vector> 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric namespace llvm { 270b57cec5SDimitry Andric namespace WasmYAML { 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, SectionType) 300b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, ValueType) 310b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, TableType) 320b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, SignatureForm) 330b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, ExportKind) 340b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, Opcode) 350b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, RelocType) 360b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolFlags) 370b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolKind) 380b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, SegmentFlags) 390b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, LimitFlags) 400b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, ComdatKind) 410b57cec5SDimitry Andric LLVM_YAML_STRONG_TYPEDEF(uint32_t, FeaturePolicyPrefix) 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric struct FileHeader { 440b57cec5SDimitry Andric yaml::Hex32 Version; 450b57cec5SDimitry Andric }; 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric struct Limits { 480b57cec5SDimitry Andric LimitFlags Flags; 490b57cec5SDimitry Andric yaml::Hex32 Initial; 500b57cec5SDimitry Andric yaml::Hex32 Maximum; 510b57cec5SDimitry Andric }; 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric struct Table { 540b57cec5SDimitry Andric TableType ElemType; 550b57cec5SDimitry Andric Limits TableLimits; 56*e8d8bef9SDimitry Andric uint32_t Index; 570b57cec5SDimitry Andric }; 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric struct Export { 600b57cec5SDimitry Andric StringRef Name; 610b57cec5SDimitry Andric ExportKind Kind; 620b57cec5SDimitry Andric uint32_t Index; 630b57cec5SDimitry Andric }; 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric struct ElemSegment { 660b57cec5SDimitry Andric uint32_t TableIndex; 670b57cec5SDimitry Andric wasm::WasmInitExpr Offset; 680b57cec5SDimitry Andric std::vector<uint32_t> Functions; 690b57cec5SDimitry Andric }; 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric struct Global { 720b57cec5SDimitry Andric uint32_t Index; 730b57cec5SDimitry Andric ValueType Type; 740b57cec5SDimitry Andric bool Mutable; 750b57cec5SDimitry Andric wasm::WasmInitExpr InitExpr; 760b57cec5SDimitry Andric }; 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric struct Event { 790b57cec5SDimitry Andric uint32_t Index; 800b57cec5SDimitry Andric uint32_t Attribute; 810b57cec5SDimitry Andric uint32_t SigIndex; 820b57cec5SDimitry Andric }; 830b57cec5SDimitry Andric 840b57cec5SDimitry Andric struct Import { 850b57cec5SDimitry Andric StringRef Module; 860b57cec5SDimitry Andric StringRef Field; 870b57cec5SDimitry Andric ExportKind Kind; 880b57cec5SDimitry Andric union { 890b57cec5SDimitry Andric uint32_t SigIndex; 900b57cec5SDimitry Andric Global GlobalImport; 910b57cec5SDimitry Andric Table TableImport; 920b57cec5SDimitry Andric Limits Memory; 930b57cec5SDimitry Andric Event EventImport; 940b57cec5SDimitry Andric }; 950b57cec5SDimitry Andric }; 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric struct LocalDecl { 980b57cec5SDimitry Andric ValueType Type; 990b57cec5SDimitry Andric uint32_t Count; 1000b57cec5SDimitry Andric }; 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric struct Function { 1030b57cec5SDimitry Andric uint32_t Index; 1040b57cec5SDimitry Andric std::vector<LocalDecl> Locals; 1050b57cec5SDimitry Andric yaml::BinaryRef Body; 1060b57cec5SDimitry Andric }; 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric struct Relocation { 1090b57cec5SDimitry Andric RelocType Type; 1100b57cec5SDimitry Andric uint32_t Index; 1115ffd83dbSDimitry Andric // TODO(wvo): this would strictly be better as Hex64, but that will change 1125ffd83dbSDimitry Andric // all existing obj2yaml output. 1130b57cec5SDimitry Andric yaml::Hex32 Offset; 1145ffd83dbSDimitry Andric int64_t Addend; 1150b57cec5SDimitry Andric }; 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andric struct DataSegment { 1180b57cec5SDimitry Andric uint32_t SectionOffset; 1190b57cec5SDimitry Andric uint32_t InitFlags; 1200b57cec5SDimitry Andric uint32_t MemoryIndex; 1210b57cec5SDimitry Andric wasm::WasmInitExpr Offset; 1220b57cec5SDimitry Andric yaml::BinaryRef Content; 1230b57cec5SDimitry Andric }; 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric struct NameEntry { 1260b57cec5SDimitry Andric uint32_t Index; 1270b57cec5SDimitry Andric StringRef Name; 1280b57cec5SDimitry Andric }; 1290b57cec5SDimitry Andric 1300b57cec5SDimitry Andric struct ProducerEntry { 1310b57cec5SDimitry Andric std::string Name; 1320b57cec5SDimitry Andric std::string Version; 1330b57cec5SDimitry Andric }; 1340b57cec5SDimitry Andric 1350b57cec5SDimitry Andric struct FeatureEntry { 1360b57cec5SDimitry Andric FeaturePolicyPrefix Prefix; 1370b57cec5SDimitry Andric std::string Name; 1380b57cec5SDimitry Andric }; 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andric struct SegmentInfo { 1410b57cec5SDimitry Andric uint32_t Index; 1420b57cec5SDimitry Andric StringRef Name; 1430b57cec5SDimitry Andric uint32_t Alignment; 1440b57cec5SDimitry Andric SegmentFlags Flags; 1450b57cec5SDimitry Andric }; 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andric struct Signature { 1480b57cec5SDimitry Andric uint32_t Index; 1490b57cec5SDimitry Andric SignatureForm Form = wasm::WASM_TYPE_FUNC; 1500b57cec5SDimitry Andric std::vector<ValueType> ParamTypes; 1518bcb0991SDimitry Andric std::vector<ValueType> ReturnTypes; 1520b57cec5SDimitry Andric }; 1530b57cec5SDimitry Andric 1540b57cec5SDimitry Andric struct SymbolInfo { 1550b57cec5SDimitry Andric uint32_t Index; 1560b57cec5SDimitry Andric StringRef Name; 1570b57cec5SDimitry Andric SymbolKind Kind; 1580b57cec5SDimitry Andric SymbolFlags Flags; 1590b57cec5SDimitry Andric union { 1600b57cec5SDimitry Andric uint32_t ElementIndex; 1610b57cec5SDimitry Andric wasm::WasmDataReference DataRef; 1620b57cec5SDimitry Andric }; 1630b57cec5SDimitry Andric }; 1640b57cec5SDimitry Andric 1650b57cec5SDimitry Andric struct InitFunction { 1660b57cec5SDimitry Andric uint32_t Priority; 1670b57cec5SDimitry Andric uint32_t Symbol; 1680b57cec5SDimitry Andric }; 1690b57cec5SDimitry Andric 1700b57cec5SDimitry Andric struct ComdatEntry { 1710b57cec5SDimitry Andric ComdatKind Kind; 1720b57cec5SDimitry Andric uint32_t Index; 1730b57cec5SDimitry Andric }; 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric struct Comdat { 1760b57cec5SDimitry Andric StringRef Name; 1770b57cec5SDimitry Andric std::vector<ComdatEntry> Entries; 1780b57cec5SDimitry Andric }; 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andric struct Section { 1810b57cec5SDimitry Andric explicit Section(SectionType SecType) : Type(SecType) {} 1820b57cec5SDimitry Andric virtual ~Section(); 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andric SectionType Type; 1850b57cec5SDimitry Andric std::vector<Relocation> Relocations; 1860b57cec5SDimitry Andric }; 1870b57cec5SDimitry Andric 1880b57cec5SDimitry Andric struct CustomSection : Section { 1890b57cec5SDimitry Andric explicit CustomSection(StringRef Name) 1900b57cec5SDimitry Andric : Section(wasm::WASM_SEC_CUSTOM), Name(Name) {} 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andric static bool classof(const Section *S) { 1930b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_CUSTOM; 1940b57cec5SDimitry Andric } 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric StringRef Name; 1970b57cec5SDimitry Andric yaml::BinaryRef Payload; 1980b57cec5SDimitry Andric }; 1990b57cec5SDimitry Andric 2000b57cec5SDimitry Andric struct DylinkSection : CustomSection { 2010b57cec5SDimitry Andric DylinkSection() : CustomSection("dylink") {} 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andric static bool classof(const Section *S) { 2040b57cec5SDimitry Andric auto C = dyn_cast<CustomSection>(S); 2050b57cec5SDimitry Andric return C && C->Name == "dylink"; 2060b57cec5SDimitry Andric } 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andric uint32_t MemorySize; 2090b57cec5SDimitry Andric uint32_t MemoryAlignment; 2100b57cec5SDimitry Andric uint32_t TableSize; 2110b57cec5SDimitry Andric uint32_t TableAlignment; 2120b57cec5SDimitry Andric std::vector<StringRef> Needed; 2130b57cec5SDimitry Andric }; 2140b57cec5SDimitry Andric 2150b57cec5SDimitry Andric struct NameSection : CustomSection { 2160b57cec5SDimitry Andric NameSection() : CustomSection("name") {} 2170b57cec5SDimitry Andric 2180b57cec5SDimitry Andric static bool classof(const Section *S) { 2190b57cec5SDimitry Andric auto C = dyn_cast<CustomSection>(S); 2200b57cec5SDimitry Andric return C && C->Name == "name"; 2210b57cec5SDimitry Andric } 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andric std::vector<NameEntry> FunctionNames; 224*e8d8bef9SDimitry Andric std::vector<NameEntry> GlobalNames; 225*e8d8bef9SDimitry Andric std::vector<NameEntry> DataSegmentNames; 2260b57cec5SDimitry Andric }; 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric struct LinkingSection : CustomSection { 2290b57cec5SDimitry Andric LinkingSection() : CustomSection("linking") {} 2300b57cec5SDimitry Andric 2310b57cec5SDimitry Andric static bool classof(const Section *S) { 2320b57cec5SDimitry Andric auto C = dyn_cast<CustomSection>(S); 2330b57cec5SDimitry Andric return C && C->Name == "linking"; 2340b57cec5SDimitry Andric } 2350b57cec5SDimitry Andric 2360b57cec5SDimitry Andric uint32_t Version; 2370b57cec5SDimitry Andric std::vector<SymbolInfo> SymbolTable; 2380b57cec5SDimitry Andric std::vector<SegmentInfo> SegmentInfos; 2390b57cec5SDimitry Andric std::vector<InitFunction> InitFunctions; 2400b57cec5SDimitry Andric std::vector<Comdat> Comdats; 2410b57cec5SDimitry Andric }; 2420b57cec5SDimitry Andric 2430b57cec5SDimitry Andric struct ProducersSection : CustomSection { 2440b57cec5SDimitry Andric ProducersSection() : CustomSection("producers") {} 2450b57cec5SDimitry Andric 2460b57cec5SDimitry Andric static bool classof(const Section *S) { 2470b57cec5SDimitry Andric auto C = dyn_cast<CustomSection>(S); 2480b57cec5SDimitry Andric return C && C->Name == "producers"; 2490b57cec5SDimitry Andric } 2500b57cec5SDimitry Andric 2510b57cec5SDimitry Andric std::vector<ProducerEntry> Languages; 2520b57cec5SDimitry Andric std::vector<ProducerEntry> Tools; 2530b57cec5SDimitry Andric std::vector<ProducerEntry> SDKs; 2540b57cec5SDimitry Andric }; 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric struct TargetFeaturesSection : CustomSection { 2570b57cec5SDimitry Andric TargetFeaturesSection() : CustomSection("target_features") {} 2580b57cec5SDimitry Andric 2590b57cec5SDimitry Andric static bool classof(const Section *S) { 2600b57cec5SDimitry Andric auto C = dyn_cast<CustomSection>(S); 2610b57cec5SDimitry Andric return C && C->Name == "target_features"; 2620b57cec5SDimitry Andric } 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andric std::vector<FeatureEntry> Features; 2650b57cec5SDimitry Andric }; 2660b57cec5SDimitry Andric 2670b57cec5SDimitry Andric struct TypeSection : Section { 2680b57cec5SDimitry Andric TypeSection() : Section(wasm::WASM_SEC_TYPE) {} 2690b57cec5SDimitry Andric 2700b57cec5SDimitry Andric static bool classof(const Section *S) { 2710b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_TYPE; 2720b57cec5SDimitry Andric } 2730b57cec5SDimitry Andric 2740b57cec5SDimitry Andric std::vector<Signature> Signatures; 2750b57cec5SDimitry Andric }; 2760b57cec5SDimitry Andric 2770b57cec5SDimitry Andric struct ImportSection : Section { 2780b57cec5SDimitry Andric ImportSection() : Section(wasm::WASM_SEC_IMPORT) {} 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andric static bool classof(const Section *S) { 2810b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_IMPORT; 2820b57cec5SDimitry Andric } 2830b57cec5SDimitry Andric 2840b57cec5SDimitry Andric std::vector<Import> Imports; 2850b57cec5SDimitry Andric }; 2860b57cec5SDimitry Andric 2870b57cec5SDimitry Andric struct FunctionSection : Section { 2880b57cec5SDimitry Andric FunctionSection() : Section(wasm::WASM_SEC_FUNCTION) {} 2890b57cec5SDimitry Andric 2900b57cec5SDimitry Andric static bool classof(const Section *S) { 2910b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_FUNCTION; 2920b57cec5SDimitry Andric } 2930b57cec5SDimitry Andric 2940b57cec5SDimitry Andric std::vector<uint32_t> FunctionTypes; 2950b57cec5SDimitry Andric }; 2960b57cec5SDimitry Andric 2970b57cec5SDimitry Andric struct TableSection : Section { 2980b57cec5SDimitry Andric TableSection() : Section(wasm::WASM_SEC_TABLE) {} 2990b57cec5SDimitry Andric 3000b57cec5SDimitry Andric static bool classof(const Section *S) { 3010b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_TABLE; 3020b57cec5SDimitry Andric } 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andric std::vector<Table> Tables; 3050b57cec5SDimitry Andric }; 3060b57cec5SDimitry Andric 3070b57cec5SDimitry Andric struct MemorySection : Section { 3080b57cec5SDimitry Andric MemorySection() : Section(wasm::WASM_SEC_MEMORY) {} 3090b57cec5SDimitry Andric 3100b57cec5SDimitry Andric static bool classof(const Section *S) { 3110b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_MEMORY; 3120b57cec5SDimitry Andric } 3130b57cec5SDimitry Andric 3140b57cec5SDimitry Andric std::vector<Limits> Memories; 3150b57cec5SDimitry Andric }; 3160b57cec5SDimitry Andric 3170b57cec5SDimitry Andric struct EventSection : Section { 3180b57cec5SDimitry Andric EventSection() : Section(wasm::WASM_SEC_EVENT) {} 3190b57cec5SDimitry Andric 3200b57cec5SDimitry Andric static bool classof(const Section *S) { 3210b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_EVENT; 3220b57cec5SDimitry Andric } 3230b57cec5SDimitry Andric 3240b57cec5SDimitry Andric std::vector<Event> Events; 3250b57cec5SDimitry Andric }; 3260b57cec5SDimitry Andric 3275ffd83dbSDimitry Andric struct GlobalSection : Section { 3285ffd83dbSDimitry Andric GlobalSection() : Section(wasm::WASM_SEC_GLOBAL) {} 3295ffd83dbSDimitry Andric 3305ffd83dbSDimitry Andric static bool classof(const Section *S) { 3315ffd83dbSDimitry Andric return S->Type == wasm::WASM_SEC_GLOBAL; 3325ffd83dbSDimitry Andric } 3335ffd83dbSDimitry Andric 3345ffd83dbSDimitry Andric std::vector<Global> Globals; 3355ffd83dbSDimitry Andric }; 3365ffd83dbSDimitry Andric 3370b57cec5SDimitry Andric struct ExportSection : Section { 3380b57cec5SDimitry Andric ExportSection() : Section(wasm::WASM_SEC_EXPORT) {} 3390b57cec5SDimitry Andric 3400b57cec5SDimitry Andric static bool classof(const Section *S) { 3410b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_EXPORT; 3420b57cec5SDimitry Andric } 3430b57cec5SDimitry Andric 3440b57cec5SDimitry Andric std::vector<Export> Exports; 3450b57cec5SDimitry Andric }; 3460b57cec5SDimitry Andric 3470b57cec5SDimitry Andric struct StartSection : Section { 3480b57cec5SDimitry Andric StartSection() : Section(wasm::WASM_SEC_START) {} 3490b57cec5SDimitry Andric 3500b57cec5SDimitry Andric static bool classof(const Section *S) { 3510b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_START; 3520b57cec5SDimitry Andric } 3530b57cec5SDimitry Andric 3540b57cec5SDimitry Andric uint32_t StartFunction; 3550b57cec5SDimitry Andric }; 3560b57cec5SDimitry Andric 3570b57cec5SDimitry Andric struct ElemSection : Section { 3580b57cec5SDimitry Andric ElemSection() : Section(wasm::WASM_SEC_ELEM) {} 3590b57cec5SDimitry Andric 3600b57cec5SDimitry Andric static bool classof(const Section *S) { 3610b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_ELEM; 3620b57cec5SDimitry Andric } 3630b57cec5SDimitry Andric 3640b57cec5SDimitry Andric std::vector<ElemSegment> Segments; 3650b57cec5SDimitry Andric }; 3660b57cec5SDimitry Andric 3670b57cec5SDimitry Andric struct CodeSection : Section { 3680b57cec5SDimitry Andric CodeSection() : Section(wasm::WASM_SEC_CODE) {} 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric static bool classof(const Section *S) { 3710b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_CODE; 3720b57cec5SDimitry Andric } 3730b57cec5SDimitry Andric 3740b57cec5SDimitry Andric std::vector<Function> Functions; 3750b57cec5SDimitry Andric }; 3760b57cec5SDimitry Andric 3770b57cec5SDimitry Andric struct DataSection : Section { 3780b57cec5SDimitry Andric DataSection() : Section(wasm::WASM_SEC_DATA) {} 3790b57cec5SDimitry Andric 3800b57cec5SDimitry Andric static bool classof(const Section *S) { 3810b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_DATA; 3820b57cec5SDimitry Andric } 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andric std::vector<DataSegment> Segments; 3850b57cec5SDimitry Andric }; 3860b57cec5SDimitry Andric 3870b57cec5SDimitry Andric struct DataCountSection : Section { 3880b57cec5SDimitry Andric DataCountSection() : Section(wasm::WASM_SEC_DATACOUNT) {} 3890b57cec5SDimitry Andric 3900b57cec5SDimitry Andric static bool classof(const Section *S) { 3910b57cec5SDimitry Andric return S->Type == wasm::WASM_SEC_DATACOUNT; 3920b57cec5SDimitry Andric } 3930b57cec5SDimitry Andric 3940b57cec5SDimitry Andric uint32_t Count; 3950b57cec5SDimitry Andric }; 3960b57cec5SDimitry Andric 3970b57cec5SDimitry Andric struct Object { 3980b57cec5SDimitry Andric FileHeader Header; 3990b57cec5SDimitry Andric std::vector<std::unique_ptr<Section>> Sections; 4000b57cec5SDimitry Andric }; 4010b57cec5SDimitry Andric 4020b57cec5SDimitry Andric } // end namespace WasmYAML 4030b57cec5SDimitry Andric } // end namespace llvm 4040b57cec5SDimitry Andric 4050b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<llvm::WasmYAML::Section>) 4060b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Signature) 4070b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ValueType) 4080b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Table) 4090b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Import) 4100b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Export) 4110b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ElemSegment) 4120b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Limits) 4130b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::DataSegment) 4140b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Global) 4150b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Function) 4160b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::LocalDecl) 4170b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Relocation) 4180b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::NameEntry) 4190b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ProducerEntry) 4200b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::FeatureEntry) 4210b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SegmentInfo) 4220b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SymbolInfo) 4230b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::InitFunction) 4240b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ComdatEntry) 4250b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Comdat) 4260b57cec5SDimitry Andric LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Event) 4270b57cec5SDimitry Andric 4280b57cec5SDimitry Andric namespace llvm { 4290b57cec5SDimitry Andric namespace yaml { 4300b57cec5SDimitry Andric 4310b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::FileHeader> { 4320b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::FileHeader &FileHdr); 4330b57cec5SDimitry Andric }; 4340b57cec5SDimitry Andric 4350b57cec5SDimitry Andric template <> struct MappingTraits<std::unique_ptr<WasmYAML::Section>> { 4360b57cec5SDimitry Andric static void mapping(IO &IO, std::unique_ptr<WasmYAML::Section> &Section); 4370b57cec5SDimitry Andric }; 4380b57cec5SDimitry Andric 4390b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Object> { 4400b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Object &Object); 4410b57cec5SDimitry Andric }; 4420b57cec5SDimitry Andric 4430b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Import> { 4440b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Import &Import); 4450b57cec5SDimitry Andric }; 4460b57cec5SDimitry Andric 4470b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Export> { 4480b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Export &Export); 4490b57cec5SDimitry Andric }; 4500b57cec5SDimitry Andric 4510b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Global> { 4520b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Global &Global); 4530b57cec5SDimitry Andric }; 4540b57cec5SDimitry Andric 4550b57cec5SDimitry Andric template <> struct ScalarBitSetTraits<WasmYAML::LimitFlags> { 4560b57cec5SDimitry Andric static void bitset(IO &IO, WasmYAML::LimitFlags &Value); 4570b57cec5SDimitry Andric }; 4580b57cec5SDimitry Andric 4590b57cec5SDimitry Andric template <> struct ScalarBitSetTraits<WasmYAML::SymbolFlags> { 4600b57cec5SDimitry Andric static void bitset(IO &IO, WasmYAML::SymbolFlags &Value); 4610b57cec5SDimitry Andric }; 4620b57cec5SDimitry Andric 4630b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::SymbolKind> { 4640b57cec5SDimitry Andric static void enumeration(IO &IO, WasmYAML::SymbolKind &Kind); 4650b57cec5SDimitry Andric }; 4660b57cec5SDimitry Andric 4670b57cec5SDimitry Andric template <> struct ScalarBitSetTraits<WasmYAML::SegmentFlags> { 4680b57cec5SDimitry Andric static void bitset(IO &IO, WasmYAML::SegmentFlags &Value); 4690b57cec5SDimitry Andric }; 4700b57cec5SDimitry Andric 4710b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::SectionType> { 4720b57cec5SDimitry Andric static void enumeration(IO &IO, WasmYAML::SectionType &Type); 4730b57cec5SDimitry Andric }; 4740b57cec5SDimitry Andric 4750b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Signature> { 4760b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Signature &Signature); 4770b57cec5SDimitry Andric }; 4780b57cec5SDimitry Andric 4790b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Table> { 4800b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Table &Table); 4810b57cec5SDimitry Andric }; 4820b57cec5SDimitry Andric 4830b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Limits> { 4840b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Limits &Limits); 4850b57cec5SDimitry Andric }; 4860b57cec5SDimitry Andric 4870b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Function> { 4880b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Function &Function); 4890b57cec5SDimitry Andric }; 4900b57cec5SDimitry Andric 4910b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Relocation> { 4920b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Relocation &Relocation); 4930b57cec5SDimitry Andric }; 4940b57cec5SDimitry Andric 4950b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::NameEntry> { 4960b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::NameEntry &NameEntry); 4970b57cec5SDimitry Andric }; 4980b57cec5SDimitry Andric 4990b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::ProducerEntry> { 5000b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::ProducerEntry &ProducerEntry); 5010b57cec5SDimitry Andric }; 5020b57cec5SDimitry Andric 5030b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::FeaturePolicyPrefix> { 5040b57cec5SDimitry Andric static void enumeration(IO &IO, WasmYAML::FeaturePolicyPrefix &Prefix); 5050b57cec5SDimitry Andric }; 5060b57cec5SDimitry Andric 5070b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::FeatureEntry> { 5080b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::FeatureEntry &FeatureEntry); 5090b57cec5SDimitry Andric }; 5100b57cec5SDimitry Andric 5110b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::SegmentInfo> { 5120b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::SegmentInfo &SegmentInfo); 5130b57cec5SDimitry Andric }; 5140b57cec5SDimitry Andric 5150b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::LocalDecl> { 5160b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::LocalDecl &LocalDecl); 5170b57cec5SDimitry Andric }; 5180b57cec5SDimitry Andric 5190b57cec5SDimitry Andric template <> struct MappingTraits<wasm::WasmInitExpr> { 5200b57cec5SDimitry Andric static void mapping(IO &IO, wasm::WasmInitExpr &Expr); 5210b57cec5SDimitry Andric }; 5220b57cec5SDimitry Andric 5230b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::DataSegment> { 5240b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::DataSegment &Segment); 5250b57cec5SDimitry Andric }; 5260b57cec5SDimitry Andric 5270b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::ElemSegment> { 5280b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::ElemSegment &Segment); 5290b57cec5SDimitry Andric }; 5300b57cec5SDimitry Andric 5310b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::SymbolInfo> { 5320b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::SymbolInfo &Info); 5330b57cec5SDimitry Andric }; 5340b57cec5SDimitry Andric 5350b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::InitFunction> { 5360b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::InitFunction &Init); 5370b57cec5SDimitry Andric }; 5380b57cec5SDimitry Andric 5390b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::ComdatKind> { 5400b57cec5SDimitry Andric static void enumeration(IO &IO, WasmYAML::ComdatKind &Kind); 5410b57cec5SDimitry Andric }; 5420b57cec5SDimitry Andric 5430b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::ComdatEntry> { 5440b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::ComdatEntry &ComdatEntry); 5450b57cec5SDimitry Andric }; 5460b57cec5SDimitry Andric 5470b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Comdat> { 5480b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Comdat &Comdat); 5490b57cec5SDimitry Andric }; 5500b57cec5SDimitry Andric 5510b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::ValueType> { 5520b57cec5SDimitry Andric static void enumeration(IO &IO, WasmYAML::ValueType &Type); 5530b57cec5SDimitry Andric }; 5540b57cec5SDimitry Andric 5550b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::ExportKind> { 5560b57cec5SDimitry Andric static void enumeration(IO &IO, WasmYAML::ExportKind &Kind); 5570b57cec5SDimitry Andric }; 5580b57cec5SDimitry Andric 5590b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::TableType> { 5600b57cec5SDimitry Andric static void enumeration(IO &IO, WasmYAML::TableType &Type); 5610b57cec5SDimitry Andric }; 5620b57cec5SDimitry Andric 5630b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::Opcode> { 5640b57cec5SDimitry Andric static void enumeration(IO &IO, WasmYAML::Opcode &Opcode); 5650b57cec5SDimitry Andric }; 5660b57cec5SDimitry Andric 5670b57cec5SDimitry Andric template <> struct ScalarEnumerationTraits<WasmYAML::RelocType> { 5680b57cec5SDimitry Andric static void enumeration(IO &IO, WasmYAML::RelocType &Kind); 5690b57cec5SDimitry Andric }; 5700b57cec5SDimitry Andric 5710b57cec5SDimitry Andric template <> struct MappingTraits<WasmYAML::Event> { 5720b57cec5SDimitry Andric static void mapping(IO &IO, WasmYAML::Event &Event); 5730b57cec5SDimitry Andric }; 5740b57cec5SDimitry Andric 5750b57cec5SDimitry Andric } // end namespace yaml 5760b57cec5SDimitry Andric } // end namespace llvm 5770b57cec5SDimitry Andric 5780b57cec5SDimitry Andric #endif // LLVM_OBJECTYAML_WASMYAML_H 579