aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-04-08 18:48:57 +0100
committerMichael Williamson <mike@zwobble.org>2026-04-08 18:51:44 +0100
commit109eb835082418d55b099301e151a7d9331135e0 (patch)
tree23591f105da29423c9cadd998fdf2a780eda69ed /src/main/java
parentffcf99fabf00f21ee48f82c913e2ad06b3b0c395 (diff)
Add extractvalue instruction to LLVM IR
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java13
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmExtractValue.java15
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java2
3 files changed, 29 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
index 7106a192..b2f3f7b6 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
@@ -75,6 +75,19 @@ public class LlvmIrSerializer {
);
writer.append(")");
}
+
+ case LlvmExtractValue extractValue -> {
+ serializeVariable(extractValue.destination(), writer);
+ writer.append(" = extractvalue ");
+ serializeType(extractValue.aggregateType(), writer);
+ writer.append(" ");
+ serializeOperand(extractValue.aggregate(), writer);
+ for (var index : extractValue.indexes()) {
+ writer.append(", ");
+ writer.append(index.toString());
+ }
+ }
+
case LlvmGetElementPtr getElementPtr -> {
serializeVariable(getElementPtr.destination(), writer);
writer.append(" = getelementptr ");
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmExtractValue.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmExtractValue.java
new file mode 100644
index 00000000..1f4d7aad
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmExtractValue.java
@@ -0,0 +1,15 @@
+package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
+
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariable;
+import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
+
+import java.util.List;
+
+public record LlvmExtractValue(
+ LlvmVariable destination,
+ LlvmType aggregateType,
+ LlvmOperand aggregate,
+ List<Integer> indexes
+) implements LlvmInstruction {
+}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java
index 57bccf19..a8467bf9 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmInstruction.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
-public sealed interface LlvmInstruction permits LlvmAdd, LlvmAlloca, LlvmCall, LlvmGetElementPtr, LlvmIcmp, LlvmIntToPtr, LlvmLoad, LlvmPhi, LlvmPtrToInt, LlvmStore, LlvmSub, LlvmTrunc, LlvmZext {
+public sealed interface LlvmInstruction permits LlvmAdd, LlvmAlloca, LlvmCall, LlvmExtractValue, LlvmGetElementPtr, LlvmIcmp, LlvmIntToPtr, LlvmLoad, LlvmPhi, LlvmPtrToInt, LlvmStore, LlvmSub, LlvmTrunc, LlvmZext {
}