1 @c Copyright (C) 2017-2026 Free Software Foundation, Inc. 2 @c This is part of the GAS manual. 3 @c For copying conditions, see the file as.texinfo. 4 @c man end 5 6 @ifset GENERIC 7 @page 8 @node WebAssembly-Dependent 9 @chapter WebAssembly Dependent Features 10 @end ifset 11 12 @ifclear GENERIC 13 @node Machine Dependencies 14 @chapter WebAssembly Dependent Features 15 @end ifclear 16 17 @cindex WebAssembly support 18 @menu 19 * WebAssembly-Notes:: Notes 20 * WebAssembly-Syntax:: Syntax 21 * WebAssembly-Floating-Point:: Floating Point 22 * WebAssembly-Opcodes:: Opcodes 23 * WebAssembly-module-layout:: Module Layout 24 @end menu 25 26 @node WebAssembly-Notes 27 @section Notes 28 @cindex WebAssembly notes 29 @cindex notes for WebAssembly 30 31 While WebAssembly provides its own module format for executables, this 32 documentation describes how to use @code{@value{AS}} to produce 33 intermediate ELF object format files. 34 35 @node WebAssembly-Syntax 36 @section Syntax 37 @cindex WebAssembly Syntax 38 The assembler syntax directly encodes sequences of opcodes as defined 39 in the WebAssembly binary encoding specification at 40 https://github.com/webassembly/spec/BinaryEncoding.md. Structured 41 sexp-style expressions are not supported as input. 42 43 @menu 44 * WebAssembly-Chars:: Special Characters 45 * WebAssembly-Relocs:: Relocations 46 * WebAssembly-Signatures:: Signatures 47 @end menu 48 49 @node WebAssembly-Chars 50 @subsection Special Characters 51 52 @cindex line comment character, WebAssembly 53 @cindex WebAssembly line comment character 54 @samp{#} and @samp{;} are the line comment characters. Note that if 55 @samp{#} is the first character on a line then it can also be a 56 logical line number directive (@pxref{Comments}) or a preprocessor 57 control command (@pxref{Preprocessing}). 58 59 @node WebAssembly-Relocs 60 @subsection Relocations 61 @cindex WebAssembly relocations 62 @cindex relocations, WebAssembly 63 64 Special relocations are available by using the @samp{@@@var{plt}}, 65 @samp{@@@var{got}}, or @samp{@@@var{got}} suffixes after a constant 66 expression, which correspond to the R_ASMJS_LEB128_PLT, 67 R_ASMJS_LEB128_GOT, and R_ASMJS_LEB128_GOT_CODE relocations, 68 respectively. 69 70 The @samp{@@@var{plt}} suffix is followed by a symbol name in braces; 71 the symbol value is used to determine the function signature for which 72 a PLT stub is generated. Currently, the symbol @emph{name} is parsed 73 from its last @samp{F} character to determine the argument count of 74 the function, which is also necessary for generating a PLT stub. 75 76 @node WebAssembly-Signatures 77 @subsection Signatures 78 @cindex WebAssembly signatures 79 @cindex signatures, WebAssembly 80 81 Function signatures are specified with the @code{signature} 82 pseudo-opcode, followed by a simple function signature imitating a 83 C++-mangled function type: @code{F} followed by an optional @code{v}, 84 then a sequence of @code{i}, @code{l}, @code{f}, and @code{d} 85 characters to mark i32, i64, f32, and f64 parameters, respectively; 86 followed by a final @code{E} to mark the end of the function 87 signature. 88 89 @node WebAssembly-Floating-Point 90 @section Floating Point 91 @cindex floating point, WebAssembly (@sc{ieee}) 92 @cindex WebAssembly floating point (@sc{ieee}) 93 WebAssembly uses little-endian @sc{ieee} floating-point numbers. 94 95 @node WebAssembly-Opcodes 96 @section Regular Opcodes 97 @cindex opcodes, WebAssembly 98 @cindex WebAssembly opcodes 99 Ordinary instructions are encoded with the WebAssembly mnemonics as 100 listed at: 101 @url{https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md}. 102 103 Opcodes are written directly in the order in which they are encoded, 104 without going through an intermediate sexp-style expression as in the 105 @code{was} format. 106 107 For ``typed'' opcodes (block, if, etc.), the type of the block is 108 specified in square brackets following the opcode: @code{if[i]}, 109 @code{if[]}. 110 111 @node WebAssembly-module-layout 112 @section WebAssembly Module Layout 113 @cindex module layout, WebAssembly 114 @cindex WebAssembly module layout 115 @code{@value{AS}} will only produce ELF output, not a valid 116 WebAssembly module. It is possible to make @code{@value{AS}} produce 117 output in a single ELF section which becomes a valid WebAssembly 118 module, but a linker script to do so may be preferable, as it doesn't 119 require running the entire module through the assembler at once. 120