diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-04-07 19:58:08 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-04-07 20:36:45 +0100 |
| commit | ffcf99fabf00f21ee48f82c913e2ad06b3b0c395 (patch) | |
| tree | ec780a86566fd55ce57ad1f4f9cf1eeeec7e5cbe /patio-to-cranelift | |
| parent | 59b5294ffd1b5bf299f07cc0a586d67464a26cc3 (diff) | |
Return multiple values from Patio functions
Diffstat (limited to 'patio-to-cranelift')
| -rw-r--r-- | patio-to-cranelift/src/codegen/mod.rs | 36 | ||||
| -rw-r--r-- | patio-to-cranelift/src/codegen/types.rs | 2 | ||||
| -rw-r--r-- | patio-to-cranelift/src/patio/compilation_unit.rs | 4 | ||||
| -rw-r--r-- | patio-to-cranelift/src/patio/flatbuffers.rs | 15 | ||||
| -rw-r--r-- | patio-to-cranelift/src/patio/instructions.rs | 5 | ||||
| -rw-r--r-- | patio-to-cranelift/src/patio/types.rs | 1 |
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)] |
