diff --git a/Cargo.lock b/Cargo.lock index 1de88b5aea0..5b91c9db119 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7106,6 +7106,7 @@ dependencies = [ "gear-wasm-instrument", "log", "regex", + "rustc_version 0.4.0", "wabt", "wasm-opt", "wasmi 0.14.0", diff --git a/utils/wasm-optimizer/Cargo.toml b/utils/wasm-optimizer/Cargo.toml index 4da3ea0d921..01f1bca7252 100644 --- a/utils/wasm-optimizer/Cargo.toml +++ b/utils/wasm-optimizer/Cargo.toml @@ -16,6 +16,7 @@ gear-wasm-instrument.workspace = true pwasm-utils = { workspace = true, features = ["sign_ext"] } wasm-opt = { workspace = true, optional = true } regex.workspace = true +rustc_version.workspace = true log.workspace = true wasmparser.workspace = true which.workspace = true diff --git a/utils/wasm-optimizer/src/cargo_command.rs b/utils/wasm-optimizer/src/cargo_command.rs index 994ca4a84ee..0ef2b2c6261 100644 --- a/utils/wasm-optimizer/src/cargo_command.rs +++ b/utils/wasm-optimizer/src/cargo_command.rs @@ -32,21 +32,34 @@ pub struct CargoCommand { toolchain: Toolchain, check_recommended_toolchain: bool, force_recommended_toolchain: bool, + force_wasm_mvp: bool, } impl CargoCommand { /// Initialize new cargo command. pub fn new() -> CargoCommand { + let toolchain = Toolchain::try_from_rustup().expect("Failed to get toolchain from rustup"); + let rustc_version = rustc_version::version().expect("Failed to get rustc version"); + let force_wasm_mvp = toolchain != Toolchain::recommended_nightly() + && rustc_version.major == 1 + && rustc_version.minor >= 82; + CargoCommand { path: "rustup".to_string(), manifest_path: "Cargo.toml".into(), profile: "dev".to_string(), - rustc_flags: vec!["-C", "link-arg=--import-memory", "-C", "linker-plugin-lto"], + rustc_flags: if force_wasm_mvp { + // -C linker-plugin-lto causes conflict: https://github.com/rust-lang/rust/issues/130604 + vec!["-C", "link-arg=--import-memory"] + } else { + vec!["-C", "link-arg=--import-memory", "-C", "linker-plugin-lto"] + }, target_dir: "target".into(), features: vec![], - toolchain: Toolchain::try_from_rustup().expect("Failed to get toolchain from rustup"), + toolchain, check_recommended_toolchain: false, force_recommended_toolchain: false, + force_wasm_mvp, } } } @@ -117,6 +130,10 @@ impl CargoCommand { .arg("--profile") .arg(&self.profile); + if self.force_wasm_mvp { + cargo.arg("-Zbuild-std=core,alloc,panic_abort"); + } + if !self.features.is_empty() { cargo.arg("--features"); cargo.arg(self.features.join(",")); @@ -130,6 +147,13 @@ impl CargoCommand { self.remove_cargo_encoded_rustflags(&mut cargo); + if self.force_wasm_mvp { + cargo.env("CARGO_ENCODED_RUSTFLAGS", "-Ctarget-cpu=mvp"); + if !self.toolchain.is_nightly() { + cargo.env("RUSTC_BOOTSTRAP", "1"); + } + } + let status = cargo.status().context("unable to execute cargo command")?; ensure!( status.success(), diff --git a/utils/wasm-optimizer/src/cargo_toolchain.rs b/utils/wasm-optimizer/src/cargo_toolchain.rs index cfe33321366..3c9bdc47d67 100644 --- a/utils/wasm-optimizer/src/cargo_toolchain.rs +++ b/utils/wasm-optimizer/src/cargo_toolchain.rs @@ -101,4 +101,9 @@ impl Toolchain { ); Ok(()) } + + /// Returns bool representing nightly toolchain. + pub fn is_nightly(&self) -> bool { + self.0.starts_with("nightly") + } }