Avoid varargs in socket syscall layer. NFC (#27153)
Passing a small number of integer arguments may be cheaper than
marshalling varargs on wasm64.
Split out from #19559.
diff --git a/src/lib/libsigs.js b/src/lib/libsigs.js
index ae52c8e..3159fcf 100644
--- a/src/lib/libsigs.js
+++ b/src/lib/libsigs.js
@@ -269,7 +269,7 @@
__syscall_recvmsg__sig: 'iipiiii',
__syscall_renameat__sig: 'iipip',
__syscall_rmdir__sig: 'ip',
- __syscall_sendmsg__sig: 'iipippi',
+ __syscall_sendmsg__sig: 'iipiiii',
__syscall_sendto__sig: 'iippipi',
__syscall_shutdown__sig: 'iiiiiii',
__syscall_socket__sig: 'iiiiiii',
diff --git a/src/lib/libsyscall.js b/src/lib/libsyscall.js
index 6f0e5c0..afcec47 100644
--- a/src/lib/libsyscall.js
+++ b/src/lib/libsyscall.js
@@ -351,7 +351,7 @@
return info;
},
__syscall_socket__deps: ['$SOCKFS'],
- __syscall_socket: (domain, type, protocol) => {
+ __syscall_socket: (domain, type, protocol, u1, u2, u3) => {
var sock = SOCKFS.createSocket(domain, type, protocol);
#if ASSERTIONS
assert(sock.stream.fd < 64); // XXX ? select() assumes socket fd values are in 0..63
@@ -359,45 +359,45 @@
return sock.stream.fd;
},
__syscall_getsockname__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'],
- __syscall_getsockname: (fd, addr, addrlen, d1, d2, d3) => {
+ __syscall_getsockname: (fd, addr, len, u1, u2, u3) => {
var sock = getSocketFromFD(fd);
// TODO: sock.saddr should never be undefined, see TODO in websocket_sock_ops.getname
- var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || '0.0.0.0'), sock.sport, addrlen);
+ var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.saddr || '0.0.0.0'), sock.sport, len);
#if ASSERTIONS
assert(!errno);
#endif
return 0;
},
__syscall_getpeername__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'],
- __syscall_getpeername: (fd, addr, addrlen, d1, d2, d3) => {
+ __syscall_getpeername: (fd, addr, len, u1, u2, u3) => {
var sock = getSocketFromFD(fd);
if (!sock.daddr) {
return -{{{ cDefs.ENOTCONN }}}; // The socket is not connected.
}
- var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, addrlen);
+ var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(sock.daddr), sock.dport, len);
#if ASSERTIONS
assert(!errno);
#endif
return 0;
},
__syscall_connect__deps: ['$getSocketFromFD', '$getSocketAddress'],
- __syscall_connect: (fd, addr, addrlen, d1, d2, d3) => {
+ __syscall_connect: (fd, addr, len, u1, u2, u3) => {
var sock = getSocketFromFD(fd);
- var info = getSocketAddress(addr, addrlen);
+ var info = getSocketAddress(addr, len);
sock.sock_ops.connect(sock, info.addr, info.port);
return 0;
},
__syscall_shutdown__deps: ['$getSocketFromFD'],
- __syscall_shutdown: (fd, how) => {
+ __syscall_shutdown: (fd, how, u1, u2, u3, u4) => {
getSocketFromFD(fd);
return -{{{ cDefs.ENOSYS }}}; // unsupported feature
},
__syscall_accept4__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'],
- __syscall_accept4: (fd, addr, addrlen, flags, d1, d2) => {
+ __syscall_accept4: (fd, addr, len, flags, u1, u2) => {
var sock = getSocketFromFD(fd);
var newsock = sock.sock_ops.accept(sock);
if (addr) {
- var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, addrlen);
+ var errno = writeSockaddr(addr, newsock.family, DNS.lookup_name(newsock.daddr), newsock.dport, len);
#if ASSERTIONS
assert(!errno);
#endif
@@ -405,25 +405,25 @@
return newsock.stream.fd;
},
__syscall_bind__deps: ['$getSocketFromFD', '$getSocketAddress'],
- __syscall_bind: (fd, addr, addrlen, d1, d2, d3) => {
+ __syscall_bind: (fd, addr, len, u1, u2, u3) => {
var sock = getSocketFromFD(fd);
- var info = getSocketAddress(addr, addrlen);
+ var info = getSocketAddress(addr, len);
sock.sock_ops.bind(sock, info.addr, info.port);
return 0;
},
__syscall_listen__deps: ['$getSocketFromFD'],
- __syscall_listen: (fd, backlog) => {
+ __syscall_listen: (fd, backlog, u1, u2, u3, u4) => {
var sock = getSocketFromFD(fd);
sock.sock_ops.listen(sock, backlog);
return 0;
},
__syscall_recvfrom__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'],
- __syscall_recvfrom: (fd, buf, len, flags, addr, addrlen) => {
+ __syscall_recvfrom: (fd, buf, len, flags, addr, alen) => {
var sock = getSocketFromFD(fd);
var msg = sock.sock_ops.recvmsg(sock, len);
if (!msg) return 0; // socket is closed
if (addr) {
- var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, addrlen);
+ var errno = writeSockaddr(addr, sock.family, DNS.lookup_name(msg.addr), msg.port, alen);
#if ASSERTIONS
assert(!errno);
#endif
@@ -432,18 +432,18 @@
return msg.buffer.byteLength;
},
__syscall_sendto__deps: ['$getSocketFromFD', '$getSocketAddress'],
- __syscall_sendto: (fd, message, length, flags, addr, addr_len) => {
+ __syscall_sendto: (fd, buf, len, flags, addr, alen) => {
var sock = getSocketFromFD(fd);
if (!addr) {
// send, no address provided
- return FS.write(sock.stream, HEAP8, message, length);
+ return FS.write(sock.stream, HEAP8, buf, len);
}
- var dest = getSocketAddress(addr, addr_len);
+ var dest = getSocketAddress(addr, alen);
// sendto an address
- return sock.sock_ops.sendmsg(sock, HEAP8, message, length, dest.addr, dest.port);
+ return sock.sock_ops.sendmsg(sock, HEAP8, buf, len, dest.addr, dest.port);
},
__syscall_getsockopt__deps: ['$getSocketFromFD'],
- __syscall_getsockopt: (fd, level, optname, optval, optlen, d1) => {
+ __syscall_getsockopt: (fd, level, optname, optval, optlen, unused) => {
var sock = getSocketFromFD(fd);
// Minimal getsockopt aimed at resolving https://github.com/emscripten-core/emscripten/issues/2211
// so only supports SOL_SOCKET with SO_ERROR.
@@ -458,7 +458,7 @@
return -{{{ cDefs.ENOPROTOOPT }}}; // The option is unknown at the level indicated.
},
__syscall_sendmsg__deps: ['$getSocketFromFD', '$getSocketAddress'],
- __syscall_sendmsg: (fd, message, flags, d1, d2, d3) => {
+ __syscall_sendmsg: (fd, message, flags, u1, u2, u3) => {
var sock = getSocketFromFD(fd);
var iov = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iov, '*') }}};
var num = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iovlen, 'i32') }}};
@@ -489,7 +489,7 @@
return sock.sock_ops.sendmsg(sock, view, 0, total, addr, port);
},
__syscall_recvmsg__deps: ['$getSocketFromFD', '$writeSockaddr', '$DNS'],
- __syscall_recvmsg: (fd, message, flags, d1, d2, d3) => {
+ __syscall_recvmsg: (fd, message, flags, u1, u2, u3) => {
var sock = getSocketFromFD(fd);
var iov = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iov, '*') }}};
var num = {{{ makeGetValue('message', C_STRUCTS.msghdr.msg_iovlen, 'i32') }}};
diff --git a/system/include/emscripten/syscalls.h b/system/include/emscripten/syscalls.h
index d23bc4e..3cce3d2 100644
--- a/system/include/emscripten/syscalls.h
+++ b/system/include/emscripten/syscalls.h
@@ -98,24 +98,24 @@
int __syscall_fallocate(int fd, int mode, off_t offset, off_t len);
int __syscall_dup3(int fd, int suggestfd, int flags);
int __syscall_pipe2(intptr_t fds, int flags);
-int __syscall_recvmmsg(int sockfd, intptr_t msgvec, unsigned int vlen, unsigned int flags, ...);
+int __syscall_recvmmsg(int sockfd, intptr_t msgvec, unsigned int vlen, unsigned int flags, intptr_t timeout);
int __syscall_prlimit64(pid_t pid, int resource, intptr_t new_limit, intptr_t old_limit);
-int __syscall_sendmmsg(int sockfd, intptr_t msgvec, unsigned int vlen, unsigned int flags, ...);
-int __syscall_socket(int domain, int type, int protocol, int dummy1, int dummy2, int dummy3);
-int __syscall_socketpair(int domain, int type, int protocol, intptr_t fds, int dummy, int dummy2);
-int __syscall_bind(int sockfd, intptr_t addr, socklen_t alen, int dummy, int dummy2, int dummy3);
-int __syscall_connect(int sockfd, intptr_t addr, socklen_t len, int dummy, int dummy2, int dummy3);
-int __syscall_listen(int sockfd, int backlog, int dummy1, int dummy2, int dummy3, int dummy4);
-int __syscall_accept4(int sockfd, intptr_t addr, intptr_t addrlen, int flags, int dummy1, int dummy2);
-int __syscall_getsockopt(int sockfd, int level, int optname, intptr_t optval, intptr_t optlen, int dummy);
-int __syscall_setsockopt(int sockfd, int level, int optname, intptr_t optval, socklen_t optlen, int dummy);
-int __syscall_getsockname(int sockfd, intptr_t addr, intptr_t len, int dummy, int dummy2, int dummy3);
-int __syscall_getpeername(int sockfd, intptr_t addr, intptr_t len, int dummy, int dummy2, int dummy3);
-int __syscall_sendto(int sockfd, intptr_t msg, size_t len, int flags, intptr_t addr, socklen_t alen);
-int __syscall_sendmsg(int sockfd, intptr_t msg , int flags, intptr_t addr, size_t alen, int dummy);
-int __syscall_recvfrom(int sockfd, intptr_t msg, size_t len, int flags, intptr_t addr, intptr_t alen);
-int __syscall_recvmsg(int sockfd, intptr_t msg, int flags, int dummy, int dummy2, int dummy3);
-int __syscall_shutdown(int sockfd, int how, int dummy, int dummy2, int dummy3, int dummy4);
+int __syscall_sendmmsg(int sockfd, intptr_t msgvec, unsigned int vlen, unsigned int flags);
+int __syscall_socket(int domain, int type, int protocol, int unused1, int unused2, int unused3);
+int __syscall_socketpair(int domain, int type, int protocol, intptr_t fds, int unused1, int unused2);
+int __syscall_bind(int sockfd, intptr_t addr, socklen_t len, int unused1, int unused2, int unused3);
+int __syscall_connect(int sockfd, intptr_t addr, socklen_t len, int unused1, int unused2, int unused3);
+int __syscall_listen(int sockfd, int backlog, int unused1, int unused2, int unused3, int unused4);
+int __syscall_accept4(int sockfd, intptr_t addr, intptr_t len, int flags, int unused1, int unused2);
+int __syscall_getsockopt(int sockfd, int level, int optname, intptr_t optval, intptr_t optlen, int unused);
+int __syscall_setsockopt(int sockfd, int level, int optname, intptr_t optval, socklen_t optlen, int unused);
+int __syscall_getsockname(int sockfd, intptr_t addr, intptr_t len, int unused1, int unused2, int unused3);
+int __syscall_getpeername(int sockfd, intptr_t addr, intptr_t len, int unused1, int unused2, int unused3);
+int __syscall_sendto(int sockfd, intptr_t buf, size_t len, int flags, intptr_t addr, socklen_t alen);
+int __syscall_sendmsg(int sockfd, intptr_t msg, int flags, int unused1, int unused2, int unused3);
+int __syscall_recvfrom(int sockfd, intptr_t buf, size_t len, int flags, intptr_t addr, intptr_t alen);
+int __syscall_recvmsg(int sockfd, intptr_t msg, int flags, int unused1, int unused2, int unused3);
+int __syscall_shutdown(int sockfd, int how, int unused1, int unused2, int unused3, int unused4);
#ifdef __cplusplus
}
diff --git a/system/lib/libc/emscripten_syscall_stubs.c b/system/lib/libc/emscripten_syscall_stubs.c
index 7ebc009..cf94229 100644
--- a/system/lib/libc/emscripten_syscall_stubs.c
+++ b/system/lib/libc/emscripten_syscall_stubs.c
@@ -248,7 +248,7 @@
return 0;
}
-weak int __syscall_setsockopt(int sockfd, int level, int optname, intptr_t optval, socklen_t optlen, int dummy) {
+weak int __syscall_setsockopt(int sockfd, int level, int optname, intptr_t optval, socklen_t optlen, int unused) {
REPORT(setsockopt);
return -ENOPROTOOPT; // The option is unknown at the level indicated.
}
@@ -260,7 +260,7 @@
UNIMPLEMENTED(acct, (intptr_t filename))
UNIMPLEMENTED(mincore, (intptr_t addr, size_t length, intptr_t vec))
-UNIMPLEMENTED(recvmmsg, (int sockfd, intptr_t msgvec, unsigned int vlen, unsigned int flags, ...))
-UNIMPLEMENTED(sendmmsg, (int sockfd, intptr_t msgvec, unsigned int vlen, unsigned int flags, ...))
-UNIMPLEMENTED(shutdown, (int sockfd, int how, int dummy, int dummy2, int dummy3, int dummy4))
-UNIMPLEMENTED(socketpair, (int domain, int type, int protocol, intptr_t fds, int dummy, int dummy2))
+UNIMPLEMENTED(recvmmsg, (int sockfd, intptr_t msgvec, unsigned int vlen, unsigned int flags, intptr_t timeout))
+UNIMPLEMENTED(sendmmsg, (int sockfd, intptr_t msgvec, unsigned int vlen, unsigned int flags))
+UNIMPLEMENTED(shutdown, (int sockfd, int how, int unused1, int unused2, int unused3, int unused4))
+UNIMPLEMENTED(socketpair, (int domain, int type, int protocol, intptr_t fds, int unused1, int unused2))
diff --git a/system/lib/wasmfs/syscalls.cpp b/system/lib/wasmfs/syscalls.cpp
index 8ab0dc2..373b8ac 100644
--- a/system/lib/wasmfs/syscalls.cpp
+++ b/system/lib/wasmfs/syscalls.cpp
@@ -1723,30 +1723,38 @@
int __syscall_accept4(int sockfd,
intptr_t addr,
- intptr_t addrlen,
+ intptr_t len,
int flags,
- int dummy1,
- int dummy2) {
+ int unused1,
+ int unused2) {
return -ENOSYS;
}
-int __syscall_bind(
- int sockfd, intptr_t addr, socklen_t alen, int dummy, int dummy2, int dummy3) {
+int __syscall_bind(int sockfd,
+ intptr_t addr,
+ socklen_t alen,
+ int unused1,
+ int unused2,
+ int unused3) {
return -ENOSYS;
}
-int __syscall_connect(
- int sockfd, intptr_t addr, socklen_t len, int dummy, int dummy2, int dummy3) {
+int __syscall_connect(int sockfd,
+ intptr_t addr,
+ socklen_t len,
+ int unused1,
+ int unused2,
+ int unused3) {
return -ENOSYS;
}
int __syscall_socket(
- int domain, int type, int protocol, int dummy1, int dummy2, int dummy3) {
+ int domain, int type, int protocol, int unused1, int unused2, int unused3) {
return -ENOSYS;
}
int __syscall_listen(
- int sockfd, int backlog, int dummy1, int dummy2, int dummy3, int dummy4) {
+ int sockfd, int backlog, int unused1, int unused2, int unused3, int unused4) {
return -ENOSYS;
}
@@ -1755,22 +1763,30 @@
int optname,
intptr_t optval,
intptr_t optlen,
- int dummy) {
+ int unused) {
return -ENOSYS;
}
-int __syscall_getsockname(
- int sockfd, intptr_t addr, intptr_t len, int dummy, int dummy2, int dummy3) {
+int __syscall_getsockname(int sockfd,
+ intptr_t addr,
+ intptr_t len,
+ int unused1,
+ int unused2,
+ int unused3) {
return -ENOSYS;
}
-int __syscall_getpeername(
- int sockfd, intptr_t addr, intptr_t len, int dummy, int dummy2, int dummy3) {
+int __syscall_getpeername(int sockfd,
+ intptr_t addr,
+ intptr_t len,
+ int unused1,
+ int unused2,
+ int unused3) {
return -ENOSYS;
}
int __syscall_sendto(int sockfd,
- intptr_t msg,
+ intptr_t buf,
size_t len,
int flags,
intptr_t addr,
@@ -1779,12 +1795,12 @@
}
int __syscall_sendmsg(
- int sockfd, intptr_t msg, int flags, intptr_t addr, size_t alen, int dummy) {
+ int sockfd, intptr_t msg, int flags, int unused1, int unused2, int unused3) {
return -ENOSYS;
}
int __syscall_recvfrom(int sockfd,
- intptr_t msg,
+ intptr_t buf,
size_t len,
int flags,
intptr_t addr,
@@ -1793,7 +1809,7 @@
}
int __syscall_recvmsg(
- int sockfd, intptr_t msg, int flags, int dummy, int dummy2, int dummy3) {
+ int sockfd, intptr_t msg, int flags, int unused1, int unused2, int unused3) {
return -ENOSYS;
}
diff --git a/test/codesize/test_codesize_hello_dylink_all.json b/test/codesize/test_codesize_hello_dylink_all.json
index 380af5a..bce01c3 100644
--- a/test/codesize/test_codesize_hello_dylink_all.json
+++ b/test/codesize/test_codesize_hello_dylink_all.json
@@ -1,7 +1,7 @@
{
"a.out.js": 268255,
- "a.out.nodebug.wasm": 587588,
- "total": 855843,
+ "a.out.nodebug.wasm": 587563,
+ "total": 855818,
"sent": [
"IMG_Init",
"IMG_Load",
@@ -4092,6 +4092,7 @@
"$__syscall_munmap",
"$__syscall_prlimit64",
"$__syscall_recvmmsg",
+ "$__syscall_sendmmsg",
"$__syscall_setdomainname",
"$__syscall_setpgid",
"$__syscall_setpriority",