diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-11 22:51:40 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-11 22:51:40 +0100 |
| commit | f1fcbace22b971efe9234152ae677081b127e7cc (patch) | |
| tree | e437847584cb6c42be241bf0d2ca2fb6f4bf4058 /src/test/java | |
| parent | ba2b92bef0ae6beca79e0db6f89cd7471b82e0cb (diff) | |
Add stubbed LLVM compiler
Diffstat (limited to 'src/test/java')
9 files changed, 298 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerBasicBlockTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerBasicBlockTests.java new file mode 100644 index 00000000..8fad73a6 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerBasicBlockTests.java @@ -0,0 +1,64 @@ +package org.shedlang.compiler.backends.llvm.ir; + +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.shedlang.compiler.backends.llvm.ir.LlvmIrSerializerTesting.serializeToString; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; + +public class LlvmIrSerializerBasicBlockTests { + @Test + public void blockWithoutLabel() { + var basicBlock = LlvmIr.basicBlock( + List.of( + LlvmIr.add( + LlvmIr.variableLocal("x"), + LlvmTypes.INT_64, + LlvmIr.operandInt(1), + LlvmIr.operandInt(2) + ), + LlvmIr.add( + LlvmIr.variableLocal("y"), + LlvmTypes.INT_64, + LlvmIr.operandInt(3), + LlvmIr.operandInt(4) + ) + ), + LlvmIr.returnVoid() + ); + + var result = serializeToString(basicBlock, LlvmIrSerializer::serializeBasicBlock); + + assertThat(result, equalTo(" $x = add i64 1, 2\n $y = add i64 3, 4\n ret void\n")); + } + + @Test + public void blockWithLabel() { + var basicBlock = LlvmIr.basicBlock( + "start", + List.of( + LlvmIr.add( + LlvmIr.variableLocal("x"), + LlvmTypes.INT_64, + LlvmIr.operandInt(1), + LlvmIr.operandInt(2) + ), + LlvmIr.add( + LlvmIr.variableLocal("y"), + LlvmTypes.INT_64, + LlvmIr.operandInt(3), + LlvmIr.operandInt(4) + ) + ), + LlvmIr.returnVoid() + ); + + var result = serializeToString(basicBlock, LlvmIrSerializer::serializeBasicBlock); + + assertThat(result, equalTo("start:\n $x = add i64 1, 2\n $y = add i64 3, 4\n ret void\n")); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerFunctionDefinitionTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerFunctionDefinitionTests.java new file mode 100644 index 00000000..4e1f23bc --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerFunctionDefinitionTests.java @@ -0,0 +1,29 @@ +package org.shedlang.compiler.backends.llvm.ir; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.backends.llvm.ir.ast.LlvmFunctionDefinition; +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.shedlang.compiler.backends.llvm.ir.LlvmIrSerializerTesting.serializeToString; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; + +public class LlvmIrSerializerFunctionDefinitionTests { + @Test + public void canSerializeFunctionDefinitions() { + var definition = new LlvmFunctionDefinition( + "f", + LlvmTypes.VOID, + List.of(LlvmIr.param(LlvmTypes.INT_64, "x"), LlvmIr.param(LlvmTypes.INT_64, "y")), + List.of() + ); + + var result = serializeToString(definition, LlvmIrSerializer::serializeTopLevelEntity); + + assertThat(result, equalTo(""" + """)); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java new file mode 100644 index 00000000..caebe5b4 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java @@ -0,0 +1,25 @@ +package org.shedlang.compiler.backends.llvm.ir; + +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 static org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializerTesting.serializeToString; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; + +public class LlvmIrSerializerInstructionTests { + @Test + public void addIsSerializedWithTypeAndOperands() { + var instruction = LlvmIr.add( + LlvmIr.variableLocal("x"), + LlvmTypes.INT_64, + LlvmIr.variableLocal("y"), + LlvmIr.variableLocal("z") + ); + + var result = serializeToString(instruction, LlvmIrSerializer::serializeInstruction); + + assertThat(result, equalTo("$x = add i64 $y, $z")); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerOperandsTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerOperandsTests.java new file mode 100644 index 00000000..3ab0d65f --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerOperandsTests.java @@ -0,0 +1,37 @@ +package org.shedlang.compiler.backends.llvm.ir; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; + +import static org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializerTesting.serializeToString; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; + +public class LlvmIrSerializerOperandsTests { + @Test + public void intIsSerializedAsInt() { + var operand = LlvmIr.operandInt(42); + + var result = serializeToString(operand, LlvmIrSerializer::serializeOperand); + + assertThat(result, equalTo("42")); + } + + @Test + public void localVariableIsSerializedWithPercent() { + var operand = LlvmIr.variableLocal("x"); + + var result = serializeToString(operand, LlvmIrSerializer::serializeVariable); + + assertThat(result, equalTo("$x")); + } + + @Test + public void globalVariableIsSerializedWithAt() { + var operand = LlvmIr.variableGlobal("x"); + + var result = serializeToString(operand, LlvmIrSerializer::serializeVariable); + + assertThat(result, equalTo("@x")); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerParamTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerParamTests.java new file mode 100644 index 00000000..650cb713 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerParamTests.java @@ -0,0 +1,20 @@ +package org.shedlang.compiler.backends.llvm.ir; + +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 static org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializerTesting.serializeToString; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; + +public class LlvmIrSerializerParamTests { + @Test + public void paramIsSerializedAsTypeThenName() { + var param = LlvmIr.param(LlvmTypes.INT_64, "x"); + + var result = serializeToString(param, LlvmIrSerializer::serializeParam); + + assertThat(result, equalTo("i64 %x")); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTerminatorInstructionTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTerminatorInstructionTests.java new file mode 100644 index 00000000..e8626c9c --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTerminatorInstructionTests.java @@ -0,0 +1,29 @@ +package org.shedlang.compiler.backends.llvm.ir; + +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 static org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializerTesting.serializeToString; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; + +public class LlvmIrSerializerTerminatorInstructionTests { + @Test + public void returnIsSerializedWithTypeAndName() { + var instruction = LlvmIr.returnValue(LlvmTypes.INT_64, LlvmIr.variableLocal("x")); + + var result = serializeToString(instruction, LlvmIrSerializer::serializeTerminatorInstruction); + + assertThat(result, equalTo("ret i64 $x")); + } + + @Test + public void returnVoidIsSerialized() { + var instruction = LlvmIr.returnVoid(); + + var result = serializeToString(instruction, LlvmIrSerializer::serializeTerminatorInstruction); + + assertThat(result, equalTo("ret void")); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTesting.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTesting.java new file mode 100644 index 00000000..155d02d2 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTesting.java @@ -0,0 +1,14 @@ +package org.shedlang.compiler.backends.llvm.ir; + +import java.util.function.BiConsumer; + +public class LlvmIrSerializerTesting { + private LlvmIrSerializerTesting() { + } + + public static <T> String serializeToString(T value, BiConsumer<T, StringBuilder> serialize) { + var builder = new StringBuilder(); + serialize.accept(value, builder); + return builder.toString(); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTypesTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTypesTests.java new file mode 100644 index 00000000..f35df8f7 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTypesTests.java @@ -0,0 +1,19 @@ +package org.shedlang.compiler.backends.llvm.ir; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; + +import static org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializerTesting.serializeToString; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.equalTo; + +public class LlvmIrSerializerTypesTests { + @Test + public void scalarTypeIsSerializedToName() { + var type = LlvmTypes.INT_64; + + var result = serializeToString(type, LlvmIrSerializer::serializeType); + + assertThat(result, equalTo("i64")); + } +} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java new file mode 100644 index 00000000..d3d7d6cb --- /dev/null +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java @@ -0,0 +1,61 @@ +package org.shedlang.compiler.backends.llvm.ir.ast; + +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.*; +import org.shedlang.compiler.backends.llvm.ir.ast.operands.*; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; + +import java.util.List; +import java.util.Optional; + +public class LlvmIr { + private LlvmIr() { + } + + public static LlvmAdd add( + LlvmVariable target, + LlvmType type, + LlvmOperand left, + LlvmOperand right + ) { + return new LlvmAdd(target, type, left, right); + } + + public static LlvmBasicBlock basicBlock( + List<LlvmInstruction> instructions, + LlvmTerminatorInstruction terminator + ) { + return new LlvmBasicBlock(Optional.empty(), instructions, terminator); + } + + public static LlvmBasicBlock basicBlock( + String name, + List<LlvmInstruction> instructions, + LlvmTerminatorInstruction terminator + ) { + return new LlvmBasicBlock(Optional.of(name), instructions, terminator); + } + + public static LlvmOperand operandInt(long value) { + return new LlvmOperandInt(value); + } + + public static LlvmParam param(LlvmType type, String name) { + return new LlvmParam(type, name); + } + + public static LlvmVariableGlobal variableGlobal(String name) { + return new LlvmVariableGlobal(name); + } + + public static LlvmVariableLocal variableLocal(String name) { + return new LlvmVariableLocal(name); + } + + public static LlvmReturn returnValue(LlvmType type, LlvmOperand value) { + return new LlvmReturn(type, value); + } + + public static LlvmReturnVoid returnVoid() { + return new LlvmReturnVoid(); + } +} |
