From a4e10ae33398e1eeffae0c196379a9df1d17e34f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 8 Apr 2026 19:12:50 +0100 Subject: Support defining Patio functions with multiple return values --- .../backends/llvm/codegen/PatioToLlvm.java | 35 ++++++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java index 428190aa..a49752e0 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java @@ -9,6 +9,7 @@ import org.shedlang.compiler.backends.llvm.ir.ast.*; import org.shedlang.compiler.backends.llvm.ir.ast.instructions.*; import org.shedlang.compiler.backends.llvm.ir.ast.operands.*; import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypeStructure; import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; import org.shedlang.compiler.filesystem.ShedCompilerFiles; import org.shedlang.compiler.patio.*; @@ -1132,13 +1133,35 @@ public class PatioToLlvm { if (patioReturnOperands.size() == 1) { return context.toResult(patioOperandToLlvmOperand(patioReturnOperands.get(0), context)); } else { - return context.toResult( - new LlvmOperandStructure( - patioReturnOperands.stream() - .map(patioReturnOperand -> patioOperandToLlvmTypedOperand(patioReturnOperand, context)) - .toList() - ) + LlvmOperand llvmOperand = new LlvmOperandPoison(); + + var c = context; + var llvmAggregateType = new LlvmTypeStructure( + patioReturnOperands.stream() + .map(patioReturnOperand -> patioOperandToLlvmType(patioReturnOperand, c)) + .toList() ); + + for (var patioReturnOperandIndex = 0; patioReturnOperandIndex < patioReturnOperands.size(); patioReturnOperandIndex++) { + var patioReturnOperand = patioReturnOperands.get(patioReturnOperandIndex); + + var llvmUpdatedAggregateResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.TEMPORARY); + var llvmUpdatedAggregate = llvmUpdatedAggregateResult.value(); + context = llvmUpdatedAggregateResult.context(); + + context = context.addInstruction(new LlvmInsertValue( + llvmUpdatedAggregate, + llvmAggregateType, + llvmOperand, + patioOperandToLlvmType(patioReturnOperand, context), + patioOperandToLlvmOperand(patioReturnOperand, context), + List.of(patioReturnOperandIndex) + )); + + llvmOperand = llvmUpdatedAggregate; + } + + return context.toResult(llvmOperand); } } -- cgit v1.2.3