LCOV - code coverage report
Current view: top level - include/llvm/ObjectYAML - WasmYAML.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 35 49 71.4 %
Date: 2018-10-20 13:21:21 Functions: 3 27 11.1 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- WasmYAML.h - Wasm YAMLIO implementation ------------------*- C++ -*-===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : ///
      10             : /// \file
      11             : /// This file declares classes for handling the YAML representation
      12             : /// of wasm binaries.
      13             : ///
      14             : //===----------------------------------------------------------------------===//
      15             : 
      16             : #ifndef LLVM_OBJECTYAML_WASMYAML_H
      17             : #define LLVM_OBJECTYAML_WASMYAML_H
      18             : 
      19             : #include "llvm/ADT/StringRef.h"
      20             : #include "llvm/BinaryFormat/Wasm.h"
      21             : #include "llvm/ObjectYAML/YAML.h"
      22             : #include "llvm/Support/Casting.h"
      23             : #include <cstdint>
      24             : #include <memory>
      25             : #include <vector>
      26             : 
      27             : namespace llvm {
      28             : namespace WasmYAML {
      29             : 
      30         150 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, SectionType)
      31         482 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, ValueType)
      32           3 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, TableType)
      33         178 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, SignatureForm)
      34         419 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, ExportKind)
      35         311 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, Opcode)
      36         250 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, RelocType)
      37          24 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolFlags)
      38          24 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, SymbolKind)
      39           0 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, SegmentFlags)
      40           0 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, LimitFlags)
      41           0 : LLVM_YAML_STRONG_TYPEDEF(uint32_t, ComdatKind)
      42             : 
      43             : struct FileHeader {
      44             :   yaml::Hex32 Version;
      45             : };
      46             : 
      47             : struct Limits {
      48             :   LimitFlags Flags;
      49             :   yaml::Hex32 Initial;
      50             :   yaml::Hex32 Maximum;
      51             : };
      52             : 
      53             : struct Table {
      54             :   TableType ElemType;
      55             :   Limits TableLimits;
      56             : };
      57             : 
      58             : struct Export {
      59             :   StringRef Name;
      60             :   ExportKind Kind;
      61             :   uint32_t Index;
      62             : };
      63             : 
      64          44 : struct ElemSegment {
      65             :   uint32_t TableIndex;
      66             :   wasm::WasmInitExpr Offset;
      67             :   std::vector<uint32_t> Functions;
      68             : };
      69             : 
      70             : struct Global {
      71             :   uint32_t Index;
      72             :   ValueType Type;
      73             :   bool Mutable;
      74             :   wasm::WasmInitExpr InitExpr;
      75             : };
      76             : 
      77             : struct Import {
      78             :   StringRef Module;
      79             :   StringRef Field;
      80             :   ExportKind Kind;
      81             :   union {
      82             :     uint32_t SigIndex;
      83             :     Global GlobalImport;
      84             :     Table TableImport;
      85             :     Limits Memory;
      86             :   };
      87             : };
      88             : 
      89             : struct LocalDecl {
      90             :   ValueType Type;
      91             :   uint32_t Count;
      92             : };
      93             : 
      94        2728 : struct Function {
      95             :   uint32_t Index;
      96             :   std::vector<LocalDecl> Locals;
      97             :   yaml::BinaryRef Body;
      98             : };
      99             : 
     100             : struct Relocation {
     101             :   RelocType Type;
     102             :   uint32_t Index;
     103             :   yaml::Hex32 Offset;
     104             :   int32_t Addend;
     105             : };
     106             : 
     107             : struct DataSegment {
     108             :   uint32_t MemoryIndex;
     109             :   uint32_t SectionOffset;
     110             :   wasm::WasmInitExpr Offset;
     111             :   yaml::BinaryRef Content;
     112             : };
     113             : 
     114             : struct NameEntry {
     115             :   uint32_t Index;
     116             :   StringRef Name;
     117             : };
     118             : 
     119             : struct SegmentInfo {
     120             :   uint32_t Index;
     121             :   StringRef Name;
     122             :   uint32_t Alignment;
     123             :   SegmentFlags Flags;
     124             : };
     125             : 
     126         605 : struct Signature {
     127             :   uint32_t Index;
     128             :   SignatureForm Form = wasm::WASM_TYPE_FUNC;
     129             :   std::vector<ValueType> ParamTypes;
     130             :   ValueType ReturnType;
     131             : };
     132             : 
     133             : struct SymbolInfo {
     134             :   uint32_t Index;
     135             :   StringRef Name;
     136             :   SymbolKind Kind;
     137             :   SymbolFlags Flags;
     138             :   union {
     139             :     uint32_t ElementIndex;
     140             :     wasm::WasmDataReference DataRef;
     141             :   };
     142             : };
     143             : 
     144             : struct InitFunction {
     145             :   uint32_t Priority;
     146             :   uint32_t Symbol;
     147             : };
     148             : 
     149             : struct ComdatEntry {
     150             :   ComdatKind Kind;
     151             :   uint32_t Index;
     152             : };
     153             : 
     154           8 : struct Comdat {
     155             :   StringRef Name;
     156             :   std::vector<ComdatEntry> Entries;
     157             : };
     158             : 
     159         783 : struct Section {
     160         783 :   explicit Section(SectionType SecType) : Type(SecType) {}
     161             :   virtual ~Section();
     162             : 
     163             :   SectionType Type;
     164             :   std::vector<Relocation> Relocations;
     165             : };
     166             : 
     167             : struct CustomSection : Section {
     168             :   explicit CustomSection(StringRef Name)
     169         215 :       : Section(wasm::WASM_SEC_CUSTOM), Name(Name) {}
     170             : 
     171             :   static bool classof(const Section *S) {
     172          75 :     return S->Type == wasm::WASM_SEC_CUSTOM;
     173             :   }
     174             : 
     175             :   StringRef Name;
     176             :   yaml::BinaryRef Payload;
     177             : };
     178             : 
     179             : struct NameSection : CustomSection {
     180         136 :   NameSection() : CustomSection("name") {}
     181             : 
     182          14 :   static bool classof(const Section *S) {
     183             :     auto C = dyn_cast<CustomSection>(S);
     184          14 :     return C && C->Name == "name";
     185             :   }
     186             : 
     187             :   std::vector<NameEntry> FunctionNames;
     188             : };
     189             : 
     190             : struct LinkingSection : CustomSection {
     191          84 :   LinkingSection() : CustomSection("linking") {}
     192             : 
     193          12 :   static bool classof(const Section *S) {
     194             :     auto C = dyn_cast<CustomSection>(S);
     195          12 :     return C && C->Name == "linking";
     196             :   }
     197             : 
     198             :   uint32_t Version;
     199             :   std::vector<SymbolInfo> SymbolTable;
     200             :   std::vector<SegmentInfo> SegmentInfos;
     201             :   std::vector<InitFunction> InitFunctions;
     202             :   std::vector<Comdat> Comdats;
     203             : };
     204             : 
     205             : struct TypeSection : Section {
     206         210 :   TypeSection() : Section(wasm::WASM_SEC_TYPE) {}
     207             : 
     208             :   static bool classof(const Section *S) {
     209           0 :     return S->Type == wasm::WASM_SEC_TYPE;
     210             :   }
     211             : 
     212             :   std::vector<Signature> Signatures;
     213             : };
     214             : 
     215             : struct ImportSection : Section {
     216          86 :   ImportSection() : Section(wasm::WASM_SEC_IMPORT) {}
     217             : 
     218             :   static bool classof(const Section *S) {
     219           0 :     return S->Type == wasm::WASM_SEC_IMPORT;
     220             :   }
     221             : 
     222             :   std::vector<Import> Imports;
     223             : };
     224             : 
     225             : struct FunctionSection : Section {
     226         188 :   FunctionSection() : Section(wasm::WASM_SEC_FUNCTION) {}
     227             : 
     228             :   static bool classof(const Section *S) {
     229           0 :     return S->Type == wasm::WASM_SEC_FUNCTION;
     230             :   }
     231             : 
     232             :   std::vector<uint32_t> FunctionTypes;
     233             : };
     234             : 
     235             : struct TableSection : Section {
     236         144 :   TableSection() : Section(wasm::WASM_SEC_TABLE) {}
     237             : 
     238             :   static bool classof(const Section *S) {
     239           0 :     return S->Type == wasm::WASM_SEC_TABLE;
     240             :   }
     241             : 
     242             :   std::vector<Table> Tables;
     243             : };
     244             : 
     245             : struct MemorySection : Section {
     246         142 :   MemorySection() : Section(wasm::WASM_SEC_MEMORY) {}
     247             : 
     248             :   static bool classof(const Section *S) {
     249           0 :     return S->Type == wasm::WASM_SEC_MEMORY;
     250             :   }
     251             : 
     252             :   std::vector<Limits> Memories;
     253             : };
     254             : 
     255             : struct GlobalSection : Section {
     256         136 :   GlobalSection() : Section(wasm::WASM_SEC_GLOBAL) {}
     257             : 
     258             :   static bool classof(const Section *S) {
     259           0 :     return S->Type == wasm::WASM_SEC_GLOBAL;
     260             :   }
     261             : 
     262             :   std::vector<Global> Globals;
     263             : };
     264             : 
     265             : struct ExportSection : Section {
     266         128 :   ExportSection() : Section(wasm::WASM_SEC_EXPORT) {}
     267             : 
     268             :   static bool classof(const Section *S) {
     269           0 :     return S->Type == wasm::WASM_SEC_EXPORT;
     270             :   }
     271             : 
     272             :   std::vector<Export> Exports;
     273             : };
     274             : 
     275             : struct StartSection : Section {
     276           6 :   StartSection() : Section(wasm::WASM_SEC_START) {}
     277             : 
     278             :   static bool classof(const Section *S) {
     279           0 :     return S->Type == wasm::WASM_SEC_START;
     280             :   }
     281             : 
     282             :   uint32_t StartFunction;
     283             : };
     284             : 
     285             : struct ElemSection : Section {
     286          38 :   ElemSection() : Section(wasm::WASM_SEC_ELEM) {}
     287             : 
     288             :   static bool classof(const Section *S) {
     289           0 :     return S->Type == wasm::WASM_SEC_ELEM;
     290             :   }
     291             : 
     292             :   std::vector<ElemSegment> Segments;
     293             : };
     294             : 
     295             : struct CodeSection : Section {
     296         188 :   CodeSection() : Section(wasm::WASM_SEC_CODE) {}
     297             : 
     298             :   static bool classof(const Section *S) {
     299           0 :     return S->Type == wasm::WASM_SEC_CODE;
     300             :   }
     301             : 
     302             :   std::vector<Function> Functions;
     303             : };
     304             : 
     305             : struct DataSection : Section {
     306          72 :   DataSection() : Section(wasm::WASM_SEC_DATA) {}
     307             : 
     308             :   static bool classof(const Section *S) {
     309           0 :     return S->Type == wasm::WASM_SEC_DATA;
     310             :   }
     311             : 
     312             :   std::vector<DataSegment> Segments;
     313             : };
     314             : 
     315         131 : struct Object {
     316             :   FileHeader Header;
     317             :   std::vector<std::unique_ptr<Section>> Sections;
     318             : };
     319             : 
     320             : } // end namespace WasmYAML
     321             : } // end namespace llvm
     322             : 
     323             : LLVM_YAML_IS_SEQUENCE_VECTOR(std::unique_ptr<llvm::WasmYAML::Section>)
     324             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Signature)
     325             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ValueType)
     326             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Table)
     327             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Import)
     328             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Export)
     329             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ElemSegment)
     330             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Limits)
     331             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::DataSegment)
     332             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Global)
     333             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Function)
     334             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::LocalDecl)
     335             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Relocation)
     336             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::NameEntry)
     337             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SegmentInfo)
     338             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::SymbolInfo)
     339             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::InitFunction)
     340             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::ComdatEntry)
     341             : LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::WasmYAML::Comdat)
     342             : 
     343             : namespace llvm {
     344             : namespace yaml {
     345             : 
     346             : template <> struct MappingTraits<WasmYAML::FileHeader> {
     347             :   static void mapping(IO &IO, WasmYAML::FileHeader &FileHdr);
     348             : };
     349             : 
     350             : template <> struct MappingTraits<std::unique_ptr<WasmYAML::Section>> {
     351             :   static void mapping(IO &IO, std::unique_ptr<WasmYAML::Section> &Section);
     352             : };
     353             : 
     354             : template <> struct MappingTraits<WasmYAML::Object> {
     355             :   static void mapping(IO &IO, WasmYAML::Object &Object);
     356             : };
     357             : 
     358             : template <> struct MappingTraits<WasmYAML::Import> {
     359             :   static void mapping(IO &IO, WasmYAML::Import &Import);
     360             : };
     361             : 
     362             : template <> struct MappingTraits<WasmYAML::Export> {
     363             :   static void mapping(IO &IO, WasmYAML::Export &Export);
     364             : };
     365             : 
     366             : template <> struct MappingTraits<WasmYAML::Global> {
     367             :   static void mapping(IO &IO, WasmYAML::Global &Global);
     368             : };
     369             : 
     370             : template <> struct ScalarBitSetTraits<WasmYAML::LimitFlags> {
     371             :   static void bitset(IO &IO, WasmYAML::LimitFlags &Value);
     372             : };
     373             : 
     374             : template <> struct ScalarBitSetTraits<WasmYAML::SymbolFlags> {
     375             :   static void bitset(IO &IO, WasmYAML::SymbolFlags &Value);
     376             : };
     377             : 
     378             : template <> struct ScalarEnumerationTraits<WasmYAML::SymbolKind> {
     379             :   static void enumeration(IO &IO, WasmYAML::SymbolKind &Kind);
     380             : };
     381             : 
     382             : template <> struct ScalarBitSetTraits<WasmYAML::SegmentFlags> {
     383             :   static void bitset(IO &IO, WasmYAML::SegmentFlags &Value);
     384             : };
     385             : 
     386             : template <> struct ScalarEnumerationTraits<WasmYAML::SectionType> {
     387             :   static void enumeration(IO &IO, WasmYAML::SectionType &Type);
     388             : };
     389             : 
     390             : template <> struct MappingTraits<WasmYAML::Signature> {
     391             :   static void mapping(IO &IO, WasmYAML::Signature &Signature);
     392             : };
     393             : 
     394             : template <> struct MappingTraits<WasmYAML::Table> {
     395             :   static void mapping(IO &IO, WasmYAML::Table &Table);
     396             : };
     397             : 
     398             : template <> struct MappingTraits<WasmYAML::Limits> {
     399             :   static void mapping(IO &IO, WasmYAML::Limits &Limits);
     400             : };
     401             : 
     402             : template <> struct MappingTraits<WasmYAML::Function> {
     403             :   static void mapping(IO &IO, WasmYAML::Function &Function);
     404             : };
     405             : 
     406             : template <> struct MappingTraits<WasmYAML::Relocation> {
     407             :   static void mapping(IO &IO, WasmYAML::Relocation &Relocation);
     408             : };
     409             : 
     410             : template <> struct MappingTraits<WasmYAML::NameEntry> {
     411             :   static void mapping(IO &IO, WasmYAML::NameEntry &NameEntry);
     412             : };
     413             : 
     414             : template <> struct MappingTraits<WasmYAML::SegmentInfo> {
     415             :   static void mapping(IO &IO, WasmYAML::SegmentInfo &SegmentInfo);
     416             : };
     417             : 
     418             : template <> struct MappingTraits<WasmYAML::LocalDecl> {
     419             :   static void mapping(IO &IO, WasmYAML::LocalDecl &LocalDecl);
     420             : };
     421             : 
     422             : template <> struct MappingTraits<wasm::WasmInitExpr> {
     423             :   static void mapping(IO &IO, wasm::WasmInitExpr &Expr);
     424             : };
     425             : 
     426             : template <> struct MappingTraits<WasmYAML::DataSegment> {
     427             :   static void mapping(IO &IO, WasmYAML::DataSegment &Segment);
     428             : };
     429             : 
     430             : template <> struct MappingTraits<WasmYAML::ElemSegment> {
     431             :   static void mapping(IO &IO, WasmYAML::ElemSegment &Segment);
     432             : };
     433             : 
     434             : template <> struct MappingTraits<WasmYAML::SymbolInfo> {
     435             :   static void mapping(IO &IO, WasmYAML::SymbolInfo &Info);
     436             : };
     437             : 
     438             : template <> struct MappingTraits<WasmYAML::InitFunction> {
     439             :   static void mapping(IO &IO, WasmYAML::InitFunction &Init);
     440             : };
     441             : 
     442             : template <> struct ScalarEnumerationTraits<WasmYAML::ComdatKind> {
     443             :   static void enumeration(IO &IO, WasmYAML::ComdatKind &Kind);
     444             : };
     445             : 
     446             : template <> struct MappingTraits<WasmYAML::ComdatEntry> {
     447             :   static void mapping(IO &IO, WasmYAML::ComdatEntry &ComdatEntry);
     448             : };
     449             : 
     450             : template <> struct MappingTraits<WasmYAML::Comdat> {
     451             :   static void mapping(IO &IO, WasmYAML::Comdat &Comdat);
     452             : };
     453             : 
     454             : template <> struct ScalarEnumerationTraits<WasmYAML::ValueType> {
     455             :   static void enumeration(IO &IO, WasmYAML::ValueType &Type);
     456             : };
     457             : 
     458             : template <> struct ScalarEnumerationTraits<WasmYAML::ExportKind> {
     459             :   static void enumeration(IO &IO, WasmYAML::ExportKind &Kind);
     460             : };
     461             : 
     462             : template <> struct ScalarEnumerationTraits<WasmYAML::TableType> {
     463             :   static void enumeration(IO &IO, WasmYAML::TableType &Type);
     464             : };
     465             : 
     466             : template <> struct ScalarEnumerationTraits<WasmYAML::Opcode> {
     467             :   static void enumeration(IO &IO, WasmYAML::Opcode &Opcode);
     468             : };
     469             : 
     470             : template <> struct ScalarEnumerationTraits<WasmYAML::RelocType> {
     471             :   static void enumeration(IO &IO, WasmYAML::RelocType &Kind);
     472             : };
     473             : 
     474             : } // end namespace yaml
     475             : } // end namespace llvm
     476             : 
     477             : #endif // LLVM_OBJECTYAML_WASMYAML_H

Generated by: LCOV version 1.13