From c4bd013b53d3d00db54844573c8254bfbb504cde Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 30 Jul 2023 17:08:57 +0100 Subject: Add var-load and var-store to Stack IR --- .../compiler/backends/llvm/LlvmCodeGen.java | 6 ++++ .../compiler/backends/wasm/WasmCodeGen.java | 6 ++++ .../org/shedlang/compiler/patio/PatioCodeGen.java | 36 ++++++++++++++++++++++ .../compiler/patio/PatioCodeGenContext.java | 11 +++++++ .../compiler/patio/PatioCodeGenLocalSpace.java | 3 +- .../compiler/stackir/InstructionSerializer.java | 12 ++++++++ .../compiler/stackir/instructions/Instruction.java | 2 +- .../stackir/instructions/VarLoadInstruction.java | 10 ++++++ .../stackir/instructions/VarStoreInstruction.java | 9 ++++++ 9 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/stackir/instructions/VarLoadInstruction.java create mode 100644 src/main/java/org/shedlang/compiler/stackir/instructions/VarStoreInstruction.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java index 8763d6f8..60aa2152 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGen.java @@ -306,6 +306,12 @@ public class LlvmCodeGen { LlvmCodeGenStrings.add(target, left, right, operationContext), context ); + + case VarLoadInstruction varLoad -> + throw new UnsupportedOperationException(); + + case VarStoreInstruction varStore -> + throw new UnsupportedOperationException(); }; } diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java index 87cc5ad5..a85a49c3 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmCodeGen.java @@ -264,6 +264,12 @@ public class WasmCodeGen { case StringAddInstruction stringAdd -> WasmCodeGenStrings.add(context); + + case VarLoadInstruction varLoad -> + throw new UnsupportedOperationException(); + + case VarStoreInstruction varStore -> + throw new UnsupportedOperationException(); }; } diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java index e11f5dd1..57a08d69 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGen.java @@ -458,6 +458,42 @@ public class PatioCodeGen { ), context ); + + case VarLoadInstruction varLoad -> { + var varValueResult = context.allocateVal( + PatioCodeGenLocalSpace.VAR_VALUE, + varLoad.name(), + PatioCodeGenTypes.VALUE_TYPE + ); + var varValue = varValueResult.value(); + context = varValueResult.context(); + + context = context.addInstruction(new PatioVarLoad( + varValue, + context.stackIrLocalNameToLocal(varLoad.name()), + varLoad.source() + )); + + context = context.temporaryPush(varValue); + + yield context; + } + + case VarStoreInstruction varStore -> { + context = context.addStackIrVarIfMissing(varStore.name()); + + var valueResult = context.temporaryPop(); + var value = valueResult.value(); + context = valueResult.context(); + + context = context.addInstruction(new PatioVarStore( + context.stackIrLocalNameToLocal(varStore.name()), + value, + varStore.source() + )); + + yield context; + } }; } diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java index ecec3aee..034d945d 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java @@ -370,6 +370,17 @@ public record PatioCodeGenContext( return addStackIrLocal(name, setLocal, PatioLocal.Val::new); } + public PatioCodeGenContext addStackIrVarIfMissing( + String name + ) { + var local = this.functionContext.stackIrLocalNameToLocalOrNone(name); + if (local.isEmpty()) { + return addStackIrLocal(name, (l, c) -> c, PatioLocal.Var::new); + } else { + return this; + } + } + public PatioCodeGenContext addStackIrLocal( String name, BiFunction setLocal, diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenLocalSpace.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenLocalSpace.java index fb46b165..74e394bb 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenLocalSpace.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenLocalSpace.java @@ -14,7 +14,8 @@ public enum PatioCodeGenLocalSpace { LOCAL("local"), RECEIVER("receiver"), STRING("string"), - TEMPORARY("tmp"); + TEMPORARY("tmp"), + VAR_VALUE("varValue"); private final String name; diff --git a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java index 0f6881ae..807caa57 100644 --- a/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java +++ b/src/main/java/org/shedlang/compiler/stackir/InstructionSerializer.java @@ -157,6 +157,18 @@ public class InstructionSerializer { case StringAddInstruction stringAddInstruction -> treeList(treeIdentifier("string-add")); + + case VarLoadInstruction varLoadInstruction -> + treeList( + treeIdentifier("var-load"), + treeString(varLoadInstruction.name()) + ); + + case VarStoreInstruction varStoreInstruction -> + treeList( + treeIdentifier("var-store"), + treeString(varStoreInstruction.name()) + ); }; } } diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java index 80593264..b4a59136 100644 --- a/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java +++ b/src/main/java/org/shedlang/compiler/stackir/instructions/Instruction.java @@ -3,7 +3,7 @@ package org.shedlang.compiler.stackir.instructions; import org.shedlang.compiler.sources.Source; public sealed interface Instruction - permits CallInstruction, DefineFunctionInstruction, DiscardInstruction, FieldLoadInstruction, IfInstruction, IntAddInstruction, IntEqualsInstruction, IntNotEqualInstruction, IntSubInstruction, LocalLoadInstruction, LocalStoreInstruction, NamespaceFieldStoreInstruction, NamespaceImportInstruction, PushBoolInstruction, PushIntInstruction, PushStringInstruction, PushUnitInstruction, ReturnInstruction, StringAddInstruction { + permits CallInstruction, DefineFunctionInstruction, DiscardInstruction, FieldLoadInstruction, IfInstruction, IntAddInstruction, IntEqualsInstruction, IntNotEqualInstruction, IntSubInstruction, LocalLoadInstruction, LocalStoreInstruction, NamespaceFieldStoreInstruction, NamespaceImportInstruction, PushBoolInstruction, PushIntInstruction, PushStringInstruction, PushUnitInstruction, ReturnInstruction, StringAddInstruction, VarLoadInstruction, VarStoreInstruction { Source source(); } diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/VarLoadInstruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/VarLoadInstruction.java new file mode 100644 index 00000000..2ca49d90 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/stackir/instructions/VarLoadInstruction.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.stackir.instructions; + +import org.shedlang.compiler.sources.Source; + +/** + * Load the value stored in the var with the given name and push it onto the + * stack. + */ +public record VarLoadInstruction(String name, Source source) implements Instruction { +} diff --git a/src/main/java/org/shedlang/compiler/stackir/instructions/VarStoreInstruction.java b/src/main/java/org/shedlang/compiler/stackir/instructions/VarStoreInstruction.java new file mode 100644 index 00000000..b355d39c --- /dev/null +++ b/src/main/java/org/shedlang/compiler/stackir/instructions/VarStoreInstruction.java @@ -0,0 +1,9 @@ +package org.shedlang.compiler.stackir.instructions; + +import org.shedlang.compiler.sources.Source; + +/** + * Pop a value from the stack and store it in the var with the given name. + */ +public record VarStoreInstruction(String name, Source source) implements Instruction { +} -- cgit v1.2.3