aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-17 00:31:56 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-17 00:31:56 +0100
commite0b8a6d542817ca464c46033e0c6323c23d2aeac (patch)
tree094b54af25dbe71301a74904b152a707d0371af3 /src/main/java
parent8bec9a955dba7ef7c178637844887de76590ebe3 (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.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmSizeOf.java45
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);
+ }
+}