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