diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-04-08 19:12:50 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-04-08 19:12:50 +0100 |
| commit | a4e10ae33398e1eeffae0c196379a9df1d17e34f (patch) | |
| tree | edcb7aaf7873d1472d207c04e79ac74ded4f5d0f /src/main/java | |
| parent | 3424818dd7a0f878f43f52e6c12ba4493997e7e4 (diff) | |
Support defining Patio functions with multiple return values
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java | 35 |
1 files changed, 29 insertions, 6 deletions
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); } } |
