Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- WasmYAML.h - Wasm YAMLIO implementation ------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
///
9
/// \file
10
/// This file declares classes for handling the YAML representation
11
/// of wasm binaries.
12
///
13
//===----------------------------------------------------------------------===//
14
 
15
#ifndef LLVM_OBJECTYAML_WASMYAML_H
16
#define LLVM_OBJECTYAML_WASMYAML_H
17
 
18
#include "llvm/ADT/StringRef.h"
19
#include "llvm/BinaryFormat/Wasm.h"
20
#include "llvm/ObjectYAML/YAML.h"
21
#include "llvm/Support/Casting.h"
22
#include <cstdint>
23
#include <memory>
24
#include <vector>
25
 
26
namespace llvm {
27
namespace WasmYAML {
28
 
29
LLVM_YAML_STRONG_TYPEDEF(uint32_t, SectionType)
30
LLVM_YAML_STRONG_TYPEDEF(uint32_t, ValueType)
31
LLVM_YAML_STRONG_TYPEDEF(uint32_t, TableType)
32
LLVM_YAML_STRONG_TYPEDEF(uint32_t, SignatureForm)
33
LLVM_YAML_STRONG_TYPEDEF(uint32_t, ExportKind)
34
LLVM_YAML_STRONG_TYPEDEF(uint32_t, Opcode)
35
LLVM_YAML_STRONG_TYPEDEF(uint32_t, RelocType)
36
LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolFlags)
37
LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolKind)
38
LLVM_YAML_STRONG_TYPEDEF(uint32_t, SegmentFlags)
39
LLVM_YAML_STRONG_TYPEDEF(uint32_t, LimitFlags)
40
LLVM_YAML_STRONG_TYPEDEF(uint32_t, ComdatKind)
41
LLVM_YAML_STRONG_TYPEDEF(uint32_t, FeaturePolicyPrefix)
42
 
43
struct FileHeader {
44
  yaml::Hex32 Version;
45
};
46
 
47
struct Limits {
48
  LimitFlags Flags;
49
  yaml::Hex32 Minimum;
50
  yaml::Hex32 Maximum;
51
};
52
 
53
struct Table {
54
  TableType ElemType;
55
  Limits TableLimits;
56
  uint32_t Index;
57
};
58
 
59
struct Export {
60
  StringRef Name;
61
  ExportKind Kind;
62
  uint32_t Index;
63
};
64
 
65
struct InitExpr {
66
  InitExpr() {}
67
  bool Extended;
68
  union {
69
    wasm::WasmInitExprMVP Inst;
70
    yaml::BinaryRef Body;
71
  };
72
};
73
 
74
struct ElemSegment {
75
  uint32_t Flags;
76
  uint32_t TableNumber;
77
  ValueType ElemKind;
78
  InitExpr Offset;
79
  std::vector<uint32_t> Functions;
80
};
81
 
82
struct Global {
83
  uint32_t Index;
84
  ValueType Type;
85
  bool Mutable;
86
  InitExpr Init;
87
};
88
 
89
struct Import {
90
  Import() {}
91
  StringRef Module;
92
  StringRef Field;
93
  ExportKind Kind;
94
  union {
95
    uint32_t SigIndex;
96
    Table TableImport;
97
    Limits Memory;
98
    uint32_t TagIndex;
99
    Global GlobalImport;
100
  };
101
};
102
 
103
struct LocalDecl {
104
  ValueType Type;
105
  uint32_t Count;
106
};
107
 
108
struct Function {
109
  uint32_t Index;
110
  std::vector<LocalDecl> Locals;
111
  yaml::BinaryRef Body;
112
};
113
 
114
struct Relocation {
115
  RelocType Type;
116
  uint32_t Index;
117
  // TODO(wvo): this would strictly be better as Hex64, but that will change
118
  // all existing obj2yaml output.
119
  yaml::Hex32 Offset;
120
  int64_t Addend;
121
};
122
 
123
struct DataSegment {
124
  uint32_t SectionOffset;
125
  uint32_t InitFlags;
126
  uint32_t MemoryIndex;
127
  InitExpr Offset;
128
  yaml::BinaryRef Content;
129
};
130
 
131
struct NameEntry {
132
  uint32_t Index;
133
  StringRef Name;
134
};
135
 
136
struct ProducerEntry {
137
  std::string Name;
138
  std::string Version;
139
};
140
 
141
struct FeatureEntry {
142
  FeaturePolicyPrefix Prefix;
143
  std::string Name;
144
};
145
 
146
struct SegmentInfo {
147
  uint32_t Index;
148
  StringRef Name;
149
  uint32_t Alignment;
150
  SegmentFlags Flags;
151
};
152
 
153
struct Signature {
154
  uint32_t Index;
155
  SignatureForm Form = wasm::WASM_TYPE_FUNC;
156
  std::vector<ValueType> ParamTypes;
157
  std::vector<ValueType> ReturnTypes;
158
};
159
 
160
struct SymbolInfo {
161
  uint32_t Index;
162
  StringRef Name;
163
  SymbolKind Kind;
164
  SymbolFlags Flags;
165
  union {
166
    uint32_t ElementIndex;
167
    wasm::WasmDataReference DataRef;
168
  };
169
};
170
 
171
struct InitFunction {
172
  uint32_t Priority;
173
  uint32_t Symbol;
174
};
175
 
176
struct ComdatEntry {
177
  ComdatKind Kind;
178
  uint32_t Index;
179
};
180
 
181
struct Comdat {
182
  StringRef Name;
183
  std::vector<ComdatEntry> Entries;
184
};
185
 
186
struct Section {
187
  explicit Section(SectionType SecType) : Type(SecType) {}
188
  virtual ~Section();
189
 
190
  SectionType Type;
191
  std::vector<Relocation> Relocations;
192
};
193
 
194
struct CustomSection : Section {
195
  explicit CustomSection(StringRef Name)
196
      : Section(wasm::WASM_SEC_CUSTOM), Name(Name) {}
197
 
198
  static bool classof(const Section *S) {
199
    return S->Type == wasm::WASM_SEC_CUSTOM;
200
  }
201
 
202
  StringRef Name;
203
  yaml::BinaryRef Payload;
204
};
205
 
206
struct DylinkImportInfo {
207
  StringRef Module;
208
  StringRef Field;
209
  SymbolFlags Flags;
210
};
211
 
212
struct DylinkExportInfo {
213
  StringRef Name;
214
  SymbolFlags Flags;
215
};
216
 
217
struct DylinkSection : CustomSection {
218
  DylinkSection() : CustomSection("dylink.0") {}
219
 
220
  static bool classof(const Section *S) {
221
    auto C = dyn_cast<CustomSection>(S);
222
    return C && C->Name == "dylink.0";
223
  }
224
 
225
  uint32_t MemorySize;
226
  uint32_t MemoryAlignment;
227
  uint32_t TableSize;
228
  uint32_t TableAlignment;
229
  std::vector<StringRef> Needed;
230
  std::vector<DylinkImportInfo> ImportInfo;
231
  std::vector<DylinkExportInfo> ExportInfo;
232
};
233
 
234
struct NameSection : CustomSection {
235
  NameSection() : CustomSection("name") {}
236
 
237
  static bool classof(const Section *S) {
238
    auto C = dyn_cast<CustomSection>(S);
239
    return C && C->Name == "name";
240
  }
241
 
242
  std::vector<NameEntry> FunctionNames;
243
  std::vector<NameEntry> GlobalNames;
244
  std::vector<NameEntry> DataSegmentNames;
245
};
246
 
247
struct LinkingSection : CustomSection {
248
  LinkingSection() : CustomSection("linking") {}
249
 
250
  static bool classof(const Section *S) {
251
    auto C = dyn_cast<CustomSection>(S);
252
    return C && C->Name == "linking";
253
  }
254
 
255
  uint32_t Version;
256
  std::vector<SymbolInfo> SymbolTable;
257
  std::vector<SegmentInfo> SegmentInfos;
258
  std::vector<InitFunction> InitFunctions;
259
  std::vector<Comdat> Comdats;
260
};
261
 
262
struct ProducersSection : CustomSection {
263
  ProducersSection() : CustomSection("producers") {}
264
 
265
  static bool classof(const Section *S) {
266
    auto C = dyn_cast<CustomSection>(S);
267
    return C && C->Name == "producers";
268
  }
269
 
270
  std::vector<ProducerEntry> Languages;
271
  std::vector<ProducerEntry> Tools;
272
  std::vector<ProducerEntry> SDKs;
273
};
274
 
275
struct TargetFeaturesSection : CustomSection {
276
  TargetFeaturesSection() : CustomSection("target_features") {}
277
 
278
  static bool classof(const Section *S) {
279
    auto C = dyn_cast<CustomSection>(S);
280
    return C && C->Name == "target_features";
281
  }
282
 
283
  std::vector<FeatureEntry> Features;
284
};
285
 
286
struct TypeSection : Section {
287
  TypeSection() : Section(wasm::WASM_SEC_TYPE) {}
288
 
289
  static bool classof(const Section *S) {
290
    return S->Type == wasm::WASM_SEC_TYPE;
291
  }
292
 
293
  std::vector<Signature> Signatures;
294
};
295
 
296
struct ImportSection : Section {
297
  ImportSection() : Section(wasm::WASM_SEC_IMPORT) {}
298
 
299
  static bool classof(const Section *S) {
300
    return S->Type == wasm::WASM_SEC_IMPORT;
301
  }
302
 
303
  std::vector<Import> Imports;
304
};
305
 
306
struct FunctionSection : Section {
307
  FunctionSection() : Section(wasm::WASM_SEC_FUNCTION) {}
308
 
309
  static bool classof(const Section *S) {
310
    return S->Type == wasm::WASM_SEC_FUNCTION;
311
  }
312
 
313
  std::vector<uint32_t> FunctionTypes;
314
};
315
 
316
struct TableSection : Section {
317
  TableSection() : Section(wasm::WASM_SEC_TABLE) {}
318
 
319
  static bool classof(const Section *S) {
320
    return S->Type == wasm::WASM_SEC_TABLE;
321
  }
322
 
323
  std::vector<Table> Tables;
324
};
325
 
326
struct MemorySection : Section {
327
  MemorySection() : Section(wasm::WASM_SEC_MEMORY) {}
328
 
329
  static bool classof(const Section *S) {
330
    return S->Type == wasm::WASM_SEC_MEMORY;
331
  }
332
 
333
  std::vector<Limits> Memories;
334
};
335
 
336
struct TagSection : Section {
337
  TagSection() : Section(wasm::WASM_SEC_TAG) {}
338
 
339
  static bool classof(const Section *S) {
340
    return S->Type == wasm::WASM_SEC_TAG;
341
  }
342
 
343
  std::vector<uint32_t> TagTypes;
344
};
345
 
346
struct GlobalSection : Section {
347
  GlobalSection() : Section(wasm::WASM_SEC_GLOBAL) {}
348
 
349
  static bool classof(const Section *S) {
350
    return S->Type == wasm::WASM_SEC_GLOBAL;
351
  }
352
 
353
  std::vector<Global> Globals;
354
};
355
 
356
struct ExportSection : Section {
357
  ExportSection() : Section(wasm::WASM_SEC_EXPORT) {}
358
 
359
  static bool classof(const Section *S) {
360
    return S->Type == wasm::WASM_SEC_EXPORT;
361
  }
362
 
363
  std::vector<Export> Exports;
364
};
365
 
366
struct StartSection : Section {
367
  StartSection() : Section(wasm::WASM_SEC_START) {}
368
 
369
  static bool classof(const Section *S) {
370
    return S->Type == wasm::WASM_SEC_START;
371
  }
372
 
373
  uint32_t StartFunction;
374
};
375
 
376
struct ElemSection : Section {
377
  ElemSection() : Section(wasm::WASM_SEC_ELEM) {}
378
 
379
  static bool classof(const Section *S) {
380
    return S->Type == wasm::WASM_SEC_ELEM;
381
  }
382
 
383
  std::vector<ElemSegment> Segments;
384
};
385
 
386
struct CodeSection : Section {
387
  CodeSection() : Section(wasm::WASM_SEC_CODE) {}
388
 
389
  static bool classof(const Section *S) {
390
    return S->Type == wasm::WASM_SEC_CODE;
391
  }
392
 
393
  std::vector<Function> Functions;
394
};
395
 
396
struct DataSection : Section {
397
  DataSection() : Section(wasm::WASM_SEC_DATA) {}
398
 
399
  static bool classof(const Section *S) {
400
    return S->Type == wasm::WASM_SEC_DATA;
401
  }
402
 
403
  std::vector<DataSegment> Segments;
404
};
405
 
406
struct DataCountSection : Section {
407
  DataCountSection() : Section(wasm::WASM_SEC_DATACOUNT) {}
408
 
409
  static bool classof(const Section *S) {
410
    return S->Type == wasm::WASM_SEC_DATACOUNT;
411
  }
412
 
413
  uint32_t Count;
414
};
415
 
416
struct Object {
417
  FileHeader Header;
418
  std::vector<std::unique_ptr<Section>> Sections;
419
};
420
 
421
} // end namespace WasmYAML
422
} // end namespace llvm
423
 
424
LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<llvm::WasmYAML::Section>)
425
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Signature)
426
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ValueType)
427
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Table)
428
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Import)
429
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Export)
430
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ElemSegment)
431
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Limits)
432
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::DataSegment)
433
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Global)
434
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Function)
435
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::LocalDecl)
436
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Relocation)
437
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::NameEntry)
438
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ProducerEntry)
439
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::FeatureEntry)
440
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SegmentInfo)
441
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SymbolInfo)
442
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::InitFunction)
443
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ComdatEntry)
444
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Comdat)
445
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::DylinkImportInfo)
446
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::DylinkExportInfo)
447
 
448
namespace llvm {
449
namespace yaml {
450
 
451
template <> struct MappingTraits<WasmYAML::FileHeader> {
452
  static void mapping(IO &IO, WasmYAML::FileHeader &FileHdr);
453
};
454
 
455
template <> struct MappingTraits<std::unique_ptr<WasmYAML::Section>> {
456
  static void mapping(IO &IO, std::unique_ptr<WasmYAML::Section> &Section);
457
};
458
 
459
template <> struct MappingTraits<WasmYAML::Object> {
460
  static void mapping(IO &IO, WasmYAML::Object &Object);
461
};
462
 
463
template <> struct MappingTraits<WasmYAML::Import> {
464
  static void mapping(IO &IO, WasmYAML::Import &Import);
465
};
466
 
467
template <> struct MappingTraits<WasmYAML::Export> {
468
  static void mapping(IO &IO, WasmYAML::Export &Export);
469
};
470
 
471
template <> struct MappingTraits<WasmYAML::Global> {
472
  static void mapping(IO &IO, WasmYAML::Global &Global);
473
};
474
 
475
template <> struct ScalarBitSetTraits<WasmYAML::LimitFlags> {
476
  static void bitset(IO &IO, WasmYAML::LimitFlags &Value);
477
};
478
 
479
template <> struct ScalarBitSetTraits<WasmYAML::SymbolFlags> {
480
  static void bitset(IO &IO, WasmYAML::SymbolFlags &Value);
481
};
482
 
483
template <> struct ScalarEnumerationTraits<WasmYAML::SymbolKind> {
484
  static void enumeration(IO &IO, WasmYAML::SymbolKind &Kind);
485
};
486
 
487
template <> struct ScalarBitSetTraits<WasmYAML::SegmentFlags> {
488
  static void bitset(IO &IO, WasmYAML::SegmentFlags &Value);
489
};
490
 
491
template <> struct ScalarEnumerationTraits<WasmYAML::SectionType> {
492
  static void enumeration(IO &IO, WasmYAML::SectionType &Type);
493
};
494
 
495
template <> struct MappingTraits<WasmYAML::Signature> {
496
  static void mapping(IO &IO, WasmYAML::Signature &Signature);
497
};
498
 
499
template <> struct MappingTraits<WasmYAML::Table> {
500
  static void mapping(IO &IO, WasmYAML::Table &Table);
501
};
502
 
503
template <> struct MappingTraits<WasmYAML::Limits> {
504
  static void mapping(IO &IO, WasmYAML::Limits &Limits);
505
};
506
 
507
template <> struct MappingTraits<WasmYAML::Function> {
508
  static void mapping(IO &IO, WasmYAML::Function &Function);
509
};
510
 
511
template <> struct MappingTraits<WasmYAML::Relocation> {
512
  static void mapping(IO &IO, WasmYAML::Relocation &Relocation);
513
};
514
 
515
template <> struct MappingTraits<WasmYAML::NameEntry> {
516
  static void mapping(IO &IO, WasmYAML::NameEntry &NameEntry);
517
};
518
 
519
template <> struct MappingTraits<WasmYAML::ProducerEntry> {
520
  static void mapping(IO &IO, WasmYAML::ProducerEntry &ProducerEntry);
521
};
522
 
523
template <> struct ScalarEnumerationTraits<WasmYAML::FeaturePolicyPrefix> {
524
  static void enumeration(IO &IO, WasmYAML::FeaturePolicyPrefix &Prefix);
525
};
526
 
527
template <> struct MappingTraits<WasmYAML::FeatureEntry> {
528
  static void mapping(IO &IO, WasmYAML::FeatureEntry &FeatureEntry);
529
};
530
 
531
template <> struct MappingTraits<WasmYAML::SegmentInfo> {
532
  static void mapping(IO &IO, WasmYAML::SegmentInfo &SegmentInfo);
533
};
534
 
535
template <> struct MappingTraits<WasmYAML::LocalDecl> {
536
  static void mapping(IO &IO, WasmYAML::LocalDecl &LocalDecl);
537
};
538
 
539
template <> struct MappingTraits<WasmYAML::InitExpr> {
540
  static void mapping(IO &IO, WasmYAML::InitExpr &Expr);
541
};
542
 
543
template <> struct MappingTraits<WasmYAML::DataSegment> {
544
  static void mapping(IO &IO, WasmYAML::DataSegment &Segment);
545
};
546
 
547
template <> struct MappingTraits<WasmYAML::ElemSegment> {
548
  static void mapping(IO &IO, WasmYAML::ElemSegment &Segment);
549
};
550
 
551
template <> struct MappingTraits<WasmYAML::SymbolInfo> {
552
  static void mapping(IO &IO, WasmYAML::SymbolInfo &Info);
553
};
554
 
555
template <> struct MappingTraits<WasmYAML::InitFunction> {
556
  static void mapping(IO &IO, WasmYAML::InitFunction &Init);
557
};
558
 
559
template <> struct ScalarEnumerationTraits<WasmYAML::ComdatKind> {
560
  static void enumeration(IO &IO, WasmYAML::ComdatKind &Kind);
561
};
562
 
563
template <> struct MappingTraits<WasmYAML::ComdatEntry> {
564
  static void mapping(IO &IO, WasmYAML::ComdatEntry &ComdatEntry);
565
};
566
 
567
template <> struct MappingTraits<WasmYAML::Comdat> {
568
  static void mapping(IO &IO, WasmYAML::Comdat &Comdat);
569
};
570
 
571
template <> struct ScalarEnumerationTraits<WasmYAML::ValueType> {
572
  static void enumeration(IO &IO, WasmYAML::ValueType &Type);
573
};
574
 
575
template <> struct ScalarEnumerationTraits<WasmYAML::ExportKind> {
576
  static void enumeration(IO &IO, WasmYAML::ExportKind &Kind);
577
};
578
 
579
template <> struct ScalarEnumerationTraits<WasmYAML::TableType> {
580
  static void enumeration(IO &IO, WasmYAML::TableType &Type);
581
};
582
 
583
template <> struct ScalarEnumerationTraits<WasmYAML::Opcode> {
584
  static void enumeration(IO &IO, WasmYAML::Opcode &Opcode);
585
};
586
 
587
template <> struct ScalarEnumerationTraits<WasmYAML::RelocType> {
588
  static void enumeration(IO &IO, WasmYAML::RelocType &Kind);
589
};
590
 
591
template <> struct MappingTraits<WasmYAML::DylinkImportInfo> {
592
  static void mapping(IO &IO, WasmYAML::DylinkImportInfo &Info);
593
};
594
 
595
template <> struct MappingTraits<WasmYAML::DylinkExportInfo> {
596
  static void mapping(IO &IO, WasmYAML::DylinkExportInfo &Info);
597
};
598
 
599
} // end namespace yaml
600
} // end namespace llvm
601
 
602
#endif // LLVM_OBJECTYAML_WASMYAML_H