blob: afd2b1a0e6e1aadbabc1eb05e02e893043c90208 [file] [log] [blame]
.. index:: custom section, section, binary format
Custom Sections
---------------
This appendix defines dedicated :ref:`custom sections <binary-customsec>` for WebAssembly's :ref:`binary format <binary>`.
Such sections do not contribute to, or otherwise affect, the WebAssembly semantics, and like any custom section they may be ignored by an implementation.
However, they provide useful meta data that implementations can make use of to improve user experience or take compilation hints.
Currently, only one dedicated custom section is defined, the :ref:`name section<binary-namesec>`.
.. index:: ! name section, name, Unicode UTF-8
.. _binary-namesec:
Name Section
~~~~~~~~~~~~
The *name section* is a :ref:`custom section <binary-customsec>` whose name string is itself :math:`\text{name}`.
The name section should appear only once in a module, and only after the :ref:`data section <binary-datasec>`.
The purpose of this section is to attach printable names to definitions in a module, which e.g. can be used by a debugger or when parts of the module are to be rendered in :ref:`text form <text>`.
.. note::
All :ref:`names <binary-name>` are represented in |Unicode|_ encoded in UTF-8.
Names need not be unique.
.. _binary-namesubsection:
Subsections
...........
The :ref:`data <binary-customsec>` of a name section consists of a sequence of *subsections*.
Each subsection consists of a
* a one-byte subsection *id*,
* the |U32| *size* of the contents, in bytes,
* the actual *contents*, whose structure is depended on the subsection id.
.. math::
\begin{array}{llcll}
\production{name section} & \Bnamesec &::=&
\Bsection_0(\Bnamedata) \\
\production{name data} & \Bnamedata &::=&
n{:}\Bname~~\Bnamesubsection^\ast & (\iff n = \text{name}) \\
\production{name subsection} & \Bnamesubsection_N(\B{B}) &::=&
N{:}\Bbyte~~\X{size}{:}\Bu32~~\B{B}
& (\iff \X{size} = ||\B{B}||) \\
\end{array}
The following subsection ids are used:
== ===========================================
Id Subsection
== ===========================================
0 :ref:`module name <binary-modulenamesec>`
1 :ref:`function names <binary-funcnamesec>`
2 :ref:`local names <binary-localnamesec>`
== ===========================================
.. index:: ! name map, index, index space
.. _binary-indirectnamemap:
.. _binary-namemap:
Name Maps
.........
A *name map* assigns :ref:`names <syntax-name>` to :ref:`indices <syntax-index>` in a given :ref:`index space <syntax-index>`.
It consists of a :ref:`vector <binary-vec>` of index/name pairs in order of increasing index value.
Each index must be unique, but the assigned names need not be.
.. math::
\begin{array}{llclll}
\production{name map} & \Bnamemap &::=&
\Bvec(\Bnameassoc) \\
\production{name association} & \Bnameassoc &::=&
\Bidx~\Bname \\
\end{array}
An *indirect name map* assigns :ref:`names <syntax-name>` to a two-dimensional :ref:`index space <syntax-index>`, where secondary indices are *grouped* by primary indices.
It consists of a vector of primary index/name map pairs in order of increasing index value, where each name map in turn maps secondary indices to names.
Each primary index must be unique, and likewise each secondary index per individual name map.
.. math::
\begin{array}{llclll}
\production{indirect name map} & \Bindirectnamemap &::=&
\Bvec(\Bindirectnameassoc) \\
\production{indirect name association} & \Bindirectnameassoc &::=&
\Bidx~\Bnamemap \\
\end{array}
.. index:: module
.. _binary-modulenamesec:
Module Names
............
The *module name subsection* has the id 0.
It simply consists of a single :ref:`name <binary-name>` that is assigned to the module itself.
.. math::
\begin{array}{llclll}
\production{module name subsection} & \Bmodulenamesubsec &::=&
\Bnamesubsection_0(\Bname) \\
\end{array}
.. index:: function, function index
.. _binary-funcnamesec:
Function Names
..............
The *function name subsection* has the id 1.
It consists of a :ref:`name map <binary-namemap>` assigning function names to :ref:`function indices <syntax-funcidx>`.
.. math::
\begin{array}{llclll}
\production{function name subsection} & \Bfuncnamesubsec &::=&
\Bnamesubsection_1(\Bnamemap) \\
\end{array}
.. index:: function, local, function index, local index
.. _binary-localnamesec:
Local Names
...........
The *local name subsection* has the id 2.
It consists of an :ref:`indirect name map <binary-indirectnamemap>` assigning local names to :ref:`local indices <syntax-localidx>` grouped by :ref:`function indices <syntax-funcidx>`.
.. math::
\begin{array}{llclll}
\production{local name subsection} & \Blocalnamesubsec &::=&
\Bnamesubsection_2(\Bindirectnamemap) \\
\end{array}