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>
This commit is contained in:
Cherry Mui 2024-11-08 23:10:41 -05:00
parent 6051da46d0
commit 73ac82f990
7 changed files with 89 additions and 84 deletions

View File

@ -61,6 +61,7 @@ var depsRules = `
internal/trace/traceviewer/format, internal/trace/traceviewer/format,
log/internal, log/internal,
math/bits, math/bits,
structs,
unicode, unicode,
unicode/utf8, unicode/utf8,
unicode/utf16; unicode/utf16;
@ -78,7 +79,8 @@ var depsRules = `
internal/goexperiment, internal/goexperiment,
internal/goos, internal/goos,
internal/profilerecord, internal/profilerecord,
math/bits math/bits,
structs
< internal/bytealg < internal/bytealg
< internal/stringslite < internal/stringslite
< internal/itoa < internal/itoa

View File

@ -27,11 +27,11 @@ func Readlinkat(dirfd int, path string, buf []byte) (int, error) {
var nwritten size var nwritten size
errno := path_readlink( errno := path_readlink(
int32(dirfd), int32(dirfd),
unsafe.Pointer(unsafe.StringData(path)), unsafe.StringData(path),
size(len(path)), size(len(path)),
unsafe.Pointer(&buf[0]), &buf[0],
size(len(buf)), size(len(buf)),
unsafe.Pointer(&nwritten)) &nwritten)
return int(nwritten), errnoErr(errno) return int(nwritten), errnoErr(errno)
} }
@ -42,7 +42,7 @@ type (
//go:wasmimport wasi_snapshot_preview1 path_readlink //go:wasmimport wasi_snapshot_preview1 path_readlink
//go:noescape //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 { func Mkdirat(dirfd int, path string, mode uint32) error {
if path == "" { if path == "" {
@ -50,14 +50,14 @@ func Mkdirat(dirfd int, path string, mode uint32) error {
} }
return errnoErr(path_create_directory( return errnoErr(path_create_directory(
int32(dirfd), int32(dirfd),
unsafe.Pointer(unsafe.StringData(path)), unsafe.StringData(path),
size(len(path)), size(len(path)),
)) ))
} }
//go:wasmimport wasi_snapshot_preview1 path_create_directory //go:wasmimport wasi_snapshot_preview1 path_create_directory
//go:noescape //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 { func errnoErr(errno syscall.Errno) error {
if errno == 0 { if errno == 0 {

View File

@ -209,7 +209,7 @@ func netpoll(delay int64) (gList, int32) {
retry: retry:
var nevents size 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 != 0 {
if errno != _EINTR { if errno != _EINTR {
println("errno=", errno, " len(pollsubs)=", len(pollsubs)) println("errno=", errno, " len(pollsubs)=", len(pollsubs))

View File

@ -6,7 +6,10 @@
package runtime package runtime
import "unsafe" import (
"structs"
"unsafe"
)
// GOARCH=wasm currently has 64 bits pointers, but the WebAssembly host expects // 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 // 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:wasmimport wasi_snapshot_preview1 args_get
//go:noescape //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:wasmimport wasi_snapshot_preview1 args_sizes_get
//go:noescape //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:wasmimport wasi_snapshot_preview1 clock_time_get
//go:noescape //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:wasmimport wasi_snapshot_preview1 environ_get
//go:noescape //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:wasmimport wasi_snapshot_preview1 environ_sizes_get
//go:noescape //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:wasmimport wasi_snapshot_preview1 fd_write
//go:noescape //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:wasmimport wasi_snapshot_preview1 random_get
//go:noescape //go:noescape
func random_get(buf unsafe.Pointer, bufLen size) errno func random_get(buf *byte, bufLen size) errno
type eventtype = uint8 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 // struct size because errno is declared as a 32 bits type, so we declare the
// error field as a plain uint16. // error field as a plain uint16.
type event struct { type event struct {
_ structs.HostLayout
userdata userdata userdata userdata
error uint16 error uint16
typ eventtype typ eventtype
@ -106,6 +110,7 @@ type event struct {
} }
type eventFdReadwrite struct { type eventFdReadwrite struct {
_ structs.HostLayout
nbytes filesize nbytes filesize
flags eventrwflags flags eventrwflags
} }
@ -117,6 +122,7 @@ const (
) )
type subscriptionClock struct { type subscriptionClock struct {
_ structs.HostLayout
id clockid id clockid
timeout timestamp timeout timestamp
precision timestamp precision timestamp
@ -124,10 +130,12 @@ type subscriptionClock struct {
} }
type subscriptionFdReadwrite struct { type subscriptionFdReadwrite struct {
_ structs.HostLayout
fd int32 fd int32
} }
type subscription struct { type subscription struct {
_ structs.HostLayout
userdata userdata userdata userdata
u subscriptionUnion u subscriptionUnion
} }
@ -148,7 +156,7 @@ func (u *subscriptionUnion) subscriptionFdReadwrite() *subscriptionFdReadwrite {
//go:wasmimport wasi_snapshot_preview1 poll_oneoff //go:wasmimport wasi_snapshot_preview1 poll_oneoff
//go:noescape //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 { func write1(fd uintptr, p unsafe.Pointer, n int32) int32 {
iov := iovec{ iov := iovec{
@ -156,7 +164,7 @@ func write1(fd uintptr, p unsafe.Pointer, n int32) int32 {
bufLen: size(n), bufLen: size(n),
} }
var nwritten size 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") throw("fd_write failed")
} }
return int32(nwritten) return int32(nwritten)
@ -175,13 +183,13 @@ func usleep(usec uint32) {
subscription.timeout = timestamp(usec) * 1e3 subscription.timeout = timestamp(usec) * 1e3
subscription.precision = 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") throw("wasi_snapshot_preview1.poll_oneoff")
} }
} }
func readRandom(r []byte) int { 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 0
} }
return len(r) return len(r)
@ -191,7 +199,7 @@ func goenvs() {
// arguments // arguments
var argc size var argc size
var argvBufLen 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") throw("args_sizes_get failed")
} }
@ -199,7 +207,7 @@ func goenvs() {
if argc > 0 { if argc > 0 {
argv := make([]uintptr32, argc) argv := make([]uintptr32, argc)
argvBuf := make([]byte, argvBufLen) 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") throw("args_get failed")
} }
@ -216,7 +224,7 @@ func goenvs() {
// environment // environment
var environCount size var environCount size
var environBufLen 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") throw("environ_sizes_get failed")
} }
@ -224,7 +232,7 @@ func goenvs() {
if environCount > 0 { if environCount > 0 {
environ := make([]uintptr32, environCount) environ := make([]uintptr32, environCount)
environBuf := make([]byte, environBufLen) 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") throw("environ_get failed")
} }
@ -245,7 +253,7 @@ func walltime() (sec int64, nsec int32) {
func walltime1() (sec int64, nsec int32) { func walltime1() (sec int64, nsec int32) {
var time timestamp 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") throw("clock_time_get failed")
} }
return int64(time / 1000000000), int32(time % 1000000000) return int64(time / 1000000000), int32(time % 1000000000)
@ -253,7 +261,7 @@ func walltime1() (sec int64, nsec int32) {
func nanotime1() int64 { func nanotime1() int64 {
var time timestamp 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") throw("clock_time_get failed")
} }
return int64(time) return int64(time)

View File

@ -9,6 +9,7 @@ package syscall
import ( import (
"internal/stringslite" "internal/stringslite"
"runtime" "runtime"
"structs"
"unsafe" "unsafe"
) )
@ -40,6 +41,7 @@ type filedelta = int64
type fstflags = uint32 type fstflags = uint32
type iovec struct { type iovec struct {
_ structs.HostLayout
buf uintptr32 buf uintptr32
bufLen size 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:wasmimport wasi_snapshot_preview1 fd_pread
//go:noescape //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:wasmimport wasi_snapshot_preview1 fd_pwrite
//go:noescape //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:wasmimport wasi_snapshot_preview1 fd_read
//go:noescape //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:wasmimport wasi_snapshot_preview1 fd_readdir
//go:noescape //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:wasmimport wasi_snapshot_preview1 fd_seek
//go:noescape //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 // 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:wasmimport wasi_snapshot_preview1 fd_write
//go:noescape //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:wasmimport wasi_snapshot_preview1 fd_sync
//go:noescape //go:noescape
@ -228,52 +230,53 @@ func fd_sync(fd int32) Errno
//go:wasmimport wasi_snapshot_preview1 path_create_directory //go:wasmimport wasi_snapshot_preview1 path_create_directory
//go:noescape //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:wasmimport wasi_snapshot_preview1 path_filestat_get
//go:noescape //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:wasmimport wasi_snapshot_preview1 path_filestat_set_times
//go:noescape //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:wasmimport wasi_snapshot_preview1 path_link
//go:noescape //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:wasmimport wasi_snapshot_preview1 path_readlink
//go:noescape //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:wasmimport wasi_snapshot_preview1 path_remove_directory
//go:noescape //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:wasmimport wasi_snapshot_preview1 path_rename
//go:noescape //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:wasmimport wasi_snapshot_preview1 path_symlink
//go:noescape //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:wasmimport wasi_snapshot_preview1 path_unlink_file
//go:noescape //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:wasmimport wasi_snapshot_preview1 path_open
//go:noescape //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:wasmimport wasi_snapshot_preview1 random_get
//go:noescape //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 // 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 must be at offset 2, hence the uint16 type rather than the
// fdflags (uint32) type. // fdflags (uint32) type.
type fdstat struct { type fdstat struct {
_ structs.HostLayout
filetype filetype filetype filetype
fdflags uint16 fdflags uint16
rightsBase rights rightsBase rights
@ -282,7 +285,7 @@ type fdstat struct {
//go:wasmimport wasi_snapshot_preview1 fd_fdstat_get //go:wasmimport wasi_snapshot_preview1 fd_fdstat_get
//go:noescape //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:wasmimport wasi_snapshot_preview1 fd_fdstat_set_flags
//go:noescape //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) { func fd_fdstat_get_flags(fd int) (uint32, error) {
var stat fdstat 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) 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) { func fd_fdstat_get_type(fd int) (uint8, error) {
var stat fdstat var stat fdstat
errno := fd_fdstat_get(int32(fd), unsafe.Pointer(&stat)) errno := fd_fdstat_get(int32(fd), &stat)
return stat.filetype, errnoErr(errno) return stat.filetype, errnoErr(errno)
} }
@ -313,21 +316,23 @@ const (
) )
type prestatDir struct { type prestatDir struct {
_ structs.HostLayout
prNameLen size prNameLen size
} }
type prestat struct { type prestat struct {
_ structs.HostLayout
typ preopentype typ preopentype
dir prestatDir dir prestatDir
} }
//go:wasmimport wasi_snapshot_preview1 fd_prestat_get //go:wasmimport wasi_snapshot_preview1 fd_prestat_get
//go:noescape //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:wasmimport wasi_snapshot_preview1 fd_prestat_dir_name
//go:noescape //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 { type opendir struct {
fd int32 fd int32
@ -354,7 +359,7 @@ func init() {
for preopenFd := int32(3); ; preopenFd++ { for preopenFd := int32(3); ; preopenFd++ {
var prestat prestat var prestat prestat
errno := fd_prestat_get(preopenFd, unsafe.Pointer(&prestat)) errno := fd_prestat_get(preopenFd, &prestat)
if errno == EBADF { if errno == EBADF {
break break
} }
@ -368,7 +373,7 @@ func init() {
dirNameBuf = make([]byte, prestat.dir.prNameLen) 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 { if errno != 0 {
panic("fd_prestat_dir_name: " + errno.Error()) 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 // If the path argument is not absolute, it is first appended to the current
// working directory before resolution. // working directory before resolution.
func preparePath(path string) (int32, unsafe.Pointer, size) { func preparePath(path string) (int32, *byte, size) {
var dirFd = int32(-1) var dirFd = int32(-1)
var dirName string var dirName string
@ -512,7 +517,7 @@ func preparePath(path string) (int32, unsafe.Pointer, size) {
path = "." 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) { 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) { 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 var oflags oflags
if (openmode & O_CREATE) != 0 { if (openmode & O_CREATE) != 0 {
oflags |= OFLAG_CREATE oflags |= OFLAG_CREATE
@ -580,7 +585,7 @@ func openat(dirFd int32, pathPtr unsafe.Pointer, pathLen size, openmode int, per
rights, rights,
fileRights, fileRights,
fdflags, fdflags,
unsafe.Pointer(&fd), &fd,
) )
if errno == EISDIR && oflags == 0 && fdflags == 0 && ((rights & writeRights) == 0) { if errno == EISDIR && oflags == 0 && fdflags == 0 && ((rights & writeRights) == 0) {
// wasmtime and wasmedge will error if attempting to open a directory // 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, rights&dirRights,
fileRights, fileRights,
fdflags, fdflags,
unsafe.Pointer(&fd), &fd,
) )
} }
return int(fd), errnoErr(errno) 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) { func ReadDir(fd int, buf []byte, cookie dircookie) (int, error) {
var nwritten size 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) return int(nwritten), errnoErr(errno)
} }
@ -835,9 +840,9 @@ func Readlink(path string, buf []byte) (n int, err error) {
dirFd, dirFd,
pathPtr, pathPtr,
pathLen, pathLen,
unsafe.Pointer(&buf[0]), &buf[0],
size(len(buf)), size(len(buf)),
unsafe.Pointer(&nwritten), &nwritten,
) )
// For some reason wasmtime returns ERANGE when the output buffer is // For some reason wasmtime returns ERANGE when the output buffer is
// shorter than the symbolic link value. os.Readlink expects a nil // 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) dirFd, pathPtr, pathlen := preparePath(link)
errno := path_symlink( errno := path_symlink(
stringPointer(path), unsafe.StringData(path),
size(len(path)), size(len(path)),
dirFd, dirFd,
pathPtr, pathPtr,
@ -885,52 +890,44 @@ func Fsync(fd int) error {
return errnoErr(errno) return errnoErr(errno)
} }
func bytesPointer(b []byte) unsafe.Pointer { func makeIOVec(b []byte) *iovec {
return unsafe.Pointer(unsafe.SliceData(b)) return &iovec{
} buf: uintptr32(uintptr(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))),
bufLen: size(len(b)), bufLen: size(len(b)),
}) }
} }
func Read(fd int, b []byte) (int, error) { func Read(fd int, b []byte) (int, error) {
var nread size 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) runtime.KeepAlive(b)
return int(nread), errnoErr(errno) return int(nread), errnoErr(errno)
} }
func Write(fd int, b []byte) (int, error) { func Write(fd int, b []byte) (int, error) {
var nwritten size 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) runtime.KeepAlive(b)
return int(nwritten), errnoErr(errno) return int(nwritten), errnoErr(errno)
} }
func Pread(fd int, b []byte, offset int64) (int, error) { func Pread(fd int, b []byte, offset int64) (int, error) {
var nread size 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) runtime.KeepAlive(b)
return int(nread), errnoErr(errno) return int(nread), errnoErr(errno)
} }
func Pwrite(fd int, b []byte, offset int64) (int, error) { func Pwrite(fd int, b []byte, offset int64) (int, error) {
var nwritten size 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) runtime.KeepAlive(b)
return int(nwritten), errnoErr(errno) return int(nwritten), errnoErr(errno)
} }
func Seek(fd int, offset int64, whence int) (int64, error) { func Seek(fd int, offset int64, whence int) (int64, error) {
var newoffset filesize 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) return int64(newoffset), errnoErr(errno)
} }
@ -947,6 +944,6 @@ func Pipe(fd []int) error {
} }
func RandomGet(b []byte) 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) return errnoErr(errno)
} }

View File

@ -6,8 +6,6 @@
package syscall package syscall
import "unsafe"
const ( const (
SHUT_RD = 0x1 SHUT_RD = 0x1
SHUT_WR = 0x2 SHUT_WR = 0x2
@ -18,7 +16,7 @@ type sdflags = uint32
//go:wasmimport wasi_snapshot_preview1 sock_accept //go:wasmimport wasi_snapshot_preview1 sock_accept
//go:noescape //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:wasmimport wasi_snapshot_preview1 sock_shutdown
//go:noescape //go:noescape
@ -42,7 +40,7 @@ func Listen(fd int, backlog int) error {
func Accept(fd int) (int, Sockaddr, error) { func Accept(fd int) (int, Sockaddr, error) {
var newfd int32 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) return int(newfd), nil, errnoErr(errno)
} }

View File

@ -383,7 +383,7 @@ func Getppid() int {
func Gettimeofday(tv *Timeval) error { func Gettimeofday(tv *Timeval) error {
var time timestamp 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 return errno
} }
tv.setTimestamp(time) tv.setTimestamp(time)
@ -465,7 +465,7 @@ const (
//go:wasmimport wasi_snapshot_preview1 clock_time_get //go:wasmimport wasi_snapshot_preview1 clock_time_get
//go:noescape //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 { func SetNonblock(fd int, nonblocking bool) error {
flags, err := fd_fdstat_get_flags(fd) flags, err := fd_fdstat_get_flags(fd)