aboutsummaryrefslogtreecommitdiff
path: root/patio-to-cranelift
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-07 19:58:08 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-07 20:36:45 +0100
commitffcf99fabf00f21ee48f82c913e2ad06b3b0c395 (patch)
treeec780a86566fd55ce57ad1f4f9cf1eeeec7e5cbe /patio-to-cranelift
parent59b5294ffd1b5bf299f07cc0a586d67464a26cc3 (diff)
Return multiple values from Patio functions
Diffstat (limited to 'patio-to-cranelift')
-rw-r--r--patio-to-cranelift/src/codegen/mod.rs36
-rw-r--r--patio-to-cranelift/src/codegen/types.rs2
-rw-r--r--patio-to-cranelift/src/patio/compilation_unit.rs4
-rw-r--r--patio-to-cranelift/src/patio/flatbuffers.rs15
-rw-r--r--patio-to-cranelift/src/patio/instructions.rs5
-rw-r--r--patio-to-cranelift/src/patio/types.rs1
6 files changed, 24 insertions, 39 deletions
diff --git a/patio-to-cranelift/src/codegen/mod.rs b/patio-to-cranelift/src/codegen/mod.rs
index bfa9a82a..97414753 100644
--- a/patio-to-cranelift/src/codegen/mod.rs
+++ b/patio-to-cranelift/src/codegen/mod.rs
@@ -19,8 +19,8 @@ use crate::{
PatioBlock, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf,
PatioInstruction, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub,
PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioLoop, PatioLoopBreak,
- PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioReturn, PatioReturnVoid,
- PatioSwitch, PatioUnreachable, PatioVarLoad, PatioVarStore,
+ PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioReturn, PatioSwitch,
+ PatioUnreachable, PatioVarLoad, PatioVarStore,
},
operands::{PatioLocalRef, PatioOperand},
types::PatioType,
@@ -200,7 +200,7 @@ fn declare_function_declaration(
) {
let cranelift_signature = cranelift_signature(
function_declaration.params.iter(),
- function_declaration.return_type,
+ function_declaration.return_types.iter(),
&context.target_triple,
);
@@ -216,8 +216,8 @@ fn declare_function_definition(
context: &mut CompilerContext,
) {
let cranelift_signature = cranelift_signature(
- function_definition.locals.iter().map(Into::into),
- function_definition.return_type,
+ function_definition.locals.iter(),
+ function_definition.return_types.iter(),
&context.target_triple,
);
@@ -235,8 +235,8 @@ fn define_function_definition(
context: &mut CompilerContext,
) {
let cranelift_signature = cranelift_signature(
- function_definition.locals.iter().map(Into::into),
- function_definition.return_type,
+ function_definition.locals.iter(),
+ function_definition.return_types.iter(),
&context.target_triple,
);
@@ -360,10 +360,6 @@ fn compile_instruction(instruction: &PatioInstruction, context: &mut CompilerFun
compile_return(return_, context);
}
- PatioInstruction::ReturnVoid(return_void) => {
- compile_return_void(return_void, context);
- }
-
PatioInstruction::Switch(switch) => {
compile_switch(switch, context);
}
@@ -682,13 +678,13 @@ fn compile_memory_store(
}
fn compile_return(return_: &PatioReturn, context: &mut CompilerFunctionContext<'_>) {
- let cranelift_value = compile_operand(&return_.value, context);
-
- context.function_builder.ins().return_(&[cranelift_value]);
-}
+ let cranelift_values: Vec<_> = return_
+ .values
+ .iter()
+ .map(|value| compile_operand(value, context))
+ .collect();
-fn compile_return_void(_return_void: &PatioReturnVoid, context: &mut CompilerFunctionContext<'_>) {
- context.function_builder.ins().return_(&[]);
+ context.function_builder.ins().return_(&cranelift_values);
}
fn compile_switch(switch: &PatioSwitch, context: &mut CompilerFunctionContext<'_>) {
@@ -886,7 +882,7 @@ fn new_cranelift_signature() -> cranelift::prelude::Signature {
fn cranelift_signature<'a>(
locals: impl Iterator<Item = &'a PatioLocal>,
- return_type: PatioType,
+ return_types: impl Iterator<Item = &'a PatioType>,
target_triple: &target_lexicon::Triple,
) -> cranelift::prelude::Signature {
let mut signature = new_cranelift_signature();
@@ -899,9 +895,9 @@ fn cranelift_signature<'a>(
}
}
- if return_type != PatioType::Void {
+ for return_type in return_types {
let cranelift_return_type =
- types::patio_type_to_cranelift_type(return_type, &target_triple);
+ types::patio_type_to_cranelift_type(*return_type, &target_triple);
let returns = cranelift::prelude::AbiParam::new(cranelift_return_type);
signature.returns.push(returns);
}
diff --git a/patio-to-cranelift/src/codegen/types.rs b/patio-to-cranelift/src/codegen/types.rs
index 38cc6b2e..21833f3f 100644
--- a/patio-to-cranelift/src/codegen/types.rs
+++ b/patio-to-cranelift/src/codegen/types.rs
@@ -16,8 +16,6 @@ pub(crate) fn patio_type_to_cranelift_type(
PatioType::Int => cranelift_int_type(target_triple),
PatioType::Int32 => CRANELIFT_INT_32_TYPE,
-
- PatioType::Void => todo!(),
}
}
diff --git a/patio-to-cranelift/src/patio/compilation_unit.rs b/patio-to-cranelift/src/patio/compilation_unit.rs
index ecf80558..af8b4d3f 100644
--- a/patio-to-cranelift/src/patio/compilation_unit.rs
+++ b/patio-to-cranelift/src/patio/compilation_unit.rs
@@ -36,14 +36,14 @@ pub(crate) struct PatioDataElementMutableDeclaration {
pub(crate) struct PatioFunctionDeclaration {
pub(crate) name: String,
pub(crate) params: Vec<PatioLocal>,
- pub(crate) return_type: PatioType,
+ pub(crate) return_types: Vec<PatioType>,
}
pub(crate) struct PatioFunctionDefinition {
pub(crate) name: String,
pub(crate) visibility: PatioVisibility,
pub(crate) locals: Vec<PatioLocal>,
- pub(crate) return_type: PatioType,
+ pub(crate) return_types: Vec<PatioType>,
pub(crate) body: Vec<PatioInstruction>,
}
diff --git a/patio-to-cranelift/src/patio/flatbuffers.rs b/patio-to-cranelift/src/patio/flatbuffers.rs
index 5622259a..35226614 100644
--- a/patio-to-cranelift/src/patio/flatbuffers.rs
+++ b/patio-to-cranelift/src/patio/flatbuffers.rs
@@ -10,8 +10,8 @@ use crate::{
PatioBlock, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf,
PatioInstruction, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub,
PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioLoop, PatioLoopBreak,
- PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioReturn, PatioReturnVoid,
- PatioSwitch, PatioSwitchCase, PatioUnreachable, PatioVarLoad, PatioVarStore,
+ PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioReturn, PatioSwitch,
+ PatioSwitchCase, PatioUnreachable, PatioVarLoad, PatioVarStore,
},
operands::{PatioLocalRef, PatioOperand},
types::{PatioDataLayout, PatioType},
@@ -77,7 +77,7 @@ impl From<patio_generated::patio::PatioCompilationUnitElement<'_>> for PatioComp
.iter()
.map(Into::into)
.collect(),
- return_type: function_declaration.return_type().into(),
+ return_types: function_declaration.return_types().iter().map(Into::into).collect(),
})
}
@@ -92,7 +92,7 @@ impl From<patio_generated::patio::PatioCompilationUnitElement<'_>> for PatioComp
.iter()
.map(Into::into)
.collect(),
- return_type: function_definition.return_type().into(),
+ return_types: function_definition.return_types().iter().map(Into::into).collect(),
body: function_definition.body().iter().map(Into::into).collect(),
})
}
@@ -314,14 +314,10 @@ impl From<patio_generated::patio::PatioInstruction<'_>> for PatioInstruction {
let return_ = value.value_as_patio_return().unwrap();
Self::Return(PatioReturn {
- value: return_.value().into(),
+ values: return_.values().iter().map(Into::into).collect(),
})
}
- patio_generated::patio::PatioInstructionValue::PatioReturnVoid => {
- Self::ReturnVoid(PatioReturnVoid)
- }
-
patio_generated::patio::PatioInstructionValue::PatioSwitch => {
let switch = value.value_as_patio_switch().unwrap();
@@ -509,7 +505,6 @@ impl From<patio_generated::patio::PatioType<'_>> for PatioType {
PatioTypeValue::PatioFunctionPtrType => Self::FunctionPtr,
PatioTypeValue::PatioIntType => Self::Int,
PatioTypeValue::PatioInt32Type => Self::Int32,
- PatioTypeValue::PatioVoidType => Self::Void,
type_type => {
todo!(
diff --git a/patio-to-cranelift/src/patio/instructions.rs b/patio-to-cranelift/src/patio/instructions.rs
index af354117..804ee93d 100644
--- a/patio-to-cranelift/src/patio/instructions.rs
+++ b/patio-to-cranelift/src/patio/instructions.rs
@@ -23,7 +23,6 @@ pub(crate) enum PatioInstruction {
MemoryLoad(PatioMemoryLoad),
MemoryStore(PatioMemoryStore),
Return(PatioReturn),
- ReturnVoid(PatioReturnVoid),
Switch(PatioSwitch),
Unreachable(PatioUnreachable),
VarLoad(PatioVarLoad),
@@ -126,11 +125,9 @@ pub(crate) struct PatioMemoryStore {
}
pub(crate) struct PatioReturn {
- pub(crate) value: PatioOperand,
+ pub(crate) values: Vec<PatioOperand>,
}
-pub(crate) struct PatioReturnVoid;
-
pub(crate) struct PatioSwitch {
pub(crate) destinations: Vec<PatioLocalRef>,
pub(crate) value: PatioOperand,
diff --git a/patio-to-cranelift/src/patio/types.rs b/patio-to-cranelift/src/patio/types.rs
index c513ed4e..49bce09a 100644
--- a/patio-to-cranelift/src/patio/types.rs
+++ b/patio-to-cranelift/src/patio/types.rs
@@ -6,7 +6,6 @@ pub(crate) enum PatioType {
FunctionPtr,
Int,
Int32,
- Void,
}
#[derive(Clone, Debug, PartialEq)]