diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-21 17:06:00 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-21 17:06:00 +0000 |
| commit | de25b93ec50da213047fe423f77583c92d692eca (patch) | |
| tree | 1581419b1426db4e64ab9d5182ef43da5f82ec3e /src/main/java | |
| parent | f4c370d0a0b62f3a85e19f492107138d9a9fb4a2 (diff) | |
Add Patio type index
Diffstat (limited to 'src/main/java')
9 files changed, 46 insertions, 2 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 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; } |
