From de25b93ec50da213047fe423f77583c92d692eca Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 21 Jan 2024 17:06:00 +0000 Subject: Add Patio type index --- .../compiler/backends/llvm/codegen/PatioToLlvm.java | 15 +++++++++++++++ .../org/shedlang/compiler/backends/wasm/PatioToWasm.java | 8 ++++++++ .../java/org/shedlang/compiler/patio/PatioSerializer.java | 6 ++++++ .../shedlang/compiler/patio/types/PatioDataLayout.java | 2 +- .../compiler/patio/types/PatioDataLayoutTypeIndex.java | 5 +++++ .../shedlang/compiler/patio/types/PatioDataLayouts.java | 4 ++++ .../java/org/shedlang/compiler/patio/types/PatioType.java | 2 +- .../shedlang/compiler/patio/types/PatioTypeIndexType.java | 5 +++++ .../org/shedlang/compiler/patio/types/PatioTypes.java | 1 + 9 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/types/PatioDataLayoutTypeIndex.java create mode 100644 src/main/java/org/shedlang/compiler/patio/types/PatioTypeIndexType.java (limited to 'src/main/java') 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 8810f886..1a7c46a8 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 @@ -1063,6 +1063,9 @@ public class PatioToLlvm { patioOffsets.minus(0), llvmOffsets.plus(LlvmTypedOperand.structureIndex(patioOffset)) ); + + case PatioDataLayoutTypeIndex patioDataLayoutTypeIndex -> + throw new RuntimeException("offset not allowed for type indices"); }; } } @@ -1114,6 +1117,9 @@ public class PatioToLlvm { patioOffsets.minus(0), target ); + + case PatioDataLayoutTypeIndex patioDataLayoutTypeIndex -> + LlvmTypes.INT_32; }; } @@ -1192,6 +1198,9 @@ public class PatioToLlvm { case PatioIntType patioIntType -> target.patioIntType(); + case PatioTypeIndexType patioTypeIndexType -> + LlvmTypes.INT_32; + case PatioVoidType patioVoidType -> LlvmTypes.VOID; }; @@ -1232,6 +1241,9 @@ public class PatioToLlvm { .map(element -> patioDataLayoutToLlvmType(element, target)) .toList() ); + + case PatioDataLayoutTypeIndex patioDataLayoutTypeIndex -> + LlvmTypes.INT_32; }; } @@ -1279,6 +1291,9 @@ public class PatioToLlvm { )) .toList() ); + + case PatioDataLayoutTypeIndex patioDataLayoutTypeIndex -> + new LlvmOperandInt(0); }; } 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 2fd8916f..e9589935 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -621,6 +621,9 @@ public class PatioToWasm { patioDataLayoutStruct.elements().stream() .map(element -> sizeOf(element, target)) .reduce(0, Integer::sum); + + case PatioDataLayoutTypeIndex patioDataLayoutTypeIndex -> + WasmValueType.I32.sizeBytes(); }; } @@ -660,6 +663,9 @@ public class PatioToWasm { } patioDataLayout = patioDataLayoutStruct.elements().get(patioOffset); } + case PatioDataLayoutTypeIndex patioDataLayoutTypeIndex -> { + throw new RuntimeException("offset not allowed for type indices"); + } } } @@ -781,6 +787,8 @@ public class PatioToWasm { target.functionPointerType(); case PatioIntType patioIntType -> target.patioIntType(); + case PatioTypeIndexType patioTypeIndexType -> + WasmValueType.I32; case PatioVoidType patioVoidType -> throw new IllegalArgumentException("Cannot have void values"); }; diff --git a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java index be6200e0..7a0a0d06 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java @@ -455,6 +455,9 @@ public class PatioSerializer { case PatioIntType intType -> treeIdentifier("int"); + case PatioTypeIndexType typeIndexType -> + treeIdentifier("type-index"); + case PatioVoidType voidType -> treeIdentifier("void"); }; @@ -493,6 +496,9 @@ public class PatioSerializer { .toList() ) ); + + case PatioDataLayoutTypeIndex typeIndex -> + treeIdentifier("type-index"); }; } diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayout.java b/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayout.java index 9649cecf..74704517 100644 --- a/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayout.java +++ b/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayout.java @@ -1,4 +1,4 @@ package org.shedlang.compiler.patio.types; -public sealed interface PatioDataLayout permits PatioDataLayoutArray, PatioDataLayoutBool, PatioDataLayoutByte, PatioDataLayoutDataPointer, PatioDataLayoutFunctionPointer, PatioDataLayoutInt, PatioDataLayoutStruct { +public sealed interface PatioDataLayout permits PatioDataLayoutArray, PatioDataLayoutBool, PatioDataLayoutByte, PatioDataLayoutDataPointer, PatioDataLayoutFunctionPointer, PatioDataLayoutInt, PatioDataLayoutStruct, PatioDataLayoutTypeIndex { } diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayoutTypeIndex.java b/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayoutTypeIndex.java new file mode 100644 index 00000000..9aafb675 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayoutTypeIndex.java @@ -0,0 +1,5 @@ +package org.shedlang.compiler.patio.types; + +public record PatioDataLayoutTypeIndex() implements PatioDataLayout { + public static final PatioDataLayoutTypeIndex INSTANCE = new PatioDataLayoutTypeIndex(); +} diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayouts.java b/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayouts.java index c28124aa..39a2c199 100644 --- a/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayouts.java +++ b/src/main/java/org/shedlang/compiler/patio/types/PatioDataLayouts.java @@ -11,6 +11,7 @@ public class PatioDataLayouts { public static final PatioDataLayout DATA_POINTER = PatioDataLayoutDataPointer.INSTANCE; public static final PatioDataLayout FUNCTION_POINTER = PatioDataLayoutFunctionPointer.INSTANCE; public static final PatioDataLayout INT = PatioDataLayoutInt.INSTANCE; + public static final PatioDataLayout TYPE_INDEX = PatioDataLayoutTypeIndex.INSTANCE; public static PatioDataLayout array(PatioDataLayout element, int size) { return new PatioDataLayoutArray(element, size); @@ -37,6 +38,9 @@ public class PatioDataLayouts { case PatioIntType patioIntType -> INT; + case PatioTypeIndexType patioTypeIndexType -> + TYPE_INDEX; + case PatioVoidType patioVoidType -> throw new UnsupportedOperationException("TODO"); }; diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioType.java b/src/main/java/org/shedlang/compiler/patio/types/PatioType.java index 13caa01d..eaed08ee 100644 --- a/src/main/java/org/shedlang/compiler/patio/types/PatioType.java +++ b/src/main/java/org/shedlang/compiler/patio/types/PatioType.java @@ -1,4 +1,4 @@ package org.shedlang.compiler.patio.types; -public sealed interface PatioType permits PatioBoolType, PatioByteType, PatioDataPointerType, PatioFunctionPointerType, PatioIntType, PatioVoidType { +public sealed interface PatioType permits PatioBoolType, PatioByteType, PatioDataPointerType, PatioFunctionPointerType, PatioIntType, PatioTypeIndexType, PatioVoidType { } diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioTypeIndexType.java b/src/main/java/org/shedlang/compiler/patio/types/PatioTypeIndexType.java new file mode 100644 index 00000000..1463e0e9 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/types/PatioTypeIndexType.java @@ -0,0 +1,5 @@ +package org.shedlang.compiler.patio.types; + +public record PatioTypeIndexType() implements PatioType { + public static final PatioTypeIndexType INSTANCE = new PatioTypeIndexType(); +} diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioTypes.java b/src/main/java/org/shedlang/compiler/patio/types/PatioTypes.java index dcfbd08e..352eaa44 100644 --- a/src/main/java/org/shedlang/compiler/patio/types/PatioTypes.java +++ b/src/main/java/org/shedlang/compiler/patio/types/PatioTypes.java @@ -9,5 +9,6 @@ public class PatioTypes { public static final PatioDataPointerType DATA_POINTER = PatioDataPointerType.INSTANCE; public static final PatioFunctionPointerType FUNCTION_POINTER = PatioFunctionPointerType.INSTANCE; public static final PatioIntType INT = PatioIntType.INSTANCE; + public static final PatioTypeIndexType TYPE_INDEX = PatioTypeIndexType.INSTANCE; public static final PatioVoidType VOID = PatioVoidType.INSTANCE; } -- cgit v1.2.3