diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-09-16 15:20:50 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-09-16 15:20:50 +0100 |
| commit | 410d51abc96defa8b16d1041e9cfe8668221798a (patch) | |
| tree | b9c164f0d13b56041dc2e081a3d12889426822eb /src/test/java | |
| parent | d2d6019cabed6e04a04bef402442697f9c32df11 (diff) | |
Remove direct LLVM backend
Diffstat (limited to 'src/test/java')
22 files changed, 1 insertions, 940 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenCallTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenCallTests.java deleted file mode 100644 index a5c56a7b..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenCallTests.java +++ /dev/null @@ -1,128 +0,0 @@ -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.instructions.LlvmCall; -import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmGetElementPtr; -import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmIntToPtr; -import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmLoad; -import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; -import org.shedlang.compiler.stackir.instructions.Instructions; - -import java.util.List; - -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.*; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.*; - -public class LlvmCodeGenCallTests { - @Test - public void canCallFunctionWithNoArgs() { - var instruction = Instructions.call(0, List.of()); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.variableLocal("x")) - .push(LlvmIr.variableLocal("f")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence( - instanceOf( - LlvmIntToPtr.class, - has("target", x -> x.target(), isLlvmVariableLocal("closurePointer__0")), - has("sourceType", x -> x.sourceType(), equalTo(LlvmCodeGenTypes.VALUE_TYPE)), - has("value", x -> x.value(), isLlvmVariableLocal("f")) - ), - instanceOf( - LlvmGetElementPtr.class, - has("target", x -> x.target(), isLlvmVariableLocal("closureFunctionPointerPointer__0")), - has("pointerType", x -> x.pointerType(), equalTo(LlvmCodeGenClosures.CALLABLE_TYPES.closurePointer())), - has("pointer", x -> x.pointer(), isLlvmVariableLocal("closurePointer__0")), - has("indexes", x -> x.indexes(), isSequence( - isLlvmTypedOperand(LlvmTypes.INT_64, isLlvmOperandInt(0)), - isLlvmTypedOperand(LlvmTypes.INT_32, isLlvmOperandInt(0)) - )) - ), - instanceOf( - LlvmLoad.class, - has("target", x -> x.target(), isLlvmVariableLocal("closureFunctionPointer__0")), - has("type", x -> x.type(), equalTo(LlvmCodeGenClosures.CALLABLE_TYPES.closureFunctionPointer())), - has("pointer", x -> x.pointer(), isLlvmVariableLocal("closureFunctionPointerPointer__0")) - ), - instanceOf( - LlvmCall.class, - has("target", x -> x.target(), isOptionalOf(isLlvmVariableLocal("tmp__0"))), - has("returnType", x -> x.returnType(), equalTo(LlvmCodeGenTypes.VALUE_TYPE)), - has("functionPointer", x -> x.functionPointer(), isLlvmVariableLocal("closureFunctionPointer__0")), - has("args", x -> x.args(), isSequence( - isLlvmTypedOperand( - LlvmCodeGenClosures.CALLABLE_TYPES.closurePointer(), - isLlvmVariableLocal("closurePointer__0") - ) - )) - ) - )); - assertThat(result.stack(), isSequence( - isLlvmVariableLocal("tmp__0"), - isLlvmVariableLocal("x") - )); - } - - @Test - public void canCallFunctionWithArgs() { - var instruction = Instructions.call(2, List.of("b", "a")); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.variableLocal("x")) - .push(LlvmIr.variableLocal("f")) - .push(LlvmIr.variableLocal("positional1")) - .push(LlvmIr.variableLocal("positional2")) - .push(LlvmIr.variableLocal("namedB")) - .push(LlvmIr.variableLocal("namedA")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence( - instanceOf( - LlvmIntToPtr.class, - has("target", x -> x.target(), isLlvmVariableLocal("closurePointer__0")), - has("sourceType", x -> x.sourceType(), equalTo(LlvmCodeGenTypes.VALUE_TYPE)), - has("value", x -> x.value(), isLlvmVariableLocal("f")) - ), - instanceOf( - LlvmGetElementPtr.class, - has("target", x -> x.target(), isLlvmVariableLocal("closureFunctionPointerPointer__0")), - has("pointerType", x -> x.pointerType(), equalTo(LlvmCodeGenClosures.CALLABLE_TYPES.closurePointer())), - has("pointer", x -> x.pointer(), isLlvmVariableLocal("closurePointer__0")), - has("indexes", x -> x.indexes(), isSequence( - isLlvmTypedOperand(LlvmTypes.INT_64, isLlvmOperandInt(0)), - isLlvmTypedOperand(LlvmTypes.INT_32, isLlvmOperandInt(0)) - )) - ), - instanceOf( - LlvmLoad.class, - has("target", x -> x.target(), isLlvmVariableLocal("closureFunctionPointer__0")), - has("type", x -> x.type(), equalTo(LlvmCodeGenClosures.CALLABLE_TYPES.closureFunctionPointer())), - has("pointer", x -> x.pointer(), isLlvmVariableLocal("closureFunctionPointerPointer__0")) - ), - instanceOf( - LlvmCall.class, - has("target", x -> x.target(), isOptionalOf(isLlvmVariableLocal("tmp__0"))), - has("returnType", x -> x.returnType(), equalTo(LlvmCodeGenTypes.VALUE_TYPE)), - has("functionPointer", x -> x.functionPointer(), isLlvmVariableLocal("closureFunctionPointer__0")), - has("args", x -> x.args(), isSequence( - isLlvmTypedOperand( - LlvmCodeGenClosures.CALLABLE_TYPES.closurePointer(), - isLlvmVariableLocal("closurePointer__0") - ), - isLlvmTypedOperand(LlvmCodeGenTypes.VALUE_TYPE, isLlvmVariableLocal("positional1")), - isLlvmTypedOperand(LlvmCodeGenTypes.VALUE_TYPE, isLlvmVariableLocal("positional2")), - isLlvmTypedOperand(LlvmCodeGenTypes.VALUE_TYPE, isLlvmVariableLocal("namedA")), - isLlvmTypedOperand(LlvmCodeGenTypes.VALUE_TYPE, isLlvmVariableLocal("namedB")) - )) - ) - )); - assertThat(result.stack(), isSequence( - isLlvmVariableLocal("tmp__0"), - isLlvmVariableLocal("x") - )); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenDefineFunctionTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenDefineFunctionTests.java deleted file mode 100644 index 7f008681..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenDefineFunctionTests.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.shedlang.compiler.ast.typed.FreeVariables; -import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; -import org.shedlang.compiler.sources.Sources; -import org.shedlang.compiler.stackir.instructions.DefineFunctionInstruction; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.shedlang.compiler.testing.snapshots.SnapshotResolver; -import org.shedlang.compiler.testing.snapshots.Snapshotter; - -import java.io.IOException; -import java.util.List; - -@ExtendWith({SnapshotResolver.class}) -public class LlvmCodeGenDefineFunctionTests { - @Test - public void canDefineMinimalFunction(Snapshotter snapshotter) throws IOException { - var instruction = new DefineFunctionInstruction( - "f", - List.of(), - List.of(), - FreeVariables.empty(), - List.of( - Instructions.pushUnit(), - Instructions.return_() - ), - Sources.NULL - ); - var context = LlvmCodeGenContext.EMPTY; - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(LlvmCodeGenTesting.serializeContext(result)); - } - - @Test - public void freeVariablesAreStoredInAndLoadedFromEnvironment(Snapshotter snapshotter) throws IOException { - var instruction = new DefineFunctionInstruction( - "f", - List.of(), - List.of(), - FreeVariables.builder().plus("a", Sources.NULL).plus("b", Sources.NULL).build(), - List.of( - Instructions.localLoad("a"), - Instructions.return_() - ), - Sources.NULL - ); - var context = LlvmCodeGenContext.EMPTY - .addShedLocal("a", LlvmIr.operandInt(1)) - .addShedLocal("b", LlvmIr.operandInt(2)); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(LlvmCodeGenTesting.serializeContext(result)); - } - - @Test - public void positionalAndNamedParamsAreDefined(Snapshotter snapshotter) throws IOException { - var instruction = new DefineFunctionInstruction( - "f", - List.of(Instructions.param("param1"), Instructions.param("param2")), - List.of(Instructions.param("paramA"), Instructions.param("paramB")), - FreeVariables.builder().plus("a", Sources.NULL).plus("b", Sources.NULL).build(), - List.of( - Instructions.localLoad("a"), - Instructions.localLoad("param1"), - Instructions.intAdd(), - Instructions.localLoad("paramA"), - Instructions.intAdd(), - Instructions.return_() - ), - Sources.NULL - ); - var context = LlvmCodeGenContext.EMPTY - .addShedLocal("a", LlvmIr.operandInt(1)) - .addShedLocal("b", LlvmIr.operandInt(2)); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(LlvmCodeGenTesting.serializeContext(result)); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenDiscardTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenDiscardTests.java deleted file mode 100644 index 799442eb..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenDiscardTests.java +++ /dev/null @@ -1,24 +0,0 @@ -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.stackir.instructions.Instructions; - -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmOperandInt; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.isSequence; - -public class LlvmCodeGenDiscardTests { - @Test - public void discardRemovesTopElementFromStack() { - var instruction = Instructions.discard(); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.operandInt(1)) - .push(LlvmIr.operandInt(2)); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence()); - assertThat(result.stack(), isSequence(isLlvmOperandInt(1))); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenFieldLoadTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenFieldLoadTests.java deleted file mode 100644 index 6bb8c5c7..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenFieldLoadTests.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableLocal; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.shedlang.compiler.testing.snapshots.SnapshotResolver; -import org.shedlang.compiler.testing.snapshots.Snapshotter; -import org.shedlang.compiler.typechecker.TypeCheckerContext; -import org.shedlang.compiler.types.NamespaceName; -import org.shedlang.compiler.types.Types; -import org.shedlang.compiler.util.P; - -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import static org.shedlang.compiler.backends.llvm.LlvmCodeGenTesting.serializeContext; - -@ExtendWith({SnapshotResolver.class}) -public class LlvmCodeGenFieldLoadTests { - @Test - public void fieldLoadPopsReceiverAndPushesFieldValue(Snapshotter snapshotter) throws IOException { - var namespaceName = new NamespaceName(List.of("Example", "Project")); - var instruction = Instructions.fieldLoad(namespaceName, "y"); - var typeInfo = TypeCheckerContext.EMPTY - .addNamespaceFields(namespaceName, P.orderedMap( - Map.entry("x", Types.INT), - Map.entry("y", Types.INT), - Map.entry("z", Types.INT) - )) - .toTypeInfo(); - var context = LlvmCodeGenContext.fromTypeInfo(typeInfo) - .push(new LlvmVariableLocal("a")) - .push(new LlvmVariableLocal("b")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(serializeContext(result)); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIfTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIfTests.java deleted file mode 100644 index 0243ae90..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIfTests.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.shedlang.compiler.testing.snapshots.SnapshotResolver; -import org.shedlang.compiler.testing.snapshots.Snapshotter; - -import java.io.IOException; -import java.util.List; - -@ExtendWith({SnapshotResolver.class}) -public class LlvmCodeGenIfTests { - @Test - public void ifIsCompiled(Snapshotter snapshotter) throws IOException { - var instruction = Instructions.if_( - 1, - List.of( - Instructions.pushInt(1), - Instructions.pushInt(2), - Instructions.intAdd() - ), - List.of( - Instructions.pushInt(101), - Instructions.pushInt(102), - Instructions.intAdd() - ) - ); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.variableLocal("x")) - .push(LlvmIr.variableLocal("condition")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(LlvmCodeGenTesting.serializeContext(result)); - } - - @Test - public void canCompileNestedIf(Snapshotter snapshotter) throws IOException { - var instruction = Instructions.if_( - 1, - List.of( - Instructions.pushInt(1), - Instructions.pushInt(2), - Instructions.intAdd() - ), - List.of( - Instructions.pushBool(true), - Instructions.if_( - 1, - List.of( - Instructions.pushInt(101), - Instructions.pushInt(102), - Instructions.intAdd() - ), - List.of( - Instructions.pushInt(201), - Instructions.pushInt(202), - Instructions.intAdd() - ) - ) - ) - ); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.variableLocal("x")) - .push(LlvmIr.variableLocal("condition")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(LlvmCodeGenTesting.serializeContext(result)); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntAddTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntAddTests.java deleted file mode 100644 index e2fc5ccb..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntAddTests.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.shedlang.compiler.testing.snapshots.SnapshotResolver; -import org.shedlang.compiler.testing.snapshots.Snapshotter; - -import java.io.IOException; - -import static org.shedlang.compiler.backends.llvm.LlvmCodeGenTesting.serializeContext; - -@ExtendWith({SnapshotResolver.class}) -public class LlvmCodeGenIntAddTests { - @Test - public void intAddIsCompiledToAdd(Snapshotter snapshotter) throws IOException { - var instruction = Instructions.intAdd(); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.variableLocal("a")) - .push(LlvmIr.variableLocal("b")) - .push(LlvmIr.variableLocal("c")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(serializeContext(result)); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntEqualsTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntEqualsTests.java deleted file mode 100644 index be97752d..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntEqualsTests.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.shedlang.compiler.testing.snapshots.SnapshotResolver; -import org.shedlang.compiler.testing.snapshots.Snapshotter; - -import java.io.IOException; - -import static org.shedlang.compiler.backends.llvm.LlvmCodeGenTesting.serializeContext; - -@ExtendWith({SnapshotResolver.class}) -public class LlvmCodeGenIntEqualsTests { - @Test - public void intEqualsIsCompiledToComparison(Snapshotter snapshotter) throws IOException { - var instruction = Instructions.intEquals(); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.variableLocal("a")) - .push(LlvmIr.variableLocal("b")) - .push(LlvmIr.variableLocal("c")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(serializeContext(result)); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntNotEqualTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntNotEqualTests.java deleted file mode 100644 index b5759f61..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntNotEqualTests.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.shedlang.compiler.testing.snapshots.SnapshotResolver; -import org.shedlang.compiler.testing.snapshots.Snapshotter; - -import java.io.IOException; - -import static org.shedlang.compiler.backends.llvm.LlvmCodeGenTesting.serializeContext; - -@ExtendWith({SnapshotResolver.class}) -public class LlvmCodeGenIntNotEqualTests { - @Test - public void intNotEqualIsCompiledToComparison(Snapshotter snapshotter) throws IOException { - var instruction = Instructions.intNotEqual(); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.variableLocal("a")) - .push(LlvmIr.variableLocal("b")) - .push(LlvmIr.variableLocal("c")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(serializeContext(result)); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntSubTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntSubTests.java deleted file mode 100644 index dfde4836..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenIntSubTests.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.shedlang.compiler.testing.snapshots.SnapshotResolver; -import org.shedlang.compiler.testing.snapshots.Snapshotter; - -import java.io.IOException; - -import static org.shedlang.compiler.backends.llvm.LlvmCodeGenTesting.serializeContext; - -@ExtendWith({SnapshotResolver.class}) -public class LlvmCodeGenIntSubTests { - @Test - public void intSubIsCompiledToSub(Snapshotter snapshotter) throws IOException { - var instruction = Instructions.intSub(); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.variableLocal("a")) - .push(LlvmIr.variableLocal("b")) - .push(LlvmIr.variableLocal("c")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(serializeContext(result)); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalLoadTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalLoadTests.java deleted file mode 100644 index 6dedfd11..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalLoadTests.java +++ /dev/null @@ -1,35 +0,0 @@ -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.operands.LlvmOperand; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.zwobble.precisely.Matcher; - -import java.util.Map; - -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmOperandInt; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.*; - -public class LlvmCodeGenLocalLoadTests { - @Test - public void localLoadPushsOperandFromLocalsToStack() { - var instruction = Instructions.localLoad("x"); - var context = LlvmCodeGenContext.EMPTY - .addShedLocal("x", LlvmIr.operandInt(42)); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence()); - assertThat(result.stack(), isSequence(isLlvmOperandInt(42))); - assertThat(result.shedLocalNameToOperand().entrySet(), isSequence(isLocal("x", isLlvmOperandInt(42)))); - } - - private static Matcher<Map.Entry<String, LlvmOperand>> isLocal(String name, Matcher<LlvmOperand> operand) { - return allOf( - has("name", x -> x.getKey(), equalTo(name)), - has("operand", x -> x.getValue(), operand) - ); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalStoreTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalStoreTests.java deleted file mode 100644 index 814e7238..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalStoreTests.java +++ /dev/null @@ -1,36 +0,0 @@ -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.operands.LlvmOperand; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.zwobble.precisely.Matcher; - -import java.util.Map; - -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmOperandInt; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.*; - -public class LlvmCodeGenLocalStoreTests { - @Test - public void localStorePopsFromStackAndUpdatesLocals() { - var instruction = Instructions.localStore("x"); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.operandInt(0)) - .push(LlvmIr.operandInt(1)); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence()); - assertThat(result.stack(), isSequence(isLlvmOperandInt(0))); - assertThat(result.shedLocalNameToOperand().entrySet(), isSequence(isLocal("x", isLlvmOperandInt(1)))); - } - - private static Matcher<Map.Entry<String, LlvmOperand>> isLocal(String name, Matcher<LlvmOperand> operand) { - return allOf( - has("name", x -> x.getKey(), equalTo(name)), - has("operand", x -> x.getValue(), operand) - ); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenNamespaceFieldStoreTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenNamespaceFieldStoreTests.java deleted file mode 100644 index 191361e7..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenNamespaceFieldStoreTests.java +++ /dev/null @@ -1,71 +0,0 @@ -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.instructions.LlvmGetElementPtr; -import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmStore; -import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.shedlang.compiler.typechecker.TypeCheckerContext; -import org.shedlang.compiler.types.NamespaceName; -import org.shedlang.compiler.types.Types; -import org.shedlang.compiler.util.P; - -import java.util.List; -import java.util.Map; - -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.*; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.*; - -public class LlvmCodeGenNamespaceFieldStoreTests { - @Test - public void namespaceFieldStorePopsFromStackAndUpdatesFieldOnNamespace() { - var namespaceName = new NamespaceName(List.of("Example", "Project")); - var instruction = Instructions.namespaceFieldStore(namespaceName, "y"); - var typeInfo = TypeCheckerContext.EMPTY - .addNamespaceFields(namespaceName, P.orderedMap( - Map.entry("x", Types.INT), - Map.entry("y", Types.INT), - Map.entry("z", Types.INT) - )) - .toTypeInfo(); - var context = LlvmCodeGenContext.fromTypeInfo(typeInfo) - .push(LlvmIr.operandInt(0)) - .push(LlvmIr.operandInt(1)); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence( - instanceOf( - LlvmGetElementPtr.class, - has("target", x -> x.target(), isLlvmVariableLocal("fieldPointer__y__0")), - has( - "pointerType", - x -> x.pointerType(), - equalTo(LlvmTypes.pointer(LlvmTypes.structure(List.of( - LlvmTypes.INT_64, - LlvmTypes.INT_64, - LlvmTypes.INT_64 - )))) - ), - has( - "pointer", - x -> x.pointer(), - isLlvmVariableGlobal("shed__namespace__Example_Project") - ), - has("indexes", x -> x.indexes(), isSequence( - isLlvmTypedOperand(LlvmTypes.INT_64, isLlvmOperandInt(0)), - isLlvmTypedOperand(LlvmTypes.INT_32, isLlvmOperandInt(1)) - )) - ), - instanceOf( - LlvmStore.class, - has("type", x -> x.type(), equalTo(LlvmTypes.INT_64)), - has("value", x -> x.value(), isLlvmOperandInt(1)), - has("pointer", x -> x.pointer(), isLlvmVariableLocal("fieldPointer__y__0")) - ) - )); - assertThat(result.stack(), isSequence(isLlvmOperandInt(0))); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenNamespaceImportTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenNamespaceImportTests.java deleted file mode 100644 index 9e43f449..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenNamespaceImportTests.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.shedlang.compiler.backends.llvm.ir.ast.LlvmFunctionDeclaration; -import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmCall; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.shedlang.compiler.types.NamespaceName; - -import java.util.List; - -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmVariableGlobal; -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmVariableLocal; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.*; - -public class LlvmCodeGenNamespaceImportTests { - @Test - public void namespaceImportCallsNamespaceImportFunction() { - var namespaceName = new NamespaceName(List.of("Example", "Project")); - var instruction = Instructions.namespaceImport(namespaceName); - var context = LlvmCodeGenContext.EMPTY; - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.topLevelEntities(), isSequence( - instanceOf( - LlvmFunctionDeclaration.class, - has("name", x -> x.name(), equalTo("shed__namespaceImport__Example_Project")), - has("returnType", x -> x.returnType(), equalTo(LlvmCodeGenTypes.VALUE_TYPE)), - has("params", x -> x.params(), isSequence()) - ) - )); - assertThat(result.instructions(), isSequence( - instanceOf( - LlvmCall.class, - has("target", x -> x.target(), isOptionalOf(isLlvmVariableLocal("namespace__Example_Project__0"))), - has("returnType", x -> x.returnType(), equalTo(LlvmCodeGenTypes.VALUE_TYPE)), - has("functionPointer", x -> x.functionPointer(), isLlvmVariableGlobal("shed__namespaceImport__Example_Project")), - has("args", x -> x.args(), isSequence()) - ) - )); - assertThat(result.stack(), isSequence(isLlvmVariableLocal("namespace__Example_Project__0"))); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushBoolTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushBoolTests.java deleted file mode 100644 index cf6bb76a..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushBoolTests.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.shedlang.compiler.stackir.instructions.Instructions; - -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmOperandInt; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.isSequence; - -public class LlvmCodeGenPushBoolTests { - @Test - public void pushFalseIsCompiledToOperandInStack() { - var instruction = Instructions.pushBool(false); - var context = LlvmCodeGenContext.EMPTY; - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence()); - assertThat(result.stack(), isSequence(isLlvmOperandInt(0))); - } - - @Test - public void pushTrueIsCompiledToOperandInStack() { - var instruction = Instructions.pushBool(true); - var context = LlvmCodeGenContext.EMPTY; - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence()); - assertThat(result.stack(), isSequence(isLlvmOperandInt(1))); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushIntTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushIntTests.java deleted file mode 100644 index cb4711d9..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushIntTests.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.shedlang.compiler.stackir.instructions.Instructions; - -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmOperandInt; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.isSequence; - -public class LlvmCodeGenPushIntTests { - // TODO: handle larger ints - - @Test - public void pushIntIsCompiledToOperandInStack() { - var instruction = Instructions.pushInt(42); - var context = LlvmCodeGenContext.EMPTY; - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence()); - assertThat(result.stack(), isSequence(isLlvmOperandInt(42))); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushStringTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushStringTests.java deleted file mode 100644 index 0504084e..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushStringTests.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.shedlang.compiler.backends.llvm.ir.ast.LlvmGlobalDefinition; -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 java.util.List; - -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.*; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.*; - -public class LlvmCodeGenPushStringTests { - @Test - public void pushStringIsCompiledToTopLevelEntityAndReferenceToTopLevelEntity() { - var instruction = Instructions.pushString("hello"); - var context = LlvmCodeGenContext.EMPTY; - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence()); - assertThat(result.stack(), isSequence( - isLlvmOperandPtrToInt( - isLlvmVariableGlobal("shed__string__0"), - equalTo(LlvmTypes.INT_64) - ) - )); - assertThat(result.topLevelEntities(), isSequence( - instanceOf( - LlvmGlobalDefinition.class, - has("name", x -> x.name(), equalTo("shed__string__0")), - has("type", x -> x.type(), equalTo(LlvmTypes.structure(List.of( - LlvmTypes.INT_64, - LlvmTypes.array(5, LlvmTypes.INT_8) - )))), - has("value", x -> x.value(), isOptionalOf(equalTo(LlvmIr.operandStructure(List.of( - LlvmIr.typedOperand(LlvmTypes.INT_64, LlvmIr.operandInt(5)), - LlvmIr.typedOperand( - LlvmTypes.array(5, LlvmTypes.INT_8), - LlvmIr.operandArray(LlvmTypes.INT_8, List.of( - LlvmIr.operandInt(104), - LlvmIr.operandInt(101), - LlvmIr.operandInt(108), - LlvmIr.operandInt(108), - LlvmIr.operandInt(111) - )) - ) - ))))), - has("constant", x -> x.constant(), equalTo(true)), - has("isPrivate", x -> x.isPrivate(), equalTo(true)), - has("unnamedAddr", x -> x.unnamedAddr(), equalTo(true)) - ) - )); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushUnitTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushUnitTests.java deleted file mode 100644 index 2da03372..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenPushUnitTests.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.shedlang.compiler.stackir.instructions.Instructions; - -import static org.shedlang.compiler.backends.llvm.ir.ast.LlvmIrMatchers.isLlvmOperandInt; -import static org.zwobble.precisely.AssertThat.assertThat; -import static org.zwobble.precisely.Matchers.isSequence; - -public class LlvmCodeGenPushUnitTests { - @Test - public void pushUnitIsCompiledToOperandInStack() { - var instruction = Instructions.pushUnit(); - var context = LlvmCodeGenContext.EMPTY; - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.instructions(), isSequence()); - assertThat(result.stack(), isSequence(isLlvmOperandInt(0))); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenReturnTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenReturnTests.java deleted file mode 100644 index 66afa268..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenReturnTests.java +++ /dev/null @@ -1,43 +0,0 @@ -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 LlvmCodeGenReturnTests { - @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 = LlvmCodeGenContext.EMPTY - .addInstruction(add) - .push(LlvmIr.variableLocal("a")) - .push(LlvmIr.variableLocal("b")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - assertThat(result.basicBlocks(), isSequence( - isLlvmBasicBlock( - isSequence( - equalTo(add) - ), - isLlvmReturn(LlvmCodeGenTypes.VALUE_TYPE, isLlvmVariableLocal("b")) - ) - )); - assertThat(result.instructions(), isSequence()); - assertThat(result.stack(), isSequence( - isLlvmVariableLocal("a") - )); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenStringAddTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenStringAddTests.java deleted file mode 100644 index 29fa4370..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenStringAddTests.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; -import org.shedlang.compiler.stackir.instructions.Instructions; -import org.shedlang.compiler.testing.snapshots.SnapshotResolver; -import org.shedlang.compiler.testing.snapshots.Snapshotter; - -import java.io.IOException; - -import static org.shedlang.compiler.backends.llvm.LlvmCodeGenTesting.serializeContext; - -@ExtendWith({SnapshotResolver.class}) -public class LlvmCodeGenStringAddTests { - @Test - public void stringAddIsCompiledToCallToRuntimeStringAdd(Snapshotter snapshotter) throws IOException { - var instruction = Instructions.stringAdd(); - var context = LlvmCodeGenContext.EMPTY - .push(LlvmIr.variableLocal("a")) - .push(LlvmIr.variableLocal("b")) - .push(LlvmIr.variableLocal("c")); - - var result = LlvmCodeGen.generateInstruction(instruction, context); - - snapshotter.assertSnapshot(serializeContext(result)); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenTesting.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenTesting.java deleted file mode 100644 index 97c3b0e6..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenTesting.java +++ /dev/null @@ -1,58 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializer; - -import java.io.IOException; - -public class LlvmCodeGenTesting { - private LlvmCodeGenTesting() { - } - - public static String serializeContext(LlvmCodeGenContext context) throws IOException { - var builder = new StringBuilder(); - - builder.append("Stack:\n"); - for (var operand : context.stack()) { - builder.append(" * "); - LlvmIrSerializer.serializeOperand(operand, builder); - builder.append("\n"); - } - builder.append("\n"); - - builder.append("Instructions:\n\n"); - for (var instruction : context.instructions()) { - LlvmIrSerializer.serializeInstruction(instruction, builder); - builder.append("\n"); - } - builder.append("\n"); - - builder.append("Basic blocks:\n\n"); - for (var basicBlock : context.basicBlocks()) { - LlvmIrSerializer.serializeBasicBlock(basicBlock, builder); - builder.append("\n"); - } - builder.append("\n"); - - builder.append("Top-level entities:\n\n"); - - for (var topLevelEntity : context.topLevelEntities()) { - LlvmIrSerializer.serializeTopLevelEntity(topLevelEntity, builder); - builder.append("\n"); - } - - builder.append("Shed locals:\n"); - for (var entry : context.shedLocalNameToOperand().entrySet()) { - var shedLocalName = entry.getKey(); - var operand = entry.getValue(); - - builder.append(" * "); - builder.append(shedLocalName); - builder.append(" => "); - LlvmIrSerializer.serializeOperand(operand, builder); - builder.append("\n"); - } - builder.append("\n"); - - return builder.toString(); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmExampleTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmExampleTests.java deleted file mode 100644 index de28a11e..00000000 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmExampleTests.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.shedlang.compiler.backends.Backend; -import org.shedlang.compiler.backends.ExampleTests; - -import java.util.Optional; - -public class LlvmExampleTests extends ExampleTests { - @Override - protected Backend backend() { - return LlvmBackend.DIRECT; - } - - @Override - protected Optional<String> binaryRunner() { - return Optional.empty(); - } - - @Override - protected String executableName(String binary) { - return binary; - } - - @Override - protected boolean isDisabled(String testName) { - return testName.equals("var") || testName.equals("while"); - } -} diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmPatioExampleTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmPatioExampleTests.java index b43a7846..bc19ffbf 100644 --- a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmPatioExampleTests.java +++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmPatioExampleTests.java @@ -8,7 +8,7 @@ import java.util.Optional; public class LlvmPatioExampleTests extends ExampleTests { @Override protected Backend backend() { - return LlvmBackend.PATIO; + return LlvmBackend.INSTANCE; } @Override |
