Skip to content

Commit

Permalink
[WebAssembly] enable shims and stubs for WASI (#29505)
Browse files Browse the repository at this point in the history
* [WebAssembly] enable shims and stubs for WASI

* Implement _swift_stdlib_getUnsafeArgvArgc for WASI

* Make include unconditional, add JIRA links
  • Loading branch information
MaxDesiatov committed Jan 29, 2020
1 parent 7392c8d commit 44a6475
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 5 deletions.
4 changes: 3 additions & 1 deletion stdlib/public/SwiftShims/LibcShims.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ typedef __swift_uint32_t __swift_mode_t;
typedef __swift_uint16_t __swift_mode_t;
#elif defined(_WIN32)
typedef __swift_int32_t __swift_mode_t;
#elif defined(__wasi__)
typedef __swift_uint32_t __swift_mode_t;
#else // just guessing
typedef __swift_uint16_t __swift_mode_t;
#endif
Expand Down Expand Up @@ -105,7 +107,7 @@ static inline __swift_size_t _swift_stdlib_malloc_size(const void *ptr) {
return malloc_size(ptr);
}
#elif defined(__linux__) || defined(__CYGWIN__) || defined(__ANDROID__) \
|| defined(__HAIKU__) || defined(__FreeBSD__)
|| defined(__HAIKU__) || defined(__FreeBSD__) || defined(__wasi__)
static inline __swift_size_t _swift_stdlib_malloc_size(const void *ptr) {
#if defined(__ANDROID__)
#if !defined(__ANDROID_API__) || __ANDROID_API__ >= 17
Expand Down
36 changes: 36 additions & 0 deletions stdlib/public/stubs/CommandLine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,6 +206,42 @@ char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {

return outBuf;
}
#elif defined(__wasi__)
#include <wasi/api.h>
#include <wasi/libc.h>
#include <stdlib.h>

SWIFT_RUNTIME_STDLIB_API
char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
assert(outArgLen != nullptr);

if (_swift_stdlib_ProcessOverrideUnsafeArgv) {
*outArgLen = _swift_stdlib_ProcessOverrideUnsafeArgc;
return _swift_stdlib_ProcessOverrideUnsafeArgv;
}

__wasi_errno_t err;

size_t argv_buf_size;
size_t argc;
err = __wasi_args_sizes_get(&argc, &argv_buf_size);
if (err != __WASI_ERRNO_SUCCESS) return nullptr;

size_t num_ptrs = argc + 1;
char *argv_buf = (char *)malloc(argv_buf_size);
char **argv = (char **)calloc(num_ptrs, sizeof(char *));

err = __wasi_args_get((uint8_t **)argv, (uint8_t *)argv_buf);
if (err != __WASI_ERRNO_SUCCESS) {
free(argv_buf);
free(argv);
return nullptr;
}

*outArgLen = static_cast<int>(argc);

return argv;
}
#else // Add your favorite OS's command line arg grabber here.
SWIFT_RUNTIME_STDLIB_API
char ** _swift_stdlib_getUnsafeArgvArgc(int *outArgLen) {
Expand Down
2 changes: 1 addition & 1 deletion stdlib/public/stubs/LibcShims.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@

#include <stdio.h>
#include <sys/types.h>
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) || defined(__wasi__)
#include <unistd.h>
#endif

Expand Down
4 changes: 3 additions & 1 deletion stdlib/public/stubs/Random.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@
#include "swift/Runtime/Mutex.h"
#include "../SwiftShims/Random.h"

#include <algorithm> // required for std::min

#if defined(__APPLE__)

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

if (0 == getentropy(buf, getentropy_nbytes)) {
Expand Down
8 changes: 6 additions & 2 deletions stdlib/public/stubs/Stubs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#define NOMINMAX
#include <windows.h>
#else
#if !defined(__HAIKU__)
#if !defined(__HAIKU__) && !defined(__wasi__)
#include <sys/errno.h>
#else
#include <errno.h>
Expand Down Expand Up @@ -67,7 +67,7 @@ static float swift_strtof_l(const char *nptr, char **endptr, locale_t loc) {
#define strtod_l swift_strtod_l
#define strtof_l swift_strtof_l
#endif
#elif defined(__linux__)
#elif defined(__linux__) || defined(__wasi__)
#include <locale.h>
#else
#include <xlocale.h>
Expand Down Expand Up @@ -503,6 +503,8 @@ const char *swift::_swift_stdlib_strtof_clocale(
void swift::_swift_stdlib_flockfile_stdout() {
#if defined(_WIN32)
_lock_file(stdout);
#elif defined(__wasi__)
// WebAssembly/WASI doesn't support file locking yet https://bugs.swift.org/browse/SR-12097
#else
flockfile(stdout);
#endif
Expand All @@ -511,6 +513,8 @@ void swift::_swift_stdlib_flockfile_stdout() {
void swift::_swift_stdlib_funlockfile_stdout() {
#if defined(_WIN32)
_unlock_file(stdout);
#elif defined(__wasi__)
// WebAssembly/WASI doesn't support file locking yet https://bugs.swift.org/browse/SR-12097
#else
funlockfile(stdout);
#endif
Expand Down

0 comments on commit 44a6475

Please sign in to comment.