From 5422f950cc5f1e8b591f15b5857be2339f313d63 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 8 Oct 2023 11:59:38 +0100 Subject: Add LLVM switch instruction --- .../compiler/backends/llvm/ir/LlvmIrSerializer.java | 19 +++++++++++++++++++ .../backends/llvm/ir/ast/instructions/LlvmSwitch.java | 15 +++++++++++++++ .../ast/instructions/LlvmTerminatorInstruction.java | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmSwitch.java (limited to 'src/main/java') 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 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 { } -- cgit v1.2.3