From 179e0fbaf8eace47a02a94b78700d11b94554d64 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 27 Jan 2024 10:54:48 +0000 Subject: Extract PatioOffsets --- .../backends/llvm/codegen/PatioToLlvm.java | 38 ++---------------- .../compiler/patio/types/PatioOffsets.java | 46 ++++++++++++++++++++++ 2 files changed, 50 insertions(+), 34 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/patio/types/PatioOffsets.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 c185c016..d646be12 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 @@ -1046,40 +1046,10 @@ public class PatioToLlvm { PVector patioOffsets, LlvmTarget target ) { - // TODO: check that offset is valid? - return switch (patioDataLayout) { - case PatioDataLayoutArray patioDataLayoutArray -> - patioDataOffsetToLlvmType( - patioDataLayoutArray.element(), - patioOffsets.minus(0), - target - ); - - case PatioDataLayoutBool patioDataLayoutBool -> - LlvmTypes.INT_1; - - case PatioDataLayoutByte patioDataLayoutByte -> - LlvmTypes.INT_8; - - case PatioDataLayoutDataPointer patioDataLayoutDataPointer -> - LlvmTypes.pointer(LlvmTypes.VOID); - - case PatioDataLayoutFunctionPointer patioDataLayoutFunctionPointer -> - LlvmTypes.pointer(LlvmTypes.VOID); - - case PatioDataLayoutInt patioDataLayoutInt -> - target.patioIntType(); - - case PatioDataLayoutInt32 patioDataLayoutInt32 -> - LlvmTypes.INT_32; - - case PatioDataLayoutStruct patioDataLayoutStruct -> - patioDataOffsetToLlvmType( - patioDataLayoutStruct.elements().get(patioOffsets.get(0)), - patioOffsets.minus(0), - target - ); - }; + return patioDataLayoutToLlvmType( + PatioOffsets.offsetDataLayout(patioDataLayout, patioOffsets), + target + ); } private static LlvmTypedOperand patioOperandToLlvmTypedOperand( diff --git a/src/main/java/org/shedlang/compiler/patio/types/PatioOffsets.java b/src/main/java/org/shedlang/compiler/patio/types/PatioOffsets.java new file mode 100644 index 00000000..f4a13bb0 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/patio/types/PatioOffsets.java @@ -0,0 +1,46 @@ +package org.shedlang.compiler.patio.types; + +import org.pcollections.PVector; + +public class PatioOffsets { + private PatioOffsets() { + } + + public static PatioDataLayout offsetDataLayout( + PatioDataLayout patioDataLayout, + PVector patioOffsets + ) { + // TODO: check that offset is valid? + return switch (patioDataLayout) { + case PatioDataLayoutArray patioDataLayoutArray -> + offsetDataLayout( + patioDataLayoutArray.element(), + patioOffsets.minus(0) + ); + + case PatioDataLayoutBool patioDataLayoutBool -> + patioDataLayout; + + case PatioDataLayoutByte patioDataLayoutByte -> + patioDataLayout; + + case PatioDataLayoutDataPointer patioDataLayoutDataPointer -> + patioDataLayout; + + case PatioDataLayoutFunctionPointer patioDataLayoutFunctionPointer -> + patioDataLayout; + + case PatioDataLayoutInt patioDataLayoutInt -> + patioDataLayout; + + case PatioDataLayoutInt32 patioDataLayoutInt32 -> + patioDataLayout; + + case PatioDataLayoutStruct patioDataLayoutStruct -> + offsetDataLayout( + patioDataLayoutStruct.elements().get(patioOffsets.get(0)), + patioOffsets.minus(0) + ); + }; + } +} -- cgit v1.2.3