LCOV - code coverage report
Current view: top level - include/llvm/Support - Wasm.h (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 7 7 100.0 %
Date: 2017-05-20 02:07:48 Functions: 0 0 -
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- Wasm.h - Wasm object file format -------------------------*- 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             : // This file defines manifest constants for the wasm object file format.
      11             : // See: https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md
      12             : //
      13             : //===----------------------------------------------------------------------===//
      14             : 
      15             : #ifndef LLVM_SUPPORT_WASM_H
      16             : #define LLVM_SUPPORT_WASM_H
      17             : 
      18             : #include "llvm/ADT/ArrayRef.h"
      19             : 
      20             : namespace llvm {
      21             : namespace wasm {
      22             : 
      23             : // Object file magic string.
      24             : const char WasmMagic[] = {'\0', 'a', 's', 'm'};
      25             : // Wasm binary format version
      26             : const uint32_t WasmVersion = 0x1;
      27             : // Wasm uses a 64k page size
      28             : const uint32_t WasmPageSize = 65536;
      29             : 
      30          54 : struct WasmObjectHeader {
      31             :   StringRef Magic;
      32             :   uint32_t Version;
      33             : };
      34             : 
      35         175 : struct WasmSignature {
      36             :   std::vector<int32_t> ParamTypes;
      37             :   int32_t ReturnType;
      38             : };
      39             : 
      40          36 : struct WasmExport {
      41             :   StringRef Name;
      42             :   uint32_t Kind;
      43             :   uint32_t Index;
      44             : };
      45             : 
      46             : struct WasmLimits {
      47             :   uint32_t Flags;
      48             :   uint32_t Initial;
      49             :   uint32_t Maximum;
      50             : };
      51             : 
      52             : struct WasmTable {
      53             :   int32_t ElemType;
      54             :   WasmLimits Limits;
      55             : };
      56             : 
      57             : struct WasmInitExpr {
      58             :   uint8_t Opcode;
      59             :   union {
      60             :     int32_t Int32;
      61             :     int64_t Int64;
      62             :     int32_t Float32;
      63             :     int64_t Float64;
      64             :     uint32_t Global;
      65             :   } Value;
      66             : };
      67             : 
      68             : struct WasmGlobal {
      69             :   int32_t Type;
      70             :   bool Mutable;
      71             :   WasmInitExpr InitExpr;
      72             : };
      73             : 
      74          63 : struct WasmImport {
      75             :   StringRef Module;
      76             :   StringRef Field;
      77             :   uint32_t Kind;
      78             :   union {
      79             :     uint32_t SigIndex;
      80             :     WasmGlobal Global;
      81             :     WasmTable Table;
      82             :     WasmLimits Memory;
      83             :   };
      84             : };
      85             : 
      86             : struct WasmLocalDecl {
      87             :   int32_t Type;
      88             :   uint32_t Count;
      89             : };
      90             : 
      91         132 : struct WasmFunction {
      92             :   std::vector<WasmLocalDecl> Locals;
      93             :   ArrayRef<uint8_t> Body;
      94             : };
      95             : 
      96           2 : struct WasmDataSegment {
      97             :   uint32_t Index;
      98             :   WasmInitExpr Offset;
      99             :   ArrayRef<uint8_t> Content;
     100             : };
     101             : 
     102          70 : struct WasmElemSegment {
     103             :   uint32_t TableIndex;
     104             :   WasmInitExpr Offset;
     105             :   std::vector<uint32_t> Functions;
     106             : };
     107             : 
     108             : struct WasmRelocation {
     109             :   uint32_t Type;         // The type of the relocation.
     110             :   int32_t Index;         // Index into function to global index space.
     111             :   uint64_t Offset;       // Offset from the start of the section.
     112             :   int64_t Addend;        // A value to add to the symbol.
     113             : };
     114             : 
     115             : enum : unsigned {
     116             :   WASM_SEC_CUSTOM = 0,   // Custom / User-defined section
     117             :   WASM_SEC_TYPE = 1,     // Function signature declarations
     118             :   WASM_SEC_IMPORT = 2,   // Import declarations
     119             :   WASM_SEC_FUNCTION = 3, // Function declarations
     120             :   WASM_SEC_TABLE = 4,    // Indirect function table and other tables
     121             :   WASM_SEC_MEMORY = 5,   // Memory attributes
     122             :   WASM_SEC_GLOBAL = 6,   // Global declarations
     123             :   WASM_SEC_EXPORT = 7,   // Exports
     124             :   WASM_SEC_START = 8,    // Start function declaration
     125             :   WASM_SEC_ELEM = 9,     // Elements section
     126             :   WASM_SEC_CODE = 10,    // Function bodies (code)
     127             :   WASM_SEC_DATA = 11     // Data segments
     128             : };
     129             : 
     130             : // Type immediate encodings used in various contexts.
     131             : enum {
     132             :   WASM_TYPE_I32          = -0x01,
     133             :   WASM_TYPE_I64          = -0x02,
     134             :   WASM_TYPE_F32          = -0x03,
     135             :   WASM_TYPE_F64          = -0x04,
     136             :   WASM_TYPE_ANYFUNC      = -0x10,
     137             :   WASM_TYPE_FUNC         = -0x20,
     138             :   WASM_TYPE_NORESULT     = -0x40, // for blocks with no result values
     139             : };
     140             : 
     141             : // Kinds of externals (for imports and exports).
     142             : enum : unsigned {
     143             :   WASM_EXTERNAL_FUNCTION = 0x0,
     144             :   WASM_EXTERNAL_TABLE    = 0x1,
     145             :   WASM_EXTERNAL_MEMORY   = 0x2,
     146             :   WASM_EXTERNAL_GLOBAL   = 0x3,
     147             : };
     148             : 
     149             : // Opcodes used in initializer expressions.
     150             : enum : unsigned {
     151             :   WASM_OPCODE_END        = 0x0b,
     152             :   WASM_OPCODE_GET_GLOBAL = 0x23,
     153             :   WASM_OPCODE_I32_CONST  = 0x41,
     154             :   WASM_OPCODE_I64_CONST  = 0x42,
     155             :   WASM_OPCODE_F32_CONST  = 0x43,
     156             :   WASM_OPCODE_F64_CONST  = 0x44,
     157             : };
     158             : 
     159             : enum : unsigned {
     160             :   WASM_NAMES_FUNCTION    = 0x1,
     161             :   WASM_NAMES_LOCAL       = 0x2,
     162             : };
     163             : 
     164             : enum : unsigned {
     165             :   WASM_LIMITS_FLAG_HAS_MAX = 0x1,
     166             : };
     167             : 
     168             : // Subset of types that a value can have
     169             : enum class ValType {
     170             :   I32 = WASM_TYPE_I32,
     171             :   I64 = WASM_TYPE_I64,
     172             :   F32 = WASM_TYPE_F32,
     173             :   F64 = WASM_TYPE_F64,
     174             : };
     175             : 
     176             : // Linking metadata kinds.
     177             : enum : unsigned {
     178             :   WASM_STACK_POINTER = 0x1,
     179             : };
     180             : 
     181             : #define WASM_RELOC(name, value) name = value,
     182             : 
     183             : enum : unsigned {
     184             : #include "WasmRelocs/WebAssembly.def"
     185             : };
     186             : 
     187             : #undef WASM_RELOC
     188             : 
     189             : struct Global {
     190             :   ValType Type;
     191             :   bool Mutable;
     192             : 
     193             :   // The initial value for this global is either the value of an imported
     194             :   // global, in which case InitialModule and InitialName specify the global
     195             :   // import, or a value, in which case InitialModule is empty and InitialValue
     196             :   // holds the value.
     197             :   StringRef InitialModule;
     198             :   StringRef InitialName;
     199             :   uint64_t InitialValue;
     200             : };
     201             : 
     202             : } // end namespace wasm
     203             : } // end namespace llvm
     204             : 
     205             : #endif

Generated by: LCOV version 1.13