Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add crt2-command.o to provide __main_void #528

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions expected/wasm32-wasip1-threads/undefined-symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ __imported_wasi_snapshot_preview1_sock_shutdown
__imported_wasi_thread_spawn
__letf2
__lttf2
__main_argc_argv
__netf2
__stack_pointer
__subtf3
Expand Down
1 change: 1 addition & 0 deletions expected/wasm32-wasip1/undefined-symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ __imported_wasi_snapshot_preview1_sock_send
__imported_wasi_snapshot_preview1_sock_shutdown
__letf2
__lttf2
__main_argc_argv
__netf2
__stack_pointer
__subtf3
Expand Down
1 change: 1 addition & 0 deletions expected/wasm32-wasip2/undefined-symbols.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ __imported_wasi_snapshot_preview1_sock_send
__imported_wasi_snapshot_preview1_sock_shutdown
__letf2
__lttf2
__main_argc_argv
__netf2
__stack_pointer
__subtf3
Expand Down
54 changes: 54 additions & 0 deletions libc-bottom-half/crt/crt2-command.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#include <wasi/api.h>
#include <stdlib.h>
#include <sysexits.h>

// The user's `main` function, expecting arguments.
int __main_argc_argv(int argc, char *argv[]);

// If the user's `main` function expects arguments, the compiler will rename
// it to `__main_argc_argv`, and this version will get linked in, which
// initializes the argument data and calls `__main_argc_argv`.
__attribute__((__weak__, nodebug))
int __main_void(void) {
__wasi_errno_t err;

// Get the sizes of the arrays we'll have to create to copy in the args.
size_t argv_buf_size;
size_t argc;
err = __wasi_args_sizes_get(&argc, &argv_buf_size);
if (err != __WASI_ERRNO_SUCCESS) {
_Exit(EX_OSERR);
}

// Add 1 for the NULL pointer to mark the end, and check for overflow.
size_t num_ptrs = argc + 1;
if (num_ptrs == 0) {
_Exit(EX_SOFTWARE);
}

// Allocate memory for storing the argument chars.
char *argv_buf = malloc(argv_buf_size);
if (argv_buf == NULL) {
_Exit(EX_SOFTWARE);
}

// Allocate memory for the array of pointers. This uses `calloc` both to
// handle overflow and to initialize the NULL pointer at the end.
char **argv = calloc(num_ptrs, sizeof(char *));
if (argv == NULL) {
free(argv_buf);
_Exit(EX_SOFTWARE);
}

// Fill the argument chars, and the argv array with pointers into those chars.
// TODO: Remove the casts on `argv_ptrs` and `argv_buf` once the witx is updated with char8 support.
err = __wasi_args_get((uint8_t **)argv, (uint8_t *)argv_buf);
if (err != __WASI_ERRNO_SUCCESS) {
free(argv_buf);
free(argv);
_Exit(EX_OSERR);
}

// Call `__main_argc_argv` with the arguments!
return __main_argc_argv(argc, argv);
}
3 changes: 3 additions & 0 deletions libc-bottom-half/sources/__main_void.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
#include <stdlib.h>
#include <sysexits.h>

// TODO: This file can be dropped when we drop the support of LLVM
// versions w/o crt2-command.o support.

// The user's `main` function, expecting arguments.
//
// Note that we make this a weak symbol so that it will have a
Expand Down