]> Cypherpunks repositories - gostls13.git/commit
cmd/link, runtime: on Wasm, put only function index in method table and func table
authorCherry Mui <cherryyz@google.com>
Tue, 26 Dec 2023 20:35:56 +0000 (15:35 -0500)
committerCherry Mui <cherryyz@google.com>
Wed, 16 Jul 2025 14:15:42 +0000 (07:15 -0700)
commit9c507e794297c9a7f160f71b9910d5de27b9a517
tree95842c626540db2792171d7f705df8f537e8f202
parent9782dcfd16bcf10f576504bacf67eb41a6cef88f
cmd/link, runtime: on Wasm, put only function index in method table and func table

In the type descriptor's method table, it contains relative PCs of
the methods (relative to the start of the text section) stored as
32-bit offsets. On Wasm, a PC is PC_F<<16 + PC_B, where PC_F is
the function index, and PC_B is the block index. When there are
more than 65536 functions, the PC will not fit into 32-bit (and
relative to the section start doesn't help). Since there are no
more bits for the function index, and the method table always
targets the entry of a method, we put just the PC_F there, and
rewrite back to a full PC at run time when we need the PC. This
way we can have more than 65536 functions.

The func table also contains 32-bit relative PCs, and it also
always points to function entries. Do the same there, as well
as other places where we use relative text offsets.

Also add the relocation type in the relocation overflow error
message.

Also add check for function too big on Wasm. If a function has
more than 65536 blocks, PC_B will overflow and PC = PC_F<<16 + PC_B
will points to the wrong function.

Fixes #64856.

Change-Id: If9c307e9fb1641f367a5f19c39f88f455805d0bb
Reviewed-on: https://go-review.googlesource.com/c/go/+/552835
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
src/cmd/internal/obj/wasm/wasmobj.go
src/cmd/link/internal/ld/data.go
src/cmd/link/internal/ld/pcln.go
src/runtime/symtab.go