- //===- WasmYAML.h - Wasm YAMLIO implementation ------------------*- C++ -*-===// 
- // 
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 
- // See https://llvm.org/LICENSE.txt for license information. 
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 
- // 
- //===----------------------------------------------------------------------===// 
- /// 
- /// \file 
- /// This file declares classes for handling the YAML representation 
- /// of wasm binaries. 
- /// 
- //===----------------------------------------------------------------------===// 
-   
- #ifndef LLVM_OBJECTYAML_WASMYAML_H 
- #define LLVM_OBJECTYAML_WASMYAML_H 
-   
- #include "llvm/ADT/StringRef.h" 
- #include "llvm/BinaryFormat/Wasm.h" 
- #include "llvm/ObjectYAML/YAML.h" 
- #include "llvm/Support/Casting.h" 
- #include <cstdint> 
- #include <memory> 
- #include <vector> 
-   
- namespace llvm { 
- namespace WasmYAML { 
-   
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, SectionType) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, ValueType) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, TableType) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, SignatureForm) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, ExportKind) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, Opcode) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, RelocType) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolFlags) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolKind) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, SegmentFlags) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, LimitFlags) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, ComdatKind) 
- LLVM_YAML_STRONG_TYPEDEF(uint32_t, FeaturePolicyPrefix) 
-   
- struct FileHeader { 
-   yaml::Hex32 Version; 
- }; 
-   
- struct Limits { 
-   LimitFlags Flags; 
-   yaml::Hex32 Minimum; 
-   yaml::Hex32 Maximum; 
- }; 
-   
- struct Table { 
-   TableType ElemType; 
-   Limits TableLimits; 
-   uint32_t Index; 
- }; 
-   
- struct Export { 
-   StringRef Name; 
-   ExportKind Kind; 
-   uint32_t Index; 
- }; 
-   
- struct InitExpr { 
-   InitExpr() {} 
-   bool Extended; 
-   union { 
-     wasm::WasmInitExprMVP Inst; 
-     yaml::BinaryRef Body; 
-   }; 
- }; 
-   
- struct ElemSegment { 
-   uint32_t Flags; 
-   uint32_t TableNumber; 
-   ValueType ElemKind; 
-   InitExpr Offset; 
-   std::vector<uint32_t> Functions; 
- }; 
-   
- struct Global { 
-   uint32_t Index; 
-   ValueType Type; 
-   bool Mutable; 
-   InitExpr Init; 
- }; 
-   
- struct Import { 
-   Import() {} 
-   StringRef Module; 
-   StringRef Field; 
-   ExportKind Kind; 
-   union { 
-     uint32_t SigIndex; 
-     Table TableImport; 
-     Limits Memory; 
-     uint32_t TagIndex; 
-     Global GlobalImport; 
-   }; 
- }; 
-   
- struct LocalDecl { 
-   ValueType Type; 
-   uint32_t Count; 
- }; 
-   
- struct Function { 
-   uint32_t Index; 
-   std::vector<LocalDecl> Locals; 
-   yaml::BinaryRef Body; 
- }; 
-   
- struct Relocation { 
-   RelocType Type; 
-   uint32_t Index; 
-   // TODO(wvo): this would strictly be better as Hex64, but that will change 
-   // all existing obj2yaml output. 
-   yaml::Hex32 Offset; 
-   int64_t Addend; 
- }; 
-   
- struct DataSegment { 
-   uint32_t SectionOffset; 
-   uint32_t InitFlags; 
-   uint32_t MemoryIndex; 
-   InitExpr Offset; 
-   yaml::BinaryRef Content; 
- }; 
-   
- struct NameEntry { 
-   uint32_t Index; 
-   StringRef Name; 
- }; 
-   
- struct ProducerEntry { 
-   std::string Name; 
-   std::string Version; 
- }; 
-   
- struct FeatureEntry { 
-   FeaturePolicyPrefix Prefix; 
-   std::string Name; 
- }; 
-   
- struct SegmentInfo { 
-   uint32_t Index; 
-   StringRef Name; 
-   uint32_t Alignment; 
-   SegmentFlags Flags; 
- }; 
-   
- struct Signature { 
-   uint32_t Index; 
-   SignatureForm Form = wasm::WASM_TYPE_FUNC; 
-   std::vector<ValueType> ParamTypes; 
-   std::vector<ValueType> ReturnTypes; 
- }; 
-   
- struct SymbolInfo { 
-   uint32_t Index; 
-   StringRef Name; 
-   SymbolKind Kind; 
-   SymbolFlags Flags; 
-   union { 
-     uint32_t ElementIndex; 
-     wasm::WasmDataReference DataRef; 
-   }; 
- }; 
-   
- struct InitFunction { 
-   uint32_t Priority; 
-   uint32_t Symbol; 
- }; 
-   
- struct ComdatEntry { 
-   ComdatKind Kind; 
-   uint32_t Index; 
- }; 
-   
- struct Comdat { 
-   StringRef Name; 
-   std::vector<ComdatEntry> Entries; 
- }; 
-   
- struct Section { 
-   explicit Section(SectionType SecType) : Type(SecType) {} 
-   virtual ~Section(); 
-   
-   SectionType Type; 
-   std::vector<Relocation> Relocations; 
- }; 
-   
- struct CustomSection : Section { 
-   explicit CustomSection(StringRef Name) 
-       : Section(wasm::WASM_SEC_CUSTOM), Name(Name) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_CUSTOM; 
-   } 
-   
-   StringRef Name; 
-   yaml::BinaryRef Payload; 
- }; 
-   
- struct DylinkImportInfo { 
-   StringRef Module; 
-   StringRef Field; 
-   SymbolFlags Flags; 
- }; 
-   
- struct DylinkExportInfo { 
-   StringRef Name; 
-   SymbolFlags Flags; 
- }; 
-   
- struct DylinkSection : CustomSection { 
-   DylinkSection() : CustomSection("dylink.0") {} 
-   
-   static bool classof(const Section *S) { 
-     auto C = dyn_cast<CustomSection>(S); 
-     return C && C->Name == "dylink.0"; 
-   } 
-   
-   uint32_t MemorySize; 
-   uint32_t MemoryAlignment; 
-   uint32_t TableSize; 
-   uint32_t TableAlignment; 
-   std::vector<StringRef> Needed; 
-   std::vector<DylinkImportInfo> ImportInfo; 
-   std::vector<DylinkExportInfo> ExportInfo; 
- }; 
-   
- struct NameSection : CustomSection { 
-   NameSection() : CustomSection("name") {} 
-   
-   static bool classof(const Section *S) { 
-     auto C = dyn_cast<CustomSection>(S); 
-     return C && C->Name == "name"; 
-   } 
-   
-   std::vector<NameEntry> FunctionNames; 
-   std::vector<NameEntry> GlobalNames; 
-   std::vector<NameEntry> DataSegmentNames; 
- }; 
-   
- struct LinkingSection : CustomSection { 
-   LinkingSection() : CustomSection("linking") {} 
-   
-   static bool classof(const Section *S) { 
-     auto C = dyn_cast<CustomSection>(S); 
-     return C && C->Name == "linking"; 
-   } 
-   
-   uint32_t Version; 
-   std::vector<SymbolInfo> SymbolTable; 
-   std::vector<SegmentInfo> SegmentInfos; 
-   std::vector<InitFunction> InitFunctions; 
-   std::vector<Comdat> Comdats; 
- }; 
-   
- struct ProducersSection : CustomSection { 
-   ProducersSection() : CustomSection("producers") {} 
-   
-   static bool classof(const Section *S) { 
-     auto C = dyn_cast<CustomSection>(S); 
-     return C && C->Name == "producers"; 
-   } 
-   
-   std::vector<ProducerEntry> Languages; 
-   std::vector<ProducerEntry> Tools; 
-   std::vector<ProducerEntry> SDKs; 
- }; 
-   
- struct TargetFeaturesSection : CustomSection { 
-   TargetFeaturesSection() : CustomSection("target_features") {} 
-   
-   static bool classof(const Section *S) { 
-     auto C = dyn_cast<CustomSection>(S); 
-     return C && C->Name == "target_features"; 
-   } 
-   
-   std::vector<FeatureEntry> Features; 
- }; 
-   
- struct TypeSection : Section { 
-   TypeSection() : Section(wasm::WASM_SEC_TYPE) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_TYPE; 
-   } 
-   
-   std::vector<Signature> Signatures; 
- }; 
-   
- struct ImportSection : Section { 
-   ImportSection() : Section(wasm::WASM_SEC_IMPORT) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_IMPORT; 
-   } 
-   
-   std::vector<Import> Imports; 
- }; 
-   
- struct FunctionSection : Section { 
-   FunctionSection() : Section(wasm::WASM_SEC_FUNCTION) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_FUNCTION; 
-   } 
-   
-   std::vector<uint32_t> FunctionTypes; 
- }; 
-   
- struct TableSection : Section { 
-   TableSection() : Section(wasm::WASM_SEC_TABLE) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_TABLE; 
-   } 
-   
-   std::vector<Table> Tables; 
- }; 
-   
- struct MemorySection : Section { 
-   MemorySection() : Section(wasm::WASM_SEC_MEMORY) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_MEMORY; 
-   } 
-   
-   std::vector<Limits> Memories; 
- }; 
-   
- struct TagSection : Section { 
-   TagSection() : Section(wasm::WASM_SEC_TAG) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_TAG; 
-   } 
-   
-   std::vector<uint32_t> TagTypes; 
- }; 
-   
- struct GlobalSection : Section { 
-   GlobalSection() : Section(wasm::WASM_SEC_GLOBAL) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_GLOBAL; 
-   } 
-   
-   std::vector<Global> Globals; 
- }; 
-   
- struct ExportSection : Section { 
-   ExportSection() : Section(wasm::WASM_SEC_EXPORT) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_EXPORT; 
-   } 
-   
-   std::vector<Export> Exports; 
- }; 
-   
- struct StartSection : Section { 
-   StartSection() : Section(wasm::WASM_SEC_START) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_START; 
-   } 
-   
-   uint32_t StartFunction; 
- }; 
-   
- struct ElemSection : Section { 
-   ElemSection() : Section(wasm::WASM_SEC_ELEM) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_ELEM; 
-   } 
-   
-   std::vector<ElemSegment> Segments; 
- }; 
-   
- struct CodeSection : Section { 
-   CodeSection() : Section(wasm::WASM_SEC_CODE) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_CODE; 
-   } 
-   
-   std::vector<Function> Functions; 
- }; 
-   
- struct DataSection : Section { 
-   DataSection() : Section(wasm::WASM_SEC_DATA) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_DATA; 
-   } 
-   
-   std::vector<DataSegment> Segments; 
- }; 
-   
- struct DataCountSection : Section { 
-   DataCountSection() : Section(wasm::WASM_SEC_DATACOUNT) {} 
-   
-   static bool classof(const Section *S) { 
-     return S->Type == wasm::WASM_SEC_DATACOUNT; 
-   } 
-   
-   uint32_t Count; 
- }; 
-   
- struct Object { 
-   FileHeader Header; 
-   std::vector<std::unique_ptr<Section>> Sections; 
- }; 
-   
- } // end namespace WasmYAML 
- } // end namespace llvm 
-   
- LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<llvm::WasmYAML::Section>) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Signature) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ValueType) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Table) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Import) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Export) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ElemSegment) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Limits) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::DataSegment) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Global) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Function) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::LocalDecl) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Relocation) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::NameEntry) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ProducerEntry) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::FeatureEntry) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SegmentInfo) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SymbolInfo) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::InitFunction) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ComdatEntry) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Comdat) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::DylinkImportInfo) 
- LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::DylinkExportInfo) 
-   
- namespace llvm { 
- namespace yaml { 
-   
- template <> struct MappingTraits<WasmYAML::FileHeader> { 
-   static void mapping(IO &IO, WasmYAML::FileHeader &FileHdr); 
- }; 
-   
- template <> struct MappingTraits<std::unique_ptr<WasmYAML::Section>> { 
-   static void mapping(IO &IO, std::unique_ptr<WasmYAML::Section> &Section); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::Object> { 
-   static void mapping(IO &IO, WasmYAML::Object &Object); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::Import> { 
-   static void mapping(IO &IO, WasmYAML::Import &Import); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::Export> { 
-   static void mapping(IO &IO, WasmYAML::Export &Export); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::Global> { 
-   static void mapping(IO &IO, WasmYAML::Global &Global); 
- }; 
-   
- template <> struct ScalarBitSetTraits<WasmYAML::LimitFlags> { 
-   static void bitset(IO &IO, WasmYAML::LimitFlags &Value); 
- }; 
-   
- template <> struct ScalarBitSetTraits<WasmYAML::SymbolFlags> { 
-   static void bitset(IO &IO, WasmYAML::SymbolFlags &Value); 
- }; 
-   
- template <> struct ScalarEnumerationTraits<WasmYAML::SymbolKind> { 
-   static void enumeration(IO &IO, WasmYAML::SymbolKind &Kind); 
- }; 
-   
- template <> struct ScalarBitSetTraits<WasmYAML::SegmentFlags> { 
-   static void bitset(IO &IO, WasmYAML::SegmentFlags &Value); 
- }; 
-   
- template <> struct ScalarEnumerationTraits<WasmYAML::SectionType> { 
-   static void enumeration(IO &IO, WasmYAML::SectionType &Type); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::Signature> { 
-   static void mapping(IO &IO, WasmYAML::Signature &Signature); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::Table> { 
-   static void mapping(IO &IO, WasmYAML::Table &Table); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::Limits> { 
-   static void mapping(IO &IO, WasmYAML::Limits &Limits); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::Function> { 
-   static void mapping(IO &IO, WasmYAML::Function &Function); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::Relocation> { 
-   static void mapping(IO &IO, WasmYAML::Relocation &Relocation); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::NameEntry> { 
-   static void mapping(IO &IO, WasmYAML::NameEntry &NameEntry); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::ProducerEntry> { 
-   static void mapping(IO &IO, WasmYAML::ProducerEntry &ProducerEntry); 
- }; 
-   
- template <> struct ScalarEnumerationTraits<WasmYAML::FeaturePolicyPrefix> { 
-   static void enumeration(IO &IO, WasmYAML::FeaturePolicyPrefix &Prefix); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::FeatureEntry> { 
-   static void mapping(IO &IO, WasmYAML::FeatureEntry &FeatureEntry); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::SegmentInfo> { 
-   static void mapping(IO &IO, WasmYAML::SegmentInfo &SegmentInfo); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::LocalDecl> { 
-   static void mapping(IO &IO, WasmYAML::LocalDecl &LocalDecl); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::InitExpr> { 
-   static void mapping(IO &IO, WasmYAML::InitExpr &Expr); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::DataSegment> { 
-   static void mapping(IO &IO, WasmYAML::DataSegment &Segment); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::ElemSegment> { 
-   static void mapping(IO &IO, WasmYAML::ElemSegment &Segment); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::SymbolInfo> { 
-   static void mapping(IO &IO, WasmYAML::SymbolInfo &Info); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::InitFunction> { 
-   static void mapping(IO &IO, WasmYAML::InitFunction &Init); 
- }; 
-   
- template <> struct ScalarEnumerationTraits<WasmYAML::ComdatKind> { 
-   static void enumeration(IO &IO, WasmYAML::ComdatKind &Kind); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::ComdatEntry> { 
-   static void mapping(IO &IO, WasmYAML::ComdatEntry &ComdatEntry); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::Comdat> { 
-   static void mapping(IO &IO, WasmYAML::Comdat &Comdat); 
- }; 
-   
- template <> struct ScalarEnumerationTraits<WasmYAML::ValueType> { 
-   static void enumeration(IO &IO, WasmYAML::ValueType &Type); 
- }; 
-   
- template <> struct ScalarEnumerationTraits<WasmYAML::ExportKind> { 
-   static void enumeration(IO &IO, WasmYAML::ExportKind &Kind); 
- }; 
-   
- template <> struct ScalarEnumerationTraits<WasmYAML::TableType> { 
-   static void enumeration(IO &IO, WasmYAML::TableType &Type); 
- }; 
-   
- template <> struct ScalarEnumerationTraits<WasmYAML::Opcode> { 
-   static void enumeration(IO &IO, WasmYAML::Opcode &Opcode); 
- }; 
-   
- template <> struct ScalarEnumerationTraits<WasmYAML::RelocType> { 
-   static void enumeration(IO &IO, WasmYAML::RelocType &Kind); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::DylinkImportInfo> { 
-   static void mapping(IO &IO, WasmYAML::DylinkImportInfo &Info); 
- }; 
-   
- template <> struct MappingTraits<WasmYAML::DylinkExportInfo> { 
-   static void mapping(IO &IO, WasmYAML::DylinkExportInfo &Info); 
- }; 
-   
- } // end namespace yaml 
- } // end namespace llvm 
-   
- #endif // LLVM_OBJECTYAML_WASMYAML_H 
-