diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-27 10:54:48 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-27 10:54:48 +0000 |
| commit | 179e0fbaf8eace47a02a94b78700d11b94554d64 (patch) | |
| tree | f628319b95b4404b60c41a0b6937c4197630acb6 /src/main/java | |
| parent | 4e116e25a5c0d9b9b7f92e3c363a93902eaf19d6 (diff) | |
Extract PatioOffsets
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java | 38 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/patio/types/PatioOffsets.java | 46 |
2 files changed, 50 insertions, 34 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 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<Integer> 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<Integer> 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) + ); + }; + } +} |
