blob: 14c06079f5fa6b1ec1592205b2133c3f4fbb8e1d [file] [log] [blame]
.. index:: ! changes
.. _changes:
Change History
--------------
Since the original release 1.0 of the WebAssembly specification, a number of proposals for extensions have been integrated.
The following sections provide an overview of what has changed.
All present and future versions of WebAssembly are intended to be *backwards-compatible* with all previous versions.
Concretely:
1. All syntactically well-formed (in :ref:`binary <binary>` or :ref:`text <text>` format) and :ref:`valid <valid>` modules remain well-formed and valid with an equivalent :ref:`module type <syntax-moduletype>` (or a subtype).
.. note::
This allows previously malformed or invalid modules to become legal,
e.g., by adding new features or by relaxing typing rules.
It also allows reclassifying previously malformed modules as well-formed but invalid,
or vice versa.
And it allows refining the typing of :ref:`imports <syntax-import>` and :ref:`exports <syntax-export>`,
such that previously unlinkable modules become linkable.
Historically, minor breaking changes to the *text format* have been allowed
that turned previously possible valid modules invalid,
as long as they were unlikely to occur in practice.
2. All non-:ref:`trapping <trap>` :ref:`executions <exec>` of a valid program retain their behaviour with an equivalent set of possible :ref:`results <syntax-result>` (or a non-empty subset).
.. note::
This allows previously malformed or invalid programs to become executable.
It also allows program executions that previously trapped to execute successfully,
although the intention is to only exercise this where the possibility of such an extension has been previously noted.
And it allows reducing the set of observable behaviours of a program execution,
e.g., by reducing non-determinism.
In a program linking prior modules with modules using new features,
a prior module may encounter new behaviours,
e.g., new forms of control flow or side effects when calling into a latter module.
In addition, future versions of WebAssembly will not allocate the :ref:`opcode <binary-instr>` :math:`\hex{FF}` to represent an instruction or instruction prefix.
Release 2.0
~~~~~~~~~~~
.. index:: instruction, integer
Sign Extension Instructions
...........................
Added new numeric instructions for performing sign extension within integer representations. [#proposal-signext]_
* New :ref:`numeric instructions <syntax-instr-numeric>`:
- :math:`\K{i}\X{nn}\K{.}\EXTEND\X{N}\K{\_s}`
.. index:: instruction, trap, floating-point, integer
Non-trapping Float-to-Int Conversions
.....................................
Added new conversion instructions that avoid trapping when converting a floating-point number to an integer. [#proposal-cvtsat]_
* New :ref:`numeric instructions <syntax-instr-numeric>`:
- :math:`\K{i}\X{nn}\K{.}\TRUNC\K{\_sat\_f}\X{mm}\K{\_}\sx`
.. index:: block, function, value type, result type
Multiple Values
...............
Generalized the result type of blocks and functions to allow for multiple values; in addition, introduced the ability to have block parameters. [#proposal-multivalue]_
* :ref:`Function types <syntax-functype>` allow more than one result
* :ref:`Block types <syntax-blocktype>` can be arbitrary function types
.. index:: value type, reference, reference type, instruction, element segment
Reference Types
...............
Added |FUNCREF| and |EXTERNREF| as new value types and respective instructions. [#proposal-reftype]_
* New :ref:`reference <syntax-reftype>` :ref:`value types <syntax-valtype>`:
- |FUNCREF|
- |EXTERNREF|
* New :ref:`reference instructions <syntax-instr-ref>`:
- |REFNULL|
- |REFFUNC|
- |REFISNULL|
* Extended :ref:`parametric instruction <syntax-instr-parametric>`:
- |SELECT| with optional type immediate
* New :ref:`declarative <syntax-elemmode>` form of :ref:`element segment <syntax-elem>`
.. index:: reference, instruction, table, table type
Table Instructions
..................
Added instructions to directly access and modify tables. [#proposal-reftype]_
* :ref:`Table types <syntax-tabletype>` allow any :ref:`reference type <syntax-reftype>` as element type
* New :ref:`table instructions <syntax-instr-table>`:
- |TABLEGET|
- |TABLESET|
- |TABLESIZE|
- |TABLEGROW|
.. index:: table, instruction, table index, element segment, import, export
Multiple Tables
...............
Added the ability to use multiple tables per module. [#proposal-reftype]_
* :ref:`Modules <syntax-module>` may
- :ref:`define <syntax-table>` multiple tables
- :ref:`import <syntax-import>` multiple tables
- :ref:`export <syntax-export>` multiple tables
* :ref:`Table instructions <syntax-instr-table>` take a :ref:`table index <syntax-tableidx>` immediate:
- |TABLEGET|
- |TABLESET|
- |TABLESIZE|
- |TABLEGROW|
- |CALLINDIRECT|
* :ref:`Element segments <syntax-elem>` take a :ref:`table index <syntax-tableidx>`
.. index:: instruction, table, memory, data segment, element segment
Bulk Memory and Table Instructions
..................................
Added instructions that modify ranges of memory or table entries. [#proposal-reftype]_ [#proposal-bulk]_
* New :ref:`memory instructions <syntax-instr-memory>`:
- |MEMORYFILL|
- |MEMORYINIT|
- |MEMORYCOPY|
- |DATADROP|
* New :ref:`table instructions <syntax-instr-table>`:
- |TABLEFILL|
- |TABLEINIT|
- |TABLECOPY|
- |ELEMDROP|
* New :ref:`passive <syntax-datamode>` form of :ref:`data segment <syntax-data>`
* New :ref:`passive <syntax-elemmode>` form of :ref:`element segment <syntax-elem>`
* New :ref:`data count section <binary-datacntsec>` in binary format
* Active data and element segments boundaries are no longer checked at compile time but may trap instead
.. index:: instructions, SIMD, value type, vector type
Vector Instructions
...................
Added vector type and instructions that manipulate multiple numeric values in parallel
(also known as *SIMD*, single instruction multiple data) [#proposal-vectype]_
* New :ref:`value type <syntax-valtype>`:
- |V128|
* New :ref:`memory instructions <syntax-instr-memory>`:
- :math:`\K{v128.}\LOAD`
- :math:`\K{v128.}\LOAD{}\!N\!\K{x}\!M\!\K{\_}\sx`
- :math:`\K{v128.}\LOAD{}N\K{\_zero}`
- :math:`\K{v128.}\LOAD{}N\K{\_splat}`
- :math:`\K{v128.}\LOAD{}N\K{\_lane}`
- :math:`\K{v128.}\STORE`
- :math:`\K{v128.}\STORE{}N\K{\_lane}`
* New constant :ref:`vector instruction <syntax-instr-vec>`:
- :math:`\K{v128.}\VCONST`
* New unary :ref:`vector instructions <syntax-instr-vec>`:
- :math:`\K{v128.not}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.abs}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.neg}`
- :math:`\K{i8x16.popcnt}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.abs}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.neg}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.sqrt}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.ceil}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.floor}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.trunc}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.nearest}`
* New binary :ref:`vector instructions <syntax-instr-vec>`:
- :math:`\K{v128.and}`
- :math:`\K{v128.andnot}`
- :math:`\K{v128.or}`
- :math:`\K{v128.xor}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.add}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.sub}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.mul}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.add\_sat\_}\sx`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.sub\_sat\_}\sx`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.min\_}\sx`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.max\_}\sx`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.shl}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.shr\_}\sx`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.add}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.sub}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.mul}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.div}`
- :math:`\K{i16x8.extadd\_pairwise\_i8x16\_}\sx`
- :math:`\K{i32x4.extadd\_pairwise\_i16x8\_}\sx`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.extmul\_}\half\K{\_i}\!N'\!\K{x}\!M'\!\K{\_}\sx`
- :math:`\K{i16x8.q15mulr\_sat\_s}`
- :math:`\K{i32x4.dot\_i16x8\_s}`
- :math:`\K{i8x16.avgr\_u}`
- :math:`\K{i16x8.avgr\_u}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.min}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.max}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.pmin}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.pmax}`
* New ternary :ref:`vector instruction <syntax-instr-vec>`:
- :math:`\K{v128.bitselect}`
* New test :ref:`vector instructions <syntax-instr-vec>`:
- :math:`\K{v128.any\_true}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.all\_true}`
* New relational :ref:`vector instructions <syntax-instr-vec>`:
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.eq}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.ne}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.lt\_}\sx`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.gt\_}\sx`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.le\_}\sx`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.ge\_}\sx`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.eq}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.ne}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.lt}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.gt}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.le}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.ge}`
* New conversion :ref:`vector instructions <syntax-instr-vec>`:
- :math:`\K{i32x4.trunc\_sat\_f32x4\_}\sx`
- :math:`\K{i32x4.trunc\_sat\_f64x2\_}\sx\K{\_zero}`
- :math:`\K{f32x4.convert\_i32x4\_}\sx`
- :math:`\K{f32x4.demote\_f64x2\_zero}`
- :math:`\K{f64x2.convert\_low\_i32x4\_}\sx`
- :math:`\K{f64x2.promote\_low\_f32x4}`
* New lane access :ref:`vector instructions <syntax-instr-vec>`:
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.extract\_lane\_}\sx^?`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.replace\_lane}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.extract\_lane}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.replace\_lane}`
* New lane splitting/combining :ref:`vector instructions <syntax-instr-vec>`:
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.extend\_}\half\K{\_i}\!N'\!\K{x}\!M'\!\K{\_}\sx`
- :math:`\K{i8x16.narrow\_i16x8\_}\sx`
- :math:`\K{i16x8.narrow\_i32x4\_}\sx`
* New byte reordering :ref:`vector instructions <syntax-instr-vec>`:
- :math:`\K{i8x16.shuffle}`
- :math:`\K{i8x16.swizzle}`
* New injection/projection :ref:`vector instructions <syntax-instr-vec>`:
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.splat}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.splat}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.bitmask}`
.. [#proposal-signext]
https://github.com/WebAssembly/spec/tree/main/proposals/sign-extension-ops/
.. [#proposal-cvtsat]
https://github.com/WebAssembly/spec/tree/main/proposals/nontrapping-float-to-int-conversion/
.. [#proposal-multivalue]
https://github.com/WebAssembly/spec/tree/main/proposals/multi-value/
.. [#proposal-reftype]
https://github.com/WebAssembly/spec/tree/main/proposals/reference-types/
.. [#proposal-bulk]
https://github.com/WebAssembly/spec/tree/main/proposals/bulk-memory-operations/
.. [#proposal-vectype]
https://github.com/WebAssembly/spec/tree/main/proposals/simd/
Release 3.0
~~~~~~~~~~~
.. index:: instruction, expression, constant
Extended Constant Expressions
.............................
Allowed basic numeric computations in constant expressions. [#proposal-extconst]_
* Extended set of :ref:`constant instructions <valid-const>` with:
- :math:`\K{i}\X{nn}\K{.add}`
- :math:`\K{i}\X{nn}\K{.sub}`
- :math:`\K{i}\X{nn}\K{.mul}`
- |GLOBALGET| for any previously declared immutable :ref:`global <syntax-global>`
.. note::
The :ref:`garbage collection <extension-gc>` extension added further constant instructions.
.. index:: instruction, function, call
Tail Calls
..........
Added instructions to perform tail calls. [#proposal-tailcall]_
* New :ref:`control instructions <syntax-instr-control>`:
- |RETURNCALL|
- |RETURNCALLINDIRECT|
.. index:: instruction, exception, reference type, tag type, tag, handler
Exception Handling
..................
Added tag definitions, imports, and exports, and instructions to throw and catch exceptions [#proposal-exn]_
* :ref:`Modules <syntax-module>` may
- :ref:`define <syntax-tag>` tags
- :ref:`import <syntax-import>` tags
- :ref:`export <syntax-export>` tags
* New :ref:`heap types <syntax-heaptype>`:
- |EXN|
- |NOEXN|
* New :ref:`reference type <syntax-reftype>` short-hands:
- |EXNREF|
- |NULLEXNREF|
* New :ref:`control instructions <syntax-instr-control>`:
- |THROW|
- |THROWREF|
- |TRYTABLE|
* New :ref:`tag section <binary-tagsec>` in binary format.
.. index:: instruction, memory, memory index, data segment, import, export
Multiple Memories
.................
Added the ability to use multiple memories per module. [#proposal-multimem]_
* :ref:`Modules <syntax-module>` may
- :ref:`define <syntax-mem>` multiple memories
- :ref:`import <syntax-import>` multiple memories
- :ref:`export <syntax-export>` multiple memories
* :ref:`Memory instructions <syntax-instr-memory>` take a :ref:`memory index <syntax-memidx>` immediate:
- |MEMORYSIZE|
- |MEMORYGROW|
- |MEMORYFILL|
- |MEMORYCOPY|
- |MEMORYINIT|
- :math:`t\K{.load}`
- :math:`t\K{.store}`
- :math:`t\K{.load}\!N\!\K{\_}\sx`
- :math:`t\K{.store}\!N`
- :math:`\K{v128.load}\!N\!\K{x}\!M\!\K{\_}\sx`
- :math:`\K{v128.load}\!N\!\K{\_zero}`
- :math:`\K{v128.load}\!N\!\K{\_splat}`
- :math:`\K{v128.load}\!N\!\K{\_lane}`
- :math:`\K{v128.store}\!N\!\K{\_lane}`
* :ref:`Data segments <syntax-elem>` take a :ref:`memory index <syntax-memidx>`
.. index:: address type, number type, table, memory, instruction
64-bit Address Space
....................
Added the ability to declare an :math:`\I64` :ref:`address type <syntax-addrtype>` for :ref:`tables <syntax-tabletype>` and :ref:`memories <syntax-memtype>`. [#proposal-addr64]_
* :ref:`Address types <syntax-addrtype>` denote a subset of the integral :ref:`number types <syntax-numtype>`
* :ref:`Table types <syntax-tabletype>` include an :ref:`address type <syntax-addrtype>`
* :ref:`Memory types <syntax-memtype>` include an :ref:`address type <syntax-addrtype>`
* Operand types of :ref:`table <syntax-instr-table>` and :ref:`memory <syntax-instr-memory>` instructions now depend on the subject's declared address type:
- |TABLEGET|
- |TABLESET|
- |TABLESIZE|
- |TABLEGROW|
- |TABLEFILL|
- |TABLECOPY|
- |TABLEINIT|
- |MEMORYSIZE|
- |MEMORYGROW|
- |MEMORYFILL|
- |MEMORYCOPY|
- |MEMORYINIT|
- :math:`t\K{.load}`
- :math:`t\K{.store}`
- :math:`t\K{.load}\!N\!\K{\_}\sx`
- :math:`t\K{.store}\!N`
- :math:`\K{v128.load}\!N\!\K{x}\!M\!\K{\_}\sx`
- :math:`\K{v128.load}\!N\!\K{\_zero}`
- :math:`\K{v128.load}\!N\!\K{\_splat}`
- :math:`\K{v128.load}\!N\!\K{\_lane}`
- :math:`\K{v128.store}\!N\!\K{\_lane}`
.. index:: reference, reference type, heap type, value type, local, local type, instruction, instruction type, table, function, function type, matching, subtyping
Typeful References
..................
Added more precise types for references. [#proposal-typedref]_
* New generalised form of :ref:`reference types <syntax-reftype>`:
- :math:`(\REF~\NULL^?~\heaptype)`
* New class of :ref:`heap types <syntax-heaptype>`:
- |FUNC|
- |EXTERN|
- :math:`\typeidx`
* Basic :ref:`subtyping <match>` on :ref:`reference <match-reftype>` and :ref:`value <match-valtype>` types
* New :ref:`reference instructions <syntax-instr-ref>`:
- |REFASNONNULL|
- |BRONNULL|
- |BRONNONNULL|
* New :ref:`control instruction <syntax-instr-control>`:
- |CALLREF|
* Refined typing of :ref:`reference instruction <syntax-instr-ref>`:
- |REFFUNC| with more precise result type
* Refined typing of :ref:`local instructions <valid-instr-variable>` and :ref:`instruction sequences <valid-instrs>` to track the :ref:`initialization status <syntax-init>` of :ref:`locals <syntax-local>` with non-defaultable type
* Refined decoding of :ref:`active <syntax-elemmode>` :ref:`element segments <binary-elem>` with implicit element type and plain function indices (opcode :math:`0`) to produce :ref:`non-null <syntax-null>` :ref:`reference type <syntax-reftype>`.
* Extended :ref:`table definitions <syntax-table>` with optional initializer expression
.. index:: reference, reference type, heap type, field type, storage type, structure type, array type, composite type, sub type, recursive type
.. _extension-gc:
Garbage Collection
..................
Added managed reference types. [#proposal-gc]_
* New forms of :ref:`heap types <syntax-heaptype>`:
- |ANY|
- |EQT|
- |I31|
- |STRUCT|
- |ARRAY|
- |NONE|
- |NOFUNC|
- |NOEXTERN|
* New :ref:`reference type <syntax-reftype>` short-hands:
- |ANYREF|
- |EQREF|
- |I31REF|
- |STRUCTREF|
- |ARRAYREF|
- |NULLREF|
- |NULLFUNCREF|
- |NULLEXTERNREF|
* New forms of type definitions:
- :ref:`structure <syntax-structtype>`
- :ref:`array types <syntax-arraytype>`
- :ref:`sub types <syntax-subtype>`
- :ref:`recursive types <syntax-rectype>`
* Enriched :ref:`subtyping <match>` based on explicitly declared :ref:`sub types <syntax-subtype>` and the new heap types
* New generic :ref:`reference instructions <syntax-instr-ref>`:
- |REFEQ|
- |REFTEST|
- |REFCAST|
- |BRONCAST|
- |BRONCASTFAIL|
* New :ref:`reference instructions <syntax-instr-ref>` for :ref:`unboxed scalars <syntax-i31>`:
- |REFI31|
- :math:`\I31GET\K{\_}\sx`
* New :ref:`reference instructions <syntax-instr-ref>` for :ref:`structure types <syntax-structtype>`:
- |STRUCTNEW|
- |STRUCTNEWDEFAULT|
- :math:`\STRUCTGET\K{\_}\sx^?`
- |STRUCTSET|
* New :ref:`reference instructions <syntax-instr-ref>` for :ref:`array types <syntax-structtype>`:
- |ARRAYNEW|
- |ARRAYNEWDEFAULT|
- |ARRAYNEWFIXED|
- |ARRAYNEWDATA|
- |ARRAYNEWELEM|
- :math:`\ARRAYGET\K{\_}\sx^?`
- |ARRAYSET|
- |ARRAYLEN|
- |ARRAYFILL|
- |ARRAYCOPY|
- |ARRAYINITDATA|
- |ARRAYINITELEM|
* New :ref:`reference instructions <syntax-instr-ref>` for converting :ref:`external types <syntax-externtype>`:
- |ANYCONVERTEXTERN|
- |EXTERNCONVERTANY|
* Extended set of :ref:`constant instructions <valid-const>` with:
- |REFI31|
- |STRUCTNEW|
- |STRUCTNEWDEFAULT|
- |ARRAYNEW|
- |ARRAYNEWDEFAULT|
- |ARRAYNEWFIXED|
- |ANYCONVERTEXTERN|
- |EXTERNCONVERTANY|
.. index:: instruction, vector instruction, SIMD
Relaxed Vector Instructions
...........................
Added new *relaxed* vector instructions,
whose behaviour is non-deterministic and implementation-dependent. [#proposal-relaxed]_
* New binary :ref:`vector instruction <syntax-instr-vec-relaxed>`:
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.relaxed\_min}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.relaxed\_max}`
- :math:`\K{i16x8.relaxed\_q15mulr\_s}`
- :math:`\K{i16x8.relaxed\_dot\_i8x16\_i7x16\_s}`
* New ternary :ref:`vector instruction <syntax-instr-vec-relaxed>`:
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.relaxed\_madd}`
- :math:`\K{f}\!N\!\K{x}\!M\!\K{.relaxed\_nmadd}`
- :math:`\K{i}\!N\!\K{x}\!M\!\K{.relaxed\_laneselect}`
- :math:`\K{i32x4.relaxed\_dot\_i8x16\_i7x16\_add\_s}`
* New conversion :ref:`vector instructions <syntax-instr-vec-relaxed>`:
- :math:`\K{i32x4.relaxed\_trunc\_f32x4\_}\sx`
- :math:`\K{i32x4.relaxed\_trunc\_f64x2\_}\sx\K{\_zero}`
* New byte reordering :ref:`vector instruction <syntax-instr-vec-relaxed>`:
- :math:`\K{i8x16.relaxed\_swizzle}`
.. index:: determinism, non-determinism, profiles
Profiles
........
Introduced the concept of :ref:`profile <profiles>` for specifying language subsets.
* A new profile defining a :ref:`deterministic <profile-deterministic>` mode of execution.
.. index:: text format, annotation, custom section, identifier, module, type, function, local, structure field
Custom Annotations
..................
Added generic syntax for custom annotations in the text format,
mirroring the role of custom sections in the binary format. [#proposal-annot]_
* :ref:`Annotations <text-annot>` of the form :math:`\text{(@id~\dots)}` are allowed anywhere in the :ref:`text format <text>`
* :ref:`Identifiers <text-id>` can be escaped as :math:`\text{@"\dots"}` with arbitrary :ref:`names <text-name>`
* Defined :ref:`name annotations <text-nameannot>` :math:`\text{(@name~"\dots")}` for:
- :ref:`module names <text-modulenameannot>`
- :ref:`type names <text-typenameannot>`
- :ref:`function names <text-funcnameannot>`
- :ref:`local names <text-localnameannot>`
- :ref:`field names <text-fieldnameannot>`
* Defined :ref:`custom annotation <text-customannot>` :math:`\text{(@custom~"\dots")}` to represent arbitrary :ref:`custom sections <binary-customsec>` in the text format
.. [#proposal-extconst]
https://github.com/WebAssembly/spec/tree/main/proposals/extended-const/
.. [#proposal-tailcall]
https://github.com/WebAssembly/spec/tree/main/proposals/tail-call/
.. [#proposal-exn]
https://github.com/WebAssembly/spec/tree/main/proposals/exception-handling/
.. [#proposal-multimem]
https://github.com/WebAssembly/spec/tree/main/proposals/multi-memory/
.. [#proposal-addr64]
https://github.com/WebAssembly/spec/tree/main/proposals/memory64/
.. [#proposal-typedref]
https://github.com/WebAssembly/spec/tree/main/proposals/function-references/
.. [#proposal-gc]
https://github.com/WebAssembly/spec/tree/main/proposals/gc/
.. [#proposal-relaxed]
https://github.com/WebAssembly/spec/tree/main/proposals/relaxed-simd/
.. [#proposal-annot]
https://github.com/WebAssembly/spec/tree/main/proposals/annotations/