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 --- ...LlvmIrSerializerTerminatorInstructionTests.java | 22 ++++++++++++++++++++++ .../compiler/backends/llvm/ir/ast/LlvmIr.java | 13 +++++++++++++ 2 files changed, 35 insertions(+) (limited to 'src/test/java') diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTerminatorInstructionTests.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTerminatorInstructionTests.java index 992fcebe..9c697385 100644 --- a/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTerminatorInstructionTests.java +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializerTerminatorInstructionTests.java @@ -5,6 +5,7 @@ import org.shedlang.compiler.backends.llvm.ir.ast.LlvmIr; import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; import java.io.IOException; +import java.util.List; import static org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializerTesting.serializeToString; import static org.zwobble.precisely.AssertThat.assertThat; @@ -29,6 +30,27 @@ public class LlvmIrSerializerTerminatorInstructionTests { assertThat(result, equalTo("ret void")); } + @Test + public void switchIsSerialized() throws IOException { + var instruction = LlvmIr.switch_( + LlvmTypes.INT_64, + LlvmIr.variableLocal("value"), + "otherwise", + List.of( + LlvmIr.switchCase(1, "case1"), + LlvmIr.switchCase(2, "case2") + ) + ); + + var result = serializeToString(instruction, LlvmIrSerializer::serializeTerminatorInstruction); + + assertThat(result, equalTo(""" + switch i64 %value, label %otherwise, [ + i64 1, label %case1 + i64 2, label %case2 + ]""")); + } + @Test public void unreachableIsSerialized() throws IOException { var instruction = LlvmIr.unreachable(); diff --git a/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java b/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java index 0da16362..bbf72a3e 100644 --- a/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java +++ b/src/test/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmIr.java @@ -190,6 +190,19 @@ public class LlvmIr { return new LlvmSub(target, type, left, right); } + public static LlvmSwitch switch_( + LlvmType valueType, + LlvmOperand value, + String defaultDestLabel, + List cases + ) { + return new LlvmSwitch(valueType, value, defaultDestLabel, cases); + } + + public static LlvmSwitch.Case switchCase(int value, String destLabel) { + return new LlvmSwitch.Case(value, destLabel); + } + public static LlvmTrunc trunc( LlvmVariable target, LlvmType sourceType, -- cgit v1.2.3