aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmd/internal/obj/wasm/wasmobj.go16
-rw-r--r--src/syscall/js/js_test.go5
2 files changed, 16 insertions, 5 deletions
diff --git a/src/cmd/internal/obj/wasm/wasmobj.go b/src/cmd/internal/obj/wasm/wasmobj.go
index 28ecd20cd0..48eee4e3ea 100644
--- a/src/cmd/internal/obj/wasm/wasmobj.go
+++ b/src/cmd/internal/obj/wasm/wasmobj.go
@@ -974,6 +974,10 @@ func genWasmExportWrapper(s *obj.LSym, appendp func(p *obj.Prog, as obj.As, args
Sym: s, // PC_F
Offset: 1, // PC_B=1, past the prologue, so we have the right SP delta
}
+ if framesize == 0 {
+ // Frameless function, no prologue.
+ retAddr.Offset = 0
+ }
p = appendp(p, AI64Const, retAddr)
p = appendp(p, AI64Store, constAddr(0))
// Set PC_B parameter to function entry
@@ -1014,11 +1018,13 @@ func genWasmExportWrapper(s *obj.LSym, appendp func(p *obj.Prog, as obj.As, args
}
// Epilogue. Cannot use ARET as we don't follow Go calling convention.
- // SP += framesize
- p = appendp(p, AGet, regAddr(REG_SP))
- p = appendp(p, AI32Const, constAddr(framesize))
- p = appendp(p, AI32Add)
- p = appendp(p, ASet, regAddr(REG_SP))
+ if framesize > 0 {
+ // SP += framesize
+ p = appendp(p, AGet, regAddr(REG_SP))
+ p = appendp(p, AI32Const, constAddr(framesize))
+ p = appendp(p, AI32Add)
+ p = appendp(p, ASet, regAddr(REG_SP))
+ }
p = appendp(p, AReturn)
}
diff --git a/src/syscall/js/js_test.go b/src/syscall/js/js_test.go
index 76fa442442..9ab913f2ab 100644
--- a/src/syscall/js/js_test.go
+++ b/src/syscall/js/js_test.go
@@ -75,6 +75,11 @@ func testExport(a int32, b int64) int64 {
return <-ch + <-ch
}
+//go:wasmexport testExport0
+func testExport0() { // no arg or result (see issue 69584)
+ runtime.GC()
+}
+
var testExportCalled bool
func growStack(n int64) {