diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-08 11:59:38 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-08 11:59:38 +0100 |
| commit | 5422f950cc5f1e8b591f15b5857be2339f313d63 (patch) | |
| tree | 86f56733ea66151418bf4ab4f87109925162d9d0 /src/main/java | |
| parent | 0231ae54d8f0f776424f1b6cb0c8993f34c53c28 (diff) | |
Add LLVM switch instruction
Diffstat (limited to 'src/main/java')
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 { } |
