From d9a377762129c72ff18c34c8268579517ae6c3bf Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 21 Jul 2023 16:43:49 +0100 Subject: Add arrays to Patio data layouts --- .../java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java | 7 +++++++ src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java | 7 +++++++ .../org/shedlang/compiler/patio/ast/types/PatioDataLayout.java | 2 +- .../shedlang/compiler/patio/ast/types/PatioDataLayoutArray.java | 4 ++++ .../org/shedlang/compiler/patio/ast/types/PatioDataLayouts.java | 4 ++++ 5 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutArray.java (limited to 'src/main/java') 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 d9d65f11..9e845a07 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmPatioCodeGen.java @@ -245,6 +245,10 @@ public class WasmPatioCodeGen { for (var patioOffset : patioOffsets) { switch (patioDataLayout) { + case PatioDataLayoutArray patioDataLayoutArray -> { + wasmOffset += sizeOf(patioDataLayoutArray.element()) * patioOffset; + patioDataLayout = patioDataLayoutArray.element(); + } case PatioDataLayoutScalar patioDataLayoutScalar -> { throw new RuntimeException("offset not allowed for scalars"); } @@ -291,6 +295,9 @@ public class WasmPatioCodeGen { private static int sizeOf(PatioDataLayout layout) { return switch (layout) { + case PatioDataLayoutArray patioDataLayoutArray -> + sizeOf(patioDataLayoutArray.element()) * patioDataLayoutArray.size(); + case PatioDataLayoutScalar patioDataLayoutScalar -> 4; 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 59be2821..8c02d3d3 100644 --- a/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/ast/PatioSerializer.java @@ -280,6 +280,13 @@ public class PatioSerializer { private static Tree dataLayoutToTree(PatioDataLayout layout) { return switch (layout) { + case PatioDataLayoutArray array -> + treeList( + treeIdentifier("array"), + dataLayoutToTree(array.element()), + treeInt(array.size()) + ); + case PatioDataLayoutScalar scalar -> typeToTree(scalar.type()); 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 19688bcb..13a03f2e 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 PatioDataLayoutScalar, PatioDataLayoutStruct { +public sealed interface PatioDataLayout permits PatioDataLayoutArray, PatioDataLayoutScalar, PatioDataLayoutStruct { } diff --git a/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutArray.java b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutArray.java new file mode 100644 index 00000000..eec92389 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutArray.java @@ -0,0 +1,4 @@ +package org.shedlang.compiler.patio.ast.types; + +public record PatioDataLayoutArray(PatioDataLayout element, int size) implements PatioDataLayout { +} 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 eccae15b..d523eb1f 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 @@ -6,6 +6,10 @@ public class PatioDataLayouts { private PatioDataLayouts() { } + public static PatioDataLayout array(PatioDataLayout element, int size) { + return new PatioDataLayoutArray(element, size); + } + public static PatioDataLayout scalar(PatioType type) { return new PatioDataLayoutScalar(type); } -- cgit v1.2.3