Skip to content

Commit 44a6475

Browse files
authored
[WebAssembly] enable shims and stubs for WASI (#29505)
* [WebAssembly] enable shims and stubs for WASI * Implement _swift_stdlib_getUnsafeArgvArgc for WASI * Make include unconditional, add JIRA links
1 parent 7392c8d commit 44a6475

File tree

5 files changed

+49
-5
lines changed

5 files changed

+49
-5
lines changed

stdlib/public/SwiftShims/LibcShims.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ typedef __swift_uint32_t __swift_mode_t;
4343
typedef __swift_uint16_t __swift_mode_t;
4444
#elif defined(_WIN32)
4545
typedef __swift_int32_t __swift_mode_t;
46+
#elif defined(__wasi__)
47+
typedef __swift_uint32_t __swift_mode_t;
4648
#else // just guessing
4749
typedef __swift_uint16_t __swift_mode_t;
4850
#endif
@@ -105,7 +107,7 @@ static inline __swift_size_t _swift_stdlib_malloc_size(const void *ptr) {
105107
return malloc_size(ptr);
106108
}
107109
#elif defined(__linux__) || defined(__CYGWIN__) || defined(__ANDROID__) \
108-
|| defined(__HAIKU__) || defined(__FreeBSD__)
110+
|| defined(__HAIKU__) || defined(__FreeBSD__) || defined(__wasi__)
109111
static inline __swift_size_t _swift_stdlib_malloc_size(const void *ptr) {
110112
#if defined(__ANDROID__)
111113
#if !defined(__ANDROID_API__) || __ANDROID_API__ >= 17

stdlib/public/stubs/CommandLine.cpp

+36
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,42 @@ char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
206206

207207
return outBuf;
208208
}
209+
#elif defined(__wasi__)
210+
#include <wasi/api.h>
211+
#include <wasi/libc.h>
212+
#include <stdlib.h>
213+
214+
SWIFT_RUNTIME_STDLIB_API
215+
char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
216+
assert(outArgLen != nullptr);
217+
218+
if (_swift_stdlib_ProcessOverrideUnsafeArgv) {
219+
*outArgLen = _swift_stdlib_ProcessOverrideUnsafeArgc;
220+
return _swift_stdlib_ProcessOverrideUnsafeArgv;
221+
}
222+
223+
__wasi_errno_t err;
224+
225+
size_t argv_buf_size;
226+
size_t argc;
227+
err = __wasi_args_sizes_get(&argc, &argv_buf_size);
228+
if (err != __WASI_ERRNO_SUCCESS) return nullptr;
229+
230+
size_t num_ptrs = argc + 1;
231+
char *argv_buf = (char *)malloc(argv_buf_size);
232+
char **argv = (char **)calloc(num_ptrs, sizeof(char *));
233+
234+
err = __wasi_args_get((uint8_t **)argv, (uint8_t *)argv_buf);
235+
if (err != __WASI_ERRNO_SUCCESS) {
236+
free(argv_buf);
237+
free(argv);
238+
return nullptr;
239+
}
240+
241+
*outArgLen = static_cast<int>(argc);
242+
243+
return argv;
244+
}
209245
#else // Add your favorite OS's command line arg grabber here.
210246
SWIFT_RUNTIME_STDLIB_API
211247
char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {

stdlib/public/stubs/LibcShims.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
#include <stdio.h>
2525
#include <sys/types.h>
26-
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
26+
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__wasi__)
2727
#include <unistd.h>
2828
#endif
2929

stdlib/public/stubs/Random.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
#include "swift/Runtime/Mutex.h"
4343
#include "../SwiftShims/Random.h"
4444

45+
#include <algorithm> // required for std::min
46+
4547
#if defined(__APPLE__)
4648

4749
SWIFT_RUNTIME_STDLIB_API
@@ -88,7 +90,7 @@ void swift::swift_stdlib_random(void *buf, __swift_size_t nbytes) {
8890
if (getrandom_available) {
8991
actual_nbytes = WHILE_EINTR(syscall(__NR_getrandom, buf, nbytes, 0));
9092
}
91-
#elif __has_include(<sys/random.h>) && (defined(__CYGWIN__) || defined(__Fuchsia__))
93+
#elif __has_include(<sys/random.h>) && (defined(__CYGWIN__) || defined(__Fuchsia__) || defined(__wasi__))
9294
__swift_size_t getentropy_nbytes = std::min(nbytes, __swift_size_t{256});
9395

9496
if (0 == getentropy(buf, getentropy_nbytes)) {

stdlib/public/stubs/Stubs.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
#define NOMINMAX
2727
#include <windows.h>
2828
#else
29-
#if !defined(__HAIKU__)
29+
#if !defined(__HAIKU__) && !defined(__wasi__)
3030
#include <sys/errno.h>
3131
#else
3232
#include <errno.h>
@@ -67,7 +67,7 @@ static float swift_strtof_l(const char *nptr, char **endptr, locale_t loc) {
6767
#define strtod_l swift_strtod_l
6868
#define strtof_l swift_strtof_l
6969
#endif
70-
#elif defined(__linux__)
70+
#elif defined(__linux__) || defined(__wasi__)
7171
#include <locale.h>
7272
#else
7373
#include <xlocale.h>
@@ -503,6 +503,8 @@ const char *swift::_swift_stdlib_strtof_clocale(
503503
void swift::_swift_stdlib_flockfile_stdout() {
504504
#if defined(_WIN32)
505505
_lock_file(stdout);
506+
#elif defined(__wasi__)
507+
// WebAssembly/WASI doesn't support file locking yet https://bugs.swift.org/browse/SR-12097
506508
#else
507509
flockfile(stdout);
508510
#endif
@@ -511,6 +513,8 @@ void swift::_swift_stdlib_flockfile_stdout() {
511513
void swift::_swift_stdlib_funlockfile_stdout() {
512514
#if defined(_WIN32)
513515
_unlock_file(stdout);
516+
#elif defined(__wasi__)
517+
// WebAssembly/WASI doesn't support file locking yet https://bugs.swift.org/browse/SR-12097
514518
#else
515519
funlockfile(stdout);
516520
#endif

0 commit comments

Comments
 (0)