aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-08 19:12:50 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-08 19:12:50 +0100
commita4e10ae33398e1eeffae0c196379a9df1d17e34f (patch)
treeedcb7aaf7873d1472d207c04e79ac74ded4f5d0f /src
parent3424818dd7a0f878f43f52e6c12ba4493997e7e4 (diff)
Support defining Patio functions with multiple return values
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java35
-rw-r--r--src/test/java/org/shedlang/compiler/patio/PatioExampleTests.java2
2 files changed, 29 insertions, 8 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);
}
}
diff --git a/src/test/java/org/shedlang/compiler/patio/PatioExampleTests.java b/src/test/java/org/shedlang/compiler/patio/PatioExampleTests.java
index 7d82bbae..6b983843 100644
--- a/src/test/java/org/shedlang/compiler/patio/PatioExampleTests.java
+++ b/src/test/java/org/shedlang/compiler/patio/PatioExampleTests.java
@@ -1,6 +1,5 @@
package org.shedlang.compiler.patio;
-import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.patio.instructions.Patio;
import org.shedlang.compiler.patio.instructions.PatioInstruction;
@@ -823,7 +822,6 @@ public abstract class PatioExampleTests {
));
}
- @Disabled
@Test
public void canCallFunctionWithMultipleReturnValuesDefinedInModule() throws IOException, InterruptedException {
var calledFunction = PatioFunctionDefinition.builder()