aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-16 20:20:18 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-16 20:20:18 +0100
commit778488f6a51227d42e06df0c3188df98c6938f77 (patch)
tree6a1d8734bd7b28b3044340e5a019165d9dab8d1b /src/test/java
parent57446428f678ebc2bc5ad34d04e41feabe35d28f (diff)
Include args when compiling call to LLVM IR
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java
index 1088f87f..428c9d5d 100644
--- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java
@@ -77,4 +77,74 @@ public class LlvmCompilerCallTests {
isLlvmVariableLocal("x")
));
}
+
+ @Test
+ public void canCallFunctionWithArgs() {
+ var instruction = Instructions.call(2, List.of("b", "a"));
+ var context = LlvmCompilerContext.EMPTY
+ .push(LlvmIr.variableLocal("x"))
+ .push(LlvmIr.variableLocal("f"))
+ .push(LlvmIr.variableLocal("positional1"))
+ .push(LlvmIr.variableLocal("positional2"))
+ .push(LlvmIr.variableLocal("namedB"))
+ .push(LlvmIr.variableLocal("namedA"));
+
+ var result = LlvmCompiler.compileInstruction(instruction, context);
+
+ assertThat(result.instructions(), isSequence(
+ instanceOf(
+ LlvmIntToPtr.class,
+ has("target", x -> x.target(), isLlvmVariableLocal("closurePointer__0")),
+ has("sourceType", x -> x.sourceType(), equalTo(LlvmCompilerTypes.VALUE_TYPE)),
+ has("value", x -> x.value(), isLlvmVariableLocal("f")),
+ has("targetType", x -> x.targetType(), equalTo(LlvmCompilerClosures.typeClosurePointer()))
+ ),
+ instanceOf(
+ LlvmGetElementPtr.class,
+ has("target", x -> x.target(), isLlvmVariableLocal("closureFunctionPointerPointer__0")),
+ has("pointerType", x -> x.pointerType(), equalTo(LlvmCompilerClosures.typeClosurePointer())),
+ has("pointer", x -> x.pointer(), isLlvmVariableLocal("closurePointer__0")),
+ has("indexes", x -> x.indexes(), isSequence(
+ isLlvmTypedOperand(LlvmTypes.INT_64, isLlvmOperandInt(0)),
+ isLlvmTypedOperand(LlvmTypes.INT_32, isLlvmOperandInt(0))
+ ))
+ ),
+ instanceOf(
+ LlvmLoad.class,
+ has("target", x -> x.target(), isLlvmVariableLocal("closureFunctionPointer__0")),
+ has("type", x -> x.type(), equalTo(LlvmCompilerClosures.typeClosureFunctionPointer())),
+ has("pointer", x -> x.pointer(), isLlvmVariableLocal("closureFunctionPointerPointer__0"))
+ ),
+ instanceOf(
+ LlvmGetElementPtr.class,
+ has("target", x -> x.target(), isLlvmVariableLocal("closureEnvironmentPointer__0")),
+ has("pointerType", x -> x.pointerType(), equalTo(LlvmCompilerClosures.typeClosurePointer())),
+ has("pointer", x -> x.pointer(), isLlvmVariableLocal("closurePointer__0")),
+ has("indexes", x -> x.indexes(), isSequence(
+ isLlvmTypedOperand(LlvmTypes.INT_64, isLlvmOperandInt(0)),
+ isLlvmTypedOperand(LlvmTypes.INT_32, isLlvmOperandInt(1))
+ ))
+ ),
+ instanceOf(
+ LlvmCall.class,
+ has("target", x -> x.target(), isLlvmVariableLocal("tmp__0")),
+ has("returnType", x -> x.returnType(), equalTo(LlvmCompilerTypes.VALUE_TYPE)),
+ has("functionPointer", x -> x.functionPointer(), isLlvmVariableLocal("closureFunctionPointer__0")),
+ has("args", x -> x.args(), isSequence(
+ isLlvmTypedOperand(
+ LlvmCompilerClosures.typeClosureEnvironmentPointer(),
+ isLlvmVariableLocal("closureEnvironmentPointer__0")
+ ),
+ isLlvmTypedOperand(LlvmCompilerTypes.VALUE_TYPE, isLlvmVariableLocal("positional1")),
+ isLlvmTypedOperand(LlvmCompilerTypes.VALUE_TYPE, isLlvmVariableLocal("positional2")),
+ isLlvmTypedOperand(LlvmCompilerTypes.VALUE_TYPE, isLlvmVariableLocal("namedA")),
+ isLlvmTypedOperand(LlvmCompilerTypes.VALUE_TYPE, isLlvmVariableLocal("namedB"))
+ ))
+ )
+ ));
+ assertThat(result.stack(), isSequence(
+ isLlvmVariableLocal("tmp__0"),
+ isLlvmVariableLocal("x")
+ ));
+ }
}