diff --git a/cranelift/codegen/src/ir/extfunc.rs b/cranelift/codegen/src/ir/extfunc.rs index ab79bb5ea0..42030b2e9d 100644 --- a/cranelift/codegen/src/ir/extfunc.rs +++ b/cranelift/codegen/src/ir/extfunc.rs @@ -88,16 +88,6 @@ impl Signature { .count() } - /// Count the number of normal parameters in a signature. - /// Exclude special-purpose parameters that represent runtime stuff and not WebAssembly - /// arguments. - pub fn num_normal_params(&self) -> usize { - self.params - .iter() - .filter(|arg| arg.purpose == ArgumentPurpose::Normal) - .count() - } - /// Does this signature take an struct return pointer parameter? pub fn uses_struct_return_param(&self) -> bool { self.uses_special_param(ArgumentPurpose::StructReturn) diff --git a/cranelift/wasm/src/environ/dummy.rs b/cranelift/wasm/src/environ/dummy.rs index cb6d78e9f9..6b6f210166 100644 --- a/cranelift/wasm/src/environ/dummy.rs +++ b/cranelift/wasm/src/environ/dummy.rs @@ -201,10 +201,6 @@ impl<'dummy_environment> TargetEnvironment for DummyFuncEnvironment<'dummy_envir } impl<'dummy_environment> FuncEnvironment for DummyFuncEnvironment<'dummy_environment> { - fn is_wasm_parameter(&self, func: &ir::Function, index: usize) -> bool { - func.signature.params[index].purpose == ir::ArgumentPurpose::Normal - } - fn return_mode(&self) -> ReturnMode { self.return_mode } diff --git a/cranelift/wasm/src/environ/spec.rs b/cranelift/wasm/src/environ/spec.rs index 71f22c8b39..74dd1e8441 100644 --- a/cranelift/wasm/src/environ/spec.rs +++ b/cranelift/wasm/src/environ/spec.rs @@ -140,7 +140,9 @@ pub trait TargetEnvironment { pub trait FuncEnvironment: TargetEnvironment { /// Is the given parameter of the given function a wasm-level parameter, as opposed to a hidden /// parameter added for use by the implementation? - fn is_wasm_parameter(&self, func: &ir::Function, index: usize) -> bool; + fn is_wasm_parameter(&self, signature: &ir::Signature, index: usize) -> bool { + signature.params[index].purpose == ir::ArgumentPurpose::Normal + } /// Should the code be structured to use a single `fallthrough_return` instruction at the end /// of the function body, rather than `return` instructions as needed? This is used by VMs diff --git a/cranelift/wasm/src/func_translator.rs b/cranelift/wasm/src/func_translator.rs index 2e7c1bc766..f7ac10cfc3 100644 --- a/cranelift/wasm/src/func_translator.rs +++ b/cranelift/wasm/src/func_translator.rs @@ -135,7 +135,7 @@ fn declare_wasm_parameters( let param_type = builder.func.signature.params[i]; // There may be additional special-purpose parameters in addition to the normal WebAssembly // signature parameters. For example, a `vmctx` pointer. - if environ.is_wasm_parameter(&builder.func, i) { + if environ.is_wasm_parameter(&builder.func.signature, i) { // This is a normal WebAssembly signature parameter, so create a local for it. let local = Variable::new(next_local); builder.declare_var(local, param_type.value_type); diff --git a/cranelift/wasm/src/state/func_state.rs b/cranelift/wasm/src/state/func_state.rs index 98f75e6bc9..0ea0e13ea9 100644 --- a/cranelift/wasm/src/state/func_state.rs +++ b/cranelift/wasm/src/state/func_state.rs @@ -474,7 +474,7 @@ impl FuncTranslationState { Occupied(entry) => Ok(*entry.get()), Vacant(entry) => { let sig = environ.make_indirect_sig(func, index)?; - Ok(*entry.insert((sig, func.dfg.signatures[sig].num_normal_params()))) + Ok(*entry.insert((sig, num_wasm_parameters(environ, &func.dfg.signatures[sig])))) } } } @@ -495,8 +495,20 @@ impl FuncTranslationState { Vacant(entry) => { let fref = environ.make_direct_func(func, index)?; let sig = func.dfg.ext_funcs[fref].signature; - Ok(*entry.insert((fref, func.dfg.signatures[sig].num_normal_params()))) + Ok(*entry.insert(( + fref, + num_wasm_parameters(environ, &func.dfg.signatures[sig]), + ))) } } } } + +fn num_wasm_parameters( + environ: &FE, + signature: &ir::Signature, +) -> usize { + (0..signature.params.len()) + .filter(|index| environ.is_wasm_parameter(signature, *index)) + .count() +}