From 3ac85303c51e4130bc2b8000cd46e12646c7e7d9 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 14 Jul 2023 21:57:23 +0100 Subject: Convert LlvmCodeGenDefineFunctionTests to use snapshots --- .../shedlang/compiler/backends/llvm/LlvmCodeGen.java | 2 ++ .../compiler/backends/llvm/LlvmCodeGenClosures.java | 17 +++++++++++++++++ .../backends/llvm/LlvmCodeGenLocalVariableSpace.java | 1 + 3 files changed, 20 insertions(+) (limited to 'src/main/java') 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 positionalParams, + List namedParams, FreeVariables freeVariables, Function 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"); -- cgit v1.2.3