aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-17 01:09:12 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-17 01:09:12 +0100
commit80c1575e7f2956111f1d62dbba88396d0ca8cf29 (patch)
tree8bcaa086912f65ea8ae34f53b6ab49e890af8acb /src/test/java
parent0b00014f30a83ac1fd3b48e5df33d1afc57db21c (diff)
Expand function definition
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java49
1 files changed, 30 insertions, 19 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java
index f7e86765..5074cee8 100644
--- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java
@@ -1,7 +1,7 @@
package org.shedlang.compiler.backends.llvm;
import org.junit.jupiter.api.Test;
-import org.shedlang.compiler.backends.llvm.ir.ast.LlvmFunctionDefinition;
+import org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializer;
import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.stackir.instructions.DefineFunctionInstruction;
@@ -12,7 +12,8 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
-import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.*;
+import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmVariableLocal;
+import static org.shedlang.compiler.util.Iterables.forEachInterspersed;
import static org.zwobble.precisely.AssertThat.assertThat;
import static org.zwobble.precisely.Matchers.*;
@@ -34,24 +35,34 @@ public class LlvmCompilerDefineFunctionTests {
var result = LlvmCompiler.compileInstruction(instruction, context);
- assertThat(result.topLevelEntities(), isSequence(
- instanceOf(
- LlvmFunctionDefinition.class,
- has("name", x -> x.name(), equalTo("shed__fun__f__0")),
- has("returnType", x -> x.returnType(), equalTo(LlvmCompilerTypes.VALUE_TYPE)),
- has("params", x -> x.params(), isSequence(
- isLlvmParam(LlvmCompilerClosures.typeClosureEnvironmentPointer(), "shed__env__0")
- )),
- has("body", x -> x.body(), isSequence(
- isLlvmBasicBlock(
- isSequence(),
- isLlvmReturn(LlvmCompilerTypes.VALUE_TYPE, isLlvmOperandInt(0))
- )
- ))
- )
+ var topLevelEntities = new StringBuilder();
+ forEachInterspersed(
+ result.topLevelEntities(),
+ topLevelEntity -> LlvmIrSerializer.serializeTopLevelEntity(topLevelEntity, topLevelEntities),
+ () -> topLevelEntities.append("\n")
+ );
+ assertThat(topLevelEntities.toString(), equalTo("""
+ define i64 @shed__fun__f__0([0 x i64] * %shed__env__0) {
+ ret i64 0
+ }
+ """));
+
+ var instructions = new StringBuilder();
+ forEachInterspersed(
+ result.instructions(),
+ x -> LlvmIrSerializer.serializeInstruction(x, instructions),
+ () -> instructions.append("\n")
+ );
+ assertThat(instructions.toString(), equalTo("""
+ %size_ptr__0 = getelementptr {i64 ([0 x i64] *) *, [0 x i64]}, ptr null, i64 0
+ %size__0 = ptrtoint {i64 ([0 x i64] *) *, [0 x i64]} * %size_ptr__0 to i64
+ %closurePointer__0 = call {i64 ([0 x i64] *) *, [0 x i64]} * @shed__runtime__alloc(i64 %size__0)
+ %closureFunctionPointerPointer__0 = getelementptr {i64 ([0 x i64] *) *, [0 x i64]}, ptr %closurePointer__0, i64 0, i32 0
+ store i64 ([0 x i64] *) * @shed__fun__f__0, i64 ([0 x i64] *) * * %closureFunctionPointerPointer__0"""));
+
+ assertThat(result.stack(), isSequence(
+ isLlvmVariableLocal("closurePointer__0")
));
- assertThat(result.instructions(), isSequence());
- assertThat(result.stack(), isSequence());
assertThat(result.locals().entrySet(), isSequence());
}