diff options
| -rw-r--r-- | patio-to-cranelift/src/codegen/context.rs | 7 | ||||
| -rw-r--r-- | patio-to-cranelift/src/codegen/mod.rs | 16 |
2 files changed, 20 insertions, 3 deletions
diff --git a/patio-to-cranelift/src/codegen/context.rs b/patio-to-cranelift/src/codegen/context.rs index cf6bed84..ddd50492 100644 --- a/patio-to-cranelift/src/codegen/context.rs +++ b/patio-to-cranelift/src/codegen/context.rs @@ -217,8 +217,11 @@ impl<'a> CompilerFunctionContext<'a> { } pub(crate) fn seal_current_block(&mut self) { - self.function_builder - .seal_block(self.function_builder.current_block().unwrap()); + self.function_builder.seal_block(self.current_block()); + } + + pub(crate) fn current_block(&self) -> cranelift_codegen::ir::Block { + self.function_builder.current_block().unwrap() } pub(crate) fn block_call( diff --git a/patio-to-cranelift/src/codegen/mod.rs b/patio-to-cranelift/src/codegen/mod.rs index 9b37e3b5..85fbae6c 100644 --- a/patio-to-cranelift/src/codegen/mod.rs +++ b/patio-to-cranelift/src/codegen/mod.rs @@ -195,6 +195,14 @@ fn define_function_definition( &function_definition.name, cranelift_signature, |function_context| { + let block_params: Vec<_> = function_context + .function_builder + .block_params(function_context.current_block()) + .iter() + .copied() + .collect(); + let mut block_params_iter = block_params.iter(); + for local in &function_definition.locals { let cranelift_type = types::patio_type_to_cranelift_type( local.type_, @@ -202,7 +210,13 @@ fn define_function_definition( ); match local.local_type { - PatioLocalType::Param | PatioLocalType::Val => { + PatioLocalType::Param => { + function_context.declare_local(&local.name, cranelift_type); + function_context + .local_store(&local.name, *block_params_iter.next().unwrap()); + } + + PatioLocalType::Val => { function_context.declare_local(&local.name, cranelift_type); } |
