| @c Copyright (C) 2017-2021 Free Software Foundation, Inc. |
| @c This is part of the GAS manual. |
| @c For copying conditions, see the file as.texinfo. |
| @c man end |
| |
| @ifset GENERIC |
| @page |
| @node WebAssembly-Dependent |
| @chapter WebAssembly Dependent Features |
| @end ifset |
| |
| @ifclear GENERIC |
| @node Machine Dependencies |
| @chapter WebAssembly Dependent Features |
| @end ifclear |
| |
| @cindex WebAssembly support |
| @menu |
| * WebAssembly-Notes:: Notes |
| * WebAssembly-Syntax:: Syntax |
| * WebAssembly-Floating-Point:: Floating Point |
| * WebAssembly-Opcodes:: Opcodes |
| * WebAssembly-module-layout:: Module Layout |
| @end menu |
| |
| @node WebAssembly-Notes |
| @section Notes |
| @cindex WebAssembly notes |
| @cindex notes for WebAssembly |
| |
| While WebAssembly provides its own module format for executables, this |
| documentation describes how to use @code{@value{AS}} to produce |
| intermediate ELF object format files. |
| |
| @node WebAssembly-Syntax |
| @section Syntax |
| @cindex WebAssembly Syntax |
| The assembler syntax directly encodes sequences of opcodes as defined |
| in the WebAssembly binary encoding specification at |
| https://github.com/webassembly/spec/BinaryEncoding.md. Structured |
| sexp-style expressions are not supported as input. |
| |
| @menu |
| * WebAssembly-Chars:: Special Characters |
| * WebAssembly-Relocs:: Relocations |
| * WebAssembly-Signatures:: Signatures |
| @end menu |
| |
| @node WebAssembly-Chars |
| @subsection Special Characters |
| |
| @cindex line comment character, WebAssembly |
| @cindex WebAssembly line comment character |
| @samp{#} and @samp{;} are the line comment characters. Note that if |
| @samp{#} is the first character on a line then it can also be a |
| logical line number directive (@pxref{Comments}) or a preprocessor |
| control command (@pxref{Preprocessing}). |
| |
| @node WebAssembly-Relocs |
| @subsection Relocations |
| @cindex WebAssembly relocations |
| @cindex relocations, WebAssembly |
| |
| Special relocations are available by using the @samp{@@@var{plt}}, |
| @samp{@@@var{got}}, or @samp{@@@var{got}} suffixes after a constant |
| expression, which correspond to the R_ASMJS_LEB128_PLT, |
| R_ASMJS_LEB128_GOT, and R_ASMJS_LEB128_GOT_CODE relocations, |
| respectively. |
| |
| The @samp{@@@var{plt}} suffix is followed by a symbol name in braces; |
| the symbol value is used to determine the function signature for which |
| a PLT stub is generated. Currently, the symbol @emph{name} is parsed |
| from its last @samp{F} character to determine the argument count of |
| the function, which is also necessary for generating a PLT stub. |
| |
| @node WebAssembly-Signatures |
| @subsection Signatures |
| @cindex WebAssembly signatures |
| @cindex signatures, WebAssembly |
| |
| Function signatures are specified with the @code{signature} |
| pseudo-opcode, followed by a simple function signature imitating a |
| C++-mangled function type: @code{F} followed by an optional @code{v}, |
| then a sequence of @code{i}, @code{l}, @code{f}, and @code{d} |
| characters to mark i32, i64, f32, and f64 parameters, respectively; |
| followed by a final @code{E} to mark the end of the function |
| signature. |
| |
| @node WebAssembly-Floating-Point |
| @section Floating Point |
| @cindex floating point, WebAssembly (@sc{ieee}) |
| @cindex WebAssembly floating point (@sc{ieee}) |
| WebAssembly uses little-endian @sc{ieee} floating-point numbers. |
| |
| @node WebAssembly-Opcodes |
| @section Regular Opcodes |
| @cindex opcodes, WebAssembly |
| @cindex WebAssembly opcodes |
| Ordinary instructions are encoded with the WebAssembly mnemonics as |
| listed at: |
| @url{https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md}. |
| |
| Opcodes are written directly in the order in which they are encoded, |
| without going through an intermediate sexp-style expression as in the |
| @code{was} format. |
| |
| For ``typed'' opcodes (block, if, etc.), the type of the block is |
| specified in square brackets following the opcode: @code{if[i]}, |
| @code{if[]}. |
| |
| @node WebAssembly-module-layout |
| @section WebAssembly Module Layout |
| @cindex module layout, WebAssembly |
| @cindex WebAssembly module layout |
| @code{@value{AS}} will only produce ELF output, not a valid |
| WebAssembly module. It is possible to make @code{@value{AS}} produce |
| output in a single ELF section which becomes a valid WebAssembly |
| module, but a linker script to do so may be preferable, as it doesn't |
| require running the entire module through the assembler at once. |