@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.