diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-14 21:57:23 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-14 21:57:23 +0100 |
| commit | 3ac85303c51e4130bc2b8000cd46e12646c7e7d9 (patch) | |
| tree | 0528f3a5b3f53e92f48ddc68cb9caf74106ab135 /src/main/java | |
| parent | c68c9a8f05e840292d39917df9fa32d9e166edc9 (diff) | |
Convert LlvmCodeGenDefineFunctionTests to use snapshots
Diffstat (limited to 'src/main/java')
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"); |
