123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===- 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 ElemSegment {
- uint32_t Flags;
- uint32_t TableNumber;
- ValueType ElemKind;
- wasm::WasmInitExpr Offset;
- std::vector<uint32_t> Functions;
- };
- struct Global {
- uint32_t Index;
- ValueType Type;
- bool Mutable;
- wasm::WasmInitExpr InitExpr;
- };
- struct Import {
- StringRef Module;
- StringRef Field;
- ExportKind Kind;
- union {
- uint32_t SigIndex;
- Global GlobalImport;
- Table TableImport;
- Limits Memory;
- uint32_t TagIndex;
- };
- };
- 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;
- wasm::WasmInitExpr 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<wasm::WasmInitExpr> {
- static void mapping(IO &IO, wasm::WasmInitExpr &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
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|