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_BINARYFORMAT_WASM_H 16 #define LLVM_BINARYFORMAT_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 struct WasmObjectHeader { 31 StringRef Magic; 32 uint32_t Version; 33 }; 34 35 struct WasmSignature { 36 std::vector<int32_t> ParamTypes; 37 int32_t ReturnType; 38 }; 39 40 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 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 struct WasmFunction { 92 std::vector<WasmLocalDecl> Locals; 93 ArrayRef<uint8_t> Body; 94 }; 95 96 struct WasmDataSegment { 97 uint32_t MemoryIndex; 98 WasmInitExpr Offset; 99 ArrayRef<uint8_t> Content; 100 StringRef Name; 101 uint32_t Alignment; 102 uint32_t Flags; 103 }; 104 105 struct WasmElemSegment { 106 uint32_t TableIndex; 107 WasmInitExpr Offset; 108 std::vector<uint32_t> Functions; 109 }; 110 111 struct WasmRelocation { 112 uint32_t Type; // The type of the relocation. 113 uint32_t Index; // Index into function to global index space. 114 uint64_t Offset; // Offset from the start of the section. 115 int64_t Addend; // A value to add to the symbol. 116 }; 117 118 struct WasmLinkingData { 119 uint32_t DataSize; 120 }; 121 122 enum : unsigned { 123 WASM_SEC_CUSTOM = 0, // Custom / User-defined section 124 WASM_SEC_TYPE = 1, // Function signature declarations 125 WASM_SEC_IMPORT = 2, // Import declarations 126 WASM_SEC_FUNCTION = 3, // Function declarations 127 WASM_SEC_TABLE = 4, // Indirect function table and other tables 128 WASM_SEC_MEMORY = 5, // Memory attributes 129 WASM_SEC_GLOBAL = 6, // Global declarations 130 WASM_SEC_EXPORT = 7, // Exports 131 WASM_SEC_START = 8, // Start function declaration 132 WASM_SEC_ELEM = 9, // Elements section 133 WASM_SEC_CODE = 10, // Function bodies (code) 134 WASM_SEC_DATA = 11 // Data segments 135 }; 136 137 // Type immediate encodings used in various contexts. 138 enum { 139 WASM_TYPE_I32 = -0x01, 140 WASM_TYPE_I64 = -0x02, 141 WASM_TYPE_F32 = -0x03, 142 WASM_TYPE_F64 = -0x04, 143 WASM_TYPE_ANYFUNC = -0x10, 144 WASM_TYPE_FUNC = -0x20, 145 WASM_TYPE_NORESULT = -0x40, // for blocks with no result values 146 }; 147 148 // Kinds of externals (for imports and exports). 149 enum : unsigned { 150 WASM_EXTERNAL_FUNCTION = 0x0, 151 WASM_EXTERNAL_TABLE = 0x1, 152 WASM_EXTERNAL_MEMORY = 0x2, 153 WASM_EXTERNAL_GLOBAL = 0x3, 154 }; 155 156 // Opcodes used in initializer expressions. 157 enum : unsigned { 158 WASM_OPCODE_END = 0x0b, 159 WASM_OPCODE_GET_GLOBAL = 0x23, 160 WASM_OPCODE_I32_CONST = 0x41, 161 WASM_OPCODE_I64_CONST = 0x42, 162 WASM_OPCODE_F32_CONST = 0x43, 163 WASM_OPCODE_F64_CONST = 0x44, 164 }; 165 166 enum : unsigned { 167 WASM_NAMES_FUNCTION = 0x1, 168 WASM_NAMES_LOCAL = 0x2, 169 }; 170 171 enum : unsigned { 172 WASM_LIMITS_FLAG_HAS_MAX = 0x1, 173 }; 174 175 // Subset of types that a value can have 176 enum class ValType { 177 I32 = WASM_TYPE_I32, 178 I64 = WASM_TYPE_I64, 179 F32 = WASM_TYPE_F32, 180 F64 = WASM_TYPE_F64, 181 }; 182 183 // Linking metadata kinds. 184 enum : unsigned { 185 WASM_STACK_POINTER = 0x1, 186 WASM_SYMBOL_INFO = 0x2, 187 WASM_DATA_SIZE = 0x3, 188 WASM_DATA_ALIGNMENT = 0x4, 189 WASM_SEGMENT_INFO = 0x5, 190 }; 191 192 const unsigned WASM_SYMBOL_BINDING_MASK = 0x3; 193 194 enum : unsigned { 195 WASM_SYMBOL_BINDING_GLOBAL = 0x0, 196 WASM_SYMBOL_BINDING_WEAK = 0x1, 197 WASM_SYMBOL_BINDING_LOCAL = 0x2, 198 }; 199 200 #define WASM_RELOC(name, value) name = value, 201 202 enum : unsigned { 203 #include "WasmRelocs/WebAssembly.def" 204 }; 205 206 #undef WASM_RELOC 207 208 struct Global { 209 ValType Type; 210 bool Mutable; 211 212 // The initial value for this global is either the value of an imported 213 // global, in which case InitialModule and InitialName specify the global 214 // import, or a value, in which case InitialModule is empty and InitialValue 215 // holds the value. 216 StringRef InitialModule; 217 StringRef InitialName; 218 uint64_t InitialValue; 219 }; 220 221 } // end namespace wasm 222 } // end namespace llvm 223 224 #endif 225