aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-30 16:47:10 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-30 16:47:10 +0100
commit3227422c3f62cba3c414b5ce0bf71137553cdf6b (patch)
treec63797e887bdf5cfe2cfc2567ff81746cd12e44e /src/main/java
parentcc21a3479f84cf7c829303132a68fb802676814f (diff)
Add vars to Patio
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java39
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java19
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioLocal.java1
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java17
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioVarLoad.java14
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioVarStore.java15
7 files changed, 106 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
index e74651bd..13577bdd 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
@@ -462,6 +462,41 @@ public class LlvmPatioCodeGen {
patioOperandToLlvmType(patioReturn.value(), context),
patioOperandToLlvmOperand(patioReturn.value(), context)
));
+
+ case PatioVarLoad patioVarLoad -> {
+ var targetResult = context.addPatioLocalToLlvmLocal(patioVarLoad.target());
+ var target = targetResult.value;
+ context = targetResult.context;
+
+ context = context.addInstruction(new LlvmLoad(
+ target,
+ context.patioLocalToType(patioVarLoad.var()),
+ context.patioLocalToOperand(patioVarLoad.var())
+ ));
+
+ yield context;
+ }
+
+ case PatioVarStore patioVarStore -> {
+ if (!context.patioLocalHasOperand(patioVarStore.var())) {
+ var varResult = context.addPatioLocalToLlvmLocal(patioVarStore.var());
+ var var = varResult.value;
+ context = varResult.context;
+
+ context = context.addInstruction(new LlvmAlloca(
+ var,
+ context.patioLocalToType(patioVarStore.var())
+ ));
+ }
+
+ context = context.addInstruction(new LlvmStore(
+ context.patioLocalToType(patioVarStore.var()),
+ patioOperandToLlvmOperand(patioVarStore.value(), context),
+ context.patioLocalToOperand(patioVarStore.var())
+ ));
+
+ yield context;
+ }
};
}
@@ -884,6 +919,10 @@ public class LlvmPatioCodeGen {
}
}
+ public boolean patioLocalHasOperand(PatioLocalRef value) {
+ return this.patioLocalToOperand.containsKey(value);
+ }
+
public FunctionContext addPatioLocalToType(PatioLocalRef patioLocal, LlvmType llvmType) {
return new FunctionContext(
this.functionNameToReturnType,
diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
index 5d6111ed..dee9246d 100644
--- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
@@ -84,6 +84,9 @@ public class WasmPatioCodeGen {
case PatioLocal.Val patioVal -> {
wasmLocals.add(wasmLocal);
}
+ case PatioLocal.Var patioVar -> {
+ wasmLocals.add(wasmLocal);
+ }
}
}
@@ -288,6 +291,22 @@ public class WasmPatioCodeGen {
yield context;
}
+
+ case PatioVarLoad patioVarLoad -> {
+ yield generateOperandToPatioLocal(
+ patioVarLoad.target(),
+ patioVarLoad.var(),
+ context
+ );
+ }
+
+ case PatioVarStore patioVarStore -> {
+ yield generateOperandToPatioLocal(
+ patioVarStore.var(),
+ patioVarStore.value(),
+ context
+ );
+ }
};
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioLocal.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioLocal.java
index 24f32ca4..b9350dfe 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioLocal.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioLocal.java
@@ -9,6 +9,7 @@ public sealed interface PatioLocal {
record Param(String name, PatioType type) implements PatioLocal {}
record Val(String name, PatioType type) implements PatioLocal {}
+ record Var(String name, PatioType type) implements PatioLocal {}
default PatioLocalRef ref() {
return new PatioLocalRef(name());
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
index 3fd95306..276d4cbf 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -283,6 +283,20 @@ public class PatioSerializer {
treeIdentifier("return"),
operandToTree(return_.value())
);
+
+ case PatioVarLoad varLoad ->
+ treeList(
+ treeIdentifier("var-load"),
+ operandToTree(varLoad.target()),
+ operandToTree(varLoad.var())
+ );
+
+ case PatioVarStore varStore ->
+ treeList(
+ treeIdentifier("var-store"),
+ operandToTree(varStore.var()),
+ operandToTree(varStore.value())
+ );
};
}
@@ -308,6 +322,9 @@ public class PatioSerializer {
case PatioLocal.Val val ->
"val";
+
+ case PatioLocal.Var var ->
+ "var";
};
return treeList(
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java
index a61613ff..26c92715 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioInstruction.java
@@ -2,6 +2,6 @@ package org.shedlang.compiler.patio.ast.instructions;
import org.shedlang.compiler.sources.Source;
-public sealed interface PatioInstruction permits PatioAllocHeap, PatioAllocStack, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioMemoryLoad, PatioMemoryStore, PatioReturn {
+public sealed interface PatioInstruction permits PatioAllocHeap, PatioAllocStack, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioMemoryLoad, PatioMemoryStore, PatioReturn, PatioVarLoad, PatioVarStore {
Source source();
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioVarLoad.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioVarLoad.java
new file mode 100644
index 00000000..1b30a576
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioVarLoad.java
@@ -0,0 +1,14 @@
+package org.shedlang.compiler.patio.ast.instructions;
+
+import org.shedlang.compiler.patio.ast.operands.PatioLocalRef;
+import org.shedlang.compiler.sources.Source;
+
+/**
+ * Load the value from the given var and store it in the target local.
+ */
+public record PatioVarLoad(
+ PatioLocalRef target,
+ PatioLocalRef var,
+ Source source
+) implements PatioInstruction {
+}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioVarStore.java b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioVarStore.java
new file mode 100644
index 00000000..104e8ca5
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/instructions/PatioVarStore.java
@@ -0,0 +1,15 @@
+package org.shedlang.compiler.patio.ast.instructions;
+
+import org.shedlang.compiler.patio.ast.operands.PatioLocalRef;
+import org.shedlang.compiler.patio.ast.operands.PatioOperand;
+import org.shedlang.compiler.sources.Source;
+
+/**
+ * Store the given value in the target var.
+ */
+public record PatioVarStore(
+ PatioLocalRef var,
+ PatioOperand value,
+ Source source
+) implements PatioInstruction {
+}