diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-17 00:31:56 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-17 00:31:56 +0100 |
| commit | e0b8a6d542817ca464c46033e0c6323c23d2aeac (patch) | |
| tree | 094b54af25dbe71301a74904b152a707d0371af3 /src/main/java | |
| parent | 8bec9a955dba7ef7c178637844887de76590ebe3 (diff) | |
Add code for calculating size of an LLVM type in LLVM IR
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java | 2 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmSizeOf.java | 45 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java index 457fa7c5..27d7a4d0 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerLocalVariableSpace.java @@ -6,6 +6,8 @@ public enum LlvmCompilerLocalVariableSpace { CLOSURE_FUNCTION_POINTER_POINTER("closureFunctionPointerPointer"), CLOSURE_ENVIRONMENT_POINTER("closureEnvironmentPointer"), FIELD_POINTER("fieldPointer"), + SIZE_PTR("size_ptr"), + SIZE("size"), TEMPORARY("tmp"); private final String name; diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmSizeOf.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmSizeOf.java new file mode 100644 index 00000000..d26e8635 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmSizeOf.java @@ -0,0 +1,45 @@ +package org.shedlang.compiler.backends.llvm; + +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmGetElementPtr; +import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmPtrToInt; +import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand; +import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperandNull; +import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmTypedOperand; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; + +import java.util.List; + +public class LlvmSizeOf { + private LlvmSizeOf() { + } + + public static LlvmCompilerResult<LlvmOperand> sizeOf(LlvmType type, LlvmCompilerContext context) { + var sizePtrResult = context.generateVariableLocal(LlvmCompilerLocalVariableSpace.SIZE_PTR); + var sizePtr = sizePtrResult.value(); + context = sizePtrResult.context(); + + var sizeResult = context.generateVariableLocal(LlvmCompilerLocalVariableSpace.SIZE); + var size = sizeResult.value(); + context = sizeResult.context(); + + return context + .addInstruction( + new LlvmGetElementPtr( + sizePtr, + LlvmTypes.pointer(type), + new LlvmOperandNull(), + List.of(LlvmTypedOperand.arrayIndex(0)) + ) + ) + .addInstruction( + new LlvmPtrToInt( + size, + LlvmTypes.pointer(type), + sizePtr, + LlvmTypes.INT_64 + ) + ) + .toResult(size); + } +} |
