aboutsummaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-12 21:44:47 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-12 21:44:47 +0100
commit7820f289bee49a8e748f63c04e85566c907f6c6f (patch)
treed71ae1a924841ca4ca79841c2a2a82fe39220dd5 /src/test/java
parentfa8b7447149e249e2e938757822dee19f569b9b8 (diff)
Compile push-string instruction to LLVM IR
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerPushStringTests.java55
-rw-r--r--src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIrMatchers.java31
2 files changed, 84 insertions, 2 deletions
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerPushStringTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerPushStringTests.java
new file mode 100644
index 00000000..8e483417
--- /dev/null
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/LlvmCompilerPushStringTests.java
@@ -0,0 +1,55 @@
+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 LlvmCompilerPushStringTests {
+ @Test
+ public void pushStringIsCompiledToTopLevelEntityAndReferenceToTopLevelEntity() {
+ var instruction = Instructions.pushString("hello");
+ var context = LlvmCompilerContext.EMPTY;
+
+ var result = LlvmCompiler.compileInstruction(instruction, context);
+
+ assertThat(result.instructions(), isSequence());
+ assertThat(result.stack(), isSequence(
+ isLlvmOperandPtrToInt(
+ equalTo(LlvmCompilerStrings.typeStringPointer(5)),
+ isLlvmVariableGlobal("string"),
+ equalTo(LlvmTypes.INT_64)
+ )
+ ));
+ assertThat(result.topLevelEntities(), isSequence(
+ instanceOf(
+ LlvmGlobalDefinition.class,
+ has("name", x -> x.name(), equalTo("string")),
+ has("type", x -> x.type(), equalTo(LlvmTypes.structure(List.of(
+ LlvmTypes.INT_64,
+ LlvmTypes.array(5, LlvmTypes.INT_8)
+ )))),
+ has("value", x -> x.value(), 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)
+ ))
+ )
+ ))))
+ )
+ ));
+ }
+}
diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIrMatchers.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIrMatchers.java
index 7250778b..8582ce93 100644
--- a/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIrMatchers.java
+++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIrMatchers.java
@@ -1,7 +1,7 @@
package org.shedlang.compiler.backends.llvm.ir.ast;
-import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
-import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperandInt;
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.*;
+import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
import org.zwobble.precisely.Matcher;
import static org.zwobble.precisely.Matchers.*;
@@ -16,4 +16,31 @@ public class LlvmIrMatchers {
has("value", x -> x.value(), equalTo(value))
);
}
+
+ public static Matcher<LlvmOperand> isLlvmOperandPtrToInt(
+ Matcher<LlvmType> sourceType,
+ Matcher<LlvmOperand> operand,
+ Matcher<LlvmType> targetType
+ ) {
+ return instanceOf(
+ LlvmOperandPtrToInt.class,
+ has("sourceType", x -> x.sourceType(), sourceType),
+ has("operand", x -> x.operand(), operand),
+ has("targetType", x -> x.targetType(), targetType)
+ );
+ }
+
+ public static Matcher<LlvmOperand> isLlvmVariableGlobal(String name) {
+ return instanceOf(
+ LlvmVariableGlobal.class,
+ has("name", x -> x.name(), equalTo(name))
+ );
+ }
+
+ public static Matcher<LlvmOperand> isLlvmVariableLocal(String name) {
+ return instanceOf(
+ LlvmVariableLocal.class,
+ has("name", x -> x.name(), equalTo(name))
+ );
+ }
}