aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorCherry Mui <cherryyz@google.com>2024-11-08 23:10:41 -0500
committerCherry Mui <cherryyz@google.com>2024-11-11 21:33:33 +0000
commit73ac82f99046a8b0b0b76f767f4b2e25ef6989ca (patch)
treebce1fc5989a44700f8c34e263f208adcd766b727 /src/runtime
parent6051da46d01e967b55d088530fcbe84e8deb0e7a (diff)
downloadgo-73ac82f99046a8b0b0b76f767f4b2e25ef6989ca.tar.xz
runtime, syscall: use pointer types on wasmimport functions
Now that we support pointer types on wasmimport functions, use them, instead of unsafe.Pointer. This removes unsafe conversions. There is still one unsafe.Pointer argument left. It is actually a *Stat_t, which is an exported type with an int field, which is not allowed as a wasmimport field type. We probably cannot change it at this point. Updates #66984. Change-Id: I445c70b356c3877a5604bee67d19d99a538c682e Reviewed-on: https://go-review.googlesource.com/c/go/+/627059 Reviewed-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/netpoll_wasip1.go2
-rw-r--r--src/runtime/os_wasip1.go44
2 files changed, 27 insertions, 19 deletions
diff --git a/src/runtime/netpoll_wasip1.go b/src/runtime/netpoll_wasip1.go
index e6b299a20f..c7e66a64dd 100644
--- a/src/runtime/netpoll_wasip1.go
+++ b/src/runtime/netpoll_wasip1.go
@@ -209,7 +209,7 @@ func netpoll(delay int64) (gList, int32) {
retry:
var nevents size
- errno := poll_oneoff(unsafe.Pointer(&pollsubs[0]), unsafe.Pointer(&evts[0]), uint32(len(pollsubs)), unsafe.Pointer(&nevents))
+ errno := poll_oneoff(&pollsubs[0], &evts[0], uint32(len(pollsubs)), &nevents)
if errno != 0 {
if errno != _EINTR {
println("errno=", errno, " len(pollsubs)=", len(pollsubs))
diff --git a/src/runtime/os_wasip1.go b/src/runtime/os_wasip1.go
index acac2b3f7a..ed4f646a62 100644
--- a/src/runtime/os_wasip1.go
+++ b/src/runtime/os_wasip1.go
@@ -6,7 +6,10 @@
package runtime
-import "unsafe"
+import (
+ "structs"
+ "unsafe"
+)
// GOARCH=wasm currently has 64 bits pointers, but the WebAssembly host expects
// pointers to be 32 bits so we use this type alias to represent pointers in
@@ -48,31 +51,31 @@ func exit(code int32)
//go:wasmimport wasi_snapshot_preview1 args_get
//go:noescape
-func args_get(argv, argvBuf unsafe.Pointer) errno
+func args_get(argv *uintptr32, argvBuf *byte) errno
//go:wasmimport wasi_snapshot_preview1 args_sizes_get
//go:noescape
-func args_sizes_get(argc, argvBufLen unsafe.Pointer) errno
+func args_sizes_get(argc, argvBufLen *size) errno
//go:wasmimport wasi_snapshot_preview1 clock_time_get
//go:noescape
-func clock_time_get(clock_id clockid, precision timestamp, time unsafe.Pointer) errno
+func clock_time_get(clock_id clockid, precision timestamp, time *timestamp) errno
//go:wasmimport wasi_snapshot_preview1 environ_get
//go:noescape
-func environ_get(environ, environBuf unsafe.Pointer) errno
+func environ_get(environ *uintptr32, environBuf *byte) errno
//go:wasmimport wasi_snapshot_preview1 environ_sizes_get
//go:noescape
-func environ_sizes_get(environCount, environBufLen unsafe.Pointer) errno
+func environ_sizes_get(environCount, environBufLen *size) errno
//go:wasmimport wasi_snapshot_preview1 fd_write
//go:noescape
-func fd_write(fd int32, iovs unsafe.Pointer, iovsLen size, nwritten unsafe.Pointer) errno
+func fd_write(fd int32, iovs unsafe.Pointer, iovsLen size, nwritten *size) errno
//go:wasmimport wasi_snapshot_preview1 random_get
//go:noescape
-func random_get(buf unsafe.Pointer, bufLen size) errno
+func random_get(buf *byte, bufLen size) errno
type eventtype = uint8
@@ -99,6 +102,7 @@ type userdata = uint64
// struct size because errno is declared as a 32 bits type, so we declare the
// error field as a plain uint16.
type event struct {
+ _ structs.HostLayout
userdata userdata
error uint16
typ eventtype
@@ -106,6 +110,7 @@ type event struct {
}
type eventFdReadwrite struct {
+ _ structs.HostLayout
nbytes filesize
flags eventrwflags
}
@@ -117,6 +122,7 @@ const (
)
type subscriptionClock struct {
+ _ structs.HostLayout
id clockid
timeout timestamp
precision timestamp
@@ -124,10 +130,12 @@ type subscriptionClock struct {
}
type subscriptionFdReadwrite struct {
+ _ structs.HostLayout
fd int32
}
type subscription struct {
+ _ structs.HostLayout
userdata userdata
u subscriptionUnion
}
@@ -148,7 +156,7 @@ func (u *subscriptionUnion) subscriptionFdReadwrite() *subscriptionFdReadwrite {
//go:wasmimport wasi_snapshot_preview1 poll_oneoff
//go:noescape
-func poll_oneoff(in, out unsafe.Pointer, nsubscriptions size, nevents unsafe.Pointer) errno
+func poll_oneoff(in *subscription, out *event, nsubscriptions size, nevents *size) errno
func write1(fd uintptr, p unsafe.Pointer, n int32) int32 {
iov := iovec{
@@ -156,7 +164,7 @@ func write1(fd uintptr, p unsafe.Pointer, n int32) int32 {
bufLen: size(n),
}
var nwritten size
- if fd_write(int32(fd), unsafe.Pointer(&iov), 1, unsafe.Pointer(&nwritten)) != 0 {
+ if fd_write(int32(fd), unsafe.Pointer(&iov), 1, &nwritten) != 0 {
throw("fd_write failed")
}
return int32(nwritten)
@@ -175,13 +183,13 @@ func usleep(usec uint32) {
subscription.timeout = timestamp(usec) * 1e3
subscription.precision = 1e3
- if poll_oneoff(unsafe.Pointer(&in), unsafe.Pointer(&out), 1, unsafe.Pointer(&nevents)) != 0 {
+ if poll_oneoff(&in, &out, 1, &nevents) != 0 {
throw("wasi_snapshot_preview1.poll_oneoff")
}
}
func readRandom(r []byte) int {
- if random_get(unsafe.Pointer(&r[0]), size(len(r))) != 0 {
+ if random_get(&r[0], size(len(r))) != 0 {
return 0
}
return len(r)
@@ -191,7 +199,7 @@ func goenvs() {
// arguments
var argc size
var argvBufLen size
- if args_sizes_get(unsafe.Pointer(&argc), unsafe.Pointer(&argvBufLen)) != 0 {
+ if args_sizes_get(&argc, &argvBufLen) != 0 {
throw("args_sizes_get failed")
}
@@ -199,7 +207,7 @@ func goenvs() {
if argc > 0 {
argv := make([]uintptr32, argc)
argvBuf := make([]byte, argvBufLen)
- if args_get(unsafe.Pointer(&argv[0]), unsafe.Pointer(&argvBuf[0])) != 0 {
+ if args_get(&argv[0], &argvBuf[0]) != 0 {
throw("args_get failed")
}
@@ -216,7 +224,7 @@ func goenvs() {
// environment
var environCount size
var environBufLen size
- if environ_sizes_get(unsafe.Pointer(&environCount), unsafe.Pointer(&environBufLen)) != 0 {
+ if environ_sizes_get(&environCount, &environBufLen) != 0 {
throw("environ_sizes_get failed")
}
@@ -224,7 +232,7 @@ func goenvs() {
if environCount > 0 {
environ := make([]uintptr32, environCount)
environBuf := make([]byte, environBufLen)
- if environ_get(unsafe.Pointer(&environ[0]), unsafe.Pointer(&environBuf[0])) != 0 {
+ if environ_get(&environ[0], &environBuf[0]) != 0 {
throw("environ_get failed")
}
@@ -245,7 +253,7 @@ func walltime() (sec int64, nsec int32) {
func walltime1() (sec int64, nsec int32) {
var time timestamp
- if clock_time_get(clockRealtime, 0, unsafe.Pointer(&time)) != 0 {
+ if clock_time_get(clockRealtime, 0, &time) != 0 {
throw("clock_time_get failed")
}
return int64(time / 1000000000), int32(time % 1000000000)
@@ -253,7 +261,7 @@ func walltime1() (sec int64, nsec int32) {
func nanotime1() int64 {
var time timestamp
- if clock_time_get(clockMonotonic, 0, unsafe.Pointer(&time)) != 0 {
+ if clock_time_get(clockMonotonic, 0, &time) != 0 {
throw("clock_time_get failed")
}
return int64(time)