From 8147341b40ea563e8bdabfab1a71dd9c39d72a7c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 21 Jan 2024 19:01:12 +0000 Subject: Add Patio byte-size-of and byte-offset-of instructions --- .../backends/llvm/codegen/PatioToLlvm.java | 6 ++++ .../compiler/backends/wasm/PatioToWasm.java | 6 ++++ .../shedlang/compiler/patio/PatioSerializer.java | 35 +++++++++++++++------- .../patio/instructions/PatioByteOffsetOf.java | 22 ++++++++++++++ .../patio/instructions/PatioByteSizeOf.java | 19 ++++++++++++ .../patio/instructions/PatioInstruction.java | 2 +- 6 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/instructions/PatioByteOffsetOf.java create mode 100644 src/main/java/org/shedlang/compiler/patio/instructions/PatioByteSizeOf.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 1a7c46a8..fbeaa039 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 @@ -370,6 +370,12 @@ public class PatioToLlvm { )); } + case PatioByteOffsetOf patioByteOffsetOf -> + throw new UnsupportedOperationException("TODO"); + + case PatioByteSizeOf patioByteSizeOf -> + throw new UnsupportedOperationException("TODO"); + case PatioCall patioCall -> { var destination = Optional.empty(); if (patioCall.destination().isPresent()) { 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 e9589935..c140bf92 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -214,6 +214,12 @@ public class PatioToWasm { yield context; } + case PatioByteOffsetOf patioByteOffsetOf -> + throw new UnsupportedOperationException("TODO"); + + case PatioByteSizeOf patioByteSizeOf -> + throw new UnsupportedOperationException("TODO"); + case PatioCall patioCall -> { for (var patioArg : patioCall.args()) { context = generateOperand(patioArg, context); diff --git a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java index 7a0a0d06..2d65bf1b 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioSerializer.java @@ -164,6 +164,21 @@ public class PatioSerializer { operandToTree(boolToInt.value()) ); + case PatioByteOffsetOf byteOffsetOf -> + treeListIndented( + treeIdentifier("byte-offset-of"), + operandToTree(byteOffsetOf.destination()), + dataLayoutToTree(byteOffsetOf.layout()), + offsetToTree(byteOffsetOf.offset()) + ); + + case PatioByteSizeOf byteSizeOf -> + treeListIndented( + treeIdentifier("byte-size-of"), + operandToTree(byteSizeOf.destination()), + dataLayoutToTree(byteSizeOf.layout()) + ); + case PatioCall call -> treeList( treeIdentifier("call"), @@ -272,11 +287,7 @@ public class PatioSerializer { operandToTree(memoryLoad.destination()), treeNamed("pointer", operandToTree(memoryLoad.pointer())), treeNamed("layout", dataLayoutToTree(memoryLoad.layout())), - treeNamed("offset", treeList( - memoryLoad.offset().stream() - .map(offset -> treeInt(offset)) - .toList() - )) + treeNamed("offset", offsetToTree(memoryLoad.offset())) ); case PatioMemoryStore memoryStore -> @@ -284,11 +295,7 @@ public class PatioSerializer { treeIdentifier("memory-store"), treeNamed("pointer", operandToTree(memoryStore.pointer())), treeNamed("layout", dataLayoutToTree(memoryStore.layout())), - treeNamed("offset", treeList( - memoryStore.offset().stream() - .map(offset -> treeInt(offset)) - .toList() - )), + treeNamed("offset", offsetToTree(memoryStore.offset())), treeNamed("value", operandToTree(memoryStore.value())) ); @@ -548,6 +555,14 @@ public class PatioSerializer { }; } + private static Tree offsetToTree(List memoryLoad) { + return treeList( + memoryLoad.stream() + .map(offset -> treeInt(offset)) + .toList() + ); + } + private static Tree visibilityToTree(PatioVisibility visibility) { return treeIdentifier(switch (visibility) { case PRIVATE -> "private"; diff --git a/src/main/java/org/shedlang/compiler/patio/instructions/PatioByteOffsetOf.java b/src/main/java/org/shedlang/compiler/patio/instructions/PatioByteOffsetOf.java new file mode 100644 index 00000000..40cf3c67 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/instructions/PatioByteOffsetOf.java @@ -0,0 +1,22 @@ +package org.shedlang.compiler.patio.instructions; + +import org.shedlang.compiler.patio.operands.PatioLocalRef; +import org.shedlang.compiler.patio.types.PatioDataLayout; +import org.shedlang.compiler.sources.Source; + +import java.util.List; + +/** + * Get the offset, in bytes, of an offset in a data layout. + */ +public record PatioByteOffsetOf( + PatioLocalRef destination, + PatioDataLayout layout, + List offset, + Source source +) implements PatioInstruction { + @Override + public boolean isBlockTerminator() { + return false; + } +} diff --git a/src/main/java/org/shedlang/compiler/patio/instructions/PatioByteSizeOf.java b/src/main/java/org/shedlang/compiler/patio/instructions/PatioByteSizeOf.java new file mode 100644 index 00000000..e4f97309 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/instructions/PatioByteSizeOf.java @@ -0,0 +1,19 @@ +package org.shedlang.compiler.patio.instructions; + +import org.shedlang.compiler.patio.operands.PatioLocalRef; +import org.shedlang.compiler.patio.types.PatioDataLayout; +import org.shedlang.compiler.sources.Source; + +/** + * Get the size, in bytes, of a data layout. + */ +public record PatioByteSizeOf( + PatioLocalRef destination, + PatioDataLayout layout, + Source source +) implements PatioInstruction { + @Override + public boolean isBlockTerminator() { + return false; + } +} diff --git a/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java b/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java index 8c5860a7..72d62c99 100644 --- a/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java +++ b/src/main/java/org/shedlang/compiler/patio/instructions/PatioInstruction.java @@ -2,7 +2,7 @@ package org.shedlang.compiler.patio.instructions; import org.shedlang.compiler.sources.Source; -public sealed interface PatioInstruction permits PatioAllocHeap, PatioAllocStack, PatioBlock, PatioBoolToInt, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioLoop, PatioLoopBreak, PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioResume, PatioReturn, PatioReturnVoid, PatioSwitch, PatioThrow, PatioTry, PatioUnreachable, PatioVarLoad, PatioVarStore { +public sealed interface PatioInstruction permits PatioAllocHeap, PatioAllocStack, PatioBlock, PatioBoolToInt, PatioByteOffsetOf, PatioByteSizeOf, PatioCall, PatioCallPointer, PatioDataPtrToInt, PatioIf, PatioIntAdd, PatioIntEquals, PatioIntNotEqual, PatioIntSub, PatioIntToBool, PatioIntToDataPtr, PatioLocalStore, PatioLoop, PatioLoopBreak, PatioLoopContinue, PatioMemoryLoad, PatioMemoryStore, PatioResume, PatioReturn, PatioReturnVoid, PatioSwitch, PatioThrow, PatioTry, PatioUnreachable, PatioVarLoad, PatioVarStore { boolean isBlockTerminator(); Source source(); } -- cgit v1.2.3