diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-21 16:16:44 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-21 16:16:44 +0000 |
| commit | 812b4db4e97e9554ff63e3f2c5e4b6e88633b219 (patch) | |
| tree | e8714f205eb7fc0dfae4d25e54a63320bb523551 /src/test/java | |
| parent | 8a4e269a1ecd0092c82e3fccbe7af9baf09fdf1e (diff) | |
Avoid silently dropping instructions when generating LLVM code
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContextTests.java | 54 |
1 files changed, 54 insertions, 0 deletions
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")); + } +} |
