diff --git a/src/Config.cs b/src/Config.cs index 3e8e000..9977178 100644 --- a/src/Config.cs +++ b/src/Config.cs @@ -221,6 +221,25 @@ public Config WithCraneliftDebugVerifier(bool enable) return this; } + /// + /// Configures whether Cranelift should perform a NaN-canonicalization pass. + /// + /// When Cranelift is used as a code generation backend this will configure + /// it to replace NaNs with a single canonical value.This is useful for users + /// requiring entirely deterministic WebAssembly computation. + /// + /// This is not required by the WebAssembly spec, so it is not enabled by default. + /// + /// The default value for this is `false` + /// + /// True to enable the Cranelift nan canonicalization or false to disable. + /// Returns the current config. + public Config WithCraneliftNaNCanonicalization(bool enable) + { + Native.wasmtime_config_cranelift_nan_canonicalization_set(handle, enable); + return this; + } + /// /// Sets the optimization level to use. /// @@ -388,6 +407,9 @@ private static class Native [DllImport(Engine.LibraryName)] public static extern void wasmtime_config_cranelift_debug_verifier_set(Handle config, bool enable); + [DllImport(Engine.LibraryName)] + public static extern void wasmtime_config_cranelift_nan_canonicalization_set(Handle config, bool enable); + [DllImport(Engine.LibraryName)] public static extern void wasmtime_config_cranelift_opt_level_set(Handle config, byte level); diff --git a/tests/ConfigTests.cs b/tests/ConfigTests.cs index f6f189e..a97ee51 100644 --- a/tests/ConfigTests.cs +++ b/tests/ConfigTests.cs @@ -35,5 +35,15 @@ public void ItSetsOptimizationLevel() using var engine = new Engine(config); } + + [Fact] + public void ItSetsNanCanonicalization() + { + var config = new Config(); + + config.WithCraneliftNaNCanonicalization(true); + + using var engine = new Engine(config); + } } }