]> Cypherpunks repositories - gostls13.git/commitdiff
runtime, syscall: use pointer types on wasmimport functions
authorCherry Mui <cherryyz@google.com>
Sat, 9 Nov 2024 04:10:41 +0000 (23:10 -0500)
committerCherry Mui <cherryyz@google.com>
Mon, 11 Nov 2024 21:33:33 +0000 (21:33 +0000)
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>
src/go/build/deps_test.go
src/internal/syscall/unix/at_wasip1.go
src/runtime/netpoll_wasip1.go
src/runtime/os_wasip1.go
src/syscall/fs_wasip1.go
src/syscall/net_wasip1.go
src/syscall/syscall_wasip1.go

index c71d82f1787acf86f278f59cf556461cea6707bb..44f98aafb24a9f50b185efb1b771c6a9750f2662 100644 (file)
@@ -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
index 888b156741171affe43854bad78e356595ad196b..45ae22afccd67e5b77fde1a99d3e866a3030cf84 100644 (file)
@@ -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 {
index e6b299a20fa8d4aabcd92b5da92b05534c6c284a..c7e66a64dddb18ff85b6bce68cfc1bec9d186a07 100644 (file)
@@ -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))
index acac2b3f7ad91250f5c9efae299907c29caf306f..ed4f646a62bf0f87c750e0041491e87ec4096e5e 100644 (file)
@@ -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)
index da36d8f5b84aa1804a5d2ecadd9fa0b86549f855..0eff07e95a18583d8c88a9416bd1f229f2d68b4a 100644 (file)
@@ -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)
 }
index 3918840a7e05e1a00624d642e816f76761b85a40..fefd939a0a973a53ce023c59433e55c4965e894a 100644 (file)
@@ -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)
 }
 
index a125777933310781f6c217bf181f8064ab7ca020..c9225293a0cc3107a7f2165413b08bbb066b7ef6 100644 (file)
@@ -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)