1 //===- Wasm.h - Wasm object file format -------------------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file defines manifest constants for the wasm object file format.
10 // See: https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_BINARYFORMAT_WASM_H
15 #define LLVM_BINARYFORMAT_WASM_H
17 #include "llvm/ADT/ArrayRef.h"
18 #include "llvm/ADT/SmallVector.h"
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 linking metadata version
28 const uint32_t WasmMetadataVersion
= 0x2;
29 // Wasm uses a 64k page size
30 const uint32_t WasmPageSize
= 65536;
32 struct WasmObjectHeader
{
37 struct WasmDylinkInfo
{
38 uint32_t MemorySize
; // Memory size in bytes
39 uint32_t MemoryAlignment
; // P2 alignment of memory
40 uint32_t TableSize
; // Table size in elements
41 uint32_t TableAlignment
; // P2 alignment of table
42 std::vector
<StringRef
> Needed
; // Shared library depenedencies
45 struct WasmProducerInfo
{
46 std::vector
<std::pair
<std::string
, std::string
>> Languages
;
47 std::vector
<std::pair
<std::string
, std::string
>> Tools
;
48 std::vector
<std::pair
<std::string
, std::string
>> SDKs
;
79 struct WasmGlobalType
{
87 WasmInitExpr InitExpr
;
88 StringRef SymbolName
; // from the "linking" section
91 struct WasmEventType
{
92 // Kind of event. Currently only WASM_EVENT_ATTRIBUTE_EXCEPTION is possible.
100 StringRef SymbolName
; // from the "linking" section
109 WasmGlobalType Global
;
116 struct WasmLocalDecl
{
121 struct WasmFunction
{
123 std::vector
<WasmLocalDecl
> Locals
;
124 ArrayRef
<uint8_t> Body
;
125 uint32_t CodeSectionOffset
;
127 uint32_t CodeOffset
; // start of Locals and Body
128 StringRef SymbolName
; // from the "linking" section
129 StringRef DebugName
; // from the "name" section
130 uint32_t Comdat
; // from the "comdat info" section
133 struct WasmDataSegment
{
134 uint32_t MemoryIndex
;
136 ArrayRef
<uint8_t> Content
;
137 StringRef Name
; // from the "segment info" section
140 uint32_t Comdat
; // from the "comdat info" section
143 struct WasmElemSegment
{
146 std::vector
<uint32_t> Functions
;
149 // Represents the location of a Wasm data symbol within a WasmDataSegment, as
150 // the index of the segment, and the offset and size within the segment.
151 struct WasmDataReference
{
157 struct WasmRelocation
{
158 uint8_t Type
; // The type of the relocation.
159 uint32_t Index
; // Index into either symbol or type index space.
160 uint64_t Offset
; // Offset from the start of the section.
161 int64_t Addend
; // A value to add to the symbol.
164 struct WasmInitFunc
{
169 struct WasmSymbolInfo
{
173 StringRef ImportModule
; // For undefined symbols the module of the import
174 StringRef ImportName
; // For undefined symbols the name of the import
176 // For function or global symbols, the index in function or global index
178 uint32_t ElementIndex
;
179 // For a data symbols, the address of the data relative to segment.
180 WasmDataReference DataRef
;
184 struct WasmFunctionName
{
189 struct WasmLinkingData
{
191 std::vector
<WasmInitFunc
> InitFunctions
;
192 std::vector
<StringRef
> Comdats
;
193 std::vector
<WasmSymbolInfo
> SymbolTable
;
197 WASM_SEC_CUSTOM
= 0, // Custom / User-defined section
198 WASM_SEC_TYPE
= 1, // Function signature declarations
199 WASM_SEC_IMPORT
= 2, // Import declarations
200 WASM_SEC_FUNCTION
= 3, // Function declarations
201 WASM_SEC_TABLE
= 4, // Indirect function table and other tables
202 WASM_SEC_MEMORY
= 5, // Memory attributes
203 WASM_SEC_GLOBAL
= 6, // Global declarations
204 WASM_SEC_EXPORT
= 7, // Exports
205 WASM_SEC_START
= 8, // Start function declaration
206 WASM_SEC_ELEM
= 9, // Elements section
207 WASM_SEC_CODE
= 10, // Function bodies (code)
208 WASM_SEC_DATA
= 11, // Data segments
209 WASM_SEC_DATACOUNT
= 12, // Data segment count
210 WASM_SEC_EVENT
= 13 // Event declarations
213 // Type immediate encodings used in various contexts.
215 WASM_TYPE_I32
= 0x7F,
216 WASM_TYPE_I64
= 0x7E,
217 WASM_TYPE_F32
= 0x7D,
218 WASM_TYPE_F64
= 0x7C,
219 WASM_TYPE_V128
= 0x7B,
220 WASM_TYPE_FUNCREF
= 0x70,
221 WASM_TYPE_EXCEPT_REF
= 0x68,
222 WASM_TYPE_FUNC
= 0x60,
223 WASM_TYPE_NORESULT
= 0x40, // for blocks with no result values
226 // Kinds of externals (for imports and exports).
228 WASM_EXTERNAL_FUNCTION
= 0x0,
229 WASM_EXTERNAL_TABLE
= 0x1,
230 WASM_EXTERNAL_MEMORY
= 0x2,
231 WASM_EXTERNAL_GLOBAL
= 0x3,
232 WASM_EXTERNAL_EVENT
= 0x4,
235 // Opcodes used in initializer expressions.
237 WASM_OPCODE_END
= 0x0b,
238 WASM_OPCODE_GLOBAL_GET
= 0x23,
239 WASM_OPCODE_I32_CONST
= 0x41,
240 WASM_OPCODE_I64_CONST
= 0x42,
241 WASM_OPCODE_F32_CONST
= 0x43,
242 WASM_OPCODE_F64_CONST
= 0x44,
246 WASM_LIMITS_FLAG_HAS_MAX
= 0x1,
247 WASM_LIMITS_FLAG_IS_SHARED
= 0x2,
250 // Kind codes used in the custom "name" section
252 WASM_NAMES_FUNCTION
= 0x1,
253 WASM_NAMES_LOCAL
= 0x2,
256 // Kind codes used in the custom "linking" section
258 WASM_SEGMENT_INFO
= 0x5,
259 WASM_INIT_FUNCS
= 0x6,
260 WASM_COMDAT_INFO
= 0x7,
261 WASM_SYMBOL_TABLE
= 0x8,
264 // Kind codes used in the custom "linking" section in the WASM_COMDAT_INFO
266 WASM_COMDAT_DATA
= 0x0,
267 WASM_COMDAT_FUNCTION
= 0x1,
270 // Kind codes used in the custom "linking" section in the WASM_SYMBOL_TABLE
271 enum WasmSymbolType
: unsigned {
272 WASM_SYMBOL_TYPE_FUNCTION
= 0x0,
273 WASM_SYMBOL_TYPE_DATA
= 0x1,
274 WASM_SYMBOL_TYPE_GLOBAL
= 0x2,
275 WASM_SYMBOL_TYPE_SECTION
= 0x3,
276 WASM_SYMBOL_TYPE_EVENT
= 0x4,
279 // Kinds of event attributes.
280 enum WasmEventAttribute
: unsigned {
281 WASM_EVENT_ATTRIBUTE_EXCEPTION
= 0x0,
284 const unsigned WASM_SYMBOL_BINDING_MASK
= 0x3;
285 const unsigned WASM_SYMBOL_VISIBILITY_MASK
= 0xc;
287 const unsigned WASM_SYMBOL_BINDING_GLOBAL
= 0x0;
288 const unsigned WASM_SYMBOL_BINDING_WEAK
= 0x1;
289 const unsigned WASM_SYMBOL_BINDING_LOCAL
= 0x2;
290 const unsigned WASM_SYMBOL_VISIBILITY_DEFAULT
= 0x0;
291 const unsigned WASM_SYMBOL_VISIBILITY_HIDDEN
= 0x4;
292 const unsigned WASM_SYMBOL_UNDEFINED
= 0x10;
293 const unsigned WASM_SYMBOL_EXPORTED
= 0x20;
294 const unsigned WASM_SYMBOL_EXPLICIT_NAME
= 0x40;
296 #define WASM_RELOC(name, value) name = value,
299 #include "WasmRelocs.def"
304 // Subset of types that a value can have
310 V128
= WASM_TYPE_V128
,
311 EXCEPT_REF
= WASM_TYPE_EXCEPT_REF
,
314 struct WasmSignature
{
315 SmallVector
<ValType
, 1> Returns
;
316 SmallVector
<ValType
, 4> Params
;
317 // Support empty and tombstone instances, needed by DenseMap.
318 enum { Plain
, Empty
, Tombstone
} State
= Plain
;
320 WasmSignature(SmallVector
<ValType
, 1> &&InReturns
,
321 SmallVector
<ValType
, 4> &&InParams
)
322 : Returns(InReturns
), Params(InParams
) {}
323 WasmSignature() = default;
326 // Useful comparison operators
327 inline bool operator==(const WasmSignature
&LHS
, const WasmSignature
&RHS
) {
328 return LHS
.State
== RHS
.State
&& LHS
.Returns
== RHS
.Returns
&&
329 LHS
.Params
== RHS
.Params
;
332 inline bool operator!=(const WasmSignature
&LHS
, const WasmSignature
&RHS
) {
333 return !(LHS
== RHS
);
336 inline bool operator==(const WasmGlobalType
&LHS
, const WasmGlobalType
&RHS
) {
337 return LHS
.Type
== RHS
.Type
&& LHS
.Mutable
== RHS
.Mutable
;
340 inline bool operator!=(const WasmGlobalType
&LHS
, const WasmGlobalType
&RHS
) {
341 return !(LHS
== RHS
);
344 std::string
toString(WasmSymbolType type
);
345 std::string
relocTypetoString(uint32_t type
);
347 } // end namespace wasm
348 } // end namespace llvm