diff --git a/CHANGELOG.md b/CHANGELOG.md index 3670036052..5ff02af0f3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ # UNRELEASED +### feat: Wasm optimization failure issues a warning instead of error + +The optimization functionality provided by `ic_wasm::optimize" cannot handle Wasm modules that contains 64-bit table. +Instead of blocking the build, such optimization failure will issue a warning. + ### Frontend canister Sets the `ic_env` cookie for all HTML files only if the canister environment changed in the `commit_batch` method. diff --git a/e2e/assets/memory64/dfx.json b/e2e/assets/memory64/dfx.json index 6a658fd247..02b44e2852 100644 --- a/e2e/assets/memory64/dfx.json +++ b/e2e/assets/memory64/dfx.json @@ -5,7 +5,7 @@ "type": "custom", "candid": "empty.did", "wasm": "m64.wasm", - "build": "echo \"generated from (module (memory i64 0 0))\"", + "build": "echo \"generated from (module (memory i64 0 0) (table i64 1 10 funcref))\"", "shrink": true, "optimize": "Oz", "gzip": true diff --git a/e2e/assets/memory64/m64.wasm b/e2e/assets/memory64/m64.wasm index c4a07fdf15..421146f1eb 100644 Binary files a/e2e/assets/memory64/m64.wasm and b/e2e/assets/memory64/m64.wasm differ diff --git a/e2e/tests-dfx/build.bash b/e2e/tests-dfx/build.bash index 340ab800c0..df611a5650 100644 --- a/e2e/tests-dfx/build.bash +++ b/e2e/tests-dfx/build.bash @@ -370,4 +370,7 @@ teardown() { @test "dfx build can post-process memory64 Wasm module" { install_asset memory64 assert_command dfx build --check + # the module contains table64 which is not supported by ic_wasm::optimize + # optimization failure doesn't fail the build, but a warning is issued + assert_contains "WARN: Failed to optimize the Wasm module:" } diff --git a/src/dfx/src/lib/models/canister.rs b/src/dfx/src/lib/models/canister.rs index 717ba6c33a..87e060e341 100644 --- a/src/dfx/src/lib/models/canister.rs +++ b/src/dfx/src/lib/models/canister.rs @@ -153,9 +153,20 @@ impl Canister { // optimize or shrink if let Some(level) = info.get_optimize() { trace!(logger, "Optimizing Wasm at level {}", level); - ic_wasm::optimize::optimize(&mut m, &wasm_opt_level_convert(level), false, &None, true) - .context("Failed to optimize the Wasm module.")?; - modified = true; + match ic_wasm::optimize::optimize( + &mut m, + &wasm_opt_level_convert(level), + false, + &None, + true, + ) { + Ok(()) => { + modified = true; + } + Err(e) => { + warn!(logger, "Failed to optimize the Wasm module: {}", e); + } + } } else if info.get_shrink() == Some(true) || (info.get_shrink().is_none() && (info.is_rust() || info.is_motoko())) {