1 //===- WasmYAML.h - Wasm YAMLIO implementation ------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// This file declares classes for handling the YAML representation
14 //===----------------------------------------------------------------------===//
16 #ifndef LLVM_OBJECTYAML_WASMYAML_H
17 #define LLVM_OBJECTYAML_WASMYAML_H
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/BinaryFormat/Wasm.h"
21 #include "llvm/ObjectYAML/YAML.h"
22 #include "llvm/Support/Casting.h"
30 LLVM_YAML_STRONG_TYPEDEF(uint32_t, SectionType)
31 LLVM_YAML_STRONG_TYPEDEF(uint32_t, ValueType)
32 LLVM_YAML_STRONG_TYPEDEF(uint32_t, TableType)
33 LLVM_YAML_STRONG_TYPEDEF(uint32_t, SignatureForm)
34 LLVM_YAML_STRONG_TYPEDEF(uint32_t, ExportKind)
35 LLVM_YAML_STRONG_TYPEDEF(uint32_t, Opcode)
36 LLVM_YAML_STRONG_TYPEDEF(uint32_t, RelocType)
37 LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolFlags)
38 LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolKind)
39 LLVM_YAML_STRONG_TYPEDEF(uint32_t, SegmentFlags)
40 LLVM_YAML_STRONG_TYPEDEF(uint32_t, LimitFlags)
41 LLVM_YAML_STRONG_TYPEDEF(uint32_t, ComdatKind)
66 wasm::WasmInitExpr Offset;
67 std::vector<uint32_t> Functions;
74 wasm::WasmInitExpr InitExpr;
103 std::vector<LocalDecl> Locals;
104 yaml::BinaryRef Body;
115 uint32_t MemoryIndex;
116 uint32_t SectionOffset;
117 wasm::WasmInitExpr Offset;
118 yaml::BinaryRef Content;
135 SignatureForm Form = wasm::WASM_TYPE_FUNC;
136 std::vector<ValueType> ParamTypes;
137 ValueType ReturnType;
146 uint32_t ElementIndex;
147 wasm::WasmDataReference DataRef;
151 struct InitFunction {
163 std::vector<ComdatEntry> Entries;
167 explicit Section(SectionType SecType) : Type(SecType) {}
171 std::vector<Relocation> Relocations;
174 struct CustomSection : Section {
175 explicit CustomSection(StringRef Name)
176 : Section(wasm::WASM_SEC_CUSTOM), Name(Name) {}
178 static bool classof(const Section *S) {
179 return S->Type == wasm::WASM_SEC_CUSTOM;
183 yaml::BinaryRef Payload;
186 struct DylinkSection : CustomSection {
187 DylinkSection() : CustomSection("dylink") {}
189 static bool classof(const Section *S) {
190 auto C = dyn_cast<CustomSection>(S);
191 return C && C->Name == "dylink";
195 uint32_t MemoryAlignment;
197 uint32_t TableAlignment;
198 std::vector<StringRef> Needed;
201 struct NameSection : CustomSection {
202 NameSection() : CustomSection("name") {}
204 static bool classof(const Section *S) {
205 auto C = dyn_cast<CustomSection>(S);
206 return C && C->Name == "name";
209 std::vector<NameEntry> FunctionNames;
212 struct LinkingSection : CustomSection {
213 LinkingSection() : CustomSection("linking") {}
215 static bool classof(const Section *S) {
216 auto C = dyn_cast<CustomSection>(S);
217 return C && C->Name == "linking";
221 std::vector<SymbolInfo> SymbolTable;
222 std::vector<SegmentInfo> SegmentInfos;
223 std::vector<InitFunction> InitFunctions;
224 std::vector<Comdat> Comdats;
227 struct TypeSection : Section {
228 TypeSection() : Section(wasm::WASM_SEC_TYPE) {}
230 static bool classof(const Section *S) {
231 return S->Type == wasm::WASM_SEC_TYPE;
234 std::vector<Signature> Signatures;
237 struct ImportSection : Section {
238 ImportSection() : Section(wasm::WASM_SEC_IMPORT) {}
240 static bool classof(const Section *S) {
241 return S->Type == wasm::WASM_SEC_IMPORT;
244 std::vector<Import> Imports;
247 struct FunctionSection : Section {
248 FunctionSection() : Section(wasm::WASM_SEC_FUNCTION) {}
250 static bool classof(const Section *S) {
251 return S->Type == wasm::WASM_SEC_FUNCTION;
254 std::vector<uint32_t> FunctionTypes;
257 struct TableSection : Section {
258 TableSection() : Section(wasm::WASM_SEC_TABLE) {}
260 static bool classof(const Section *S) {
261 return S->Type == wasm::WASM_SEC_TABLE;
264 std::vector<Table> Tables;
267 struct MemorySection : Section {
268 MemorySection() : Section(wasm::WASM_SEC_MEMORY) {}
270 static bool classof(const Section *S) {
271 return S->Type == wasm::WASM_SEC_MEMORY;
274 std::vector<Limits> Memories;
277 struct GlobalSection : Section {
278 GlobalSection() : Section(wasm::WASM_SEC_GLOBAL) {}
280 static bool classof(const Section *S) {
281 return S->Type == wasm::WASM_SEC_GLOBAL;
284 std::vector<Global> Globals;
287 struct EventSection : Section {
288 EventSection() : Section(wasm::WASM_SEC_EVENT) {}
290 static bool classof(const Section *S) {
291 return S->Type == wasm::WASM_SEC_EVENT;
294 std::vector<Event> Events;
297 struct ExportSection : Section {
298 ExportSection() : Section(wasm::WASM_SEC_EXPORT) {}
300 static bool classof(const Section *S) {
301 return S->Type == wasm::WASM_SEC_EXPORT;
304 std::vector<Export> Exports;
307 struct StartSection : Section {
308 StartSection() : Section(wasm::WASM_SEC_START) {}
310 static bool classof(const Section *S) {
311 return S->Type == wasm::WASM_SEC_START;
314 uint32_t StartFunction;
317 struct ElemSection : Section {
318 ElemSection() : Section(wasm::WASM_SEC_ELEM) {}
320 static bool classof(const Section *S) {
321 return S->Type == wasm::WASM_SEC_ELEM;
324 std::vector<ElemSegment> Segments;
327 struct CodeSection : Section {
328 CodeSection() : Section(wasm::WASM_SEC_CODE) {}
330 static bool classof(const Section *S) {
331 return S->Type == wasm::WASM_SEC_CODE;
334 std::vector<Function> Functions;
337 struct DataSection : Section {
338 DataSection() : Section(wasm::WASM_SEC_DATA) {}
340 static bool classof(const Section *S) {
341 return S->Type == wasm::WASM_SEC_DATA;
344 std::vector<DataSegment> Segments;
349 std::vector<std::unique_ptr<Section>> Sections;
352 } // end namespace WasmYAML
353 } // end namespace llvm
355 LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<llvm::WasmYAML::Section>)
356 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Signature)
357 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ValueType)
358 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Table)
359 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Import)
360 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Export)
361 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ElemSegment)
362 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Limits)
363 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::DataSegment)
364 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Global)
365 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Function)
366 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::LocalDecl)
367 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Relocation)
368 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::NameEntry)
369 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SegmentInfo)
370 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SymbolInfo)
371 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::InitFunction)
372 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ComdatEntry)
373 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Comdat)
374 LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Event)
379 template <> struct MappingTraits<WasmYAML::FileHeader> {
380 static void mapping(IO &IO, WasmYAML::FileHeader &FileHdr);
383 template <> struct MappingTraits<std::unique_ptr<WasmYAML::Section>> {
384 static void mapping(IO &IO, std::unique_ptr<WasmYAML::Section> &Section);
387 template <> struct MappingTraits<WasmYAML::Object> {
388 static void mapping(IO &IO, WasmYAML::Object &Object);
391 template <> struct MappingTraits<WasmYAML::Import> {
392 static void mapping(IO &IO, WasmYAML::Import &Import);
395 template <> struct MappingTraits<WasmYAML::Export> {
396 static void mapping(IO &IO, WasmYAML::Export &Export);
399 template <> struct MappingTraits<WasmYAML::Global> {
400 static void mapping(IO &IO, WasmYAML::Global &Global);
403 template <> struct ScalarBitSetTraits<WasmYAML::LimitFlags> {
404 static void bitset(IO &IO, WasmYAML::LimitFlags &Value);
407 template <> struct ScalarBitSetTraits<WasmYAML::SymbolFlags> {
408 static void bitset(IO &IO, WasmYAML::SymbolFlags &Value);
411 template <> struct ScalarEnumerationTraits<WasmYAML::SymbolKind> {
412 static void enumeration(IO &IO, WasmYAML::SymbolKind &Kind);
415 template <> struct ScalarBitSetTraits<WasmYAML::SegmentFlags> {
416 static void bitset(IO &IO, WasmYAML::SegmentFlags &Value);
419 template <> struct ScalarEnumerationTraits<WasmYAML::SectionType> {
420 static void enumeration(IO &IO, WasmYAML::SectionType &Type);
423 template <> struct MappingTraits<WasmYAML::Signature> {
424 static void mapping(IO &IO, WasmYAML::Signature &Signature);
427 template <> struct MappingTraits<WasmYAML::Table> {
428 static void mapping(IO &IO, WasmYAML::Table &Table);
431 template <> struct MappingTraits<WasmYAML::Limits> {
432 static void mapping(IO &IO, WasmYAML::Limits &Limits);
435 template <> struct MappingTraits<WasmYAML::Function> {
436 static void mapping(IO &IO, WasmYAML::Function &Function);
439 template <> struct MappingTraits<WasmYAML::Relocation> {
440 static void mapping(IO &IO, WasmYAML::Relocation &Relocation);
443 template <> struct MappingTraits<WasmYAML::NameEntry> {
444 static void mapping(IO &IO, WasmYAML::NameEntry &NameEntry);
447 template <> struct MappingTraits<WasmYAML::SegmentInfo> {
448 static void mapping(IO &IO, WasmYAML::SegmentInfo &SegmentInfo);
451 template <> struct MappingTraits<WasmYAML::LocalDecl> {
452 static void mapping(IO &IO, WasmYAML::LocalDecl &LocalDecl);
455 template <> struct MappingTraits<wasm::WasmInitExpr> {
456 static void mapping(IO &IO, wasm::WasmInitExpr &Expr);
459 template <> struct MappingTraits<WasmYAML::DataSegment> {
460 static void mapping(IO &IO, WasmYAML::DataSegment &Segment);
463 template <> struct MappingTraits<WasmYAML::ElemSegment> {
464 static void mapping(IO &IO, WasmYAML::ElemSegment &Segment);
467 template <> struct MappingTraits<WasmYAML::SymbolInfo> {
468 static void mapping(IO &IO, WasmYAML::SymbolInfo &Info);
471 template <> struct MappingTraits<WasmYAML::InitFunction> {
472 static void mapping(IO &IO, WasmYAML::InitFunction &Init);
475 template <> struct ScalarEnumerationTraits<WasmYAML::ComdatKind> {
476 static void enumeration(IO &IO, WasmYAML::ComdatKind &Kind);
479 template <> struct MappingTraits<WasmYAML::ComdatEntry> {
480 static void mapping(IO &IO, WasmYAML::ComdatEntry &ComdatEntry);
483 template <> struct MappingTraits<WasmYAML::Comdat> {
484 static void mapping(IO &IO, WasmYAML::Comdat &Comdat);
487 template <> struct ScalarEnumerationTraits<WasmYAML::ValueType> {
488 static void enumeration(IO &IO, WasmYAML::ValueType &Type);
491 template <> struct ScalarEnumerationTraits<WasmYAML::ExportKind> {
492 static void enumeration(IO &IO, WasmYAML::ExportKind &Kind);
495 template <> struct ScalarEnumerationTraits<WasmYAML::TableType> {
496 static void enumeration(IO &IO, WasmYAML::TableType &Type);
499 template <> struct ScalarEnumerationTraits<WasmYAML::Opcode> {
500 static void enumeration(IO &IO, WasmYAML::Opcode &Opcode);
503 template <> struct ScalarEnumerationTraits<WasmYAML::RelocType> {
504 static void enumeration(IO &IO, WasmYAML::RelocType &Kind);
507 template <> struct MappingTraits<WasmYAML::Event> {
508 static void mapping(IO &IO, WasmYAML::Event &Event);
511 } // end namespace yaml
512 } // end namespace llvm
514 #endif // LLVM_OBJECTYAML_WASMYAML_H