From 812b4db4e97e9554ff63e3f2c5e4b6e88633b219 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 21 Dec 2023 16:16:44 +0000 Subject: Avoid silently dropping instructions when generating LLVM code --- .../codegen/PatioToLlvmFunctionContextTests.java | 54 ++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/test/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContextTests.java (limited to 'src/test/java/org') diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContextTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContextTests.java new file mode 100644 index 00000000..0ed0be80 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContextTests.java @@ -0,0 +1,54 @@ +package org.shedlang.compiler.backends.llvm.codegen; + +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 java.util.List; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; +import static org.zwobble.precisely.Matchers.isSequence; + +public class PatioToLlvmFunctionContextTests { + @Test + public void whenThereAreNoInstructionsOutsideOfBasicBlockThenToBasicBlocksReturnsBasicBlocks() { + var context = PatioToLlvmFunctionContext.of(PatioToLlvmModuleContext.EMPTY); + var addInstruction = LlvmIr.add( + LlvmIr.variableLocal("a"), + LlvmTypes.INT_64, + LlvmIr.variableLocal("b"), + LlvmIr.variableLocal("c") + ); + context = context.addInstruction(addInstruction); + var branchInstruction = LlvmIr.brUnconditional("end"); + context = context.addTerminatorInstruction(branchInstruction); + + var basicBlocks = context.toBasicBlocks(); + + assertThat(basicBlocks.value(), isSequence( + equalTo(LlvmIr.basicBlock(List.of(addInstruction), branchInstruction)) + )); + } + + @Test + public void whenThereAreInstructionsOutsideOfBasicBlockThenToBasicBlocksThrowsException() { + var context = PatioToLlvmFunctionContext.of(PatioToLlvmModuleContext.EMPTY); + var addInstruction = LlvmIr.add( + LlvmIr.variableLocal("a"), + LlvmTypes.INT_64, + LlvmIr.variableLocal("b"), + LlvmIr.variableLocal("c") + ); + context = context.addInstruction(addInstruction); + + var c = context; + var error = assertThrows( + IllegalStateException.class, + () -> c.toBasicBlocks() + ); + + assertThat(error.getMessage(), equalTo("basic block is missing terminator instruction")); + } +} -- cgit v1.2.3