summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2021-10-28 10:58:16 -0700
committerAlex Crichton <alex@alexcrichton.com>2021-11-10 08:35:42 -0800
commit7f3ffbc8c22d0084987966b0496a63ce4d6278d5 (patch)
treea1c4eda31c419cbfdc47be846ef4dc4d5743d12c
parent68ca579406f2fa9ec62710e4a4d5d3e07a168d3c (diff)
downloadrust-7f3ffbc8c22d0084987966b0496a63ce4d6278d5.tar.gz
std: Get the standard library compiling for wasm64
This commit goes through and updates various `#[cfg]` as appropriate to get the wasm64-unknown-unknown target behaving similarly to the wasm32-unknown-unknown target. Most of this is just updating various conditions for `target_arch = "wasm32"` to also account for `target_arch = "wasm64"` where appropriate. This commit also lists `wasm64` as an allow-listed architecture to not have the `restricted_std` feature enabled, enabling experimentation with `-Z build-std` externally. The main goal of this commit is to enable playing around with `wasm64-unknown-unknown` externally via `-Z build-std` in a way that's similar to the `wasm32-unknown-unknown` target. These targets are effectively the same and only differ in their pointer size, but wasm64 is much newer and has much less ecosystem/library support so it'll still take time to get wasm64 fully-fledged.
-rw-r--r--compiler/rustc_target/src/spec/wasm64_unknown_unknown.rs9
-rw-r--r--library/core/src/ffi.rs6
-rw-r--r--library/panic_abort/src/lib.rs3
-rw-r--r--library/panic_unwind/src/dummy.rs4
-rw-r--r--library/panic_unwind/src/lib.rs1
-rw-r--r--library/std/Cargo.toml2
-rw-r--r--library/std/build.rs1
-rw-r--r--library/std/src/sys/common/alloc.rs3
-rw-r--r--library/std/src/sys/mod.rs2
-rw-r--r--library/std/src/sys/wasm/alloc.rs4
-rw-r--r--library/std/src/sys_common/mod.rs1
-rw-r--r--library/std/src/thread/local.rs22
-rw-r--r--library/std/src/thread/mod.rs5
13 files changed, 41 insertions, 22 deletions
diff --git a/compiler/rustc_target/src/spec/wasm64_unknown_unknown.rs b/compiler/rustc_target/src/spec/wasm64_unknown_unknown.rs
index fb6526c0e72..7eacbb43640 100644
--- a/compiler/rustc_target/src/spec/wasm64_unknown_unknown.rs
+++ b/compiler/rustc_target/src/spec/wasm64_unknown_unknown.rs
@@ -23,11 +23,10 @@ pub fn target() -> Target {
// For now this target just never has an entry symbol no matter the output
// type, so unconditionally pass this.
clang_args.push("-Wl,--no-entry".to_string());
- options
- .pre_link_args
- .get_mut(&LinkerFlavor::Lld(LldFlavor::Wasm))
- .unwrap()
- .push("--no-entry".to_string());
+
+ let lld_args = options.pre_link_args.get_mut(&LinkerFlavor::Lld(LldFlavor::Wasm)).unwrap();
+ lld_args.push("--no-entry".to_string());
+ lld_args.push("-mwasm64".to_string());
Target {
llvm_target: "wasm64-unknown-unknown".to_string(),
diff --git a/library/core/src/ffi.rs b/library/core/src/ffi.rs
index b208ddd4b27..ea3de680afe 100644
--- a/library/core/src/ffi.rs
+++ b/library/core/src/ffi.rs
@@ -63,6 +63,7 @@ impl fmt::Debug for c_void {
all(not(target_arch = "aarch64"), not(target_arch = "powerpc"), not(target_arch = "x86_64")),
all(target_arch = "aarch64", any(target_os = "macos", target_os = "ios")),
target_arch = "wasm32",
+ target_arch = "wasm64",
target_arch = "asmjs",
windows
))]
@@ -86,6 +87,7 @@ pub struct VaListImpl<'f> {
all(not(target_arch = "aarch64"), not(target_arch = "powerpc"), not(target_arch = "x86_64")),
all(target_arch = "aarch64", any(target_os = "macos", target_os = "ios")),
target_arch = "wasm32",
+ target_arch = "wasm64",
target_arch = "asmjs",
windows
))]
@@ -186,6 +188,7 @@ pub struct VaList<'a, 'f: 'a> {
),
all(target_arch = "aarch64", any(target_os = "macos", target_os = "ios")),
target_arch = "wasm32",
+ target_arch = "wasm64",
target_arch = "asmjs",
windows
))]
@@ -195,6 +198,7 @@ pub struct VaList<'a, 'f: 'a> {
any(target_arch = "aarch64", target_arch = "powerpc", target_arch = "x86_64"),
any(not(target_arch = "aarch64"), not(any(target_os = "macos", target_os = "ios"))),
not(target_arch = "wasm32"),
+ not(target_arch = "wasm64"),
not(target_arch = "asmjs"),
not(windows)
))]
@@ -207,6 +211,7 @@ pub struct VaList<'a, 'f: 'a> {
all(not(target_arch = "aarch64"), not(target_arch = "powerpc"), not(target_arch = "x86_64")),
all(target_arch = "aarch64", any(target_os = "macos", target_os = "ios")),
target_arch = "wasm32",
+ target_arch = "wasm64",
target_arch = "asmjs",
windows
))]
@@ -228,6 +233,7 @@ impl<'f> VaListImpl<'f> {
any(target_arch = "aarch64", target_arch = "powerpc", target_arch = "x86_64"),
any(not(target_arch = "aarch64"), not(any(target_os = "macos", target_os = "ios"))),
not(target_arch = "wasm32"),
+ not(target_arch = "wasm64"),
not(target_arch = "asmjs"),
not(windows)
))]
diff --git a/library/panic_abort/src/lib.rs b/library/panic_abort/src/lib.rs
index ac75ce7f221..d31df0da364 100644
--- a/library/panic_abort/src/lib.rs
+++ b/library/panic_abort/src/lib.rs
@@ -117,7 +117,8 @@ pub unsafe extern "C-unwind" fn __rust_start_panic(_payload: *mut &mut dyn BoxMe
pub mod personalities {
#[rustc_std_internal_symbol]
#[cfg(not(any(
- all(target_arch = "wasm32", not(target_os = "emscripten"),),
+ all(target_arch = "wasm32", not(target_os = "emscripten")),
+ all(target_arch = "wasm64", not(target_os = "emscripten")),
all(target_os = "windows", target_env = "gnu", target_arch = "x86_64",),
)))]
pub extern "C" fn rust_eh_personality() {}
diff --git a/library/panic_unwind/src/dummy.rs b/library/panic_unwind/src/dummy.rs
index 4667ede2baa..a4bcd216c60 100644
--- a/library/panic_unwind/src/dummy.rs
+++ b/library/panic_unwind/src/dummy.rs
@@ -1,6 +1,6 @@
-//! Unwinding for *wasm32* target.
+//! Unwinding for unsupported target.
//!
-//! Right now we don't support this, so this is just stubs.
+//! Stubs that simply abort for targets that don't support unwinding otherwise.
use alloc::boxed::Box;
use core::any::Any;
diff --git a/library/panic_unwind/src/lib.rs b/library/panic_unwind/src/lib.rs
index b5d0ca2572c..4815249f7d5 100644
--- a/library/panic_unwind/src/lib.rs
+++ b/library/panic_unwind/src/lib.rs
@@ -57,6 +57,7 @@ cfg_if::cfg_if! {
} else {
// Targets that don't support unwinding.
// - arch=wasm32
+ // - arch=wasm64
// - os=none ("bare metal" targets)
// - os=uefi
// - os=espidf
diff --git a/library/std/Cargo.toml b/library/std/Cargo.toml
index 248ecdf4bef..85658bf9e3c 100644
--- a/library/std/Cargo.toml
+++ b/library/std/Cargo.toml
@@ -35,7 +35,7 @@ features = ['read_core', 'elf', 'macho', 'pe', 'unaligned', 'archive']
[dev-dependencies]
rand = "0.7"
-[target.'cfg(any(all(target_arch = "wasm32", not(target_os = "emscripten")), all(target_vendor = "fortanix", target_env = "sgx")))'.dependencies]
+[target.'cfg(any(all(any(target_arch = "wasm32", target_arch = "wasm64"), not(target_os = "emscripten")), all(target_vendor = "fortanix", target_env = "sgx")))'.dependencies]
dlmalloc = { version = "0.2.1", features = ['rustc-dep-of-std'] }
[target.x86_64-fortanix-unknown-sgx.dependencies]
diff --git a/library/std/build.rs b/library/std/build.rs
index cc7184d57f1..43168e77296 100644
--- a/library/std/build.rs
+++ b/library/std/build.rs
@@ -25,6 +25,7 @@ fn main() {
|| target.contains("haiku")
|| target.contains("vxworks")
|| target.contains("wasm32")
+ || target.contains("wasm64")
|| target.contains("asmjs")
|| target.contains("espidf")
|| target.contains("solid")
diff --git a/library/std/src/sys/common/alloc.rs b/library/std/src/sys/common/alloc.rs
index 576667c0173..9665d1fa892 100644
--- a/library/std/src/sys/common/alloc.rs
+++ b/library/std/src/sys/common/alloc.rs
@@ -24,7 +24,8 @@ pub const MIN_ALIGN: usize = 8;
target_arch = "mips64",
target_arch = "s390x",
target_arch = "sparc64",
- target_arch = "riscv64"
+ target_arch = "riscv64",
+ target_arch = "wasm64",
)))]
pub const MIN_ALIGN: usize = 16;
diff --git a/library/std/src/sys/mod.rs b/library/std/src/sys/mod.rs
index 8b8be6ebc2f..38f45fef918 100644
--- a/library/std/src/sys/mod.rs
+++ b/library/std/src/sys/mod.rs
@@ -40,7 +40,7 @@ cfg_if::cfg_if! {
} else if #[cfg(target_os = "wasi")] {
mod wasi;
pub use self::wasi::*;
- } else if #[cfg(target_arch = "wasm32")] {
+ } else if #[cfg(any(target_arch = "wasm32", target_arch = "wasm64"))] {
mod wasm;
pub use self::wasm::*;
} else if #[cfg(all(target_vendor = "fortanix", target_env = "sgx"))] {
diff --git a/library/std/src/sys/wasm/alloc.rs b/library/std/src/sys/wasm/alloc.rs
index ef0ca3dd478..bf5dc0273c0 100644
--- a/library/std/src/sys/wasm/alloc.rs
+++ b/library/std/src/sys/wasm/alloc.rs
@@ -1,8 +1,8 @@
-//! This is an implementation of a global allocator on the wasm32 platform when
+//! This is an implementation of a global allocator on the wasm platform when
//! emscripten is not in use. In that situation there's no actual runtime for us
//! to lean on for allocation, so instead we provide our own!
//!
-//! The wasm32 instruction set has two instructions for getting the current
+//! The wasm instruction set has two instructions for getting the current
//! amount of memory and growing the amount of memory. These instructions are the
//! foundation on which we're able to build an allocator, so we do so! Note that
//! the instructions are also pretty "global" and this is the "global" allocator
diff --git a/library/std/src/sys_common/mod.rs b/library/std/src/sys_common/mod.rs
index 5a5913ebd79..0f2a8cd0012 100644
--- a/library/std/src/sys_common/mod.rs
+++ b/library/std/src/sys_common/mod.rs
@@ -41,6 +41,7 @@ cfg_if::cfg_if! {
target_os = "hermit",
feature = "restricted-std",
all(target_arch = "wasm32", not(target_os = "emscripten")),
+ all(target_arch = "wasm64", not(target_os = "emscripten")),
all(target_vendor = "fortanix", target_env = "sgx")))] {
pub use crate::sys::net;
} else {
diff --git a/library/std/src/thread/local.rs b/library/std/src/thread/local.rs
index c53290ec0c7..37f9cc40be6 100644
--- a/library/std/src/thread/local.rs
+++ b/library/std/src/thread/local.rs
@@ -172,7 +172,7 @@ macro_rules! __thread_local_inner {
//
// FIXME(#84224) this should come after the `target_thread_local`
// block.
- #[cfg(all(target_arch = "wasm32", not(target_feature = "atomics")))]
+ #[cfg(all(any(target_arch = "wasm32", target_arch = "wasm64"), not(target_feature = "atomics")))]
{
static mut VAL: $t = $init;
Some(&VAL)
@@ -181,7 +181,10 @@ macro_rules! __thread_local_inner {
// If the platform has support for `#[thread_local]`, use it.
#[cfg(all(
target_thread_local,
- not(all(target_arch = "wasm32", not(target_feature = "atomics"))),
+ not(all(
+ any(target_arch = "wasm32", target_arch = "wasm64"),
+ not(target_feature = "atomics"),
+ )),
))]
{
// If a dtor isn't needed we can do something "very raw" and
@@ -238,7 +241,10 @@ macro_rules! __thread_local_inner {
// same implementation as below for os thread locals.
#[cfg(all(
not(target_thread_local),
- not(all(target_arch = "wasm32", not(target_feature = "atomics"))),
+ not(all(
+ any(target_arch = "wasm32", target_arch = "wasm64"),
+ not(target_feature = "atomics"),
+ )),
))]
{
#[inline]
@@ -285,21 +291,21 @@ macro_rules! __thread_local_inner {
// The issue of "should enable on Windows sometimes" is #84933
#[cfg_attr(not(windows), inline)]
unsafe fn __getit() -> $crate::option::Option<&'static $t> {
- #[cfg(all(target_arch = "wasm32", not(target_feature = "atomics")))]
+ #[cfg(all(any(target_arch = "wasm32", target_arch = "wasm64"), not(target_feature = "atomics")))]
static __KEY: $crate::thread::__StaticLocalKeyInner<$t> =
$crate::thread::__StaticLocalKeyInner::new();
#[thread_local]
#[cfg(all(
target_thread_local,
- not(all(target_arch = "wasm32", not(target_feature = "atomics"))),
+ not(all(any(target_arch = "wasm32", target_arch = "wasm64"), not(target_feature = "atomics"))),
))]
static __KEY: $crate::thread::__FastLocalKeyInner<$t> =
$crate::thread::__FastLocalKeyInner::new();
#[cfg(all(
not(target_thread_local),
- not(all(target_arch = "wasm32", not(target_feature = "atomics"))),
+ not(all(any(target_arch = "wasm32", target_arch = "wasm64"), not(target_feature = "atomics"))),
))]
static __KEY: $crate::thread::__OsLocalKeyInner<$t> =
$crate::thread::__OsLocalKeyInner::new();
@@ -479,10 +485,10 @@ mod lazy {
}
}
-/// On some platforms like wasm32 there's no threads, so no need to generate
+/// On some platforms like wasm there's no threads, so no need to generate
/// thread locals and we can instead just use plain statics!
#[doc(hidden)]
-#[cfg(all(target_arch = "wasm32", not(target_feature = "atomics")))]
+#[cfg(all(any(target_arch = "wasm32", target_arch = "wasm64"), not(target_feature = "atomics")))]
pub mod statik {
use super::lazy::LazyKeyInner;
use crate::fmt;
diff --git a/library/std/src/thread/mod.rs b/library/std/src/thread/mod.rs
index 2a155ce3117..41f7bf55f22 100644
--- a/library/std/src/thread/mod.rs
+++ b/library/std/src/thread/mod.rs
@@ -200,7 +200,10 @@ pub use self::local::fast::Key as __FastLocalKeyInner;
#[doc(hidden)]
pub use self::local::os::Key as __OsLocalKeyInner;
#[unstable(feature = "libstd_thread_internals", issue = "none")]
-#[cfg(all(target_arch = "wasm32", not(target_feature = "atomics")))]
+#[cfg(all(
+ any(target_arch = "wasm32", target_arch = "wasm64"),
+ not(target_feature = "atomics")
+))]
#[doc(hidden)]
pub use self::local::statik::Key as __StaticLocalKeyInner;