aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-08 11:59:38 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-08 11:59:38 +0100
commit5422f950cc5f1e8b591f15b5857be2339f313d63 (patch)
tree86f56733ea66151418bf4ab4f87109925162d9d0 /src/main/java
parent0231ae54d8f0f776424f1b6cb0c8993f34c53c28 (diff)
Add LLVM switch instruction
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java19
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmSwitch.java15
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTerminatorInstruction.java2
3 files changed, 35 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 34bf31f5..cf9f8176 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
@@ -254,6 +254,25 @@ public class LlvmIrSerializer {
case LlvmReturnVoid returnVoid -> {
writer.append("ret void");
}
+ case LlvmSwitch switch_ -> {
+ writer.append("switch ");
+ serializeType(switch_.valueType(), writer);
+ writer.append(" ");
+ serializeOperand(switch_.value(), writer);
+ writer.append(", label %");
+ writer.append(switch_.defaultDestLabel());
+ writer.append(", [\n");
+ for (var switchCase : switch_.cases()) {
+ writer.append(" ");
+ serializeType(switch_.valueType(), writer);
+ writer.append(" ");
+ writer.append(Integer.toString(switchCase.value()));
+ writer.append(", label %");
+ writer.append(switchCase.destLabel());
+ writer.append("\n");
+ }
+ writer.append("]");
+ }
case LlvmUnreachable unreachable -> {
writer.append("unreachable");
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmSwitch.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmSwitch.java
new file mode 100644
index 00000000..c3aecc68
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmSwitch.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.types.LlvmType;
+
+import java.util.List;
+
+public record LlvmSwitch(
+ LlvmType valueType,
+ LlvmOperand value,
+ String defaultDestLabel,
+ List<Case> cases
+) implements LlvmTerminatorInstruction {
+ public record Case(int value, String destLabel) {}
+}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTerminatorInstruction.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTerminatorInstruction.java
index 1b8120ab..224aec5d 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTerminatorInstruction.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmTerminatorInstruction.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
-public sealed interface LlvmTerminatorInstruction permits LlvmBr, LlvmBrUnconditional, LlvmReturn, LlvmReturnVoid, LlvmUnreachable {
+public sealed interface LlvmTerminatorInstruction permits LlvmBr, LlvmBrUnconditional, LlvmReturn, LlvmReturnVoid, LlvmSwitch, LlvmUnreachable {
}