From: Cherry Mui Date: Sat, 9 Nov 2024 04:10:41 +0000 (-0500) Subject: runtime, syscall: use pointer types on wasmimport functions X-Git-Tag: go1.24rc1~436 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=73ac82f99046a8b0b0b76f767f4b2e25ef6989ca;p=gostls13.git 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 LUCI-TryBot-Result: Go LUCI Reviewed-by: David Chase --- diff --git a/src/go/build/deps_test.go b/src/go/build/deps_test.go index c71d82f178..44f98aafb2 100644 --- a/src/go/build/deps_test.go +++ b/src/go/build/deps_test.go @@ -61,6 +61,7 @@ var depsRules = ` internal/trace/traceviewer/format, log/internal, math/bits, + structs, unicode, unicode/utf8, unicode/utf16; @@ -78,7 +79,8 @@ var depsRules = ` internal/goexperiment, internal/goos, internal/profilerecord, - math/bits + math/bits, + structs < internal/bytealg < internal/stringslite < internal/itoa diff --git a/src/internal/syscall/unix/at_wasip1.go b/src/internal/syscall/unix/at_wasip1.go index 888b156741..45ae22afcc 100644 --- a/src/internal/syscall/unix/at_wasip1.go +++ b/src/internal/syscall/unix/at_wasip1.go @@ -27,11 +27,11 @@ func Readlinkat(dirfd int, path string, buf []byte) (int, error) { var nwritten size errno := path_readlink( int32(dirfd), - unsafe.Pointer(unsafe.StringData(path)), + unsafe.StringData(path), size(len(path)), - unsafe.Pointer(&buf[0]), + &buf[0], size(len(buf)), - unsafe.Pointer(&nwritten)) + &nwritten) return int(nwritten), errnoErr(errno) } @@ -42,7 +42,7 @@ type ( //go:wasmimport wasi_snapshot_preview1 path_readlink //go:noescape -func path_readlink(fd int32, path unsafe.Pointer, pathLen size, buf unsafe.Pointer, bufLen size, nwritten unsafe.Pointer) syscall.Errno +func path_readlink(fd int32, path *byte, pathLen size, buf *byte, bufLen size, nwritten *size) syscall.Errno func Mkdirat(dirfd int, path string, mode uint32) error { if path == "" { @@ -50,14 +50,14 @@ func Mkdirat(dirfd int, path string, mode uint32) error { } return errnoErr(path_create_directory( int32(dirfd), - unsafe.Pointer(unsafe.StringData(path)), + unsafe.StringData(path), size(len(path)), )) } //go:wasmimport wasi_snapshot_preview1 path_create_directory //go:noescape -func path_create_directory(fd int32, path unsafe.Pointer, pathLen size) syscall.Errno +func path_create_directory(fd int32, path *byte, pathLen size) syscall.Errno func errnoErr(errno syscall.Errno) error { if errno == 0 { 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) diff --git a/src/syscall/fs_wasip1.go b/src/syscall/fs_wasip1.go index da36d8f5b8..0eff07e95a 100644 --- a/src/syscall/fs_wasip1.go +++ b/src/syscall/fs_wasip1.go @@ -9,6 +9,7 @@ package syscall import ( "internal/stringslite" "runtime" + "structs" "unsafe" ) @@ -40,6 +41,7 @@ type filedelta = int64 type fstflags = uint32 type iovec struct { + _ structs.HostLayout buf uintptr32 bufLen size } @@ -190,23 +192,23 @@ func fd_filestat_set_size(fd int32, set_size filesize) Errno // //go:wasmimport wasi_snapshot_preview1 fd_pread //go:noescape -func fd_pread(fd int32, iovs unsafe.Pointer, iovsLen size, offset filesize, nread unsafe.Pointer) Errno +func fd_pread(fd int32, iovs *iovec, iovsLen size, offset filesize, nread *size) Errno //go:wasmimport wasi_snapshot_preview1 fd_pwrite //go:noescape -func fd_pwrite(fd int32, iovs unsafe.Pointer, iovsLen size, offset filesize, nwritten unsafe.Pointer) Errno +func fd_pwrite(fd int32, iovs *iovec, iovsLen size, offset filesize, nwritten *size) Errno //go:wasmimport wasi_snapshot_preview1 fd_read //go:noescape -func fd_read(fd int32, iovs unsafe.Pointer, iovsLen size, nread unsafe.Pointer) Errno +func fd_read(fd int32, iovs *iovec, iovsLen size, nread *size) Errno //go:wasmimport wasi_snapshot_preview1 fd_readdir //go:noescape -func fd_readdir(fd int32, buf unsafe.Pointer, bufLen size, cookie dircookie, nwritten unsafe.Pointer) Errno +func fd_readdir(fd int32, buf *byte, bufLen size, cookie dircookie, nwritten *size) Errno //go:wasmimport wasi_snapshot_preview1 fd_seek //go:noescape -func fd_seek(fd int32, offset filedelta, whence uint32, newoffset unsafe.Pointer) Errno +func fd_seek(fd int32, offset filedelta, whence uint32, newoffset *filesize) Errno // https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-fd_fdstat_set_rightsfd-fd-fs_rights_base-rights-fs_rights_inheriting-rights---result-errno // @@ -220,7 +222,7 @@ func fd_filestat_get(fd int32, buf unsafe.Pointer) 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 *iovec, iovsLen size, nwritten *size) Errno //go:wasmimport wasi_snapshot_preview1 fd_sync //go:noescape @@ -228,52 +230,53 @@ func fd_sync(fd int32) Errno //go:wasmimport wasi_snapshot_preview1 path_create_directory //go:noescape -func path_create_directory(fd int32, path unsafe.Pointer, pathLen size) Errno +func path_create_directory(fd int32, path *byte, pathLen size) Errno //go:wasmimport wasi_snapshot_preview1 path_filestat_get //go:noescape -func path_filestat_get(fd int32, flags lookupflags, path unsafe.Pointer, pathLen size, buf unsafe.Pointer) Errno +func path_filestat_get(fd int32, flags lookupflags, path *byte, pathLen size, buf unsafe.Pointer) Errno //go:wasmimport wasi_snapshot_preview1 path_filestat_set_times //go:noescape -func path_filestat_set_times(fd int32, flags lookupflags, path unsafe.Pointer, pathLen size, atim timestamp, mtim timestamp, fstflags fstflags) Errno +func path_filestat_set_times(fd int32, flags lookupflags, path *byte, pathLen size, atim timestamp, mtim timestamp, fstflags fstflags) Errno //go:wasmimport wasi_snapshot_preview1 path_link //go:noescape -func path_link(oldFd int32, oldFlags lookupflags, oldPath unsafe.Pointer, oldPathLen size, newFd int32, newPath unsafe.Pointer, newPathLen size) Errno +func path_link(oldFd int32, oldFlags lookupflags, oldPath *byte, oldPathLen size, newFd int32, newPath *byte, newPathLen size) Errno //go:wasmimport wasi_snapshot_preview1 path_readlink //go:noescape -func path_readlink(fd int32, path unsafe.Pointer, pathLen size, buf unsafe.Pointer, bufLen size, nwritten unsafe.Pointer) Errno +func path_readlink(fd int32, path *byte, pathLen size, buf *byte, bufLen size, nwritten *size) Errno //go:wasmimport wasi_snapshot_preview1 path_remove_directory //go:noescape -func path_remove_directory(fd int32, path unsafe.Pointer, pathLen size) Errno +func path_remove_directory(fd int32, path *byte, pathLen size) Errno //go:wasmimport wasi_snapshot_preview1 path_rename //go:noescape -func path_rename(oldFd int32, oldPath unsafe.Pointer, oldPathLen size, newFd int32, newPath unsafe.Pointer, newPathLen size) Errno +func path_rename(oldFd int32, oldPath *byte, oldPathLen size, newFd int32, newPath *byte, newPathLen size) Errno //go:wasmimport wasi_snapshot_preview1 path_symlink //go:noescape -func path_symlink(oldPath unsafe.Pointer, oldPathLen size, fd int32, newPath unsafe.Pointer, newPathLen size) Errno +func path_symlink(oldPath *byte, oldPathLen size, fd int32, newPath *byte, newPathLen size) Errno //go:wasmimport wasi_snapshot_preview1 path_unlink_file //go:noescape -func path_unlink_file(fd int32, path unsafe.Pointer, pathLen size) Errno +func path_unlink_file(fd int32, path *byte, pathLen size) Errno //go:wasmimport wasi_snapshot_preview1 path_open //go:noescape -func path_open(rootFD int32, dirflags lookupflags, path unsafe.Pointer, pathLen size, oflags oflags, fsRightsBase rights, fsRightsInheriting rights, fsFlags fdflags, fd unsafe.Pointer) Errno +func path_open(rootFD int32, dirflags lookupflags, path *byte, pathLen size, oflags oflags, fsRightsBase rights, fsRightsInheriting rights, fsFlags fdflags, fd *int32) 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 // https://github.com/WebAssembly/WASI/blob/a2b96e81c0586125cc4dc79a5be0b78d9a059925/legacy/preview1/docs.md#-fdstat-record // fdflags must be at offset 2, hence the uint16 type rather than the // fdflags (uint32) type. type fdstat struct { + _ structs.HostLayout filetype filetype fdflags uint16 rightsBase rights @@ -282,7 +285,7 @@ type fdstat struct { //go:wasmimport wasi_snapshot_preview1 fd_fdstat_get //go:noescape -func fd_fdstat_get(fd int32, buf unsafe.Pointer) Errno +func fd_fdstat_get(fd int32, buf *fdstat) Errno //go:wasmimport wasi_snapshot_preview1 fd_fdstat_set_flags //go:noescape @@ -293,7 +296,7 @@ func fd_fdstat_set_flags(fd int32, flags fdflags) Errno func fd_fdstat_get_flags(fd int) (uint32, error) { var stat fdstat - errno := fd_fdstat_get(int32(fd), unsafe.Pointer(&stat)) + errno := fd_fdstat_get(int32(fd), &stat) return uint32(stat.fdflags), errnoErr(errno) } @@ -302,7 +305,7 @@ func fd_fdstat_get_flags(fd int) (uint32, error) { func fd_fdstat_get_type(fd int) (uint8, error) { var stat fdstat - errno := fd_fdstat_get(int32(fd), unsafe.Pointer(&stat)) + errno := fd_fdstat_get(int32(fd), &stat) return stat.filetype, errnoErr(errno) } @@ -313,21 +316,23 @@ const ( ) type prestatDir struct { + _ structs.HostLayout prNameLen size } type prestat struct { + _ structs.HostLayout typ preopentype dir prestatDir } //go:wasmimport wasi_snapshot_preview1 fd_prestat_get //go:noescape -func fd_prestat_get(fd int32, prestat unsafe.Pointer) Errno +func fd_prestat_get(fd int32, prestat *prestat) Errno //go:wasmimport wasi_snapshot_preview1 fd_prestat_dir_name //go:noescape -func fd_prestat_dir_name(fd int32, path unsafe.Pointer, pathLen size) Errno +func fd_prestat_dir_name(fd int32, path *byte, pathLen size) Errno type opendir struct { fd int32 @@ -354,7 +359,7 @@ func init() { for preopenFd := int32(3); ; preopenFd++ { var prestat prestat - errno := fd_prestat_get(preopenFd, unsafe.Pointer(&prestat)) + errno := fd_prestat_get(preopenFd, &prestat) if errno == EBADF { break } @@ -368,7 +373,7 @@ func init() { dirNameBuf = make([]byte, prestat.dir.prNameLen) } - errno = fd_prestat_dir_name(preopenFd, unsafe.Pointer(&dirNameBuf[0]), prestat.dir.prNameLen) + errno = fd_prestat_dir_name(preopenFd, &dirNameBuf[0], prestat.dir.prNameLen) if errno != 0 { panic("fd_prestat_dir_name: " + errno.Error()) } @@ -488,7 +493,7 @@ func isDir(path string) bool { // // If the path argument is not absolute, it is first appended to the current // working directory before resolution. -func preparePath(path string) (int32, unsafe.Pointer, size) { +func preparePath(path string) (int32, *byte, size) { var dirFd = int32(-1) var dirName string @@ -512,7 +517,7 @@ func preparePath(path string) (int32, unsafe.Pointer, size) { path = "." } - return dirFd, stringPointer(path), size(len(path)) + return dirFd, unsafe.StringData(path), size(len(path)) } func Open(path string, openmode int, perm uint32) (int, error) { @@ -524,10 +529,10 @@ func Open(path string, openmode int, perm uint32) (int, error) { } func Openat(dirFd int, path string, openmode int, perm uint32) (int, error) { - return openat(int32(dirFd), stringPointer(path), size(len(path)), openmode, perm) + return openat(int32(dirFd), unsafe.StringData(path), size(len(path)), openmode, perm) } -func openat(dirFd int32, pathPtr unsafe.Pointer, pathLen size, openmode int, perm uint32) (int, error) { +func openat(dirFd int32, pathPtr *byte, pathLen size, openmode int, perm uint32) (int, error) { var oflags oflags if (openmode & O_CREATE) != 0 { oflags |= OFLAG_CREATE @@ -580,7 +585,7 @@ func openat(dirFd int32, pathPtr unsafe.Pointer, pathLen size, openmode int, per rights, fileRights, fdflags, - unsafe.Pointer(&fd), + &fd, ) if errno == EISDIR && oflags == 0 && fdflags == 0 && ((rights & writeRights) == 0) { // wasmtime and wasmedge will error if attempting to open a directory @@ -601,7 +606,7 @@ func openat(dirFd int32, pathPtr unsafe.Pointer, pathLen size, openmode int, per rights&dirRights, fileRights, fdflags, - unsafe.Pointer(&fd), + &fd, ) } return int(fd), errnoErr(errno) @@ -627,7 +632,7 @@ func Mkdir(path string, perm uint32) error { func ReadDir(fd int, buf []byte, cookie dircookie) (int, error) { var nwritten size - errno := fd_readdir(int32(fd), unsafe.Pointer(&buf[0]), size(len(buf)), cookie, unsafe.Pointer(&nwritten)) + errno := fd_readdir(int32(fd), &buf[0], size(len(buf)), cookie, &nwritten) return int(nwritten), errnoErr(errno) } @@ -835,9 +840,9 @@ func Readlink(path string, buf []byte) (n int, err error) { dirFd, pathPtr, pathLen, - unsafe.Pointer(&buf[0]), + &buf[0], size(len(buf)), - unsafe.Pointer(&nwritten), + &nwritten, ) // For some reason wasmtime returns ERANGE when the output buffer is // shorter than the symbolic link value. os.Readlink expects a nil @@ -871,7 +876,7 @@ func Symlink(path, link string) error { } dirFd, pathPtr, pathlen := preparePath(link) errno := path_symlink( - stringPointer(path), + unsafe.StringData(path), size(len(path)), dirFd, pathPtr, @@ -885,52 +890,44 @@ func Fsync(fd int) error { return errnoErr(errno) } -func bytesPointer(b []byte) unsafe.Pointer { - return unsafe.Pointer(unsafe.SliceData(b)) -} - -func stringPointer(s string) unsafe.Pointer { - return unsafe.Pointer(unsafe.StringData(s)) -} - -func makeIOVec(b []byte) unsafe.Pointer { - return unsafe.Pointer(&iovec{ - buf: uintptr32(uintptr(bytesPointer(b))), +func makeIOVec(b []byte) *iovec { + return &iovec{ + buf: uintptr32(uintptr(unsafe.Pointer(unsafe.SliceData(b)))), bufLen: size(len(b)), - }) + } } func Read(fd int, b []byte) (int, error) { var nread size - errno := fd_read(int32(fd), makeIOVec(b), 1, unsafe.Pointer(&nread)) + errno := fd_read(int32(fd), makeIOVec(b), 1, &nread) runtime.KeepAlive(b) return int(nread), errnoErr(errno) } func Write(fd int, b []byte) (int, error) { var nwritten size - errno := fd_write(int32(fd), makeIOVec(b), 1, unsafe.Pointer(&nwritten)) + errno := fd_write(int32(fd), makeIOVec(b), 1, &nwritten) runtime.KeepAlive(b) return int(nwritten), errnoErr(errno) } func Pread(fd int, b []byte, offset int64) (int, error) { var nread size - errno := fd_pread(int32(fd), makeIOVec(b), 1, filesize(offset), unsafe.Pointer(&nread)) + errno := fd_pread(int32(fd), makeIOVec(b), 1, filesize(offset), &nread) runtime.KeepAlive(b) return int(nread), errnoErr(errno) } func Pwrite(fd int, b []byte, offset int64) (int, error) { var nwritten size - errno := fd_pwrite(int32(fd), makeIOVec(b), 1, filesize(offset), unsafe.Pointer(&nwritten)) + errno := fd_pwrite(int32(fd), makeIOVec(b), 1, filesize(offset), &nwritten) runtime.KeepAlive(b) return int(nwritten), errnoErr(errno) } func Seek(fd int, offset int64, whence int) (int64, error) { var newoffset filesize - errno := fd_seek(int32(fd), filedelta(offset), uint32(whence), unsafe.Pointer(&newoffset)) + errno := fd_seek(int32(fd), filedelta(offset), uint32(whence), &newoffset) return int64(newoffset), errnoErr(errno) } @@ -947,6 +944,6 @@ func Pipe(fd []int) error { } func RandomGet(b []byte) error { - errno := random_get(bytesPointer(b), size(len(b))) + errno := random_get(unsafe.SliceData(b), size(len(b))) return errnoErr(errno) } diff --git a/src/syscall/net_wasip1.go b/src/syscall/net_wasip1.go index 3918840a7e..fefd939a0a 100644 --- a/src/syscall/net_wasip1.go +++ b/src/syscall/net_wasip1.go @@ -6,8 +6,6 @@ package syscall -import "unsafe" - const ( SHUT_RD = 0x1 SHUT_WR = 0x2 @@ -18,7 +16,7 @@ type sdflags = uint32 //go:wasmimport wasi_snapshot_preview1 sock_accept //go:noescape -func sock_accept(fd int32, flags fdflags, newfd unsafe.Pointer) Errno +func sock_accept(fd int32, flags fdflags, newfd *int32) Errno //go:wasmimport wasi_snapshot_preview1 sock_shutdown //go:noescape @@ -42,7 +40,7 @@ func Listen(fd int, backlog int) error { func Accept(fd int) (int, Sockaddr, error) { var newfd int32 - errno := sock_accept(int32(fd), 0, unsafe.Pointer(&newfd)) + errno := sock_accept(int32(fd), 0, &newfd) return int(newfd), nil, errnoErr(errno) } diff --git a/src/syscall/syscall_wasip1.go b/src/syscall/syscall_wasip1.go index a125777933..c9225293a0 100644 --- a/src/syscall/syscall_wasip1.go +++ b/src/syscall/syscall_wasip1.go @@ -383,7 +383,7 @@ func Getppid() int { func Gettimeofday(tv *Timeval) error { var time timestamp - if errno := clock_time_get(clockRealtime, 1e3, unsafe.Pointer(&time)); errno != 0 { + if errno := clock_time_get(clockRealtime, 1e3, &time); errno != 0 { return errno } tv.setTimestamp(time) @@ -465,7 +465,7 @@ const ( //go:wasmimport wasi_snapshot_preview1 clock_time_get //go:noescape -func clock_time_get(id clockid, precision timestamp, time unsafe.Pointer) Errno +func clock_time_get(id clockid, precision timestamp, time *timestamp) Errno func SetNonblock(fd int, nonblocking bool) error { flags, err := fd_fdstat_get_flags(fd)