Skip to content

Commit 4d3425a

Browse files
committed
Avoid use of anonymous unions and structs in wasi.h.
This makes the layout of these low-level structs more explicit, and also helps out bindgen.
1 parent c6ee211 commit 4d3425a

5 files changed

Lines changed: 75 additions & 16 deletions

File tree

libc-bottom-half/cloudlibc/src/libc/poll/poll.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,13 @@ int poll(struct pollfd *fds, size_t nfds, int timeout) {
2222
*subscription = (__wasi_subscription_t){
2323
.userdata = (uintptr_t)pollfd,
2424
.type = __WASI_EVENTTYPE_FD_READ,
25+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
2526
.fd_readwrite.fd = pollfd->fd,
2627
.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
28+
#else
29+
.u.fd_readwrite.fd = pollfd->fd,
30+
.u.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
31+
#endif
2732
};
2833
created_events = true;
2934
}
@@ -32,8 +37,13 @@ int poll(struct pollfd *fds, size_t nfds, int timeout) {
3237
*subscription = (__wasi_subscription_t){
3338
.userdata = (uintptr_t)pollfd,
3439
.type = __WASI_EVENTTYPE_FD_WRITE,
40+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
3541
.fd_readwrite.fd = pollfd->fd,
3642
.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
43+
#else
44+
.u.fd_readwrite.fd = pollfd->fd,
45+
.u.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
46+
#endif
3747
};
3848
created_events = true;
3949
}
@@ -52,8 +62,13 @@ int poll(struct pollfd *fds, size_t nfds, int timeout) {
5262
__wasi_subscription_t *subscription = &subscriptions[nevents++];
5363
*subscription = (__wasi_subscription_t){
5464
.type = __WASI_EVENTTYPE_CLOCK,
65+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
5566
.clock.clock_id = __WASI_CLOCK_REALTIME,
5667
.clock.timeout = (__wasi_timestamp_t)timeout * 1000000,
68+
#else
69+
.u.clock.clock_id = __WASI_CLOCK_REALTIME,
70+
.u.clock.timeout = (__wasi_timestamp_t)timeout * 1000000,
71+
#endif
5772
};
5873
}
5974

@@ -91,7 +106,11 @@ int poll(struct pollfd *fds, size_t nfds, int timeout) {
91106
// Data can be read or written.
92107
pollfd->revents |=
93108
event->type == __WASI_EVENTTYPE_FD_READ ? POLLRDNORM : POLLWRNORM;
109+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
94110
if (event->fd_readwrite.flags & __WASI_EVENT_FD_READWRITE_HANGUP)
111+
#else
112+
if (event->u.fd_readwrite.flags & __WASI_EVENT_FD_READWRITE_HANGUP)
113+
#endif
95114
pollfd->revents |= POLLHUP;
96115
}
97116
}

libc-bottom-half/cloudlibc/src/libc/sys/ioctl/ioctl.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,21 @@ int ioctl(int fildes, int request, ...) {
1515
__wasi_subscription_t subscriptions[2] = {
1616
{
1717
.type = __WASI_EVENTTYPE_FD_READ,
18+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
1819
.fd_readwrite.fd = fildes,
1920
.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
21+
#else
22+
.u.fd_readwrite.fd = fildes,
23+
.u.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
24+
#endif
2025
},
2126
{
2227
.type = __WASI_EVENTTYPE_CLOCK,
28+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
2329
.clock.clock_id = __WASI_CLOCK_MONOTONIC,
30+
#else
31+
.u.clock.clock_id = __WASI_CLOCK_MONOTONIC,
32+
#endif
2433
},
2534
};
2635
__wasi_event_t events[__arraycount(subscriptions)];
@@ -46,7 +55,11 @@ int ioctl(int fildes, int request, ...) {
4655
return -1;
4756
}
4857
if (event->type == __WASI_EVENTTYPE_FD_READ) {
58+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
4959
*result = event->fd_readwrite.nbytes;
60+
#else
61+
*result = event->u.fd_readwrite.nbytes;
62+
#endif
5063
return 0;
5164
}
5265
}

libc-bottom-half/cloudlibc/src/libc/sys/select/pselect.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,13 @@ int pselect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
5050
*subscription = (__wasi_subscription_t){
5151
.userdata = fd,
5252
.type = __WASI_EVENTTYPE_FD_READ,
53+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
5354
.fd_readwrite.fd = fd,
5455
.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
56+
#else
57+
.u.fd_readwrite.fd = fd,
58+
.u.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
59+
#endif
5560
};
5661
}
5762
}
@@ -64,8 +69,13 @@ int pselect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
6469
*subscription = (__wasi_subscription_t){
6570
.userdata = fd,
6671
.type = __WASI_EVENTTYPE_FD_WRITE,
72+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
6773
.fd_readwrite.fd = fd,
6874
.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
75+
#else
76+
.u.fd_readwrite.fd = fd,
77+
.u.fd_readwrite.flags = __WASI_SUBSCRIPTION_FD_READWRITE_POLL,
78+
#endif
6979
};
7080
}
7181
}
@@ -75,9 +85,17 @@ int pselect(int nfds, fd_set *restrict readfds, fd_set *restrict writefds,
7585
__wasi_subscription_t *subscription = &subscriptions[nevents++];
7686
*subscription = (__wasi_subscription_t){
7787
.type = __WASI_EVENTTYPE_CLOCK,
88+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
7889
.clock.clock_id = __WASI_CLOCK_REALTIME,
90+
#else
91+
.u.clock.clock_id = __WASI_CLOCK_REALTIME,
92+
#endif
7993
};
94+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
8095
if (!timespec_to_timestamp_clamp(timeout, &subscription->clock.timeout)) {
96+
#else
97+
if (!timespec_to_timestamp_clamp(timeout, &subscription->u.clock.timeout)) {
98+
#endif
8199
errno = EINVAL;
82100
return -1;
83101
}

libc-bottom-half/cloudlibc/src/libc/time/clock_nanosleep.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,19 @@ int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *rqtp,
2626
// Prepare polling subscription.
2727
__wasi_subscription_t sub = {
2828
.type = __WASI_EVENTTYPE_CLOCK,
29+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
2930
.clock.clock_id = clock_id->id,
3031
.clock.flags = flags,
32+
#else
33+
.u.clock.clock_id = clock_id->id,
34+
.u.clock.flags = flags,
35+
#endif
3136
};
37+
#ifdef __wasilibc_unmodified_upstream // non-anonymous unions
3238
if (!timespec_to_timestamp_clamp(rqtp, &sub.clock.timeout))
39+
#else
40+
if (!timespec_to_timestamp_clamp(rqtp, &sub.u.clock.timeout))
41+
#endif
3342
return EINVAL;
3443

3544
// Block until polling event is triggered.

libc-bottom-half/headers/public/wasi.h

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -297,20 +297,20 @@ typedef struct __wasi_event_t {
297297
__wasi_userdata_t userdata;
298298
__wasi_errno_t error;
299299
__wasi_eventtype_t type;
300-
union {
301-
struct {
300+
union __wasi_event_u {
301+
struct __wasi_event_u_fd_readwrite_t {
302302
__wasi_filesize_t nbytes;
303303
__wasi_eventrwflags_t flags;
304304
} fd_readwrite;
305-
};
305+
} u;
306306
} __wasi_event_t;
307307
_Static_assert(offsetof(__wasi_event_t, userdata) == 0, "non-wasi data layout");
308308
_Static_assert(offsetof(__wasi_event_t, error) == 8, "non-wasi data layout");
309309
_Static_assert(offsetof(__wasi_event_t, type) == 10, "non-wasi data layout");
310310
_Static_assert(
311-
offsetof(__wasi_event_t, fd_readwrite.nbytes) == 16, "non-wasi data layout");
311+
offsetof(__wasi_event_t, u.fd_readwrite.nbytes) == 16, "non-wasi data layout");
312312
_Static_assert(
313-
offsetof(__wasi_event_t, fd_readwrite.flags) == 24, "non-wasi data layout");
313+
offsetof(__wasi_event_t, u.fd_readwrite.flags) == 24, "non-wasi data layout");
314314
_Static_assert(sizeof(__wasi_event_t) == 32, "non-wasi data layout");
315315
_Static_assert(_Alignof(__wasi_event_t) == 8, "non-wasi data layout");
316316

@@ -511,42 +511,42 @@ _Static_assert(sizeof(void *) != 8 ||
511511
typedef struct __wasi_subscription_t {
512512
__wasi_userdata_t userdata;
513513
__wasi_eventtype_t type;
514-
union {
515-
struct {
514+
union __wasi_subscription_u {
515+
struct __wasi_subscription_u_clock_t {
516516
__wasi_userdata_t identifier;
517517
__wasi_clockid_t clock_id;
518518
__wasi_timestamp_t timeout;
519519
__wasi_timestamp_t precision;
520520
__wasi_subclockflags_t flags;
521521
} clock;
522-
struct {
522+
struct __wasi_subscription_u_fd_readwrite_t {
523523
__wasi_fd_t fd;
524524
__wasi_subrwflags_t flags;
525525
} fd_readwrite;
526-
};
526+
} u;
527527
} __wasi_subscription_t;
528528
_Static_assert(
529529
offsetof(__wasi_subscription_t, userdata) == 0, "non-wasi data layout");
530530
_Static_assert(
531531
offsetof(__wasi_subscription_t, type) == 8, "non-wasi data layout");
532532
_Static_assert(
533-
offsetof(__wasi_subscription_t, clock.identifier) == 16,
533+
offsetof(__wasi_subscription_t, u.clock.identifier) == 16,
534534
"non-wasi data layout");
535535
_Static_assert(
536-
offsetof(__wasi_subscription_t, clock.clock_id) == 24,
536+
offsetof(__wasi_subscription_t, u.clock.clock_id) == 24,
537537
"non-wasi data layout");
538538
_Static_assert(
539-
offsetof(__wasi_subscription_t, clock.timeout) == 32, "non-wasi data layout");
539+
offsetof(__wasi_subscription_t, u.clock.timeout) == 32, "non-wasi data layout");
540540
_Static_assert(
541-
offsetof(__wasi_subscription_t, clock.precision) == 40,
541+
offsetof(__wasi_subscription_t, u.clock.precision) == 40,
542542
"non-wasi data layout");
543543
_Static_assert(
544-
offsetof(__wasi_subscription_t, clock.flags) == 48, "non-wasi data layout");
544+
offsetof(__wasi_subscription_t, u.clock.flags) == 48, "non-wasi data layout");
545545
_Static_assert(
546-
offsetof(__wasi_subscription_t, fd_readwrite.fd) == 16,
546+
offsetof(__wasi_subscription_t, u.fd_readwrite.fd) == 16,
547547
"non-wasi data layout");
548548
_Static_assert(
549-
offsetof(__wasi_subscription_t, fd_readwrite.flags) == 20,
549+
offsetof(__wasi_subscription_t, u.fd_readwrite.flags) == 20,
550550
"non-wasi data layout");
551551
_Static_assert(sizeof(__wasi_subscription_t) == 56, "non-wasi data layout");
552552
_Static_assert(_Alignof(__wasi_subscription_t) == 8, "non-wasi data layout");

0 commit comments

Comments
 (0)