[wasm-ctor-eval] Do not error on non-constant code in the start function (#8778)
Before, we did not catch the Nonconstant exception.
diff --git a/src/tools/wasm-ctor-eval.cpp b/src/tools/wasm-ctor-eval.cpp
index 0dbeb57..b503b0a 100644
--- a/src/tools/wasm-ctor-eval.cpp
+++ b/src/tools/wasm-ctor-eval.cpp
@@ -1485,11 +1485,16 @@
}
}
} catch (FailToEvalException& fail) {
- // that's it, we failed to even create the instance
+ // That's it, we failed to even create the instance.
if (!quiet) {
std::cout << " ...stopping since could not create module instance: "
<< fail.why << "\n";
}
+ } catch (NonconstantException& fail) {
+ // We can also fail during start due to a non-constant operation.
+ if (!quiet) {
+ std::cout << " ...stopping since non-constant in start\n";
+ }
} catch (TopologicalSort::CycleException e) {
// We use a topological sort for GC globals. If there is a non-breakable
// cycle there, we will hit an error (we can break cycles in nullable and
diff --git a/test/lit/ctor-eval/start-nonconstant.wast b/test/lit/ctor-eval/start-nonconstant.wast
new file mode 100644
index 0000000..4d6baa6
--- /dev/null
+++ b/test/lit/ctor-eval/start-nonconstant.wast
@@ -0,0 +1,38 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
+;; RUN: foreach %s %t wasm-ctor-eval --ctors=test --kept-exports=test --quiet -all -S -o - | filecheck %s
+
+;; A non-constant (relaxed SIMD) operation in the start function. We should not
+;; error.
+(module
+ ;; CHECK: (type $0 (func (param v128)))
+
+ ;; CHECK: (type $1 (func))
+
+ ;; CHECK: (import "a" "b" (func $import (type $0) (param v128)))
+ (import "a" "b" (func $import (param v128)))
+
+ ;; CHECK: (export "test" (func $0))
+ (export "test" (func $0))
+
+ ;; CHECK: (start $0)
+ (start $0)
+
+ ;; CHECK: (func $0 (type $1)
+ ;; CHECK-NEXT: (call $import
+ ;; CHECK-NEXT: (f32x4.relaxed_min
+ ;; CHECK-NEXT: (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)
+ ;; CHECK-NEXT: (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $0
+ ;; The import avoids vacuum from removing the entire body.
+ (call $import
+ (f32x4.relaxed_min
+ (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)
+ (v128.const i32x4 0x00000000 0x00000000 0x00000000 0x00000000)
+ )
+ )
+ )
+)
+