From 80c1575e7f2956111f1d62dbba88396d0ca8cf29 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 17 Jun 2023 01:09:12 +0100 Subject: Expand function definition --- .../llvm/LlvmCompilerDefineFunctionTests.java | 49 +++++++++++++--------- 1 file changed, 30 insertions(+), 19 deletions(-) (limited to 'src/test/java') 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()); } -- cgit v1.2.3