diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-08 16:49:03 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-08 16:49:03 +0100 |
| commit | ebf5f513c8305ae37d03d990fb24e5b7a6623244 (patch) | |
| tree | ca6870038c420a6552618747a917973e2e49c344 /src/main/java | |
| parent | 2e491ca13d1035e10f4c5ed51af3d5246596820d (diff) | |
Support Patio switch with reachable default in LLVM code gen
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java | 3 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java | 36 |
2 files changed, 22 insertions, 17 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java index 989c657f..fb65ffb8 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java @@ -27,7 +27,8 @@ public enum LlvmCodeGenLocalVariableSpace { SIZE("size"), SWITCH_CASE_START("switchCaseStart"), SWITCH_CASE_END("switchCaseEnd"), - SWITCH_DEFAULT("switchDefault"), + SWITCH_DEFAULT_START("switchDefaultStart"), + SWITCH_DEFAULT_END("switchDefaultEnd"), SWITCH_END("switchEnd"), TEMPORARY("tmp"); diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java index fce77ab8..e431a851 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java @@ -300,8 +300,8 @@ public class LlvmPatioCodeGen { context = generateBranches( patioIf.targets(), List.of( - new Branch(ifTrueStartLabel, Optional.of(ifTrueEndLabel), patioIf.trueBody()), - new Branch(ifFalseStartLabel, Optional.of(ifFalseEndLabel), patioIf.falseBody()) + new Branch(ifTrueStartLabel, ifTrueEndLabel, patioIf.trueBody()), + new Branch(ifFalseStartLabel, ifFalseEndLabel, patioIf.falseBody()) ), endLabel, context @@ -480,11 +480,17 @@ public class LlvmPatioCodeGen { )); case PatioSwitch patioSwitch -> { - var defaultLabelResult = context.allocateLocalName( - LlvmCodeGenLocalVariableSpace.SWITCH_DEFAULT + var switchDefaultStartLabelResult = context.allocateLocalName( + LlvmCodeGenLocalVariableSpace.SWITCH_DEFAULT_START ); - var switchDefaultLabel = defaultLabelResult.value(); - context = defaultLabelResult.context(); + var switchDefaultStartLabel = switchDefaultStartLabelResult.value(); + context = switchDefaultStartLabelResult.context(); + + var switchDefaultEndLabelResult = context.allocateLocalName( + LlvmCodeGenLocalVariableSpace.SWITCH_DEFAULT_END + ); + var switchDefaultEndLabel = switchDefaultEndLabelResult.value(); + context = switchDefaultEndLabelResult.context(); var switchEndLabelResult = context.allocateLocalName( LlvmCodeGenLocalVariableSpace.SWITCH_END @@ -511,7 +517,7 @@ public class LlvmPatioCodeGen { branches.add(new Branch( caseStartLabel, - Optional.of(caseEndLabel), + caseEndLabel, patioSwitchCase.body() )); @@ -522,16 +528,15 @@ public class LlvmPatioCodeGen { } branches.add(new Branch( - switchDefaultLabel, - // TODO: handle defaults that don't terminate - Optional.empty(), + switchDefaultStartLabel, + switchDefaultEndLabel, patioSwitch.defaultBody() )); context = context.addTerminatorInstruction(new LlvmSwitch( LlvmTypes.INT_64, patioOperandToLlvmOperand(patioSwitch.value(), context), - switchDefaultLabel, + switchDefaultStartLabel, llvmSwitchCases )); @@ -587,7 +592,7 @@ public class LlvmPatioCodeGen { record Branch( LlvmVariableLocal startLabel, - Optional<LlvmVariableLocal> endLabel, + LlvmVariableLocal endLabel, PatioBlock body ) {} @@ -607,17 +612,16 @@ public class LlvmPatioCodeGen { .anyMatch(instruction -> instruction instanceof PatioUnreachable); if (!endIsUnreachable) { - var branchEndLabel = branch.endLabel.orElseThrow(); context = context.addTerminatorInstruction(new LlvmBrUnconditional( - branchEndLabel + branch.endLabel )); // TODO: only allow basic block label to be set with terminator instruction? - context = context.setBasicBlockLabel(branchEndLabel.name()); + context = context.setBasicBlockLabel(branch.endLabel.name()); context = context.addTerminatorInstruction(new LlvmBrUnconditional( endLabel )); - phiPredecessors.add(new PhiPredecessor(branch.body, branchEndLabel)); + phiPredecessors.add(new PhiPredecessor(branch.body, branch.endLabel)); } } |
