aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-11 22:51:40 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-11 22:51:40 +0100
commitf1fcbace22b971efe9234152ae677081b127e7cc (patch)
treee437847584cb6c42be241bf0d2ca2fb6f4bf4058 /src/test/java
parentba2b92bef0ae6beca79e0db6f89cd7471b82e0cb (diff)
Add stubbed LLVM compiler
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerBasicBlockTests.java64
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerFunctionDefinitionTests.java29
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerInstructionTests.java25
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerOperandsTests.java37
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerParamTests.java20
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTerminatorInstructionTests.java29
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTesting.java14
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTypesTests.java19
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java61
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();
+ }
+}