aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-28 19:41:00 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-28 19:41:00 +0000
commit8e069d9ddfd8c34f742d1dc4301a0fa5a76c16f6 (patch)
tree85ada8031cac9ead1aaf89cfc98ab4c48e6dc14e /src/main/java
parentefbf3709697f1a94bbbed83563e0d7225e79e0fa (diff)
Introduce PatioDataPtrValue
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java20
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java27
-rw-r--r--src/main/java/org/shedlang/compiler/patio/PatioSerializer.java14
-rw-r--r--src/main/java/org/shedlang/compiler/patio/operands/PatioDataPtrConst.java8
-rw-r--r--src/main/java/org/shedlang/compiler/patio/values/PatioDataPtrValue.java4
-rw-r--r--src/main/java/org/shedlang/compiler/patio/values/PatioDataPtrValueDataElement.java4
-rw-r--r--src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioNamespaces.java18
-rw-r--r--src/main/java/org/shedlang/compiler/shidtopatio/ShidToPatioStrings.java5
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(