aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-11 23:28:45 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-11 23:28:45 +0100
commitda0eee0d3bcecd15c418903a1ea147c5e8d727cf (patch)
tree95d5fdcbe25b4192e713d254ea11075cd24632ad /src/main/java
parent04dff356a4323d2b22f0916ffe6931a31f75bb77 (diff)
Compile load-store instruction to LLVM IR
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java9
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java33
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerResult.java7
3 files changed, 40 insertions, 9 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
index b311b41d..7c74f211 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
@@ -25,9 +25,14 @@ public class LlvmCompiler {
case LocalLoadInstruction localLoadInstruction -> {
throw new UnsupportedOperationException("TODO");
}
- case LocalStoreInstruction localStoreInstruction -> {
- throw new UnsupportedOperationException("TODO");
+ case LocalStoreInstruction localStore -> {
+ var result = context.pop();
+ var value = result.value();
+ context = result.context();
+
+ yield context.addLocal(localStore.name(), value);
}
+
case ModuleExportInstruction moduleExportInstruction -> {
throw new UnsupportedOperationException("TODO");
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
index 6d917e49..1af09f36 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
@@ -1,30 +1,49 @@
package org.shedlang.compiler.backends.llvm;
import org.pcollections.Empty;
+import org.pcollections.PMap;
+import org.pcollections.PStack;
import org.pcollections.PVector;
import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmInstruction;
import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
public record LlvmCompilerContext(
- PVector<LlvmOperand> stack,
+ PStack<LlvmOperand> stack,
+ PMap<String, LlvmOperand> locals,
PVector<LlvmInstruction> instructions
) {
public static LlvmCompilerContext EMPTY = new LlvmCompilerContext(
- Empty.vector(),
+ Empty.stack(),
+ Empty.map(),
Empty.vector()
);
- public LlvmCompilerContext addInstruction(LlvmInstruction instruction) {
+ public LlvmCompilerContext push(LlvmOperand operand) {
return new LlvmCompilerContext(
- stack,
- instructions.plus(instruction)
+ stack.plus(operand),
+ locals,
+ instructions
);
}
- public LlvmCompilerContext push(LlvmOperand operand) {
+ public LlvmCompilerResult<LlvmOperand> pop() {
+ var context = new LlvmCompilerContext(stack.minus(0), locals, instructions);
+ return new LlvmCompilerResult<>(stack.get(0), context);
+ }
+
+ public LlvmCompilerContext addLocal(String name, LlvmOperand value) {
return new LlvmCompilerContext(
- stack.plus(operand),
+ stack,
+ locals.plus(name, value),
instructions
);
}
+
+ public LlvmCompilerContext addInstruction(LlvmInstruction instruction) {
+ return new LlvmCompilerContext(
+ stack,
+ locals,
+ instructions.plus(instruction)
+ );
+ }
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerResult.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerResult.java
new file mode 100644
index 00000000..b0d7e1b8
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerResult.java
@@ -0,0 +1,7 @@
+package org.shedlang.compiler.backends.llvm;
+
+public record LlvmCompilerResult<T>(
+ T value,
+ LlvmCompilerContext context
+) {
+}