aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-14 21:57:23 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-14 21:57:23 +0100
commit3ac85303c51e4130bc2b8000cd46e12646c7e7d9 (patch)
tree0528f3a5b3f53e92f48ddc68cb9caf74106ab135 /src/main/java
parentc68c9a8f05e840292d39917df9fa32d9e166edc9 (diff)
Convert LlvmCodeGenDefineFunctionTests to use snapshots
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java17
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java1
3 files changed, 20 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java
index 2f20e55b..ee95777f 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java
@@ -117,6 +117,8 @@ public class LlvmCodeGen {
case DefineFunctionInstruction defineFunction -> {
yield LlvmCodeGenClosures.create(
defineFunction.name(),
+ defineFunction.positionalParams(),
+ defineFunction.namedParams(),
defineFunction.freeVariables(),
functionContext -> {
for (var bodyInstruction : defineFunction.body()) {
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java
index 81aa781b..a68d200f 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java
@@ -9,12 +9,14 @@ import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmTypedOperand;
import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableGlobal;
import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableLocal;
import org.shedlang.compiler.backends.llvm.ir.ast.types.*;
+import org.shedlang.compiler.stackir.instructions.DefineFunctionInstruction;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
+import java.util.stream.Stream;
import static org.shedlang.compiler.util.Iterables.sortedBy;
@@ -66,6 +68,8 @@ public class LlvmCodeGenClosures {
public static LlvmCodeGenContext create(
String name,
+ List<DefineFunctionInstruction.Param> positionalParams,
+ List<DefineFunctionInstruction.Param> namedParams,
FreeVariables freeVariables,
Function<LlvmCodeGenContext, LlvmCodeGenContext> compileBody,
LlvmCodeGenContext context
@@ -84,6 +88,19 @@ public class LlvmCodeGenClosures {
var functionClosurePointer = functionClosurePointerResult.value();
bodyContext = functionClosurePointerResult.context();
+ var shedParams = Stream.concat(positionalParams.stream(), namedParams.stream()).toList();
+
+ for (var shedParam : shedParams) {
+ var paramResult = bodyContext.generateVariableLocal(
+ LlvmCodeGenLocalVariableSpace.PARAM,
+ shedParam.name()
+ );
+ var llvmParam = paramResult.value();
+ bodyContext = paramResult.context();
+
+ bodyContext = bodyContext.addShedLocal(shedParam.name(), llvmParam);
+ }
+
for (var freeVariable : freeVariables) {
bodyContext = loadClosureFreeVariable(
functionClosurePointer,
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java
index 1da74d57..3c5a3aef 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java
@@ -12,6 +12,7 @@ public enum LlvmCodeGenLocalVariableSpace {
FIELD_POINTER("fieldPointer"),
NAMESPACE("namespace"),
NAMESPACE_STRUCT_POINTER("namespaceStructPointer"),
+ PARAM("param"),
SIZE_PTR("sizePtr"),
SIZE("size"),
TEMPORARY("tmp");