diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-26 21:19:39 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-26 21:19:39 +0100 |
| commit | a5b889d21b9fcfac32f6f691fa08146139065fd3 (patch) | |
| tree | a4ec3af8a43a6114d2068279b45217cb03bcc7c6 /src/main/java | |
| parent | 90afeef2a50e017be593267c8420df410b2cef7f (diff) | |
Pass in positional and named args to generate call in LLVM backend
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java | 18 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java | 13 |
2 files changed, 17 insertions, 14 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 de92b4e6..7c4427b4 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java @@ -36,7 +36,7 @@ public class LlvmCodeGen { var field = fieldResult.value(); mainContext = fieldResult.context(); - mainContext = LlvmCodeGenClosures.call(field, mainContext, List.of()); + mainContext = LlvmCodeGenClosures.call(field, List.of(), Map.of(), mainContext); mainContext = mainContext.addTerminatorInstruction( new LlvmReturn(LlvmTypes.INT_32, new LlvmOperandInt(0)) @@ -104,20 +104,15 @@ public class LlvmCodeGen { context = argResult.context(); namedArgsByName.put(argName, arg); } - var namedArgs = namedArgsByName.entrySet() - .stream().sorted(Map.Entry.comparingByKey()) - .map(x -> x.getValue()) - .toList(); - var args = new ArrayList<LlvmOperand>(); + var positionalArgs = new ArrayList<LlvmOperand>(); for (var i = 0; i < call.positionalArgCount(); i++) { var argResult = context.pop(); var arg = argResult.value(); context = argResult.context(); - args.add(arg); + positionalArgs.add(arg); } - Collections.reverse(args); - args.addAll(namedArgs); + Collections.reverse(positionalArgs); var receiverResult = context.pop(); var receiver = receiverResult.value(); @@ -125,8 +120,9 @@ public class LlvmCodeGen { yield LlvmCodeGenClosures.call( receiver, - context, - args + positionalArgs, + namedArgsByName, + context ); } case DefineFunctionInstruction defineFunction -> { 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 d41298bc..098acbdd 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenClosures.java @@ -13,6 +13,7 @@ import org.shedlang.compiler.backends.llvm.ir.ast.types.*; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.function.Function; @@ -155,8 +156,9 @@ public class LlvmCodeGenClosures { public static LlvmCodeGenContext call( LlvmOperand closure, - LlvmCodeGenContext context, - List<LlvmOperand> args + List<LlvmOperand> positionalArgs, + Map<String, LlvmOperand> namedArgsByName, + LlvmCodeGenContext context ) { var closurePointerResult = castValueToClosurePointer(closure, context); var closurePointer = closurePointerResult.value(); @@ -174,10 +176,15 @@ public class LlvmCodeGenClosures { var fullArgs = new ArrayList<LlvmTypedOperand>(); fullArgs.add(new LlvmTypedOperand(CALLABLE_TYPES.closurePointer(), closurePointer)); - for (var arg : args) { + for (var arg : positionalArgs) { fullArgs.add(new LlvmTypedOperand(LlvmCodeGenTypes.VALUE_TYPE, arg)); } + namedArgsByName.entrySet() + .stream().sorted(Map.Entry.comparingByKey()) + .map(x -> x.getValue()) + .forEachOrdered(x -> fullArgs.add(new LlvmTypedOperand(LlvmCodeGenTypes.VALUE_TYPE, x))); + return context.addInstruction(new LlvmCall( callTarget, LlvmCodeGenTypes.VALUE_TYPE, |
