diff options
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 { } |
