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

Rename wasm32-wasi-preview1-threads to wasm32-wasip1-threads #122170

Merged
merged 1 commit into from
Mar 12, 2024
Merged
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
2 changes: 1 addition & 1 deletion compiler/rustc_target/src/spec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1581,7 +1581,7 @@ supported_targets! {
("wasm32-wasi", wasm32_wasi),
("wasm32-wasip1", wasm32_wasip1),
("wasm32-wasip2", wasm32_wasip2),
("wasm32-wasi-preview1-threads", wasm32_wasi_preview1_threads),
("wasm32-wasip1-threads", wasm32_wasip1_threads),
("wasm64-unknown-unknown", wasm64_unknown_unknown),

("thumbv6m-none-eabi", thumbv6m_none_eabi),
Expand Down
139 changes: 0 additions & 139 deletions compiler/rustc_target/src/spec/targets/wasm32_wasi_preview1_threads.rs

This file was deleted.

74 changes: 74 additions & 0 deletions compiler/rustc_target/src/spec/targets/wasm32_wasip1_threads.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
//! The `wasm32-wasip1-threads` target is an extension of the `wasm32-wasip1`
//! target where threads are enabled by default for all crates. This target
//! should be considered "in flux" as WASI itself has moved on from "p1" to "p2"
//! now and threads in "p2" are still under heavy design.
//!
//! This target inherits most of the other aspects of `wasm32-wasip1`.
//!
//! Historically this target was known as `wasm32-wasi-preview1-threads`.

use crate::spec::{base, crt_objects, Cc, LinkSelfContainedDefault, LinkerFlavor, Target};

pub fn target() -> Target {
let mut options = base::wasm::options();

options.os = "wasi".into();

options.add_pre_link_args(
LinkerFlavor::WasmLld(Cc::No),
&["--import-memory", "--export-memory", "--shared-memory"],
);
options.add_pre_link_args(
LinkerFlavor::WasmLld(Cc::Yes),
&[
"--target=wasm32-wasip1-threads",
"-Wl,--import-memory",
"-Wl,--export-memory,",
"-Wl,--shared-memory",
],
);

options.pre_link_objects_self_contained = crt_objects::pre_wasi_self_contained();
options.post_link_objects_self_contained = crt_objects::post_wasi_self_contained();

// FIXME: Figure out cases in which WASM needs to link with a native toolchain.
options.link_self_contained = LinkSelfContainedDefault::True;

// Right now this is a bit of a workaround but we're currently saying that
// the target by default has a static crt which we're taking as a signal
// for "use the bundled crt". If that's turned off then the system's crt
// will be used, but this means that default usage of this target doesn't
// need an external compiler but it's still interoperable with an external
// compiler if configured correctly.
options.crt_static_default = true;
options.crt_static_respected = true;

// Allow `+crt-static` to create a "cdylib" output which is just a wasm file
// without a main function.
options.crt_static_allows_dylibs = true;

// WASI's `sys::args::init` function ignores its arguments; instead,
// `args::args()` makes the WASI API calls itself.
options.main_needs_argc_argv = false;

// And, WASI mangles the name of "main" to distinguish between different
// signatures.
options.entry_name = "__main_void".into();

options.singlethread = false;
options.features = "+atomics,+bulk-memory,+mutable-globals".into();

Target {
llvm_target: "wasm32-wasi".into(),
metadata: crate::spec::TargetMetadata {
description: None,
tier: None,
host_tools: None,
std: None,
},
pointer_width: 32,
data_layout: "e-m:e-p:32:32-p10:8:8-p20:8:8-i64:64-n32:64-S128-ni:1:10:20".into(),
arch: "wasm32".into(),
options,
}
}
4 changes: 2 additions & 2 deletions src/ci/docker/host-x86_64/dist-various-2/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ ENV TARGETS=$TARGETS,aarch64-unknown-fuchsia
ENV TARGETS=$TARGETS,wasm32-unknown-unknown
ENV TARGETS=$TARGETS,wasm32-wasi
ENV TARGETS=$TARGETS,wasm32-wasip1
ENV TARGETS=$TARGETS,wasm32-wasi-preview1-threads
ENV TARGETS=$TARGETS,wasm32-wasip1-threads
ENV TARGETS=$TARGETS,sparcv9-sun-solaris
ENV TARGETS=$TARGETS,x86_64-pc-solaris
ENV TARGETS=$TARGETS,x86_64-unknown-linux-gnux32
Expand All @@ -138,7 +138,7 @@ RUN ln -s /usr/include/x86_64-linux-gnu/asm /usr/local/include/asm
ENV RUST_CONFIGURE_ARGS --enable-extended --enable-lld --disable-docs \
--set target.wasm32-wasi.wasi-root=/wasm32-wasip1 \
--set target.wasm32-wasip1.wasi-root=/wasm32-wasip1 \
--set target.wasm32-wasi-preview1-threads.wasi-root=/wasm32-wasi-preview1-threads \
--set target.wasm32-wasip1-threads.wasi-root=/wasm32-wasip1-threads \
--musl-root-armv7=/musl-armv7

ENV SCRIPT python3 ../x.py dist --host='' --target $TARGETS
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ make -j$(nproc) \
NM="$bin/llvm-nm" \
AR="$bin/llvm-ar" \
THREAD_MODEL=posix \
INSTALL_DIR=/wasm32-wasi-preview1-threads \
INSTALL_DIR=/wasm32-wasip1-threads \
install

cd ..
Expand Down
2 changes: 1 addition & 1 deletion src/doc/rustc/src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
- [*-unknown-openbsd](platform-support/openbsd.md)
- [\*-unknown-uefi](platform-support/unknown-uefi.md)
- [wasm32-wasip1](platform-support/wasm32-wasip1.md)
- [wasm32-wasi-preview1-threads](platform-support/wasm32-wasi-preview1-threads.md)
- [wasm32-wasip1-threads](platform-support/wasm32-wasip1-threads.md)
- [wasm32-wasip2](platform-support/wasm32-wasip2.md)
- [wasm64-unknown-unknown](platform-support/wasm64-unknown-unknown.md)
- [\*-win7-windows-msvc](platform-support/win7-windows-msvc.md)
Expand Down
2 changes: 1 addition & 1 deletion src/doc/rustc/src/platform-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ target | std | notes
`wasm32-unknown-unknown` | ✓ | WebAssembly
`wasm32-wasi` | ✓ | WebAssembly with WASI (undergoing a [rename to `wasm32-wasip1`][wasi-rename])
[`wasm32-wasip1`](platform-support/wasm32-wasip1.md) | ✓ | WebAssembly with WASI
[`wasm32-wasi-preview1-threads`](platform-support/wasm32-wasi-preview1-threads.md) | ✓ | | WebAssembly with WASI Preview 1 and threads
[`wasm32-wasip1-threads`](platform-support/wasm32-wasip1-threads.md) | ✓ | | WebAssembly with WASI Preview 1 and threads
`x86_64-apple-ios` | ✓ | 64-bit x86 iOS
[`x86_64-fortanix-unknown-sgx`](platform-support/x86_64-fortanix-unknown-sgx.md) | ✓ | [Fortanix ABI] for 64-bit Intel SGX
`x86_64-fuchsia` | ✓ | Alias for `x86_64-unknown-fuchsia`
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
# `wasm32-wasi-preview1-threads`
# `wasm32-wasip1-threads`

**Tier: 2**

The `wasm32-wasi-preview1-threads` target is a new and still (as of July 2023) an
experimental target. This target is an extension to `wasm32-wasi-preview1` target,
The `wasm32-wasip1-threads` target is a new and still (as of July 2023) an
experimental target. This target is an extension to `wasm32-wasip1` target,
originally known as `wasm32-wasi`. It extends the original target with a
standardized set of syscalls that are intended to empower WebAssembly binaries with
native multi threading capabilities.
standardized set of syscalls that are intended to empower WebAssembly binaries
with native multi threading capabilities.

> **Note**: Prior to March 2024 this target was known as
> `wasm32-wasi-preview1-threads`, and even longer before that it was known as
> `wasm32-wasi-threads`.

[wasi-threads]: https://github.com/WebAssembly/wasi-threads
[threads]: https://github.com/WebAssembly/threads
Expand All @@ -26,11 +30,11 @@ This target is cross-compiled. The target supports `std` fully.
The Rust target definition here is interesting in a few ways. We want to
serve two use cases here with this target:
* First, we want Rust usage of the target to be as hassle-free as possible,
ideally avoiding the need to configure and install a local wasm32-wasi-preview1-threads
ideally avoiding the need to configure and install a local wasm32-wasip1-threads
toolchain.
* Second, one of the primary use cases of LLVM's new wasm backend and the
wasm support in LLD is that any compiled language can interoperate with
any other. The `wasm32-wasi-preview1-threads` target is the first with a viable C
any other. The `wasm32-wasip1-threads` target is the first with a viable C
standard library and sysroot common definition, so we want Rust and C/C++
code to interoperate when compiled to `wasm32-unknown-unknown`.

Expand All @@ -49,7 +53,7 @@ some copied crt startup object files to ensure that you can download the
wasi target for Rust and you're off to the races, no further configuration
necessary.
All in all, by default, no external dependencies are required. You can
compile `wasm32-wasi-preview1-threads` binaries straight out of the box. You can't, however,
compile `wasm32-wasip1-threads` binaries straight out of the box. You can't, however,
reliably interoperate with C code in this mode (yet).
### Interop with C required
For the second goal we repurpose the `target-feature` flag, meaning that
Expand All @@ -59,18 +63,18 @@ you'll need to do a few things to have C/Rust code interoperate.
not be used.
2. If you're using rustc to build a linked artifact then you'll need to
specify `-C linker` to a `clang` binary that supports
`wasm32-wasi-preview1-threads` and is configured with the `wasm32-wasi-preview1-threads` sysroot. This
`wasm32-wasip1-threads` and is configured with the `wasm32-wasip1-threads` sysroot. This
will cause Rust code to be linked against the libc.a that the specified
`clang` provides.
3. If you're building a staticlib and integrating Rust code elsewhere, then
compiling with `-C target-feature=-crt-static` is all you need to do.

All in all, by default, no external dependencies are required. You can
compile `wasm32-wasi-preview1-threads` binaries straight out of the box. You can't, however,
compile `wasm32-wasip1-threads` binaries straight out of the box. You can't, however,
reliably interoperate with C code in this mode (yet).


Also note that at this time the `wasm32-wasi-preview1-threads` target assumes the
Also note that at this time the `wasm32-wasip1-threads` target assumes the
presence of other merged wasm proposals such as (with their LLVM feature flags):

* [Bulk memory] - `+bulk-memory`
Expand Down Expand Up @@ -106,7 +110,7 @@ https://github.com/WebAssembly/wasi-sdk/releases/tag/wasi-sdk-20
and specify path to *wasi-root* `.cargo/config.toml`

```toml
[target.wasm32-wasi-preview1-threads]
[target.wasm32-wasip1-threads]
wasi-root = ".../wasi-libc/sysroot"
```

Expand All @@ -118,13 +122,13 @@ After that users can build this by adding it to the `target` list in
From Rust Nightly 1.71.1 (2023-08-03) on the artifacts are shipped pre-compiled:

```text
rustup target add wasm32-wasi-preview1-threads --toolchain nightly
rustup target add wasm32-wasip1-threads --toolchain nightly
```

Rust programs can be built for that target:

```text
rustc --target wasm32-wasi-preview1-threads your-code.rs
rustc --target wasm32-wasip1-threads your-code.rs
```

## Cross-compilation
Expand All @@ -133,16 +137,16 @@ This target can be cross-compiled from any hosts.

## Testing

Currently testing is not well supported for `wasm32-wasi-preview1-threads` and the
Currently testing is not well supported for `wasm32-wasip1-threads` and the
Rust project doesn't run any tests for this target. However the UI testsuite can be run
manually following this instructions:

0. Ensure [wamr](https://github.com/bytecodealliance/wasm-micro-runtime), [wasmtime](https://github.com/bytecodealliance/wasmtime)
or another engine that supports `wasi-threads` is installed and can be found in the `$PATH` env variable.
1. Clone master branch.
2. Apply such [a change](https://github.com/g0djan/rust/compare/godjan/wasi-threads...g0djan:rust:godjan/wasi-run-ui-tests?expand=1) with an engine from the step 1.
3. Run `./x.py test --target wasm32-wasi-preview1-threads tests/ui` and save the list of failed tests.
3. Run `./x.py test --target wasm32-wasip1-threads tests/ui` and save the list of failed tests.
4. Checkout branch with your changes.
5. Apply such [a change](https://github.com/g0djan/rust/compare/godjan/wasi-threads...g0djan:rust:godjan/wasi-run-ui-tests?expand=1) with an engine from the step 1.
6. Run `./x.py test --target wasm32-wasi-preview1-threads tests/ui` and save the list of failed tests.
6. Run `./x.py test --target wasm32-wasip1-threads tests/ui` and save the list of failed tests.
7. For both lists of failed tests run `cat list | sort > sorted_list` and compare it with `diff sorted_list1 sorted_list2`.
2 changes: 1 addition & 1 deletion src/doc/rustc/src/platform-support/wasm32-wasip1.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ this target are:

This target is cross-compiled. The target includes support for `std` itself,
but not all of the standard library works. For example spawning a thread will
always return an error (see the `wasm32-wasi-preview1-threads` target for
always return an error (see the `wasm32-wasip1-threads` target for
example). Another example is that spawning a process will always return an
error. Operations such as opening a file, however, will be implemented by
calling WASI-defined APIs.
Expand Down
2 changes: 1 addition & 1 deletion src/tools/build-manifest/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ static TARGETS: &[&str] = &[
"wasm32-unknown-unknown",
"wasm32-wasi",
"wasm32-wasip1",
"wasm32-wasi-preview1-threads",
"wasm32-wasip1-threads",
"x86_64-apple-darwin",
"x86_64-apple-ios",
"x86_64-fortanix-unknown-sgx",
Expand Down
Loading
Loading