From e0b8a6d542817ca464c46033e0c6323c23d2aeac Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 17 Jun 2023 00:31:56 +0100 Subject: Add code for calculating size of an LLVM type in LLVM IR --- .../llvm/LlvmCompilerLocalVariableSpace.java | 2 + .../compiler/backends/llvm/LlvmSizeOf.java | 45 ++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/LlvmSizeOf.java (limited to 'src/main/java') 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 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); + } +} -- cgit v1.2.3