aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--patio-to-cranelift/src/codegen/context.rs7
-rw-r--r--patio-to-cranelift/src/codegen/mod.rs16
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);
}