aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-19 10:33:37 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-19 10:38:14 +0000
commitdde9f5d961dc8a3bbaeba18b25d9d7b68ce66e36 (patch)
treeb7f0886db3a6d9c9e3504dce9a7cdef40e3b9625 /src/main/java
parent890b145acb5da23a029148c7a2cbba50c98f25e2 (diff)
Add data-ptr to Patio data layouts
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java19
-rw-r--r--src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java6
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java3
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayout.java2
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutDataPointer.java5
-rw-r--r--src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java23
6 files changed, 54 insertions, 4 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 e431a851..54e8f66b 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
@@ -170,7 +170,7 @@ public class LlvmPatioCodeGen {
for (var patioInstruction : patioInstructions) {
context = generateInstruction(patioInstruction, context);
}
-
+
return context;
}
@@ -407,7 +407,7 @@ public class LlvmPatioCodeGen {
);
var loopEndLabel = loopEndLabelResult.value();
context = loopEndLabelResult.context();
-
+
context = context.addTerminatorInstruction(new LlvmBrUnconditional(loopStartLabel));
context = context.setBasicBlockLabel(loopStartLabel.name());
@@ -472,7 +472,7 @@ public class LlvmPatioCodeGen {
yield context;
}
-
+
case PatioReturn patioReturn ->
context.addTerminatorInstruction(new LlvmReturn(
patioOperandToLlvmType(patioReturn.value(), context),
@@ -701,6 +701,9 @@ public class LlvmPatioCodeGen {
case PatioDataLayoutByte patioDataLayoutByte ->
throw new RuntimeException("offset not allowed for bytes");
+ case PatioDataLayoutDataPointer patioDataLayoutdataPointer ->
+ throw new RuntimeException("offset not allowed for data ptrs");
+
case PatioDataLayoutFunctionPointer patioDataLayoutFunctionPointer ->
throw new RuntimeException("offset not allowed for function ptrs");
@@ -728,6 +731,7 @@ public class LlvmPatioCodeGen {
PatioDataLayout patioDataLayout,
PVector<Integer> patioOffsets
) {
+ // TODO: check that offset is valid?
return switch (patioDataLayout) {
case PatioDataLayoutArray patioDataLayoutArray ->
patioDataOffsetToLlvmType(
@@ -741,6 +745,9 @@ public class LlvmPatioCodeGen {
case PatioDataLayoutByte patioDataLayoutByte ->
LlvmTypes.INT_8;
+ case PatioDataLayoutDataPointer patioDataLayoutDataPointer ->
+ LlvmTypes.pointer(LlvmTypes.VOID);
+
case PatioDataLayoutFunctionPointer patioDataLayoutFunctionPointer ->
LlvmTypes.pointer(LlvmTypes.VOID);
@@ -846,6 +853,9 @@ public class LlvmPatioCodeGen {
case PatioDataLayoutByte patioDataLayoutByte ->
LlvmTypes.INT_8;
+ case PatioDataLayoutDataPointer patioDataLayoutDataPointer ->
+ LlvmTypes.pointer(LlvmTypes.VOID);
+
case PatioDataLayoutFunctionPointer patioDataLayoutFunctionPointer ->
LlvmTypes.pointer(LlvmTypes.VOID);
@@ -878,6 +888,9 @@ public class LlvmPatioCodeGen {
case PatioDataLayoutByte patioDataLayoutByte ->
new LlvmOperandInt(0);
+ case PatioDataLayoutDataPointer patioDataLayoutDataPointer ->
+ new LlvmOperandNull();
+
case PatioDataLayoutFunctionPointer patioDataLayoutFunctionPointer ->
new LlvmOperandNull();
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 54471228..a0914b27 100644
--- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java
@@ -442,6 +442,9 @@ public class WasmPatioCodeGen {
case PatioDataLayoutByte patioDataLayoutByte ->
1;
+ case PatioDataLayoutDataPointer patioDataLayoutDataPointer ->
+ 4;
+
case PatioDataLayoutFunctionPointer patioDataLayoutFunctionPointer ->
4;
@@ -473,6 +476,9 @@ public class WasmPatioCodeGen {
case PatioDataLayoutByte patioDataLayoutByte -> {
throw new RuntimeException("offset not allowed for bytes");
}
+ case PatioDataLayoutDataPointer patioDataLayoutDataPointer -> {
+ throw new RuntimeException("offset not allowed for data ptrs");
+ }
case PatioDataLayoutFunctionPointer patioDataLayoutFunctionPointer -> {
throw new RuntimeException("offset not allowed for function ptrs");
}
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 f329e679..3a2ffe67 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java
@@ -423,6 +423,9 @@ public class PatioSerializer {
case PatioDataLayoutByte byte_ ->
treeIdentifier("byte");
+ case PatioDataLayoutDataPointer dataPointer ->
+ treeIdentifier("data-ptr");
+
case PatioDataLayoutFunctionPointer functionPointer ->
treeIdentifier("function-ptr");
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayout.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayout.java
index a2b4a91e..72654af1 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayout.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayout.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.patio.ast.types;
-public sealed interface PatioDataLayout permits PatioDataLayoutArray, PatioDataLayoutBool, PatioDataLayoutByte, PatioDataLayoutFunctionPointer, PatioDataLayoutInt, PatioDataLayoutStruct {
+public sealed interface PatioDataLayout permits PatioDataLayoutArray, PatioDataLayoutBool, PatioDataLayoutByte, PatioDataLayoutDataPointer, PatioDataLayoutFunctionPointer, PatioDataLayoutInt, PatioDataLayoutStruct {
}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutDataPointer.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutDataPointer.java
new file mode 100644
index 00000000..4e208641
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutDataPointer.java
@@ -0,0 +1,5 @@
+package org.shedlang.compiler.patio.ast.types;
+
+public record PatioDataLayoutDataPointer() implements PatioDataLayout {
+ public static final PatioDataLayoutDataPointer INSTANCE = new PatioDataLayoutDataPointer();
+}
diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java
index aaafd701..ba1dd9d1 100644
--- a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java
+++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java
@@ -8,6 +8,7 @@ public class PatioDataLayouts {
public static final PatioDataLayout BOOL = PatioDataLayoutBool.INSTANCE;
public static final PatioDataLayout BYTE = PatioDataLayoutByte.INSTANCE;
+ public static final PatioDataLayout DATA_POINTER = PatioDataLayoutDataPointer.INSTANCE;
public static final PatioDataLayout FUNCTION_POINTER = PatioDataLayoutFunctionPointer.INSTANCE;
public static final PatioDataLayout INT = PatioDataLayoutInt.INSTANCE;
@@ -18,4 +19,26 @@ public class PatioDataLayouts {
public static PatioDataLayout struct(List<PatioDataLayout> elements) {
return new PatioDataLayoutStruct(elements);
}
+
+ public static PatioDataLayout fromType(PatioType type) {
+ return switch (type) {
+ case PatioBoolType patioBoolType ->
+ BOOL;
+
+ case PatioByteType patioByteType ->
+ BYTE;
+
+ case PatioDataPointerType patioDataPointerType ->
+ DATA_POINTER;
+
+ case PatioFunctionPointerType patioFunctionPointerType ->
+ FUNCTION_POINTER;
+
+ case PatioIntType patioIntType ->
+ INT;
+
+ case PatioVoidType patioVoidType ->
+ throw new UnsupportedOperationException("TODO");
+ };
+ }
}