From 3b73760009ba97313d85ad67a30d169bc3529689 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 20:00:44 +0000 Subject: [PATCH] Bump github.com/ncruces/go-sqlite3 from 0.15.0 to 0.16.3 Bumps [github.com/ncruces/go-sqlite3](https://github.com/ncruces/go-sqlite3) from 0.15.0 to 0.16.3. - [Release notes](https://github.com/ncruces/go-sqlite3/releases) - [Commits](https://github.com/ncruces/go-sqlite3/compare/v0.15.0...v0.16.3) --- updated-dependencies: - dependency-name: github.com/ncruces/go-sqlite3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 4 +- go.sum | 8 +- .../github.com/ncruces/go-sqlite3/README.md | 10 +- vendor/github.com/ncruces/go-sqlite3/conn.go | 34 +- .../ncruces/go-sqlite3/driver/driver.go | 31 +- .../ncruces/go-sqlite3/embed/README.md | 8 +- .../ncruces/go-sqlite3/embed/build.sh | 3 +- .../ncruces/go-sqlite3/embed/exports.txt | 3 + .../ncruces/go-sqlite3/embed/sqlite3.wasm | Bin 1337796 -> 1365234 bytes .../github.com/ncruces/go-sqlite3/go.work.sum | 9 +- .../go-sqlite3/internal/alloc/alloc_other.go | 9 + .../go-sqlite3/internal/alloc/alloc_slice.go | 24 + .../{util/alloc.go => alloc/alloc_unix.go} | 20 +- .../internal/alloc/alloc_windows.go | 76 +++ .../ncruces/go-sqlite3/internal/util/const.go | 2 +- .../ncruces/go-sqlite3/internal/util/json.go | 2 +- .../ncruces/go-sqlite3/internal/util/mmap.go | 7 +- .../go-sqlite3/internal/util/mmap_other.go | 19 +- .../go-sqlite3/internal/util/module.go | 2 +- vendor/github.com/ncruces/go-sqlite3/json.go | 3 +- .../github.com/ncruces/go-sqlite3/pointer.go | 3 +- .../github.com/ncruces/go-sqlite3/sqlite.go | 16 +- vendor/github.com/ncruces/go-sqlite3/stmt.go | 54 ++- vendor/github.com/ncruces/go-sqlite3/time.go | 12 +- vendor/github.com/ncruces/go-sqlite3/value.go | 6 +- .../ncruces/go-sqlite3/vfs/README.md | 61 ++- .../github.com/ncruces/go-sqlite3/vfs/api.go | 4 +- .../ncruces/go-sqlite3/vfs/const.go | 2 + .../github.com/ncruces/go-sqlite3/vfs/file.go | 3 + .../github.com/ncruces/go-sqlite3/vfs/lock.go | 2 +- .../ncruces/go-sqlite3/vfs/lock_other.go | 2 +- .../ncruces/go-sqlite3/vfs/os_bsd.go | 9 +- .../ncruces/go-sqlite3/vfs/os_darwin.go | 2 +- .../ncruces/go-sqlite3/vfs/os_linux.go | 4 +- .../ncruces/go-sqlite3/vfs/os_std_sleep.go | 9 - .../ncruces/go-sqlite3/vfs/os_unix_lock.go | 7 +- .../ncruces/go-sqlite3/vfs/os_windows.go | 15 +- .../github.com/ncruces/go-sqlite3/vfs/shm.go | 46 +- .../ncruces/go-sqlite3/vfs/shm_bsd.go | 260 +++++++++++ .../ncruces/go-sqlite3/vfs/shm_other.go | 2 +- .../github.com/ncruces/go-sqlite3/vfs/vfs.go | 12 +- vendor/github.com/ncruces/go-sqlite3/vtab.go | 31 +- .../github.com/tetratelabs/wazero/config.go | 19 +- .../wazero/experimental/checkpoint.go | 13 - .../wazero/experimental/listener.go | 6 - .../experimental/sys/syscall_errno_windows.go | 6 +- .../imports/wasi_snapshot_preview1/fs.go | 13 +- .../engine/interpreter/interpreter.go | 3 + .../wazevo/backend/executable_context.go | 28 +- .../wazevo/backend/isa/amd64/machine.go | 16 +- .../engine/wazevo/backend/isa/arm64/abi.go | 30 +- .../backend/isa/arm64/abi_entry_preamble.go | 29 +- .../wazevo/backend/isa/arm64/abi_go_call.go | 119 ++--- .../engine/wazevo/backend/isa/arm64/instr.go | 438 +++++++++--------- .../backend/isa/arm64/instr_encoding.go | 136 +++--- .../backend/isa/arm64/lower_constant.go | 6 +- .../wazevo/backend/isa/arm64/lower_instr.go | 379 +++++++-------- .../wazevo/backend/isa/arm64/lower_mem.go | 59 ++- .../wazevo/backend/isa/arm64/machine.go | 17 +- .../isa/arm64/machine_pro_epi_logue.go | 51 +- .../backend/isa/arm64/machine_regalloc.go | 10 +- .../engine/wazevo/backend/regalloc.go | 12 +- .../wazevo/backend/regalloc/regalloc.go | 140 +++--- .../engine/wazevo/backend/regalloc/regset.go | 44 +- .../internal/engine/wazevo/call_engine.go | 18 - .../internal/engine/wazevo/engine_cache.go | 7 + .../engine/wazevo/frontend/frontend.go | 21 +- .../internal/engine/wazevo/frontend/lower.go | 12 +- .../internal/engine/wazevo/module_engine.go | 31 +- .../internal/engine/wazevo/ssa/basic_block.go | 73 +-- .../internal/engine/wazevo/ssa/builder.go | 104 +++-- .../wazero/internal/engine/wazevo/ssa/pass.go | 41 +- .../engine/wazevo/ssa/pass_blk_layouts.go | 16 +- .../internal/engine/wazevo/ssa/pass_cfg.go | 49 +- .../wazero/internal/engine/wazevo/ssa/type.go | 3 + .../internal/engine/wazevo/wazevoapi/pool.go | 4 +- .../wazero/internal/platform/cpuid.go | 5 + .../wazero/internal/platform/cpuid_amd64.go | 36 +- .../internal/platform/cpuid_unsupported.go | 9 +- .../wazero/internal/platform/mmap_unix.go | 2 - .../internal/platform/mmap_unsupported.go | 2 - .../wazero/internal/platform/mmap_windows.go | 2 - .../tetratelabs/wazero/internal/sysfs/file.go | 3 - .../wazero/internal/wasm/engine.go | 3 + .../wazero/internal/wasm/func_validation.go | 7 - .../wazero/internal/wasm/memory.go | 23 +- .../wazero/internal/wasm/module.go | 7 +- vendor/modules.txt | 5 +- 88 files changed, 1710 insertions(+), 1183 deletions(-) create mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_other.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_slice.go rename vendor/github.com/ncruces/go-sqlite3/internal/{util/alloc.go => alloc/alloc_unix.go} (79%) create mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_windows.go delete mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/os_std_sleep.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go diff --git a/go.mod b/go.mod index 2c9315ebaa..32c0b938a5 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/miekg/dns v1.1.59 github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20230225130813-fd77d905589e - github.com/ncruces/go-sqlite3 v0.15.0 + github.com/ncruces/go-sqlite3 v0.16.3 github.com/reeflective/console v0.1.15 github.com/reeflective/readline v1.0.14 github.com/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69 @@ -42,7 +42,7 @@ require ( github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 - github.com/tetratelabs/wazero v1.7.2 + github.com/tetratelabs/wazero v1.7.3 github.com/things-go/go-socks5 v0.0.5 github.com/ulikunitz/xz v0.5.12 github.com/xlab/treeprint v1.2.0 diff --git a/go.sum b/go.sum index 239908d567..dae14c312b 100644 --- a/go.sum +++ b/go.sum @@ -303,8 +303,8 @@ github.com/moloch--/asciicast v0.1.0 h1:eBOJwuFKSk447s/kPs9MWsc4kAl5HmuKIDLDYD6/ github.com/moloch--/asciicast v0.1.0/go.mod h1:OckO16UDLgxVLclrCnbocL1ix15Br/8Xv/caBoYq98o= github.com/moloch--/memmod v0.0.0-20230225130813-fd77d905589e h1:IkFCPlAa0iTiLxck+NqAwBx8JDlnHYm4orOQBbs4BDQ= github.com/moloch--/memmod v0.0.0-20230225130813-fd77d905589e/go.mod h1:eYeI6cQ5YHhHt9i0BBW0zc1DaQnb4ZMXsSPuEV/V5Og= -github.com/ncruces/go-sqlite3 v0.15.0 h1:C+SIrcYsAIR5GUYWmCnif6x81n6BS9y75vYcQynuGNU= -github.com/ncruces/go-sqlite3 v0.15.0/go.mod h1:kHHYmFmK4G2VFFoIovEg9BEQ8BP+D81y4ESHXnzJV/w= +github.com/ncruces/go-sqlite3 v0.16.3 h1:Ky0denOdmAGOoCE6lQlw6GCJNMD8gTikNWe8rpu+Gjc= +github.com/ncruces/go-sqlite3 v0.16.3/go.mod h1:sAU/vQwBmZ2hq5BlW/KTzqRFizL43bv2JQoBLgXhcMI= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= @@ -387,8 +387,8 @@ github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA= github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk= github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ04I0= github.com/tcnksm/go-httpstat v0.2.0/go.mod h1:s3JVJFtQxtBEBC9dwcdTTXS9xFnM3SXAZwPG41aurT8= -github.com/tetratelabs/wazero v1.7.2 h1:1+z5nXJNwMLPAWaTePFi49SSTL0IMx/i3Fg8Yc25GDc= -github.com/tetratelabs/wazero v1.7.2/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= +github.com/tetratelabs/wazero v1.7.3 h1:PBH5KVahrt3S2AHgEjKu4u+LlDbbk+nsGE3KLucy6Rw= +github.com/tetratelabs/wazero v1.7.3/go.mod h1:ytl6Zuh20R/eROuyDaGPkp82O9C/DJfXAwJfQ3X6/7Y= github.com/thedevsaddam/gojsonq/v2 v2.5.2 h1:CoMVaYyKFsVj6TjU6APqAhAvC07hTI6IQen8PHzHYY0= github.com/thedevsaddam/gojsonq/v2 v2.5.2/go.mod h1:bv6Xa7kWy82uT0LnXPE2SzGqTj33TAEeR560MdJkiXs= github.com/things-go/go-socks5 v0.0.5 h1:qvKaGcBkfDrUL33SchHN93srAmYGzb4CxSM2DPYufe8= diff --git a/vendor/github.com/ncruces/go-sqlite3/README.md b/vendor/github.com/ncruces/go-sqlite3/README.md index 3cf5b4afe0..25b2ccbe49 100644 --- a/vendor/github.com/ncruces/go-sqlite3/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/README.md @@ -33,6 +33,8 @@ Go, wazero and [`x/sys`](https://pkg.go.dev/golang.org/x/sys) are the _only_ run provides the [`array`](https://sqlite.org/carray.html) table-valued function. - [`github.com/ncruces/go-sqlite3/ext/blobio`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/blobio) simplifies [incremental BLOB I/O](https://sqlite.org/c3ref/blob_open.html). +- [`github.com/ncruces/go-sqlite3/ext/bloom`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/bloom) + provides a [Bloom filter](https://github.com/nalgeon/sqlean/issues/27#issuecomment-1002267134) virtual table. - [`github.com/ncruces/go-sqlite3/ext/csv`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/csv) reads [comma-separated values](https://sqlite.org/csv.html). - [`github.com/ncruces/go-sqlite3/ext/fileio`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/fileio) @@ -51,12 +53,12 @@ Go, wazero and [`x/sys`](https://pkg.go.dev/golang.org/x/sys) are the _only_ run provides [Unicode aware](https://sqlite.org/src/dir/ext/icu) functions. - [`github.com/ncruces/go-sqlite3/ext/zorder`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/zorder) maps multidimensional data to one dimension. +- [`github.com/ncruces/go-sqlite3/vfs/adiantum`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/adiantum) + wraps a VFS to offer encryption at rest. - [`github.com/ncruces/go-sqlite3/vfs/memdb`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/memdb) implements an in-memory VFS. - [`github.com/ncruces/go-sqlite3/vfs/readervfs`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/readervfs) implements a VFS for immutable databases. -- [`github.com/ncruces/go-sqlite3/vfs/adiantum`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/adiantum) - wraps a VFS to offer encryption at rest. ### Advanced features @@ -88,7 +90,9 @@ It also benefits greatly from [SQLite's](https://sqlite.org/testing.html) and [wazero's](https://tetrate.io/blog/introducing-wazero-from-tetrate/#:~:text=Rock%2Dsolid%20test%20approach) thorough testing. Every commit is [tested](.github/workflows/test.yml) on -Linux (amd64/arm64/386/riscv64), macOS (amd64/arm64), Windows, FreeBSD and illumos. +Linux (amd64/arm64/386/riscv64/s390x), macOS (amd64/arm64), +Windows (amd64), FreeBSD (amd64), illumos (amd64), and Solaris (amd64). + The Go VFS is tested by running SQLite's [mptest](https://github.com/sqlite/sqlite/blob/master/mptest/mptest.c). diff --git a/vendor/github.com/ncruces/go-sqlite3/conn.go b/vendor/github.com/ncruces/go-sqlite3/conn.go index 8ba034feef..f170ccf57f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/conn.go +++ b/vendor/github.com/ncruces/go-sqlite3/conn.go @@ -346,10 +346,9 @@ func (c *Conn) checkInterrupt() { } func progressCallback(ctx context.Context, mod api.Module, pDB uint32) (interrupt uint32) { - if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.interrupt != nil { - if c.interrupt.Err() != nil { - interrupt = 1 - } + if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && + c.interrupt != nil && c.interrupt.Err() != nil { + interrupt = 1 } return interrupt } @@ -363,6 +362,30 @@ func (c *Conn) BusyTimeout(timeout time.Duration) error { return c.error(r) } +func timeoutCallback(ctx context.Context, mod api.Module, pDB uint32, count, tmout int32) (retry uint32) { + if c, ok := ctx.Value(connKey{}).(*Conn); ok && + (c.interrupt == nil || c.interrupt.Err() == nil) { + const delays = "\x01\x02\x05\x0a\x0f\x14\x19\x19\x19\x32\x32\x64" + const totals = "\x00\x01\x03\x08\x12\x21\x35\x4e\x67\x80\xb2\xe4" + const ndelay = int32(len(delays) - 1) + + var delay, prior int32 + if count <= ndelay { + delay = int32(delays[count]) + prior = int32(totals[count]) + } else { + delay = int32(delays[ndelay]) + prior = int32(totals[ndelay]) + delay*(count-ndelay) + } + + if delay = min(delay, tmout-prior); delay > 0 { + time.Sleep(time.Duration(delay) * time.Millisecond) + retry = 1 + } + } + return retry +} + // BusyHandler registers a callback to handle [BUSY] errors. // // https://sqlite.org/c3ref/busy_handler.html @@ -380,7 +403,8 @@ func (c *Conn) BusyHandler(cb func(count int) (retry bool)) error { } func busyCallback(ctx context.Context, mod api.Module, pDB uint32, count int32) (retry uint32) { - if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.busy != nil { + if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.busy != nil && + (c.interrupt == nil || c.interrupt.Err() == nil) { if c.busy(int(count)) { retry = 1 } diff --git a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go index b496f76ec6..e7863b1b8f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go +++ b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go @@ -229,6 +229,7 @@ func (c *conn) Raw() *sqlite3.Conn { return c.Conn } +// Deprecated: use BeginTx instead. func (c *conn) Begin() (driver.Tx, error) { return c.BeginTx(context.Background(), driver.TxOptions{}) } @@ -301,7 +302,7 @@ func (c *conn) PrepareContext(ctx context.Context, query string) (driver.Stmt, e s.Close() return nil, util.TailErr } - return &stmt{Stmt: s, tmRead: c.tmRead, tmWrite: c.tmWrite}, nil + return &stmt{Stmt: s, tmRead: c.tmRead, tmWrite: c.tmWrite, inputs: -2}, nil } func (c *conn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { @@ -335,6 +336,7 @@ type stmt struct { *sqlite3.Stmt tmWrite sqlite3.TimeFormat tmRead sqlite3.TimeFormat + inputs int } var ( @@ -345,12 +347,17 @@ var ( ) func (s *stmt) NumInput() int { + if s.inputs >= -1 { + return s.inputs + } n := s.Stmt.BindCount() for i := 1; i <= n; i++ { if s.Stmt.BindName(i) != "" { + s.inputs = -1 return -1 } } + s.inputs = n return n } @@ -389,12 +396,7 @@ func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driv return &rows{ctx: ctx, stmt: s}, nil } -func (s *stmt) setupBindings(args []driver.NamedValue) error { - err := s.Stmt.ClearBindings() - if err != nil { - return err - } - +func (s *stmt) setupBindings(args []driver.NamedValue) (err error) { var ids [3]int for _, arg := range args { ids := ids[:0] @@ -558,19 +560,20 @@ func (r *rows) Next(dest []driver.Value) error { return err } -func (r *rows) decodeTime(i int, v any) (_ time.Time, _ bool) { +func (r *rows) decodeTime(i int, v any) (_ time.Time, ok bool) { if r.tmRead == sqlite3.TimeFormatDefault { + // handled by maybeTime return } - switch r.declType(i) { - case "DATE", "TIME", "DATETIME", "TIMESTAMP": - // maybe + switch v.(type) { + case int64, float64, string: + // could be a time value default: return } - switch v.(type) { - case int64, float64, string: - // maybe + switch r.declType(i) { + case "DATE", "TIME", "DATETIME", "TIMESTAMP": + // could be a time value default: return } diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/README.md b/vendor/github.com/ncruces/go-sqlite3/embed/README.md index 87281a83f8..0156f01763 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/embed/README.md @@ -1,6 +1,6 @@ # Embeddable Wasm build of SQLite -This folder includes an embeddable Wasm build of SQLite 3.45.3 for use with +This folder includes an embeddable Wasm build of SQLite 3.46.0 for use with [`github.com/ncruces/go-sqlite3`](https://pkg.go.dev/github.com/ncruces/go-sqlite3). The following optional features are compiled in: @@ -10,6 +10,7 @@ The following optional features are compiled in: - [R*Tree](https://sqlite.org/rtree.html) - [GeoPoly](https://sqlite.org/geopoly.html) - [soundex](https://sqlite.org/lang_corefunc.html#soundex) +- [stat4](https://sqlite.org/compile.html#enable_stat4) - [base64](https://github.com/sqlite/sqlite/blob/master/ext/misc/base64.c) - [decimal](https://github.com/sqlite/sqlite/blob/master/ext/misc/decimal.c) - [ieee754](https://github.com/sqlite/sqlite/blob/master/ext/misc/ieee754.c) @@ -23,4 +24,7 @@ See the [configuration options](../sqlite3/sqlite_cfg.h), and [patches](../sqlite3) applied. Built using [`wasi-sdk`](https://github.com/WebAssembly/wasi-sdk), -and [`binaryen`](https://github.com/WebAssembly/binaryen). \ No newline at end of file +and [`binaryen`](https://github.com/WebAssembly/binaryen). + +The build is easily reproducible, and verifiable, using +[Artifact Attestations](https://github.com/ncruces/go-sqlite3/attestations). \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh index c50112c0bf..abe5e60c46 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh +++ b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh @@ -8,7 +8,7 @@ BINARYEN="$ROOT/tools/binaryen-version_117/bin" WASI_SDK="$ROOT/tools/wasi-sdk-22.0/bin" "$WASI_SDK/clang" --target=wasm32-wasi -std=c17 -flto -g0 -O2 \ - -Wall -Wextra -Wno-unused-parameter \ + -Wall -Wextra -Wno-unused-parameter -Wno-unused-function \ -o sqlite3.wasm "$ROOT/sqlite3/main.c" \ -I"$ROOT/sqlite3" \ -mexec-model=reactor \ @@ -20,6 +20,7 @@ WASI_SDK="$ROOT/tools/wasi-sdk-22.0/bin" -Wl,--stack-first \ -Wl,--import-undefined \ -D_HAVE_SQLITE_CONFIG_H \ + -DSQLITE_CUSTOM_INCLUDE=sqlite_opt.h \ $(awk '{print "-Wl,--export="$0}' exports.txt) trap 'rm -f sqlite3.tmp' EXIT diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt b/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt index da16316bbe..b3cb1581c9 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt +++ b/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt @@ -36,10 +36,13 @@ sqlite3_collation_needed_go sqlite3_column_blob sqlite3_column_bytes sqlite3_column_count +sqlite3_column_database_name sqlite3_column_decltype sqlite3_column_double sqlite3_column_int64 sqlite3_column_name +sqlite3_column_origin_name +sqlite3_column_table_name sqlite3_column_text sqlite3_column_type sqlite3_column_value diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm b/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm index 2f36b2948d459958509396948142e5ce19a25291..8dfc7da0c6c642190e25589c6743612dce703195 100644 GIT binary patch delta 469920 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 z%0Dtfzoc;@0Te}>pz2sq#WYQPFR#top(>nH1hoi1I^Rw6#r^n>AP~xnaQNb9I}KUB zd}$#czOcx3f^=st!WVQ|_}(J7cZU5E{`x#ltuw-|FSvt~k1^ppFSz3HGbA{~>HdN` z5W@g1kyaG`jPUdeZYU4G`GOlCIxcWK;K%;J1#Un0lk@Xhhj94?L@8L{?C`Mbwxy0R z`WOP$p1;6-*gf!N!k0KIFTT*lyR_U-|5@I>aw+1$MH)8Wq-x`qGh?Ckd)fh&!A zK$J4Zv}3e5V#3IH7wZ%D6R(Zt5#bcopmPfZmqgUX3jk!opB6ix%guusg?}t|+lK1J zt_#om)QjDiZVo_0e@n+b^H@iyNM1o}>#iaLmk^(8!<84io}sjBRhLqndco?`IR8!n zuYPqg9=#C$cCi};R5|Ls7S4G#J0R?Ji94r${x?A{Mv1fe1H+n!Ln5qVz zN?gVhyYMms%J^J)nVUcW*Athy&!pG=E$q3(?WE5$m$+%8-d>R}f2JWe)(mZA5U17& z!U^Z_{bq^Vq#*YK)0kJ|z|c#;4MNinZLMV>?(B+ib8rXYb6@q(;9lzWVp}BP>sR1! zekjCOx-&tBwO10>L21IPoKmIxJ(Q#R+g0v^#WmL?M}fyzycu4)%564m#XC9KLyfJJ zOzU zJ-@Q#w2t_U=gb>2nB*k!5PiO@P3;gSnssoPNxNTYo?H!Qrm)NNKjHzK4} zG!r?rS?`0oQtFQxgOHN=8LP?|@f4`s%O6R&BWX{B1xPgFVxk0e_Bx_O;@0LDkD0{7 zqqHdV5KN>J?QDW8EF!Byi?8PeH`9TI-qVO;#xn%?i}QjudA}UQbM( zyX3UBgX?Hy@@II(1Jj?6$MO;1@H(Z2XGGO1+>>1-ZmJUAsal8D`9YE}MJ|Jt5v$p8MU(G5o|%ts54nM9lk~J(=5{y3T#kwh81-xZO`pDA(hQ$)BOLh z{!3+267GS?>)DzPT1?Qc)hDRM5T>O4ml#SOPb_dHE<->-^sJVDDwj{QUyP?3Ra6(Q z7Z5$mw`TcW;0%^Zb-e~?xbeQJdRgG53moL2Rm5pR8!{ttWRUdvRDA2r(iotPzmAkh zP8wPzvhy;NBTj`Eaif(_s~L?d1J0RS!1f9nylTozf&~vvpl12LE~icG>0ceEY!1wg zoxx33Ne#1P_Jgkpl1!BNoDT!O>IT(i{Kt@J6G~4@4OF#@JQ8pvJ(FW94@5 z^UVwE9<(#J@MgxVUm(W8AFo;Iy&0)W^;A0~Lvu;cug|*EdGF$~b3tsq%i8qfhGbVm zKtxZ14jPQSo|%tpEt(srkL9!m%Px>SEpTkOMfOULSyGLBFWWd#@`FOA@hGmSLkj)j zi6*aRAK-Q+dg+6@zX5!8LDm>&rO0z1IQ6|L? zgp^1Q4MN0f_{xju9?*9Qjq;T{2%yv4RDm!f43}uq@|6?sfv+5W#qOw$rWYMAWy4*L zO_p|q2y&O>g09o6T9?@g8!-%9Iw!!dlvcn$n#b~Lw|W~}&fA^PcaUCJMI2f9 za$U_utYKA+qvvBdpg-9{A*b{W_9c`3I+K-$t3iQm)Op)O&Fw6l!*aL#3J}=#VuHW6 zp?cragy_3K8TDE;qo16Nl}I|>fj~aozbQvh_drbuJE`!2k&xnAkSIWDcAxS98fQCB zu^D69pLb`P&JqI5Ejj;5jAZT?o8qf+jj0Mjac|5S%Vb)pJ0PC)RYPE)V4STN= z!EF_7Mas|drY*!YZZ=&90K7=0L7Px{31fx;NTh`ISYtWXK`c&P(`~q}KJegHeg!!f zJ9a0x*^YU75ZtHFMSkg6we2_DS0Y5#?=5#HXN53f`xS0%@wp^60C+qfKE1*n)+@S= z4lk}Cf_h2F-|AjhR%2cQjlm9Cbag1)<~BX5X(dUr8dqb;0%0&b00!F3(Gvr6g~$~3pC-?xZm|3E{gr5PQZ1Ok;--*fMvM}#Xcb~MgNvqu1t$o}n~+{fMEWXseCv)y1Rs4Dc{W$A zy8JFTJFRj*FMZc7X+1&F;=csT%Ubq5H?XUz7U)G&5I9mZta~@#6`uQ^BX9C|dA#gP z!??TMSJn>z&bO(|@2mJvUID;=zS~V6iOURg+6vB7B*@NiHQjJ=q%pwkc#oUeNE5*4 z6wbZJO_C=1oqOC;eSYj-*R#pGzu9Op!@-_FM#}sxpAnrxg4Wgdx~=rskMDK6^naNR z?agyhJU5^22qW%u;|U-Bz3UmI?swCoN5WJ`h_=hX7-40U&|Nd(Nj%*pszHfacOw- zLAP7(#d~t`TOnTKD*yKRg=ciMW%S?w9+B4(;_#EG75@W4U&1cXJ zSc1uhrjjT5ncI6fHu5y5s%s?cT{IJZ--~r-*8Utum9%g~J!R+C@}_(mja8hhPFU

0aZZV&?mrdpouh&&3y{v>4^frBeS_i$J~KdOFpM!SxsTJHh5Q;XuCNDK?+ zRQt!zT&Uy5wdL)=%N)nyRlJU6lRV2RV7$^?h`Z89zw**d&C1vl0*~WUg11F8=vZ1r zJeJ!^LYYS@6+fjTh|6~%6USwV#|4f2NS@Rtr&OwhUvvK|g$@ls@W6B;7pgT(ES(yb zcKFccjm+CS%zuXPq+nz|8nICqMHQlr*mKIfiNYs;;U*kyVOTB+w|DVHGOkLFL1tBC z9s+TPL{~^xEDM84Wb@#tf&ot$Ogca$0l>%}N@c6RSJ?q9ZWL#zxf1`68=gtUnXu@i z4OubV5l_O0IL2?#DQG90W zXp9_U9dl~9M)4Y|Ne&;}`yxCo-%2mJV#>d@u0BYVPpVPKjYjC-M!|q7B0B#_p?EhXRpFxFH>Wz94`5s35!&vl zjw7bVPtUn%qBtZj zRQbp#4HB2DoSxe5)lKMu51dK*px}<+HJp#)oGM4s6MQ$PIu3NkYd5|!Ks&cOhPEsG zKQ=QR*re$;UFqCoI6&*%GPPY5b6r^Zm>Wf2K&K9__0>UI2n9@_fpKX{br7(}sKvkr zCH6l(s8dXMXe=w!m=-4j2;`cM@P2NM1Kcov2{sL!LPG$jcx$2=%!q-S$9+E7WOdn| z*5MUng@-mnoY;ZPvvp1v9({uG=|g)quOn1Se6T!%I2&0;h;b(pxWHgMFotuItv%Qm>KqgYSJ+6tKsB$kd3rN0&Aa1sm9GjzmyYEp8L#!3+G+1^u7EZ7nTcO;Z4Y=AR>>=g5ecigk{GqwQJ2qBmtQM%*N^|*> z6;Wr_OrwNT-vy~Ba7^MuiQ^P|344?8DpNJLLYh2WeY- z&^}6vGS>_Urxu3yUvI0lH%_htd~Hoo3a#;ZOfK$!h~%1%;JO zQKU6ZcFzGCa;Sq{h6pv*Q>=`cHA;^uR&gO_NwH!PZd?{3RCBgXtb9PPy__0wP{2tW z9Ej)Y9chOx-HgW8M&ke1G=jnO#e?-wJ3)a)g-1g%+ZmXj`W8PMXl$OqOqp94JYxh8 zXAQ4{WU!DzRT9O&c;7t1mb;<%4Q>+pFdem_Kx37Py{pt3ZDT96lVRpAGHi>~BEyYE zY6u^L4bBOe0mOv4Vms=vR6}?n;tW~58Ir<4S|KUiw9QTEsOHol90TC^T!-Ls=5+yo zIIQL;uo;cf-0WPk8=yjn@)qh_# z%nGRbO{X^_9fL>)2c>i5qt@9dno*PeRfMSV1rfWWN%&=pTaP2v8-%|>NH37YDbWRs zAiY2tEErQN14!WE?&vbH4nV3Pgv&d@m@o$?;**I=gtKnlkcN`*6@;7$R00+ave#JJ ziM&VS#>V3jHIFBY2Ow8-O}o&e6*zsKol$8~-ib9H;0k9_(+siI5}t&h;h)zR#?;M> zJ2*2PIj=z55;AK2CB`v@tSMhGH@R2`%f(9SVRaM}8l}ou=8hr3#%3eINQ6PyiPg`f z+G1s}E*9>$rrTj`AQozq?E!|hDA2#cZID{H4IYU=H{jmDZ3Z`|Hn?IS^f(?&CVfwb z&x(w27G7I_GkI}iG7T%-wwW4aRsRm@DNepPXRBwzd;&cr^td zghFfrh0MfD7boo7wz*98Vq@BcApVQ!N4Cbcx{gCwps7arSh1ZSr@-lnLv!UFp~fO| zTQ|0$O|_k3l4{g^%~(!b`NuGCXl_`&(Ev1a!vX*Y)y3G7-;Pw%b2+bqN@^yI0dYtjTEw+VHWNul{evx8`AJGJ$y3X8+T z%)?6MqwH|H7S1Idvp>e_h2A-}rqrdDty9P(OI_{Kwq(ONhASV-B|>0Dq(G= zT3UZc_7$#Jeh_C!oQ~JF5GMwgN5s;$!wn5VpDqN9CK4Us+|LlwKcvlQOa$M0LA2i5Wbr2+y#fNA>o)7 zZMKad8qIEEUgUi6mxQyHEcb*eRIIU$Ve2%zsfo;3V>!wB%8+DAPuP?a$h3>e161K6 z*;gAElk1H}EE5m?b-2`atvY6>L`9T8PlH65nU7{a$jniB3+(SOWw=TCC7$|tYm096 z*zAkY&)PtMG!UB+$k*fsT%i}aok5tHeYG{l+iONj@XMs%jbc``K4vK$k0oi(A2Z}C zv>{g$kJ`z}*4o+$v^Gdiwq*OZ)1!@!h|EAW(~Ijf+eTEe%F^_+9=bE4jW)>fJAE6R z)z;u-HE2sC@~dXM`%ZMD&1Tnc_OP~QSIc1DY;jy$i}8qfbfriQ{w56DBstJG$1y*^ z5sJG09t!8aLefx!%vc~6_^gx8!3C%(=p-<<_J#orUT zuBlD*p#{&TD#LlIw$UwIhidg|^tEIUqbO?+V?ojSHn`sg2n4NE&2` zh-5O#WPy7RR4}rHgtQ?hV!R4*1^Bb#V>!x3^khR%HrS1xG>cA`85JuPi_S{zA?r|D z)MxjtjEouqww4-v_BmO`tlm!(FA-G|sVHoi4p?zRiZ!zjWR29nE_gS?_DNzrkcj z{z{ofVx)|_rL?vZ?2K1!a2b5~^sn45cyw<5mDAZq5C6)2qW<^u^X4={U`$(d*UwV& zh^NiRS@jvVZM3&_7pY(m4yN$=w$>VSJef+V$kH1xKJ)cRQf4lGV z5BGhZyN%{452(@nv+v{o-S=_sHXhFGA7oK!Fse<~<2jaw<-9I;C)ooAVrH;a#PrD1F z!fStS`VPVs&$vTD`(QWM&Pa>vXT!SZs9AVMaL>C#Mk})i$!=Qezrh`NSjr+)?c0pW zIGz_i?>-+!{T2`3&$AS6I^?(R^PBuA@tfjv!6_s$oX9Y`D&HGk`Yn~U&Ik*yjE01H zzjIGE9Nwxpy8rLp?n56jJC2g$d4YH!S@40|qv6)yyCI3kxnl*Ei>Bwgy=3XLzjyBx zEM;)UV<{T^!;5aSZC)UsPQ*;XGLNOqQ5?w?R8bQ;{5T?(lU-tdUR7M@VS>L5_VN6|B+IPPlPM~=w?LshNu4MMjmOswkmJMt4V53 z3;`(ug5yhxsb?CyQfW%xxt(Z2@yeAQip=Yop<|yFQNJxFzfCJWmGtsj4f@zp#o zSvJ0FW%&5ZRBqCRM9fUb&oui`!m`x`$4&5Z^I{`HpNKoXf3}UGB73R6D_aJE6a9rZUUqj6U5fvY2y61~Ng8NGSX-4zqBBN>7yjfHjCp;n zymkvY)3Wh!2ZmUJ{?SJ`JaWcrV#348e|95A6I`Y>PqPFpL!RS~Gvyz0SciPT#qyis z&OhUmUK5`FGv4Y)!X~e{?TX*|BX)v#9VHExuKL(3E)%uFJccuzaNHFGhK^801r8aY zx2fr86qk9&T^i6cdMRAH&TW@I@4Mj_>!=-jZz#O#hVwE0Rd-75rEB!q<9dv@#1hX> zD;&sSITSKe?{>|rZu8=Ow`mNEt+{`^>h>-s6JBi>KKL3Tcs~foz2^2C_RY7{;8JT) zY?>TASy@u$N5T`Yx!sDY{o6rqnZ`BYbysB|d%f;z<9?N`bPF*D$5-Exiy!644q~d5 z)s~u%fRti;kTe+Ym)1zsXzd0C0mkEzVhVk@bL26 zZin#F-`&vGC=DHGa!TO`H)w!Ld=0by;nva6&TqK|L#PJZsZsQz@zBP^#)OyNa^>QA zKNpZxE@o-Sz0ImV7{<%kW$yRJ2s~E@@(ZF+MczG*b zHFdMU(aL>q$yLLy-yuVH<#+jW#yjrk(334P{@`%iyY7Svxm%+DP(CmXda2*SLbSfI zY>Rg;o8iX~{5$U9<~1;KV)>nKpX49u-2<9Su#GrRsjGj#FPxP2*9~swKUd-R#JR;= zSv_z1UIu}CsnZW9%i_WCmyG{N;c?2XTEgKYk2gstjZLHt-DElCCj$MR5|JLmTvM|1Dv(Nf;;+geC_nS~q@ z7C%vN;q<(Js+H5z&s^VX{W#|*2=T6P{>j#>{dEUS-MXs@fn1y_)|vq5w;*#+7}4Q> z-FjhyUWm$mOc-DA)B3)ZX@G71#QeeGk%HfOdoUoUxaa1AX^-iL)?2sCOpEgtWgb4n z!s)>*p>w+yeMi)r)YKdg3vyJrr{uTThS#&rmNTG2-94PcH;-FfEl!Iv_4qxr(Cl^k;Me9x2{jbB*{rn{@NQ`bl;`;vnz}98k zA^_<0g6i^G-qEkaqO#vK=_|LfzJ6Brr%YNZGOUnT&@dlgdzz#o3y_svT0B`a&ww<5 z(#WR_@S4b#1HjVN;R6Hxc=zH3tRK7axPgAlVt8Hyc*eHp*9ZF3sh>P)kRQFtw+5yM z)vXpJQ7#@aM}mt?AL05_(u2cEgZ#7s1iG+|x*NdghEjfikiS5g&;*bWW}^sc_7Yjd z$|`1P{790Axz$V_MwnJCPm(+=ue^9f`@3eG)>9UaXKKqsd&xp+tIpd7^=tY#LW2Q-6ep9SYtiUGp(8EsYx^w~J2N=>;fqDtd?{Mz405>vc% zE_4j`Q;2NO#(#f0*_$154)DGOz4Q{lR+)MRBjjS*{Hstq#5Sy22rsm^KyWtZqYX4* zY3mlcpjbKhUb)4kx|!j7VgJj)p7S%}+s|N;5c@#I>JY!vWe2%3JK8GrUoylGQO4Id zhWN_XWU(hh6Z{8RR$pz1CN-#&yrODJX%nhbozNaD{cq8qn{@kaIeX%R-Gp7_!g1Yx z@PJ%AZEpOzeb`UvMlk4HSkmn$b>!nOpN`Fgfjrjj_sU}^IgVSyhjR46H^V1~`bi_e zLq$RpUzxUzSVHuM}E-yLQK0cxkB_@AZn7#%NiF7}%OieGf zZGkxka%-t3%hIMFLvwj_VMCbB#^=7xikpZMj@iT?^S{lyEf4dx-Zt9L?s;Ej`|a$W zWtJzzdMy`Q+~xVFBF zZoMSq@xA8^{mUZ;_8IPHhBbf8m3L|Q5%ckXr=@Es@K5IY$BE|=%}69IERHEt8blifMOKh>hURwwwnk^UU_+|Q(3E)83b z^1DLrKRe3nDAj(W{b`63i${CTOkMTdXn#Ode=wJvfQ^*Gx`@7N!&vsF%mo>0GDOm* zGHnKfjP08$)FRQLc_qorF@u3#0ZEe=5|cseg@(z17t%=|b=eI1ypdQ9T5oV)e2q6y z10emej0SyPNX!PU7aC>*Uf_5ky&$tepBECtLGnVKSu`vMypc=ZkmaDy8x(V8*;`#S zOb5I`VJ&qb(?RbG7!MSYE80Tq+*2CA$T&dZZ*X6J*2l3#5;cFo?Lkj?KMaj zO0`i{m07rm^B}b_S&^_v0hR=wk=@atU#-(1jI3s$2v%#yghdJuDAtut*WTb;_ZXS3 z*USz4-WFS8wt+k*($oQpFRhmmaxUTv-aj)DYg)rLggDNzddC#i;NWoC`r>y=t|j@^ARix#F0g`6X7dh0D^KT~#6z-2k+ zKuF}sia!+1NfJDg=dxs{S{bcQDy>=7Ect&G8ejgt@n}M0@t^ZHRfZzUNeN9vO|fG1 zXlb+;!Vf0-?+r>j=TfOO^{sPpJ|>s5d}g?83%^tJyYSO3{O9T~W+UGgDi1;{w#7br zl8>=KDH1sIstgOk$(y(yp~rNxRS?bPKrQ6ZZ{i(7Nb1hLI@y1;bd@+ib7#Zc77pIZAHP@Q^mz?{QCo^bKD{@CdDB~#I=mW1k5e^7Ks`21AA-_V;? z8-#V@saLYQLm-t_n&VKur>6P^aH<2g^PBQ<%69(R7B93ksPWr-S>ESu&u*L(zP3H~ zo2E1*V~~kUjikN7A-jX$WjyCPK;i(M@=zcL7+T9*V;8c3y3oaipRYQ42R|vI;KGt= zRDwDqd}o@U&j2>x(SIJj@Wvhec#blAWJgq)^=$etwA=JEO`HDnIzGaT`Y(WpGW9i$ z`o51*pOlbFW_iu8Z`3#Ye_=MGBsT5TO2Pd%um8uMyrjG)ms0S znIES{%gmo`n)!8ceKWtVLH3(welz&XC1P2;OfzvSgm-rGJ*{j(wzQN7uo>rWgRoQe zE$qItpO9$wq!j9K^7lS+&dz=-4hs6-&VE!`sd(%$tp=Ji;?*B^_D6Dazg_$=K91SN zua5o}Hrv(D;^XtX`YF+yVfn89nds=SXuAK*{yMuOSz@Z|v+pSDYL{4IoLBte!p}3< z%?u6TJnE-)Ne%|PfrEv8sF%a6*q=3!QXEiBURMfX1~zc(l9?Q)%{8{+^3XZMcXPt! zxEcO)oaS)V41Zws)v#`c|Ds+rLeu+VIQav9hiG~D_6OJz%fp!6{GRET*M(zu^J}Aj zgsHpxyV_oYzVN#BHi3tGX8KX}zh%>TOjoL9m+)cXuYyXAzv>6Y?G!ngq3{$kYAv@B zz~fI$I5Gq!4LQxJUM6lZnnHU06Hqcd5UIo)MoTaOMFd+BrVMr_v>S;xnIs)9Bl^2E znrG$?*pm(eUk-;B+Vjk^2*OQl62Fa$;?KK zHc}5n1FuOlzSEp|@Sb_(xhoABl}9U;be^5tY_Eqq64NNDm~eeV44wi8nmV;M;Q%{E zMi8N(;BFft+F@5%DtnmaNO<~?w7{teiT#ZwB8lB z=O@)Aun1Ecl)6pybTHsXil6w793vaK%=BB1 z{5k^8J{pM4Sn?;|O46(cQmg9PnSN#1eon`Z#hVfH07h|5lnS@+9i2dlH5vum{+HaP zG45jVI*bls)`)lz$tsr@t(GYaiI*Q{lyZ7{^tiILq(b zN}DF|sznM54Qg3{T7G_(KL#h}v$Oo+g;(+DNdm;cxc9z(L>&|c*;iD{tvAb!H_K&} zzqJrQM7&B~!mvm~YrzNw>vcD~CTkkr+Zj{24`UjDL%=PsmFpYiOasN423E?a zRtAVOWsEa57?W#bOqLWX#?+P_-(pNic`e4|nv6*o+Zoe1O>H00T2}H21Hi0<15rH@(fq3CZ{1W7At)#Th-hs7KZj-ng$Xv;6q&W+*IsBu3 z3~s7d_lPzND?W-4{8Gpq;vd@dVWWLXm9va?&vJl}Tr_yWJK~#P%^{7vb_gbbAA~6% z^E0=2z??IQV}Yt@#$u3Q&*C{O44D|Md}^Ai%IGpBPC8xoF+X*{jTww8Cgr5#mG5S0 z@s*GHThkA(3)da$hfHnuiImgo6KOMLCs63aE^|CA9Y{AqEs2Uh3V%G*e=k}aZaK_9 z>lU9yW$g0N;lhvm11H7(uxwz`>g*)uU!`{F8g+8Iq!kOON$=T-+)H(w-KmY*b+{jQ zFoiC?o>n6G06t_dfzPGOkAQ%xCC<}bk~+$NLQ&{RzYuMjfnps19m#1$ZO@X$|7|%< z#j993&CGh`G~1$Ys+m?f%{|yq3Es32zwd)>=(;idvT_Q4{sdC;<)PyUKXrVgd}As8 z@%_kg*j(ao{6JHPizLz%t)OD5eDSKIj^O;1=;&4F{1=K%^cDy8`FeCin0%D~@P@#3 z#Zi8zt~M|V@JNmT@()M(hd5?=<){4UmYY|W9|VUAIM`rSd6?YGpYmrzl|d!Ji8A)B zS-0=1_eH2|SKa$*w8|^O(|lMZOe-!)CCtLnezUqNVS=n^-_T)7PUafbFwKWZ)k)v1 zI_cwAma$)Ce&|zm(o=O(`#+_92~(BSbh)&4E|f28+@kKlZqlJClURv{gPp0kN;Wnr z)ZaYXZy$X-ynM8uz+-f-MJKaD<;u>c&g_hNW_uAdlwH_uOApZNY~og8wkpU`tU zCUk(FNcWInEdV4=793~~HbbO>%nGpTYsaERUKW0RETYmaL(~0R-hBs=V$JZRvp|;e zU#j(ob{P#ab1xLdbJiVl{D}Co^JTCWZBoT)3~K#hdiuqZqfzjTr=hGeDc*etdt_?6 zibTo#BWM%|GD}a?d0OTo^{U#=*bQaJ;<$z82vVxJ3mpVcINY0gELBJ>GfGdgItj!P ziSef5h1_)s+qJUPxMHlvH*=?Q0=LFulP`Z69Jj`vH1A`0d%N_Au*24wnd_HF{$EKL zD#cMz^@fbL0bB*Sb`o$P+XPyP9ZWfc(iC$a9FDnMT4|kdA5*G`K^Tur@SF->0;%V5 zV2|gosnc-*AwrLh9WI@Zob5UB<%=B+MHGQaA~Mx9X6t=;o6{g=A5Ij!xI0l3^;<6x zqnL~%i}X<}j+gOpssKx&dgTl%k%5(wd9RkY^%Xk|x9=Pcs+;Dg=p_SXtGJ2TtP`Ne zKVE4`6g^2n64eQZDH^?zB1~VK(-pPXCG%mX$3|#v-SmREQM1G(FSV^AW}H|HIgwdW zc@KMji2hC#Sb6)j|36s6oCb)sQMo}z&hq6&@Qx&Xk^%g|ww8`=h{`XUGX~|VLjGwP z(SaS&_yN9}dyOe4d8<^J)Pmy=?aZ=IGR;&Y90%G>UACJPY{HLOo#>_jhOed8`*4Hi zJJ?zgUy}4B&bK5#sY)ZVK=F>2H&w&oz8ga+#F+)Gcp)A-k0LmgESh?>99C1aa|klY zj?97^qj-OhG9u}##--O=>q|4F{#nj;g5 zyU9;Vcv6U?^|Mm%`l^M(DZY*8Iu{97EU;Y#Om?t17 z$u_A(@>pAHw#ADK&=v- zUaOrU3x0qqiDl^-0kvq4Rc1m98$&@f7HLF)PF!6SqHm6W<3lgKXXy3+#n}H}44vAi zQadvLe(dF{l$QTTU~dhb{B*$1c~liSW&ZzzUDl6m`OoC1NX`_>Kohb?uPg}!ok!cc zmtGM%myTIi(JKP&kuv$j`dLHoNtyXqWYl8iD86LMwOpW!Deb%$sGXI4RK|}d7Q6Cy zB9IOAH`bSpHxV)A0})oYi+0~`f^`j#?bxIU6V!@;3btY$c`rj4!RZQJ7%SpuUMfqP zV2jwk0netUcLJ;1D33OkmO~LzMcRSnifWovt{nwuk3<=vzdBE*`JD`3`wlZLS>#9^ zflA?Sb0sz~DvLDcGYjF8$bD;CH35o>jYDpeu!2FK-32X2zM~8dh1PqGVi3GuOVIl= z2~23Ww`gT_tQ?IuL`49ai{*yB;Q zk18b3V4PVNemmb!Ed0RULEcyvh9B>@o4oAmd|WKwkk~QA_bxYS_k75T*b}!kj1-_$ z7}9N5htrSuvHKQp^()^HwmiWPhJVNWZatQt6My&W@cQw7TX*&^B`ert``52TClJ>F z7Q%1h>DNY7gcGi|)Vz3Tn>8}mv_^I}t&vo3YPUuf5^JQqo2bFcf01K5x4c%^fI%|6 zdx9U@mI9M&GeQ1K-+J=8>-4#AhsmGw+wOG5o7`=l){vICh<=)G z>Zj@WmW$YSirwg=pQd>#elcACIe!FJ?#zk4y2CeL$zia84?JvNAOJ6LK!gzH%URfA zeDyut=a+(rQ}GBzwkFrY^*8k!G<4~;Ni+u=G>z(k`VhOaUxZh`=!buFBa=s2@9nB>buj<5 z+0r(4G>uu6K7NuP(HrsnpS5wNFh zYvCZY2!`xV>Hq2Yq5H57NdI3J)}HJ~?9>Wggm9anI$fL~qM9t+I3p6DNVt278Mp39 z#e_mvPVw6nmR_M2jW--|3bF22hH#3XSV!?p_k!#{vX(d2+Co|yR_BD?<&EA&F68buV?tX-Mjxl z+`_c~oiF>Xa@YPeSIvk0|0_G>l7-*!q4O(#hr&Ia$CXL2YW7$BlzlN<7Kx*};s&7x zXXTXVSk!1He&oKqsWsSSlvGH7j1CZKT#9swAe#6IocPz>tUv%mtDk(uPi;vB{m%3| z4qwOdI}M>GdHUz%1)&NFt&cntj`{3b4G3vrSy*zW-@KUoR#x4z@YtDtXz}-d)eFzq zg;&n>gNrYpqc_&sh5l#xO^R3kT2By9z$@FF<)`kFyn+ObgD5%p0)?N0FLuaq z%vUm&3>wLc%ST%kT5jNir=PmMwH-*+! zuP*XuN72e~(uMxm#O9pCj{M4nerO9P`ziSmS|7;5#coEux znRPt@qT$qwnEL7A`iuPTX{_TfUW7CMvarRK17>wL)esi4yf~bBu^%0ME8MJ)CE=lq zEyQfZB>;7K*#8p0NAZWh%C!J`<0XDg`mD>sF_#kSH86xr{dQ44{PPHjq zXb2WeSbW;&=xsOju!Lc1jMFkl-+AZrpY3auo8? z3TPeAgdYb5N0)9*ezsoG+nj7NSI>f;$ssf7D!X^Ch)Q2y@8L%KY$MrL+qa5W!}z1&xs!iAUn>HU8jApk;AkEVv}AnyIlrlm+>P$J}VLHzcj#^(M6bnX}L$kM5O`jT~UO4VS5 zASb=g%-RR?LCKZbl_418))3_2EPeLZbq*bo)I;aQFaTp|sEOO$i8QntG#%EYoV7%d zB&}`F2i$dvUQHGNRvZ5Wr?oULh%XVmRWY8Y(2bQtfx(*jl`iE*6#q8G)CXdJ=2(+U zY?6WmaJlU{KXk%nX8aY;)EXd(0R1WHtQPod>p$GHp@*3ZS^Ro_nIM}qeg2g!$7SKx zEB%me&DMxgs&q@^3AlSc{Q62irk=D&kX2&2HqcNFxK1J4CY_P5Cow8eMO4f(s&qDS zJ?gv`^ABbN5F#Epr`icrGcuv3q3Ht7m&kK-T1t4!m68os1_We= zFYMjPVZZtKVO9Q4z=L^CXh())&%AK)m45il1PJIC2848c`WhMX8I&Gj_cag(Z-Ztt zkPjNbU|cGFwH=^`UG2xrzRbdcO%O?-ihctgW#ZG)aq=GZ+SNJ&mbDIetwaz5ucYT{ z#n_=mOWL`(wL=zyyJ#$&rvWy^r zZlEHjqj~V^UAAhaiuGuK|?#2t4NcmP$8Bq|Z z5FWmk_(z3P2>`EN>w5-g{+Y_8{#k^SrHL{Z$XK7S#dUs2{f-ED$!3PVT45x7sQw*6 zcpWmzF6Eve!niirAq#<$m{GrcVT#RIJPlb3w{T%p4rtWL+$~r^*P8SqmTOl%GmpgPv>LR7kIm9aYF>{(H^v;E=h|Z##Sd&#{u`9OQ@^qXiu9#TFSDK6IlW3se6BADatjYeuNRxC9~zJOH}& z(_EffF8ts|zxlSg@)bHzqaSl9#*^mPIyL)@E^?wfj+gmlBJAFI33LKtSxuL8Bqe+P zCc6A-n01pMImNo{v_)tD+$U>Nvqg}HMx8bmM)RZZYi=TfcuDy7O@86lHg&eCFfdcT zF#>Ix=$R9Gl3QUbCX5;!A=4ILAc+Xp@EX>Wgvi)c`tX1x?!v-+ z1+8GtNtR5RIH}TQ>oqK~WGq0uRAHUr54ZT8iI$$Q%=bV%XD{>J^(8rib3?KV*c3q8 z)9I^(H4E~+11;6c$zp1RE#w|x*K)enF~2rA$sEb3jLz6fP9NhAGJJpHua+awd6Dd@ zU6KSUV=Lo6q=WC$@ngL=>y4Y~_@|AF*w-neDM`U73P)S09+4;{q7hLaGRlL>$Ft9D zZ}mehVa3!_83~t$Vr1ePLy*C|A16b0V&dcFaO&6m$a+V- zMWcAHD8oOp&HcvPx!>LV%#-FK*7Y|dMsbDw3tT(H{R7O5c?~G zIRAw_u;iAgm1fy?!{DU%xL#_zUb+xwCl4am!!|4Zkg#&OpSlV165BHQ?~`OMHy`og z{@eV}@WJJNn{j=gv4-J%nK*-px%dLk8@&KAJQP>>gS#{slj9N=ZvBO=R?-r^&%%vmCJ~ChPPJuk^R)VAll%&<8SpJgO;3rDc^AR%+=KWh@kd*z|7+u*$9GTnw^nGc`1jX3XoSbUrBme`Ix z{VecG%2Kv;Zqjrzz5lt*59Gl=+~y|_?K7p$Go#Wuy-)7GXZzhFns)_|&aXtJvzx;; zH8a7S&M!x$vuyD+0?DJQ_?Qp(t|YzXh6}6~hm6OD@L=QI1#EAA*|beFggC~#&X1Qi zPYav70Q7)(&F?%TDxGOUP%kTJM^_E24TaGN8^B}~k}1-Y`p6ON7+oe=LIVbo5p`@8 z=tD0`!Rp>+MoO}fF15)*vS_DDUukyGHvQc@Pm4_8L6iDKCBNhjKLS7>_h&eVIy$Y{ zj&-zf5#xNJsax&8)isrrE9Xs}OqI(Y)prTRlzI#1Nku?RQ( z$`DME6ETWJvvr*xQjRlqo-SV{?scxcPjl88B&EGISV0Pz?eodYjYb<6X)$Tr9_ekL z&95uGvSl>2+OPCENdh#AW0NsT2xe||h#rK9=(7g%>|ef`(MX>V9zjQNomxbjQGB{8 zUn6EcQEvg5{-R?Gh<@N&kG0fc>JICY+Iu(`Cnvf^1!;IsjDNFu1Fd^cJ_r=wts)04 zkS)z`U`4|;k~FSu!u_LV9bq75^k`Tvw2Rv)87s)-{G`;!6Ba3#6K?8vR02n?D$v!&$sGgo0{JJiP~3V7~$c$1Uf=_rB#%0^g>7+m9cW3 zaZ#(oQmUaE=E7BX`Wp+mB<4cczUL}GI?TM&Z}%U(xLv{U)pl_>XO-W7ed71xD!&C( zulp{)DUxJ-7lL*^9DJ7_^$A`qHN?%%1b%W_OI63QKP)*01QtFmH56u@L?J0+v1GR! zF#yR^HUyY5u&^W0GI41x^BlHscG%#FmBK#f_UPrg|Ol~zDBhjK+T_hz<8lizffI)3d!?!a5#ugfE42=jmM5w z4J=hy(gW0;_+^6z=CDrt^s zQ%Hf4si!R4p+~D5@CHTBAv=YVhi!6bBFu0`R5JTs zI$upQFDcHQ$$E7*kE+WsA4xZm!3>L$wrDjXM*cbApQRN4^@JzB=WAmSLs$$}LWrS7 zRG?ZFYY@8hT)<7DX&8C8-=ZH)UZDOl(=~yz> z>cr9)n>3!oF#T5BsNc>n*lmnW6viW$6Oa7vohOvwa|v`zCXw6#7-1q|Lcd-5Ce?jngDe$A5Cr(?;-y()UC!qc>{MkddWBHFQ<7z= zN!lD*5Po_u`NC)C<`^z1E^Oj}91(&{sVFEBX?8U-Xo9(sVeYz23v<_H40G)vp{`=S zfRmsk9958)@?>ELcMr&H$Ip zwQLyCd7@S({CPFbWv#lX0O&0=Z8;!g-xeYgHA6&PGeiW7Vta_l*gn4fah0)^XnAey z27UYE<=Y=$8GCAF9KQW}=?i2Zv?pSV%qzU)U$-+t8e?d#(DzI`(^S&RrX z+*hF&6in4cF(jO7B&-!4@FOH8n^@KG-hZTJ{l!B3@dx~ni7Vl_5I}7YcB|r~qWHcu zEt&+okEdB zOR-Mc-nC5xxske;Hj^^$q-a>_co?rUm|EC@g~+~#lRuMmx|DJh-Ac8^+Tj6v9z#W9ohFcwh^$2{amWPx-?IOichX%pEU zR5PYgNMTNV`|D4=`o($d+aEuKrK%Wy|BxSZa4}x?O;`xa2V27COq(o%RXF5N3F2Xl zMIv>j9~21_Y*rry$sV2TL;|~2h);(vn=uCUmz2Oy`~cFB$N>@p^g0c&3Xo_Gn{SO0 zibNBpw66*sq}P4 zubEUR{`S@nC@gVR*nX{wrG<0X`hAP`U?hp97@k|}KQ$ivcXPEqBcYeY;UxBCyo{Jt zrMhh{eCA>1Q`7@C2g5G*-1hKxllm2x$>Ryl)mw`*BCu6O21ka((nAzn#bpFpPEbUm zPupop?5`wmFc;@OD?~?XT|Ogy=8UdWs$&@mwO7<$tzaUvM|Hj`40^=xK2GJtE&boI zZ==qv*1-m>bSWtXkmXv~e@u2nxZ)AmHX+h100s)hwgJEJr?o_C{qYg@VKMZ7)DNCi z8~_zJShGq%+!o41^IJeVwsc&JQ}6#MCQ||vcr%>$s4tiVppC>JRPeoXE+lE$qa^j@ z!>=Aiq0cXQ%nzlnO&;@y4JGVaBs3EX#}^{z0nf3YsTINnkNK&?3hYtNuItzf@D=u* zkBFL?&O$*$!*3p=%0yx2@CrgGV>Fd07fL_$m4hu~?nUCh<8S={+3^K^vz)nSGBL7c zoFvV;_!;;yIbp}LN0Rj`mOgDrszEeS6f&18za4R+^XWhIle5>S`F7_I{r1}>G3e#5 zK%q=sKo&^i$B_YSv6n>(4UfuaHlB#eXYnnJ`w=BNi?}M;J3>18R50x^?4fLFUIJp# zS60)QI|DH(fmIk@g(_7CQwiYl6dt0nAiBiHg9L5umTy0jE1$uBV>4=_^rY`XG?z(1 zH}4Og@k>@06W$cXoH^OP?JUSdgY7RfW4EMNq+tyojWr-3nt;s|Ai0C%)RHHd(Ly7 z^YrIA&bTGRxB@}kLwdGx-rNOR3ykD;-81Qq+g|;lo>V{*bw7AzJUlgV6#p<}$<>I- z(0v1DS{W^;TO!&ip{NT~!OLE2_k1?Jdy{A~(xKCCwOfOMv5ZE~Cnv5NsCaaz55Ku^(p3krMZwqd;05$=@jY(Gk`yxkXxl8q0v3701bU5D*P_wgwSFKJD&a?^dUdt;a1c897 z(_K=i*<#c`uf}o6>FdvNup+x3t6t;WMW4JLZ-krMDO?@OUPQh`t7dpk>2?-ID2RGT z2H=?{T6@bHgENR%jJjR=Tzcrlny^A8ViV&>#Y~PDhyLU|9#{ofv(#LrJd#$xft`3r z<=e7vgaMo{8)6I~UZyKk==OZN^I(yKJmqV1y*N~sTiK&z4&cRIj~<0~Ao%|AvQ+k4 zvWFn+Rd&Yn>7lt(o#VW)Y=EyybrFF>gTIF2B24kN%}s67gGsm%CY3@v7u&9_StUw8 zFa}){nvl0M%%4I0BWqWHax~q1t}C@XC@{xA4%%iO*<~u~qrF*b3G`=Zin=9yRHaoh zT8|9P9sei21x9tE>K*C#vdammOe^Ro=MIl1y+~nun&RSn3$fVWMDujFa_-i5ujp28 zCfMabz<5W+klI|6tZVY~-D*OJQ~?1QRBdF11r{Hih;d!q}gOR*P&cALRmvV znn*`aMIFt|-k`xNxye__lL~U6SqH%}`<;FAg){~*$A8_n$X9IvSgMBl^(SMg;~Cf+ zYg+SSdMY@*|BLAXowO&VP23)|IWF?S!h?8tVQ! z=@`bx?pNFZ`ojQsgbW)&SkD?>!U`&UlE6XiHUN&%ML-t{Np6d|h0i-i%WK+@AmE1# z4x-Z)tgX}%+a3R!-lXj^lyjlHDBa41qE~kQU#Y=yvHkY1>Ha-BFn7^|>=z#X8s?IT zK4d`1erdOUDc!BNBr-H_iROWHLu&XT#+19L1J0OgdMVujPPX`^bb|~xL_mNGP2(z$jesm#qv(5SROy^eK?_HUXqhU^^|Lg0}h+AAcwB5 z`?~We1{5s|Us)FZf16E4S(E3TpOA(aeC@ukr@QYST?NX(E>GdN>WJ}5-atfyCda#S zb6c#=Y(U%txhj`)r+orYF<-@MkBqFl-boNw}|Flu%r9l{c_ZD3jpwH~(o_0q4{FZ> zdeqbvPHc6i+iVukbDlb&^q8^Xx7q&o;y2UTCdwjFt<{CDt!lB&ta7%Q%;89q5=A02 zjPD|J3M0~oZnl*<=3tgokyTwX2a9RCP&!|%)#Lm?R}fS7zC)lN&>EdxiTtYA!frEd z-?zwpVALoWTrUN=>9|V}kuv{cIGy?Bs1&4q6u1F4%Bt(S!}l6q^>-K8@Ik4dCRgccgyN}6a`@Rot44_4lREt-KQ7cDiKhyxDdG0 z=)nTzyww^Au7UmGopg@|1OUC7S2#2%tOHv?p)Bb52W29ZwPXH9fNskE=5Ogf9f7RO zFTzk~yG33q#v)=4di-zc1G}h+<2V#QA+AC8ul=+U7~r_Sr#BULC-BmXCrRRP-9(Wl zWw9gm)_XJ4(SCj{0T@a9#oyDN`nX^d!c-tMQUVo@B;r{X%^{4j1Kv&7wk?FAXatex zBWZVg7guT0p89TjI1(d~KLDANsA*frnI|%U2h&G6Aa(9jhh-lT}ri2dv(k zIWVSDaL(q6R6;p1(4pw-R8U-1xFF{O7eIu5AEXc8st9;Yj`~7y_`K zBaVQNz6L?)ETGd4c=iM6U(%*NOuxPb@5ARe*c%HSU=mxxH<(mL;Yn-(Nn38Zhyd^p zcsQ+?XQz+S{i?Vmy7F#xY5R{@_rRX>QF=VF$$Rp6c+=A`2?A|H4<0DctK$MdYa&{a zD8$@2az~UL#KO;BnXKBo1OSqkr5j~nV$r%Y!Zr>`P(V3UtQxtkM%$vB% zBod>_Q5w1ZxZ-8k+QUCiPi(4|80f-Ct8&D{;Qz^fgbtuEs{L<)X2zp`ITXLBTy2iRY(KhX$qLP0`xy>nz)@&m%Az11hzdk;J0lk|{H zjW|^sbEZQGz+kV|Syg? zn9S_q*tfm&vvj|GP&gwTU{(ZAQS}jZ*O{QQYu(a&j0gje8&U{i5gti9QNTX7P8aGW z@`ae;ZV6pn=_?Pxee~z)E?qH=PY2pjK*H`YfqwC&2`G&y9MJ?4JkI$X(VSh7h8{as zS)jV&^%3%WLVl*B_tV4|&Vx6a4qcXfdQhSkf1pZO6|6MHSWK<6Rs!6tbNdcl77a&> zC8$8yk9a8&+il4_$q#D zSufTn>1A?nIjPb4u-w-nl4%#|x`W{`e?oL@Mv&eJ#7Q0&`ZM%hHY z9JDG+MihP6u;(2(TLV84|LB_YtBPGOD0B@wD2@T>G3(Vj3~27$qG8f`RTe3;Sddy^ zy|wAO+R6x^4}GaKvjj>!gdu8>9kn*S^U$jbz`Y)lfcrLb_Q^~wg{X}aNANiic>u~t zs^KGRA6knkNzv?p!IdJ(BQM&uYtx-lh|9Ccr>*`nJ!X3&#R3@ciE$KCgy@O@#!Ec* zE;K{1CpartHQAN&ad)&6BX6*%m6#4zg@)Krdu67kZdjh^j6#OT)mTmi=B2WrYEDnA zQaa62gsQ6}lTh*5vF=${A2n)u1sZ6KR_sfmKT0w<-pEW&K5ckBC)iz#^$ujx)Fn>{ z9z@Y;+p&32+Ttz}1JuV<_cCSuH51qik2u)D+oVzngghEyrqe#uH(P=!go_{_72(A= zOqTljs_JyycYi!cY*l!6tt;g3@Lzae+z-NkI%ew)Bu8Er+Awd`I?jiis)KC-lnd6GE_{ zjy%YIaOABO8Fcisg`_e~m;VqhZPG*Q6(}sHgpleMlIOc_{*RKu-74gp*p?-ae=8ci z(FwP*s<+X;B+@$4a_E|nH!*tXVU@PmUoe8Bi8u;m*ThgM6mx$y$i%GOATr)5hD~Mn&G%O}@hE3q2N_Jx^kr`t*NFs3n(zqqQmE;|u8_7EuSzOc$ z)~@Uop4_avGA1Nv65X8utTlA{DGruRRPz5-43EJOs-km#KvTBU!mch3&D<4EUgx&fd=}DWt z?qLFQP5_Tna%wZX{xbY(Ti|E!`A2%n7WXsmRuAr?W&S15Q)3Ky(ShEM`Z3+GeJR?2 zCM z3OGFLaj;X=XqBiW=S&UrAH~oc{^dK-yH(K2*9x+vOz4OIlpZi^9ve{zzl^*RTsZo= zB5}0dS`nqp->t6hJr6l)g}ynj>~cRWdSsW=DJc@pS}T+6x2odFCZi5|DT*bt6VuFo zdC@=9L-y9>Fj>0f4A*d9wMR3C0<$0=#?cG$fhaKDK?bS%LsBuK7!_wEb@H+5F7hUk z+;^QRTg~i@f2RB5<(*dGL`%{43n7S08Ro~12rNx#)8Jv5P_;7yWBJOAJiD(S9O#zF zv5KXd*ajhnKtvi3v&v+zRrK*rA~jnOe8V=+>{xQSZ~8N-)t`7=QIB@dpRqapWY7B< zNBmFrj-RRK%<;3#6X)EvRXeyDNQ&a60+_I&HJ+slDh;mfDeH*-`pKg3)%W;G_ERJQ z8WV=*LNs`x+=PfJ3A>+XjWc|uOHW?M`yKiRoiE#y3u3* zT0EY;w|MbkX1F2#gD(JgfR=im@+^90*5sb zl}_4e>j;{PX28c7&+MILcWbd38S{a1+M7JmQIhrp&&X($_09I)^>$yM03?hsLiq(A zkPqx_Q-Y3hFZ-Fj+Bf~(J;uR3thDZ41;;CZno0Y;?>ZbBH+_%>;-n(OC3xelK8O|1 z-i#|wmHUL7$fgiHz9ZRXZ_#~r$yst`W2*+|Z}wdV5#Ak!fcy@I2|IPeb>dfIk&jdo zKt-&CoP4f`CK)f#Ci_a<^k7!s$IYO&H^>RX2qBn5H8aW|FwHJDmp3UpRf)HuwysN#F;{?d|&fN!r zbp+GLd?13{(!R5dV7LbLfHQFnC_Z32Bu!)}AMITxibHWQ7)Ad{T}Q<(#{$;i@9)MX zg@-D9Sf%eu*nX&udC=}aKOL{%t-G~+<&}*O4SksUm70ceF1*g^B zTJ&h&$lfSU$27fJF24%G)-^=Ko|u_j+WS|gOo#nxSV#!iF0*~{7N}ByMIPn09=1l; zCQ4(V5oNnw=#W#WAO&h8`9piQF2JPsHZdihintKf*RjG(OM=Lt_UsB%--&67Eds@{ z#Aq;a7X_BI*HxH);M#K)W|Jz%*g1#`oX9?5Z%vy{0}E-6@k!csdU{;mNA~6UWR9FG zDEF*9i5S#fTa~Y}+ow$zugV^lHiK)c!gaBu!s?1ZiubXuBGCv6N`%; zcXv)$KvJ?s1-~I=fw2X4T&4N7_k>+hX@T6`?h~;`K4>y~Z#2RVFtmde+SqwBbo!(7-5i^;;|J zN7)|(M2<&DfhX6c%Ji4%uNWw(RYBW#)Dgd!kL?-#Bs%;}Hg*?$;gYi9RrD;{3u_Z(>JEPk4XzvzuyC}mJcsiPGFRC^J@CZFpZTd~P zRq*wrZIY;(Vf(B8gFKR1A5OP4{ZnD27&#=uzy!z=n;q6?4!mmWgG!gC;hdQ$c-l zrmXppGwq@_Id@L5L_qx&OvHQJ42+Fs&xc;FjT>i$%dM-C+L&nv6&3PuH3XsW^WN-GwFXac=U$r$|%W6lKX9Ey_o_5&)Wrfl7o24sQ zQwp^s|NCqJCPwzbVf0ui9$6uv=p;9Mj?nCIRfSCIPRvAAZ_Ez&^(!6{jUwMhXP!i` z!YazX#-2tfMpc-eR98bU9gwmdNEan?op77`lu`I~JJYf63av&u*Ga^idy#N?CyT`b zDekML4$l|?C(GKIzSVF~X}`h;Jd^gFcBXTwI^ci1F8^Uo-063%b2e1h62dAZi&ZK! z52zJ@hP5oJ$5>{?Dy1CJD9#rD_9LRxS0H8o@EnZ zE2fIL+dzmg7+l-9Ak=vFE;Vf<-%fk!0&Q5&`6yP+x(o(I0t6HyuDkA?1^0)vg=hU= zw0e!N``;Slw3`W01MQ?r(r+%vK5LKbXnK%UfM9{9J*8?(sN2ZQmPLYUZ|!J0?$j(e zZr#{aSFh16jm~Gz-kr?OOOOCAHb@x2P(QOXT-JTd>hLd7wULehW=1<12FF8@r`W1a zrV(XxYA4fPmT4d&Rr4PE>rSRuZE-N8WR)J38D1LAjh#%FE`Pu%u`L6I(v6B0SPO>= zhF9NV-|S=t*4&%qwIZHThM=wP44aBncVgTSt4iHXsWn5Jzz>OgzNn@M9OFQT4cxBf zKeSgDKA)2y?eb@~*35EF@v;2NTYpLI&j=!iF^?CQ>@Q|;|Qdbq|W*h5@g4O0{{yRNf2w5bw87G@(; zUj|U4kf}3j!@wxODJ^i}dcIOQ>=dO4vqvMRBk57DujMX6ib8A{zhXA!=<+0%I4A)J zrvesbZMQQr!zx|+vb$51cBNuAu*IQORB9nmHSDHm1Tm7yX0=J*Bh2-<~CtfTjk?fl8ragPB{yKOhs-H@XvD3neV?$D(Ftdj);EM)X^%J17 z%2^O4x0B6}^i8x=9w!u0E0Ic`?^I?+B44~BT=pf*;{|fT^Gx;dA)nH)$$@q6?{{bIxFP3X=_ z*T=`aBcm}`AeF+Z3qU5T*H`mTj$f55MlNVW1Lw4kl-v&mgg*%!1Q8XpV_Jjb?MQut zn6_y^Lr;XYb8-n=`Es($E_gE#ACO?ELf`^!eBwF;5}>1hld%0d;GihUort+iRdryQ zv)Fx7)WK;vw$!RRWcEb~bj8y`s)^?Cv`|TLFA14IQ9TktszY z(A=EqP;nLt0mfjvY4>=&U6nIwXxtMylOKxA7t1M4IRd}LBOq4h9d@?CWxSEKV%5Z= zojco(tuw)3>?STS*?FCLPPaqiTX`FuhzqT9sL6eHd9__N+3)P80L5}&H??he9gTSQtjPPAvu*OG!!NX)L`z|L?uB_ z#vafMIuI|o!kiI+;{!Al?I1$I91gHhtRbF>NU4d|0X}m!fu&Vhr$I8V7C8xdYpC;| zK@mUo!cJjZr-0&5>?*t!DXx#GWt(=e`(2eAS{E5CHszHC<9W;O6$g&UF9RdCr94R> zS*RwUK(W^1!=!pMs^KhWCM(*1?~$Z5JX$7L3P8ao$7(_|Z>q;X4<}67@9NF<97nvg zx0&bNVSD#6{i@brWe9dQy(nCad078IA*UeOn8-2L|6zGi@noD$1RK-~H}Oc{_FtS6i` z=y8#dd8c9xdbC7LR<$N3Dzu9&XpoZ^vKwF#m3XF9(eVb@1)LbGlAIkn%F5wV_*3?` z4Q2#21(r9Mj)a2$xxw@`?i_Cz#A)`s2D4Qss)v9CqheGI1gxSnWlW3J9bP$v+S{P*rVGKN+lEmTM49-MOVi+W) z5FnNc>-A7%OV|2Grg-fvXDjD*m}6a8QE0pR{8#4k!3x>DTPyvA%%m$yYreeonycC} zYd*j}nKbnSf(y@4qmNn38kI&fEl!GAQP zyBZ8smUjERE2ar{71-eFD@DHu|D8n)a3S!@ElFf%ag)z3Z(?ggaKU!WGZVm0M zBLNh~N!9^!)Qz4vhAS?yNgR(+f8@on1I_#-ft;ND{Mnhx)-4HT9}F`65KQ!RuAUW*8bY2BUle{c!Z9sJFoe}vXOMPeALJA%*Dk#m z?Bg}qsyGE2RqZI;JkEq&?$crK7sn_b>DX`dx;ByhdJr~XnH!I-3+&RtX0w!nAEu4?A zfGw)6!%HJ^7|X88-^a7>dv5PWa(aTruB1iIw~r4o8Bt=#QZpQa^auOS5YwTOONvhQ zq?dY|8WsKNxT&chU2IC=Xf{%1dljgOv-#@n3V+7Z3>D=Sup>@u&l?rpK4w$1X&02S zZbf#?YXLIk2*SXsuiDh?-FCjKmz48o=V>Vkx6%&U%na{Ysmf4^@bTzOTirlJLf=P` zbVPREW@a)#V3X8k>K(lzW;nvnLI^!S|M-<%yBX?3$_AU8ZpwGS%|6H*iggS4(WkDU z;QYak-Q3h?WG)VqM~9cEvk%xKH#YMk+RzlWiDUX zLx#d|llE*rw*JX!_T*L}5vyh+D9U^y-?<|@+^U7ky8;L~{1ncS4ylnNJ!wA~YE*8e zVhgj$Wal|YRsouftZ34%nOnNo)huvm?4`MJJr!R@=w~rY~G=g zv{ZiRW++RcWU`jK2#DOROe z!zN_S(yB#jwL1>giFtmwR)s1-mo%kTj|SLDd;Ty=)h6wO!_3?cE%e8&DP%(G?=Hhl zei$4T^Pe}XIu%pArU&WfofHcj?2$2|Evlbl1qHaUbRf{O;bwEl5L-y&Wqt^Uk@Es9 zi@KcPmQ?qhZc8C6jA)LogT>thj`gE5+B@t2Z(0>`yYh_v0Uw08sQtihy&OS7c z2$lm18X?NJB+Ejaj=qxZWao`A19uZ5#K&?U6G6A^11yc02z!+;IgCoYQ&*Xtx}i}* z1qKiaSxZ!1eHAcDuN)P_tCO-7Bh7?%ZeMoI^eCH=Jz%7xD#wmAd$AvH#fgY~_{m5^ zNe0_ylxe8N*`4W*+TbQufP^zNO&eu8BVf)NW%~B4%tqLm=xXXD&f{FGpXGT-B}&{ph`G?_LNliQQ4(i z(8mtml6_riCvRzvuYHQ3B5VM4Jed&ZC(I5}i%t5*mZql;ql*Bq!Db4!RcBJ;eJ(zR z5)VqTq56V5lO@gZPuUOQa!k-48--5O|0)m#BT{&_O>*L&JESd^eMCTFBR~UoC7+n7 zuU9!gXHVG5WH>XxopyjFORPPe{fO>ikbC8in$XC5$e zpvf_r1Vm-J7Ir2^0l`Xf(HeF%G|4To@XCv1<5ORJgm=hgC_8g=mt08*FX5^-aLvx!iiV{lK*C-De<%ftFynVKYvi_ABH z6Cp~#qL5+uLivdDkmS}iY>4^mrLq;ZuEaSykF0)6Js$k_HidI6ManHCTDepjqy-s8 z+!oSf;9YuPY#(vP32YZP0#H%-SXv#J&xXqbSL7n^Ne;8Ojxk9#>78TD(C*q(RiQIK zGY{y>QKGF{dIV#e8f$v>dC~`jIRNG&Oj$`;sA=3j?`jwd&%}Cm9BcCRKPVx+=P$HX zwZo`oV5>%&fddG-qZjp4AZFmLc1(o4pg!Z>C*-h8L@4|DSaa<9N>;fSb>mM3zdkg% z-Ue0@6%Y~xwKIu;V<6bCB>EWb#JK$|#PMg?*=aWR_lyHLO~}QM(*CBR6Q_+jEq2)MMlo1tKm8rIkUg)TxD~!yGMf>sr5ReZ8-35lvw!;d( ziU{H_;fA>&kE#<3|5RZ6c)p~4{A z@uoW;6ULh!y9df0>4sWbf6vIcjKekIOPXn#nP$~<5MmtZ7L6;dXw$vgJmby^-1f=P!Yuxdu+h`8e0gsy8% zkcqVqSq6>yXH;hj>+mR#tDpg-oZRl1Se3CaPcU`0oW&du=X$bq$MO7uFfDKD)FC-> zW@SFUEZ=ZqUST*m^hp4+TTL`w`pSjDOVUIA<94me$Wd@zK49on(ySFD$x151D{}Hg zQ=g3r#iLWpQzRmI`$W??{83mG-Uj~9#f4x(>B6ZOG6XqUAyl{lvxNM{ibLCElA;F+ z!DY}+#L#3Sj(CT-E(Bsm={bOUE~mza>0^%`9ZTWH$ex8`^IzOgl;7VnhECj=E;ipX z=C}Uo>1R{R?U-i7_yrJoMm88QSF0z15ITU-$&3szVg_7_B6^~;*Rdlo>8L9ps#-3^ z-ijUF3yx+_7<@)sZhW84rwqhqsV1G8?dG|p^4OD(rHCaJP-r1 zy+lcp_L1$(mQ9XcXx@NG8!Jo``MP#pT#G8+hIJvyHi^hd;dNqmT60ko#oc6(gd@^5 z$jhU(0GYPh06Mk-up;g_Nk!zY4wOj+g3(+D=4Oi`p7h@Osh@s>H^WnViuv&Xcb892v)!^7uJK|Cpz|EAf~=NArf!WR$= zAH7Z@%7RElxe)%7A&4j0mr8{j*(jd%3;`^Dl+T@DN6n`YmTZOB9CtebX zS@hf@a^oHy=66;3Xg*awnrrF2YDjC{fUVtXd!kE7WoZLVmJ^p8`J5Sm$<*b1ATv9< zLEnm#Qx%dw5gA)(JAehLhTvgS8|J3X02#^@`SrN!>Q?JxTy)b5Pn(;X3>aBDzB4+%-$5iywy-@$CVtpjtx#)OfFTlIN( zq$3WK)JBAhKj83YJXLTp@$!?!fxoh?aRgVvhFFR`ahrTY;!5NCD}^VDFR4y`H(Cae?_;0vjT?$j<^&E1-W1?R*q_6ql)Py-T$m}T*Y!qxR#Hf-;x z(3=z90_#NXqq~for5lnfq$9%0D4dON6$qPjOFNf5UN=%PF?FKsQYw}7)^&teFmQ78 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%0As=7M%+EdG{(sGN;Zd?hS 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

-V0QZo{9D4iZ{17Tg@)2nFH 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 asf*SS{2r00Q@Ch@ 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 RY0&HY|FggR*a5NT{{cY^jw}EG diff --git a/vendor/github.com/ncruces/go-sqlite3/go.work.sum b/vendor/github.com/ncruces/go-sqlite3/go.work.sum index 5a6f903504..27b395cc71 100644 --- a/vendor/github.com/ncruces/go-sqlite3/go.work.sum +++ b/vendor/github.com/ncruces/go-sqlite3/go.work.sum @@ -1,8 +1,7 @@ -golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_other.go b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_other.go new file mode 100644 index 0000000000..ded8da1087 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_other.go @@ -0,0 +1,9 @@ +//go:build !(unix || windows) || sqlite3_nosys + +package alloc + +import "github.com/tetratelabs/wazero/experimental" + +func Virtual(cap, max uint64) experimental.LinearMemory { + return Slice(cap, max) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_slice.go b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_slice.go new file mode 100644 index 0000000000..5072ca9c18 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_slice.go @@ -0,0 +1,24 @@ +//go:build !(darwin || linux) || !(amd64 || arm64 || riscv64) || sqlite3_noshm || sqlite3_nosys + +package alloc + +import "github.com/tetratelabs/wazero/experimental" + +func Slice(cap, _ uint64) experimental.LinearMemory { + return &sliceMemory{make([]byte, 0, cap)} +} + +type sliceMemory struct { + buf []byte +} + +func (b *sliceMemory) Free() {} + +func (b *sliceMemory) Reallocate(size uint64) []byte { + if cap := uint64(cap(b.buf)); size > cap { + b.buf = append(b.buf[:cap], make([]byte, size-cap)...) + } else { + b.buf = b.buf[:size] + } + return b.buf +} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/alloc.go b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_unix.go similarity index 79% rename from vendor/github.com/ncruces/go-sqlite3/internal/util/alloc.go rename to vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_unix.go index 23c5382375..39a3a38ccf 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/alloc.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_unix.go @@ -1,6 +1,6 @@ -//go:build unix +//go:build unix && !sqlite3_nosys -package util +package alloc import ( "math" @@ -9,30 +9,24 @@ import ( "golang.org/x/sys/unix" ) -func mmappedAllocator(cap, max uint64) experimental.LinearMemory { +func Virtual(_, max uint64) experimental.LinearMemory { // Round up to the page size. rnd := uint64(unix.Getpagesize() - 1) max = (max + rnd) &^ rnd - cap = (cap + rnd) &^ rnd if max > math.MaxInt { // This ensures int(max) overflows to a negative value, // and unix.Mmap returns EINVAL. max = math.MaxUint64 } + // Reserve max bytes of address space, to ensure we won't need to move it. // A protected, private, anonymous mapping should not commit memory. b, err := unix.Mmap(-1, 0, int(max), unix.PROT_NONE, unix.MAP_PRIVATE|unix.MAP_ANON) if err != nil { panic(err) } - // Commit the initial cap bytes of memory. - err = unix.Mprotect(b[:cap], unix.PROT_READ|unix.PROT_WRITE) - if err != nil { - unix.Munmap(b) - panic(err) - } - return &mmappedMemory{buf: b[:cap]} + return &mmappedMemory{buf: b[:0]} } // The slice covers the entire mmapped memory: @@ -43,7 +37,9 @@ type mmappedMemory struct { } func (m *mmappedMemory) Reallocate(size uint64) []byte { - if com := uint64(len(m.buf)); com < size { + com := uint64(len(m.buf)) + res := uint64(cap(m.buf)) + if com < size && size < res { // Round up to the page size. rnd := uint64(unix.Getpagesize() - 1) new := (size + rnd) &^ rnd diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_windows.go b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_windows.go new file mode 100644 index 0000000000..27d875f2e3 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_windows.go @@ -0,0 +1,76 @@ +//go:build !sqlite3_nosys + +package alloc + +import ( + "math" + "reflect" + "unsafe" + + "github.com/tetratelabs/wazero/experimental" + "golang.org/x/sys/windows" +) + +func Virtual(_, max uint64) experimental.LinearMemory { + // Round up to the page size. + rnd := uint64(windows.Getpagesize() - 1) + max = (max + rnd) &^ rnd + + if max > math.MaxInt { + // This ensures uintptr(max) overflows to a large value, + // and windows.VirtualAlloc returns an error. + max = math.MaxUint64 + } + + // Reserve max bytes of address space, to ensure we won't need to move it. + // This does not commit memory. + r, err := windows.VirtualAlloc(0, uintptr(max), windows.MEM_RESERVE, windows.PAGE_READWRITE) + if err != nil { + panic(err) + } + + mem := virtualMemory{addr: r} + // SliceHeader, although deprecated, avoids a go vet warning. + sh := (*reflect.SliceHeader)(unsafe.Pointer(&mem.buf)) + sh.Cap = int(max) + sh.Data = r + return &mem +} + +// The slice covers the entire mmapped memory: +// - len(buf) is the already committed memory, +// - cap(buf) is the reserved address space. +type virtualMemory struct { + buf []byte + addr uintptr +} + +func (m *virtualMemory) Reallocate(size uint64) []byte { + com := uint64(len(m.buf)) + res := uint64(cap(m.buf)) + if com < size && size < res { + // Round up to the page size. + rnd := uint64(windows.Getpagesize() - 1) + new := (size + rnd) &^ rnd + + // Commit additional memory up to new bytes. + _, err := windows.VirtualAlloc(m.addr, uintptr(new), windows.MEM_COMMIT, windows.PAGE_READWRITE) + if err != nil { + panic(err) + } + + // Update committed memory. + m.buf = m.buf[:new] + } + // Limit returned capacity because bytes beyond + // len(m.buf) have not yet been committed. + return m.buf[:size:len(m.buf)] +} + +func (m *virtualMemory) Free() { + err := windows.VirtualFree(m.addr, 0, windows.MEM_RELEASE) + if err != nil { + panic(err) + } + m.addr = 0 +} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/const.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/const.go index 86bb9749db..5e89018ddf 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/const.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/const.go @@ -1,6 +1,6 @@ package util -// https://sqlite.com/matrix/rescode.html +// https://sqlite.com/rescode.html const ( OK = 0 /* Successful result */ diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go index c0ba38cf05..7f6849a429 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go @@ -26,7 +26,7 @@ func (j JSON) Scan(value any) error { buf = v.AppendFormat(buf, time.RFC3339Nano) buf = append(buf, '"') case nil: - buf = append(buf, "null"...) + buf = []byte("null") default: panic(AssertErr()) } diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap.go index 26f30beaa8..a4fa2a25aa 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap.go @@ -1,4 +1,4 @@ -//go:build (darwin || linux) && (amd64 || arm64 || riscv64) && !(sqlite3_flock || sqlite3_noshm || sqlite3_nosys) +//go:build unix && (amd64 || arm64 || riscv64) && !(sqlite3_noshm || sqlite3_nosys) package util @@ -7,14 +7,15 @@ import ( "os" "unsafe" + "github.com/ncruces/go-sqlite3/internal/alloc" "github.com/tetratelabs/wazero/api" "github.com/tetratelabs/wazero/experimental" "golang.org/x/sys/unix" ) -func withMmappedAllocator(ctx context.Context) context.Context { +func withAllocator(ctx context.Context) context.Context { return experimental.WithMemoryAllocator(ctx, - experimental.MemoryAllocatorFunc(mmappedAllocator)) + experimental.MemoryAllocatorFunc(alloc.Virtual)) } type mmapState struct { diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_other.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_other.go index 89631e0939..a0a3ba67d4 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_other.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_other.go @@ -1,11 +1,22 @@ -//go:build !(darwin || linux) || !(amd64 || arm64 || riscv64) || sqlite3_flock || sqlite3_noshm || sqlite3_nosys +//go:build !unix || !(amd64 || arm64 || riscv64) || sqlite3_noshm || sqlite3_nosys package util -import "context" +import ( + "context" + + "github.com/ncruces/go-sqlite3/internal/alloc" + "github.com/tetratelabs/wazero/experimental" +) type mmapState struct{} -func withMmappedAllocator(ctx context.Context) context.Context { - return ctx +func withAllocator(ctx context.Context) context.Context { + return experimental.WithMemoryAllocator(ctx, + experimental.MemoryAllocatorFunc(func(cap, max uint64) experimental.LinearMemory { + if cap == max { + return alloc.Virtual(cap, max) + } + return alloc.Slice(cap, max) + })) } diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/module.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/module.go index 20b17b2097..22793e972e 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/module.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/module.go @@ -14,7 +14,7 @@ type moduleState struct { func NewContext(ctx context.Context) context.Context { state := new(moduleState) - ctx = withMmappedAllocator(ctx) + ctx = withAllocator(ctx) ctx = experimental.WithCloseNotifier(ctx, state) ctx = context.WithValue(ctx, moduleKey{}, state) return ctx diff --git a/vendor/github.com/ncruces/go-sqlite3/json.go b/vendor/github.com/ncruces/go-sqlite3/json.go index 9b2565e87c..2b762c092f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/json.go +++ b/vendor/github.com/ncruces/go-sqlite3/json.go @@ -5,7 +5,8 @@ import "github.com/ncruces/go-sqlite3/internal/util" // JSON returns a value that can be used as an argument to // [database/sql.DB.Exec], [database/sql.Row.Scan] and similar methods to // store value as JSON, or decode JSON into value. -// JSON should NOT be used with [BindJSON] or [ResultJSON]. +// JSON should NOT be used with [Stmt.BindJSON], [Stmt.ColumnJSON], +// [Value.JSON], or [Context.ResultJSON]. func JSON(value any) any { return util.JSON{Value: value} } diff --git a/vendor/github.com/ncruces/go-sqlite3/pointer.go b/vendor/github.com/ncruces/go-sqlite3/pointer.go index 611c1528ce..0e2418b992 100644 --- a/vendor/github.com/ncruces/go-sqlite3/pointer.go +++ b/vendor/github.com/ncruces/go-sqlite3/pointer.go @@ -4,7 +4,8 @@ import "github.com/ncruces/go-sqlite3/internal/util" // Pointer returns a pointer to a value that can be used as an argument to // [database/sql.DB.Exec] and similar methods. -// Pointer should NOT be used with [BindPointer] or [ResultPointer]. +// Pointer should NOT be used with [Stmt.BindPointer], +// [Value.Pointer], or [Context.ResultPointer]. // // https://sqlite.org/bindptr.html func Pointer[T any](value T) any { diff --git a/vendor/github.com/ncruces/go-sqlite3/sqlite.go b/vendor/github.com/ncruces/go-sqlite3/sqlite.go index a446ec0d1e..61a03652fd 100644 --- a/vendor/github.com/ncruces/go-sqlite3/sqlite.go +++ b/vendor/github.com/ncruces/go-sqlite3/sqlite.go @@ -28,6 +28,14 @@ var ( RuntimeConfig wazero.RuntimeConfig ) +// Initialize decodes and compiles the SQLite Wasm binary. +// This is called implicitly when the first connection is openned, +// but is potentially slow, so you may want to call it at a more convenient time. +func Initialize() error { + instance.once.Do(compileSQLite) + return instance.err +} + var instance struct { runtime wazero.Runtime compiled wazero.CompiledModule @@ -79,9 +87,8 @@ type sqlite struct { } func instantiateSQLite() (sqlt *sqlite, err error) { - instance.once.Do(compileSQLite) - if instance.err != nil { - return nil, instance.err + if err := Initialize(); err != nil { + return nil, err } sqlt = new(sqlite) @@ -289,8 +296,9 @@ func (a *arena) string(s string) uint32 { } func exportCallbacks(env wazero.HostModuleBuilder) wazero.HostModuleBuilder { - util.ExportFuncIII(env, "go_busy_handler", busyCallback) util.ExportFuncII(env, "go_progress_handler", progressCallback) + util.ExportFuncIIII(env, "go_busy_timeout", timeoutCallback) + util.ExportFuncIII(env, "go_busy_handler", busyCallback) util.ExportFuncII(env, "go_commit_hook", commitCallback) util.ExportFuncVI(env, "go_rollback_hook", rollbackCallback) util.ExportFuncVIIIIJ(env, "go_update_hook", updateCallback) diff --git a/vendor/github.com/ncruces/go-sqlite3/stmt.go b/vendor/github.com/ncruces/go-sqlite3/stmt.go index fc26b1e95e..381a7d06ba 100644 --- a/vendor/github.com/ncruces/go-sqlite3/stmt.go +++ b/vendor/github.com/ncruces/go-sqlite3/stmt.go @@ -367,12 +367,10 @@ func (s *Stmt) ColumnCount() int { func (s *Stmt) ColumnName(col int) string { r := s.c.call("sqlite3_column_name", uint64(s.handle), uint64(col)) - - ptr := uint32(r) - if ptr == 0 { + if r == 0 { panic(util.OOMErr) } - return util.ReadString(s.c.mod, ptr, _MAX_NAME) + return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) } // ColumnType returns the initial [Datatype] of the result column. @@ -398,15 +396,57 @@ func (s *Stmt) ColumnDeclType(col int) string { return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) } +// ColumnDatabaseName returns the name of the database +// that is the origin of a particular result column. +// The leftmost column of the result set has the index 0. +// +// https://sqlite.org/c3ref/column_database_name.html +func (s *Stmt) ColumnDatabaseName(col int) string { + r := s.c.call("sqlite3_column_database_name", + uint64(s.handle), uint64(col)) + if r == 0 { + return "" + } + return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) +} + +// ColumnTableName returns the name of the table +// that is the origin of a particular result column. +// The leftmost column of the result set has the index 0. +// +// https://sqlite.org/c3ref/column_database_name.html +func (s *Stmt) ColumnTableName(col int) string { + r := s.c.call("sqlite3_column_table_name", + uint64(s.handle), uint64(col)) + if r == 0 { + return "" + } + return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) +} + +// ColumnOriginName returns the name of the table column +// that is the origin of a particular result column. +// The leftmost column of the result set has the index 0. +// +// https://sqlite.org/c3ref/column_database_name.html +func (s *Stmt) ColumnOriginName(col int) string { + r := s.c.call("sqlite3_column_origin_name", + uint64(s.handle), uint64(col)) + if r == 0 { + return "" + } + return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) +} + // ColumnBool returns the value of the result column as a bool. // The leftmost column of the result set has the index 0. // SQLite does not have a separate boolean storage class. -// Instead, boolean values are retrieved as integers, +// Instead, boolean values are retrieved as numbers, // with 0 converted to false and any other value to true. // // https://sqlite.org/c3ref/column_blob.html func (s *Stmt) ColumnBool(col int) bool { - return s.ColumnInt64(col) != 0 + return s.ColumnFloat(col) != 0 } // ColumnInt returns the value of the result column as an int. @@ -524,7 +564,7 @@ func (s *Stmt) ColumnJSON(col int, ptr any) error { var data []byte switch s.ColumnType(col) { case NULL: - data = append(data, "null"...) + data = []byte("null") case TEXT: data = s.ColumnRawText(col) case BLOB: diff --git a/vendor/github.com/ncruces/go-sqlite3/time.go b/vendor/github.com/ncruces/go-sqlite3/time.go index a14870ea54..0164a307b6 100644 --- a/vendor/github.com/ncruces/go-sqlite3/time.go +++ b/vendor/github.com/ncruces/go-sqlite3/time.go @@ -101,7 +101,7 @@ func (f TimeFormat) Encode(t time.Time) any { return t.UnixMicro() case TimeFormatUnixNano: return t.UnixNano() - // Special formats + // Special formats. case TimeFormatDefault, TimeFormatAuto: f = time.RFC3339Nano // SQLite assumes UTC if unspecified. @@ -139,7 +139,7 @@ func (f TimeFormat) Encode(t time.Time) any { // https://sqlite.org/lang_datefunc.html func (f TimeFormat) Decode(v any) (time.Time, error) { switch f { - // Numeric formats + // Numeric formats. case TimeFormatJulianDay: switch v := v.(type) { case string: @@ -183,7 +183,7 @@ func (f TimeFormat) Decode(v any) (time.Time, error) { case float64: return time.UnixMilli(int64(math.Floor(v))).UTC(), nil case int64: - return time.UnixMilli(int64(v)).UTC(), nil + return time.UnixMilli(v).UTC(), nil default: return time.Time{}, util.TimeErr } @@ -200,7 +200,7 @@ func (f TimeFormat) Decode(v any) (time.Time, error) { case float64: return time.UnixMicro(int64(math.Floor(v))).UTC(), nil case int64: - return time.UnixMicro(int64(v)).UTC(), nil + return time.UnixMicro(v).UTC(), nil default: return time.Time{}, util.TimeErr } @@ -217,12 +217,12 @@ func (f TimeFormat) Decode(v any) (time.Time, error) { case float64: return time.Unix(0, int64(math.Floor(v))).UTC(), nil case int64: - return time.Unix(0, int64(v)).UTC(), nil + return time.Unix(0, v).UTC(), nil default: return time.Time{}, util.TimeErr } - // Special formats + // Special formats. case TimeFormatAuto: switch s := v.(type) { case string: diff --git a/vendor/github.com/ncruces/go-sqlite3/value.go b/vendor/github.com/ncruces/go-sqlite3/value.go index 61d3cbf709..1894ff4f10 100644 --- a/vendor/github.com/ncruces/go-sqlite3/value.go +++ b/vendor/github.com/ncruces/go-sqlite3/value.go @@ -68,12 +68,12 @@ func (v Value) NumericType() Datatype { // Bool returns the value as a bool. // SQLite does not have a separate boolean storage class. -// Instead, boolean values are retrieved as integers, +// Instead, boolean values are retrieved as numbers, // with 0 converted to false and any other value to true. // // https://sqlite.org/c3ref/value_blob.html func (v Value) Bool() bool { - return v.Int64() != 0 + return v.Float() != 0 } // Int returns the value as an int. @@ -177,7 +177,7 @@ func (v Value) JSON(ptr any) error { var data []byte switch v.Type() { case NULL: - data = append(data, "null"...) + data = []byte("null") case TEXT: data = v.RawText() case BLOB: diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/README.md b/vendor/github.com/ncruces/go-sqlite3/vfs/README.md index 212ad6d335..741a1b6a49 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/README.md @@ -2,15 +2,14 @@ This package implements the SQLite [OS Interface](https://sqlite.org/vfs.html) (aka VFS). -It replaces the default SQLite VFS with a **pure Go** implementation. - -It also exposes [interfaces](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs#VFS) +It replaces the default SQLite VFS with a **pure Go** implementation, +and exposes [interfaces](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs#VFS) that should allow you to implement your own custom VFSes. Since it is a from scratch reimplementation, there are naturally some ways it deviates from the original. -The main differences are [file locking](#file-locking) and [WAL mode](write-ahead-logging) support. +The main differences are [file locking](#file-locking) and [WAL mode](#write-ahead-logging) support. ### File Locking @@ -22,58 +21,72 @@ On Linux and macOS, this module uses to synchronize access to database files. OFD locks are fully compatible with POSIX advisory locks. -On BSD Unixes, this module uses -[BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2). -On BSD, these locks are fully compatible with POSIX advisory locks. -However, concurrency is reduced with BSD locks -(`BEGIN IMMEDIATE` behaves the same as `BEGIN EXCLUSIVE`). +This module can also use +[BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2), +albeit with reduced concurrency (`BEGIN IMMEDIATE` behaves like `BEGIN EXCLUSIVE`). +On BSD, macOS, and illumos, BSD locks are fully compatible with POSIX advisory locks; +on Linux and z/OS, they are fully functional, but incompatible; +elsewhere, they are very likely broken. +BSD locks are the default on BSD and illumos, +but you can opt into them with the `sqlite3_flock` build tag. On Windows, this module uses `LockFileEx` and `UnlockFileEx`, like SQLite. -On all other platforms, file locking is not supported, and you must use +Otherwise, file locking is not supported, and you must use [`nolock=1`](https://sqlite.org/uri.html#urinolock) (or [`immutable=1`](https://sqlite.org/uri.html#uriimmutable)) -to open database files.\ +to open database files. To use the [`database/sql`](https://pkg.go.dev/database/sql) driver with `nolock=1` you must disable connection pooling by calling [`db.SetMaxOpenConns(1)`](https://pkg.go.dev/database/sql#DB.SetMaxOpenConns). You can use [`vfs.SupportsFileLocking`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs#SupportsFileLocking) -to check if your platform supports file locking. +to check if your build supports file locking. ### Write-Ahead Logging -On 64-bit Linux and macOS, this module uses `mmap` to implement +On 64-bit Unix, this module uses `mmap` to implement [shared-memory for the WAL-index](https://sqlite.org/wal.html#implementation_of_shared_memory_for_the_wal_index), like SQLite. -To allow `mmap` to work, each connection needs to reserve up to 4GB of address space.\ -To limit the amount of address space each connection needs, +To allow `mmap` to work, each connection needs to reserve up to 4GB of address space. +To limit the address space each connection reserves, use [`WithMemoryLimitPages`](../tests/testcfg/testcfg.go). -On Windows and BSD, [WAL](https://sqlite.org/wal.html) support is -[limited](https://sqlite.org/wal.html#noshm). -`EXCLUSIVE` locking mode can be set to create, read, and write WAL databases.\ +With [BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2) +a WAL database can only be accessed by a single proccess. +Other processes that attempt to access a database locked with BSD locks, +will fail with the `SQLITE_PROTOCOL` error code. + +Otherwise, [WAL support is limited](https://sqlite.org/wal.html#noshm), +and `EXCLUSIVE` locking mode must be set to create, read, and write WAL databases. To use `EXCLUSIVE` locking mode with the [`database/sql`](https://pkg.go.dev/database/sql) driver you must disable connection pooling by calling [`db.SetMaxOpenConns(1)`](https://pkg.go.dev/database/sql#DB.SetMaxOpenConns). -On all other platforms, where file locking is not supported, WAL mode does not work. - You can use [`vfs.SupportsSharedMemory`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs#SupportsSharedMemory) -to check if your platform supports shared memory. +to check if your build supports shared memory. ### Batch-Atomic Write On 64-bit Linux, this module supports [batch-atomic writes](https://sqlite.org/cgi/src/technote/714) -with the F2FS filesystem. +on the F2FS filesystem. -### Build tags +### Build Tags The VFS can be customized with a few build tags: -- `sqlite3_flock` forces the use of BSD locks; it can be used on macOS to test the BSD locking implementation. +- `sqlite3_flock` forces the use of BSD locks; it can be used on z/OS to enable locking, + and elsewhere to test BSD locks. - `sqlite3_nosys` prevents importing [`x/sys`](https://pkg.go.dev/golang.org/x/sys); disables locking _and_ shared memory on all platforms. - `sqlite3_noshm` disables shared memory on all platforms. + +> [!IMPORTANT] +> The default configuration of this package is compatible with the standard +> [Unix and Windows SQLite VFSes](https://sqlite.org/vfs.html#multiple_vfses); +> `sqlite3_flock` builds are compatible with the +> [`unix-flock` VFS](https://sqlite.org/compile.html#enable_locking_style). +> If incompatible file locking is used, accessing databases concurrently with +> _other_ SQLite libraries will eventually corrupt data. diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go index 19c22ae8fa..e133e8be92 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go @@ -168,8 +168,8 @@ type FileSharedMemory interface { // SharedMemory is a shared-memory WAL-index implementation. // Use [NewSharedMemory] to create a shared-memory. type SharedMemory interface { - shmMap(context.Context, api.Module, int32, int32, bool) (uint32, error) - shmLock(int32, int32, _ShmFlag) error + shmMap(context.Context, api.Module, int32, int32, bool) (uint32, _ErrorCode) + shmLock(int32, int32, _ShmFlag) _ErrorCode shmUnmap(bool) io.Closer } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/const.go b/vendor/github.com/ncruces/go-sqlite3/vfs/const.go index 7f409f35f4..2fc934f336 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/const.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/const.go @@ -47,9 +47,11 @@ const ( _IOERR_SHMMAP _ErrorCode = util.IOERR_SHMMAP _IOERR_SEEK _ErrorCode = util.IOERR_SEEK _IOERR_DELETE_NOENT _ErrorCode = util.IOERR_DELETE_NOENT + _IOERR_GETTEMPPATH _ErrorCode = util.IOERR_GETTEMPPATH _IOERR_BEGIN_ATOMIC _ErrorCode = util.IOERR_BEGIN_ATOMIC _IOERR_COMMIT_ATOMIC _ErrorCode = util.IOERR_COMMIT_ATOMIC _IOERR_ROLLBACK_ATOMIC _ErrorCode = util.IOERR_ROLLBACK_ATOMIC + _BUSY_SNAPSHOT _ErrorCode = util.BUSY_SNAPSHOT _CANTOPEN_FULLPATH _ErrorCode = util.CANTOPEN_FULLPATH _CANTOPEN_ISDIR _ErrorCode = util.CANTOPEN_ISDIR _READONLY_CANTINIT _ErrorCode = util.READONLY_CANTINIT diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/file.go b/vendor/github.com/ncruces/go-sqlite3/vfs/file.go index ca8cf84f3a..93a2f7eced 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/file.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/file.go @@ -95,6 +95,9 @@ func (vfsOS) OpenFilename(name *Filename, flags OpenFlag) (File, OpenFlag, error f, err = osutil.OpenFile(name.String(), oflags, 0666) } if err != nil { + if name == nil { + return nil, flags, _IOERR_GETTEMPPATH + } if errors.Is(err, syscall.EISDIR) { return nil, flags, _CANTOPEN_ISDIR } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/lock.go b/vendor/github.com/ncruces/go-sqlite3/vfs/lock.go index 57bc5f9065..86a988ae87 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/lock.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/lock.go @@ -1,4 +1,4 @@ -//go:build (linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) && !sqlite3_nosys +//go:build (linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) && !sqlite3_nosys package vfs diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go b/vendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go index a4563af484..c395f34a73 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go @@ -1,4 +1,4 @@ -//go:build !(linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) || sqlite3_nosys +//go:build !(linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) || sqlite3_nosys package vfs diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go index 48ac5c9c9d..9f3c99dafa 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go @@ -29,5 +29,12 @@ func osReadLock(file *os.File, _ /*start*/, _ /*len*/ int64, _ /*timeout*/ time. } func osWriteLock(file *os.File, _ /*start*/, _ /*len*/ int64, _ /*timeout*/ time.Duration) _ErrorCode { - return osLock(file, unix.LOCK_EX|unix.LOCK_NB, _IOERR_LOCK) + rc := osLock(file, unix.LOCK_EX|unix.LOCK_NB, _IOERR_LOCK) + if rc == _BUSY { + // The documentation states the lock is upgraded by releasing the previous lock, + // then acquiring the new lock. + // This is a race, so return BUSY_SNAPSHOT to ensure the transaction is aborted. + return _BUSY_SNAPSHOT + } + return rc } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go index 9826eb274e..8bfe96bb15 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go @@ -1,4 +1,4 @@ -//go:build !sqlite3_flock && !sqlite3_nosys +//go:build !(sqlite3_flock || sqlite3_nosys) package vfs diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go index 8a43f43921..7bb78c0af2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go @@ -1,4 +1,4 @@ -//go:build !sqlite3_nosys +//go:build !(sqlite3_flock || sqlite3_nosys) package vfs @@ -56,7 +56,7 @@ func osLock(file *os.File, typ int16, start, len int64, timeout time.Duration, d if timeout < time.Since(before) { break } - osSleep(time.Duration(rand.Int63n(int64(time.Millisecond)))) + time.Sleep(time.Duration(rand.Int63n(int64(time.Millisecond)))) } } return osLockErrorCode(err, def) diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_sleep.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_sleep.go deleted file mode 100644 index c6bc407694..0000000000 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_sleep.go +++ /dev/null @@ -1,9 +0,0 @@ -//go:build !windows || sqlite3_nosys - -package vfs - -import "time" - -func osSleep(d time.Duration) { - time.Sleep(d) -} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix_lock.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix_lock.go index cdefa21ed7..85a7b0fc0f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix_lock.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix_lock.go @@ -1,4 +1,4 @@ -//go:build (linux || darwin || freebsd || openbsd || netbsd || dragonfly || illumos) && !sqlite3_nosys +//go:build (linux || darwin || freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) && !sqlite3_nosys package vfs @@ -48,7 +48,7 @@ func osDowngradeLock(file *os.File, state LockLevel) _ErrorCode { // In theory, the downgrade to a SHARED cannot fail because another // process is holding an incompatible lock. If it does, this // indicates that the other process is not following the locking - // protocol. If this happens, return _IOERR_RDLOCK. Returning + // protocol. If this happens, return IOERR_RDLOCK. Returning // BUSY would confuse the upper layer. return _IOERR_RDLOCK } @@ -98,6 +98,9 @@ func osLockErrorCode(err error, def _ErrorCode) _ErrorCode { case unix.EPERM: return _PERM } + if errno == unix.EWOULDBLOCK && unix.EWOULDBLOCK != unix.EAGAIN { + return _BUSY + } } return def } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go index 5c68754f84..83b952b168 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go @@ -136,7 +136,7 @@ func osLock(file *os.File, flags, start, len uint32, timeout time.Duration, def if timeout < time.Since(before) { break } - osSleep(time.Duration(rand.Int63n(int64(time.Millisecond)))) + time.Sleep(time.Duration(rand.Int63n(int64(time.Millisecond)))) } } return osLockErrorCode(err, def) @@ -171,16 +171,3 @@ func osLockErrorCode(err error, def _ErrorCode) _ErrorCode { } return def } - -func osSleep(d time.Duration) { - if d > 0 { - period := max(1, d/(5*time.Millisecond)) - if period < 16 { - windows.TimeBeginPeriod(uint32(period)) - } - time.Sleep(d) - if period < 16 { - windows.TimeEndPeriod(uint32(period)) - } - } -} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm.go index 2b76dd5dcf..7b0d4b677f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/shm.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm.go @@ -51,12 +51,7 @@ type vfsShm struct { readOnly bool } -func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, error) { - // Ensure size is a multiple of the OS page size. - if int(size)&(unix.Getpagesize()-1) != 0 { - return 0, _IOERR_SHMMAP - } - +func (s *vfsShm) shmOpen() _ErrorCode { if s.File == nil { var flag int if s.readOnly { @@ -67,28 +62,40 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext f, err := os.OpenFile(s.path, flag|unix.O_CREAT|unix.O_NOFOLLOW, 0666) if err != nil { - return 0, _CANTOPEN + return _CANTOPEN } s.File = f } // Dead man's switch. if lock, rc := osGetLock(s.File, _SHM_DMS, 1); rc != _OK { - return 0, _IOERR_LOCK + return _IOERR_LOCK } else if lock == unix.F_WRLCK { - return 0, _BUSY + return _BUSY } else if lock == unix.F_UNLCK { if s.readOnly { - return 0, _READONLY_CANTINIT + return _READONLY_CANTINIT } if rc := osWriteLock(s.File, _SHM_DMS, 1, 0); rc != _OK { - return 0, rc + return rc } if err := s.Truncate(0); err != nil { - return 0, _IOERR_SHMOPEN + return _IOERR_SHMOPEN } } if rc := osReadLock(s.File, _SHM_DMS, 1, 0); rc != _OK { + return rc + } + return _OK +} + +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, _ErrorCode) { + // Ensure size is a multiple of the OS page size. + if int(size)&(unix.Getpagesize()-1) != 0 { + return 0, _IOERR_SHMMAP + } + + if rc := s.shmOpen(); rc != _OK { return 0, rc } @@ -99,7 +106,7 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext } if n := (int64(id) + 1) * int64(size); n > o { if !extend { - return 0, nil + return 0, _OK } err := osAllocate(s.File, n) if err != nil { @@ -115,13 +122,16 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext } r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size, prot) if err != nil { - return 0, err + return 0, _IOERR_SHMMAP } s.regions = append(s.regions, r) - return r.Ptr, nil + if s.readOnly { + return r.Ptr, _READONLY + } + return r.Ptr, _OK } -func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) error { +func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) _ErrorCode { // Argument check. if n <= 0 || offset < 0 || offset+n > _SHM_NLOCK { panic(util.AssertErr()) @@ -165,9 +175,9 @@ func (s *vfsShm) shmUnmap(delete bool) { s.regions = s.regions[:0] // Close the file. - defer s.Close() if delete { - os.Remove(s.Name()) + os.Remove(s.path) } + s.Close() s.File = nil } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go new file mode 100644 index 0000000000..ffeb3e0a00 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go @@ -0,0 +1,260 @@ +//go:build (freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) && (amd64 || arm64 || riscv64) && !(sqlite3_noshm || sqlite3_nosys) + +package vfs + +import ( + "context" + "io" + "os" + "sync" + + "github.com/ncruces/go-sqlite3/internal/util" + "github.com/tetratelabs/wazero/api" + "golang.org/x/sys/unix" +) + +// SupportsSharedMemory is false on platforms that do not support shared memory. +// To use [WAL without shared-memory], you need to set [EXCLUSIVE locking mode]. +// +// [WAL without shared-memory]: https://sqlite.org/wal.html#noshm +// [EXCLUSIVE locking mode]: https://sqlite.org/pragma.html#pragma_locking_mode +const SupportsSharedMemory = true + +const _SHM_NLOCK = 8 + +func (f *vfsFile) SharedMemory() SharedMemory { return f.shm } + +// NewSharedMemory returns a shared-memory WAL-index +// backed by a file with the given path. +// It will return nil if shared-memory is not supported, +// or not appropriate for the given flags. +// Only [OPEN_MAIN_DB] databases may need a WAL-index. +// You must ensure all concurrent accesses to a database +// use shared-memory instances created with the same path. +func NewSharedMemory(path string, flags OpenFlag) SharedMemory { + if flags&OPEN_MAIN_DB == 0 || flags&(OPEN_DELETEONCLOSE|OPEN_MEMORY) != 0 { + return nil + } + return &vfsShm{ + path: path, + readOnly: flags&OPEN_READONLY != 0, + } +} + +type vfsShmFile struct { + *os.File + info os.FileInfo + + // +checklocks:vfsShmFilesMtx + refs int + + // +checklocks:lockMtx + lock [_SHM_NLOCK]int16 + lockMtx sync.Mutex +} + +var ( + // +checklocks:vfsShmFilesMtx + vfsShmFiles []*vfsShmFile + vfsShmFilesMtx sync.Mutex +) + +type vfsShm struct { + *vfsShmFile + path string + lock [_SHM_NLOCK]bool + regions []*util.MappedRegion + readOnly bool +} + +func (s *vfsShm) Close() error { + if s.vfsShmFile == nil { + return nil + } + + // Unlock everything. + s.shmLock(0, _SHM_NLOCK, _SHM_UNLOCK) + + vfsShmFilesMtx.Lock() + defer vfsShmFilesMtx.Unlock() + + // Decrease reference count. + if s.vfsShmFile.refs > 1 { + s.vfsShmFile.refs-- + s.vfsShmFile = nil + return nil + } + for i, g := range vfsShmFiles { + if g == s.vfsShmFile { + vfsShmFiles[i] = nil + break + } + } + + err := s.File.Close() + s.vfsShmFile = nil + return err +} + +func (s *vfsShm) shmOpen() (rc _ErrorCode) { + if s.vfsShmFile != nil { + return _OK + } + + // Always open file read-write, as it will be shared. + f, err := os.OpenFile(s.path, + unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) + if err != nil { + return _CANTOPEN + } + // Closes file if it's not nil. + defer func() { f.Close() }() + + fi, err := f.Stat() + if err != nil { + return _IOERR_FSTAT + } + + vfsShmFilesMtx.Lock() + defer vfsShmFilesMtx.Unlock() + + // Find a shared file, increase the reference count. + for _, g := range vfsShmFiles { + if g != nil && os.SameFile(fi, g.info) { + g.refs++ + s.vfsShmFile = g + return _OK + } + } + + // Lock and truncate the file, if not readonly. + // The lock is only released by closing the file. + if s.readOnly { + rc = _READONLY_CANTINIT + } else { + if rc := osLock(f, unix.LOCK_EX|unix.LOCK_NB, _IOERR_LOCK); rc != _OK { + return rc + } + if err := f.Truncate(0); err != nil { + return _IOERR_SHMOPEN + } + } + + // Add the new shared file. + s.vfsShmFile = &vfsShmFile{ + File: f, + info: fi, + refs: 1, + } + f = nil // Don't close the file. + for i, g := range vfsShmFiles { + if g == nil { + vfsShmFiles[i] = s.vfsShmFile + return rc + } + } + vfsShmFiles = append(vfsShmFiles, s.vfsShmFile) + return rc +} + +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, _ErrorCode) { + // Ensure size is a multiple of the OS page size. + if int(size)&(unix.Getpagesize()-1) != 0 { + return 0, _IOERR_SHMMAP + } + + if rc := s.shmOpen(); rc != _OK { + return 0, rc + } + + // Check if file is big enough. + o, err := s.Seek(0, io.SeekEnd) + if err != nil { + return 0, _IOERR_SHMSIZE + } + if n := (int64(id) + 1) * int64(size); n > o { + if !extend { + return 0, _OK + } + err := osAllocate(s.File, n) + if err != nil { + return 0, _IOERR_SHMSIZE + } + } + + var prot int + if s.readOnly { + prot = unix.PROT_READ + } else { + prot = unix.PROT_READ | unix.PROT_WRITE + } + r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size, prot) + if err != nil { + return 0, _IOERR_SHMMAP + } + s.regions = append(s.regions, r) + if s.readOnly { + return r.Ptr, _READONLY + } + return r.Ptr, _OK +} + +func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) _ErrorCode { + s.lockMtx.Lock() + defer s.lockMtx.Unlock() + + switch { + case flags&_SHM_UNLOCK != 0: + for i := offset; i < offset+n; i++ { + if s.lock[i] { + if s.vfsShmFile.lock[i] <= 0 { + s.vfsShmFile.lock[i] = 0 + } else { + s.vfsShmFile.lock[i]-- + } + } + } + case flags&_SHM_SHARED != 0: + for i := offset; i < offset+n; i++ { + if s.vfsShmFile.lock[i] < 0 { + return _BUSY + } + } + for i := offset; i < offset+n; i++ { + s.vfsShmFile.lock[i]++ + s.lock[i] = true + } + case flags&_SHM_EXCLUSIVE != 0: + for i := offset; i < offset+n; i++ { + if s.vfsShmFile.lock[i] != 0 { + return _BUSY + } + } + for i := offset; i < offset+n; i++ { + s.vfsShmFile.lock[i] = -1 + s.lock[i] = true + } + } + + return _OK +} + +func (s *vfsShm) shmUnmap(delete bool) { + if s.vfsShmFile == nil { + return + } + + // Unmap regions. + for _, r := range s.regions { + r.Unmap() + } + clear(s.regions) + s.regions = s.regions[:0] + + // Close the file. + if delete { + os.Remove(s.path) + } + s.Close() + s.vfsShmFile = nil +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go index 21191979ec..7c89975813 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go @@ -1,4 +1,4 @@ -//go:build !(darwin || linux) || !(amd64 || arm64 || riscv64) || sqlite3_flock || sqlite3_noshm || sqlite3_nosys +//go:build !(darwin || linux || freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) || !(amd64 || arm64 || riscv64) || sqlite3_noshm || sqlite3_nosys package vfs diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go index 1887e9f221..d624aa78c3 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go @@ -83,7 +83,7 @@ func vfsRandomness(ctx context.Context, mod api.Module, pVfs uint32, nByte int32 } func vfsSleep(ctx context.Context, mod api.Module, pVfs uint32, nMicro int32) _ErrorCode { - osSleep(time.Duration(nMicro) * time.Microsecond) + time.Sleep(time.Duration(nMicro) * time.Microsecond) return _OK } @@ -397,18 +397,14 @@ func vfsShmBarrier(ctx context.Context, mod api.Module, pFile uint32) { func vfsShmMap(ctx context.Context, mod api.Module, pFile uint32, iRegion, szRegion int32, bExtend, pp uint32) _ErrorCode { shm := vfsFileGet(ctx, mod, pFile).(FileSharedMemory).SharedMemory() - p, err := shm.shmMap(ctx, mod, iRegion, szRegion, bExtend != 0) - if err != nil { - return vfsErrorCode(err, _IOERR_SHMMAP) - } + p, rc := shm.shmMap(ctx, mod, iRegion, szRegion, bExtend != 0) util.WriteUint32(mod, pp, p) - return _OK + return rc } func vfsShmLock(ctx context.Context, mod api.Module, pFile uint32, offset, n int32, flags _ShmFlag) _ErrorCode { shm := vfsFileGet(ctx, mod, pFile).(FileSharedMemory).SharedMemory() - err := shm.shmLock(offset, n, flags) - return vfsErrorCode(err, _IOERR_SHMLOCK) + return shm.shmLock(offset, n, flags) } func vfsShmUnmap(ctx context.Context, mod api.Module, pFile, bDelete uint32) _ErrorCode { diff --git a/vendor/github.com/ncruces/go-sqlite3/vtab.go b/vendor/github.com/ncruces/go-sqlite3/vtab.go index a330c98ffb..7c19330bb2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vtab.go +++ b/vendor/github.com/ncruces/go-sqlite3/vtab.go @@ -16,14 +16,15 @@ func CreateModule[T VTab](db *Conn, name string, create, connect VTabConstructor var flags int const ( - VTAB_CREATOR = 0x01 - VTAB_DESTROYER = 0x02 - VTAB_UPDATER = 0x04 - VTAB_RENAMER = 0x08 - VTAB_OVERLOADER = 0x10 - VTAB_CHECKER = 0x20 - VTAB_TXN = 0x40 - VTAB_SAVEPOINTER = 0x80 + VTAB_CREATOR = 0x001 + VTAB_DESTROYER = 0x002 + VTAB_UPDATER = 0x004 + VTAB_RENAMER = 0x008 + VTAB_OVERLOADER = 0x010 + VTAB_CHECKER = 0x020 + VTAB_TXN = 0x040 + VTAB_SAVEPOINTER = 0x080 + VTAB_SHADOWTABS = 0x100 ) if create != nil { @@ -52,6 +53,9 @@ func CreateModule[T VTab](db *Conn, name string, create, connect VTabConstructor if implements[VTabSavepointer](vtab) { flags |= VTAB_SAVEPOINTER } + if implements[VTabShadowTabler](vtab) { + flags |= VTAB_SHADOWTABS + } defer db.arena.mark()() namePtr := db.arena.string(name) @@ -174,6 +178,17 @@ type VTabOverloader interface { FindFunction(arg int, name string) (ScalarFunction, IndexConstraintOp) } +// A VTabShadowTabler allows a virtual table to protect the content +// of shadow tables from being corrupted by hostile SQL. +// +// Implementing this interface signals that a virtual table named +// "mumble" reserves all table names starting with "mumble_". +type VTabShadowTabler interface { + VTab + // https://sqlite.org/vtab.html#the_xshadowname_method + ShadowTables() +} + // A VTabChecker allows a virtual table to report errors // to the PRAGMA integrity_check and PRAGMA quick_check commands. // diff --git a/vendor/github.com/tetratelabs/wazero/config.go b/vendor/github.com/tetratelabs/wazero/config.go index 819a76df5e..d3656849cf 100644 --- a/vendor/github.com/tetratelabs/wazero/config.go +++ b/vendor/github.com/tetratelabs/wazero/config.go @@ -148,7 +148,7 @@ type RuntimeConfig interface { // customSections := c.CustomSections() WithCustomSections(bool) RuntimeConfig - // WithCloseOnContextDone ensures the executions of functions to be closed under one of the following circumstances: + // WithCloseOnContextDone ensures the executions of functions to be terminated under one of the following circumstances: // // - context.Context passed to the Call method of api.Function is canceled during execution. (i.e. ctx by context.WithCancel) // - context.Context passed to the Call method of api.Function reaches timeout during execution. (i.e. ctx by context.WithTimeout or context.WithDeadline) @@ -159,6 +159,8 @@ type RuntimeConfig interface { // entire underlying OS thread which runs the api.Function call. See "Why it's safe to execute runtime-generated // machine codes against async Goroutine preemption" section in RATIONALE.md for detail. // + // Upon the termination of the function executions, api.Module is closed. + // // Note that this comes with a bit of extra cost when enabled. The reason is that internally this forces // interpreter and compiler runtimes to insert the periodical checks on the conditions above. For that reason, // this is disabled by default. @@ -217,9 +219,18 @@ const ( // part. wazero automatically performs ahead-of-time compilation as needed when // Runtime.CompileModule is invoked. // -// Warning: This panics at runtime if the runtime.GOOS or runtime.GOARCH does not -// support compiler. Use NewRuntimeConfig to safely detect and fallback to -// NewRuntimeConfigInterpreter if needed. +// # Warning +// +// - This panics at runtime if the runtime.GOOS or runtime.GOARCH does not +// support compiler. Use NewRuntimeConfig to safely detect and fallback to +// NewRuntimeConfigInterpreter if needed. +// +// - If you are using wazero in buildmode=c-archive or c-shared, make sure that you set up the alternate signal stack +// by using, e.g. `sigaltstack` combined with `SA_ONSTACK` flag on `sigaction` on Linux, +// before calling any api.Function. This is because the Go runtime does not set up the alternate signal stack +// for c-archive or c-shared modes, and wazero uses the different stack than the calling Goroutine. +// Hence, the signal handler might get invoked on the wazero's stack, which may cause a stack overflow. +// https://github.com/tetratelabs/wazero/blob/2092c0a879f30d49d7b37f333f4547574b8afe0d/internal/integration_test/fuzz/fuzz/tests/sigstack.rs#L19-L36 func NewRuntimeConfigCompiler() RuntimeConfig { ret := engineLessConfig.clone() ret.engineKind = engineKindCompiler diff --git a/vendor/github.com/tetratelabs/wazero/experimental/checkpoint.go b/vendor/github.com/tetratelabs/wazero/experimental/checkpoint.go index 443c5a294f..c75db615e6 100644 --- a/vendor/github.com/tetratelabs/wazero/experimental/checkpoint.go +++ b/vendor/github.com/tetratelabs/wazero/experimental/checkpoint.go @@ -21,13 +21,6 @@ type Snapshotter interface { Snapshot() Snapshot } -// EnableSnapshotterKey is a context key to indicate that snapshotting should be enabled. -// The context.Context passed to a exported function invocation should have this key set -// to a non-nil value, and host functions will be able to retrieve it using SnapshotterKey. -// -// Deprecated: use WithSnapshotter to enable snapshots. -type EnableSnapshotterKey = expctxkeys.EnableSnapshotterKey - // WithSnapshotter enables snapshots. // Passing the returned context to a exported function invocation enables snapshots, // and allows host functions to retrieve the Snapshotter using GetSnapshotter. @@ -35,12 +28,6 @@ func WithSnapshotter(ctx context.Context) context.Context { return context.WithValue(ctx, expctxkeys.EnableSnapshotterKey{}, struct{}{}) } -// SnapshotterKey is a context key to access a Snapshotter from a host function. -// It is only present if EnableSnapshotter was set in the function invocation context. -// -// Deprecated: use GetSnapshotter to get the snapshotter. -type SnapshotterKey = expctxkeys.SnapshotterKey - // GetSnapshotter gets the Snapshotter from a host function. // It is only present if WithSnapshotter was called with the function invocation context. func GetSnapshotter(ctx context.Context) Snapshotter { diff --git a/vendor/github.com/tetratelabs/wazero/experimental/listener.go b/vendor/github.com/tetratelabs/wazero/experimental/listener.go index b2ba1fe834..55fc6b668e 100644 --- a/vendor/github.com/tetratelabs/wazero/experimental/listener.go +++ b/vendor/github.com/tetratelabs/wazero/experimental/listener.go @@ -24,12 +24,6 @@ type StackIterator interface { ProgramCounter() ProgramCounter } -// FunctionListenerFactoryKey is a context.Context Value key. -// Its associated value should be a FunctionListenerFactory. -// -// Deprecated: use WithFunctionListenerFactory to enable snapshots. -type FunctionListenerFactoryKey = expctxkeys.FunctionListenerFactoryKey - // WithFunctionListenerFactory registers a FunctionListenerFactory // with the context. func WithFunctionListenerFactory(ctx context.Context, factory FunctionListenerFactory) context.Context { diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go index 761a1f9dc2..5ebc1780f4 100644 --- a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go @@ -23,6 +23,10 @@ const ( // instead of syscall.ENOTDIR _ERROR_DIRECTORY = syscall.Errno(0x10B) + // _ERROR_NOT_A_REPARSE_POINT is a Windows error returned by os.Readlink + // instead of syscall.EINVAL + _ERROR_NOT_A_REPARSE_POINT = syscall.Errno(0x1126) + // _ERROR_INVALID_SOCKET is a Windows error returned by winsock_select // when a given handle is not a socket. _ERROR_INVALID_SOCKET = syscall.Errno(0x2736) @@ -51,7 +55,7 @@ func errorToErrno(err error) Errno { return EBADF case syscall.ERROR_PRIVILEGE_NOT_HELD: return EPERM - case _ERROR_NEGATIVE_SEEK, _ERROR_INVALID_NAME: + case _ERROR_NEGATIVE_SEEK, _ERROR_INVALID_NAME, _ERROR_NOT_A_REPARSE_POINT: return EINVAL } errno, _ := syscallToErrno(err) diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go index 384036a275..1ec0d81b37 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go @@ -1596,6 +1596,10 @@ func pathOpenFn(_ context.Context, mod api.Module, params []uint64) experimental return errno } + if pathLen == 0 { + return experimentalsys.EINVAL + } + fileOpenFlags := openFlags(dirflags, oflags, fdflags, rights) isDir := fileOpenFlags&experimentalsys.O_DIRECTORY != 0 @@ -1704,7 +1708,6 @@ func openFlags(dirflags, oflags, fdflags uint16, rights uint32) (openFlags exper } if oflags&wasip1.O_DIRECTORY != 0 { openFlags |= experimentalsys.O_DIRECTORY - return // Early return for directories as the rest of flags doesn't make sense for it. } else if oflags&wasip1.O_EXCL != 0 { openFlags |= experimentalsys.O_EXCL } @@ -1951,16 +1954,16 @@ func pathSymlinkFn(_ context.Context, mod api.Module, params []uint64) experimen return experimentalsys.EFAULT } - newPathBuf, ok := mem.Read(newPath, newPathLen) - if !ok { - return experimentalsys.EFAULT + _, newPathName, errno := atPath(fsc, mod.Memory(), fd, newPath, newPathLen) + if errno != 0 { + return errno } return dir.FS.Symlink( // Do not join old path since it's only resolved when dereference the link created here. // And the dereference result depends on the opening directory's file descriptor at that point. bufToStr(oldPathBuf), - path.Join(dir.Name, bufToStr(newPathBuf)), + newPathName, ) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/interpreter.go b/vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/interpreter.go index a89ddc4573..18c5f4252d 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/interpreter.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/interpreter.go @@ -98,6 +98,9 @@ func (e *moduleEngine) SetGlobalValue(idx wasm.Index, lo, hi uint64) { // OwnsGlobals implements the same method as documented on wasm.ModuleEngine. func (e *moduleEngine) OwnsGlobals() bool { return false } +// MemoryGrown implements wasm.ModuleEngine. +func (e *moduleEngine) MemoryGrown() {} + // callEngine holds context per moduleEngine.Call, and shared across all the // function calls originating from the same moduleEngine.Call execution. // diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/executable_context.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/executable_context.go index 81c6a6b62e..8e9571b202 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/executable_context.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/executable_context.go @@ -43,7 +43,7 @@ type ExecutableContextT[Instr any] struct { labelPositionPool wazevoapi.Pool[LabelPosition[Instr]] NextLabel Label // LabelPositions maps a label to the instructions of the region which the label represents. - LabelPositions map[Label]*LabelPosition[Instr] + LabelPositions []*LabelPosition[Instr] OrderedBlockLabels []*LabelPosition[Instr] // PerBlockHead and PerBlockEnd are the head and tail of the instruction list per currently-compiled ssa.BasicBlock. @@ -67,7 +67,6 @@ func NewExecutableContextT[Instr any]( setNext: setNext, setPrev: setPrev, labelPositionPool: wazevoapi.NewPool[LabelPosition[Instr]](resetLabelPosition[Instr]), - LabelPositions: make(map[Label]*LabelPosition[Instr]), NextLabel: LabelInvalid, } } @@ -97,11 +96,7 @@ func (e *ExecutableContextT[Instr]) StartBlock(blk ssa.BasicBlock) { end := e.allocateNop0() e.PerBlockHead, e.PerBlockEnd = end, end - labelPos, ok := e.LabelPositions[l] - if !ok { - labelPos = e.AllocateLabelPosition(l) - e.LabelPositions[l] = labelPos - } + labelPos := e.GetOrAllocateLabelPosition(l) e.OrderedBlockLabels = append(e.OrderedBlockLabels, labelPos) labelPos.Begin, labelPos.End = end, end labelPos.SB = blk @@ -146,8 +141,8 @@ func (e *ExecutableContextT[T]) FlushPendingInstructions() { func (e *ExecutableContextT[T]) Reset() { e.labelPositionPool.Reset() e.InstructionPool.Reset() - for l := Label(0); l <= e.NextLabel; l++ { - delete(e.LabelPositions, l) + for i := range e.LabelPositions { + e.LabelPositions[i] = nil } e.PendingInstructions = e.PendingInstructions[:0] e.OrderedBlockLabels = e.OrderedBlockLabels[:0] @@ -163,10 +158,17 @@ func (e *ExecutableContextT[T]) AllocateLabel() Label { return e.NextLabel } -func (e *ExecutableContextT[T]) AllocateLabelPosition(la Label) *LabelPosition[T] { - l := e.labelPositionPool.Allocate() - l.L = la - return l +func (e *ExecutableContextT[T]) GetOrAllocateLabelPosition(l Label) *LabelPosition[T] { + if len(e.LabelPositions) <= int(l) { + e.LabelPositions = append(e.LabelPositions, make([]*LabelPosition[T], int(l)+1-len(e.LabelPositions))...) + } + ret := e.LabelPositions[l] + if ret == nil { + ret = e.labelPositionPool.Allocate() + ret.L = l + e.LabelPositions[l] = ret + } + return ret } func (e *ExecutableContextT[T]) GetOrAllocateSSABlockLabel(blk ssa.BasicBlock) Label { diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/amd64/machine.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/amd64/machine.go index 310ad2203a..61ae6f4061 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/amd64/machine.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/amd64/machine.go @@ -1906,8 +1906,10 @@ func (m *machine) InsertMove(dst, src regalloc.VReg, typ ssa.Type) { func (m *machine) Format() string { ectx := m.ectx begins := map[*instruction]backend.Label{} - for l, pos := range ectx.LabelPositions { - begins[pos.Begin] = l + for _, pos := range ectx.LabelPositions { + if pos != nil { + begins[pos.Begin] = pos.L + } } irBlocks := map[backend.Label]ssa.BasicBlockID{} @@ -1950,7 +1952,10 @@ func (m *machine) encodeWithoutSSA(root *instruction) { offset := int64(len(*bufPtr)) if cur.kind == nop0 { l := cur.nop0Label() - if pos, ok := ectx.LabelPositions[l]; ok { + if int(l) >= len(ectx.LabelPositions) { + continue + } + if pos := ectx.LabelPositions[l]; pos != nil { pos.BinaryOffset = offset } } @@ -2005,7 +2010,7 @@ func (m *machine) Encode(ctx context.Context) (err error) { switch cur.kind { case nop0: l := cur.nop0Label() - if pos, ok := ectx.LabelPositions[l]; ok { + if pos := ectx.LabelPositions[l]; pos != nil { pos.BinaryOffset = offset } case sourceOffsetInfo: @@ -2165,8 +2170,7 @@ func (m *machine) allocateBrTarget() (nop *instruction, l backend.Label) { //nol func (m *machine) allocateLabel() *labelPosition { ectx := m.ectx l := ectx.AllocateLabel() - pos := ectx.AllocateLabelPosition(l) - ectx.LabelPositions[l] = pos + pos := ectx.GetOrAllocateLabelPosition(l) return pos } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi.go index 6615471c6a..4eaa13ce1c 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi.go @@ -101,13 +101,14 @@ func (m *machine) LowerParams(args []ssa.Value) { bits := arg.Type.Bits() // At this point of compilation, we don't yet know how much space exist below the return address. // So we instruct the address mode to add the `argStackOffset` to the offset at the later phase of compilation. - amode := addressMode{imm: arg.Offset, rn: spVReg, kind: addressModeKindArgStackSpace} + amode := m.amodePool.Allocate() + *amode = addressMode{imm: arg.Offset, rn: spVReg, kind: addressModeKindArgStackSpace} load := m.allocateInstr() switch arg.Type { case ssa.TypeI32, ssa.TypeI64: - load.asULoad(operandNR(reg), amode, bits) + load.asULoad(reg, amode, bits) case ssa.TypeF32, ssa.TypeF64, ssa.TypeV128: - load.asFpuLoad(operandNR(reg), amode, bits) + load.asFpuLoad(reg, amode, bits) default: panic("BUG") } @@ -169,7 +170,8 @@ func (m *machine) LowerReturns(rets []ssa.Value) { // At this point of compilation, we don't yet know how much space exist below the return address. // So we instruct the address mode to add the `retStackOffset` to the offset at the later phase of compilation. - amode := addressMode{imm: r.Offset, rn: spVReg, kind: addressModeKindResultStackSpace} + amode := m.amodePool.Allocate() + *amode = addressMode{imm: r.Offset, rn: spVReg, kind: addressModeKindResultStackSpace} store := m.allocateInstr() store.asStore(operandNR(reg), amode, bits) m.insert(store) @@ -215,9 +217,9 @@ func (m *machine) callerGenFunctionReturnVReg(a *backend.FunctionABI, retIndex i ldr := m.allocateInstr() switch r.Type { case ssa.TypeI32, ssa.TypeI64: - ldr.asULoad(operandNR(reg), amode, r.Type.Bits()) + ldr.asULoad(reg, amode, r.Type.Bits()) case ssa.TypeF32, ssa.TypeF64, ssa.TypeV128: - ldr.asFpuLoad(operandNR(reg), amode, r.Type.Bits()) + ldr.asFpuLoad(reg, amode, r.Type.Bits()) default: panic("BUG") } @@ -225,7 +227,7 @@ func (m *machine) callerGenFunctionReturnVReg(a *backend.FunctionABI, retIndex i } } -func (m *machine) resolveAddressModeForOffsetAndInsert(cur *instruction, offset int64, dstBits byte, rn regalloc.VReg, allowTmpRegUse bool) (*instruction, addressMode) { +func (m *machine) resolveAddressModeForOffsetAndInsert(cur *instruction, offset int64, dstBits byte, rn regalloc.VReg, allowTmpRegUse bool) (*instruction, *addressMode) { exct := m.executableContext exct.PendingInstructions = exct.PendingInstructions[:0] mode := m.resolveAddressModeForOffset(offset, dstBits, rn, allowTmpRegUse) @@ -235,15 +237,15 @@ func (m *machine) resolveAddressModeForOffsetAndInsert(cur *instruction, offset return cur, mode } -func (m *machine) resolveAddressModeForOffset(offset int64, dstBits byte, rn regalloc.VReg, allowTmpRegUse bool) addressMode { +func (m *machine) resolveAddressModeForOffset(offset int64, dstBits byte, rn regalloc.VReg, allowTmpRegUse bool) *addressMode { if rn.RegType() != regalloc.RegTypeInt { panic("BUG: rn should be a pointer: " + formatVRegSized(rn, 64)) } - var amode addressMode + amode := m.amodePool.Allocate() if offsetFitsInAddressModeKindRegUnsignedImm12(dstBits, offset) { - amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: rn, imm: offset} + *amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: rn, imm: offset} } else if offsetFitsInAddressModeKindRegSignedImm9(offset) { - amode = addressMode{kind: addressModeKindRegSignedImm9, rn: rn, imm: offset} + *amode = addressMode{kind: addressModeKindRegSignedImm9, rn: rn, imm: offset} } else { var indexReg regalloc.VReg if allowTmpRegUse { @@ -253,7 +255,7 @@ func (m *machine) resolveAddressModeForOffset(offset int64, dstBits byte, rn reg indexReg = m.compiler.AllocateVReg(ssa.TypeI64) m.lowerConstantI64(indexReg, offset) } - amode = addressMode{kind: addressModeKindRegReg, rn: rn, rm: indexReg, extOp: extendOpUXTX /* indicates index rm is 64-bit */} + *amode = addressMode{kind: addressModeKindRegReg, rn: rn, rm: indexReg, extOp: extendOpUXTX /* indicates index rm is 64-bit */} } return amode } @@ -315,7 +317,7 @@ func (m *machine) insertAddOrSubStackPointer(rd regalloc.VReg, diff int64, add b } else { ao = aluOpSub } - alu.asALU(ao, operandNR(rd), operandNR(spVReg), imm12Operand, true) + alu.asALU(ao, rd, operandNR(spVReg), imm12Operand, true) m.insert(alu) } else { m.lowerConstantI64(tmpRegVReg, diff) @@ -326,7 +328,7 @@ func (m *machine) insertAddOrSubStackPointer(rd regalloc.VReg, diff int64, add b } else { ao = aluOpSub } - alu.asALU(ao, operandNR(rd), operandNR(spVReg), operandNR(tmpRegVReg), true) + alu.asALU(ao, rd, operandNR(spVReg), operandNR(tmpRegVReg), true) m.insert(alu) } } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi_entry_preamble.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi_entry_preamble.go index 7a9cceb332..f8b5d97ac7 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi_entry_preamble.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi_entry_preamble.go @@ -59,25 +59,26 @@ func (m *machine) goEntryPreamblePassArg(cur *instruction, paramSlicePtr regallo } else { postIndexImm = 8 } - loadMode := addressMode{kind: addressModeKindPostIndex, rn: paramSlicePtr, imm: postIndexImm} + loadMode := m.amodePool.Allocate() + *loadMode = addressMode{kind: addressModeKindPostIndex, rn: paramSlicePtr, imm: postIndexImm} instr := m.allocateInstr() switch typ { case ssa.TypeI32: - instr.asULoad(loadTargetReg, loadMode, 32) + instr.asULoad(loadTargetReg.reg(), loadMode, 32) case ssa.TypeI64: - instr.asULoad(loadTargetReg, loadMode, 64) + instr.asULoad(loadTargetReg.reg(), loadMode, 64) case ssa.TypeF32: - instr.asFpuLoad(loadTargetReg, loadMode, 32) + instr.asFpuLoad(loadTargetReg.reg(), loadMode, 32) case ssa.TypeF64: - instr.asFpuLoad(loadTargetReg, loadMode, 64) + instr.asFpuLoad(loadTargetReg.reg(), loadMode, 64) case ssa.TypeV128: - instr.asFpuLoad(loadTargetReg, loadMode, 128) + instr.asFpuLoad(loadTargetReg.reg(), loadMode, 128) } cur = linkInstr(cur, instr) if isStackArg { - var storeMode addressMode + var storeMode *addressMode cur, storeMode = m.resolveAddressModeForOffsetAndInsert(cur, argStartOffsetFromSP+arg.Offset, bits, spVReg, true) toStack := m.allocateInstr() toStack.asStore(loadTargetReg, storeMode, bits) @@ -113,21 +114,22 @@ func (m *machine) goEntryPreamblePassResult(cur *instruction, resultSlicePtr reg } if isStackArg { - var loadMode addressMode + var loadMode *addressMode cur, loadMode = m.resolveAddressModeForOffsetAndInsert(cur, resultStartOffsetFromSP+result.Offset, bits, spVReg, true) toReg := m.allocateInstr() switch typ { case ssa.TypeI32, ssa.TypeI64: - toReg.asULoad(storeTargetReg, loadMode, bits) + toReg.asULoad(storeTargetReg.reg(), loadMode, bits) case ssa.TypeF32, ssa.TypeF64, ssa.TypeV128: - toReg.asFpuLoad(storeTargetReg, loadMode, bits) + toReg.asFpuLoad(storeTargetReg.reg(), loadMode, bits) default: panic("TODO?") } cur = linkInstr(cur, toReg) } - mode := addressMode{kind: addressModeKindPostIndex, rn: resultSlicePtr, imm: postIndexImm} + mode := m.amodePool.Allocate() + *mode = addressMode{kind: addressModeKindPostIndex, rn: resultSlicePtr, imm: postIndexImm} instr := m.allocateInstr() instr.asStore(storeTargetReg, mode, bits) cur = linkInstr(cur, instr) @@ -214,11 +216,12 @@ func (m *machine) move64(dst, src regalloc.VReg, prev *instruction) *instruction func (m *machine) loadOrStoreAtExecutionContext(d regalloc.VReg, offset wazevoapi.Offset, store bool, prev *instruction) *instruction { instr := m.allocateInstr() - mode := addressMode{kind: addressModeKindRegUnsignedImm12, rn: savedExecutionContextPtr, imm: offset.I64()} + mode := m.amodePool.Allocate() + *mode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: savedExecutionContextPtr, imm: offset.I64()} if store { instr.asStore(operandNR(d), mode, 64) } else { - instr.asULoad(operandNR(d), mode, 64) + instr.asULoad(d, mode, 64) } return linkInstr(prev, instr) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi_go_call.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi_go_call.go index 466b1f9609..99e6bb482d 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi_go_call.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/abi_go_call.go @@ -87,7 +87,8 @@ func (m *machine) CompileGoFunctionTrampoline(exitCode wazevoapi.ExitCode, sig * // Module context is always the second argument. moduleCtrPtr := x1VReg store := m.allocateInstr() - amode := addressMode{kind: addressModeKindRegUnsignedImm12, rn: execCtrPtr, imm: offset} + amode := m.amodePool.Allocate() + *amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: execCtrPtr, imm: offset} store.asStore(operandNR(moduleCtrPtr), amode, 64) cur = linkInstr(cur, store) } @@ -120,11 +121,9 @@ func (m *machine) CompileGoFunctionTrampoline(exitCode wazevoapi.ExitCode, sig * } else { sizeInBits = 64 } - store.asStore(operandNR(v), - addressMode{ - kind: addressModeKindPostIndex, - rn: arg0ret0AddrReg, imm: int64(sizeInBits / 8), - }, sizeInBits) + amode := m.amodePool.Allocate() + *amode = addressMode{kind: addressModeKindPostIndex, rn: arg0ret0AddrReg, imm: int64(sizeInBits / 8)} + store.asStore(operandNR(v), amode, sizeInBits) cur = linkInstr(cur, store) } @@ -139,7 +138,7 @@ func (m *machine) CompileGoFunctionTrampoline(exitCode wazevoapi.ExitCode, sig * frameSizeReg = xzrVReg sliceSizeReg = xzrVReg } - _amode := addressModePreOrPostIndex(spVReg, -16, true) + _amode := addressModePreOrPostIndex(m, spVReg, -16, true) storeP := m.allocateInstr() storeP.asStorePair64(frameSizeReg, sliceSizeReg, _amode) cur = linkInstr(cur, storeP) @@ -165,8 +164,8 @@ func (m *machine) CompileGoFunctionTrampoline(exitCode wazevoapi.ExitCode, sig * cur = m.addsAddOrSubStackPointer(cur, spVReg, frameInfoSize+goCallStackSize, true) ldr := m.allocateInstr() // And load the return address. - ldr.asULoad(operandNR(lrVReg), - addressModePreOrPostIndex(spVReg, 16 /* stack pointer must be 16-byte aligned. */, false /* increment after loads */), 64) + amode := addressModePreOrPostIndex(m, spVReg, 16 /* stack pointer must be 16-byte aligned. */, false /* increment after loads */) + ldr.asULoad(lrVReg, amode, 64) cur = linkInstr(cur, ldr) originalRet0Reg := x17VReg // Caller save, so we can use it for whatever we want. @@ -183,23 +182,24 @@ func (m *machine) CompileGoFunctionTrampoline(exitCode wazevoapi.ExitCode, sig * r := &abi.Rets[i] if r.Kind == backend.ABIArgKindReg { loadIntoReg := m.allocateInstr() - mode := addressMode{kind: addressModeKindPostIndex, rn: arg0ret0AddrReg} + mode := m.amodePool.Allocate() + *mode = addressMode{kind: addressModeKindPostIndex, rn: arg0ret0AddrReg} switch r.Type { case ssa.TypeI32: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - loadIntoReg.asULoad(operandNR(r.Reg), mode, 32) + loadIntoReg.asULoad(r.Reg, mode, 32) case ssa.TypeI64: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - loadIntoReg.asULoad(operandNR(r.Reg), mode, 64) + loadIntoReg.asULoad(r.Reg, mode, 64) case ssa.TypeF32: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - loadIntoReg.asFpuLoad(operandNR(r.Reg), mode, 32) + loadIntoReg.asFpuLoad(r.Reg, mode, 32) case ssa.TypeF64: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - loadIntoReg.asFpuLoad(operandNR(r.Reg), mode, 64) + loadIntoReg.asFpuLoad(r.Reg, mode, 64) case ssa.TypeV128: mode.imm = 16 - loadIntoReg.asFpuLoad(operandNR(r.Reg), mode, 128) + loadIntoReg.asFpuLoad(r.Reg, mode, 128) default: panic("TODO") } @@ -208,28 +208,29 @@ func (m *machine) CompileGoFunctionTrampoline(exitCode wazevoapi.ExitCode, sig * // First we need to load the value to a temporary just like ^^. intTmp, floatTmp := x11VReg, v11VReg loadIntoTmpReg := m.allocateInstr() - mode := addressMode{kind: addressModeKindPostIndex, rn: arg0ret0AddrReg} + mode := m.amodePool.Allocate() + *mode = addressMode{kind: addressModeKindPostIndex, rn: arg0ret0AddrReg} var resultReg regalloc.VReg switch r.Type { case ssa.TypeI32: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - loadIntoTmpReg.asULoad(operandNR(intTmp), mode, 32) + loadIntoTmpReg.asULoad(intTmp, mode, 32) resultReg = intTmp case ssa.TypeI64: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - loadIntoTmpReg.asULoad(operandNR(intTmp), mode, 64) + loadIntoTmpReg.asULoad(intTmp, mode, 64) resultReg = intTmp case ssa.TypeF32: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - loadIntoTmpReg.asFpuLoad(operandNR(floatTmp), mode, 32) + loadIntoTmpReg.asFpuLoad(floatTmp, mode, 32) resultReg = floatTmp case ssa.TypeF64: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - loadIntoTmpReg.asFpuLoad(operandNR(floatTmp), mode, 64) + loadIntoTmpReg.asFpuLoad(floatTmp, mode, 64) resultReg = floatTmp case ssa.TypeV128: mode.imm = 16 - loadIntoTmpReg.asFpuLoad(operandNR(floatTmp), mode, 128) + loadIntoTmpReg.asFpuLoad(floatTmp, mode, 128) resultReg = floatTmp default: panic("TODO") @@ -258,12 +259,13 @@ func (m *machine) saveRegistersInExecutionContext(cur *instruction, regs []regal case regalloc.RegTypeFloat: sizeInBits = 128 } - store.asStore(operandNR(v), - addressMode{ - kind: addressModeKindRegUnsignedImm12, - // Execution context is always the first argument. - rn: x0VReg, imm: offset, - }, sizeInBits) + mode := m.amodePool.Allocate() + *mode = addressMode{ + kind: addressModeKindRegUnsignedImm12, + // Execution context is always the first argument. + rn: x0VReg, imm: offset, + } + store.asStore(operandNR(v), mode, sizeInBits) store.prev = cur cur.next = store cur = store @@ -276,7 +278,7 @@ func (m *machine) restoreRegistersInExecutionContext(cur *instruction, regs []re offset := wazevoapi.ExecutionContextOffsetSavedRegistersBegin.I64() for _, v := range regs { load := m.allocateInstr() - var as func(dst operand, amode addressMode, sizeInBits byte) + var as func(dst regalloc.VReg, amode *addressMode, sizeInBits byte) var sizeInBits byte switch v.RegType() { case regalloc.RegTypeInt: @@ -286,12 +288,13 @@ func (m *machine) restoreRegistersInExecutionContext(cur *instruction, regs []re as = load.asFpuLoad sizeInBits = 128 } - as(operandNR(v), - addressMode{ - kind: addressModeKindRegUnsignedImm12, - // Execution context is always the first argument. - rn: x0VReg, imm: offset, - }, sizeInBits) + mode := m.amodePool.Allocate() + *mode = addressMode{ + kind: addressModeKindRegUnsignedImm12, + // Execution context is always the first argument. + rn: x0VReg, imm: offset, + } + as(v, mode, sizeInBits) cur = linkInstr(cur, load) offset += 16 // Imm12 must be aligned 16 for vector regs, so we unconditionally load regs at the offset of multiple of 16. } @@ -324,11 +327,9 @@ func (m *machine) setExitCode(cur *instruction, execCtr regalloc.VReg, exitCode // Set the exit status on the execution context. setExistStatus := m.allocateInstr() - setExistStatus.asStore(operandNR(constReg), - addressMode{ - kind: addressModeKindRegUnsignedImm12, - rn: execCtr, imm: wazevoapi.ExecutionContextOffsetExitCodeOffset.I64(), - }, 32) + mode := m.amodePool.Allocate() + *mode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: execCtr, imm: wazevoapi.ExecutionContextOffsetExitCodeOffset.I64()} + setExistStatus.asStore(operandNR(constReg), mode, 32) cur = linkInstr(cur, setExistStatus) return cur } @@ -340,12 +341,13 @@ func (m *machine) storeReturnAddressAndExit(cur *instruction) *instruction { cur = linkInstr(cur, adr) storeReturnAddr := m.allocateInstr() - storeReturnAddr.asStore(operandNR(tmpRegVReg), - addressMode{ - kind: addressModeKindRegUnsignedImm12, - // Execution context is always the first argument. - rn: x0VReg, imm: wazevoapi.ExecutionContextOffsetGoCallReturnAddress.I64(), - }, 64) + mode := m.amodePool.Allocate() + *mode = addressMode{ + kind: addressModeKindRegUnsignedImm12, + // Execution context is always the first argument. + rn: x0VReg, imm: wazevoapi.ExecutionContextOffsetGoCallReturnAddress.I64(), + } + storeReturnAddr.asStore(operandNR(tmpRegVReg), mode, 64) cur = linkInstr(cur, storeReturnAddr) // Exit the execution. @@ -364,11 +366,12 @@ func (m *machine) saveCurrentStackPointer(cur *instruction, execCtr regalloc.VRe cur = linkInstr(cur, movSp) strSp := m.allocateInstr() - strSp.asStore(operandNR(tmpRegVReg), - addressMode{ - kind: addressModeKindRegUnsignedImm12, - rn: execCtr, imm: wazevoapi.ExecutionContextOffsetStackPointerBeforeGoCall.I64(), - }, 64) + mode := m.amodePool.Allocate() + *mode = addressMode{ + kind: addressModeKindRegUnsignedImm12, + rn: execCtr, imm: wazevoapi.ExecutionContextOffsetStackPointerBeforeGoCall.I64(), + } + strSp.asStore(operandNR(tmpRegVReg), mode, 64) cur = linkInstr(cur, strSp) return cur } @@ -376,27 +379,28 @@ func (m *machine) saveCurrentStackPointer(cur *instruction, execCtr regalloc.VRe func (m *machine) goFunctionCallLoadStackArg(cur *instruction, originalArg0Reg regalloc.VReg, arg *backend.ABIArg, intVReg, floatVReg regalloc.VReg) (*instruction, regalloc.VReg) { load := m.allocateInstr() var result regalloc.VReg - mode := addressMode{kind: addressModeKindPostIndex, rn: originalArg0Reg} + mode := m.amodePool.Allocate() + *mode = addressMode{kind: addressModeKindPostIndex, rn: originalArg0Reg} switch arg.Type { case ssa.TypeI32: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - load.asULoad(operandNR(intVReg), mode, 32) + load.asULoad(intVReg, mode, 32) result = intVReg case ssa.TypeI64: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - load.asULoad(operandNR(intVReg), mode, 64) + load.asULoad(intVReg, mode, 64) result = intVReg case ssa.TypeF32: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - load.asFpuLoad(operandNR(floatVReg), mode, 32) + load.asFpuLoad(floatVReg, mode, 32) result = floatVReg case ssa.TypeF64: mode.imm = 8 // We use uint64 for all basic types, except SIMD v128. - load.asFpuLoad(operandNR(floatVReg), mode, 64) + load.asFpuLoad(floatVReg, mode, 64) result = floatVReg case ssa.TypeV128: mode.imm = 16 - load.asFpuLoad(operandNR(floatVReg), mode, 128) + load.asFpuLoad(floatVReg, mode, 128) result = floatVReg default: panic("TODO") @@ -408,7 +412,8 @@ func (m *machine) goFunctionCallLoadStackArg(cur *instruction, originalArg0Reg r func (m *machine) goFunctionCallStoreStackResult(cur *instruction, originalRet0Reg regalloc.VReg, result *backend.ABIArg, resultVReg regalloc.VReg) *instruction { store := m.allocateInstr() - mode := addressMode{kind: addressModeKindPostIndex, rn: originalRet0Reg} + mode := m.amodePool.Allocate() + *mode = addressMode{kind: addressModeKindPostIndex, rn: originalRet0Reg} var sizeInBits byte switch result.Type { case ssa.TypeI32, ssa.TypeF32: diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/instr.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/instr.go index 8aabc5997b..7121cb5382 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/instr.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/instr.go @@ -3,10 +3,12 @@ package arm64 import ( "fmt" "math" + "unsafe" "github.com/tetratelabs/wazero/internal/engine/wazevo/backend" "github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc" "github.com/tetratelabs/wazero/internal/engine/wazevo/ssa" + "github.com/tetratelabs/wazero/internal/engine/wazevo/wazevoapi" ) type ( @@ -22,9 +24,9 @@ type ( // TODO: optimize the layout later once the impl settles. instruction struct { prev, next *instruction - u1, u2, u3 uint64 - rd, rm, rn, ra operand - amode addressMode + u1, u2 uint64 + rd regalloc.VReg + rm, rn operand kind instructionKind addedBeforeRegAlloc bool } @@ -174,7 +176,7 @@ func (i *instruction) Defs(regs *[]regalloc.VReg) []regalloc.VReg { switch defKinds[i.kind] { case defKindNone: case defKindRD: - *regs = append(*regs, i.rd.nr()) + *regs = append(*regs, i.rd) case defKindCall: _, _, retIntRealRegs, retFloatRealRegs, _ := backend.ABIInfoFromUint64(i.u2) for i := byte(0); i < retIntRealRegs; i++ { @@ -194,7 +196,7 @@ func (i *instruction) AssignDef(reg regalloc.VReg) { switch defKinds[i.kind] { case defKindNone: case defKindRD: - i.rd = i.rd.assignReg(reg) + i.rd = reg case defKindCall: panic("BUG: call instructions shouldn't be assigned") default: @@ -329,7 +331,7 @@ func (i *instruction) Uses(regs *[]regalloc.VReg) []regalloc.VReg { if rm := i.rm.reg(); rm.Valid() { *regs = append(*regs, rm) } - if ra := i.ra.reg(); ra.Valid() { + if ra := regalloc.VReg(i.u2); ra.Valid() { *regs = append(*regs, ra) } case useKindRNRN1RM: @@ -341,18 +343,20 @@ func (i *instruction) Uses(regs *[]regalloc.VReg) []regalloc.VReg { *regs = append(*regs, rm) } case useKindAMode: - if amodeRN := i.amode.rn; amodeRN.Valid() { + amode := i.getAmode() + if amodeRN := amode.rn; amodeRN.Valid() { *regs = append(*regs, amodeRN) } - if amodeRM := i.amode.rm; amodeRM.Valid() { + if amodeRM := amode.rm; amodeRM.Valid() { *regs = append(*regs, amodeRM) } case useKindRNAMode: *regs = append(*regs, i.rn.reg()) - if amodeRN := i.amode.rn; amodeRN.Valid() { + amode := i.getAmode() + if amodeRN := amode.rn; amodeRN.Valid() { *regs = append(*regs, amodeRN) } - if amodeRM := i.amode.rm; amodeRM.Valid() { + if amodeRM := amode.rm; amodeRM.Valid() { *regs = append(*regs, amodeRM) } case useKindCond: @@ -374,7 +378,7 @@ func (i *instruction) Uses(regs *[]regalloc.VReg) []regalloc.VReg { case useKindRDRewrite: *regs = append(*regs, i.rn.reg()) *regs = append(*regs, i.rm.reg()) - *regs = append(*regs, i.rd.reg()) + *regs = append(*regs, i.rd) default: panic(fmt.Sprintf("useKind for %v not defined", i)) } @@ -408,8 +412,8 @@ func (i *instruction) AssignUse(index int, reg regalloc.VReg) { i.rm = i.rm.assignReg(reg) } } else { - if rd := i.rd.reg(); rd.Valid() { - i.rd = i.rd.assignReg(reg) + if rd := i.rd; rd.Valid() { + i.rd = reg } } case useKindRNRN1RM: @@ -435,32 +439,36 @@ func (i *instruction) AssignUse(index int, reg regalloc.VReg) { i.rm = i.rm.assignReg(reg) } } else { - if ra := i.ra.reg(); ra.Valid() { - i.ra = i.ra.assignReg(reg) + if ra := regalloc.VReg(i.u2); ra.Valid() { + i.u2 = uint64(reg) } } case useKindAMode: if index == 0 { - if amodeRN := i.amode.rn; amodeRN.Valid() { - i.amode.rn = reg + amode := i.getAmode() + if amodeRN := amode.rn; amodeRN.Valid() { + amode.rn = reg } } else { - if amodeRM := i.amode.rm; amodeRM.Valid() { - i.amode.rm = reg + amode := i.getAmode() + if amodeRM := amode.rm; amodeRM.Valid() { + amode.rm = reg } } case useKindRNAMode: if index == 0 { i.rn = i.rn.assignReg(reg) } else if index == 1 { - if amodeRN := i.amode.rn; amodeRN.Valid() { - i.amode.rn = reg + amode := i.getAmode() + if amodeRN := amode.rn; amodeRN.Valid() { + amode.rn = reg } else { panic("BUG") } } else { - if amodeRM := i.amode.rm; amodeRM.Valid() { - i.amode.rm = reg + amode := i.getAmode() + if amodeRM := amode.rm; amodeRM.Valid() { + amode.rm = reg } else { panic("BUG") } @@ -503,35 +511,35 @@ func (i *instruction) callFuncRef() ssa.FuncRef { } // shift must be divided by 16 and must be in range 0-3 (if dst64bit is true) or 0-1 (if dst64bit is false) -func (i *instruction) asMOVZ(dst regalloc.VReg, imm uint64, shift uint64, dst64bit bool) { +func (i *instruction) asMOVZ(dst regalloc.VReg, imm uint64, shift uint32, dst64bit bool) { i.kind = movZ - i.rd = operandNR(dst) + i.rd = dst i.u1 = imm - i.u2 = shift + i.u2 = uint64(shift) if dst64bit { - i.u3 = 1 + i.u2 |= 1 << 32 } } // shift must be divided by 16 and must be in range 0-3 (if dst64bit is true) or 0-1 (if dst64bit is false) -func (i *instruction) asMOVK(dst regalloc.VReg, imm uint64, shift uint64, dst64bit bool) { +func (i *instruction) asMOVK(dst regalloc.VReg, imm uint64, shift uint32, dst64bit bool) { i.kind = movK - i.rd = operandNR(dst) + i.rd = dst i.u1 = imm - i.u2 = shift + i.u2 = uint64(shift) if dst64bit { - i.u3 = 1 + i.u2 |= 1 << 32 } } // shift must be divided by 16 and must be in range 0-3 (if dst64bit is true) or 0-1 (if dst64bit is false) -func (i *instruction) asMOVN(dst regalloc.VReg, imm uint64, shift uint64, dst64bit bool) { +func (i *instruction) asMOVN(dst regalloc.VReg, imm uint64, shift uint32, dst64bit bool) { i.kind = movN - i.rd = operandNR(dst) + i.rd = dst i.u1 = imm - i.u2 = shift + i.u2 = uint64(shift) if dst64bit { - i.u3 = 1 + i.u2 |= 1 << 32 } } @@ -553,21 +561,21 @@ func (i *instruction) asRet() { i.kind = ret } -func (i *instruction) asStorePair64(src1, src2 regalloc.VReg, amode addressMode) { +func (i *instruction) asStorePair64(src1, src2 regalloc.VReg, amode *addressMode) { i.kind = storeP64 i.rn = operandNR(src1) i.rm = operandNR(src2) - i.amode = amode + i.setAmode(amode) } -func (i *instruction) asLoadPair64(src1, src2 regalloc.VReg, amode addressMode) { +func (i *instruction) asLoadPair64(src1, src2 regalloc.VReg, amode *addressMode) { i.kind = loadP64 i.rn = operandNR(src1) i.rm = operandNR(src2) - i.amode = amode + i.setAmode(amode) } -func (i *instruction) asStore(src operand, amode addressMode, sizeInBits byte) { +func (i *instruction) asStore(src operand, amode *addressMode, sizeInBits byte) { switch sizeInBits { case 8: i.kind = store8 @@ -589,10 +597,10 @@ func (i *instruction) asStore(src operand, amode addressMode, sizeInBits byte) { i.kind = fpuStore128 } i.rn = src - i.amode = amode + i.setAmode(amode) } -func (i *instruction) asSLoad(dst operand, amode addressMode, sizeInBits byte) { +func (i *instruction) asSLoad(dst regalloc.VReg, amode *addressMode, sizeInBits byte) { switch sizeInBits { case 8: i.kind = sLoad8 @@ -604,10 +612,10 @@ func (i *instruction) asSLoad(dst operand, amode addressMode, sizeInBits byte) { panic("BUG") } i.rd = dst - i.amode = amode + i.setAmode(amode) } -func (i *instruction) asULoad(dst operand, amode addressMode, sizeInBits byte) { +func (i *instruction) asULoad(dst regalloc.VReg, amode *addressMode, sizeInBits byte) { switch sizeInBits { case 8: i.kind = uLoad8 @@ -619,10 +627,10 @@ func (i *instruction) asULoad(dst operand, amode addressMode, sizeInBits byte) { i.kind = uLoad64 } i.rd = dst - i.amode = amode + i.setAmode(amode) } -func (i *instruction) asFpuLoad(dst operand, amode addressMode, sizeInBits byte) { +func (i *instruction) asFpuLoad(dst regalloc.VReg, amode *addressMode, sizeInBits byte) { switch sizeInBits { case 32: i.kind = fpuLoad32 @@ -632,10 +640,18 @@ func (i *instruction) asFpuLoad(dst operand, amode addressMode, sizeInBits byte) i.kind = fpuLoad128 } i.rd = dst - i.amode = amode + i.setAmode(amode) } -func (i *instruction) asVecLoad1R(rd, rn operand, arr vecArrangement) { +func (i *instruction) getAmode() *addressMode { + return wazevoapi.PtrFromUintptr[addressMode](uintptr(i.u1)) +} + +func (i *instruction) setAmode(a *addressMode) { + i.u1 = uint64(uintptr(unsafe.Pointer(a))) +} + +func (i *instruction) asVecLoad1R(rd regalloc.VReg, rn operand, arr vecArrangement) { // NOTE: currently only has support for no-offset loads, though it is suspicious that // we would need to support offset load (that is only available for post-index). i.kind = vecLoad1R @@ -646,32 +662,32 @@ func (i *instruction) asVecLoad1R(rd, rn operand, arr vecArrangement) { func (i *instruction) asCSet(rd regalloc.VReg, mask bool, c condFlag) { i.kind = cSet - i.rd = operandNR(rd) + i.rd = rd i.u1 = uint64(c) if mask { i.u2 = 1 } } -func (i *instruction) asCSel(rd, rn, rm operand, c condFlag, _64bit bool) { +func (i *instruction) asCSel(rd regalloc.VReg, rn, rm operand, c condFlag, _64bit bool) { i.kind = cSel i.rd = rd i.rn = rn i.rm = rm i.u1 = uint64(c) if _64bit { - i.u3 = 1 + i.u2 = 1 } } -func (i *instruction) asFpuCSel(rd, rn, rm operand, c condFlag, _64bit bool) { +func (i *instruction) asFpuCSel(rd regalloc.VReg, rn, rm operand, c condFlag, _64bit bool) { i.kind = fpuCSel i.rd = rd i.rn = rn i.rm = rm i.u1 = uint64(c) if _64bit { - i.u3 = 1 + i.u2 = 1 } } @@ -691,7 +707,7 @@ func (i *instruction) asBrTableSequence(indexReg regalloc.VReg, targetIndex, tar } func (i *instruction) brTableSequenceOffsetsResolved() { - i.u3 = 1 // indicate that the offsets are resolved, for debugging. + i.rm.data = 1 // indicate that the offsets are resolved, for debugging. } func (i *instruction) brLabel() label { @@ -701,7 +717,7 @@ func (i *instruction) brLabel() label { // brOffsetResolved is called when the target label is resolved. func (i *instruction) brOffsetResolve(offset int64) { i.u2 = uint64(offset) - i.u3 = 1 // indicate that the offset is resolved, for debugging. + i.rm.data = 1 // indicate that the offset is resolved, for debugging. } func (i *instruction) brOffset() int64 { @@ -714,7 +730,7 @@ func (i *instruction) asCondBr(c cond, target label, is64bit bool) { i.u1 = c.asUint64() i.u2 = uint64(target) if is64bit { - i.u3 = 1 + i.u2 |= 1 << 32 } } @@ -728,17 +744,17 @@ func (i *instruction) condBrLabel() label { // condBrOffsetResolve is called when the target label is resolved. func (i *instruction) condBrOffsetResolve(offset int64) { - i.rd.data = uint64(offset) - i.rd.data2 = 1 // indicate that the offset is resolved, for debugging. + i.rn.data = uint64(offset) + i.rn.data2 = 1 // indicate that the offset is resolved, for debugging. } // condBrOffsetResolved returns true if condBrOffsetResolve is already called. func (i *instruction) condBrOffsetResolved() bool { - return i.rd.data2 == 1 + return i.rn.data2 == 1 } func (i *instruction) condBrOffset() int64 { - return int64(i.rd.data) + return int64(i.rn.data) } func (i *instruction) condBrCond() cond { @@ -746,33 +762,33 @@ func (i *instruction) condBrCond() cond { } func (i *instruction) condBr64bit() bool { - return i.u3 == 1 + return i.u2&(1<<32) != 0 } func (i *instruction) asLoadFpuConst32(rd regalloc.VReg, raw uint64) { i.kind = loadFpuConst32 i.u1 = raw - i.rd = operandNR(rd) + i.rd = rd } func (i *instruction) asLoadFpuConst64(rd regalloc.VReg, raw uint64) { i.kind = loadFpuConst64 i.u1 = raw - i.rd = operandNR(rd) + i.rd = rd } func (i *instruction) asLoadFpuConst128(rd regalloc.VReg, lo, hi uint64) { i.kind = loadFpuConst128 i.u1 = lo i.u2 = hi - i.rd = operandNR(rd) + i.rd = rd } func (i *instruction) asFpuCmp(rn, rm operand, is64bit bool) { i.kind = fpuCmp i.rn, i.rm = rn, rm if is64bit { - i.u3 = 1 + i.u1 = 1 } } @@ -783,12 +799,12 @@ func (i *instruction) asCCmpImm(rn operand, imm uint64, c condFlag, flag byte, i i.u1 = uint64(c) i.u2 = uint64(flag) if is64bit { - i.u3 = 1 + i.u2 |= 1 << 32 } } // asALU setups a basic ALU instruction. -func (i *instruction) asALU(aluOp aluOp, rd, rn, rm operand, dst64bit bool) { +func (i *instruction) asALU(aluOp aluOp, rd regalloc.VReg, rn, rm operand, dst64bit bool) { switch rm.kind { case operandKindNR: i.kind = aluRRR @@ -804,22 +820,22 @@ func (i *instruction) asALU(aluOp aluOp, rd, rn, rm operand, dst64bit bool) { i.u1 = uint64(aluOp) i.rd, i.rn, i.rm = rd, rn, rm if dst64bit { - i.u3 = 1 + i.u2 |= 1 << 32 } } // asALU setups a basic ALU instruction. -func (i *instruction) asALURRRR(aluOp aluOp, rd, rn, rm, ra operand, dst64bit bool) { +func (i *instruction) asALURRRR(aluOp aluOp, rd regalloc.VReg, rn, rm operand, ra regalloc.VReg, dst64bit bool) { i.kind = aluRRRR i.u1 = uint64(aluOp) - i.rd, i.rn, i.rm, i.ra = rd, rn, rm, ra + i.rd, i.rn, i.rm, i.u2 = rd, rn, rm, uint64(ra) if dst64bit { - i.u3 = 1 + i.u1 |= 1 << 32 } } // asALUShift setups a shift based ALU instruction. -func (i *instruction) asALUShift(aluOp aluOp, rd, rn, rm operand, dst64bit bool) { +func (i *instruction) asALUShift(aluOp aluOp, rd regalloc.VReg, rn, rm operand, dst64bit bool) { switch rm.kind { case operandKindNR: i.kind = aluRRR // If the shift amount op is a register, then the instruction is encoded as a normal ALU instruction with two register operands. @@ -831,17 +847,17 @@ func (i *instruction) asALUShift(aluOp aluOp, rd, rn, rm operand, dst64bit bool) i.u1 = uint64(aluOp) i.rd, i.rn, i.rm = rd, rn, rm if dst64bit { - i.u3 = 1 + i.u2 |= 1 << 32 } } func (i *instruction) asALUBitmaskImm(aluOp aluOp, rd, rn regalloc.VReg, imm uint64, dst64bit bool) { i.kind = aluRRBitmaskImm i.u1 = uint64(aluOp) - i.rn, i.rd = operandNR(rn), operandNR(rd) + i.rn, i.rd = operandNR(rn), rd i.u2 = imm if dst64bit { - i.u3 = 1 + i.u1 |= 1 << 32 } } @@ -852,76 +868,76 @@ func (i *instruction) asMovToFPSR(rn regalloc.VReg) { func (i *instruction) asMovFromFPSR(rd regalloc.VReg) { i.kind = movFromFPSR - i.rd = operandNR(rd) + i.rd = rd } func (i *instruction) asBitRR(bitOp bitOp, rd, rn regalloc.VReg, is64bit bool) { i.kind = bitRR - i.rn, i.rd = operandNR(rn), operandNR(rd) + i.rn, i.rd = operandNR(rn), rd i.u1 = uint64(bitOp) if is64bit { i.u2 = 1 } } -func (i *instruction) asFpuRRR(op fpuBinOp, rd, rn, rm operand, dst64bit bool) { +func (i *instruction) asFpuRRR(op fpuBinOp, rd regalloc.VReg, rn, rm operand, dst64bit bool) { i.kind = fpuRRR i.u1 = uint64(op) i.rd, i.rn, i.rm = rd, rn, rm if dst64bit { - i.u3 = 1 + i.u2 = 1 } } -func (i *instruction) asFpuRR(op fpuUniOp, rd, rn operand, dst64bit bool) { +func (i *instruction) asFpuRR(op fpuUniOp, rd regalloc.VReg, rn operand, dst64bit bool) { i.kind = fpuRR i.u1 = uint64(op) i.rd, i.rn = rd, rn if dst64bit { - i.u3 = 1 + i.u2 = 1 } } func (i *instruction) asExtend(rd, rn regalloc.VReg, fromBits, toBits byte, signed bool) { i.kind = extend - i.rn, i.rd = operandNR(rn), operandNR(rd) + i.rn, i.rd = operandNR(rn), rd i.u1 = uint64(fromBits) i.u2 = uint64(toBits) if signed { - i.u3 = 1 + i.u2 |= 1 << 32 } } func (i *instruction) asMove32(rd, rn regalloc.VReg) { i.kind = mov32 - i.rn, i.rd = operandNR(rn), operandNR(rd) + i.rn, i.rd = operandNR(rn), rd } func (i *instruction) asMove64(rd, rn regalloc.VReg) *instruction { i.kind = mov64 - i.rn, i.rd = operandNR(rn), operandNR(rd) + i.rn, i.rd = operandNR(rn), rd return i } func (i *instruction) asFpuMov64(rd, rn regalloc.VReg) { i.kind = fpuMov64 - i.rn, i.rd = operandNR(rn), operandNR(rd) + i.rn, i.rd = operandNR(rn), rd } func (i *instruction) asFpuMov128(rd, rn regalloc.VReg) *instruction { i.kind = fpuMov128 - i.rn, i.rd = operandNR(rn), operandNR(rd) + i.rn, i.rd = operandNR(rn), rd return i } -func (i *instruction) asMovToVec(rd, rn operand, arr vecArrangement, index vecIndex) { +func (i *instruction) asMovToVec(rd regalloc.VReg, rn operand, arr vecArrangement, index vecIndex) { i.kind = movToVec i.rd = rd i.rn = rn i.u1, i.u2 = uint64(arr), uint64(index) } -func (i *instruction) asMovFromVec(rd, rn operand, arr vecArrangement, index vecIndex, signed bool) { +func (i *instruction) asMovFromVec(rd regalloc.VReg, rn operand, arr vecArrangement, index vecIndex, signed bool) { if signed { i.kind = movFromVecSigned } else { @@ -932,48 +948,48 @@ func (i *instruction) asMovFromVec(rd, rn operand, arr vecArrangement, index vec i.u1, i.u2 = uint64(arr), uint64(index) } -func (i *instruction) asVecDup(rd, rn operand, arr vecArrangement) { +func (i *instruction) asVecDup(rd regalloc.VReg, rn operand, arr vecArrangement) { i.kind = vecDup i.u1 = uint64(arr) i.rn, i.rd = rn, rd } -func (i *instruction) asVecDupElement(rd, rn operand, arr vecArrangement, index vecIndex) { +func (i *instruction) asVecDupElement(rd regalloc.VReg, rn operand, arr vecArrangement, index vecIndex) { i.kind = vecDupElement i.u1 = uint64(arr) i.rn, i.rd = rn, rd i.u2 = uint64(index) } -func (i *instruction) asVecExtract(rd, rn, rm operand, arr vecArrangement, index uint32) { +func (i *instruction) asVecExtract(rd regalloc.VReg, rn, rm operand, arr vecArrangement, index uint32) { i.kind = vecExtract i.u1 = uint64(arr) i.rn, i.rm, i.rd = rn, rm, rd i.u2 = uint64(index) } -func (i *instruction) asVecMovElement(rd, rn operand, arr vecArrangement, rdIndex, rnIndex vecIndex) { +func (i *instruction) asVecMovElement(rd regalloc.VReg, rn operand, arr vecArrangement, rdIndex, rnIndex vecIndex) { i.kind = vecMovElement i.u1 = uint64(arr) - i.u2, i.u3 = uint64(rdIndex), uint64(rnIndex) + i.u2 = uint64(rdIndex) | uint64(rnIndex)<<32 i.rn, i.rd = rn, rd } -func (i *instruction) asVecMisc(op vecOp, rd, rn operand, arr vecArrangement) { +func (i *instruction) asVecMisc(op vecOp, rd regalloc.VReg, rn operand, arr vecArrangement) { i.kind = vecMisc i.u1 = uint64(op) i.rn, i.rd = rn, rd i.u2 = uint64(arr) } -func (i *instruction) asVecLanes(op vecOp, rd, rn operand, arr vecArrangement) { +func (i *instruction) asVecLanes(op vecOp, rd regalloc.VReg, rn operand, arr vecArrangement) { i.kind = vecLanes i.u1 = uint64(op) i.rn, i.rd = rn, rd i.u2 = uint64(arr) } -func (i *instruction) asVecShiftImm(op vecOp, rd, rn, rm operand, arr vecArrangement) *instruction { +func (i *instruction) asVecShiftImm(op vecOp, rd regalloc.VReg, rn, rm operand, arr vecArrangement) *instruction { i.kind = vecShiftImm i.u1 = uint64(op) i.rn, i.rm, i.rd = rn, rm, rd @@ -981,7 +997,7 @@ func (i *instruction) asVecShiftImm(op vecOp, rd, rn, rm operand, arr vecArrange return i } -func (i *instruction) asVecTbl(nregs byte, rd, rn, rm operand, arr vecArrangement) { +func (i *instruction) asVecTbl(nregs byte, rd regalloc.VReg, rn, rm operand, arr vecArrangement) { switch nregs { case 0, 1: i.kind = vecTbl @@ -1000,14 +1016,14 @@ func (i *instruction) asVecTbl(nregs byte, rd, rn, rm operand, arr vecArrangemen i.u2 = uint64(arr) } -func (i *instruction) asVecPermute(op vecOp, rd, rn, rm operand, arr vecArrangement) { +func (i *instruction) asVecPermute(op vecOp, rd regalloc.VReg, rn, rm operand, arr vecArrangement) { i.kind = vecPermute i.u1 = uint64(op) i.rn, i.rm, i.rd = rn, rm, rd i.u2 = uint64(arr) } -func (i *instruction) asVecRRR(op vecOp, rd, rn, rm operand, arr vecArrangement) *instruction { +func (i *instruction) asVecRRR(op vecOp, rd regalloc.VReg, rn, rm operand, arr vecArrangement) *instruction { i.kind = vecRRR i.u1 = uint64(op) i.rn, i.rd, i.rm = rn, rd, rm @@ -1017,7 +1033,7 @@ func (i *instruction) asVecRRR(op vecOp, rd, rn, rm operand, arr vecArrangement) // asVecRRRRewrite encodes a vector instruction that rewrites the destination register. // IMPORTANT: the destination register must be already defined before this instruction. -func (i *instruction) asVecRRRRewrite(op vecOp, rd, rn, rm operand, arr vecArrangement) { +func (i *instruction) asVecRRRRewrite(op vecOp, rd regalloc.VReg, rn, rm operand, arr vecArrangement) { i.kind = vecRRRRewrite i.u1 = uint64(op) i.rn, i.rd, i.rm = rn, rd, rm @@ -1033,8 +1049,8 @@ func (i *instruction) IsCopy() bool { // String implements fmt.Stringer. func (i *instruction) String() (str string) { - is64SizeBitToSize := func(u3 uint64) byte { - if u3 == 0 { + is64SizeBitToSize := func(v uint64) byte { + if v == 0 { return 32 } return 64 @@ -1049,46 +1065,46 @@ func (i *instruction) String() (str string) { str = "nop0" } case aluRRR: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u2 >> 32) str = fmt.Sprintf("%s %s, %s, %s", aluOp(i.u1).String(), - formatVRegSized(i.rd.nr(), size), formatVRegSized(i.rn.nr(), size), + formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size), i.rm.format(size)) case aluRRRR: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u1 >> 32) str = fmt.Sprintf("%s %s, %s, %s, %s", aluOp(i.u1).String(), - formatVRegSized(i.rd.nr(), size), formatVRegSized(i.rn.nr(), size), formatVRegSized(i.rm.nr(), size), formatVRegSized(i.ra.nr(), size)) + formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size), formatVRegSized(i.rm.nr(), size), formatVRegSized(regalloc.VReg(i.u2), size)) case aluRRImm12: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u2 >> 32) str = fmt.Sprintf("%s %s, %s, %s", aluOp(i.u1).String(), - formatVRegSized(i.rd.nr(), size), formatVRegSized(i.rn.nr(), size), i.rm.format(size)) + formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size), i.rm.format(size)) case aluRRBitmaskImm: - size := is64SizeBitToSize(i.u3) - rd, rn := formatVRegSized(i.rd.nr(), size), formatVRegSized(i.rn.nr(), size) + size := is64SizeBitToSize(i.u1 >> 32) + rd, rn := formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size) if size == 32 { str = fmt.Sprintf("%s %s, %s, #%#x", aluOp(i.u1).String(), rd, rn, uint32(i.u2)) } else { str = fmt.Sprintf("%s %s, %s, #%#x", aluOp(i.u1).String(), rd, rn, i.u2) } case aluRRImmShift: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u2 >> 32) str = fmt.Sprintf("%s %s, %s, %#x", aluOp(i.u1).String(), - formatVRegSized(i.rd.nr(), size), + formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size), i.rm.shiftImm(), ) case aluRRRShift: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u2 >> 32) str = fmt.Sprintf("%s %s, %s, %s", aluOp(i.u1).String(), - formatVRegSized(i.rd.nr(), size), + formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size), i.rm.format(size), ) case aluRRRExtend: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u2 >> 32) str = fmt.Sprintf("%s %s, %s, %s", aluOp(i.u1).String(), - formatVRegSized(i.rd.nr(), size), + formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size), // Regardless of the source size, the register is formatted in 32-bit. i.rm.format(32), @@ -1097,57 +1113,57 @@ func (i *instruction) String() (str string) { size := is64SizeBitToSize(i.u2) str = fmt.Sprintf("%s %s, %s", bitOp(i.u1), - formatVRegSized(i.rd.nr(), size), + formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size), ) case uLoad8: - str = fmt.Sprintf("ldrb %s, %s", formatVRegSized(i.rd.nr(), 32), i.amode.format(32)) + str = fmt.Sprintf("ldrb %s, %s", formatVRegSized(i.rd, 32), i.getAmode().format(32)) case sLoad8: - str = fmt.Sprintf("ldrsb %s, %s", formatVRegSized(i.rd.nr(), 32), i.amode.format(32)) + str = fmt.Sprintf("ldrsb %s, %s", formatVRegSized(i.rd, 32), i.getAmode().format(32)) case uLoad16: - str = fmt.Sprintf("ldrh %s, %s", formatVRegSized(i.rd.nr(), 32), i.amode.format(32)) + str = fmt.Sprintf("ldrh %s, %s", formatVRegSized(i.rd, 32), i.getAmode().format(32)) case sLoad16: - str = fmt.Sprintf("ldrsh %s, %s", formatVRegSized(i.rd.nr(), 32), i.amode.format(32)) + str = fmt.Sprintf("ldrsh %s, %s", formatVRegSized(i.rd, 32), i.getAmode().format(32)) case uLoad32: - str = fmt.Sprintf("ldr %s, %s", formatVRegSized(i.rd.nr(), 32), i.amode.format(32)) + str = fmt.Sprintf("ldr %s, %s", formatVRegSized(i.rd, 32), i.getAmode().format(32)) case sLoad32: - str = fmt.Sprintf("ldrs %s, %s", formatVRegSized(i.rd.nr(), 32), i.amode.format(32)) + str = fmt.Sprintf("ldrs %s, %s", formatVRegSized(i.rd, 32), i.getAmode().format(32)) case uLoad64: - str = fmt.Sprintf("ldr %s, %s", formatVRegSized(i.rd.nr(), 64), i.amode.format(64)) + str = fmt.Sprintf("ldr %s, %s", formatVRegSized(i.rd, 64), i.getAmode().format(64)) case store8: - str = fmt.Sprintf("strb %s, %s", formatVRegSized(i.rn.nr(), 32), i.amode.format(8)) + str = fmt.Sprintf("strb %s, %s", formatVRegSized(i.rn.nr(), 32), i.getAmode().format(8)) case store16: - str = fmt.Sprintf("strh %s, %s", formatVRegSized(i.rn.nr(), 32), i.amode.format(16)) + str = fmt.Sprintf("strh %s, %s", formatVRegSized(i.rn.nr(), 32), i.getAmode().format(16)) case store32: - str = fmt.Sprintf("str %s, %s", formatVRegSized(i.rn.nr(), 32), i.amode.format(32)) + str = fmt.Sprintf("str %s, %s", formatVRegSized(i.rn.nr(), 32), i.getAmode().format(32)) case store64: - str = fmt.Sprintf("str %s, %s", formatVRegSized(i.rn.nr(), 64), i.amode.format(64)) + str = fmt.Sprintf("str %s, %s", formatVRegSized(i.rn.nr(), 64), i.getAmode().format(64)) case storeP64: str = fmt.Sprintf("stp %s, %s, %s", - formatVRegSized(i.rn.nr(), 64), formatVRegSized(i.rm.nr(), 64), i.amode.format(64)) + formatVRegSized(i.rn.nr(), 64), formatVRegSized(i.rm.nr(), 64), i.getAmode().format(64)) case loadP64: str = fmt.Sprintf("ldp %s, %s, %s", - formatVRegSized(i.rn.nr(), 64), formatVRegSized(i.rm.nr(), 64), i.amode.format(64)) + formatVRegSized(i.rn.nr(), 64), formatVRegSized(i.rm.nr(), 64), i.getAmode().format(64)) case mov64: str = fmt.Sprintf("mov %s, %s", - formatVRegSized(i.rd.nr(), 64), + formatVRegSized(i.rd, 64), formatVRegSized(i.rn.nr(), 64)) case mov32: - str = fmt.Sprintf("mov %s, %s", formatVRegSized(i.rd.nr(), 32), formatVRegSized(i.rn.nr(), 32)) + str = fmt.Sprintf("mov %s, %s", formatVRegSized(i.rd, 32), formatVRegSized(i.rn.nr(), 32)) case movZ: - size := is64SizeBitToSize(i.u3) - str = fmt.Sprintf("movz %s, #%#x, lsl %d", formatVRegSized(i.rd.nr(), size), uint16(i.u1), i.u2*16) + size := is64SizeBitToSize(i.u2 >> 32) + str = fmt.Sprintf("movz %s, #%#x, lsl %d", formatVRegSized(i.rd, size), uint16(i.u1), uint32(i.u2)*16) case movN: - size := is64SizeBitToSize(i.u3) - str = fmt.Sprintf("movn %s, #%#x, lsl %d", formatVRegSized(i.rd.nr(), size), uint16(i.u1), i.u2*16) + size := is64SizeBitToSize(i.u2 >> 32) + str = fmt.Sprintf("movn %s, #%#x, lsl %d", formatVRegSized(i.rd, size), uint16(i.u1), uint32(i.u2)*16) case movK: - size := is64SizeBitToSize(i.u3) - str = fmt.Sprintf("movk %s, #%#x, lsl %d", formatVRegSized(i.rd.nr(), size), uint16(i.u1), i.u2*16) + size := is64SizeBitToSize(i.u2 >> 32) + str = fmt.Sprintf("movk %s, #%#x, lsl %d", formatVRegSized(i.rd, size), uint16(i.u1), uint32(i.u2)*16) case extend: fromBits, toBits := byte(i.u1), byte(i.u2) var signedStr string - if i.u3 == 1 { + if i.u2>>32 == 1 { signedStr = "s" } else { signedStr = "u" @@ -1161,39 +1177,39 @@ func (i *instruction) String() (str string) { case 32: fromStr = "w" } - str = fmt.Sprintf("%sxt%s %s, %s", signedStr, fromStr, formatVRegSized(i.rd.nr(), toBits), formatVRegSized(i.rn.nr(), 32)) + str = fmt.Sprintf("%sxt%s %s, %s", signedStr, fromStr, formatVRegSized(i.rd, toBits), formatVRegSized(i.rn.nr(), 32)) case cSel: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u2) str = fmt.Sprintf("csel %s, %s, %s, %s", - formatVRegSized(i.rd.nr(), size), + formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size), formatVRegSized(i.rm.nr(), size), condFlag(i.u1), ) case cSet: if i.u2 != 0 { - str = fmt.Sprintf("csetm %s, %s", formatVRegSized(i.rd.nr(), 64), condFlag(i.u1)) + str = fmt.Sprintf("csetm %s, %s", formatVRegSized(i.rd, 64), condFlag(i.u1)) } else { - str = fmt.Sprintf("cset %s, %s", formatVRegSized(i.rd.nr(), 64), condFlag(i.u1)) + str = fmt.Sprintf("cset %s, %s", formatVRegSized(i.rd, 64), condFlag(i.u1)) } case cCmpImm: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u2 >> 32) str = fmt.Sprintf("ccmp %s, #%#x, #%#x, %s", formatVRegSized(i.rn.nr(), size), i.rm.data, i.u2&0b1111, condFlag(i.u1)) case fpuMov64: str = fmt.Sprintf("mov %s, %s", - formatVRegVec(i.rd.nr(), vecArrangement8B, vecIndexNone), + formatVRegVec(i.rd, vecArrangement8B, vecIndexNone), formatVRegVec(i.rn.nr(), vecArrangement8B, vecIndexNone)) case fpuMov128: str = fmt.Sprintf("mov %s, %s", - formatVRegVec(i.rd.nr(), vecArrangement16B, vecIndexNone), + formatVRegVec(i.rd, vecArrangement16B, vecIndexNone), formatVRegVec(i.rn.nr(), vecArrangement16B, vecIndexNone)) case fpuMovFromVec: panic("TODO") case fpuRR: - dstSz := is64SizeBitToSize(i.u3) + dstSz := is64SizeBitToSize(i.u2) srcSz := dstSz op := fpuUniOp(i.u1) switch op { @@ -1203,38 +1219,38 @@ func (i *instruction) String() (str string) { srcSz = 64 } str = fmt.Sprintf("%s %s, %s", op.String(), - formatVRegSized(i.rd.nr(), dstSz), formatVRegSized(i.rn.nr(), srcSz)) + formatVRegSized(i.rd, dstSz), formatVRegSized(i.rn.nr(), srcSz)) case fpuRRR: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u2) str = fmt.Sprintf("%s %s, %s, %s", fpuBinOp(i.u1).String(), - formatVRegSized(i.rd.nr(), size), formatVRegSized(i.rn.nr(), size), formatVRegSized(i.rm.nr(), size)) + formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size), formatVRegSized(i.rm.nr(), size)) case fpuRRI: panic("TODO") case fpuRRRR: panic("TODO") case fpuCmp: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u1) str = fmt.Sprintf("fcmp %s, %s", formatVRegSized(i.rn.nr(), size), formatVRegSized(i.rm.nr(), size)) case fpuLoad32: - str = fmt.Sprintf("ldr %s, %s", formatVRegSized(i.rd.nr(), 32), i.amode.format(32)) + str = fmt.Sprintf("ldr %s, %s", formatVRegSized(i.rd, 32), i.getAmode().format(32)) case fpuStore32: - str = fmt.Sprintf("str %s, %s", formatVRegSized(i.rn.nr(), 32), i.amode.format(64)) + str = fmt.Sprintf("str %s, %s", formatVRegSized(i.rn.nr(), 32), i.getAmode().format(64)) case fpuLoad64: - str = fmt.Sprintf("ldr %s, %s", formatVRegSized(i.rd.nr(), 64), i.amode.format(64)) + str = fmt.Sprintf("ldr %s, %s", formatVRegSized(i.rd, 64), i.getAmode().format(64)) case fpuStore64: - str = fmt.Sprintf("str %s, %s", formatVRegSized(i.rn.nr(), 64), i.amode.format(64)) + str = fmt.Sprintf("str %s, %s", formatVRegSized(i.rn.nr(), 64), i.getAmode().format(64)) case fpuLoad128: - str = fmt.Sprintf("ldr %s, %s", formatVRegSized(i.rd.nr(), 128), i.amode.format(64)) + str = fmt.Sprintf("ldr %s, %s", formatVRegSized(i.rd, 128), i.getAmode().format(64)) case fpuStore128: - str = fmt.Sprintf("str %s, %s", formatVRegSized(i.rn.nr(), 128), i.amode.format(64)) + str = fmt.Sprintf("str %s, %s", formatVRegSized(i.rn.nr(), 128), i.getAmode().format(64)) case loadFpuConst32: - str = fmt.Sprintf("ldr %s, #8; b 8; data.f32 %f", formatVRegSized(i.rd.nr(), 32), math.Float32frombits(uint32(i.u1))) + str = fmt.Sprintf("ldr %s, #8; b 8; data.f32 %f", formatVRegSized(i.rd, 32), math.Float32frombits(uint32(i.u1))) case loadFpuConst64: - str = fmt.Sprintf("ldr %s, #8; b 16; data.f64 %f", formatVRegSized(i.rd.nr(), 64), math.Float64frombits(i.u1)) + str = fmt.Sprintf("ldr %s, #8; b 16; data.f64 %f", formatVRegSized(i.rd, 64), math.Float64frombits(i.u1)) case loadFpuConst128: str = fmt.Sprintf("ldr %s, #8; b 32; data.v128 %016x %016x", - formatVRegSized(i.rd.nr(), 128), i.u1, i.u2) + formatVRegSized(i.rd, 128), i.u1, i.u2) case fpuToInt: var op, src, dst string if signed := i.u1 == 1; signed { @@ -1242,15 +1258,15 @@ func (i *instruction) String() (str string) { } else { op = "fcvtzu" } - if src64 := i.u2 == 1; src64 { + if src64 := i.u2&1 != 0; src64 { src = formatVRegWidthVec(i.rn.nr(), vecArrangementD) } else { src = formatVRegWidthVec(i.rn.nr(), vecArrangementS) } - if dst64 := i.u3 == 1; dst64 { - dst = formatVRegSized(i.rd.nr(), 64) + if dst64 := i.u2&2 != 0; dst64 { + dst = formatVRegSized(i.rd, 64) } else { - dst = formatVRegSized(i.rd.nr(), 32) + dst = formatVRegSized(i.rd, 32) } str = fmt.Sprintf("%s %s, %s", op, dst, src) @@ -1261,21 +1277,21 @@ func (i *instruction) String() (str string) { } else { op = "ucvtf" } - if src64 := i.u2 == 1; src64 { + if src64 := i.u2&1 != 0; src64 { src = formatVRegSized(i.rn.nr(), 64) } else { src = formatVRegSized(i.rn.nr(), 32) } - if dst64 := i.u3 == 1; dst64 { - dst = formatVRegWidthVec(i.rd.nr(), vecArrangementD) + if dst64 := i.u2&2 != 0; dst64 { + dst = formatVRegWidthVec(i.rd, vecArrangementD) } else { - dst = formatVRegWidthVec(i.rd.nr(), vecArrangementS) + dst = formatVRegWidthVec(i.rd, vecArrangementS) } str = fmt.Sprintf("%s %s, %s", op, dst, src) case fpuCSel: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u2) str = fmt.Sprintf("fcsel %s, %s, %s, %s", - formatVRegSized(i.rd.nr(), size), + formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), size), formatVRegSized(i.rm.nr(), size), condFlag(i.u1), @@ -1291,7 +1307,7 @@ func (i *instruction) String() (str string) { default: panic("unsupported arrangement " + arr.String()) } - str = fmt.Sprintf("ins %s, %s", formatVRegVec(i.rd.nr(), arr, vecIndex(i.u2)), formatVRegSized(i.rn.nr(), size)) + str = fmt.Sprintf("ins %s, %s", formatVRegVec(i.rd, arr, vecIndex(i.u2)), formatVRegSized(i.rn.nr(), size)) case movFromVec, movFromVecSigned: var size byte var opcode string @@ -1315,23 +1331,23 @@ func (i *instruction) String() (str string) { default: panic("unsupported arrangement " + arr.String()) } - str = fmt.Sprintf("%s %s, %s", opcode, formatVRegSized(i.rd.nr(), size), formatVRegVec(i.rn.nr(), arr, vecIndex(i.u2))) + str = fmt.Sprintf("%s %s, %s", opcode, formatVRegSized(i.rd, size), formatVRegVec(i.rn.nr(), arr, vecIndex(i.u2))) case vecDup: str = fmt.Sprintf("dup %s, %s", - formatVRegVec(i.rd.nr(), vecArrangement(i.u1), vecIndexNone), + formatVRegVec(i.rd, vecArrangement(i.u1), vecIndexNone), formatVRegSized(i.rn.nr(), 64), ) case vecDupElement: arr := vecArrangement(i.u1) str = fmt.Sprintf("dup %s, %s", - formatVRegVec(i.rd.nr(), arr, vecIndexNone), + formatVRegVec(i.rd, arr, vecIndexNone), formatVRegVec(i.rn.nr(), arr, vecIndex(i.u2)), ) case vecDupFromFpu: panic("TODO") case vecExtract: str = fmt.Sprintf("ext %s, %s, %s, #%d", - formatVRegVec(i.rd.nr(), vecArrangement(i.u1), vecIndexNone), + formatVRegVec(i.rd, vecArrangement(i.u1), vecIndexNone), formatVRegVec(i.rn.nr(), vecArrangement(i.u1), vecIndexNone), formatVRegVec(i.rm.nr(), vecArrangement(i.u1), vecIndexNone), uint32(i.u2), @@ -1340,15 +1356,15 @@ func (i *instruction) String() (str string) { panic("TODO") case vecMovElement: str = fmt.Sprintf("mov %s, %s", - formatVRegVec(i.rd.nr(), vecArrangement(i.u1), vecIndex(i.u2)), - formatVRegVec(i.rn.nr(), vecArrangement(i.u1), vecIndex(i.u3)), + formatVRegVec(i.rd, vecArrangement(i.u1), vecIndex(i.u2&0xffffffff)), + formatVRegVec(i.rn.nr(), vecArrangement(i.u1), vecIndex(i.u2>>32)), ) case vecMiscNarrow: panic("TODO") case vecRRR, vecRRRRewrite: str = fmt.Sprintf("%s %s, %s, %s", vecOp(i.u1), - formatVRegVec(i.rd.nr(), vecArrangement(i.u2), vecIndexNone), + formatVRegVec(i.rd, vecArrangement(i.u2), vecIndexNone), formatVRegVec(i.rn.nr(), vecArrangement(i.u2), vecIndexNone), formatVRegVec(i.rm.nr(), vecArrangement(i.u2), vecIndexNone), ) @@ -1356,12 +1372,12 @@ func (i *instruction) String() (str string) { vop := vecOp(i.u1) if vop == vecOpCmeq0 { str = fmt.Sprintf("cmeq %s, %s, #0", - formatVRegVec(i.rd.nr(), vecArrangement(i.u2), vecIndexNone), + formatVRegVec(i.rd, vecArrangement(i.u2), vecIndexNone), formatVRegVec(i.rn.nr(), vecArrangement(i.u2), vecIndexNone)) } else { str = fmt.Sprintf("%s %s, %s", vop, - formatVRegVec(i.rd.nr(), vecArrangement(i.u2), vecIndexNone), + formatVRegVec(i.rd, vecArrangement(i.u2), vecIndexNone), formatVRegVec(i.rn.nr(), vecArrangement(i.u2), vecIndexNone)) } case vecLanes: @@ -1379,24 +1395,24 @@ func (i *instruction) String() (str string) { } str = fmt.Sprintf("%s %s, %s", vecOp(i.u1), - formatVRegWidthVec(i.rd.nr(), destArr), + formatVRegWidthVec(i.rd, destArr), formatVRegVec(i.rn.nr(), arr, vecIndexNone)) case vecShiftImm: arr := vecArrangement(i.u2) str = fmt.Sprintf("%s %s, %s, #%d", vecOp(i.u1), - formatVRegVec(i.rd.nr(), arr, vecIndexNone), + formatVRegVec(i.rd, arr, vecIndexNone), formatVRegVec(i.rn.nr(), arr, vecIndexNone), i.rm.shiftImm()) case vecTbl: arr := vecArrangement(i.u2) str = fmt.Sprintf("tbl %s, { %s }, %s", - formatVRegVec(i.rd.nr(), arr, vecIndexNone), + formatVRegVec(i.rd, arr, vecIndexNone), formatVRegVec(i.rn.nr(), vecArrangement16B, vecIndexNone), formatVRegVec(i.rm.nr(), arr, vecIndexNone)) case vecTbl2: arr := vecArrangement(i.u2) - rd, rn, rm := i.rd.nr(), i.rn.nr(), i.rm.nr() + rd, rn, rm := i.rd, i.rn.nr(), i.rm.nr() rn1 := regalloc.FromRealReg(rn.RealReg()+1, rn.RegType()) str = fmt.Sprintf("tbl %s, { %s, %s }, %s", formatVRegVec(rd, arr, vecIndexNone), @@ -1407,13 +1423,13 @@ func (i *instruction) String() (str string) { arr := vecArrangement(i.u2) str = fmt.Sprintf("%s %s, %s, %s", vecOp(i.u1), - formatVRegVec(i.rd.nr(), arr, vecIndexNone), + formatVRegVec(i.rd, arr, vecIndexNone), formatVRegVec(i.rn.nr(), arr, vecIndexNone), formatVRegVec(i.rm.nr(), arr, vecIndexNone)) case movToFPSR: str = fmt.Sprintf("msr fpsr, %s", formatVRegSized(i.rn.nr(), 64)) case movFromFPSR: - str = fmt.Sprintf("mrs %s fpsr", formatVRegSized(i.rd.nr(), 64)) + str = fmt.Sprintf("mrs %s fpsr", formatVRegSized(i.rd, 64)) case call: str = fmt.Sprintf("bl %s", ssa.FuncRef(i.u1)) case callInd: @@ -1422,15 +1438,15 @@ func (i *instruction) String() (str string) { str = "ret" case br: target := label(i.u1) - if i.u3 != 0 { + if i.rm.data != 0 { str = fmt.Sprintf("b #%#x (%s)", i.brOffset(), target.String()) } else { str = fmt.Sprintf("b %s", target.String()) } case condBr: - size := is64SizeBitToSize(i.u3) + size := is64SizeBitToSize(i.u2 >> 32) c := cond(i.u1) - target := label(i.u2) + target := label(i.u2 & 0xffffffff) switch c.kind() { case condKindRegisterZero: if !i.condBrOffsetResolved() { @@ -1456,7 +1472,7 @@ func (i *instruction) String() (str string) { } } case adr: - str = fmt.Sprintf("adr %s, #%#x", formatVRegSized(i.rd.nr(), 64), int64(i.u1)) + str = fmt.Sprintf("adr %s, #%#x", formatVRegSized(i.rd, 64), int64(i.u1)) case brTableSequence: targetIndex := i.u1 str = fmt.Sprintf("br_table_sequence %s, table_index=%d", formatVRegSized(i.rn.nr(), 64), targetIndex) @@ -1473,7 +1489,7 @@ func (i *instruction) String() (str string) { case 1: m = m + "b" } - str = fmt.Sprintf("%s %s, %s, %s", m, formatVRegSized(i.rm.nr(), size), formatVRegSized(i.rd.nr(), size), formatVRegSized(i.rn.nr(), 64)) + str = fmt.Sprintf("%s %s, %s, %s", m, formatVRegSized(i.rm.nr(), size), formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), 64)) case atomicCas: m := "casal" size := byte(32) @@ -1485,7 +1501,7 @@ func (i *instruction) String() (str string) { case 1: m = m + "b" } - str = fmt.Sprintf("%s %s, %s, %s", m, formatVRegSized(i.rd.nr(), size), formatVRegSized(i.rm.nr(), size), formatVRegSized(i.rn.nr(), 64)) + str = fmt.Sprintf("%s %s, %s, %s", m, formatVRegSized(i.rd, size), formatVRegSized(i.rm.nr(), size), formatVRegSized(i.rn.nr(), 64)) case atomicLoad: m := "ldar" size := byte(32) @@ -1497,7 +1513,7 @@ func (i *instruction) String() (str string) { case 1: m = m + "b" } - str = fmt.Sprintf("%s %s, %s", m, formatVRegSized(i.rd.nr(), size), formatVRegSized(i.rn.nr(), 64)) + str = fmt.Sprintf("%s %s, %s", m, formatVRegSized(i.rd, size), formatVRegSized(i.rn.nr(), 64)) case atomicStore: m := "stlr" size := byte(32) @@ -1517,9 +1533,9 @@ func (i *instruction) String() (str string) { case emitSourceOffsetInfo: str = fmt.Sprintf("source_offset_info %d", ssa.SourceOffset(i.u1)) case vecLoad1R: - str = fmt.Sprintf("ld1r {%s}, [%s]", formatVRegVec(i.rd.nr(), vecArrangement(i.u1), vecIndexNone), formatVRegSized(i.rn.nr(), 64)) + str = fmt.Sprintf("ld1r {%s}, [%s]", formatVRegVec(i.rd, vecArrangement(i.u1), vecIndexNone), formatVRegSized(i.rn.nr(), 64)) case loadConstBlockArg: - str = fmt.Sprintf("load_const_block_arg %s, %#x", formatVRegSized(i.rd.nr(), 64), i.u1) + str = fmt.Sprintf("load_const_block_arg %s, %#x", formatVRegSized(i.rd, 64), i.u1) default: panic(i.kind) } @@ -1528,26 +1544,26 @@ func (i *instruction) String() (str string) { func (i *instruction) asAdr(rd regalloc.VReg, offset int64) { i.kind = adr - i.rd = operandNR(rd) + i.rd = rd i.u1 = uint64(offset) } -func (i *instruction) asAtomicRmw(op atomicRmwOp, rn, rs, rt operand, size uint64) { +func (i *instruction) asAtomicRmw(op atomicRmwOp, rn, rs, rt regalloc.VReg, size uint64) { i.kind = atomicRmw - i.rd, i.rn, i.rm = rt, rn, rs + i.rd, i.rn, i.rm = rt, operandNR(rn), operandNR(rs) i.u1 = uint64(op) i.u2 = size } -func (i *instruction) asAtomicCas(rn, rs, rt operand, size uint64) { +func (i *instruction) asAtomicCas(rn, rs, rt regalloc.VReg, size uint64) { i.kind = atomicCas - i.rm, i.rn, i.rd = rt, rn, rs + i.rm, i.rn, i.rd = operandNR(rt), operandNR(rn), rs i.u2 = size } -func (i *instruction) asAtomicLoad(rn, rt operand, size uint64) { +func (i *instruction) asAtomicLoad(rn, rt regalloc.VReg, size uint64) { i.kind = atomicLoad - i.rn, i.rd = rn, rt + i.rn, i.rd = operandNR(rn), rt i.u2 = size } @@ -1755,12 +1771,12 @@ func (i *instruction) asLoadConstBlockArg(v uint64, typ ssa.Type, dst regalloc.V i.kind = loadConstBlockArg i.u1 = v i.u2 = uint64(typ) - i.rd = operandNR(dst) + i.rd = dst return i } func (i *instruction) loadConstBlockArgData() (v uint64, typ ssa.Type, dst regalloc.VReg) { - return i.u1, ssa.Type(i.u2), i.rd.nr() + return i.u1, ssa.Type(i.u2), i.rd } func (i *instruction) asEmitSourceOffsetInfo(l ssa.SourceOffset) *instruction { @@ -1778,7 +1794,7 @@ func (i *instruction) asUDF() *instruction { return i } -func (i *instruction) asFpuToInt(rd, rn operand, rdSigned, src64bit, dst64bit bool) { +func (i *instruction) asFpuToInt(rd regalloc.VReg, rn operand, rdSigned, src64bit, dst64bit bool) { i.kind = fpuToInt i.rn = rn i.rd = rd @@ -1789,11 +1805,11 @@ func (i *instruction) asFpuToInt(rd, rn operand, rdSigned, src64bit, dst64bit bo i.u2 = 1 } if dst64bit { - i.u3 = 1 + i.u2 |= 2 } } -func (i *instruction) asIntToFpu(rd, rn operand, rnSigned, src64bit, dst64bit bool) { +func (i *instruction) asIntToFpu(rd regalloc.VReg, rn operand, rnSigned, src64bit, dst64bit bool) { i.kind = intToFpu i.rn = rn i.rd = rd @@ -1804,7 +1820,7 @@ func (i *instruction) asIntToFpu(rd, rn operand, rnSigned, src64bit, dst64bit bo i.u2 = 1 } if dst64bit { - i.u3 = 1 + i.u2 |= 2 } } @@ -1817,7 +1833,7 @@ func (i *instruction) asExitSequence(ctx regalloc.VReg) *instruction { // aluOp determines the type of ALU operation. Instructions whose kind is one of // aluRRR, aluRRRR, aluRRImm12, aluRRBitmaskImm, aluRRImmShift, aluRRRShift and aluRRRExtend // would use this type. -type aluOp int +type aluOp uint32 func (a aluOp) String() string { switch a { diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/instr_encoding.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/instr_encoding.go index 227a964741..f0ede2d6aa 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/instr_encoding.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/instr_encoding.go @@ -44,12 +44,12 @@ func (i *instruction) encode(m *machine) { case callInd: c.Emit4Bytes(encodeUnconditionalBranchReg(regNumberInEncoding[i.rn.realReg()], true)) case store8, store16, store32, store64, fpuStore32, fpuStore64, fpuStore128: - c.Emit4Bytes(encodeLoadOrStore(i.kind, regNumberInEncoding[i.rn.realReg()], i.amode)) + c.Emit4Bytes(encodeLoadOrStore(i.kind, regNumberInEncoding[i.rn.realReg()], *i.getAmode())) case uLoad8, uLoad16, uLoad32, uLoad64, sLoad8, sLoad16, sLoad32, fpuLoad32, fpuLoad64, fpuLoad128: - c.Emit4Bytes(encodeLoadOrStore(i.kind, regNumberInEncoding[i.rd.realReg()], i.amode)) + c.Emit4Bytes(encodeLoadOrStore(i.kind, regNumberInEncoding[i.rd.RealReg()], *i.getAmode())) case vecLoad1R: c.Emit4Bytes(encodeVecLoad1R( - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], vecArrangement(i.u1))) case condBr: @@ -75,22 +75,22 @@ func (i *instruction) encode(m *machine) { panic("BUG") } case movN: - c.Emit4Bytes(encodeMoveWideImmediate(0b00, regNumberInEncoding[i.rd.realReg()], i.u1, i.u2, i.u3)) + c.Emit4Bytes(encodeMoveWideImmediate(0b00, regNumberInEncoding[i.rd.RealReg()], i.u1, uint32(i.u2), uint32(i.u2>>32))) case movZ: - c.Emit4Bytes(encodeMoveWideImmediate(0b10, regNumberInEncoding[i.rd.realReg()], i.u1, i.u2, i.u3)) + c.Emit4Bytes(encodeMoveWideImmediate(0b10, regNumberInEncoding[i.rd.RealReg()], i.u1, uint32(i.u2), uint32(i.u2>>32))) case movK: - c.Emit4Bytes(encodeMoveWideImmediate(0b11, regNumberInEncoding[i.rd.realReg()], i.u1, i.u2, i.u3)) + c.Emit4Bytes(encodeMoveWideImmediate(0b11, regNumberInEncoding[i.rd.RealReg()], i.u1, uint32(i.u2), uint32(i.u2>>32))) case mov32: - to, from := i.rd.realReg(), i.rn.realReg() + to, from := i.rd.RealReg(), i.rn.realReg() c.Emit4Bytes(encodeAsMov32(regNumberInEncoding[from], regNumberInEncoding[to])) case mov64: - to, from := i.rd.realReg(), i.rn.realReg() + to, from := i.rd.RealReg(), i.rn.realReg() toIsSp := to == sp fromIsSp := from == sp c.Emit4Bytes(encodeMov64(regNumberInEncoding[to], regNumberInEncoding[from], toIsSp, fromIsSp)) case loadP64, storeP64: rt, rt2 := regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()] - amode := i.amode + amode := i.getAmode() rn := regNumberInEncoding[amode.rn.RealReg()] var pre bool switch amode.kind { @@ -102,21 +102,21 @@ func (i *instruction) encode(m *machine) { } c.Emit4Bytes(encodePreOrPostIndexLoadStorePair64(pre, kind == loadP64, rn, rt, rt2, amode.imm)) case loadFpuConst32: - rd := regNumberInEncoding[i.rd.realReg()] + rd := regNumberInEncoding[i.rd.RealReg()] if i.u1 == 0 { c.Emit4Bytes(encodeVecRRR(vecOpEOR, rd, rd, rd, vecArrangement8B)) } else { encodeLoadFpuConst32(c, rd, i.u1) } case loadFpuConst64: - rd := regNumberInEncoding[i.rd.realReg()] + rd := regNumberInEncoding[i.rd.RealReg()] if i.u1 == 0 { c.Emit4Bytes(encodeVecRRR(vecOpEOR, rd, rd, rd, vecArrangement8B)) } else { - encodeLoadFpuConst64(c, regNumberInEncoding[i.rd.realReg()], i.u1) + encodeLoadFpuConst64(c, regNumberInEncoding[i.rd.RealReg()], i.u1) } case loadFpuConst128: - rd := regNumberInEncoding[i.rd.realReg()] + rd := regNumberInEncoding[i.rd.RealReg()] lo, hi := i.u1, i.u2 if lo == 0 && hi == 0 { c.Emit4Bytes(encodeVecRRR(vecOpEOR, rd, rd, rd, vecArrangement16B)) @@ -126,35 +126,35 @@ func (i *instruction) encode(m *machine) { case aluRRRR: c.Emit4Bytes(encodeAluRRRR( aluOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()], - regNumberInEncoding[i.ra.realReg()], - uint32(i.u3), + regNumberInEncoding[regalloc.VReg(i.u2).RealReg()], + uint32(i.u1>>32), )) case aluRRImmShift: c.Emit4Bytes(encodeAluRRImm( aluOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], uint32(i.rm.shiftImm()), - uint32(i.u3), + uint32(i.u2>>32), )) case aluRRR: rn := i.rn.realReg() c.Emit4Bytes(encodeAluRRR( aluOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[rn], regNumberInEncoding[i.rm.realReg()], - i.u3 == 1, + i.u2>>32 == 1, rn == sp, )) case aluRRRExtend: rm, exo, to := i.rm.er() c.Emit4Bytes(encodeAluRRRExtend( aluOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[rm.RealReg()], exo, @@ -164,25 +164,25 @@ func (i *instruction) encode(m *machine) { r, amt, sop := i.rm.sr() c.Emit4Bytes(encodeAluRRRShift( aluOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[r.RealReg()], uint32(amt), sop, - i.u3 == 1, + i.u2>>32 == 1, )) case aluRRBitmaskImm: c.Emit4Bytes(encodeAluBitmaskImmediate( aluOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], i.u2, - i.u3 == 1, + i.u1>>32 == 1, )) case bitRR: c.Emit4Bytes(encodeBitRR( bitOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], uint32(i.u2)), ) @@ -190,22 +190,22 @@ func (i *instruction) encode(m *machine) { imm12, shift := i.rm.imm12() c.Emit4Bytes(encodeAluRRImm12( aluOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], imm12, shift, - i.u3 == 1, + i.u2>>32 == 1, )) case fpuRRR: c.Emit4Bytes(encodeFpuRRR( fpuBinOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()], - i.u3 == 1, + i.u2 == 1, )) case fpuMov64, fpuMov128: // https://developer.arm.com/documentation/ddi0596/2021-12/SIMD-FP-Instructions/MOV--vector---Move-vector--an-alias-of-ORR--vector--register-- - rd := regNumberInEncoding[i.rd.realReg()] + rd := regNumberInEncoding[i.rd.RealReg()] rn := regNumberInEncoding[i.rn.realReg()] var q uint32 if kind == fpuMov128 { @@ -213,7 +213,7 @@ func (i *instruction) encode(m *machine) { } c.Emit4Bytes(q<<30 | 0b1110101<<21 | rn<<16 | 0b000111<<10 | rn<<5 | rd) case cSet: - rd := regNumberInEncoding[i.rd.realReg()] + rd := regNumberInEncoding[i.rd.RealReg()] cf := condFlag(i.u1) if i.u2 == 1 { // https://developer.arm.com/documentation/ddi0602/2022-03/Base-Instructions/CSETM--Conditional-Set-Mask--an-alias-of-CSINV- @@ -225,12 +225,12 @@ func (i *instruction) encode(m *machine) { c.Emit4Bytes(0b1001101010011111<<16 | uint32(cf.invert())<<12 | 0b111111<<5 | rd) } case extend: - c.Emit4Bytes(encodeExtend(i.u3 == 1, byte(i.u1), byte(i.u2), regNumberInEncoding[i.rd.realReg()], regNumberInEncoding[i.rn.realReg()])) + c.Emit4Bytes(encodeExtend((i.u2>>32) == 1, byte(i.u1), byte(i.u2), regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()])) case fpuCmp: // https://developer.arm.com/documentation/ddi0596/2020-12/SIMD-FP-Instructions/FCMP--Floating-point-quiet-Compare--scalar--?lang=en rn, rm := regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()] var ftype uint32 - if i.u3 == 1 { + if i.u1 == 1 { ftype = 0b01 // double precision. } c.Emit4Bytes(0b1111<<25 | ftype<<22 | 1<<21 | rm<<16 | 0b1<<13 | rn<<5) @@ -242,34 +242,34 @@ func (i *instruction) encode(m *machine) { c.Emit4Bytes(0) } case adr: - c.Emit4Bytes(encodeAdr(regNumberInEncoding[i.rd.realReg()], uint32(i.u1))) + c.Emit4Bytes(encodeAdr(regNumberInEncoding[i.rd.RealReg()], uint32(i.u1))) case cSel: c.Emit4Bytes(encodeConditionalSelect( kind, - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()], condFlag(i.u1), - i.u3 == 1, + i.u2 == 1, )) case fpuCSel: c.Emit4Bytes(encodeFpuCSel( - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()], condFlag(i.u1), - i.u3 == 1, + i.u2 == 1, )) case movToVec: c.Emit4Bytes(encodeMoveToVec( - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], vecArrangement(byte(i.u1)), vecIndex(i.u2), )) case movFromVec, movFromVecSigned: c.Emit4Bytes(encodeMoveFromVec( - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], vecArrangement(byte(i.u1)), vecIndex(i.u2), @@ -277,18 +277,18 @@ func (i *instruction) encode(m *machine) { )) case vecDup: c.Emit4Bytes(encodeVecDup( - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], vecArrangement(byte(i.u1)))) case vecDupElement: c.Emit4Bytes(encodeVecDupElement( - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], vecArrangement(byte(i.u1)), vecIndex(i.u2))) case vecExtract: c.Emit4Bytes(encodeVecExtract( - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()], vecArrangement(byte(i.u1)), @@ -296,35 +296,35 @@ func (i *instruction) encode(m *machine) { case vecPermute: c.Emit4Bytes(encodeVecPermute( vecOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()], vecArrangement(byte(i.u2)))) case vecMovElement: c.Emit4Bytes(encodeVecMovElement( - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], vecArrangement(i.u1), - uint32(i.u2), uint32(i.u3), + uint32(i.u2), uint32(i.u2>>32), )) case vecMisc: c.Emit4Bytes(encodeAdvancedSIMDTwoMisc( vecOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], vecArrangement(i.u2), )) case vecLanes: c.Emit4Bytes(encodeVecLanes( vecOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], vecArrangement(i.u2), )) case vecShiftImm: c.Emit4Bytes(encodeVecShiftImm( vecOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], uint32(i.rm.shiftImm()), vecArrangement(i.u2), @@ -332,7 +332,7 @@ func (i *instruction) encode(m *machine) { case vecTbl: c.Emit4Bytes(encodeVecTbl( 1, - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()], vecArrangement(i.u2)), @@ -340,7 +340,7 @@ func (i *instruction) encode(m *machine) { case vecTbl2: c.Emit4Bytes(encodeVecTbl( 2, - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()], vecArrangement(i.u2)), @@ -353,9 +353,9 @@ func (i *instruction) encode(m *machine) { case fpuRR: c.Emit4Bytes(encodeFloatDataOneSource( fpuUniOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], - i.u3 == 1, + i.u2 == 1, )) case vecRRR: if op := vecOp(i.u1); op == vecOpBsl || op == vecOpBit || op == vecOpUmlal { @@ -365,14 +365,14 @@ func (i *instruction) encode(m *machine) { case vecRRRRewrite: c.Emit4Bytes(encodeVecRRR( vecOp(i.u1), - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], regNumberInEncoding[i.rm.realReg()], vecArrangement(i.u2), )) case cCmpImm: // Conditional compare (immediate) in https://developer.arm.com/documentation/ddi0596/2020-12/Index-by-Encoding/Data-Processing----Register?lang=en - sf := uint32(i.u3 & 0b1) + sf := uint32((i.u2 >> 32) & 0b1) nzcv := uint32(i.u2 & 0b1111) cond := uint32(condFlag(i.u1)) imm := uint32(i.rm.data & 0b11111) @@ -381,7 +381,7 @@ func (i *instruction) encode(m *machine) { sf<<31 | 0b111101001<<22 | imm<<16 | cond<<12 | 0b1<<11 | rn<<5 | nzcv, ) case movFromFPSR: - rt := regNumberInEncoding[i.rd.realReg()] + rt := regNumberInEncoding[i.rd.RealReg()] c.Emit4Bytes(encodeSystemRegisterMove(rt, true)) case movToFPSR: rt := regNumberInEncoding[i.rn.realReg()] @@ -390,13 +390,13 @@ func (i *instruction) encode(m *machine) { c.Emit4Bytes(encodeAtomicRmw( atomicRmwOp(i.u1), regNumberInEncoding[i.rm.realReg()], - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rn.realReg()], uint32(i.u2), )) case atomicCas: c.Emit4Bytes(encodeAtomicCas( - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], regNumberInEncoding[i.rm.realReg()], regNumberInEncoding[i.rn.realReg()], uint32(i.u2), @@ -404,7 +404,7 @@ func (i *instruction) encode(m *machine) { case atomicLoad: c.Emit4Bytes(encodeAtomicLoadStore( regNumberInEncoding[i.rn.realReg()], - regNumberInEncoding[i.rd.realReg()], + regNumberInEncoding[i.rd.RealReg()], uint32(i.u2), 1, )) @@ -810,7 +810,7 @@ func encodeFloatDataOneSource(op fpuUniOp, rd, rn uint32, dst64bit bool) uint32 // encodeCnvBetweenFloatInt encodes as "Conversion between floating-point and integer" in // https://developer.arm.com/documentation/ddi0596/2020-12/Index-by-Encoding/Data-Processing----Scalar-Floating-Point-and-Advanced-SIMD?lang=en func encodeCnvBetweenFloatInt(i *instruction) uint32 { - rd := regNumberInEncoding[i.rd.realReg()] + rd := regNumberInEncoding[i.rd.RealReg()] rn := regNumberInEncoding[i.rn.realReg()] var opcode uint32 @@ -822,8 +822,8 @@ func encodeCnvBetweenFloatInt(i *instruction) uint32 { rmode = 0b00 signed := i.u1 == 1 - src64bit := i.u2 == 1 - dst64bit := i.u3 == 1 + src64bit := i.u2&1 != 0 + dst64bit := i.u2&2 != 0 if signed { opcode = 0b010 } else { @@ -841,8 +841,8 @@ func encodeCnvBetweenFloatInt(i *instruction) uint32 { rmode = 0b11 signed := i.u1 == 1 - src64bit := i.u2 == 1 - dst64bit := i.u3 == 1 + src64bit := i.u2&1 != 0 + dst64bit := i.u2&2 != 0 if signed { opcode = 0b000 @@ -1787,13 +1787,13 @@ func encodeCBZCBNZ(rt uint32, nz bool, imm19 uint32, _64bit bool) (ret uint32) { // https://developer.arm.com/documentation/ddi0596/2020-12/Index-by-Encoding/Data-Processing----Immediate?lang=en // // "shift" must have been divided by 16 at this point. -func encodeMoveWideImmediate(opc uint32, rd uint32, imm, shift, _64bit uint64) (ret uint32) { +func encodeMoveWideImmediate(opc uint32, rd uint32, imm uint64, shift, _64bit uint32) (ret uint32) { ret = rd ret |= uint32(imm&0xffff) << 5 - ret |= (uint32(shift)) << 21 + ret |= (shift) << 21 ret |= 0b100101 << 23 ret |= opc << 29 - ret |= uint32(_64bit) << 31 + ret |= _64bit << 31 return } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_constant.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_constant.go index 698b382d46..6c6824fb0a 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_constant.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_constant.go @@ -284,18 +284,18 @@ func (m *machine) load64bitConst(c int64, dst regalloc.VReg) { func (m *machine) insertMOVZ(dst regalloc.VReg, v uint64, shift int, dst64 bool) { instr := m.allocateInstr() - instr.asMOVZ(dst, v, uint64(shift), dst64) + instr.asMOVZ(dst, v, uint32(shift), dst64) m.insert(instr) } func (m *machine) insertMOVK(dst regalloc.VReg, v uint64, shift int, dst64 bool) { instr := m.allocateInstr() - instr.asMOVK(dst, v, uint64(shift), dst64) + instr.asMOVK(dst, v, uint32(shift), dst64) m.insert(instr) } func (m *machine) insertMOVN(dst regalloc.VReg, v uint64, shift int, dst64 bool) { instr := m.allocateInstr() - instr.asMOVN(dst, v, uint64(shift), dst64) + instr.asMOVN(dst, v, uint32(shift), dst64) m.insert(instr) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_instr.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_instr.go index 2bb234e8c1..048bf32040 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_instr.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_instr.go @@ -52,11 +52,11 @@ func (m *machine) lowerBrTable(i *ssa.Instruction) { maxIndexReg := m.compiler.AllocateVReg(ssa.TypeI32) m.lowerConstantI32(maxIndexReg, int32(len(targets)-1)) subs := m.allocateInstr() - subs.asALU(aluOpSubS, operandNR(xzrVReg), indexOperand, operandNR(maxIndexReg), false) + subs.asALU(aluOpSubS, xzrVReg, indexOperand, operandNR(maxIndexReg), false) m.insert(subs) csel := m.allocateInstr() adjustedIndex := m.compiler.AllocateVReg(ssa.TypeI32) - csel.asCSel(operandNR(adjustedIndex), operandNR(maxIndexReg), indexOperand, hs, false) + csel.asCSel(adjustedIndex, operandNR(maxIndexReg), indexOperand, hs, false) m.insert(csel) brSequence := m.allocateInstr() @@ -249,7 +249,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { rc := m.getOperand_NR(m.compiler.ValueDefinition(c), extModeNone) rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) m.lowerSelectVec(rc, rn, rm, rd) } else { m.lowerSelect(c, x, y, instr.Return()) @@ -270,7 +270,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { x, ctx := instr.Arg2() result := instr.Return() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(result)) + rd := m.compiler.VRegOf(result) ctxVReg := m.compiler.VRegOf(ctx) m.lowerFpuToInt(rd, rn, ctxVReg, true, x.Type() == ssa.TypeF64, result.Type().Bits() == 64, op == ssa.OpcodeFcvtToSintSat) @@ -278,7 +278,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { x, ctx := instr.Arg2() result := instr.Return() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(result)) + rd := m.compiler.VRegOf(result) ctxVReg := m.compiler.VRegOf(ctx) m.lowerFpuToInt(rd, rn, ctxVReg, false, x.Type() == ssa.TypeF64, result.Type().Bits() == 64, op == ssa.OpcodeFcvtToUintSat) @@ -286,25 +286,25 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { x := instr.Arg() result := instr.Return() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(result)) + rd := m.compiler.VRegOf(result) m.lowerIntToFpu(rd, rn, true, x.Type() == ssa.TypeI64, result.Type().Bits() == 64) case ssa.OpcodeFcvtFromUint: x := instr.Arg() result := instr.Return() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(result)) + rd := m.compiler.VRegOf(result) m.lowerIntToFpu(rd, rn, false, x.Type() == ssa.TypeI64, result.Type().Bits() == 64) case ssa.OpcodeFdemote: v := instr.Arg() rn := m.getOperand_NR(m.compiler.ValueDefinition(v), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) cnt := m.allocateInstr() cnt.asFpuRR(fpuUniOpCvt64To32, rd, rn, false) m.insert(cnt) case ssa.OpcodeFpromote: v := instr.Arg() rn := m.getOperand_NR(m.compiler.ValueDefinition(v), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) cnt := m.allocateInstr() cnt.asFpuRR(fpuUniOpCvt32To64, rd, rn, true) m.insert(cnt) @@ -343,15 +343,15 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { ctxVReg := m.compiler.VRegOf(ctx) rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) m.lowerIDiv(ctxVReg, rd, rn, rm, x.Type() == ssa.TypeI64, op == ssa.OpcodeSdiv) case ssa.OpcodeSrem, ssa.OpcodeUrem: x, y, ctx := instr.Arg3() ctxVReg := m.compiler.VRegOf(ctx) rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) - m.lowerIRem(ctxVReg, rd, rn, rm, x.Type() == ssa.TypeI64, op == ssa.OpcodeSrem) + rd := m.compiler.VRegOf(instr.Return()) + m.lowerIRem(ctxVReg, rd, rn.nr(), rm, x.Type() == ssa.TypeI64, op == ssa.OpcodeSrem) case ssa.OpcodeVconst: result := m.compiler.VRegOf(instr.Return()) lo, hi := instr.VconstData() @@ -362,7 +362,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { x := instr.Arg() ins := m.allocateInstr() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) ins.asVecMisc(vecOpNot, rd, rn, vecArrangement16B) m.insert(ins) case ssa.OpcodeVbxor: @@ -382,12 +382,12 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) creg := m.getOperand_NR(m.compiler.ValueDefinition(c), extModeNone) - tmp := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) + tmp := m.compiler.AllocateVReg(ssa.TypeV128) // creg is overwritten by BSL, so we need to move it to the result register before the instruction // in case when it is used somewhere else. mov := m.allocateInstr() - mov.asFpuMov128(tmp.nr(), creg.nr()) + mov.asFpuMov128(tmp, creg.nr()) m.insert(mov) ins := m.allocateInstr() @@ -396,7 +396,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { mov2 := m.allocateInstr() rd := m.compiler.VRegOf(instr.Return()) - mov2.asFpuMov128(rd, tmp.nr()) + mov2.asFpuMov128(rd, tmp) m.insert(mov2) case ssa.OpcodeVanyTrue, ssa.OpcodeVallTrue: x, lane := instr.ArgWithLane() @@ -405,12 +405,12 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { arr = ssaLaneToArrangement(lane) } rm := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) m.lowerVcheckTrue(op, rm, rd, arr) case ssa.OpcodeVhighBits: x, lane := instr.ArgWithLane() rm := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) arr := ssaLaneToArrangement(lane) m.lowerVhighBits(rm, rd, arr) case ssa.OpcodeVIadd: @@ -441,9 +441,9 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { panic("unsupported lane " + lane.String()) } - widenLo := m.allocateInstr().asVecShiftImm(widen, tmpLo, vv, operandShiftImm(0), loArr) - widenHi := m.allocateInstr().asVecShiftImm(widen, tmpHi, vv, operandShiftImm(0), hiArr) - addp := m.allocateInstr().asVecRRR(vecOpAddp, operandNR(m.compiler.VRegOf(instr.Return())), tmpLo, tmpHi, dstArr) + widenLo := m.allocateInstr().asVecShiftImm(widen, tmpLo.nr(), vv, operandShiftImm(0), loArr) + widenHi := m.allocateInstr().asVecShiftImm(widen, tmpHi.nr(), vv, operandShiftImm(0), hiArr) + addp := m.allocateInstr().asVecRRR(vecOpAddp, m.compiler.VRegOf(instr.Return()), tmpLo, tmpHi, dstArr) m.insert(widenLo) m.insert(widenHi) m.insert(addp) @@ -493,7 +493,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { arr := ssaLaneToArrangement(lane) rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) m.lowerVIMul(rd, rn, rm, arr) case ssa.OpcodeVIabs: m.lowerVecMisc(vecOpAbs, instr) @@ -507,7 +507,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { arr := ssaLaneToArrangement(lane) rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) m.lowerVShift(op, rd, rn, rm, arr) case ssa.OpcodeVSqrt: m.lowerVecMisc(vecOpFsqrt, instr) @@ -547,18 +547,18 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { x, lane := instr.ArgWithLane() arr := ssaLaneToArrangement(lane) rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) m.lowerVfpuToInt(rd, rn, arr, op == ssa.OpcodeVFcvtToSintSat) case ssa.OpcodeVFcvtFromSint, ssa.OpcodeVFcvtFromUint: x, lane := instr.ArgWithLane() arr := ssaLaneToArrangement(lane) rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) m.lowerVfpuFromInt(rd, rn, arr, op == ssa.OpcodeVFcvtFromSint) case ssa.OpcodeSwidenLow, ssa.OpcodeUwidenLow: x, lane := instr.ArgWithLane() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) var arr vecArrangement switch lane { @@ -580,7 +580,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { case ssa.OpcodeSwidenHigh, ssa.OpcodeUwidenHigh: x, lane := instr.ArgWithLane() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) arr := ssaLaneToArrangement(lane) @@ -607,9 +607,9 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { } rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) - tmp := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) + tmp := m.compiler.AllocateVReg(ssa.TypeV128) loQxtn := m.allocateInstr() hiQxtn := m.allocateInstr() @@ -628,7 +628,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { m.insert(hiQxtn) mov := m.allocateInstr() - mov.asFpuMov128(rd.nr(), tmp.nr()) + mov.asFpuMov128(rd, tmp) m.insert(mov) case ssa.OpcodeFvpromoteLow: x, lane := instr.ArgWithLane() @@ -637,7 +637,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { } ins := m.allocateInstr() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) ins.asVecMisc(vecOpFcvtl, rd, rn, vecArrangement2S) m.insert(ins) case ssa.OpcodeFvdemote: @@ -647,14 +647,14 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { } ins := m.allocateInstr() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) ins.asVecMisc(vecOpFcvtn, rd, rn, vecArrangement2S) m.insert(ins) case ssa.OpcodeExtractlane: x, index, signed, lane := instr.ExtractlaneData() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) mov := m.allocateInstr() switch lane { @@ -680,12 +680,12 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { x, y, index, lane := instr.InsertlaneData() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) - tmpReg := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) + rd := m.compiler.VRegOf(instr.Return()) + tmpReg := m.compiler.AllocateVReg(ssa.TypeV128) // Initially mov rn to tmp. mov1 := m.allocateInstr() - mov1.asFpuMov128(tmpReg.nr(), rn.nr()) + mov1.asFpuMov128(tmpReg, rn.nr()) m.insert(mov1) // movToVec and vecMovElement do not clear the remaining bits to zero, @@ -709,14 +709,14 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { // Finally mov tmp to rd. mov3 := m.allocateInstr() - mov3.asFpuMov128(rd.nr(), tmpReg.nr()) + mov3.asFpuMov128(rd, tmpReg) m.insert(mov3) case ssa.OpcodeSwizzle: x, y, lane := instr.Arg2WithLane() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) arr := ssaLaneToArrangement(lane) @@ -729,14 +729,14 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { x, y, lane1, lane2 := instr.ShuffleData() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) m.lowerShuffle(rd, rn, rm, lane1, lane2) case ssa.OpcodeSplat: x, lane := instr.ArgWithLane() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) dup := m.allocateInstr() switch lane { @@ -760,12 +760,12 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { xx, yy := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone), m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) tmp, tmp2 := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)), operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) - m.insert(m.allocateInstr().asVecRRR(vecOpSmull, tmp, xx, yy, vecArrangement8H)) - m.insert(m.allocateInstr().asVecRRR(vecOpSmull2, tmp2, xx, yy, vecArrangement8H)) - m.insert(m.allocateInstr().asVecRRR(vecOpAddp, tmp, tmp, tmp2, vecArrangement4S)) + m.insert(m.allocateInstr().asVecRRR(vecOpSmull, tmp.nr(), xx, yy, vecArrangement8H)) + m.insert(m.allocateInstr().asVecRRR(vecOpSmull2, tmp2.nr(), xx, yy, vecArrangement8H)) + m.insert(m.allocateInstr().asVecRRR(vecOpAddp, tmp.nr(), tmp, tmp2, vecArrangement4S)) - rd := operandNR(m.compiler.VRegOf(instr.Return())) - m.insert(m.allocateInstr().asFpuMov128(rd.nr(), tmp.nr())) + rd := m.compiler.VRegOf(instr.Return()) + m.insert(m.allocateInstr().asFpuMov128(rd, tmp.nr())) case ssa.OpcodeLoadSplat: ptr, offset, lane := instr.LoadSplatData() @@ -794,7 +794,7 @@ func (m *machine) LowerInstr(instr *ssa.Instruction) { m.executableContext.FlushPendingInstructions() } -func (m *machine) lowerShuffle(rd, rn, rm operand, lane1, lane2 uint64) { +func (m *machine) lowerShuffle(rd regalloc.VReg, rn, rm operand, lane1, lane2 uint64) { // `tbl2` requires 2 consecutive registers, so we arbitrarily pick v29, v30. vReg, wReg := v29VReg, v30VReg @@ -822,7 +822,7 @@ func (m *machine) lowerShuffle(rd, rn, rm operand, lane1, lane2 uint64) { m.insert(tbl2) } -func (m *machine) lowerVShift(op ssa.Opcode, rd, rn, rm operand, arr vecArrangement) { +func (m *machine) lowerVShift(op ssa.Opcode, rd regalloc.VReg, rn, rm operand, arr vecArrangement) { var modulo byte switch arr { case vecArrangement16B: @@ -847,13 +847,13 @@ func (m *machine) lowerVShift(op ssa.Opcode, rd, rn, rm operand, arr vecArrangem if op != ssa.OpcodeVIshl { // Negate the amount to make this as right shift. neg := m.allocateInstr() - neg.asALU(aluOpSub, rtmp, operandNR(xzrVReg), rtmp, true) + neg.asALU(aluOpSub, rtmp.nr(), operandNR(xzrVReg), rtmp, true) m.insert(neg) } // Copy the shift amount into a vector register as sshl/ushl requires it to be there. dup := m.allocateInstr() - dup.asVecDup(vtmp, rtmp, arr) + dup.asVecDup(vtmp.nr(), rtmp, arr) m.insert(dup) if op == ssa.OpcodeVIshl || op == ssa.OpcodeVSshr { @@ -867,7 +867,7 @@ func (m *machine) lowerVShift(op ssa.Opcode, rd, rn, rm operand, arr vecArrangem } } -func (m *machine) lowerVcheckTrue(op ssa.Opcode, rm, rd operand, arr vecArrangement) { +func (m *machine) lowerVcheckTrue(op ssa.Opcode, rm operand, rd regalloc.VReg, arr vecArrangement) { tmp := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) // Special case VallTrue for i64x2. @@ -878,11 +878,11 @@ func (m *machine) lowerVcheckTrue(op ssa.Opcode, rm, rd operand, arr vecArrangem // cset dst, eq ins := m.allocateInstr() - ins.asVecMisc(vecOpCmeq0, tmp, rm, vecArrangement2D) + ins.asVecMisc(vecOpCmeq0, tmp.nr(), rm, vecArrangement2D) m.insert(ins) addp := m.allocateInstr() - addp.asVecRRR(vecOpAddp, tmp, tmp, tmp, vecArrangement2D) + addp.asVecRRR(vecOpAddp, tmp.nr(), tmp, tmp, vecArrangement2D) m.insert(addp) fcmp := m.allocateInstr() @@ -890,7 +890,7 @@ func (m *machine) lowerVcheckTrue(op ssa.Opcode, rm, rd operand, arr vecArrangem m.insert(fcmp) cset := m.allocateInstr() - cset.asCSet(rd.nr(), false, eq) + cset.asCSet(rd, false, eq) m.insert(cset) return @@ -900,10 +900,10 @@ func (m *machine) lowerVcheckTrue(op ssa.Opcode, rm, rd operand, arr vecArrangem ins := m.allocateInstr() if op == ssa.OpcodeVanyTrue { // umaxp v4?.16b, v2?.16b, v2?.16b - ins.asVecRRR(vecOpUmaxp, tmp, rm, rm, vecArrangement16B) + ins.asVecRRR(vecOpUmaxp, tmp.nr(), rm, rm, vecArrangement16B) } else { // uminv d4?, v2?.4s - ins.asVecLanes(vecOpUminv, tmp, rm, arr) + ins.asVecLanes(vecOpUminv, tmp.nr(), rm, arr) } m.insert(ins) @@ -917,15 +917,15 @@ func (m *machine) lowerVcheckTrue(op ssa.Opcode, rm, rd operand, arr vecArrangem m.insert(movv) fc := m.allocateInstr() - fc.asCCmpImm(rd, uint64(0), al, 0, true) + fc.asCCmpImm(operandNR(rd), uint64(0), al, 0, true) m.insert(fc) cset := m.allocateInstr() - cset.asCSet(rd.nr(), false, ne) + cset.asCSet(rd, false, ne) m.insert(cset) } -func (m *machine) lowerVhighBits(rm, rd operand, arr vecArrangement) { +func (m *machine) lowerVhighBits(rm operand, rd regalloc.VReg, arr vecArrangement) { r0 := operandNR(m.compiler.AllocateVReg(ssa.TypeI64)) v0 := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) v1 := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) @@ -947,7 +947,7 @@ func (m *machine) lowerVhighBits(rm, rd operand, arr vecArrangement) { // Right arithmetic shift on the original vector and store the result into v1. So we have: // v1[i] = 0xff if vi<0, 0 otherwise. sshr := m.allocateInstr() - sshr.asVecShiftImm(vecOpSshr, v1, rm, operandShiftImm(7), vecArrangement16B) + sshr.asVecShiftImm(vecOpSshr, v1.nr(), rm, operandShiftImm(7), vecArrangement16B) m.insert(sshr) // Load the bit mask into r0. @@ -958,7 +958,7 @@ func (m *machine) lowerVhighBits(rm, rd operand, arr vecArrangement) { // dup r0 to v0. dup := m.allocateInstr() - dup.asVecDup(v0, r0, vecArrangement2D) + dup.asVecDup(v0.nr(), r0, vecArrangement2D) m.insert(dup) // Lane-wise logical AND with the bit mask, meaning that we have @@ -967,23 +967,23 @@ func (m *machine) lowerVhighBits(rm, rd operand, arr vecArrangement) { // Below, we use the following notation: // wi := (1 << i) if vi<0, 0 otherwise. and := m.allocateInstr() - and.asVecRRR(vecOpAnd, v1, v1, v0, vecArrangement16B) + and.asVecRRR(vecOpAnd, v1.nr(), v1, v0, vecArrangement16B) m.insert(and) // Swap the lower and higher 8 byte elements, and write it into v0, meaning that we have // v0[i] = w(i+8) if i < 8, w(i-8) otherwise. ext := m.allocateInstr() - ext.asVecExtract(v0, v1, v1, vecArrangement16B, uint32(8)) + ext.asVecExtract(v0.nr(), v1, v1, vecArrangement16B, uint32(8)) m.insert(ext) // v = [w0, w8, ..., w7, w15] zip1 := m.allocateInstr() - zip1.asVecPermute(vecOpZip1, v0, v1, v0, vecArrangement16B) + zip1.asVecPermute(vecOpZip1, v0.nr(), v1, v0, vecArrangement16B) m.insert(zip1) // v.h[0] = w0 + ... + w15 addv := m.allocateInstr() - addv.asVecLanes(vecOpAddv, v0, v0, vecArrangement8H) + addv.asVecLanes(vecOpAddv, v0.nr(), v0, vecArrangement8H) m.insert(addv) // Extract the v.h[0] as the result. @@ -1006,7 +1006,7 @@ func (m *machine) lowerVhighBits(rm, rd operand, arr vecArrangement) { // Right arithmetic shift on the original vector and store the result into v1. So we have: // v[i] = 0xffff if vi<0, 0 otherwise. sshr := m.allocateInstr() - sshr.asVecShiftImm(vecOpSshr, v1, rm, operandShiftImm(15), vecArrangement8H) + sshr.asVecShiftImm(vecOpSshr, v1.nr(), rm, operandShiftImm(15), vecArrangement8H) m.insert(sshr) // Load the bit mask into r0. @@ -1014,26 +1014,26 @@ func (m *machine) lowerVhighBits(rm, rd operand, arr vecArrangement) { // dup r0 to vector v0. dup := m.allocateInstr() - dup.asVecDup(v0, r0, vecArrangement2D) + dup.asVecDup(v0.nr(), r0, vecArrangement2D) m.insert(dup) lsl := m.allocateInstr() - lsl.asALUShift(aluOpLsl, r0, r0, operandShiftImm(4), true) + lsl.asALUShift(aluOpLsl, r0.nr(), r0, operandShiftImm(4), true) m.insert(lsl) movv := m.allocateInstr() - movv.asMovToVec(v0, r0, vecArrangementD, vecIndex(1)) + movv.asMovToVec(v0.nr(), r0, vecArrangementD, vecIndex(1)) m.insert(movv) // Lane-wise logical AND with the bitmask, meaning that we have // v[i] = (1 << i) if vi<0, 0 otherwise for i=0..3 // = (1 << (i+4)) if vi<0, 0 otherwise for i=3..7 and := m.allocateInstr() - and.asVecRRR(vecOpAnd, v0, v1, v0, vecArrangement16B) + and.asVecRRR(vecOpAnd, v0.nr(), v1, v0, vecArrangement16B) m.insert(and) addv := m.allocateInstr() - addv.asVecLanes(vecOpAddv, v0, v0, vecArrangement8H) + addv.asVecLanes(vecOpAddv, v0.nr(), v0, vecArrangement8H) m.insert(addv) movfv := m.allocateInstr() @@ -1055,7 +1055,7 @@ func (m *machine) lowerVhighBits(rm, rd operand, arr vecArrangement) { // Right arithmetic shift on the original vector and store the result into v1. So we have: // v[i] = 0xffffffff if vi<0, 0 otherwise. sshr := m.allocateInstr() - sshr.asVecShiftImm(vecOpSshr, v1, rm, operandShiftImm(31), vecArrangement4S) + sshr.asVecShiftImm(vecOpSshr, v1.nr(), rm, operandShiftImm(31), vecArrangement4S) m.insert(sshr) // Load the bit mask into r0. @@ -1063,26 +1063,26 @@ func (m *machine) lowerVhighBits(rm, rd operand, arr vecArrangement) { // dup r0 to vector v0. dup := m.allocateInstr() - dup.asVecDup(v0, r0, vecArrangement2D) + dup.asVecDup(v0.nr(), r0, vecArrangement2D) m.insert(dup) lsl := m.allocateInstr() - lsl.asALUShift(aluOpLsl, r0, r0, operandShiftImm(2), true) + lsl.asALUShift(aluOpLsl, r0.nr(), r0, operandShiftImm(2), true) m.insert(lsl) movv := m.allocateInstr() - movv.asMovToVec(v0, r0, vecArrangementD, vecIndex(1)) + movv.asMovToVec(v0.nr(), r0, vecArrangementD, vecIndex(1)) m.insert(movv) // Lane-wise logical AND with the bitmask, meaning that we have // v[i] = (1 << i) if vi<0, 0 otherwise for i in [0, 1] // = (1 << (i+4)) if vi<0, 0 otherwise for i in [2, 3] and := m.allocateInstr() - and.asVecRRR(vecOpAnd, v0, v1, v0, vecArrangement16B) + and.asVecRRR(vecOpAnd, v0.nr(), v1, v0, vecArrangement16B) m.insert(and) addv := m.allocateInstr() - addv.asVecLanes(vecOpAddv, v0, v0, vecArrangement4S) + addv.asVecLanes(vecOpAddv, v0.nr(), v0, vecArrangement4S) m.insert(addv) movfv := m.allocateInstr() @@ -1102,21 +1102,21 @@ func (m *machine) lowerVhighBits(rm, rd operand, arr vecArrangement) { // Move the higher 64-bit int into r0. movv1 := m.allocateInstr() - movv1.asMovFromVec(r0, rm, vecArrangementD, vecIndex(1), false) + movv1.asMovFromVec(r0.nr(), rm, vecArrangementD, vecIndex(1), false) m.insert(movv1) // Move the sign bit into the least significant bit. lsr1 := m.allocateInstr() - lsr1.asALUShift(aluOpLsr, r0, r0, operandShiftImm(63), true) + lsr1.asALUShift(aluOpLsr, r0.nr(), r0, operandShiftImm(63), true) m.insert(lsr1) lsr2 := m.allocateInstr() - lsr2.asALUShift(aluOpLsr, rd, rd, operandShiftImm(63), true) + lsr2.asALUShift(aluOpLsr, rd, operandNR(rd), operandShiftImm(63), true) m.insert(lsr2) // rd = (r0<<1) | rd lsl := m.allocateInstr() - lsl.asALU(aluOpAdd, rd, rd, operandSR(r0.nr(), 1, shiftOpLSL), false) + lsl.asALU(aluOpAdd, rd, operandNR(rd), operandSR(r0.nr(), 1, shiftOpLSL), false) m.insert(lsl) default: panic("Unsupported " + arr.String()) @@ -1128,7 +1128,7 @@ func (m *machine) lowerVecMisc(op vecOp, instr *ssa.Instruction) { arr := ssaLaneToArrangement(lane) ins := m.allocateInstr() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) ins.asVecMisc(op, rd, rn, arr) m.insert(ins) } @@ -1137,22 +1137,22 @@ func (m *machine) lowerVecRRR(op vecOp, x, y, ret ssa.Value, arr vecArrangement) ins := m.allocateInstr() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(ret)) + rd := m.compiler.VRegOf(ret) ins.asVecRRR(op, rd, rn, rm, arr) m.insert(ins) } -func (m *machine) lowerVIMul(rd, rn, rm operand, arr vecArrangement) { +func (m *machine) lowerVIMul(rd regalloc.VReg, rn, rm operand, arr vecArrangement) { if arr != vecArrangement2D { mul := m.allocateInstr() mul.asVecRRR(vecOpMul, rd, rn, rm, arr) m.insert(mul) } else { - tmp1 := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) - tmp2 := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) - tmp3 := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) + tmp1 := m.compiler.AllocateVReg(ssa.TypeV128) + tmp2 := m.compiler.AllocateVReg(ssa.TypeV128) + tmp3 := m.compiler.AllocateVReg(ssa.TypeV128) - tmpRes := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) + tmpRes := m.compiler.AllocateVReg(ssa.TypeV128) // Following the algorithm in https://chromium-review.googlesource.com/c/v8/v8/+/1781696 rev64 := m.allocateInstr() @@ -1160,7 +1160,7 @@ func (m *machine) lowerVIMul(rd, rn, rm operand, arr vecArrangement) { m.insert(rev64) mul := m.allocateInstr() - mul.asVecRRR(vecOpMul, tmp2, tmp2, rn, vecArrangement4S) + mul.asVecRRR(vecOpMul, tmp2, operandNR(tmp2), rn, vecArrangement4S) m.insert(mul) xtn1 := m.allocateInstr() @@ -1168,7 +1168,7 @@ func (m *machine) lowerVIMul(rd, rn, rm operand, arr vecArrangement) { m.insert(xtn1) addp := m.allocateInstr() - addp.asVecRRR(vecOpAddp, tmp2, tmp2, tmp2, vecArrangement4S) + addp.asVecRRR(vecOpAddp, tmp2, operandNR(tmp2), operandNR(tmp2), vecArrangement4S) m.insert(addp) xtn2 := m.allocateInstr() @@ -1179,15 +1179,15 @@ func (m *machine) lowerVIMul(rd, rn, rm operand, arr vecArrangement) { // In short, in UMLAL instruction, the result register is also one of the source register, and // the value on the result register is significant. shll := m.allocateInstr() - shll.asVecMisc(vecOpShll, tmpRes, tmp2, vecArrangement2S) + shll.asVecMisc(vecOpShll, tmpRes, operandNR(tmp2), vecArrangement2S) m.insert(shll) umlal := m.allocateInstr() - umlal.asVecRRRRewrite(vecOpUmlal, tmpRes, tmp3, tmp1, vecArrangement2S) + umlal.asVecRRRRewrite(vecOpUmlal, tmpRes, operandNR(tmp3), operandNR(tmp1), vecArrangement2S) m.insert(umlal) mov := m.allocateInstr() - mov.asFpuMov128(rd.nr(), tmpRes.nr()) + mov.asFpuMov128(rd, tmpRes) m.insert(mov) } } @@ -1203,7 +1203,7 @@ func (m *machine) lowerVMinMaxPseudo(instr *ssa.Instruction, max bool) { // BSL modifies the destination register, so we need to use a temporary register so that // the actual definition of the destination register happens *after* the BSL instruction. // That way, we can force the spill instruction to be inserted after the BSL instruction. - tmp := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) + tmp := m.compiler.AllocateVReg(ssa.TypeV128) fcmgt := m.allocateInstr() if max { @@ -1220,17 +1220,17 @@ func (m *machine) lowerVMinMaxPseudo(instr *ssa.Instruction, max bool) { res := operandNR(m.compiler.VRegOf(instr.Return())) mov2 := m.allocateInstr() - mov2.asFpuMov128(res.nr(), tmp.nr()) + mov2.asFpuMov128(res.nr(), tmp) m.insert(mov2) } -func (m *machine) lowerIRem(execCtxVReg regalloc.VReg, rd, rn, rm operand, _64bit, signed bool) { +func (m *machine) lowerIRem(execCtxVReg regalloc.VReg, rd, rn regalloc.VReg, rm operand, _64bit, signed bool) { div := m.allocateInstr() if signed { - div.asALU(aluOpSDiv, rd, rn, rm, _64bit) + div.asALU(aluOpSDiv, rd, operandNR(rn), rm, _64bit) } else { - div.asALU(aluOpUDiv, rd, rn, rm, _64bit) + div.asALU(aluOpUDiv, rd, operandNR(rn), rm, _64bit) } m.insert(div) @@ -1239,11 +1239,11 @@ func (m *machine) lowerIRem(execCtxVReg regalloc.VReg, rd, rn, rm operand, _64bi // rd = rn-rd*rm by MSUB instruction. msub := m.allocateInstr() - msub.asALURRRR(aluOpMSub, rd, rd, rm, rn, _64bit) + msub.asALURRRR(aluOpMSub, rd, operandNR(rd), rm, rn, _64bit) m.insert(msub) } -func (m *machine) lowerIDiv(execCtxVReg regalloc.VReg, rd, rn, rm operand, _64bit, signed bool) { +func (m *machine) lowerIDiv(execCtxVReg, rd regalloc.VReg, rn, rm operand, _64bit, signed bool) { div := m.allocateInstr() if signed { @@ -1260,7 +1260,7 @@ func (m *machine) lowerIDiv(execCtxVReg regalloc.VReg, rd, rn, rm operand, _64bi // We need to check the signed overflow which happens iff "math.MinInt{32,64} / -1" minusOneCheck := m.allocateInstr() // Sets eq condition if rm == -1. - minusOneCheck.asALU(aluOpAddS, operandNR(xzrVReg), rm, operandImm12(1, 0), _64bit) + minusOneCheck.asALU(aluOpAddS, xzrVReg, rm, operandImm12(1, 0), _64bit) m.insert(minusOneCheck) ccmp := m.allocateInstr() @@ -1290,20 +1290,20 @@ func (m *machine) exitIfNot(execCtxVReg regalloc.VReg, c cond, cond64bit bool, c func (m *machine) lowerFcopysign(x, y, ret ssa.Value) { rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - var tmpI, tmpF operand + var tmpI, tmpF regalloc.VReg _64 := x.Type() == ssa.TypeF64 if _64 { - tmpF = operandNR(m.compiler.AllocateVReg(ssa.TypeF64)) - tmpI = operandNR(m.compiler.AllocateVReg(ssa.TypeI64)) + tmpF = m.compiler.AllocateVReg(ssa.TypeF64) + tmpI = m.compiler.AllocateVReg(ssa.TypeI64) } else { - tmpF = operandNR(m.compiler.AllocateVReg(ssa.TypeF32)) - tmpI = operandNR(m.compiler.AllocateVReg(ssa.TypeI32)) + tmpF = m.compiler.AllocateVReg(ssa.TypeF32) + tmpI = m.compiler.AllocateVReg(ssa.TypeI32) } rd := m.compiler.VRegOf(ret) - m.lowerFcopysignImpl(operandNR(rd), rn, rm, tmpI, tmpF, _64) + m.lowerFcopysignImpl(rd, rn, rm, tmpI, tmpF, _64) } -func (m *machine) lowerFcopysignImpl(rd, rn, rm, tmpI, tmpF operand, _64bit bool) { +func (m *machine) lowerFcopysignImpl(rd regalloc.VReg, rn, rm operand, tmpI, tmpF regalloc.VReg, _64bit bool) { // This is exactly the same code emitted by GCC for "__builtin_copysign": // // mov x0, -9223372036854775808 @@ -1313,26 +1313,26 @@ func (m *machine) lowerFcopysignImpl(rd, rn, rm, tmpI, tmpF operand, _64bit bool setMSB := m.allocateInstr() if _64bit { - m.lowerConstantI64(tmpI.nr(), math.MinInt64) - setMSB.asMovToVec(tmpF, tmpI, vecArrangementD, vecIndex(0)) + m.lowerConstantI64(tmpI, math.MinInt64) + setMSB.asMovToVec(tmpF, operandNR(tmpI), vecArrangementD, vecIndex(0)) } else { - m.lowerConstantI32(tmpI.nr(), math.MinInt32) - setMSB.asMovToVec(tmpF, tmpI, vecArrangementS, vecIndex(0)) + m.lowerConstantI32(tmpI, math.MinInt32) + setMSB.asMovToVec(tmpF, operandNR(tmpI), vecArrangementS, vecIndex(0)) } m.insert(setMSB) - tmpReg := operandNR(m.compiler.AllocateVReg(ssa.TypeF64)) + tmpReg := m.compiler.AllocateVReg(ssa.TypeF64) mov := m.allocateInstr() - mov.asFpuMov64(tmpReg.nr(), rn.nr()) + mov.asFpuMov64(tmpReg, rn.nr()) m.insert(mov) vbit := m.allocateInstr() - vbit.asVecRRRRewrite(vecOpBit, tmpReg, rm, tmpF, vecArrangement8B) + vbit.asVecRRRRewrite(vecOpBit, tmpReg, rm, operandNR(tmpF), vecArrangement8B) m.insert(vbit) movDst := m.allocateInstr() - movDst.asFpuMov64(rd.nr(), tmpReg.nr()) + movDst.asFpuMov64(rd, tmpReg) m.insert(movDst) } @@ -1340,7 +1340,7 @@ func (m *machine) lowerBitcast(instr *ssa.Instruction) { v, dstType := instr.BitcastData() srcType := v.Type() rn := m.getOperand_NR(m.compiler.ValueDefinition(v), extModeNone) - rd := operandNR(m.compiler.VRegOf(instr.Return())) + rd := m.compiler.VRegOf(instr.Return()) srcInt := srcType.IsInt() dstInt := dstType.IsInt() switch { @@ -1371,14 +1371,14 @@ func (m *machine) lowerBitcast(instr *ssa.Instruction) { func (m *machine) lowerFpuUniOp(op fpuUniOp, in, out ssa.Value) { rn := m.getOperand_NR(m.compiler.ValueDefinition(in), extModeNone) - rd := operandNR(m.compiler.VRegOf(out)) + rd := m.compiler.VRegOf(out) neg := m.allocateInstr() neg.asFpuRR(op, rd, rn, in.Type().Bits() == 64) m.insert(neg) } -func (m *machine) lowerFpuToInt(rd, rn operand, ctx regalloc.VReg, signed, src64bit, dst64bit, nonTrapping bool) { +func (m *machine) lowerFpuToInt(rd regalloc.VReg, rn operand, ctx regalloc.VReg, signed, src64bit, dst64bit, nonTrapping bool) { if !nonTrapping { // First of all, we have to clear the FPU flags. flagClear := m.allocateInstr() @@ -1405,7 +1405,7 @@ func (m *machine) lowerFpuToInt(rd, rn operand, ctx regalloc.VReg, signed, src64 // Check if the conversion was undefined by comparing the status with 1. // See https://developer.arm.com/documentation/ddi0595/2020-12/AArch64-Registers/FPSR--Floating-point-Status-Register alu := m.allocateInstr() - alu.asALU(aluOpSubS, operandNR(xzrVReg), operandNR(tmpReg), operandImm12(1, 0), true) + alu.asALU(aluOpSubS, xzrVReg, operandNR(tmpReg), operandImm12(1, 0), true) m.insert(alu) // If it is not undefined, we can return the result. @@ -1429,7 +1429,7 @@ func (m *machine) lowerFpuToInt(rd, rn operand, ctx regalloc.VReg, signed, src64 } } -func (m *machine) lowerIntToFpu(rd, rn operand, signed, src64bit, dst64bit bool) { +func (m *machine) lowerIntToFpu(rd regalloc.VReg, rn operand, signed, src64bit, dst64bit bool) { cvt := m.allocateInstr() cvt.asIntToFpu(rd, rn, signed, src64bit, dst64bit) m.insert(cvt) @@ -1456,7 +1456,7 @@ func (m *machine) lowerFpuBinOp(si *ssa.Instruction) { xDef, yDef := m.compiler.ValueDefinition(x), m.compiler.ValueDefinition(y) rn := m.getOperand_NR(xDef, extModeNone) rm := m.getOperand_NR(yDef, extModeNone) - rd := operandNR(m.compiler.VRegOf(si.Return())) + rd := m.compiler.VRegOf(si.Return()) instr.asFpuRRR(op, rd, rn, rm, x.Type().Bits() == 64) m.insert(instr) } @@ -1482,7 +1482,7 @@ func (m *machine) lowerSubOrAdd(si *ssa.Instruction, add bool) { case !add && yNegated: // rn+rm = x-(-y) = x-y aop = aluOpAdd } - rd := operandNR(m.compiler.VRegOf(si.Return())) + rd := m.compiler.VRegOf(si.Return()) alu := m.allocateInstr() alu.asALU(aop, rd, rn, rm, x.Type().Bits() == 64) m.insert(alu) @@ -1527,7 +1527,7 @@ func (m *machine) lowerIcmp(si *ssa.Instruction) { rn := m.getOperand_NR(m.compiler.ValueDefinition(x), ext) rm := m.getOperand_Imm12_ER_SR_NR(m.compiler.ValueDefinition(y), ext) alu := m.allocateInstr() - alu.asALU(aluOpSubS, operandNR(xzrVReg), rn, rm, in64bit) + alu.asALU(aluOpSubS, xzrVReg, rn, rm, in64bit) m.insert(alu) cset := m.allocateInstr() @@ -1542,7 +1542,7 @@ func (m *machine) lowerVIcmp(si *ssa.Instruction) { rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(si.Return())) + rd := m.compiler.VRegOf(si.Return()) switch flag { case eq: @@ -1554,7 +1554,7 @@ func (m *machine) lowerVIcmp(si *ssa.Instruction) { cmp.asVecRRR(vecOpCmeq, rd, rn, rm, arr) m.insert(cmp) not := m.allocateInstr() - not.asVecMisc(vecOpNot, rd, rd, vecArrangement16B) + not.asVecMisc(vecOpNot, rd, operandNR(rd), vecArrangement16B) m.insert(not) case ge: cmp := m.allocateInstr() @@ -1598,7 +1598,7 @@ func (m *machine) lowerVFcmp(si *ssa.Instruction) { rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(si.Return())) + rd := m.compiler.VRegOf(si.Return()) switch flag { case eq: @@ -1610,7 +1610,7 @@ func (m *machine) lowerVFcmp(si *ssa.Instruction) { cmp.asVecRRR(vecOpFcmeq, rd, rn, rm, arr) m.insert(cmp) not := m.allocateInstr() - not.asVecMisc(vecOpNot, rd, rd, vecArrangement16B) + not.asVecMisc(vecOpNot, rd, operandNR(rd), vecArrangement16B) m.insert(not) case ge: cmp := m.allocateInstr() @@ -1631,7 +1631,7 @@ func (m *machine) lowerVFcmp(si *ssa.Instruction) { } } -func (m *machine) lowerVfpuToInt(rd, rn operand, arr vecArrangement, signed bool) { +func (m *machine) lowerVfpuToInt(rd regalloc.VReg, rn operand, arr vecArrangement, signed bool) { cvt := m.allocateInstr() if signed { cvt.asVecMisc(vecOpFcvtzs, rd, rn, arr) @@ -1643,15 +1643,15 @@ func (m *machine) lowerVfpuToInt(rd, rn operand, arr vecArrangement, signed bool if arr == vecArrangement2D { narrow := m.allocateInstr() if signed { - narrow.asVecMisc(vecOpSqxtn, rd, rd, vecArrangement2S) + narrow.asVecMisc(vecOpSqxtn, rd, operandNR(rd), vecArrangement2S) } else { - narrow.asVecMisc(vecOpUqxtn, rd, rd, vecArrangement2S) + narrow.asVecMisc(vecOpUqxtn, rd, operandNR(rd), vecArrangement2S) } m.insert(narrow) } } -func (m *machine) lowerVfpuFromInt(rd, rn operand, arr vecArrangement, signed bool) { +func (m *machine) lowerVfpuFromInt(rd regalloc.VReg, rn operand, arr vecArrangement, signed bool) { cvt := m.allocateInstr() if signed { cvt.asVecMisc(vecOpScvtf, rd, rn, arr) @@ -1665,7 +1665,7 @@ func (m *machine) lowerShifts(si *ssa.Instruction, ext extMode, aluOp aluOp) { x, amount := si.Arg2() rn := m.getOperand_NR(m.compiler.ValueDefinition(x), ext) rm := m.getOperand_ShiftImm_NR(m.compiler.ValueDefinition(amount), ext, x.Type().Bits()) - rd := operandNR(m.compiler.VRegOf(si.Return())) + rd := m.compiler.VRegOf(si.Return()) alu := m.allocateInstr() alu.asALUShift(aluOp, rd, rn, rm, x.Type().Bits() == 64) @@ -1678,11 +1678,11 @@ func (m *machine) lowerBitwiseAluOp(si *ssa.Instruction, op aluOp, ignoreResult xDef, yDef := m.compiler.ValueDefinition(x), m.compiler.ValueDefinition(y) rn := m.getOperand_NR(xDef, extModeNone) - var rd operand + var rd regalloc.VReg if ignoreResult { - rd = operandNR(xzrVReg) + rd = xzrVReg } else { - rd = operandNR(m.compiler.VRegOf(si.Return())) + rd = m.compiler.VRegOf(si.Return()) } _64 := x.Type().Bits() == 64 @@ -1691,7 +1691,7 @@ func (m *machine) lowerBitwiseAluOp(si *ssa.Instruction, op aluOp, ignoreResult c := instr.ConstantVal() if isBitMaskImmediate(c, _64) { // Constant bit wise operations can be lowered to a single instruction. - alu.asALUBitmaskImm(op, rd.nr(), rn.nr(), c, _64) + alu.asALUBitmaskImm(op, rd, rn.nr(), c, _64) m.insert(alu) return } @@ -1709,25 +1709,25 @@ func (m *machine) lowerRotl(si *ssa.Instruction) { rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - var tmp operand + var tmp regalloc.VReg if _64 { - tmp = operandNR(m.compiler.AllocateVReg(ssa.TypeI64)) + tmp = m.compiler.AllocateVReg(ssa.TypeI64) } else { - tmp = operandNR(m.compiler.AllocateVReg(ssa.TypeI32)) + tmp = m.compiler.AllocateVReg(ssa.TypeI32) } - rd := operandNR(m.compiler.VRegOf(r)) + rd := m.compiler.VRegOf(r) // Encode rotl as neg + rotr: neg is a sub against the zero-reg. m.lowerRotlImpl(rd, rn, rm, tmp, _64) } -func (m *machine) lowerRotlImpl(rd, rn, rm, tmp operand, is64bit bool) { +func (m *machine) lowerRotlImpl(rd regalloc.VReg, rn, rm operand, tmp regalloc.VReg, is64bit bool) { // Encode rotl as neg + rotr: neg is a sub against the zero-reg. neg := m.allocateInstr() neg.asALU(aluOpSub, tmp, operandNR(xzrVReg), rm, is64bit) m.insert(neg) alu := m.allocateInstr() - alu.asALU(aluOpRotR, rd, rn, tmp, is64bit) + alu.asALU(aluOpRotR, rd, rn, operandNR(tmp), is64bit) m.insert(alu) } @@ -1737,7 +1737,7 @@ func (m *machine) lowerRotr(si *ssa.Instruction) { xDef, yDef := m.compiler.ValueDefinition(x), m.compiler.ValueDefinition(y) rn := m.getOperand_NR(xDef, extModeNone) rm := m.getOperand_NR(yDef, extModeNone) - rd := operandNR(m.compiler.VRegOf(si.Return())) + rd := m.compiler.VRegOf(si.Return()) alu := m.allocateInstr() alu.asALU(aluOpRotR, rd, rn, rm, si.Return().Type().Bits() == 64) @@ -1797,7 +1797,7 @@ func (m *machine) lowerImul(x, y, result ssa.Value) { // TODO: if this comes before Add/Sub, we could merge it by putting it into the place of xzrVReg. mul := m.allocateInstr() - mul.asALURRRR(aluOpMAdd, operandNR(rd), rn, rm, operandNR(xzrVReg), x.Type().Bits() == 64) + mul.asALURRRR(aluOpMAdd, rd, rn, rm, xzrVReg, x.Type().Bits() == 64) m.insert(mul) } @@ -1849,22 +1849,22 @@ func (m *machine) lowerPopcnt(x, result ssa.Value) { // mov x5, v0.d[0] ;; finally we mov the result back to a GPR // - rd := operandNR(m.compiler.VRegOf(result)) + rd := m.compiler.VRegOf(result) rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rf1 := operandNR(m.compiler.AllocateVReg(ssa.TypeF64)) ins := m.allocateInstr() - ins.asMovToVec(rf1, rn, vecArrangementD, vecIndex(0)) + ins.asMovToVec(rf1.nr(), rn, vecArrangementD, vecIndex(0)) m.insert(ins) rf2 := operandNR(m.compiler.AllocateVReg(ssa.TypeF64)) cnt := m.allocateInstr() - cnt.asVecMisc(vecOpCnt, rf2, rf1, vecArrangement16B) + cnt.asVecMisc(vecOpCnt, rf2.nr(), rf1, vecArrangement16B) m.insert(cnt) rf3 := operandNR(m.compiler.AllocateVReg(ssa.TypeF64)) uaddlv := m.allocateInstr() - uaddlv.asVecLanes(vecOpUaddlv, rf3, rf2, vecArrangement8B) + uaddlv.asVecLanes(vecOpUaddlv, rf3.nr(), rf2, vecArrangement8B) m.insert(uaddlv) mov := m.allocateInstr() @@ -1879,32 +1879,35 @@ func (m *machine) lowerExitWithCode(execCtxVReg regalloc.VReg, code wazevoapi.Ex loadExitCodeConst.asMOVZ(tmpReg1, uint64(code), 0, true) setExitCode := m.allocateInstr() - setExitCode.asStore(operandNR(tmpReg1), - addressMode{ - kind: addressModeKindRegUnsignedImm12, - rn: execCtxVReg, imm: wazevoapi.ExecutionContextOffsetExitCodeOffset.I64(), - }, 32) + mode := m.amodePool.Allocate() + *mode = addressMode{ + kind: addressModeKindRegUnsignedImm12, + rn: execCtxVReg, imm: wazevoapi.ExecutionContextOffsetExitCodeOffset.I64(), + } + setExitCode.asStore(operandNR(tmpReg1), mode, 32) // In order to unwind the stack, we also need to push the current stack pointer: tmp2 := m.compiler.AllocateVReg(ssa.TypeI64) movSpToTmp := m.allocateInstr() movSpToTmp.asMove64(tmp2, spVReg) strSpToExecCtx := m.allocateInstr() - strSpToExecCtx.asStore(operandNR(tmp2), - addressMode{ - kind: addressModeKindRegUnsignedImm12, - rn: execCtxVReg, imm: wazevoapi.ExecutionContextOffsetStackPointerBeforeGoCall.I64(), - }, 64) + mode2 := m.amodePool.Allocate() + *mode2 = addressMode{ + kind: addressModeKindRegUnsignedImm12, + rn: execCtxVReg, imm: wazevoapi.ExecutionContextOffsetStackPointerBeforeGoCall.I64(), + } + strSpToExecCtx.asStore(operandNR(tmp2), mode2, 64) // Also the address of this exit. tmp3 := m.compiler.AllocateVReg(ssa.TypeI64) currentAddrToTmp := m.allocateInstr() currentAddrToTmp.asAdr(tmp3, 0) storeCurrentAddrToExecCtx := m.allocateInstr() - storeCurrentAddrToExecCtx.asStore(operandNR(tmp3), - addressMode{ - kind: addressModeKindRegUnsignedImm12, - rn: execCtxVReg, imm: wazevoapi.ExecutionContextOffsetGoCallReturnAddress.I64(), - }, 64) + mode3 := m.amodePool.Allocate() + *mode3 = addressMode{ + kind: addressModeKindRegUnsignedImm12, + rn: execCtxVReg, imm: wazevoapi.ExecutionContextOffsetGoCallReturnAddress.I64(), + } + storeCurrentAddrToExecCtx.asStore(operandNR(tmp3), mode3, 64) exitSeq := m.allocateInstr() exitSeq.asExitSequence(execCtxVReg) @@ -1937,7 +1940,7 @@ func (m *machine) lowerIcmpToFlag(x, y ssa.Value, signed bool) { alu.asALU( aluOpSubS, // We don't need the result, just need to set flags. - operandNR(xzrVReg), + xzrVReg, rn, rm, x.Type().Bits() == 64, @@ -2012,7 +2015,7 @@ func (m *machine) lowerSelect(c, x, y, result ssa.Value) { alu.asALU( aluOpSubS, // We don't need the result, just need to set flags. - operandNR(xzrVReg), + xzrVReg, rn, operandNR(xzrVReg), c.Type().Bits() == 64, @@ -2024,7 +2027,7 @@ func (m *machine) lowerSelect(c, x, y, result ssa.Value) { rn := m.getOperand_NR(m.compiler.ValueDefinition(x), extModeNone) rm := m.getOperand_NR(m.compiler.ValueDefinition(y), extModeNone) - rd := operandNR(m.compiler.VRegOf(result)) + rd := m.compiler.VRegOf(result) switch x.Type() { case ssa.TypeI32, ssa.TypeI64: // csel rd, rn, rm, cc @@ -2041,10 +2044,10 @@ func (m *machine) lowerSelect(c, x, y, result ssa.Value) { } } -func (m *machine) lowerSelectVec(rc, rn, rm, rd operand) { +func (m *machine) lowerSelectVec(rc, rn, rm operand, rd regalloc.VReg) { // First check if `rc` is zero or not. checkZero := m.allocateInstr() - checkZero.asALU(aluOpSubS, operandNR(xzrVReg), rc, operandNR(xzrVReg), false) + checkZero.asALU(aluOpSubS, xzrVReg, rc, operandNR(xzrVReg), false) m.insert(checkZero) // Then use CSETM to set all bits to one if `rc` is zero. @@ -2054,7 +2057,7 @@ func (m *machine) lowerSelectVec(rc, rn, rm, rd operand) { m.insert(cset) // Then move the bits to the result vector register. - tmp2 := operandNR(m.compiler.AllocateVReg(ssa.TypeV128)) + tmp2 := m.compiler.AllocateVReg(ssa.TypeV128) dup := m.allocateInstr() dup.asVecDup(tmp2, operandNR(allOnesOrZero), vecArrangement2D) m.insert(dup) @@ -2067,7 +2070,7 @@ func (m *machine) lowerSelectVec(rc, rn, rm, rd operand) { // Finally, move the result to the destination register. mov2 := m.allocateInstr() - mov2.asFpuMov128(rd.nr(), tmp2.nr()) + mov2.asFpuMov128(rd, tmp2) m.insert(mov2) } @@ -2099,28 +2102,28 @@ func (m *machine) lowerAtomicRmw(si *ssa.Instruction) { addr, val := si.Arg2() addrDef, valDef := m.compiler.ValueDefinition(addr), m.compiler.ValueDefinition(val) rn := m.getOperand_NR(addrDef, extModeNone) - rt := operandNR(m.compiler.VRegOf(si.Return())) + rt := m.compiler.VRegOf(si.Return()) rs := m.getOperand_NR(valDef, extModeNone) _64 := si.Return().Type().Bits() == 64 - var tmp operand + var tmp regalloc.VReg if _64 { - tmp = operandNR(m.compiler.AllocateVReg(ssa.TypeI64)) + tmp = m.compiler.AllocateVReg(ssa.TypeI64) } else { - tmp = operandNR(m.compiler.AllocateVReg(ssa.TypeI32)) + tmp = m.compiler.AllocateVReg(ssa.TypeI32) } - m.lowerAtomicRmwImpl(op, rn, rs, rt, tmp, size, negateArg, flipArg, _64) + m.lowerAtomicRmwImpl(op, rn.nr(), rs.nr(), rt, tmp, size, negateArg, flipArg, _64) } -func (m *machine) lowerAtomicRmwImpl(op atomicRmwOp, rn, rs, rt, tmp operand, size uint64, negateArg, flipArg, dst64bit bool) { +func (m *machine) lowerAtomicRmwImpl(op atomicRmwOp, rn, rs, rt, tmp regalloc.VReg, size uint64, negateArg, flipArg, dst64bit bool) { switch { case negateArg: neg := m.allocateInstr() - neg.asALU(aluOpSub, tmp, operandNR(xzrVReg), rs, dst64bit) + neg.asALU(aluOpSub, tmp, operandNR(xzrVReg), operandNR(rs), dst64bit) m.insert(neg) case flipArg: flip := m.allocateInstr() - flip.asALU(aluOpOrn, tmp, operandNR(xzrVReg), rs, dst64bit) + flip.asALU(aluOpOrn, tmp, operandNR(xzrVReg), operandNR(rs), dst64bit) m.insert(flip) default: tmp = rs @@ -2139,32 +2142,32 @@ func (m *machine) lowerAtomicCas(si *ssa.Instruction) { rn := m.getOperand_NR(addrDef, extModeNone) rt := m.getOperand_NR(replDef, extModeNone) rs := m.getOperand_NR(expDef, extModeNone) - tmp := operandNR(m.compiler.AllocateVReg(si.Return().Type())) + tmp := m.compiler.AllocateVReg(si.Return().Type()) _64 := si.Return().Type().Bits() == 64 // rs is overwritten by CAS, so we need to move it to the result register before the instruction // in case when it is used somewhere else. mov := m.allocateInstr() if _64 { - mov.asMove64(tmp.nr(), rs.nr()) + mov.asMove64(tmp, rs.nr()) } else { - mov.asMove32(tmp.nr(), rs.nr()) + mov.asMove32(tmp, rs.nr()) } m.insert(mov) - m.lowerAtomicCasImpl(rn, tmp, rt, size) + m.lowerAtomicCasImpl(rn.nr(), tmp, rt.nr(), size) mov2 := m.allocateInstr() rd := m.compiler.VRegOf(si.Return()) if _64 { - mov2.asMove64(rd, tmp.nr()) + mov2.asMove64(rd, tmp) } else { - mov2.asMove32(rd, tmp.nr()) + mov2.asMove32(rd, tmp) } m.insert(mov2) } -func (m *machine) lowerAtomicCasImpl(rn, rs, rt operand, size uint64) { +func (m *machine) lowerAtomicCasImpl(rn, rs, rt regalloc.VReg, size uint64) { cas := m.allocateInstr() cas.asAtomicCas(rn, rs, rt, size) m.insert(cas) @@ -2176,12 +2179,12 @@ func (m *machine) lowerAtomicLoad(si *ssa.Instruction) { addrDef := m.compiler.ValueDefinition(addr) rn := m.getOperand_NR(addrDef, extModeNone) - rt := operandNR(m.compiler.VRegOf(si.Return())) + rt := m.compiler.VRegOf(si.Return()) - m.lowerAtomicLoadImpl(rn, rt, size) + m.lowerAtomicLoadImpl(rn.nr(), rt, size) } -func (m *machine) lowerAtomicLoadImpl(rn, rt operand, size uint64) { +func (m *machine) lowerAtomicLoadImpl(rn, rt regalloc.VReg, size uint64) { ld := m.allocateInstr() ld.asAtomicLoad(rn, rt, size) m.insert(ld) diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_mem.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_mem.go index 4842eaa382..fd0760d723 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_mem.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/lower_mem.go @@ -24,6 +24,14 @@ type ( addressModeKind byte ) +func resetAddressMode(a *addressMode) { + a.kind = 0 + a.rn = 0 + a.rm = 0 + a.extOp = 0 + a.imm = 0 +} + const ( // addressModeKindRegExtended takes a base register and an index register. The index register is sign/zero-extended, // and then scaled by bits(type)/8. @@ -140,15 +148,17 @@ func (a addressMode) format(dstSizeBits byte) (ret string) { return } -func addressModePreOrPostIndex(rn regalloc.VReg, imm int64, preIndex bool) addressMode { +func addressModePreOrPostIndex(m *machine, rn regalloc.VReg, imm int64, preIndex bool) *addressMode { if !offsetFitsInAddressModeKindRegSignedImm9(imm) { panic(fmt.Sprintf("BUG: offset %#x does not fit in addressModeKindRegSignedImm9", imm)) } + mode := m.amodePool.Allocate() if preIndex { - return addressMode{kind: addressModeKindPreIndex, rn: rn, imm: imm} + *mode = addressMode{kind: addressModeKindPreIndex, rn: rn, imm: imm} } else { - return addressMode{kind: addressModeKindPostIndex, rn: rn, imm: imm} + *mode = addressMode{kind: addressModeKindPostIndex, rn: rn, imm: imm} } + return mode } func offsetFitsInAddressModeKindRegUnsignedImm12(dstSizeInBits byte, offset int64) bool { @@ -207,9 +217,9 @@ func (m *machine) lowerExtLoad(op ssa.Opcode, ptr ssa.Value, offset uint32, ret amode := m.lowerToAddressMode(ptr, offset, size) load := m.allocateInstr() if signed { - load.asSLoad(operandNR(ret), amode, size) + load.asSLoad(ret, amode, size) } else { - load.asULoad(operandNR(ret), amode, size) + load.asULoad(ret, amode, size) } m.insert(load) } @@ -221,11 +231,11 @@ func (m *machine) lowerLoad(ptr ssa.Value, offset uint32, typ ssa.Type, ret ssa. load := m.allocateInstr() switch typ { case ssa.TypeI32, ssa.TypeI64: - load.asULoad(operandNR(dst), amode, typ.Bits()) + load.asULoad(dst, amode, typ.Bits()) case ssa.TypeF32, ssa.TypeF64: - load.asFpuLoad(operandNR(dst), amode, typ.Bits()) + load.asFpuLoad(dst, amode, typ.Bits()) case ssa.TypeV128: - load.asFpuLoad(operandNR(dst), amode, 128) + load.asFpuLoad(dst, amode, 128) default: panic("TODO") } @@ -239,7 +249,7 @@ func (m *machine) lowerLoadSplat(ptr ssa.Value, offset uint32, lane ssa.VecLane, m.lowerConstantI64(offsetReg, int64(offset)) addedBase := m.addReg64ToReg64(base, offsetReg) - rd := operandNR(m.compiler.VRegOf(ret)) + rd := m.compiler.VRegOf(ret) ld1r := m.allocateInstr() ld1r.asVecLoad1R(rd, operandNR(addedBase), ssaLaneToArrangement(lane)) @@ -258,7 +268,7 @@ func (m *machine) lowerStore(si *ssa.Instruction) { } // lowerToAddressMode converts a pointer to an addressMode that can be used as an operand for load/store instructions. -func (m *machine) lowerToAddressMode(ptr ssa.Value, offsetBase uint32, size byte) (amode addressMode) { +func (m *machine) lowerToAddressMode(ptr ssa.Value, offsetBase uint32, size byte) (amode *addressMode) { // TODO: currently the instruction selection logic doesn't support addressModeKindRegScaledExtended and // addressModeKindRegScaled since collectAddends doesn't take ssa.OpcodeIshl into account. This should be fixed // to support more efficient address resolution. @@ -272,32 +282,33 @@ func (m *machine) lowerToAddressMode(ptr ssa.Value, offsetBase uint32, size byte // During the construction, this might emit additional instructions. // // Extracted as a separate function for easy testing. -func (m *machine) lowerToAddressModeFromAddends(a32s *wazevoapi.Queue[addend32], a64s *wazevoapi.Queue[regalloc.VReg], size byte, offset int64) (amode addressMode) { +func (m *machine) lowerToAddressModeFromAddends(a32s *wazevoapi.Queue[addend32], a64s *wazevoapi.Queue[regalloc.VReg], size byte, offset int64) (amode *addressMode) { + amode = m.amodePool.Allocate() switch a64sExist, a32sExist := !a64s.Empty(), !a32s.Empty(); { case a64sExist && a32sExist: var base regalloc.VReg base = a64s.Dequeue() var a32 addend32 a32 = a32s.Dequeue() - amode = addressMode{kind: addressModeKindRegExtended, rn: base, rm: a32.r, extOp: a32.ext} + *amode = addressMode{kind: addressModeKindRegExtended, rn: base, rm: a32.r, extOp: a32.ext} case a64sExist && offsetFitsInAddressModeKindRegUnsignedImm12(size, offset): var base regalloc.VReg base = a64s.Dequeue() - amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: base, imm: offset} + *amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: base, imm: offset} offset = 0 case a64sExist && offsetFitsInAddressModeKindRegSignedImm9(offset): var base regalloc.VReg base = a64s.Dequeue() - amode = addressMode{kind: addressModeKindRegSignedImm9, rn: base, imm: offset} + *amode = addressMode{kind: addressModeKindRegSignedImm9, rn: base, imm: offset} offset = 0 case a64sExist: var base regalloc.VReg base = a64s.Dequeue() if !a64s.Empty() { index := a64s.Dequeue() - amode = addressMode{kind: addressModeKindRegReg, rn: base, rm: index, extOp: extendOpUXTX /* indicates index reg is 64-bit */} + *amode = addressMode{kind: addressModeKindRegReg, rn: base, rm: index, extOp: extendOpUXTX /* indicates index reg is 64-bit */} } else { - amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: base, imm: 0} + *amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: base, imm: 0} } case a32sExist: base32 := a32s.Dequeue() @@ -314,14 +325,14 @@ func (m *machine) lowerToAddressModeFromAddends(a32s *wazevoapi.Queue[addend32], if !a32s.Empty() { index := a32s.Dequeue() - amode = addressMode{kind: addressModeKindRegExtended, rn: base, rm: index.r, extOp: index.ext} + *amode = addressMode{kind: addressModeKindRegExtended, rn: base, rm: index.r, extOp: index.ext} } else { - amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: base, imm: 0} + *amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: base, imm: 0} } default: // Only static offsets. tmpReg := m.compiler.AllocateVReg(ssa.TypeI64) m.lowerConstantI64(tmpReg, offset) - amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: tmpReg, imm: 0} + *amode = addressMode{kind: addressModeKindRegUnsignedImm12, rn: tmpReg, imm: 0} offset = 0 } @@ -411,13 +422,13 @@ func (m *machine) addConstToReg64(r regalloc.VReg, c int64) (rd regalloc.VReg) { rd = m.compiler.AllocateVReg(ssa.TypeI64) alu := m.allocateInstr() if imm12Op, ok := asImm12Operand(uint64(c)); ok { - alu.asALU(aluOpAdd, operandNR(rd), operandNR(r), imm12Op, true) + alu.asALU(aluOpAdd, rd, operandNR(r), imm12Op, true) } else if imm12Op, ok = asImm12Operand(uint64(-c)); ok { - alu.asALU(aluOpSub, operandNR(rd), operandNR(r), imm12Op, true) + alu.asALU(aluOpSub, rd, operandNR(r), imm12Op, true) } else { tmp := m.compiler.AllocateVReg(ssa.TypeI64) m.load64bitConst(c, tmp) - alu.asALU(aluOpAdd, operandNR(rd), operandNR(r), operandNR(tmp), true) + alu.asALU(aluOpAdd, rd, operandNR(r), operandNR(tmp), true) } m.insert(alu) return @@ -426,7 +437,7 @@ func (m *machine) addConstToReg64(r regalloc.VReg, c int64) (rd regalloc.VReg) { func (m *machine) addReg64ToReg64(rn, rm regalloc.VReg) (rd regalloc.VReg) { rd = m.compiler.AllocateVReg(ssa.TypeI64) alu := m.allocateInstr() - alu.asALU(aluOpAdd, operandNR(rd), operandNR(rn), operandNR(rm), true) + alu.asALU(aluOpAdd, rd, operandNR(rn), operandNR(rm), true) m.insert(alu) return } @@ -434,7 +445,7 @@ func (m *machine) addReg64ToReg64(rn, rm regalloc.VReg) (rd regalloc.VReg) { func (m *machine) addRegToReg64Ext(rn, rm regalloc.VReg, ext extendOp) (rd regalloc.VReg) { rd = m.compiler.AllocateVReg(ssa.TypeI64) alu := m.allocateInstr() - alu.asALU(aluOpAdd, operandNR(rd), operandNR(rn), operandER(rm, ext, 64), true) + alu.asALU(aluOpAdd, rd, operandNR(rn), operandER(rm, ext, 64), true) m.insert(alu) return } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine.go index b435d9ba96..5f584f928b 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine.go @@ -21,6 +21,8 @@ type ( regAlloc regalloc.Allocator regAllocFn *backend.RegAllocFunction[*instruction, *machine] + amodePool wazevoapi.Pool[addressMode] + // addendsWorkQueue is used during address lowering, defined here for reuse. addendsWorkQueue wazevoapi.Queue[ssa.Value] addends32 wazevoapi.Queue[addend32] @@ -105,6 +107,7 @@ func NewBackend() backend.Machine { spillSlots: make(map[regalloc.VRegID]int64), executableContext: newExecutableContext(), regAlloc: regalloc.NewAllocator(regInfo), + amodePool: wazevoapi.NewPool[addressMode](resetAddressMode), } return m } @@ -149,6 +152,7 @@ func (m *machine) Reset() { m.maxRequiredStackSizeForCalls = 0 m.executableContext.Reset() m.jmpTableTargets = m.jmpTableTargets[:0] + m.amodePool.Reset() } // SetCurrentABI implements backend.Machine SetCurrentABI. @@ -183,9 +187,8 @@ func (m *machine) allocateBrTarget() (nop *instruction, l label) { l = ectx.AllocateLabel() nop = m.allocateInstr() nop.asNop0WithLabel(l) - pos := ectx.AllocateLabelPosition(l) + pos := ectx.GetOrAllocateLabelPosition(l) pos.Begin, pos.End = nop, nop - ectx.LabelPositions[l] = pos return } @@ -209,7 +212,7 @@ func (m *machine) allocateNop() *instruction { } func (m *machine) resolveAddressingMode(arg0offset, ret0offset int64, i *instruction) { - amode := &i.amode + amode := i.getAmode() switch amode.kind { case addressModeKindResultStackSpace: amode.imm += ret0offset @@ -281,7 +284,7 @@ func (m *machine) resolveRelativeAddresses(ctx context.Context) { switch cur.kind { case nop0: l := cur.nop0Label() - if pos, ok := ectx.LabelPositions[l]; ok { + if pos := ectx.LabelPositions[l]; pos != nil { pos.BinaryOffset = offset + size } case condBr: @@ -428,8 +431,10 @@ func (m *machine) insertConditionalJumpTrampoline(cbr *instruction, currentBlk * func (m *machine) Format() string { ectx := m.executableContext begins := map[*instruction]label{} - for l, pos := range ectx.LabelPositions { - begins[pos.Begin] = l + for _, pos := range ectx.LabelPositions { + if pos != nil { + begins[pos.Begin] = pos.L + } } irBlocks := map[label]ssa.BasicBlockID{} diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine_pro_epi_logue.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine_pro_epi_logue.go index 466fac4640..d9032f9218 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine_pro_epi_logue.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine_pro_epi_logue.go @@ -70,7 +70,7 @@ func (m *machine) setupPrologue() { // +-----------------+ <----- SP // (low address) // - _amode := addressModePreOrPostIndex(spVReg, + _amode := addressModePreOrPostIndex(m, spVReg, -16, // stack pointer must be 16-byte aligned. true, // Decrement before store. ) @@ -159,7 +159,7 @@ func (m *machine) createReturnAddrAndSizeOfArgRetSlot(cur *instruction) *instruc sizeOfArgRetReg = tmpRegVReg subSp := m.allocateInstr() - subSp.asALU(aluOpSub, operandNR(spVReg), operandNR(spVReg), operandNR(sizeOfArgRetReg), true) + subSp.asALU(aluOpSub, spVReg, operandNR(spVReg), operandNR(sizeOfArgRetReg), true) cur = linkInstr(cur, subSp) } else { sizeOfArgRetReg = xzrVReg @@ -168,7 +168,7 @@ func (m *machine) createReturnAddrAndSizeOfArgRetSlot(cur *instruction) *instruc // Saves the return address (lr) and the size_of_arg_ret below the SP. // size_of_arg_ret is used for stack unwinding. pstr := m.allocateInstr() - amode := addressModePreOrPostIndex(spVReg, -16, true /* decrement before store */) + amode := addressModePreOrPostIndex(m, spVReg, -16, true /* decrement before store */) pstr.asStorePair64(lrVReg, sizeOfArgRetReg, amode) cur = linkInstr(cur, pstr) return cur @@ -182,7 +182,7 @@ func (m *machine) createFrameSizeSlot(cur *instruction, s int64) *instruction { } else { frameSizeReg = xzrVReg } - _amode := addressModePreOrPostIndex(spVReg, + _amode := addressModePreOrPostIndex(m, spVReg, -16, // stack pointer must be 16-byte aligned. true, // Decrement before store. ) @@ -213,7 +213,7 @@ func (m *machine) postRegAlloc() { m.executableContext.PendingInstructions = m.executableContext.PendingInstructions[:0] default: // Removes the redundant copy instruction. - if cur.IsCopy() && cur.rn.realReg() == cur.rd.realReg() { + if cur.IsCopy() && cur.rn.realReg() == cur.rd.RealReg() { prev, next := cur.prev, cur.next // Remove the copy instruction. prev.next = next @@ -286,16 +286,16 @@ func (m *machine) setupEpilogueAfter(cur *instruction) { for i := range m.clobberedRegs { vr := m.clobberedRegs[l-i] // reverse order to restore. load := m.allocateInstr() - amode := addressModePreOrPostIndex(spVReg, + amode := addressModePreOrPostIndex(m, spVReg, 16, // stack pointer must be 16-byte aligned. false, // Increment after store. ) // TODO: pair loads to reduce the number of instructions. switch regTypeToRegisterSizeInBits(vr.RegType()) { case 64: // save int reg. - load.asULoad(operandNR(vr), amode, 64) + load.asULoad(vr, amode, 64) case 128: // save vector reg. - load.asFpuLoad(operandNR(vr), amode, 128) + load.asFpuLoad(vr, amode, 128) } cur = linkInstr(cur, load) } @@ -317,8 +317,8 @@ func (m *machine) setupEpilogueAfter(cur *instruction) { // SP----> +-----------------+ ldr := m.allocateInstr() - ldr.asULoad(operandNR(lrVReg), - addressModePreOrPostIndex(spVReg, 16 /* stack pointer must be 16-byte aligned. */, false /* increment after loads */), 64) + ldr.asULoad(lrVReg, + addressModePreOrPostIndex(m, spVReg, 16 /* stack pointer must be 16-byte aligned. */, false /* increment after loads */), 64) cur = linkInstr(cur, ldr) if s := int64(m.currentABI.AlignedArgResultStackSlotSize()); s > 0 { @@ -351,14 +351,14 @@ func (m *machine) insertStackBoundsCheck(requiredStackSize int64, cur *instructi if immm12op, ok := asImm12Operand(uint64(requiredStackSize)); ok { // sub tmp, sp, #requiredStackSize sub := m.allocateInstr() - sub.asALU(aluOpSub, operandNR(tmpRegVReg), operandNR(spVReg), immm12op, true) + sub.asALU(aluOpSub, tmpRegVReg, operandNR(spVReg), immm12op, true) cur = linkInstr(cur, sub) } else { // This case, we first load the requiredStackSize into the temporary register, cur = m.lowerConstantI64AndInsert(cur, tmpRegVReg, requiredStackSize) // Then subtract it. sub := m.allocateInstr() - sub.asALU(aluOpSub, operandNR(tmpRegVReg), operandNR(spVReg), operandNR(tmpRegVReg), true) + sub.asALU(aluOpSub, tmpRegVReg, operandNR(spVReg), operandNR(tmpRegVReg), true) cur = linkInstr(cur, sub) } @@ -366,16 +366,18 @@ func (m *machine) insertStackBoundsCheck(requiredStackSize int64, cur *instructi // ldr tmp2, [executionContext #StackBottomPtr] ldr := m.allocateInstr() - ldr.asULoad(operandNR(tmp2), addressMode{ + amode := m.amodePool.Allocate() + *amode = addressMode{ kind: addressModeKindRegUnsignedImm12, rn: x0VReg, // execution context is always the first argument. imm: wazevoapi.ExecutionContextOffsetStackBottomPtr.I64(), - }, 64) + } + ldr.asULoad(tmp2, amode, 64) cur = linkInstr(cur, ldr) // subs xzr, tmp, tmp2 subs := m.allocateInstr() - subs.asALU(aluOpSubS, operandNR(xzrVReg), operandNR(tmpRegVReg), operandNR(tmp2), true) + subs.asALU(aluOpSubS, xzrVReg, operandNR(tmpRegVReg), operandNR(tmp2), true) cur = linkInstr(cur, subs) // b.ge #imm @@ -388,22 +390,25 @@ func (m *machine) insertStackBoundsCheck(requiredStackSize int64, cur *instructi // First load the requiredStackSize into the temporary register, cur = m.lowerConstantI64AndInsert(cur, tmpRegVReg, requiredStackSize) setRequiredStackSize := m.allocateInstr() - setRequiredStackSize.asStore(operandNR(tmpRegVReg), - addressMode{ - kind: addressModeKindRegUnsignedImm12, - // Execution context is always the first argument. - rn: x0VReg, imm: wazevoapi.ExecutionContextOffsetStackGrowRequiredSize.I64(), - }, 64) + amode := m.amodePool.Allocate() + *amode = addressMode{ + kind: addressModeKindRegUnsignedImm12, + // Execution context is always the first argument. + rn: x0VReg, imm: wazevoapi.ExecutionContextOffsetStackGrowRequiredSize.I64(), + } + setRequiredStackSize.asStore(operandNR(tmpRegVReg), amode, 64) cur = linkInstr(cur, setRequiredStackSize) } ldrAddress := m.allocateInstr() - ldrAddress.asULoad(operandNR(tmpRegVReg), addressMode{ + amode2 := m.amodePool.Allocate() + *amode2 = addressMode{ kind: addressModeKindRegUnsignedImm12, rn: x0VReg, // execution context is always the first argument imm: wazevoapi.ExecutionContextOffsetStackGrowCallTrampolineAddress.I64(), - }, 64) + } + ldrAddress.asULoad(tmpRegVReg, amode2, 64) cur = linkInstr(cur, ldrAddress) // Then jumps to the stack grow call sequence's address, meaning diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine_regalloc.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine_regalloc.go index 1c8793b73d..c7eb92cc20 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine_regalloc.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/isa/arm64/machine_regalloc.go @@ -91,7 +91,7 @@ func (m *machine) InsertStoreRegisterAt(v regalloc.VReg, instr *instruction, aft } offsetFromSP := m.getVRegSpillSlotOffsetFromSP(v.ID(), typ.Size()) - var amode addressMode + var amode *addressMode cur, amode = m.resolveAddressModeForOffsetAndInsert(cur, offsetFromSP, typ.Bits(), spVReg, true) store := m.allocateInstr() store.asStore(operandNR(v), amode, typ.Bits()) @@ -116,16 +116,16 @@ func (m *machine) InsertReloadRegisterAt(v regalloc.VReg, instr *instruction, af } offsetFromSP := m.getVRegSpillSlotOffsetFromSP(v.ID(), typ.Size()) - var amode addressMode + var amode *addressMode cur, amode = m.resolveAddressModeForOffsetAndInsert(cur, offsetFromSP, typ.Bits(), spVReg, true) load := m.allocateInstr() switch typ { case ssa.TypeI32, ssa.TypeI64: - load.asULoad(operandNR(v), amode, typ.Bits()) + load.asULoad(v, amode, typ.Bits()) case ssa.TypeF32, ssa.TypeF64: - load.asFpuLoad(operandNR(v), amode, typ.Bits()) + load.asFpuLoad(v, amode, typ.Bits()) case ssa.TypeV128: - load.asFpuLoad(operandNR(v), amode, 128) + load.asFpuLoad(v, amode, 128) default: panic("TODO") } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc.go index 3f36c84e57..6553707860 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc.go @@ -35,7 +35,7 @@ type ( iter int reversePostOrderBlocks []RegAllocBlock[I, m] // labelToRegAllocBlockIndex maps label to the index of reversePostOrderBlocks. - labelToRegAllocBlockIndex map[Label]int + labelToRegAllocBlockIndex [] /* Label to */ int loopNestingForestRoots []ssa.BasicBlock } @@ -56,10 +56,9 @@ type ( // NewRegAllocFunction returns a new RegAllocFunction. func NewRegAllocFunction[I regalloc.InstrConstraint, M RegAllocFunctionMachine[I]](m M, ssb ssa.Builder, c Compiler) *RegAllocFunction[I, M] { return &RegAllocFunction[I, M]{ - m: m, - ssb: ssb, - c: c, - labelToRegAllocBlockIndex: make(map[Label]int), + m: m, + ssb: ssb, + c: c, } } @@ -74,6 +73,9 @@ func (f *RegAllocFunction[I, M]) AddBlock(sb ssa.BasicBlock, l Label, begin, end end: end, id: int(sb.ID()), }) + if len(f.labelToRegAllocBlockIndex) <= int(l) { + f.labelToRegAllocBlockIndex = append(f.labelToRegAllocBlockIndex, make([]int, int(l)-len(f.labelToRegAllocBlockIndex)+1)...) + } f.labelToRegAllocBlockIndex[l] = i } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc/regalloc.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc/regalloc.go index b4450d56fb..eacb6a7ef9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc/regalloc.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc/regalloc.go @@ -60,9 +60,8 @@ type ( phiDefInstListPool wazevoapi.Pool[phiDefInstList] // Followings are re-used during various places. - blks []Block - reals []RealReg - currentOccupants regInUseSet + blks []Block + reals []RealReg // Following two fields are updated while iterating the blocks in the reverse postorder. state state @@ -755,7 +754,8 @@ func (a *Allocator) allocBlock(f Function, blk Block) { killSet := a.reals[:0] // Gather the set of registers that will be used in the current instruction. - for _, use := range instr.Uses(&a.vs) { + uses := instr.Uses(&a.vs) + for _, use := range uses { if use.IsRealReg() { r := use.RealReg() currentUsedSet = currentUsedSet.add(r) @@ -770,7 +770,7 @@ func (a *Allocator) allocBlock(f Function, blk Block) { } } - for i, use := range instr.Uses(&a.vs) { + for i, use := range uses { if !use.IsRealReg() { vs := s.getVRegState(use.ID()) killed := vs.lastUse == pc @@ -944,8 +944,7 @@ func (a *Allocator) allocBlock(f Function, blk Block) { func (a *Allocator) releaseCallerSavedRegs(addrReg RealReg) { s := &a.state - for i := 0; i < 64; i++ { - allocated := RealReg(i) + for allocated := RealReg(0); allocated < 64; allocated++ { if allocated == addrReg { // If this is the call indirect, we should not touch the addr register. continue } @@ -974,11 +973,10 @@ func (a *Allocator) fixMergeState(f Function, blk Block) { bID := blk.ID() blkSt := a.getOrAllocateBlockState(bID) desiredOccupants := &blkSt.startRegs - aliveOnRegVRegs := make(map[VReg]RealReg) - for i := 0; i < 64; i++ { - r := RealReg(i) - if v := blkSt.startRegs.get(r); v.Valid() { - aliveOnRegVRegs[v] = r + var desiredOccupantsSet RegSet + for i, v := range desiredOccupants { + if v != VRegInvalid { + desiredOccupantsSet = desiredOccupantsSet.add(RealReg(i)) } } @@ -987,56 +985,38 @@ func (a *Allocator) fixMergeState(f Function, blk Block) { } s.currentBlockID = bID - a.updateLiveInVRState(a.getOrAllocateBlockState(bID)) + a.updateLiveInVRState(blkSt) - currentOccupants := &a.currentOccupants for i := 0; i < preds; i++ { - currentOccupants.reset() if i == blkSt.startFromPredIndex { continue } - currentOccupantsRev := make(map[VReg]RealReg) pred := blk.Pred(i) predSt := a.getOrAllocateBlockState(pred.ID()) - for ii := 0; ii < 64; ii++ { - r := RealReg(ii) - if v := predSt.endRegs.get(r); v.Valid() { - if _, ok := aliveOnRegVRegs[v]; !ok { - continue - } - currentOccupants.add(r, v) - currentOccupantsRev[v] = r - } - } s.resetAt(predSt) // Finds the free registers if any. intTmp, floatTmp := VRegInvalid, VRegInvalid if intFree := s.findAllocatable( - a.regInfo.AllocatableRegisters[RegTypeInt], desiredOccupants.set, + a.regInfo.AllocatableRegisters[RegTypeInt], desiredOccupantsSet, ); intFree != RealRegInvalid { intTmp = FromRealReg(intFree, RegTypeInt) } if floatFree := s.findAllocatable( - a.regInfo.AllocatableRegisters[RegTypeFloat], desiredOccupants.set, + a.regInfo.AllocatableRegisters[RegTypeFloat], desiredOccupantsSet, ); floatFree != RealRegInvalid { floatTmp = FromRealReg(floatFree, RegTypeFloat) } - if wazevoapi.RegAllocLoggingEnabled { - fmt.Println("\t", pred.ID(), ":", currentOccupants.format(a.regInfo)) - } - - for ii := 0; ii < 64; ii++ { - r := RealReg(ii) + for r := RealReg(0); r < 64; r++ { desiredVReg := desiredOccupants.get(r) if !desiredVReg.Valid() { continue } - currentVReg := currentOccupants.get(r) + currentVReg := s.regsInUse.get(r) if desiredVReg.ID() == currentVReg.ID() { continue } @@ -1048,86 +1028,95 @@ func (a *Allocator) fixMergeState(f Function, blk Block) { } else { tmpRealReg = floatTmp } - a.reconcileEdge(f, r, pred, currentOccupants, currentOccupantsRev, currentVReg, desiredVReg, tmpRealReg, typ) + a.reconcileEdge(f, r, pred, currentVReg, desiredVReg, tmpRealReg, typ) } } } +// reconcileEdge reconciles the register state between the current block and the predecessor for the real register `r`. +// +// - currentVReg is the current VReg value that sits on the register `r`. This can be VRegInvalid if the register is not used at the end of the predecessor. +// - desiredVReg is the desired VReg value that should be on the register `r`. +// - freeReg is the temporary register that can be used to swap the values, which may or may not be used. +// - typ is the register type of the `r`. func (a *Allocator) reconcileEdge(f Function, r RealReg, pred Block, - currentOccupants *regInUseSet, - currentOccupantsRev map[VReg]RealReg, currentVReg, desiredVReg VReg, freeReg VReg, typ RegType, ) { + // There are four cases to consider: + // 1. currentVReg is valid, but desiredVReg is on the stack. + // 2. Both currentVReg and desiredVReg are valid. + // 3. Desired is on a different register than `r` and currentReg is not valid. + // 4. Desired is on the stack and currentReg is not valid. + s := &a.state if currentVReg.Valid() { - // Both are on reg. - er, ok := currentOccupantsRev[desiredVReg] - if !ok { + desiredState := s.getVRegState(desiredVReg.ID()) + er := desiredState.r + if er == RealRegInvalid { + // Case 1: currentVReg is valid, but desiredVReg is on the stack. if wazevoapi.RegAllocLoggingEnabled { fmt.Printf("\t\tv%d is desired to be on %s, but currently on the stack\n", desiredVReg.ID(), a.regInfo.RealRegName(r), ) } - // This case is that the desired value is on the stack, but currentVReg is on the target register. - // We need to move the current value to the stack, and reload the desired value. + // We need to move the current value to the stack, and reload the desired value into the register. // TODO: we can do better here. f.StoreRegisterBefore(currentVReg.SetRealReg(r), pred.LastInstrForInsertion()) - delete(currentOccupantsRev, currentVReg) + s.releaseRealReg(r) s.getVRegState(desiredVReg.ID()).recordReload(f, pred) f.ReloadRegisterBefore(desiredVReg.SetRealReg(r), pred.LastInstrForInsertion()) - currentOccupants.add(r, desiredVReg) - currentOccupantsRev[desiredVReg] = r + s.useRealReg(r, desiredVReg) return - } - - if wazevoapi.RegAllocLoggingEnabled { - fmt.Printf("\t\tv%d is desired to be on %s, but currently on %s\n", - desiredVReg.ID(), a.regInfo.RealRegName(r), a.regInfo.RealRegName(er), + } else { + // Case 2: Both currentVReg and desiredVReg are valid. + if wazevoapi.RegAllocLoggingEnabled { + fmt.Printf("\t\tv%d is desired to be on %s, but currently on %s\n", + desiredVReg.ID(), a.regInfo.RealRegName(r), a.regInfo.RealRegName(er), + ) + } + // This case, we need to swap the values between the current and desired values. + f.SwapBefore( + currentVReg.SetRealReg(r), + desiredVReg.SetRealReg(er), + freeReg, + pred.LastInstrForInsertion(), ) - } - f.SwapBefore( - currentVReg.SetRealReg(r), - desiredVReg.SetRealReg(er), - freeReg, - pred.LastInstrForInsertion(), - ) - s.allocatedRegSet = s.allocatedRegSet.add(freeReg.RealReg()) - currentOccupantsRev[desiredVReg] = r - currentOccupantsRev[currentVReg] = er - currentOccupants.add(r, desiredVReg) - currentOccupants.add(er, currentVReg) - if wazevoapi.RegAllocLoggingEnabled { - fmt.Printf("\t\tv%d previously on %s moved to %s\n", currentVReg.ID(), a.regInfo.RealRegName(r), a.regInfo.RealRegName(er)) + s.allocatedRegSet = s.allocatedRegSet.add(freeReg.RealReg()) + s.releaseRealReg(r) + s.releaseRealReg(er) + s.useRealReg(r, desiredVReg) + s.useRealReg(er, currentVReg) + if wazevoapi.RegAllocLoggingEnabled { + fmt.Printf("\t\tv%d previously on %s moved to %s\n", currentVReg.ID(), a.regInfo.RealRegName(r), a.regInfo.RealRegName(er)) + } } } else { - // Desired is on reg, but currently the target register is not used. if wazevoapi.RegAllocLoggingEnabled { fmt.Printf("\t\tv%d is desired to be on %s, current not used\n", desiredVReg.ID(), a.regInfo.RealRegName(r), ) } - if currentReg, ok := currentOccupantsRev[desiredVReg]; ok { + if currentReg := s.getVRegState(desiredVReg.ID()).r; currentReg != RealRegInvalid { + // Case 3: Desired is on a different register than `r` and currentReg is not valid. + // We simply need to move the desired value to the register. f.InsertMoveBefore( FromRealReg(r, typ), desiredVReg.SetRealReg(currentReg), pred.LastInstrForInsertion(), ) - currentOccupants.remove(currentReg) + s.releaseRealReg(currentReg) } else { + // Case 4: Both currentVReg and desiredVReg are not valid. + // We simply need to reload the desired value into the register. s.getVRegState(desiredVReg.ID()).recordReload(f, pred) f.ReloadRegisterBefore(desiredVReg.SetRealReg(r), pred.LastInstrForInsertion()) } - currentOccupantsRev[desiredVReg] = r - currentOccupants.add(r, desiredVReg) - } - - if wazevoapi.RegAllocLoggingEnabled { - fmt.Println("\t", pred.ID(), ":", currentOccupants.format(a.regInfo)) + s.useRealReg(r, desiredVReg) } } @@ -1169,8 +1158,7 @@ func (a *Allocator) scheduleSpill(f Function, vs *vrState) { } for pos != definingBlk { st := a.getOrAllocateBlockState(pos.ID()) - for ii := 0; ii < 64; ii++ { - rr := RealReg(ii) + for rr := RealReg(0); rr < 64; rr++ { if st.startRegs.get(rr) == v { r = rr // Already in the register, so we can place the spill at the beginning of the block. diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc/regset.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc/regset.go index e9bf60661c..04a8e8f4db 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc/regset.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/backend/regalloc/regset.go @@ -46,23 +46,24 @@ func (rs RegSet) Range(f func(allocatedRealReg RealReg)) { } } -type regInUseSet struct { - set RegSet - vrs [64]VReg +type regInUseSet [64]VReg + +func newRegInUseSet() regInUseSet { + var ret regInUseSet + ret.reset() + return ret } func (rs *regInUseSet) reset() { - rs.set = 0 - for i := range rs.vrs { - rs.vrs[i] = VRegInvalid + for i := range rs { + rs[i] = VRegInvalid } } func (rs *regInUseSet) format(info *RegisterInfo) string { //nolint:unused var ret []string - for i := 0; i < 64; i++ { - if rs.set&(1<v%d)", info.RealRegName(RealReg(i)), vr.ID())) } } @@ -70,39 +71,28 @@ func (rs *regInUseSet) format(info *RegisterInfo) string { //nolint:unused } func (rs *regInUseSet) has(r RealReg) bool { - if r >= 64 { - return false - } - return rs.set&(1<= 64 { - return VRegInvalid - } - return rs.vrs[r] + return rs[r] } func (rs *regInUseSet) remove(r RealReg) { - if r >= 64 { - return - } - rs.set &= ^(1 << uint(r)) - rs.vrs[r] = VRegInvalid + rs[r] = VRegInvalid } func (rs *regInUseSet) add(r RealReg, vr VReg) { if r >= 64 { return } - rs.set |= 1 << uint(r) - rs.vrs[r] = vr + rs[r] = vr } func (rs *regInUseSet) range_(f func(allocatedRealReg RealReg, vr VReg)) { - for i := 0; i < 64; i++ { - if rs.set&(1< 0 { - b = uint64(uintptr(unsafe.Pointer(&mem.Buffer[0]))) - } - binary.LittleEndian.PutUint64(opaque[offset:], b) - binary.LittleEndian.PutUint64(opaque[offset+8:], s) -} - func (m *moduleEngine) setupOpaque() { inst := m.module offsets := &m.parent.offsets @@ -106,7 +96,7 @@ func (m *moduleEngine) setupOpaque() { ) if lm := offsets.LocalMemoryBegin; lm >= 0 { - putLocalMemory(opaque, lm, inst.MemoryInstance) + m.putLocalMemory() } // Note: imported memory is resolved in ResolveImportedFunction. @@ -227,6 +217,25 @@ func (m *moduleEngine) SetGlobalValue(i wasm.Index, lo, hi uint64) { // OwnsGlobals implements the same method as documented on wasm.ModuleEngine. func (m *moduleEngine) OwnsGlobals() bool { return true } +// MemoryGrown implements wasm.ModuleEngine. +func (m *moduleEngine) MemoryGrown() { + m.putLocalMemory() +} + +// putLocalMemory writes the local memory buffer pointer and length to the opaque buffer. +func (m *moduleEngine) putLocalMemory() { + mem := m.module.MemoryInstance + offset := m.parent.offsets.LocalMemoryBegin + + s := uint64(len(mem.Buffer)) + var b uint64 + if len(mem.Buffer) > 0 { + b = uint64(uintptr(unsafe.Pointer(&mem.Buffer[0]))) + } + binary.LittleEndian.PutUint64(m.opaque[offset:], b) + binary.LittleEndian.PutUint64(m.opaque[offset+8:], s) +} + // ResolveImportedFunction implements wasm.ModuleEngine. func (m *moduleEngine) ResolveImportedFunction(index, indexInImportedModule wasm.Index, importedModuleEngine wasm.ModuleEngine) { executableOffset, moduleCtxOffset, typeIDOffset := m.parent.offsets.ImportedFunctionOffset(index) diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/basic_block.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/basic_block.go index 10b6b4b62b..39627b9898 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/basic_block.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/basic_block.go @@ -49,21 +49,12 @@ type BasicBlock interface { // ReturnBlock returns ture if this block represents the function return. ReturnBlock() bool - // FormatHeader returns the debug string of this block, not including instruction. - FormatHeader(b Builder) string - // Valid is true if this block is still valid even after optimizations. Valid() bool // Sealed is true if this block has been sealed. Sealed() bool - // BeginPredIterator returns the first predecessor of this block. - BeginPredIterator() BasicBlock - - // NextPredIterator returns the next predecessor of this block. - NextPredIterator() BasicBlock - // Preds returns the number of predecessors of this block. Preds() int @@ -88,10 +79,11 @@ type ( basicBlock struct { id BasicBlockID rootInstr, currentInstr *Instruction - params []blockParam - predIter int - preds []basicBlockPredecessorInfo - success []*basicBlock + // params are Values that represent parameters to a basicBlock. + // Each parameter can be considered as an output of PHI instruction in traditional SSA. + params []Value + preds []basicBlockPredecessorInfo + success []*basicBlock // singlePred is the alias to preds[0] for fast lookup, and only set after Seal is called. singlePred *basicBlock // lastDefinitions maps Variable to its last definition in this block. @@ -116,11 +108,14 @@ type ( // loopNestingForestChildren holds the children of this block in the loop nesting forest. // Non-empty if and only if this block is a loop header (i.e. loopHeader=true) - loopNestingForestChildren []BasicBlock + loopNestingForestChildren wazevoapi.VarLength[BasicBlock] // reversePostOrder is used to sort all the blocks in the function in reverse post order. // This is used in builder.LayoutBlocks. - reversePostOrder int + reversePostOrder int32 + + // visited is used during various traversals. + visited int32 // child and sibling are the ones in the dominator tree. child, sibling *basicBlock @@ -128,15 +123,6 @@ type ( // BasicBlockID is the unique ID of a basicBlock. BasicBlockID uint32 - // blockParam implements Value and represents a parameter to a basicBlock. - blockParam struct { - // value is the Value that corresponds to the parameter in this block, - // and can be considered as an output of PHI instruction in traditional SSA. - value Value - // typ is the type of the parameter. - typ Type - } - unknownValue struct { // variable is the variable that this unknownValue represents. variable Variable @@ -145,6 +131,9 @@ type ( } ) +// basicBlockVarLengthNil is the default nil value for basicBlock.loopNestingForestChildren. +var basicBlockVarLengthNil = wazevoapi.NewNilVarLength[BasicBlock]() + const basicBlockIDReturnBlock = 0xffffffff // Name implements BasicBlock.Name. @@ -190,13 +179,13 @@ func (bb *basicBlock) ReturnBlock() bool { // AddParam implements BasicBlock.AddParam. func (bb *basicBlock) AddParam(b Builder, typ Type) Value { paramValue := b.allocateValue(typ) - bb.params = append(bb.params, blockParam{typ: typ, value: paramValue}) + bb.params = append(bb.params, paramValue) return paramValue } // addParamOn adds a parameter to this block whose value is already allocated. -func (bb *basicBlock) addParamOn(typ Type, value Value) { - bb.params = append(bb.params, blockParam{typ: typ, value: value}) +func (bb *basicBlock) addParamOn(value Value) { + bb.params = append(bb.params, value) } // Params implements BasicBlock.Params. @@ -206,8 +195,7 @@ func (bb *basicBlock) Params() int { // Param implements BasicBlock.Param. func (bb *basicBlock) Param(i int) Value { - p := &bb.params[i] - return p.value + return bb.params[i] } // Valid implements BasicBlock.Valid. @@ -248,22 +236,6 @@ func (bb *basicBlock) NumPreds() int { return len(bb.preds) } -// BeginPredIterator implements BasicBlock.BeginPredIterator. -func (bb *basicBlock) BeginPredIterator() BasicBlock { - bb.predIter = 0 - return bb.NextPredIterator() -} - -// NextPredIterator implements BasicBlock.NextPredIterator. -func (bb *basicBlock) NextPredIterator() BasicBlock { - if bb.predIter >= len(bb.preds) { - return nil - } - pred := bb.preds[bb.predIter].blk - bb.predIter++ - return pred -} - // Preds implements BasicBlock.Preds. func (bb *basicBlock) Preds() int { return len(bb.preds) @@ -305,7 +277,8 @@ func resetBasicBlock(bb *basicBlock) { bb.unknownValues = bb.unknownValues[:0] bb.lastDefinitions = wazevoapi.ResetMap(bb.lastDefinitions) bb.reversePostOrder = -1 - bb.loopNestingForestChildren = bb.loopNestingForestChildren[:0] + bb.visited = 0 + bb.loopNestingForestChildren = basicBlockVarLengthNil bb.loopHeader = false bb.sibling = nil bb.child = nil @@ -335,11 +308,11 @@ func (bb *basicBlock) addPred(blk BasicBlock, branch *Instruction) { pred.success = append(pred.success, bb) } -// FormatHeader implements BasicBlock.FormatHeader. -func (bb *basicBlock) FormatHeader(b Builder) string { +// formatHeader returns the string representation of the header of the basicBlock. +func (bb *basicBlock) formatHeader(b Builder) string { ps := make([]string, len(bb.params)) for i, p := range bb.params { - ps[i] = p.value.formatWithType(b) + ps[i] = p.formatWithType(b) } if len(bb.preds) > 0 { @@ -398,7 +371,7 @@ func (bb *basicBlock) String() string { // LoopNestingForestChildren implements BasicBlock.LoopNestingForestChildren. func (bb *basicBlock) LoopNestingForestChildren() []BasicBlock { - return bb.loopNestingForestChildren + return bb.loopNestingForestChildren.View() } // LoopHeader implements BasicBlock.LoopHeader. diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/builder.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/builder.go index 1fc84d2eaf..0b700c4b19 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/builder.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/builder.go @@ -54,9 +54,6 @@ type Builder interface { // MustFindValue searches the latest definition of the given Variable and returns the result. MustFindValue(variable Variable) Value - // MustFindValueInBlk is the same as MustFindValue except it searches the latest definition from the given BasicBlock. - MustFindValueInBlk(variable Variable, blk BasicBlock) Value - // FindValueInLinearPath tries to find the latest definition of the given Variable in the linear path to the current BasicBlock. // If it cannot find the definition, or it's not sealed yet, it returns ValueInvalid. FindValueInLinearPath(variable Variable) Value @@ -127,7 +124,11 @@ type Builder interface { // Idom returns the immediate dominator of the given BasicBlock. Idom(blk BasicBlock) BasicBlock + // VarLengthPool returns the VarLengthPool of Value. VarLengthPool() *wazevoapi.VarLengthPool[Value] + + // InsertZeroValue inserts a zero value constant instruction of the given type. + InsertZeroValue(t Type) } // NewBuilder returns a new Builder implementation. @@ -135,10 +136,10 @@ func NewBuilder() Builder { return &builder{ instructionsPool: wazevoapi.NewPool[Instruction](resetInstruction), basicBlocksPool: wazevoapi.NewPool[basicBlock](resetBasicBlock), + varLengthBasicBlockPool: wazevoapi.NewVarLengthPool[BasicBlock](), varLengthPool: wazevoapi.NewVarLengthPool[Value](), valueAnnotations: make(map[ValueID]string), signatures: make(map[SignatureID]*Signature), - blkVisited: make(map[*basicBlock]int), valueIDAliases: make(map[ValueID]Value), redundantParameterIndexToValue: make(map[int]Value), returnBlk: &basicBlock{id: basicBlockIDReturnBlock}, @@ -177,12 +178,13 @@ type builder struct { dominators []*basicBlock sparseTree dominatorSparseTree + varLengthBasicBlockPool wazevoapi.VarLengthPool[BasicBlock] + // loopNestingForestRoots are the roots of the loop nesting forest. loopNestingForestRoots []BasicBlock // The followings are used for optimization passes/deterministic compilation. instStack []*Instruction - blkVisited map[*basicBlock]int valueIDToInstruction []*Instruction blkStack []*basicBlock blkStack2 []*basicBlock @@ -200,6 +202,32 @@ type builder struct { donePostBlockLayoutPasses bool currentSourceOffset SourceOffset + + // zeros are the zero value constants for each type. + zeros [typeEnd]Value +} + +// InsertZeroValue implements Builder.InsertZeroValue. +func (b *builder) InsertZeroValue(t Type) { + if b.zeros[t].Valid() { + return + } + zeroInst := b.AllocateInstruction() + switch t { + case TypeI32: + zeroInst.AsIconst32(0) + case TypeI64: + zeroInst.AsIconst64(0) + case TypeF32: + zeroInst.AsF32const(0) + case TypeF64: + zeroInst.AsF64const(0) + case TypeV128: + zeroInst.AsVconst(0, 0) + default: + panic("TODO: " + t.String()) + } + b.zeros[t] = zeroInst.Insert(b).Return() } func (b *builder) VarLengthPool() *wazevoapi.VarLengthPool[Value] { @@ -215,10 +243,12 @@ func (b *builder) ReturnBlock() BasicBlock { func (b *builder) Init(s *Signature) { b.nextVariable = 0 b.currentSignature = s + b.zeros = [typeEnd]Value{ValueInvalid, ValueInvalid, ValueInvalid, ValueInvalid, ValueInvalid, ValueInvalid} resetBasicBlock(b.returnBlk) b.instructionsPool.Reset() b.basicBlocksPool.Reset() b.varLengthPool.Reset() + b.varLengthBasicBlockPool.Reset() b.donePreBlockLayoutPasses = false b.doneBlockLayout = false b.donePostBlockLayoutPasses = false @@ -231,11 +261,6 @@ func (b *builder) Init(s *Signature) { b.blkStack2 = b.blkStack2[:0] b.dominators = b.dominators[:0] b.loopNestingForestRoots = b.loopNestingForestRoots[:0] - - for i := 0; i < b.basicBlocksPool.Allocated(); i++ { - blk := b.basicBlocksPool.View(i) - delete(b.blkVisited, blk) - } b.basicBlocksPool.Reset() for v := ValueID(0); v < b.nextValueID; v++ { @@ -448,11 +473,6 @@ func (b *builder) findValueInLinearPath(variable Variable, blk *basicBlock) Valu return ValueInvalid } -func (b *builder) MustFindValueInBlk(variable Variable, blk BasicBlock) Value { - typ := b.definedVariableType(variable) - return b.findValue(typ, variable, blk.(*basicBlock)) -} - // MustFindValue implements Builder.MustFindValue. func (b *builder) MustFindValue(variable Variable) Value { typ := b.definedVariableType(variable) @@ -482,6 +502,9 @@ func (b *builder) findValue(typ Type, variable Variable, blk *basicBlock) Value value: value, }) return value + } else if blk.EntryBlock() { + // If this is the entry block, we reach the uninitialized variable which has zero value. + return b.zeros[b.definedVariableType(variable)] } if pred := blk.singlePred; pred != nil { @@ -495,21 +518,42 @@ func (b *builder) findValue(typ Type, variable Variable, blk *basicBlock) Value // If this block has multiple predecessors, we have to gather the definitions, // and treat them as an argument to this block. // - // The first thing is to define a new parameter to this block which may or may not be redundant, but - // later we eliminate trivial params in an optimization pass. This must be done before finding the - // definitions in the predecessors so that we can break the cycle. - paramValue := blk.AddParam(b, typ) - b.DefineVariable(variable, paramValue, blk) - - // After the new param is added, we have to manipulate the original branching instructions - // in predecessors so that they would pass the definition of `variable` as the argument to - // the newly added PHI. + // But before that, we have to check if the possible definitions are the same Value. + tmpValue := b.allocateValue(typ) + // Break the cycle by defining the variable with the tmpValue. + b.DefineVariable(variable, tmpValue, blk) + // Check all the predecessors if they have the same definition. + uniqueValue := ValueInvalid for i := range blk.preds { - pred := &blk.preds[i] - value := b.findValue(typ, variable, pred.blk) - pred.branch.addArgumentBranchInst(b, value) + predValue := b.findValue(typ, variable, blk.preds[i].blk) + if uniqueValue == ValueInvalid { + uniqueValue = predValue + } else if uniqueValue != predValue { + uniqueValue = ValueInvalid + break + } + } + + if uniqueValue != ValueInvalid { + // If all the predecessors have the same definition, we can use that value. + b.DefineVariable(variable, uniqueValue, blk) + b.alias(tmpValue, uniqueValue) + return uniqueValue + } else { + // Otherwise, add the tmpValue to this block as a parameter which may or may not be redundant, but + // later we eliminate trivial params in an optimization pass. This must be done before finding the + // definitions in the predecessors so that we can break the cycle. + blk.addParamOn(tmpValue) + // After the new param is added, we have to manipulate the original branching instructions + // in predecessors so that they would pass the definition of `variable` as the argument to + // the newly added PHI. + for i := range blk.preds { + pred := &blk.preds[i] + value := b.findValue(typ, variable, pred.blk) + pred.branch.addArgumentBranchInst(b, value) + } + return tmpValue } - return paramValue } // Seal implements Builder.Seal. @@ -523,7 +567,7 @@ func (b *builder) Seal(raw BasicBlock) { for _, v := range blk.unknownValues { variable, phiValue := v.variable, v.value typ := b.definedVariableType(variable) - blk.addParamOn(typ, phiValue) + blk.addParamOn(phiValue) for i := range blk.preds { pred := &blk.preds[i] predValue := b.findValue(typ, variable, pred.blk) @@ -566,7 +610,7 @@ func (b *builder) Format() string { } for bb := iterBegin(); bb != nil; bb = iterNext() { str.WriteByte('\n') - str.WriteString(bb.FormatHeader(b)) + str.WriteString(bb.formatHeader(b)) str.WriteByte('\n') for cur := bb.Root(); cur != nil; cur = cur.Next() { diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass.go index a2e986cd15..89ec34b7eb 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass.go @@ -22,9 +22,9 @@ func (b *builder) RunPasses() { func (b *builder) runPreBlockLayoutPasses() { passSortSuccessors(b) passDeadBlockEliminationOpt(b) - passRedundantPhiEliminationOpt(b) // The result of passCalculateImmediateDominators will be used by various passes below. passCalculateImmediateDominators(b) + passRedundantPhiEliminationOpt(b) passNopInstElimination(b) // TODO: implement either conversion of irreducible CFG into reducible one, or irreducible CFG detection where we panic. @@ -78,12 +78,11 @@ func (b *builder) runFinalizingPasses() { // passDeadBlockEliminationOpt searches the unreachable blocks, and sets the basicBlock.invalid flag true if so. func passDeadBlockEliminationOpt(b *builder) { entryBlk := b.entryBlk() - b.clearBlkVisited() b.blkStack = append(b.blkStack, entryBlk) for len(b.blkStack) > 0 { reachableBlk := b.blkStack[len(b.blkStack)-1] b.blkStack = b.blkStack[:len(b.blkStack)-1] - b.blkVisited[reachableBlk] = 0 // the value won't be used in this pass. + reachableBlk.visited = 1 if !reachableBlk.sealed && !reachableBlk.ReturnBlock() { panic(fmt.Sprintf("%s is not sealed", reachableBlk)) @@ -94,7 +93,7 @@ func passDeadBlockEliminationOpt(b *builder) { } for _, succ := range reachableBlk.success { - if _, ok := b.blkVisited[succ]; ok { + if succ.visited == 1 { continue } b.blkStack = append(b.blkStack, succ) @@ -102,13 +101,16 @@ func passDeadBlockEliminationOpt(b *builder) { } for blk := b.blockIteratorBegin(); blk != nil; blk = b.blockIteratorNext() { - if _, ok := b.blkVisited[blk]; !ok { + if blk.visited != 1 { blk.invalid = true } + blk.visited = 0 } } // passRedundantPhiEliminationOpt eliminates the redundant PHIs (in our terminology, parameters of a block). +// This requires the reverse post-order traversal to be calculated before calling this function, +// hence passCalculateImmediateDominators must be called before this. func passRedundantPhiEliminationOpt(b *builder) { redundantParameterIndexes := b.ints[:0] // reuse the slice from previous iterations. @@ -118,15 +120,18 @@ func passRedundantPhiEliminationOpt(b *builder) { // relatively small. For example, sqlite speedtest binary results in the large number of redundant PHIs, // the maximum number of iteration was 22, which seems to be acceptable but not that small either since the // complexity here is O(BlockNum * Iterations) at the worst case where BlockNum might be the order of thousands. + // -- Note -- + // Currently, each iteration can run in any order of blocks, but it empirically converges quickly in practice when + // running on the reverse post-order. It might be possible to optimize this further by using the dominator tree. for { changed := false - _ = b.blockIteratorBegin() // skip entry block! + _ = b.blockIteratorReversePostOrderBegin() // skip entry block! // Below, we intentionally use the named iteration variable name, as this comes with inevitable nested for loops! - for blk := b.blockIteratorNext(); blk != nil; blk = b.blockIteratorNext() { + for blk := b.blockIteratorReversePostOrderNext(); blk != nil; blk = b.blockIteratorReversePostOrderNext() { paramNum := len(blk.params) for paramIndex := 0; paramIndex < paramNum; paramIndex++ { - phiValue := blk.params[paramIndex].value + phiValue := blk.params[paramIndex] redundant := true nonSelfReferencingValue := ValueInvalid @@ -184,7 +189,7 @@ func passRedundantPhiEliminationOpt(b *builder) { // Still need to have the definition of the value of the PHI (previously as the parameter). for _, redundantParamIndex := range redundantParameterIndexes { - phiValue := blk.params[redundantParamIndex].value + phiValue := blk.params[redundantParamIndex] onlyValue := b.redundantParameterIndexToValue[redundantParamIndex] // Create an alias in this block from the only phi argument to the phi value. b.alias(phiValue, onlyValue) @@ -227,10 +232,10 @@ func passRedundantPhiEliminationOpt(b *builder) { func passDeadCodeEliminationOpt(b *builder) { nvid := int(b.nextValueID) if nvid >= len(b.valueRefCounts) { - b.valueRefCounts = append(b.valueRefCounts, make([]int, b.nextValueID)...) + b.valueRefCounts = append(b.valueRefCounts, make([]int, nvid-len(b.valueRefCounts)+1)...) } if nvid >= len(b.valueIDToInstruction) { - b.valueIDToInstruction = append(b.valueIDToInstruction, make([]*Instruction, b.nextValueID)...) + b.valueIDToInstruction = append(b.valueIDToInstruction, make([]*Instruction, nvid-len(b.valueIDToInstruction)+1)...) } // First, we gather all the instructions with side effects. @@ -350,22 +355,10 @@ func (b *builder) incRefCount(id ValueID, from *Instruction) { b.valueRefCounts[id]++ } -// clearBlkVisited clears the b.blkVisited map so that we can reuse it for multiple places. -func (b *builder) clearBlkVisited() { - b.blkStack2 = b.blkStack2[:0] - for key := range b.blkVisited { - b.blkStack2 = append(b.blkStack2, key) - } - for _, blk := range b.blkStack2 { - delete(b.blkVisited, blk) - } - b.blkStack2 = b.blkStack2[:0] -} - // passNopInstElimination eliminates the instructions which is essentially a no-op. func passNopInstElimination(b *builder) { if int(b.nextValueID) >= len(b.valueIDToInstruction) { - b.valueIDToInstruction = append(b.valueIDToInstruction, make([]*Instruction, b.nextValueID)...) + b.valueIDToInstruction = append(b.valueIDToInstruction, make([]*Instruction, int(b.nextValueID)-len(b.valueIDToInstruction)+1)...) } for blk := b.blockIteratorBegin(); blk != nil; blk = b.blockIteratorNext() { diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass_blk_layouts.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass_blk_layouts.go index 9068180a0b..584b5eadea 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass_blk_layouts.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass_blk_layouts.go @@ -23,8 +23,6 @@ import ( // // This heuristic is done in maybeInvertBranches function. func passLayoutBlocks(b *builder) { - b.clearBlkVisited() - // We might end up splitting critical edges which adds more basic blocks, // so we store the currently existing basic blocks in nonSplitBlocks temporarily. // That way we can iterate over the original basic blocks while appending new ones into reversePostOrderedBasicBlocks. @@ -47,20 +45,20 @@ func passLayoutBlocks(b *builder) { for _, blk := range nonSplitBlocks { for i := range blk.preds { pred := blk.preds[i].blk - if _, ok := b.blkVisited[pred]; ok || !pred.Valid() { + if pred.visited == 1 || !pred.Valid() { continue } else if pred.reversePostOrder < blk.reversePostOrder { // This means the edge is critical, and this pred is the trampoline and yet to be inserted. // Split edge trampolines must come before the destination in reverse post-order. b.reversePostOrderedBasicBlocks = append(b.reversePostOrderedBasicBlocks, pred) - b.blkVisited[pred] = 0 // mark as inserted, the value is not used. + pred.visited = 1 // mark as inserted. } } // Now that we've already added all the potential trampoline blocks incoming to this block, // we can add this block itself. b.reversePostOrderedBasicBlocks = append(b.reversePostOrderedBasicBlocks, blk) - b.blkVisited[blk] = 0 // mark as inserted, the value is not used. + blk.visited = 1 // mark as inserted. if len(blk.success) < 2 { // There won't be critical edge originating from this block. @@ -116,7 +114,7 @@ func passLayoutBlocks(b *builder) { if fallthroughBranch.opcode == OpcodeJump && fallthroughBranch.blk == trampoline { // This can be lowered as fallthrough at the end of the block. b.reversePostOrderedBasicBlocks = append(b.reversePostOrderedBasicBlocks, trampoline) - b.blkVisited[trampoline] = 0 // mark as inserted, the value is not used. + trampoline.visited = 1 // mark as inserted. } else { uninsertedTrampolines = append(uninsertedTrampolines, trampoline) } @@ -126,7 +124,7 @@ func passLayoutBlocks(b *builder) { if trampoline.success[0].reversePostOrder <= trampoline.reversePostOrder { // "<=", not "<" because the target might be itself. // This means the critical edge was backward, so we insert after the current block immediately. b.reversePostOrderedBasicBlocks = append(b.reversePostOrderedBasicBlocks, trampoline) - b.blkVisited[trampoline] = 0 // mark as inserted, the value is not used. + trampoline.visited = 1 // mark as inserted. } // If the target is forward, we can wait to insert until the target is inserted. } uninsertedTrampolines = uninsertedTrampolines[:0] // Reuse the stack for the next block. @@ -142,8 +140,8 @@ func passLayoutBlocks(b *builder) { if wazevoapi.SSAValidationEnabled { for _, trampoline := range trampolines { - if _, ok := b.blkVisited[trampoline]; !ok { - panic("BUG: trampoline block not inserted: " + trampoline.FormatHeader(b)) + if trampoline.visited != 1 { + panic("BUG: trampoline block not inserted: " + trampoline.formatHeader(b)) } trampoline.validate(b) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass_cfg.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass_cfg.go index 50cb9c4750..e8288c4bd3 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass_cfg.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/ssa/pass_cfg.go @@ -15,10 +15,6 @@ import ( // At the last of pass, this function also does the loop detection and sets the basicBlock.loop flag. func passCalculateImmediateDominators(b *builder) { reversePostOrder := b.reversePostOrderedBasicBlocks[:0] - exploreStack := b.blkStack[:0] - b.clearBlkVisited() - - entryBlk := b.entryBlk() // Store the reverse postorder from the entrypoint into reversePostOrder slice. // This calculation of reverse postorder is not described in the paper, @@ -28,14 +24,17 @@ func passCalculateImmediateDominators(b *builder) { // which is a reasonable assumption as long as SSA Builder is properly used. // // First we push blocks in postorder iteratively visit successors of the entry block. - exploreStack = append(exploreStack, entryBlk) + entryBlk := b.entryBlk() + exploreStack := append(b.blkStack[:0], entryBlk) + // These flags are used to track the state of the block in the DFS traversal. + // We temporarily use the reversePostOrder field to store the state. const visitStateUnseen, visitStateSeen, visitStateDone = 0, 1, 2 - b.blkVisited[entryBlk] = visitStateSeen + entryBlk.visited = visitStateSeen for len(exploreStack) > 0 { tail := len(exploreStack) - 1 blk := exploreStack[tail] exploreStack = exploreStack[:tail] - switch b.blkVisited[blk] { + switch blk.visited { case visitStateUnseen: // This is likely a bug in the frontend. panic("BUG: unsupported CFG") @@ -48,16 +47,18 @@ func passCalculateImmediateDominators(b *builder) { if succ.ReturnBlock() || succ.invalid { continue } - if b.blkVisited[succ] == visitStateUnseen { - b.blkVisited[succ] = visitStateSeen + if succ.visited == visitStateUnseen { + succ.visited = visitStateSeen exploreStack = append(exploreStack, succ) } } // Finally, we could pop this block once we pop all of its successors. - b.blkVisited[blk] = visitStateDone + blk.visited = visitStateDone case visitStateDone: // Note: at this point we push blk in postorder despite its name. reversePostOrder = append(reversePostOrder, blk) + default: + panic("BUG") } } // At this point, reversePostOrder has postorder actually, so we reverse it. @@ -67,7 +68,7 @@ func passCalculateImmediateDominators(b *builder) { } for i, blk := range reversePostOrder { - blk.reversePostOrder = i + blk.reversePostOrder = int32(i) } // Reuse the dominators slice if possible from the previous computation of function. @@ -180,7 +181,7 @@ func passBuildLoopNestingForest(b *builder) { b.loopNestingForestRoots = append(b.loopNestingForestRoots, blk) } else if n == ent { } else if n.loopHeader { - n.loopNestingForestChildren = append(n.loopNestingForestChildren, blk) + n.loopNestingForestChildren = n.loopNestingForestChildren.Append(&b.varLengthBasicBlockPool, blk) } } @@ -193,7 +194,7 @@ func passBuildLoopNestingForest(b *builder) { func printLoopNestingForest(root *basicBlock, depth int) { fmt.Println(strings.Repeat("\t", depth), "loop nesting forest root:", root.ID()) - for _, child := range root.loopNestingForestChildren { + for _, child := range root.loopNestingForestChildren.View() { fmt.Println(strings.Repeat("\t", depth+1), "child:", child.ID()) if child.LoopHeader() { printLoopNestingForest(child.(*basicBlock), depth+2) @@ -202,10 +203,10 @@ func printLoopNestingForest(root *basicBlock, depth int) { } type dominatorSparseTree struct { - time int + time int32 euler []*basicBlock - first, depth []int - table [][]int + first, depth []int32 + table [][]int32 } // passBuildDominatorTree builds the dominator tree for the function, and constructs builder.sparseTree. @@ -232,11 +233,11 @@ func passBuildDominatorTree(b *builder) { n := b.basicBlocksPool.Allocated() st := &b.sparseTree st.euler = append(st.euler[:0], make([]*basicBlock, 2*n-1)...) - st.first = append(st.first[:0], make([]int, n)...) + st.first = append(st.first[:0], make([]int32, n)...) for i := range st.first { st.first[i] = -1 } - st.depth = append(st.depth[:0], make([]int, 2*n-1)...) + st.depth = append(st.depth[:0], make([]int32, 2*n-1)...) st.time = 0 // Start building the sparse tree. @@ -244,9 +245,9 @@ func passBuildDominatorTree(b *builder) { st.buildSparseTable() } -func (dt *dominatorSparseTree) eulerTour(node *basicBlock, height int) { +func (dt *dominatorSparseTree) eulerTour(node *basicBlock, height int32) { if wazevoapi.SSALoggingEnabled { - fmt.Println(strings.Repeat("\t", height), "euler tour:", node.ID()) + fmt.Println(strings.Repeat("\t", int(height)), "euler tour:", node.ID()) } dt.euler[dt.time] = node dt.depth[dt.time] = height @@ -270,13 +271,13 @@ func (dt *dominatorSparseTree) buildSparseTable() { table := dt.table if n >= len(table) { - table = append(table, make([][]int, n+1)...) + table = append(table, make([][]int32, n-len(table)+1)...) } for i := range table { if len(table[i]) < k { - table[i] = append(table[i], make([]int, k)...) + table[i] = append(table[i], make([]int32, k-len(table[i]))...) } - table[i][0] = i + table[i][0] = int32(i) } for j := 1; 1< 0 { - m.NonStaticLocals[idx] = nonStaticLocals - } - functionType := &m.TypeSection[m.FunctionSection[idx]] code := &m.CodeSection[idx] body := code.Body @@ -357,7 +352,6 @@ func (m *Module) validateFunctionWithMaxStackValues( return fmt.Errorf("invalid local index for %s %d >= %d(=len(locals)+len(parameters))", OpcodeLocalSetName, index, l) } - nonStaticLocals[index] = struct{}{} var expType ValueType if index < inputLen { expType = functionType.Params[index] @@ -373,7 +367,6 @@ func (m *Module) validateFunctionWithMaxStackValues( return fmt.Errorf("invalid local index for %s %d >= %d(=len(locals)+len(parameters))", OpcodeLocalTeeName, index, l) } - nonStaticLocals[index] = struct{}{} var expType ValueType if index < inputLen { expType = functionType.Params[index] diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go index 5cc5012dae..947b16112d 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go @@ -59,11 +59,14 @@ type MemoryInstance struct { // with a fixed weight of 1 and no spurious notifications. waiters sync.Map + // ownerModuleEngine is the module engine that owns this memory instance. + ownerModuleEngine ModuleEngine + expBuffer experimental.LinearMemory } // NewMemoryInstance creates a new instance based on the parameters in the SectionIDMemory. -func NewMemoryInstance(memSec *Memory, allocator experimental.MemoryAllocator) *MemoryInstance { +func NewMemoryInstance(memSec *Memory, allocator experimental.MemoryAllocator, moduleEngine ModuleEngine) *MemoryInstance { minBytes := MemoryPagesToBytesNum(memSec.Min) capBytes := MemoryPagesToBytesNum(memSec.Cap) maxBytes := MemoryPagesToBytesNum(memSec.Max) @@ -89,12 +92,13 @@ func NewMemoryInstance(memSec *Memory, allocator experimental.MemoryAllocator) * buffer = make([]byte, minBytes, capBytes) } return &MemoryInstance{ - Buffer: buffer, - Min: memSec.Min, - Cap: memoryBytesNumToPages(uint64(cap(buffer))), - Max: memSec.Max, - Shared: memSec.IsShared, - expBuffer: expBuffer, + Buffer: buffer, + Min: memSec.Min, + Cap: memoryBytesNumToPages(uint64(cap(buffer))), + Max: memSec.Max, + Shared: memSec.IsShared, + expBuffer: expBuffer, + ownerModuleEngine: moduleEngine, } } @@ -247,14 +251,12 @@ func (m *MemoryInstance) Grow(delta uint32) (result uint32, ok bool) { m.Buffer = buffer m.Cap = newPages } - return currentPages, true } else if newPages > m.Cap { // grow the memory. if m.Shared { panic("shared memory cannot be grown, this is a bug in wazero") } m.Buffer = append(m.Buffer, make([]byte, MemoryPagesToBytesNum(delta))...) m.Cap = newPages - return currentPages, true } else { // We already have the capacity we need. if m.Shared { // We assume grow is called under a guest lock. @@ -264,8 +266,9 @@ func (m *MemoryInstance) Grow(delta uint32) (result uint32, ok bool) { } else { m.Buffer = m.Buffer[:MemoryPagesToBytesNum(newPages)] } - return currentPages, true } + m.ownerModuleEngine.MemoryGrown() + return currentPages, true } // Pages implements the same method as documented on api.Memory. diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/module.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/module.go index 68573b918e..8369ad9ed6 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasm/module.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/module.go @@ -185,9 +185,6 @@ type Module struct { // as described in https://yurydelendik.github.io/webassembly-dwarf/, though it is not specified in the Wasm // specification: https://github.com/WebAssembly/debugging/issues/1 DWARFLines *wasmdebug.DWARFLines - - // NonStaticLocals collects the local indexes that will change its value through either local.get or local.tee. - NonStaticLocals []map[Index]struct{} } // ModuleID represents sha256 hash value uniquely assigned to Module. @@ -366,8 +363,6 @@ func (m *Module) validateFunctions(enabledFeatures api.CoreFeatures, functions [ br := bytes.NewReader(nil) // Also, we reuse the stacks across multiple function validations to reduce allocations. vs := &stacks{} - // Non-static locals are gathered during validation and used in the down-stream compilation. - m.NonStaticLocals = make([]map[Index]struct{}, len(m.FunctionSection)) for idx, typeIndex := range m.FunctionSection { if typeIndex >= typeCount { return fmt.Errorf("invalid %s: type section index %d out of range", m.funcDesc(SectionIDFunction, Index(idx)), typeIndex) @@ -655,7 +650,7 @@ func paramNames(localNames IndirectNameMap, funcIdx uint32, paramLen int) []stri func (m *ModuleInstance) buildMemory(module *Module, allocator experimental.MemoryAllocator) { memSec := module.MemorySection if memSec != nil { - m.MemoryInstance = NewMemoryInstance(memSec, allocator) + m.MemoryInstance = NewMemoryInstance(memSec, allocator, m.Engine) m.MemoryInstance.definition = &module.MemoryDefinitionSection[0] } } diff --git a/vendor/modules.txt b/vendor/modules.txt index 1f1ac081f0..1685e5f623 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -545,11 +545,12 @@ github.com/moloch--/asciicast # github.com/moloch--/memmod v0.0.0-20230225130813-fd77d905589e ## explicit; go 1.17 github.com/moloch--/memmod -# github.com/ncruces/go-sqlite3 v0.15.0 +# github.com/ncruces/go-sqlite3 v0.16.3 ## explicit; go 1.21 github.com/ncruces/go-sqlite3 github.com/ncruces/go-sqlite3/driver github.com/ncruces/go-sqlite3/embed +github.com/ncruces/go-sqlite3/internal/alloc github.com/ncruces/go-sqlite3/internal/util github.com/ncruces/go-sqlite3/util/osutil github.com/ncruces/go-sqlite3/vfs @@ -704,7 +705,7 @@ github.com/tailscale/wireguard-go/tun # github.com/tcnksm/go-httpstat v0.2.0 ## explicit github.com/tcnksm/go-httpstat -# github.com/tetratelabs/wazero v1.7.2 +# github.com/tetratelabs/wazero v1.7.3 ## explicit; go 1.20 github.com/tetratelabs/wazero github.com/tetratelabs/wazero/api