diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-07-30 16:47:10 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-07-30 16:47:10 +0100 |
| commit | 3227422c3f62cba3c414b5ce0bf71137553cdf6b (patch) | |
| tree | c63797e887bdf5cfe2cfc2567ff81746cd12e44e /src/main/java | |
| parent | cc21a3479f84cf7c829303132a68fb802676814f (diff) | |
Add vars to Patio
Diffstat (limited to 'src/main/java')
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 { +} |
