diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-28 19:41:00 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-28 19:41:00 +0000 |
| commit | 8e069d9ddfd8c34f742d1dc4301a0fa5a76c16f6 (patch) | |
| tree | 85ada8031cac9ead1aaf89cfc98ab4c48e6dc14e /src/main/java | |
| parent | efbf3709697f1a94bbbed83563e0d7225e79e0fa (diff) | |
Introduce PatioDataPtrValue
Diffstat (limited to 'src/main/java')
8 files changed, 71 insertions, 29 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java index 962fb62e..726418e1 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java @@ -15,10 +15,7 @@ import org.shedlang.compiler.patio.*; import org.shedlang.compiler.patio.instructions.*; import org.shedlang.compiler.patio.operands.*; import org.shedlang.compiler.patio.types.*; -import org.shedlang.compiler.patio.values.PatioIntValue; -import org.shedlang.compiler.patio.values.PatioIntValueByteOffsetOf; -import org.shedlang.compiler.patio.values.PatioIntValueByteSizeOf; -import org.shedlang.compiler.patio.values.PatioIntValueLiteral; +import org.shedlang.compiler.patio.values.*; import org.shedlang.compiler.util.Lazy; import org.shedlang.compiler.util.Lists; import org.shedlang.compiler.util.P; @@ -1099,7 +1096,7 @@ public class PatioToLlvm { new LlvmOperandInt(patioByteConst.value()); case PatioDataPtrConst patioDataPtrConst -> - new LlvmVariableGlobal(patioDataPtrConst.name()); + patioDataPtrValueToLlvmOperand(patioDataPtrConst.value()); case PatioFunctionPtrConst patioFunctionPtrConst -> new LlvmVariableGlobal(patioFunctionPtrConst.name()); @@ -1123,12 +1120,21 @@ public class PatioToLlvm { }; } + private static LlvmOperand patioDataPtrValueToLlvmOperand( + PatioDataPtrValue dataPtrValue + ) { + return switch (dataPtrValue) { + case PatioDataPtrValueDataElement dataElement -> + new LlvmVariableGlobal(dataElement.name()); + }; + } + private static LlvmOperand patioIntValueToLlvmOperand( - PatioIntValue patioIntConst, + PatioIntValue intValue, PatioType patioDestinationType, LlvmTarget target ) { - return switch (patioIntConst) { + return switch (intValue) { case PatioIntValueByteOffsetOf byteOffsetOf -> offsetOf( byteOffsetOf.layout(), diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java index 0dec70ab..67404151 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -12,10 +12,7 @@ import org.shedlang.compiler.patio.*; import org.shedlang.compiler.patio.instructions.*; import org.shedlang.compiler.patio.operands.*; import org.shedlang.compiler.patio.types.*; -import org.shedlang.compiler.patio.values.PatioIntValue; -import org.shedlang.compiler.patio.values.PatioIntValueByteOffsetOf; -import org.shedlang.compiler.patio.values.PatioIntValueByteSizeOf; -import org.shedlang.compiler.patio.values.PatioIntValueLiteral; +import org.shedlang.compiler.patio.values.*; import org.shedlang.compiler.util.Lists; import org.shedlang.compiler.util.P; @@ -541,13 +538,11 @@ public class PatioToWasm { case PatioByteConst patioByteConst -> context.addInstruction(new WasmI32Const(Byte.toUnsignedInt(patioByteConst.value()))); - case PatioDataPtrConst patioDataPtrConst -> { - var wasmMemoryAddress = new WasmMemoryAddress(patioDataPtrConst.name()); - yield context.addInstruction(new WasmMemoryAddressConst( - context.target.indexType(), - wasmMemoryAddress + case PatioDataPtrConst patioDataPtrConst -> + context.addInstruction(generateDataPtrValue( + patioDataPtrConst.value(), + context.target )); - } case PatioFunctionPtrConst patioFunctionPtrConst -> { var wasmFuncName = new WasmFuncName(patioFunctionPtrConst.name()); @@ -579,6 +574,18 @@ public class PatioToWasm { }; } + private static WasmInstruction generateDataPtrValue(PatioDataPtrValue value, WasmTarget target) { + return switch (value) { + case PatioDataPtrValueDataElement dataElement -> { + var wasmMemoryAddress = new WasmMemoryAddress(dataElement.name()); + yield new WasmMemoryAddressConst( + target.indexType(), + wasmMemoryAddress + ); + } + }; + } + private static int generateIntValue(PatioIntValue value, WasmTarget target) { return switch (value) { case PatioIntValueByteOffsetOf byteOffsetOf -> diff --git a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java index 1dd4de1a..76817b75 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java @@ -3,10 +3,7 @@ package org.shedlang.compiler.patio; import org.shedlang.compiler.patio.instructions.*; import org.shedlang.compiler.patio.operands.*; import org.shedlang.compiler.patio.types.*; -import org.shedlang.compiler.patio.values.PatioIntValue; -import org.shedlang.compiler.patio.values.PatioIntValueByteOffsetOf; -import org.shedlang.compiler.patio.values.PatioIntValueByteSizeOf; -import org.shedlang.compiler.patio.values.PatioIntValueLiteral; +import org.shedlang.compiler.patio.values.*; import org.shedlang.compiler.treetext.Tree; import java.util.List; @@ -430,7 +427,7 @@ public class PatioSerializer { treeList(treeIdentifier("byte-const"), treeInt(byte_.value())); case PatioDataPtrConst dataPtr -> - treeList(treeIdentifier("data-ptr-const"), treeString(dataPtr.name())); + treeList(treeIdentifier("data-ptr-const"), dataPtrValueToTree(dataPtr.value())); case PatioFunctionPtrConst functionPtr -> treeList(treeIdentifier("function-ptr-const"), treeString(functionPtr.name())); @@ -562,6 +559,13 @@ public class PatioSerializer { }; } + private static Tree dataPtrValueToTree(PatioDataPtrValue dataPtrValue) { + return switch (dataPtrValue) { + case PatioDataPtrValueDataElement dataElement -> + treeString(dataElement.name()); + }; + } + private static Tree intValueToTree(PatioIntValue intValue) { return switch (intValue) { case PatioIntValueByteOffsetOf byteOffsetOf -> diff --git a/src/main/java/org/shedlang/compiler/patio/operands/PatioDataPtrConst.java b/src/main/java/org/shedlang/compiler/patio/operands/PatioDataPtrConst.java index 91fd72f7..e0b1897d 100644 --- a/src/main/java/org/shedlang/compiler/patio/operands/PatioDataPtrConst.java +++ b/src/main/java/org/shedlang/compiler/patio/operands/PatioDataPtrConst.java @@ -2,8 +2,14 @@ package org.shedlang.compiler.patio.operands; import org.shedlang.compiler.patio.types.PatioType; import org.shedlang.compiler.patio.types.PatioTypes; +import org.shedlang.compiler.patio.values.PatioDataPtrValue; +import org.shedlang.compiler.patio.values.PatioDataPtrValueDataElement; + +public record PatioDataPtrConst(PatioDataPtrValue value) implements PatioOperandConst { + public static PatioDataPtrConst dataElement(String name) { + return new PatioDataPtrConst(new PatioDataPtrValueDataElement(name)); + } -public record PatioDataPtrConst(String name) implements PatioOperandConst { @Override public PatioType type() { return PatioTypes.DATA_POINTER; diff --git a/src/main/java/org/shedlang/compiler/patio/values/PatioDataPtrValue.java b/src/main/java/org/shedlang/compiler/patio/values/PatioDataPtrValue.java new file mode 100644 index 00000000..f6b7d14e --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/values/PatioDataPtrValue.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.patio.values; + +public sealed interface PatioDataPtrValue permits PatioDataPtrValueDataElement { +} diff --git a/src/main/java/org/shedlang/compiler/patio/values/PatioDataPtrValueDataElement.java b/src/main/java/org/shedlang/compiler/patio/values/PatioDataPtrValueDataElement.java new file mode 100644 index 00000000..09258fd6 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/values/PatioDataPtrValueDataElement.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.patio.values; + +public record PatioDataPtrValueDataElement(String name) implements PatioDataPtrValue { +} diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioNamespaces.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioNamespaces.java index 913bb966..e4db8209 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioNamespaces.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioNamespaces.java @@ -66,7 +66,7 @@ public class ShidToPatioNamespaces { ); initContext = initContext.addInstruction(new PatioMemoryStore( - new PatioDataPtrConst(globalNameNamespaceValue(namespaceName)), + globalNameNamespaceValueOperand(namespaceName), PatioDataLayouts.DATA_POINTER, List.of(), namespaceValue, @@ -76,7 +76,7 @@ public class ShidToPatioNamespaces { initContext = generateInitBody.apply(initContext); initContext = initContext.addInstruction(new PatioMemoryStore( - new PatioDataPtrConst(globalNameNamespaceIsInited(namespaceName)), + globalNameNamespaceIsInitedOperand(namespaceName), PatioDataLayouts.BOOL, List.of(), new PatioBoolConst(true), @@ -104,7 +104,7 @@ public class ShidToPatioNamespaces { importContext = importContext.addInstruction(new PatioMemoryLoad( isInited, - new PatioDataPtrConst(globalNameNamespaceIsInited(namespaceName)), + globalNameNamespaceIsInitedOperand(namespaceName), PatioDataLayouts.BOOL, List.of(), source @@ -142,7 +142,7 @@ public class ShidToPatioNamespaces { importContext = importContext.addInstruction(new PatioMemoryLoad( namespaceValuePointer, - new PatioDataPtrConst(globalNameNamespaceValue(namespaceName)), + globalNameNamespaceValueOperand(namespaceName), PatioDataLayouts.DATA_POINTER, List.of(), source @@ -251,7 +251,7 @@ public class ShidToPatioNamespaces { context = context.addInstruction(new PatioMemoryLoad( namespaceValue, - new PatioDataPtrConst(globalNameNamespaceValue(namespaceName)), + globalNameNamespaceValueOperand(namespaceName), PatioDataLayouts.DATA_POINTER, List.of(), source @@ -284,6 +284,10 @@ public class ShidToPatioNamespaces { private static final List<Integer> GC_CHILDREN_OFFSET = ShidToPatioGc.gcObjectOffset(List.of()); + private static PatioOperand globalNameNamespaceValueOperand(NamespaceName namespaceName) { + return PatioDataPtrConst.dataElement(globalNameNamespaceValue(namespaceName)); + } + // TODO: allocate names through context private static String globalNameNamespaceValue(NamespaceName namespaceName) { return "shed__namespace__" + namespaceNameToPatioIdentifier(namespaceName); @@ -293,6 +297,10 @@ public class ShidToPatioNamespaces { return "shed__namespaceInit__" + namespaceNameToPatioIdentifier(namespaceName); } + private static PatioOperand globalNameNamespaceIsInitedOperand(NamespaceName namespaceName) { + return PatioDataPtrConst.dataElement(globalNameNamespaceIsInited(namespaceName)); + } + private static String globalNameNamespaceIsInited(NamespaceName namespaceName) { return "shed__namespaceIsInited__" + namespaceNameToPatioIdentifier(namespaceName); } diff --git a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStrings.java b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStrings.java index a1c7d9bf..25643169 100644 --- a/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStrings.java +++ b/src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStrings.java @@ -10,6 +10,7 @@ import org.shedlang.compiler.patio.operands.PatioOperand; import org.shedlang.compiler.patio.types.PatioDataLayouts; import org.shedlang.compiler.patio.types.PatioDataValue; import org.shedlang.compiler.patio.types.PatioDataValues; +import org.shedlang.compiler.patio.values.PatioDataPtrValueDataElement; import org.shedlang.compiler.sources.Source; import org.shedlang.compiler.sources.Sources; @@ -60,7 +61,9 @@ public class ShidToPatioStrings { source )); - return context.toResult(new PatioDataPtrConst(elementName)); + return context.toResult(new PatioDataPtrConst( + new PatioDataPtrValueDataElement(elementName) + )); } public static ShidToPatioContext add( |
