From fb8227751c47d4f7f9e886bac17020a41ee6df77 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 18 Jun 2024 10:22:41 +0100 Subject: [PATCH 1/3] Revert tinygo reflect.SliceHeader specialization Signed-off-by: Nuno Cruces --- internal/engine/wazevo/backend/isa/amd64/reflect.go | 11 ----------- .../engine/wazevo/backend/isa/amd64/reflect_tinygo.go | 11 ----------- internal/engine/wazevo/backend/isa/amd64/stack.go | 7 ++++--- .../engine/wazevo/backend/isa/arm64/unwind_stack.go | 1 - internal/engine/wazevo/call_engine.go | 6 ++++-- internal/engine/wazevo/engine_test.go | 1 - internal/engine/wazevo/hostmodule.go | 3 ++- internal/engine/wazevo/reflect.go | 11 ----------- internal/engine/wazevo/reflect_tinygo.go | 11 ----------- internal/integration_test/fuzz/wazerolib/extern.go | 2 -- 10 files changed, 10 insertions(+), 54 deletions(-) delete mode 100644 internal/engine/wazevo/backend/isa/amd64/reflect.go delete mode 100644 internal/engine/wazevo/backend/isa/amd64/reflect_tinygo.go delete mode 100644 internal/engine/wazevo/reflect.go delete mode 100644 internal/engine/wazevo/reflect_tinygo.go diff --git a/internal/engine/wazevo/backend/isa/amd64/reflect.go b/internal/engine/wazevo/backend/isa/amd64/reflect.go deleted file mode 100644 index 5219837e35..0000000000 --- a/internal/engine/wazevo/backend/isa/amd64/reflect.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build !tinygo - -package amd64 - -import "reflect" - -// setSliceLimits sets both Cap and Len for the given reflected slice. -func setSliceLimits(s *reflect.SliceHeader, limit uintptr) { - s.Len = int(limit) - s.Cap = int(limit) -} diff --git a/internal/engine/wazevo/backend/isa/amd64/reflect_tinygo.go b/internal/engine/wazevo/backend/isa/amd64/reflect_tinygo.go deleted file mode 100644 index df4cf46ec5..0000000000 --- a/internal/engine/wazevo/backend/isa/amd64/reflect_tinygo.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build tinygo - -package amd64 - -import "reflect" - -// setSliceLimits sets both Cap and Len for the given reflected slice. -func setSliceLimits(s *reflect.SliceHeader, limit uintptr) { - s.Len = limit - s.Len = limit -} diff --git a/internal/engine/wazevo/backend/isa/amd64/stack.go b/internal/engine/wazevo/backend/isa/amd64/stack.go index 05ba5f027e..4d4687cb14 100644 --- a/internal/engine/wazevo/backend/isa/amd64/stack.go +++ b/internal/engine/wazevo/backend/isa/amd64/stack.go @@ -9,12 +9,13 @@ import ( ) func stackView(rbp, top uintptr) []byte { + l := int(top - rbp) var stackBuf []byte { - // TODO: use unsafe.Slice after floor version is set to Go 1.20. hdr := (*reflect.SliceHeader)(unsafe.Pointer(&stackBuf)) hdr.Data = rbp - setSliceLimits(hdr, top-rbp) + hdr.Len = l + hdr.Cap = l } return stackBuf } @@ -72,7 +73,7 @@ func GoCallStackView(stackPointerBeforeGoCall *uint64) []uint64 { // | SizeInBytes | // +-----------------+ <---- stackPointerBeforeGoCall // (low address) - data := unsafe.Pointer(uintptr(unsafe.Pointer(stackPointerBeforeGoCall)) + 8) + data := unsafe.Add(unsafe.Pointer(stackPointerBeforeGoCall), 8) size := *stackPointerBeforeGoCall / 8 return unsafe.Slice((*uint64)(data), int(size)) } diff --git a/internal/engine/wazevo/backend/isa/arm64/unwind_stack.go b/internal/engine/wazevo/backend/isa/arm64/unwind_stack.go index edb0e36e33..3ab2d0f134 100644 --- a/internal/engine/wazevo/backend/isa/arm64/unwind_stack.go +++ b/internal/engine/wazevo/backend/isa/arm64/unwind_stack.go @@ -14,7 +14,6 @@ func UnwindStack(sp, _, top uintptr, returnAddresses []uintptr) []uintptr { var stackBuf []byte { - // TODO: use unsafe.Slice after floor version is set to Go 1.20. hdr := (*reflect.SliceHeader)(unsafe.Pointer(&stackBuf)) hdr.Data = sp hdr.Len = l diff --git a/internal/engine/wazevo/call_engine.go b/internal/engine/wazevo/call_engine.go index 72ce44e26f..c56b8bcdbc 100644 --- a/internal/engine/wazevo/call_engine.go +++ b/internal/engine/wazevo/call_engine.go @@ -556,7 +556,8 @@ func (c *callEngine) cloneStack(l uintptr) (newSP, newFP, newTop uintptr, newSta { sh := (*reflect.SliceHeader)(unsafe.Pointer(&prevStackAligned)) sh.Data = c.stackTop - relSp - setSliceLimits(sh, relSp, relSp) + sh.Len = int(relSp) + sh.Cap = int(relSp) } newTop = alignedStackTop(newStack) { @@ -564,7 +565,8 @@ func (c *callEngine) cloneStack(l uintptr) (newSP, newFP, newTop uintptr, newSta newFP = newTop - relFp sh := (*reflect.SliceHeader)(unsafe.Pointer(&newStackAligned)) sh.Data = newSP - setSliceLimits(sh, relSp, relSp) + sh.Len = int(relSp) + sh.Cap = int(relSp) } copy(newStackAligned, prevStackAligned) return diff --git a/internal/engine/wazevo/engine_test.go b/internal/engine/wazevo/engine_test.go index f2eb93cb9d..294be6a255 100644 --- a/internal/engine/wazevo/engine_test.go +++ b/internal/engine/wazevo/engine_test.go @@ -189,7 +189,6 @@ func TestCompiledModule_functionIndexOf(t *testing.T) { const executableAddr = 0xaaaa var executable []byte { - // TODO: use unsafe.Slice after floor version is set to Go 1.20. hdr := (*reflect.SliceHeader)(unsafe.Pointer(&executable)) hdr.Data = executableAddr hdr.Len = 0xffff diff --git a/internal/engine/wazevo/hostmodule.go b/internal/engine/wazevo/hostmodule.go index 8da7347a9f..c01b4fe148 100644 --- a/internal/engine/wazevo/hostmodule.go +++ b/internal/engine/wazevo/hostmodule.go @@ -53,7 +53,8 @@ func hostModuleListenersSliceFromOpaque(opaqueBegin uintptr) []experimental.Func var ret []experimental.FunctionListener sh = (*reflect.SliceHeader)(unsafe.Pointer(&ret)) sh.Data = uintptr(b) - setSliceLimits(sh, uintptr(l), uintptr(c)) + sh.Len = int(l) + sh.Cap = int(c) return ret } diff --git a/internal/engine/wazevo/reflect.go b/internal/engine/wazevo/reflect.go deleted file mode 100644 index 6a03fc65c7..0000000000 --- a/internal/engine/wazevo/reflect.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build !tinygo - -package wazevo - -import "reflect" - -// setSliceLimits sets both Cap and Len for the given reflected slice. -func setSliceLimits(s *reflect.SliceHeader, l, c uintptr) { - s.Len = int(l) - s.Cap = int(c) -} diff --git a/internal/engine/wazevo/reflect_tinygo.go b/internal/engine/wazevo/reflect_tinygo.go deleted file mode 100644 index eda3e706ac..0000000000 --- a/internal/engine/wazevo/reflect_tinygo.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build tinygo - -package wazevo - -import "reflect" - -// setSliceLimits sets both Cap and Len for the given reflected slice. -func setSliceLimits(s *reflect.SliceHeader, l, c uintptr) { - s.Len = l - s.Cap = c -} diff --git a/internal/integration_test/fuzz/wazerolib/extern.go b/internal/integration_test/fuzz/wazerolib/extern.go index cd57b641a6..093e54b043 100644 --- a/internal/integration_test/fuzz/wazerolib/extern.go +++ b/internal/integration_test/fuzz/wazerolib/extern.go @@ -22,7 +22,6 @@ func main() {} // //export require_no_diff func require_no_diff(binaryPtr uintptr, binarySize int, checkMemory bool, checkLogging bool) { - // TODO: use unsafe.Slice after flooring Go 1.20. var wasmBin []byte wasmHdr := (*reflect.SliceHeader)(unsafe.Pointer(&wasmBin)) wasmHdr.Data = binaryPtr @@ -51,7 +50,6 @@ func require_no_diff(binaryPtr uintptr, binarySize int, checkMemory bool, checkL // //export validate func validate(binaryPtr uintptr, binarySize int) { - // TODO: use unsafe.Slice after flooring Go 1.20. var wasmBin []byte wasmHdr := (*reflect.SliceHeader)(unsafe.Pointer(&wasmBin)) wasmHdr.Data = binaryPtr From c9d9c79fc4c51fe97a484a6e35d977022419483a Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 18 Jun 2024 10:24:46 +0100 Subject: [PATCH 2/3] Update CI. Signed-off-by: Nuno Cruces --- .github/workflows/commit.yaml | 2 +- .github/workflows/examples.yaml | 2 +- .github/workflows/integration.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/commit.yaml b/.github/workflows/commit.yaml index c9374961fd..ec8918c634 100644 --- a/.github/workflows/commit.yaml +++ b/.github/workflows/commit.yaml @@ -163,7 +163,7 @@ jobs: go-version: "1.22" - uses: acifani/setup-tinygo@v2 with: - tinygo-version: "0.31.2" + tinygo-version: "0.32.0" - run: tinygo build ./cmd/wazero - run: tinygo build -size short -target pico -stack-size=8kb ./cmd/wazero diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index 218f3ec96c..e3c987c430 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -17,7 +17,7 @@ on: env: EMSDK_VERSION: "3.1.40" - TINYGO_VERSION: "0.31.0" + TINYGO_VERSION: "0.32.0" ZIG_VERSION: "0.11.0" concurrency: diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml index 6bd35e5131..395e2d94d5 100644 --- a/.github/workflows/integration.yaml +++ b/.github/workflows/integration.yaml @@ -19,7 +19,7 @@ defaults: env: # Update this prior to requiring a higher minor version in go.mod GO_VERSION: "1.22" - TINYGO_VERSION: "0.31.0" + TINYGO_VERSION: "0.32.0" ZIG_VERSION: "0.11.0" BINARYEN_VERSION: "116" STDLIB_TESTS: "internal/integration_test/stdlibs" From 777f35bd9dc54b2883dffdbac1b5335ca4ef778c Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Tue, 18 Jun 2024 12:27:15 +0100 Subject: [PATCH 3/3] CI fix. Signed-off-by: Nuno Cruces --- .github/workflows/examples.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/examples.yaml b/.github/workflows/examples.yaml index e3c987c430..40f02f7702 100644 --- a/.github/workflows/examples.yaml +++ b/.github/workflows/examples.yaml @@ -84,6 +84,7 @@ jobs: - name: Build TinyGo examples run: make build.examples.tinygo + if: matrix.go-version != '1.20' # fails with TinyGo v0.32.0 - name: Build AssemblyScript examples run: make build.examples.as @@ -105,6 +106,7 @@ jobs: - name: Build bench cases run: make build.bench + if: matrix.go-version != '1.20' # fails with TinyGo v0.32.0 - name: Run example tests run: make test.examples