From 2e491ca13d1035e10f4c5ed51af3d5246596820d Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 8 Oct 2023 16:41:55 +0100 Subject: Use LlvmVariableLocal for labels --- .../compiler/backends/llvm/LlvmPatioCodeGen.java | 18 +++++++++--------- .../compiler/backends/llvm/ir/LlvmIrSerializer.java | 20 ++++++++++---------- .../backends/llvm/ir/ast/instructions/LlvmBr.java | 5 +++-- .../ir/ast/instructions/LlvmBrUnconditional.java | 4 +++- .../llvm/ir/ast/instructions/LlvmSwitch.java | 5 +++-- 5 files changed, 28 insertions(+), 24 deletions(-) (limited to 'src/main/java') 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 79f2e99f..fce77ab8 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java @@ -293,8 +293,8 @@ public class LlvmPatioCodeGen { context = context.addTerminatorInstruction(new LlvmBr( patioOperandToLlvmOperand(patioIf.condition(), context), - ifTrueStartLabel.name(), - ifFalseStartLabel.name() + ifTrueStartLabel, + ifFalseStartLabel )); context = generateBranches( @@ -408,7 +408,7 @@ public class LlvmPatioCodeGen { var loopEndLabel = loopEndLabelResult.value(); context = loopEndLabelResult.context(); - context = context.addTerminatorInstruction(new LlvmBrUnconditional(loopStartLabel.name())); + context = context.addTerminatorInstruction(new LlvmBrUnconditional(loopStartLabel)); context = context.setBasicBlockLabel(loopStartLabel.name()); @@ -422,10 +422,10 @@ public class LlvmPatioCodeGen { } case PatioLoopBreak patioLoopBreak -> - context.addTerminatorInstruction(new LlvmBrUnconditional(context.loopEndLabel().name())); + context.addTerminatorInstruction(new LlvmBrUnconditional(context.loopEndLabel())); case PatioLoopContinue patioLoopContinue -> - context.addTerminatorInstruction(new LlvmBrUnconditional(context.loopStartLabel().name())); + context.addTerminatorInstruction(new LlvmBrUnconditional(context.loopStartLabel())); case PatioMemoryLoad patioMemoryLoad -> { var targetResult = context.addPatioLocalToLlvmLocal(patioMemoryLoad.target()); @@ -517,7 +517,7 @@ public class LlvmPatioCodeGen { llvmSwitchCases.add(new LlvmSwitch.Case( patioSwitchCase.value(), - caseStartLabel.name() + caseStartLabel )); } @@ -531,7 +531,7 @@ public class LlvmPatioCodeGen { context = context.addTerminatorInstruction(new LlvmSwitch( LlvmTypes.INT_64, patioOperandToLlvmOperand(patioSwitch.value(), context), - switchDefaultLabel.name(), + switchDefaultLabel, llvmSwitchCases )); @@ -609,12 +609,12 @@ public class LlvmPatioCodeGen { if (!endIsUnreachable) { var branchEndLabel = branch.endLabel.orElseThrow(); context = context.addTerminatorInstruction(new LlvmBrUnconditional( - branchEndLabel.name() + branchEndLabel )); // TODO: only allow basic block label to be set with terminator instruction? context = context.setBasicBlockLabel(branchEndLabel.name()); context = context.addTerminatorInstruction(new LlvmBrUnconditional( - endLabel.name() + endLabel )); phiPredecessors.add(new PhiPredecessor(branch.body, branchEndLabel)); 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 3e2d597b..d3672574 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 @@ -236,14 +236,14 @@ public class LlvmIrSerializer { case LlvmBr br -> { writer.append("br i1 "); serializeOperand(br.condition(), writer); - writer.append(", label %"); - writer.append(br.ifTrueLabel()); - writer.append(", label %"); - writer.append(br.ifFalseLabel()); + writer.append(", label "); + serializeVariable(br.ifTrueLabel(), writer); + writer.append(", label "); + serializeVariable(br.ifFalseLabel(), writer); } case LlvmBrUnconditional br -> { - writer.append("br label %"); - writer.append(br.targetLabel()); + writer.append("br label "); + serializeVariable(br.targetLabel(), writer); } case LlvmReturn returnValue -> { writer.append("ret "); @@ -259,16 +259,16 @@ public class LlvmIrSerializer { serializeType(switch_.valueType(), writer); writer.append(" "); serializeOperand(switch_.value(), writer); - writer.append(", label %"); - writer.append(switch_.defaultDestLabel()); + writer.append(", label "); + serializeVariable(switch_.defaultDestLabel(), writer); 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(", label "); + serializeVariable(switchCase.destLabel(), writer); writer.append("\n"); } writer.append("]"); diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBr.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBr.java index 2fa3e127..c985445b 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBr.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBr.java @@ -1,10 +1,11 @@ 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.operands.LlvmVariableLocal; public record LlvmBr( LlvmOperand condition, - String ifTrueLabel, - String ifFalseLabel + LlvmVariableLocal ifTrueLabel, + LlvmVariableLocal ifFalseLabel ) implements LlvmTerminatorInstruction { } diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBrUnconditional.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBrUnconditional.java index 0a33022b..47c6d344 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBrUnconditional.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBrUnconditional.java @@ -1,6 +1,8 @@ package org.shedlang.compiler.backends.llvm.ir.ast.instructions; +import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableLocal; + public record LlvmBrUnconditional( - String targetLabel + LlvmVariableLocal targetLabel ) implements LlvmTerminatorInstruction { } 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 index c3aecc68..6720fbbf 100644 --- 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 @@ -1,6 +1,7 @@ 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.operands.LlvmVariableLocal; import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; import java.util.List; @@ -8,8 +9,8 @@ import java.util.List; public record LlvmSwitch( LlvmType valueType, LlvmOperand value, - String defaultDestLabel, + LlvmVariableLocal defaultDestLabel, List cases ) implements LlvmTerminatorInstruction { - public record Case(int value, String destLabel) {} + public record Case(int value, LlvmVariableLocal destLabel) {} } -- cgit v1.2.3