aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-14 20:13:09 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-14 20:14:04 +0100
commit57446428f678ebc2bc5ad34d04e41feabe35d28f (patch)
tree9e619123ab79b69ed15b77f4b56a54c9ccb921aa /src/test/java
parentd4a8c7d7cba85e107b8532036b6e6838c57f4e2a (diff)
Compile zero-args to LLVM IR
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java48
1 files changed, 45 insertions, 3 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 45af4ac3..1088f87f 100644
--- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerCallTests.java
@@ -3,11 +3,15 @@ package org.shedlang.compiler.backends.llvm;
import org.junit.jupiter.api.Test;
import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr;
import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmCall;
+import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmGetElementPtr;
+import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmIntToPtr;
+import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmLoad;
+import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes;
import org.shedlang.compiler.stackir.instructions.Instructions;
import java.util.List;
-import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmVariableLocal;
+import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.*;
import static org.zwobble.precisely.AssertThat.assertThat;
import static org.zwobble.precisely.Matchers.*;
@@ -23,11 +27,49 @@ public class LlvmCompilerCallTests {
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("f")),
- has("args", x -> x.args(), isSequence())
+ has("functionPointer", x -> x.functionPointer(), isLlvmVariableLocal("closureFunctionPointer__0")),
+ has("args", x -> x.args(), isSequence(
+ isLlvmTypedOperand(
+ LlvmCompilerClosures.typeClosureEnvironmentPointer(),
+ isLlvmVariableLocal("closureEnvironmentPointer__0")
+ )
+ ))
)
));
assertThat(result.stack(), isSequence(