From dde9f5d961dc8a3bbaeba18b25d9d7b68ce66e36 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 19 Nov 2023 10:33:37 +0000 Subject: Add data-ptr to Patio data layouts --- .../compiler/backends/llvm/LlvmPatioCodeGen.java | 19 +++++++++++++++--- .../compiler/backends/wasm/WasmPatioCodeGen.java | 6 ++++++ .../compiler/patio/ast/PatioSerializer.java | 3 +++ .../compiler/patio/ast/types/PatioDataLayout.java | 2 +- .../ast/types/PatioDataLayoutDataPointer.java | 5 +++++ .../compiler/patio/ast/types/PatioDataLayouts.java | 23 ++++++++++++++++++++++ 6 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/ast/types/PatioDataLayoutDataPointer.java (limited to 'src/main/java') 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 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 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"); + }; + } } -- cgit v1.2.3