From 25ca0c973842be553326d3cd69ea72fd658b0ba6 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 16 Jun 2023 23:08:09 +0100 Subject: Add explicit return instruction to function bodies --- .../llvm/LlvmCompilerDefineFunctionTests.java | 3 +- .../backends/llvm/LlvmCompilerReturnTests.java | 43 ++++++++++++++++++++++ .../StackCompilerFunctionDefinitionTests.java | 3 +- .../stackir/instructions/InstructionMatchers.java | 6 +++ 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerReturnTests.java (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 1575c2ad..f7e86765 100644 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java +++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerDefineFunctionTests.java @@ -25,7 +25,8 @@ public class LlvmCompilerDefineFunctionTests { List.of(), Set.of(), List.of( - Instructions.pushUnit() + Instructions.pushUnit(), + Instructions.return_() ), Sources.NULL ); diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerReturnTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerReturnTests.java new file mode 100644 index 00000000..f76383af --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerReturnTests.java @@ -0,0 +1,43 @@ +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.types.LlvmTypes; +import org.shedlang.compiler.stackir.instructions.Instructions; + +import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.*; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; +import static org.zwobble.precisely.Matchers.isSequence; + +public class LlvmCompilerReturnTests { + @Test + public void returnCompilesToReturnInstruction() { + var instruction = Instructions.return_(); + var add = LlvmIr.add( + LlvmIr.variableLocal("x"), + LlvmTypes.INT_64, + LlvmIr.variableLocal("left"), + LlvmIr.variableLocal("right") + ); + var context = LlvmCompilerContext.EMPTY + .addInstruction(add) + .push(LlvmIr.variableLocal("a")) + .push(LlvmIr.variableLocal("b")); + + var result = LlvmCompiler.compileInstruction(instruction, context); + + assertThat(result.basicBlocks(), isSequence( + isLlvmBasicBlock( + isSequence( + equalTo(add) + ), + isLlvmReturn(LlvmCompilerTypes.VALUE_TYPE, isLlvmVariableLocal("b")) + ) + )); + assertThat(result.instructions(), isSequence()); + assertThat(result.stack(), isSequence( + isLlvmVariableLocal("a") + )); + } +} diff --git a/src/test/java/org/shedlang/compiler/stackir/StackCompilerFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/stackir/StackCompilerFunctionDefinitionTests.java index 1c90a0a7..05063961 100644 --- a/src/test/java/org/shedlang/compiler/stackir/StackCompilerFunctionDefinitionTests.java +++ b/src/test/java/org/shedlang/compiler/stackir/StackCompilerFunctionDefinitionTests.java @@ -37,7 +37,8 @@ public class StackCompilerFunctionDefinitionTests { has("body", x -> x.body(), isSequence( isPushStringInstruction("hello"), isDiscardInstruction(), - isPushUnitInstruction() + isPushUnitInstruction(), + isReturnInstruction() )) ), isLocalStoreInstruction("f") diff --git a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java index 7e8a2f4d..8e24e131 100644 --- a/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java +++ b/src/test/java/org/shedlang/compiler/stackir/instructions/InstructionMatchers.java @@ -81,4 +81,10 @@ public class InstructionMatchers { PushUnitInstruction.class ); } + + public static Matcher isReturnInstruction() { + return instanceOf( + ReturnInstruction.class + ); + } } -- cgit v1.2.3